diff --git a/taxcalc/calculate.py b/taxcalc/calculate.py index a3604fc68..f99b59791 100644 --- a/taxcalc/calculate.py +++ b/taxcalc/calculate.py @@ -191,6 +191,7 @@ def calc_one_year(self, zero_out_calc_vars=False): DecomposeEITC(self.policy, self.records) IITAX(self.policy, self.records) ExpandIncome(self.policy, self.records) + FairShareTax(self.policy, self.records) def calc_all(self, zero_out_calc_vars=False): # conducts static analysis of Calculator object for current_year diff --git a/taxcalc/current_law_policy.json b/taxcalc/current_law_policy.json index e795f7c7e..8610e1b15 100644 --- a/taxcalc/current_law_policy.json +++ b/taxcalc/current_law_policy.json @@ -1977,5 +1977,46 @@ [9e99, 9e99, 9e99, 9e99, 9e99, 9e99], [9e99, 9e99, 9e99, 9e99, 9e99, 9e99]], "validations": {"min": "_PT_brk6"} + }, + "_FST_AGI_trt":{ + "long_name": "Rate applied to AGI to determine tentative FST", + "description": "The result of multiplying AGI by this is the tentative FST used to calculate final FST", + "irs_ref": "", + "notes": "", + "start_year": 2013, + "col_var": "", + "row_var": "", + "row_label": ["2013"], + "cpi_inflated": false, + "col_label": "", + "value": [0.0] + }, + + "_FST_AGI_thd_lo":{ + "long_name": "Minimum AGI needed to be subject to FST", + "description": "A taxpayer is only subject to the FST if they exceed this level of AGI", + "irs_ref": "", + "note": "", + "start_year": 2013, + "col_var": "", + "row_var": "", + "row_label": ["2013"], + "cpi_inflated": true, + "col_label": ["single", "joint", "separate", "head of household", "widow", "separate"], + "value": [[1000000, 1000000, 500000, 1000000, 1000000, 500000]] + }, + "_FST_AGI_thd_hi":{ + "long_name": "AGI level at which the FST is fully phased in", + "description": "The FST will be fully phased in at this level of AGI. If there is no phase in, this is equivalent to the lower AGI threshold", + "irs_ref": "", + "note": "", + "start_year": 2013, + "col_var": "", + "row_var": "", + "row_label": ["2013"], + "cpi_inflated": true, + "col_label": ["single", "joint", "separate", "head of household", "widow", "separate"], + "value": [[2000000, 2000000, 1000000, 2000000, 2000000, 1000000]] + } } diff --git a/taxcalc/functions.py b/taxcalc/functions.py index a7c5738f1..f56e86caf 100644 --- a/taxcalc/functions.py +++ b/taxcalc/functions.py @@ -1198,6 +1198,53 @@ def ExpandIncome(ptax_was, e02400, c02500, c00100, e00400, _expanded_income): return _expanded_income +@iterate_jit(nopython=True) +def FairShareTax(c00100, _iitax, _combined, ptax_was, ptax_sey, ptax_amc, + MARS, FST_AGI_trt, FST_AGI_thd_lo, FST_AGI_thd_hi, + fst): + """ + + Parameters + ---------- + c00100: AGI + _iitax: Individual income tax + _combined: Combined payroll and income tax + ptax_was: Payroll tax on wages and salaries + ptax_sey: Payroll tax on self-employment income + ptax_amc: Additional medicare tax on high earnings + MARS: Marital status + FST_AGI_trt: Percent of AGI the tentative FST will be. Default = 0.0 + FST_AGI_thd_lo: Minimum AGI needed to be subject to FST. Default = 500,000 + for married filling separetly, 1,000,000 for all others. + FST_AGI_thd_hi: Level of AGI at which the tax is fully phased in. If + equivalent to FST_AGI_thd_lo, the there is no phase in for the tax. + Default = 1,000,000 for married filing separetly and 2,000,000 for all + others. + fst + + Returns + ------- + fst: Fair Share Tax + + """ + if c00100 >= FST_AGI_thd_lo[MARS - 1]: + tentFST = c00100 * FST_AGI_trt + employee_share = 0.5 * ptax_was + 0.5 * ptax_sey + ptax_amc + if (c00100 >= FST_AGI_thd_hi[MARS - 1] or + FST_AGI_thd_hi[MARS - 1] == FST_AGI_thd_lo[MARS - 1]): + fst = max(tentFST - _iitax - employee_share, 0.0) + else: + fst = max((((c00100 - FST_AGI_thd_lo[MARS - 1]) / + (FST_AGI_thd_hi[MARS - 1] - + FST_AGI_thd_lo[MARS - 1])) * + (tentFST - _iitax - employee_share)), 0.0) + else: + fst = 0.0 + _iitax += fst + _combined += fst + return fst, _iitax, _combined + + def BenefitSurtax(calc): """ BenefitSurtax function: computes itemized-deduction-benefit surtax and diff --git a/taxcalc/records.py b/taxcalc/records.py index 4844ca41d..4ce482f81 100644 --- a/taxcalc/records.py +++ b/taxcalc/records.py @@ -169,7 +169,7 @@ class instance: Records '_iitax', '_refund', '_expanded_income', 'c07300', 'c07600', 'c07240', - '_surtax', '_combined', 'personal_credit']) + '_surtax', '_combined', 'personal_credit', 'fst']) INTEGER_CALCULATED_VARS = set([ '_num', '_sep', '_exact', 'f2555'])