Closed bodiyang closed 11 months ago
@bodiyang Thanks for digging into this.
Can you provide an example of a case where Tax-Calculator fails to give the correct child tax credit amount?
Are we talking about the latest source code I sent to Martin? Is the error present there?
Can you send a sample taxpayer that is incorrect? I will compare to TaxAct and fix Taxsim.
Thanks for your help with this.
Dan
On Fri, 20 Oct 2023, Bodi Yang wrote:
I've noticed an issue in Tax-Calculator's child tax credit calculation for the year 2021. (from the validation work with taxsim35 ~ many records are showing differences in child tax credit between Tax-Calc and Taxsim)
Currently, Tax-Calculator's child tax credit calculation follows the IRS Publication 972 in 2018, as in calcfunctions.py. The years before 2020 all follows IRS Publication 972.
Since 2021, child tax credit has been changed to follow IRS Sch 8812 in 2021. The tax logic is also changed for the year 2021, while to be noticed only for the year 2021. Year 2022's child tax credit still follows IRS Sch 8812, but the tax logic is the same as the years before 2020 which are under Publication 972, as can be seen in IRS Sch 8812 in 2022
As a result, the child tax credit calculation is correct for all the years except 2021. Tax logic has to be rewritten for the year 2021, following 2021 IRS Sch 8812
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700 You are receiving this because you are subscribed to this thread.
Message ID: @.***>
Of course Jason and Daniel, I'll gather some sample records with different characters and attach the comparison of calculations from Tax-calculator, Taxsim and IRS Tax Forms
(issues noticed so far: not including the child age at 18 (taxcalc); a rounding rule to the next $1,000 (probably in taxsim); ... )
Bodi
One record will probably suffice.
Dan
On Sat, 21 Oct 2023, Bodi Yang wrote:
Of course Jason and Daniel, I'll gather some sample records with different characters and attach the comparison of calculations from Tax-calculator, Taxsim and IRS Tax Forms
(issues noticed so far: not including the child age at 18 (taxcalc & taxsim); rounding to the next $1,000 (taxsim); ... )
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1773805877 You are receiving this because you commented.
Message ID: @.***>
case record:
taxsimid 58 year 2021. state 0. mstat 1 page 62 sage 0 depx 4 dep13 4 dep17 4 dep18 4 pwages 177,000 swages 0
non_refundable_child_odep_credit is $8,775 from taxsim; $8,000 from tax-calculator
I've tried to manually calculated the child tax credit and credit for other dependents, the result is $8,750 from Sch 8812 of the year 2021; $8,000 from Publication 972 in 2018
~ my thought:
Can you send along your calculation? That is, the filled in form 8812? Thanks.
I am working on this now.
Dan
On Mon, 23 Oct 2023, Bodi Yang wrote:
case record:
taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0
non_refundable_child_odep_credit is $5,000 from taxsim; $4,000 from tax-calculator
I've tried to manually calculated the child tax credit and credit for other dependents, the results are
- $9,800 from Sch 8812 of the year 2021;
- $800 from Publication 972 in 2018 ~ note on this: the child tax & other dependents credit is non-refundable, so it is capped by the iitax. if there is no cap, the result would be $4,000. $800 = min (iitax = $800, child tax & other dependdents credit = $4,000)
Based on this calculation, Tax-Calculator follows the 2018 Publication 972 instead of the 2021 tax form, while I didn't check how taxsim get thte $5,000
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1775505015 You are receiving this because you commented.
Message ID: @.***>
@bodiyang, I see that Tax-Calculator gives a CTC amount of $8775 for this filer (the same at TAXSIM-35), if you add together c07220
with the ctc_new
variable. ctc_new
was created to handle the different logic of the CTC in 2021, and takes on the value of the difference between the "standard CTC" and the 2021 amount.
It may be good to add these together in taxcalc
in the c07220
variable going forward, but I'm not sure of the reason why there were kept separate when the ctc_new
variable was added in 2021.
In any case, the point about the rounding may still be an issue. I'll let you and Dan settle that, but will be following the discussion.
@feenberg this is the calculation by tax form of the case record, with the result $8,750
taxsim looks like not considering the $1,000 rounding rule in line 5 worksheet
Bodi
Is this webpage perhaps relevant to the 2021 taxpayer?
https://www.irs.gov/pub/irs-pdf/p972.pdf
I have attached the worksheet for Line 5 of Form 8812 as prepared by TaxAct, which seems to agree with the Taxsim calculation. If I have entered the wrong data, or you disagree with the calculation, can you send me your version of the 8812 worksheet? It will help a lot for me to understand what the difference is.
I did add code to stop the smoothing which can be turned on by setting opt1 to 88 and opt1v to 1. I use that option to turn off smoothing when it causes difficulties, but I haven't gone through all the code looking for places it could be used.
On Mon, 23 Oct 2023, Bodi Yang wrote:
case record:
taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0
non_refundable_child_odep_credit is $5,000 from taxsim; $4,000 from tax-calculator
I've tried to manually calculated the child tax credit and credit for other dependents, the results are - $9,800 from Sch 8812 of the year 2021; - $800 from Publication 972 in 2018 ~ note on this: the child tax & other dependents credit is non-refundable, so it is capped by the iitax. if there is no cap, the result would be $4,000. $800 = min (iitax = $800, child tax & other dependdents credit = $4,000)
Based on this calculation, Tax-Calculator follows the 2018 Publication 972 instead of the 2021 tax form, while I didn't check how taxsim get thte $5,000
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1775505015 You are receiving this because you commented.
Message ID: @.***>
I woke up and realized that I didn't look at the rest of form 8812 - no doubt there is more. I don't have TaxAct at home - I'll look again in the morning.
Sorry for the over-confidence.
Dan
On Mon, 23 Oct 2023, Daniel Feenberg wrote:
Is this webpage perhaps relevant to the 2021 taxpayer?
https://www.irs.gov/pub/irs-pdf/p972.pdf
I have attached the worksheet for Line 5 of Form 8812 as prepared by TaxAct, which seems to agree with the Taxsim calculation. If I have entered the wrong data, or you disagree with the calculation, can you send me your version of the 8812 worksheet? It will help a lot for me to understand what the difference is.
I did add code to stop the smoothing which can be turned on by setting opt1 to 88 and opt1v to 1. I use that option to turn off smoothing when it causes difficulties, but I haven't gone through all the code looking for places it could be used.
On Mon, 23 Oct 2023, Bodi Yang wrote:
case record:
taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0
non_refundable_child_odep_credit is $5,000 from taxsim; $4,000 from tax-calculator
I've tried to manually calculated the child tax credit and credit for other dependents, the results are - $9,800 from Sch 8812 of the year 2021; - $800 from Publication 972 in 2018 ~ note on this: the child tax & other dependents credit is non-refundable, so it is capped by the iitax. if there is no cap, the result would be $4,000. $800 = min (iitax = $800, child tax & other dependdents credit = $4,000)
Based on this calculation, Tax-Calculator follows the 2018 Publication 972 instead of the 2021 tax form, while I didn't check how taxsim get thte $5,000
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1775505015 You are receiving this because you commented.
Message ID: @.***>
Is this webpage perhaps relevant to the 2021 taxpayer? https://www.irs.gov/pub/irs-pdf/p972.pdf I have attached the worksheet for Line 5 of Form 8812 as prepared by TaxAct, which seems to agree with the Taxsim calculation. If I have entered the wrong data, or you disagree with the calculation, can you send me your version of the 8812 worksheet? It will help a lot for me to understand what the difference is. I did add code to stop the smoothing which can be turned on by setting opt1 to 88 and opt1v to 1. I use that option to turn off smoothing when it causes difficulties, but I haven't gone through all the code looking for places it could be used. … On Mon, 23 Oct 2023, Bodi Yang wrote: case record: taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0 non_refundable_child_odep_credit is $5,000 from taxsim; $4,000 from tax-calculator I've tried to manually calculated the child tax credit and credit for other dependents, the results are - $9,800 from Sch 8812 of the year 2021; - $800 from Publication 972 in 2018 ~ note on this: the child tax & other dependents credit is non-refundable, so it is capped by the iitax. if there is no cap, the result would be $4,000. $800 = min (iitax = $800, child tax & other dependdents credit = $4,000) Based on this calculation, Tax-Calculator follows the 2018 Publication 972 instead of the 2021 tax form, while I didn't check how taxsim get thte $5,000 -- Reply to this email directly or view it on GitHub: #2700 (comment) You are receiving this because you commented. Message ID: @.***>
This record should be good. taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0 non_refundable_child_odep_credit is $5,000 from taxsim
Just had another check dep18 = 3 in taxsim actually represent the EITC qualifying child (under age 19), not the child under the age of 18. So dep18 = 3 should not be taken consideration into the child tax credit calculation. So for this record, the total number of child under the age of 18 is only 1 (dep 17 = 1). The child tax credit calculation should be $5,000 then.
But the other example do have an issue, please refer to my comment above about the rounding rule.
Another notice is to use 2021 form 8812 for the calculation, with instructions. I think the link you sent above is the IRS 2022 form 8812. The 2021 form and 2022 form are different. ~ tax logic of 2022 is same with all years before 2020; 2021 tax logic is an outlier
Bodi
It turns out the Form 8812 doesn't reduce the Line 5 amount below 8,750, so I return to the thought that Taxsim was right. I have attached the updated taxsim.f that allows the smoothing to be turned off. It doesn't affect this result, but will affect others. It also has numerous improvements to the state calculations.
Daniel Feenberg
On Tue, 24 Oct 2023, Bodi Yang wrote:
Is this webpage perhaps relevant to the 2021 taxpayer? https://www.irs.gov/pub/irs-pdf/p972.pdf I have attached the worksheet for Line 5 of Form 8812 as prepared by TaxAct, which seems to agree with the Taxsim calculation. If I have entered the wrong data, or you disagree with the calculation, can you send me your version of the 8812 worksheet? It will help a lot for me to understand what the difference is. I did add code to stop the smoothing which can be turned on by setting opt1 to 88 and opt1v to 1. I use that option to turn off smoothing when it causes difficulties, but I haven't gone through all the code looking for places it could be used. ? On Mon, 23 Oct 2023, Bodi Yang wrote: case record: taxsimid 18 year 2021. state 0. mstat 1 page 51 sage 0 depx 5 dep13 1 dep17 1 dep18 3 pwages 8000 swages 0 non_refundable_child_odep_credit is $5,000 from taxsim; $4,000 from tax-calculator I've tried to manually calculated the child tax credit and credit for other dependents, the results are - $9,800 from Sch 8812 of the year 2021; - $800 from Publication 972 in 2018 ~ note on this: the child tax & other dependents credit is non-refundable, so it is capped by the iitax. if there is no cap, the result would be $4,000. $800 = min (iitax = $800, child tax & other dependdents credit = $4,000) Based on this calculation, Tax-Calculator follows the 2018 Publication 972 instead of the 2021 tax form, while I didn't check how taxsim get thte $5,000 -- Reply to this email directly or view it on GitHub: #2700 (comment) You are receiving this becau! se you commented. Message ID: @.***>
A notice is to use 2021 form 8812 for the calculation, with instructions. I think the link you sent above is the IRS 2022 form 8812. The 2021 form and 2022 form are different. ~ tax logic of 2022 is same with all years before 2020; 2021 tax logic is an outlier
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1777191770 You are receiving this because you were mentioned.
Message ID: @.**> program taxsim c common calc needs to be extended compilation date compdate implicit double precision(a-h,o-z) parameter(nx=47) dimension cccage(1960:2023),eicage(1960:2023),ctcage(1960:2023) logical last,isexe,agevars,depvars integer list(nx),nuse,isgn character(len=1024) line cftp character(len=64) arg character(len=16) vars(2,nx),dnames(nx) common/ssa/ficavars(31) common/state/t(18) common/calc/s(18) common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders, &gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100) common/fsrates/ficar,frate,srate common/comexe/isexe,agevars,depvars common/nrecc/nrec common/newshr/comnew(255) common/comold/d(255) common/dindiv/data(255) common/xcom/x(nx) data cccage/412.,813.,1715.,3513./ data eicage/15100.,4919./ data ctcage/380.,26*17./ data last/.false./ data vars/ & "taxsimid" ,"P", "year" ,"P", "state" ,"P","mstat" ,"P", 5 "page" ,"P", "sage" ,"P", "depx" ,"P","dep13" ,"P", 9 "dep17" ,"P", "dep18" ,"P", "pwages" ," ","swages" ," ",
3 "dividends","P", "intrec" ," ", "stcg" ," ","ltcg" ," ", 7 "otherprop"," ", "nonprop" ," ", "pensions","P","gssi" ,"P", 1 "ui" ,"P", "transfers","P", "rentpaid","P","proptax" ,"P", 5 "otheritem","P", "childcare","P", "mortgage","P","scorp" ," ", 9 "pbusinc" ," ", "pprofinc" ," ", "sbusinc" ," ","sprofinc"," ", 3 "idtl" ,"P", "mtr" ,"P", "pui" ,"P","sui" ,"P", 7 "dep6" ,"P", "dep19" ,"P", "opt1" ,"P","opt1v" ," ", 1 "opt2" ,"P", "opt2v" ," ", "age1" ,"P","age2" ,"P", 5 "age3" ,"P", "psemp" ," ", "ssemp" ," "/ cftp call getarg(1,arg) cftp if(arg.ne.'') open(5,file=arg) nrec = 0 if(isexe) then do 1 i=0,100 extnd(i) = 0. 1 continue do 2 i=1,255 d(i) =0.d0 data(i) = 0.d0 comnew(i) = 0.d0 2 continue else endif data(3) = 1.d0 data(96) = -1.d0 mtr = 85 if(isexe) call begin(line,list,nuse,nx,vars,dnames) 100 continue
c If data is http web form, skip reading values if(x(1).lt.0)then write(,) 'Input line (131 chars):' write(,) line(1:131) write(,) 'Becomes:' write(,) (i,' ',vars(1,i),"=",int(x(i)),i=1,nx) endif
if(x(33).ne.5.and.isexe) then
read(5,'(a)',end=999,err=992) line
if(line.eq." ") goto 100
if(line(1:2).eq.'--') goto 999
if(line(1:3).eq.'eod') goto 999
read(line,*,end=998,err=993) (x(list(i)),i=1,nuse)
endif
data(255) = 1.
data(100) = x(1)
data(70) = 0.d0
data(101) = x(2)
lawyr = int(data(101))
data(103) = x(2)
data(3) = 1.d0
data(7) = 1.d0
data(8) = x(7)
data(105) = 0.
if(x(4).eq.1.or.x(4).eq.3) then
if(x(7).eq.0) then
data(2) = 1.d0
else
data(2) = 4.d0
endif
elseif(x(4).eq.2) then
data(2) = 2.d0
data(7) = 2.d0
elseif(x(4).eq.33) then
data(2) = 1.d0
elseif(x(4).eq.66.or.x(4).eq.6) then
data(2) = 6.d0
data(3) = 2.d0
elseif(x(4).eq.8) then
data(2) = 1.d0
data(7) = 0.d0
data(105) = 1.d0
elseif(x(4).eq.0) then
data(2) = 0.
elseif(x(4).eq.5) then
data(2) = 5.
else
write(*,*) 'Bad mstat',x(4),"x=",x
stop 4
endif
data(9) = 0.
if(x(5).ge.65) data(9) = 1.d0
if(x(6).ge.65) data(9) = data(9) + 1.d0
do ii=203,209
data(ii)=0.d0
enddo
data(205) = max(x(5),x(6))
data(206) = min(x(5),x(6))
data(17) = 0.d0
if(x(11).ge.0) then
data(85) = x(11)
else
data(17) = x(11)
data(85) = 0.d0
endif
if(x(12).ge.0) then
data(86) = x(12)
else
data(17) = data(17) + x(12)
data(86) = 0.d0
endif
data(11) = data(85) + data(86)
data(17) = x(46)+x(47)
data(216) = x(47)
data(12) = 0.d0
data(24) = 0.d0
data(200) = 1.d0
data(201) = 0.d0
if(data(11).ne.0) then
data(201)=data(86)/data(11)
data(200) = x(7)/data(11)
endif
data(12) = x(13) + .001d0
data(176) = data(12)
data(14) = x(14)
data(68) = x(15)
data(70) = x(16)
data(79) = x(17)
data(30) = -x(18)
data(20) = x(19)
data(91) = x(20)
data(180) = x(36)
data(82) = max(x(21),x(35)+x(36))
data(41) = x(22)
data(160) = x(23)
data(51) = x(24)
data(54) = x(25)
data(64) = x(26)
data(56) = x(27)
data(210) = x(37)
if(agevars) then
do 6 ii=43,45
data(200+ii)=x(ii)
if(x(ii).gt.0) then
if(x(ii).lt.6.d0) data(210)=data(210)+1.d0
if(x(ii).lt.cccage(lawyr)) data(207)=data(207)+1.d0
if(x(ii).lt.eicage(lawyr)) data(203)=data(203)+1.d0
if(x(ii).lt.ctcage(lawyr)) data(208)=data(208)+1.d0
if(x(ii).ge.eicage(lawyr)) data(209)=data(209)+1.d0
endif
6 continue elseif(depvars) then data(207) = x(8) data(208) = x(9) data(203) = x(10) data(209) = data(8)-data(203) else data(207)=data(8) data(203)=data(8) data(208)=data(8) endif data(213) = x(28) data(211) = x(29) data(212) = x(30) data(214) = x(31) data(215) = x(32) if(x(39).gt.0) extnd(int(x(39)))=x(40) if(x(41).gt.0) extnd(int(x(41)))=x(42) if(extnd(89).gt.0) then data(6) = 0.d0 data(211) = x(3) data(212) = x(23) data(160) = 0.d0 data(79) = x(17) + data(211) + data(212) endif idtl = int(x(33)) if(idtl.ge.10) then last=.true. idtl=idtl-10 endif if(x(34).ne.0) mtr = int(x(34)) data(159) = data(11) + data(12) + data(19) + data(20) & + data(93) + data(82) + data(91) + data(41) & + data(14) + data(211) + data(213) + data(214) & + data(215)+ data(212) & + data(79) + max(data(68)+data(70),0.d0) call check(lawyr,idtl,mtr,x,nx,data,vars)
c FICA tax and rate
do 111 i=1,31
ficavars=0.
111 continue call sstax(data,lawyr) fica = comnew(75) if(data(2).eq.0) fica = 0.d0 if(mtr.eq.85) then ficar = comnew(148) elseif(mtr.eq.86) then ficar = comnew(149) elseif(mtr.eq.11) then ficar = comnew(150) else ficar = 0. endif ficar = ficar*100
c -1 is a special state code meaning do all states
if(x(3).eq.-1) then
is=1
if=51
elseif(x(3).eq.-3.d0) then
is=1
if=10
else
is=int(x(3))
if=is
endif
diff = .01d0
if(extnd(52).ne.0d0) diff=extnd(52)
datmtr = data(mtr)
data85 = data(85)
data86 = data(86)
dat159 = data(159)
data11 = data(11)
data(93) = 1.d0
do 11 istate=is,if
nrec=nrec+1
data(mtr) = datmtr
data(11) = data85 + data86
data(85) = data85
data(86) = data86
data(159) = dat159
data(6) = istate
call tcalc (data,lawyr)
if(data(100).lt.-2) then
write(90,900)(data(i),i=1,220),
& (comnew(i),i=1,220)
900 format(22(10f12.2/)///22(10f12.2/)///) write(90,) &'hy rent agi exemp stded xitded taxinc pcred c &hcr earncr credit rt' write(90,'(a96)') write(90,'(12f8.0)') s write(90,'(27/)') endif do 8 i=1,255 d(i) = comnew(i) 8 continue s(1) = dat159 do 9 i=1,18 t(i) = s(i) 9 continue fold = comnew(1) agiold = comnew(2) tiold=comnew(29) sold = comnew(74) if(extnd(89).gt.0) sold=comnew(181) frate = 0. srate = 0. do 10 isgn=1,-1,-2 if(mtr .ne.0) then if(idtl.eq.5) then fdiff = isgn1.d0 else fdiff = isgndiff endif data(mtr) = datmtr + fdiff if(mtr.lt.47.or.mtr.gt.63)data(159) = dat159 + fdiff if(mtr.eq.11) then if(data11.ne.0) then data(85) = data85 + fdiff(data85/data11) data(86) = data86 + fdiff(data86/data11) else data(85) = fdiff/2.d0 data(86) = fdiff/2.d0 endif endif data(11) = data(85) + data(86) call tcalc(data,lawyr) if(data(100).lt.-1) then write(,) 'isgn=',isgn, 'data=' write(,'(21(11f10.3/)//)') (data(i),i=1,210) write(,) ' comnew=' write(,'(21(11f10.3/)//)') (d(i),i=1,210) write(,'(6f11.3)') s endif tinew=comnew(29) s(1) = data(159) fnew = comnew(1) snew = comnew(74) frate =100.d0(fnew - fold)/fdiff srate =100.d0(snew - sold)/fdiff ftan = comnew(72) if(abs(frate).lt.100.and.abs(srate).lt.25) goto 12 endif 10 continue 12 continue srate = twn(srate,-99.d0,999.d0) frate = twn(frate,-99.d0,999.d0) if(isexe) call out & (mtr,idtl,x,fold,sold,fica,frate,srate,ficar,data) data(mtr) = datmtr 11 continue if(idtl.eq.6) then write(,1000) (data(i),i=1,220),(comnew(i),i=1,220) 1000 format(22(10f9.0/)///22(10f9.2/)/) endif if(last) goto 999 if(idtl.eq.5) goto 999 goto 100 998 continue if(nrec.gt.0) then write(,)'TAXSIM:Insufficient values in record ' & ,nrec+1 if(i.ne.nuse)write(,)'TAXSIM: ',nuse,' items expected ' & ,'but',i,'were found. At or near record ',x(1) write(,) 'TAXSIM:Last good read was record ',data(100), & ' state ', data(6), ' for year ',data(101), 'nrec',nrec write(,) (x(ii),ii=1,nuse) endif 992 stop 992 993 write(,)'TAXSIM:Conversion error at record:',nrec+1 write(,)'TAXSIM:Record:','"',trim(line),'"' stop 993 999 continue if(nrec.eq.0) then write(,*) 'TAXSIM: No records read. Communication problem?' endif call stop end subroutine stop logical isexe,agevars,depvars common/comexe/isexe,agevars,depvars if(isexe) then stop else return endif end
subroutine check(lawyr,idtl,mtr,x,nx,data,vars)
implicit double precision(a-h,o-z)
dimension x(nx),data(255)
character(len=20) states(0:55)
common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders,
&gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100)
common/newshr/comnew(255)
character(len=8) mslab(8)
common/nrecc/nrec
common/cstates/states
character(len=16) vars(2,nx)
data mslab/'Single','Joint',' ','HoH',3*' ','Separate'/
if(idtl.eq.5) then
write(*,*) lawyr
write(*,*)'NBER TAXSIM Model v35 (compdate) With TCJA'
lawyr=-99
call statax(data,lawyr,comnew)
write(*,*)'State law coded through',lawyr
write(*,*)'Later state laws extrapolated from that year.'
iext1 = int(x(4))
if(mtr.eq.85) then
write(*,*) 'Marginal tax rate wrt taxpayer earnings.'
elseif(mtr.eq.17) then
write(*,*) 'Marginal tax rate wrt non-wage income.'
elseif(mtr.eq.86) then
write(*,*) 'Marginal tax rate wrt spouse earning.'
elseif(mtr.eq.70) then
write(*,*) 'Marginal rate wrt long-term gains.'
elseif(mtr.eq.56) then
write(*,*) 'Marginal rate wrt Mortgage Interest Paid.'
elseif(mtr.eq.56) then
write(*,*) 'Marginal rate wrt Other deductions.'
else
write(*,*) 'Marginal rate not requested.'
endif
endif
ierr=0
lawyr=int(data(101))
if(idtl.lt.0d0.or.idtl.gt.15.d0) then
write(*,*) 'TAXSIM: Debug Flag out of bounds : ',idtl
write(*,*) 'TAXSIM: (should not occur)'
ierr=1
endif
if((mtr.lt.11.or.mtr.gt.99).and.mtr.ne.0.d0) then
write(*,*) 'TAXSIM: Request for marginal rate on a code'
ierr=2
endif
if(int(abs(data(2))).ge.7.or.int(abs(data(2))).eq.5) then
write(*,*) 'TAXSIM: Bad value for mstat',data(2)
ierr=3
endif
if(lawyr.ge.1998) then
if(data(207).gt.data(208)) then
write(*,*) 'TAXSIM: More CCC elegible than CTC elegible'
& ,data(207),data(208),lawyr
ierr=5
endif
if(data(208).gt.data(203)) then
write(*,*) 'TAXSIM: More CTC elegible than EIC elegible'
& ,data(208),data(203)
ierr=6
endif
endif
if(data(203).gt.data(8)) then
write(*,*) 'TAXSIM: More EIC eligible than depx value ',
& int(data(203)),int(data(8))
ierr=7
endif
if(data(8).gt.15.or.data(208).gt.25) then
write(*,*) 'TAXSIM: More than 25 dependents:',data(8)
ierr=8
endif
do 100 ii=43,45
if(x(ii).lt.0..or.x(ii).gt.114) then
write(*,*) 'TAXSIM: Improbable dependent age: ',
& 'age',ii-42,'=',sngl(x(ii)),'not in 0-114.'
ierr=42
endif
100 continue if(data(8).ne.int(data(8))) then write(,) 'TAXSIM: depx must be an integer:',data(8) ierr=9 endif
if(x(5).lt.0.or.x(5).gt.114) then
write(*,*) 'TAXSIM: Unbelievable primary age:',x(5)
ierr=10
endif
if(x(6).lt.0.or.x(6).gt.114) then
write(*,*) 'TAXSIM: Unbelievable spouse age:',x(6)
ierr=11
endif
if(x(3).ne.int(x(3))) then
write(*,*) 'TAXSIM: State code must be integer.',x(3)
ierr=13
endif
if(x(2).lt.1960d0.or.x(2).gt.2023d0) then
write(*,*) 'TAXSIM: Federal tax calculator available',
& ' 1960 - 2023 only.'
ierr=14
endif
if(x(2).ne.int(x(2))) then
write(*,*) 'TAXSIM: Tax law year must be integer.',x(2)
ierr=15
endif
if(data(6).ne.0.d0.and.
& (x(2).lt.1977)) then
write(*,*) 'TAXSIM: State tax calculator available 1977+ only'
ierr=16
endif
if(x(3).lt.-1.or.x(3).gt.51) then
write(*,*) 'TAXSIM: ',x(3),' is not a valid SOI state code'
write(*,*) 'TAXSIM: See http://taxsim.nber.org/statesoi.html'
ierr=18
endif
if(x(4).ne.2d0) then
if(x(11)*x(12).ne.0) then
c if(x(12)+abs(x(31))+abs(x(32))+x(36)+abs(x(47)).ne.0d0) then
write(,) 'TAXSIM: Secondary wage ',x(12)
write(,) 'TAXSIM: Secondary SE ' ,x(47)
write(,) 'TAXSIM: Secondary QBI,SSBI ',x(31),x(32)
write(,) 'TAXSIM: Secondary UI',x(36)
write(,) 'TAXSIM: Non-joint return with spousal income'
write(,) 'TAXSIM: Separate filers report only own income'
ierr=17
write(,) '1112',x(11)x(12),x(11),x(12)
endif
endif
if(x(4).ne.2.d0.and.x(6).gt.0d0) then
write(,) 'TAXSIM: Non-joint return with non-zero sage'
write(,) 'TAXSIM: Ages ',x(6)
ierr=19
endif
do 10 i=4,nx
if(x(i).lt.0.and.vars(2,i).eq."P") then
ierr=-1
goto 17
endif
10 continue
17 continue
if(ierr.eq.-1) then
c9 write(,) 'TAXSIM: Disallowed negative value:', x(i)
write(,) 'TAXSIM: Item in error :',i,vars(1,i),x(i)
endif
if(ierr.ne.0) then
c8 write(,) 'TAXSIM: Record ID :',x(1)
write(,) 'TAXSIM: Logical Record Number :',nrec
write(,) 'TAXSIM: Law Year :',x(2)
write(,) 'TAXSIM: State id :',x(3)
write(,) 'TAXSIM: Data record, as converted:',
& (int(x(ii)),ii=1,32)
write(,) 'TAXSIM: Abandoning processing :',ierr
write(,) 'TAXSIM: Taxsim35 version of : compdate'
endif
if(idtl.eq.5) then
write(,)
write(,) 'Input Data: '
write(,3) ' 1. Record ID: ', x(1)
write(,2) ' 2. Tax Year: ', x(2)
ii=int(x(3))
write(,4) ' 3. State Code: ',
& x(3),states(max(0,ii))
ms = int(data(2))
1 format(a31,f11.2,1x,a8)
write(,1) ' 4. Marital Status: ', x(4),mslab(ms)
write(,2) ' 5-6. Age (Txpyr/Spouse): ', x(5),x(6)
write(,2) ' 7. Dependent Exemptions: ', x(7)
write(,2) ' Dependent Ages ',
& (sngl(data(i)),i=243,245)
write(,2) ' 8-10. #deps for CCC/CTC/EIC: ', data(207),
& data(208),data(203)
write(,2) '11-12. Wages (Txpyr/Spouse): ', x(11),x(12)
write(,2) '11a12a Self-employment income:',x(46),x(47)
if(extnd(89).gt.0) write(,) 'Not including business income'
write(,2) ' 13. Dividend Income: ', x(13)
write(,2) ' 14. Interest Received: ', x(14)
write(,2) ' 15. Short Term Gains: ', x(15)
write(,2) ' 16. Long Term Gains: ', x(16)
write(,2) ' 17. Other Property: ', x(17)
write(,2) ' 18. Other Non-Property: ', x(18)
write(,2) ' 19. Taxable Pensions: ', x(19)
write(,2) ' 20. Gross Social Security: ', x(20)
write(,2) ' 21. Tot/Txpy/Spouse UI : ', x(21),x(35),x(36)
write(,2) ' 22. Non-taxable Transfers: ', x(22)
write(,2) ' 23. Rent Paid: ', x(23)
write(,2) ' 24. Property Taxes Paid: ', x(24)
write(,2) ' 25. Other Itemized Deds: ', x(25)
write(,2) ' 26. Child Care Expenses: ', x(26)
write(,2) ' 27. Mortgage Interest: ', x(27)
write(,2) ' 28. S-Corp profits: ', x(28)
write(,2) '29 31. Txpy/Spouse QBI w/o PO:', x(29),x(31)
write(,2) '30 32. Txpy/Spouse SSTB w PO:', x(30),x(32)
if(x(40).gt.0) write(,2)
& ' 39/40. opt1/value: ',x(39),x(40)
if(x(42).gt.0) write(,2)
& ' 41/42. opt2/value: ',x(41),x(42)
write(,) ' '
endif
if(ierr.ne.0) stop 1
return
2 format( a31,4f11.2 )
3 format( a31,2f13.0 )
4 format( a31,f13.0,a16)
end
subroutine tcalc(data,lawyr)
implicit double precision(a-h,o-z)
dimension data(255)
common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders,
&gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100)
common/newshr/comnew(255)
if(data(2).eq.0.) return
c Compulsory itemization if(extnd(51).eq.0.or.extnd(51).eq.2) then data(4) = -1 call tcalc2(data,lawyr) taxitm = comnew(1) + comnew(74) endif c Compulsory standard deduction if(extnd(51).eq.0.or.extnd(51).eq.1) then data(4) = -2 call tcalc2(data,lawyr) taxstd = comnew(1) + comnew(74) endif c If itemization is better, use it if(extnd(51).eq.0.d0) then if(taxitm.lt.taxstd) then data(04) = -1 call tcalc2(data,lawyr) else data(50) = 0. endif endif return end
subroutine tcalc2(data,lawyr)
implicit double precision(a-h,o-z)
common/calc/st(18)
dimension data(255)
common/newshr/comnew(255)
common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders,
&gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100)
data(50)=0.
lawst = lawyr + int(extnd(79))
c100 format(17(10f8.2/)/18(10f8.2/)////) iters=3 if(extnd(91).ne.0.d0) iters=int(extnd(91)) do 10 i=1,iters if(data(100).lt.-1) write(,) "interation",i call nlaw(data,lawyr) comnew(74) = 0. do 20 ii=1,18 st(ii) = 0.
20 continue if(data(6).ne.0) then call statax(data,lawst,comnew) if(iters.gt.1) then data(50)=max(saletx(data,lawst),comnew(74),0.d0) endif endif if(data(100).le.-3) then write(90,) 'data and comnew after iter i=',i write(90,1)(data(j),j=1,210),(comnew(j),j=1,180) write(90,'(12f10.2)') st endif 10 continue c11 continue do 112 i=1,31 ficavars=0. 112 continue call sstax(data,lawyr) if(data(100).le.-2)write(,1)(data(i),i=1,210),(comnew(i),i= & 1,180) 1 format(21(10f10.2/)///18(10f10.2/)///) if(data(100).eq.-19)write(19,)data if(data(100).eq.-19)write(19,)comnew return end
subroutine out(mtr,idtl,x,fold,sold,fica,frate,srate,ficar,data)
implicit double precision(a-h,o-z)
dimension data(255),x(27)
character(len=20) states(0:55)
character(len=30) x0,x1
character(len=1024) line
character(len=62) lab1
character(len=256) lab2
character(len=4) statenum(0:51)
character(len=8) lab3(16)
common/newshr/c(255)
common/calc/s(18)
common/state/t(18)
common/comold/d(255)
common/nrecc/nrec
common/cstates/states
common/cfica/tr(4,2),xoasdi,th(4,2),hins,
& eoa(2),ehi(2)
common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders,
&gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100)
c 1 2 3 4 5 6 7 8 9 10 11
c23456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
data lab1/
& 'taxsimid,year,state,fiitax,siitax,fica,frate,srate,ficar,tfica'/
data lab2/',v10,v11,v12,v13,v14,v15,v16,v17,v18,v19,v20,v21,v22,v2
&3,v24,v25,v26,v27,v28,v29,credits,v30,v31,v32,v33,v34,v35,v36,v37,
&v38,v39,v40,v41,staxbc,srebate,senergy,sctc,qbid,v43,v44,v45,cd
&ate'/
data statenum/"00 ",
& "01al","02ak","03az","04ar","05ca","06co","07ct","08de","09dc",
& "10fl","11ga","12hi","13id","14il","15in","16ia","17ks","18ky",
& "19la","20me","21md","22ma","23mi","24mn","25ms","26mo","27mt",
& "28ne","29nv","30nh","31nj","32nm","33ny","34nc","35nd","36oh",
& "37ok","38or","39pa","40ri","41sc","42sd","43tn","44tx","45ut",
& "46vt","47va","48wa","49wv","50wi","51wy"/
data lab3/ ' 2L',' siitax',' agi',' exemp',' stded',
& ' xitem',' taxinc',' ptax',' chcr',' eic',' credits'
& ,' rate',' staxbc','srebate','senergy','sctc'/
if(x(3).gt.0.and.idtl.eq.6) then
write(*,'(22(10f8.0/))')(data(i),i=1,220)
write(*,'(22(10f8.0/))')(c(i),i=1,220)
endif
spec1c=0.d0
spec2c=0.d0
spec1d=0.d0
spec2d=0.d0
if(extnd(23).ne.0.d0) then
spec1c=c(195)
spec1d=d(195)
endif
if(data(6).ne.0) then
s(12) = s(12)*100.
t(12) = t(12)*100.
else
s(12) = 0.
t(12) = 0.
endif
d148=d(148)*100
d149=d(149)*100
tfica=d(190)
lawyr = int(data(101))
write(x0,'(f20.0)') x(1)
lenx1=1
x1=" "
do 1 i=1,30
if(x0(i:i).ne.' ') then
x1(lenx1:lenx1)=x0(i:i)
lenx1=lenx1+1
endif
1 continue
if(idtl.eq.0) then
if(nrec.eq.1) write(,"( a62)") lab1
write(line,213) x1(1:lenx1),lawyr,int(data(6)),
& fold,sold ,fica ,frate,srate,ficar,tfica," //"
call putlin(line,1024)
elseif(idtl.eq.2) then
if(nrec.eq.1) write(,"(a259)") lab1//lab2
write(line,200)
& x1,int(data(101)),int(data(6)),fold,sold,
& fica,frate,srate,ficar,tfica,
1 d( 2), d( 78), d( 79), d( 3),
& d( 83), d( 39), d( 34), d( 24), d( 29),
2 d( 28), d(174), d( 51), d( 81), d( 93),
& d( 53), d( 59), d( 69), d( 70), d( 52),
3 d( 75), d( 75), (s(i ),i=1,16), d(181),d(173),
4 d(180),d(186),",compdate //"
c leave "le n" to avoid false editor search matches
le n = 1024
call putlin(line,1024)
elseif(idtl.eq.5) then
if(d(24).lt.d(177).and.d(26).eq.1) then
write(,)
write(,) 'This taxpayer reduced the sum of federal and'
write(,) 'and state income tax by itemizing, despite'
write(,) 'having few deductions to claim. '
write(,)
endif
write(,) 'Basic Output: '
write(,6) ' 1. Record ID: ', x1
write(,3) ' 2. Year: ', int(x(2))
write(,5) ' 3. State (SOI code): ', int(data(6)),
& states(min(55,int(data(6))))
write(,2) ' 4. Federal IIT Liability: ', fold
write(,2) ' 5. State IIT Liability: ', sold
write(,2) ' 6. SS Payroll Tax Liability: ', fica
if(mtr.eq.85) then
write(,) 'Marginal Rates wrt Earner'
elseif(mtr.eq.86) then
write(,) 'Marginal Rates wrt Secondary Earner'
elseif(mtr.eq.11) then
write(,) 'Marginal Rates wrt Weighted Average Earnings'
elseif(mtr.eq.17) then
write(,) 'Marginal Rates wrt Other Income'
elseif(mtr.eq.70) then
write(,) 'Marginal Rates wrt Long-term Gains.'
elseif(mtr.eq.56) then
write(,) 'Marginal Rates wrt Mortgage and Other Deductions'
else
write(,) 'No marginal rates requested'
endif
write(,2) ' 7. Federal Marginal Rate: ', frate
write(,2) ' 8. State Marginal Rate: ', srate
if(mtr.eq.11) then
write(,2) ' 9. Weighted Payroll Tax Rate:', ficar
elseif(mtr.eq.85) then
write(,2) ' 9. Taxpayer SS Rate: ', d148
elseif(mtr.eq.86) then
write(,2) ' 9. Spouse SS Rate: ', d149
else
write(,2) ' 9. No SS Tax on Other Income:', 0.
endif
write(,2) ' '
write(,) 'Federal Tax Calculation: Base
&+$1'
write(,2) ' 10. Federal AGI ', d(2),c( 2)
write(,2) ' 11. UI in AGI 1979+ ', d(78),c(78)
write(,2) ' 12. Social Security in AGI 84+', d(79),c(79)
write(,2) ' 13. Zero Bracket Amount ', d( 3),c( 3)
write(,2) ' 14. Personal Exemptions ', d(83),c(83)
write(,2) ' 15. Exemption Phaseout 1991+ ', d(39),c(39)
write(,2) ' 16. Deduction Phaseout 1991+ ', d(34),c(34)
write(,2) ' 17. Deductions allowed ', d(24),c(24)
write(,2) ' QBI deduction ', d(181),c(181)
write(,2) ' 18. Federal Taxable Income ', d(29),c(29)
write(,2) ' 19. Federal Regular Tax ', d(28),c(28)
if(data(101).eq.2000.)
& write(,21) ' (Excludes 2001 Rate Reduction Credit)'
if(data(101).eq.2001)
& write(,21) ' (Includes 2001 Rate Reduction Credit)'
write(,2) ' 20. Exemption Surtax 1988-96 ', d(174),c(174)
write(,2) ' 21. General Tax Credit 1975-8 ', d(51),c(51)
if(int(data(208)).eq.0) then
write(,2) ' 22. Child Tax Credit17/22 98+', d(81),c(81)
else
write(,2) ' 22. Child Tax Credit ', d(81),c(81)
endif
if(lawyr.eq.2009.or.lawyr.eq.2010) then
write(,2) ' Make Work Pay Crdt 2009-10', d(94),c(94)
endif
write(,2) ' 23 Refundable Part ', d(93),c(93)
write(,2) ' 24. Child Care Credit 1076+ ', d(53),c(53)
write(,2) ' 25. Earned Income Credit 1975+', d(59),c(59)
write(,2) ' 26. Alternative Min Income: ', d(69),c(69)
write(,2) ' 27. AMT ', d(70),c(70)
if(lawyr.eq.2008) then
write(,2) ' 2008 Recovery Rebate ',d(202),c(202)
endif
if(lawyr.eq.2006.and.d(86)+c(86).gt.0)
& write(,2) ' Telephone Tax Refund ', d(86),c(86)
write(,2) ' 28. Income Tax Before Credits ', d(52),c(52)
write(,2) ' Total Credits ', d(58),c(58)
write(,2) ' 29. FICA ', d(75),c(75)
write(,2) ' Taxpayer share of FICA ',d(190),c(190)
if(data(6).ne.0) then
write(,2)
write(,) 'State Tax Calculation: '
write(,2) ' 30. Household Income ',t(1),s(1)
write(,2) ' 31. Imputed Rent ',t(2),s(2)
write(,2) ' 32. AGI ',t(3),s(3)
write(,2) ' 33. Exemptions ',t(4),s(4)
write(,2) ' 34. Standard Deduction ',t(5),s(5)
write(,2) ' 35. Itemized Deductions ',t(6),s(6)
write(,2) ' 36. Taxable Income ',t(7),s(7)
write(,2) ' Tax before credits ',t(13),s(13)
write(,2) ' 37. Property Tax Credit ',t(8),s(8)
write(,2) ' 38. Child Care Credit ',t(9),s(9)
write(,2) ' 39. EIC ',t(10),s(10)
write(,2) ' Energy|Fuel Credit ',t(15),s(15)
write(,2) ' Child Tax Credit ',t(16),s(16)
write(,2) ' 40. Total Credits ',t(11),s(11)
write(,2) ' 41. Bracket Rate ',t(12),s(12)
write(,2) ' State Tax after Credits ',d(74),c(74)
endif
if(lawyr.eq.2022) then
write(,) ' '
write(,2) ' Rebate (excluded above) ',t(14),s(14)
endif
if(lawyr.gt.2018) then
write(,) ' '
write(,) 'TCJA 2018+'
write(,2) ' 42. QBI Deduction ',d(181),c(181)
endif
if(lawyr.ge.2013) then
write(,) ' '
write(,) 'Additional Medicare Taxes 2013+'
write(,2) ' 43. Net Investment Income Tax ',d(173),c(173)
write(,2) ' 44. Medicare Tax on Earnings ',d(180),c(180)
endif
write(,) ' '
if(lawyr.eq.2020) then
write(,) 'CARES act 2020 only '
write(,2) ' 45. CARES Recovery Rebates ',d(186),c(186)
endif
if(spec1d.ne.0.or.spec1c.ne.0)
& write(,2) ' 46. Optional returned value #1 ',spec1d,spec1c
if(spec2d.ne.0.or.spec2c.ne.0)
& write(*,2) ' 47. Optional returned value #2 ',spec2d,spec2c
write(*,*)
write(*,*) 'Decomposition of FICA taxes - OASDI'
write(*,*) ' taxpayer spouse'
write(*,*) 'wages ',int(tr(1,1)),int(tr(1,2))
write(*,*) 'se combined ',int(tr(2,1))
write(*,*) 'businc ',int(tr(3,1)),int(tr(3,2))
write(*,*) 'profinc ',int(tr(3,1)),int(tr(4,2))
write(*,4) ' marginal rate',(100*eoa(i),i=1,2)
write(*,*)
write(*,*)'Decomposition of Fica taxes - Health Insurance'
write(*,*) ' taxpayer spouse'
write(*,*) 'wages ',int(th(1,1)),int(th(1,2))
write(*,*) 'se combined ',int(th(2,1))
write(*,*) 'businc ',int(th(3,1)),int(th(3,2))
write(*,*) 'profinc ',int(th(4,1)),int(th(4,2))
write(*,4) ' marginal rate ',(100*ehi(i),i=1,2)
4 format(a14,5x,2f11.2)
write(*,*)
write(*,*) 'Decomposition of Federal Marginal Rate'
write(*,*) ' (taxpayer earned income)'
write(*,2)
write(*,*) 'Regular Income Tax'
write(*,2) ' Bracket rate from X,Y or Z ', d( 66)
write(*,2) ' Deduction Phaseout: ', d(102)
write(*,2) ' Exemption Phaseout: ', d(104)
write(*,2) ' Social Security Phasein: ', d(106)
write(*,2) ' Child Tax Credit: ', d(114)
write(*,2) ' Child Care Credit: ', d(116)
write(*,2) ' Refundable Part of CTC: ', d(144)
write(*,2) ' Earned Income Credit: ', d(118)
write(*,2) ' Surtax on 15% bracket: ', d(130)
write(*,2) ' Exemption Surtax: ', d(132)
write(*,2) ' Unemployment Insurance: ', d(134)
write(*,2) ' Max Tax on Earned Income: ', d(140)
write(*,2) ' Elderly Credit: ', d( 54)
write(*,2) ' Dependent Care Credit: ', d( 53)
write(*,2) ' Percentage Std Deduction: ', d(138)
write(*,2) ' Medicare tax on Unearned Income:', d(167)
write(*,2) ' Cares Recovery Rebates: ', d(187)
write(*,2)
write(*,*) 'Alternative Minimum Income Tax '
write(*,2) ' AMT Bracket Rate ', d(99)*100
write(*,2)' AMT Phaseout ',d(99)*100.d0*(d(9)-1.d0)
write(*,2)
if(d(119).eq.0) then
write(*,*) 'Only Regular Tax Relevant'
else
write(*,*) 'Only AMT Rate Relevant'
endif
write(*,2) ' Total Marginal Rate: ', d( 72)
write(*,2) ' FICA w Medicare (t,s): ', d148,d149
elseif(idtl.eq.6) then
if(mod(nrec,10).eq.1)write(*,'(18a8)') lab3
write(*,100) statenum(int(data(6))),int(c(74)),
& (int(s(i)),i=3,15)
endif
100 format(a8,14i8) 2 format( 3x,a31,f11.2,1x,f11.2) 6 format( 3x,a32,a30) 21 format( 3x,a43) 3 format( 3x,a31,i11) 5 format( 3x,a31,i11,8x,a20) 213 format(a14,",",2(i8,","),6(f14.2,","),f14.2," ",a2) 200 format(a,",",2(i0 ,","),47( f0 .2,","), f0 .2,a8) return end
subroutine begin(a,list,nuse,nx,vars,dnames)
implicit double precision(a-z)
integer nx,i,j,list(nx),nuse,iostat,isget,ispost
c nnames number of known vars in names c dnames list of names in data first line c nlist max number of vars in data c x(i) = z(list(i)) converts ith data element into appropriate place in x c z(0) must be zero for this to work for missing data elements character(len=16) dnames(nx) character(len=1024) a,b character(len=16) vars(2,nx) character(len=1) c logical isexe,agevars,depvars common/comexe/isexe,agevars,depvars namelist /nml/ & taxsimid, year , state , mstat , page, 6 sage , depx , dep13 , dep17 , dep18, 1 pwages , swages, divide, intrec, stcg, 6 ltcg , otherp, nonpro, pensio, gssi, 2 ui , transf, rentpa, propta, otheri, 6 childc , mortga, scorp , pbusin, pprofi, 3 sbusin , sprofi, idtl, mtr, pui, 6 sui , dep6 , dep19 , opt1, opt1v, 4 opt2 , opt2v , age1 , age2, age3, 6 psemp , ssemp common/xcom/ & taxsimid, year , state , mstat , page, 6 sage , depx , dep13 , dep17 , dep18, 1 pwages , swages, divide, intrec, stcg, 6 ltcg , otherp, nonpro, pensio, gssi, 2 ui , transf, rentpa, propta, otheri, 6 childc , mortga, scorp , pbusin, pprofi, 3 sbusin , sprofi, idtl, mtr, pui, 6 sui , dep6 , dep19 , opt1, opt1v, 4 opt2 , opt2v , age1 , age2, age3, 6 psemp , ssemp data ispost/0/ b=" " do 1 i=1,nx dnames(i) = " " list(i) = 0 1 continue a=' ' nuse=nx i=0 2 continue read(5,'(a1024)',end=999,err=998) a if(a.eq." ") goto 2
c Skip prelimary data, "get" or "multipart form/data".
i=index(a,":")+index(a,"essage")+index(a,"---")
c write(,) i ispost=max(i,ispost) if(i.gt.0) goto 2 isget=index(a,"&") c Write HTTP header, if appropriate
c Here for http "get" (will always have ampersands). c Collect one data record into namelist.
agevars=.false.
depvars=.false.
if(index(a,'&').gt.0) then
b(1:6) = ' $nml '
do 3 i=1,1017
b(i+6:i+6)=a(i:i)
if(a(i:i).eq.'&') b(i+6:i+6)=','
if(a(i:i).eq.' ') then
b(i+7:i+7) = '/'
goto 4
endif
3 continue 4 continue read(b,nml) if(age1+age2+age3.gt.0) agevars=.true. write(,'("Content-type: text/plain")') write(,'("Content-Disposition: inline"//)') write(,) b
elseif(index(a,"mstat").gt.0.and.index(a,"year").gt.0) then
c Here for CSV file using http "multipart form/data". Collect only c variable list from first line of csv. Write csv header.
read(a,*,end=7,iostat=iostat) dnames
7 continue
c delete UTF-8 BOM if(dnames(1)(1:1).eq.char(239))dnames(1)=dnames(1)(4:16) do 9 i=1,nx if(dnames(i).eq.' ') goto 99 do 8 j=1,nx if(dnames(i)(1:3).eq."age") agevars=.true. if(dnames(i)(1:3).eq."dep".and. & dnames(i)(1:4).ne."depx") depvars=.true. if(dnames(i).eq.vars(1,j)) list(i) = j 8 continue if(list(i).eq.0) then write(,) "TAXSIM: ERROR ",dnames(i), & " is not a taxsim35 input variable."
do 11 j=1,16
c=dnames(i)(j:j)
if(c.ge.' '.and.c.le.'~') goto 11
write(*,*) "TAXSIM: Name with unprintable character"
write(*,'(a22,z2)') "TAXSIM: Hex value is:",c
11 continue
stop 901
endif
9 continue
c10 continue
99 continue
nuse = i-1
else
write(,) 'TAXSIM: Need at least mstat and year'
write(,) 'a(1:131)='
write(,) a(1:131)
stop 25
endif
return
998 stop 998
999 stop 999
cflush
end
subroutine putlin(a,n)
c remove spaces from a and write to standard out.
character(len=1024) a
character(len=8) format
format=" "
j=0
do 10 i=1,n
if(a(i:i).ne." ") then
if(a(i:i).eq."/") goto 20
j=j+1
a(j:j)=a(i:i)
endif
10 continue
20 continue
format(1:2)="(a"
format(7:7)=")"
write(format(3:6),'(i4)') j
write(,format) a(1:j)
return
end
block data dllexe
implicit double precision(a-h,o-z)
logical isexe,agevars,depvars
common/comdll/dll
common/comold/d(255)
common/dindiv/data(255)
common/comexe/isexe,agevars,depvars
common/newshr/comnew(255)
data isexe/.true./
data comnew/2550./
data d/2550./
end
block data staten
character(len=20) states
common/cstates/states(0:55)
data states/' ',
& 'Alabama' ,'Alaska' ,'Arizona' ,'Arkansas',
& 'California' ,'Colorado' ,'Connecticut' ,'Delaware',
& 'DC' ,'Florida' ,'Georgia' ,'Hawaii',
& 'Idaho' ,'Illinois' ,'Indiana' ,'Iowa',
& 'Kansas' ,'Kentucky' ,'Louisiana' ,'Maine',
& 'Maryland' ,'Massachusetts' ,'Michigan' ,'Minnesota',
& 'Mississippi' ,'Missouri' ,'Montana' ,'Nebraska',
& 'Nevada' ,'New Hampshire' ,'New Jersey' ,'New Mexico',
& 'New York' ,'North Carolina','NorthDakota' ,'Ohio',
& 'Oklahoma' ,'Oregon' ,'Pennsylvania','Rhode Island',
& 'South Carolina','South Dakota' ,'Tennessee' ,'Texas',
& 'Utah' ,'Vermont' ,'Virginia' ,'Washington',
& 'West Virginia' ,'Wisconsin' ,'Wyoming' , 4' '/
end
double precision function sern(d)
implicit double precision(a-h,o-z)
dimension d(255)
if(d(2).eq.2.and.d(85)+d(86).gt.0.d0) then
sern=min(d(85),d(86))
else
sern=d(11)
endif
return
end
integer function itwn(i,imin,imax)
itwn=min(imax,max(i,imin))
return
end
subroutine statax(data,lawyr,comnew)
implicit double precision (A-H,O-Z)
parameter(lastat=2022)
common /psubr/ xndx,amtpi,almnpx,egtrra,almzbr,almst,enders,
&gjtrra,ratmul,cgmul,amtmul,tipra,wilhlc,extnd(0:100)
common/calc/hy,rent,agi,exemp,stded,xitded,taxinc,pcred,chcr,
& earncr,credit,rt,taxbc,rebate,energy,ctc,ylow,amt
common /xndxac/ xndxa(1981:2023)
dimension data(255),comnew(255)
dimension ds(255),coms(255)
c DO NOT FORGET TO UPDATE parameter(lastat) EVERY YEAR
agi=0.
exemp =0.
stded =0.
xitded=0.
taxinc=0.
pcred =0.
chcr =0.
earncr=0.
credit=0.
rt =0.
taxbc =0.
rebate=0.
energy=0.
ctc =0.
ylow =0.
amt =0.
stax=0.
rt=0.
hy=data(159)
rent=data(160)
comnew(74)=0.
id=int(abs(data(6)))
if(lawyr.eq.-99) then
lawyr=lastat
return
endif
if(lawyr.lt.1977) then
write(*,*)
& 'TAXSIM: State Tax Calculator available for years 1977+'
return
endif
if(id.le.0.or.id.gt.51) return
flate = 1.
law = lawyr
if(extnd(21).gt.0) law = int(extnd(21))
if(law.gt.lastat) then
flate = xndxa(law)/xndxa(lastat)
law = lastat
endif
do 100 i=1,255
ds(i) = data(i)
coms(i) = comnew(i)
100 continue
do 200 i=11,99
ds(i) = data(i)/flate
ds(i+100) = data(i+100)/flate
200 continue
do 300 i=1,98
if(i.ne.26.and.i.ne.65.and.i.ne.72.and.i.ne.73)
& coms(i) = comnew(i)/flate
300 continue
i=int(data(i))
select case(i)
case(1)
call altax(ds,coms,stax,law)
case(2)
call aktax(ds,coms,stax,law)
case(3)
call aztax(ds,coms,stax,law)
case(4)
call artax(ds,coms,stax,law)
case(5)
call catax(ds,coms,stax,law)
case(6)
call cotax(ds,coms,stax,law)
case(7)
call cttax(ds,coms,stax,law)
case(8)
call detax(ds,coms,stax,law)
case(9)
call dctax(ds,coms,stax,law)
case(11)
call gatax(ds,coms,stax,law)
case(12)
call hitax(ds,coms,stax,law)
case(13)
call idtax(ds,coms,stax,law)
case(14)
call iltax(ds,coms,stax,law)
case(15)
call intax(ds,coms,stax,law)
case(16)
call iatax(ds,coms,stax,law)
case(17)
call kstax(ds,coms,stax,law)
case(18)
call kytax(ds,coms,stax,law)
case(19)
call latax(ds,coms,stax,law)
case(20)
call metax(ds,coms,stax,law)
case(21)
call mdtax(ds,coms,stax,law)
case(22)
call matax(ds,coms,stax,law)
case(23)
call mitax(ds,coms,stax,law)
case(24)
call mntax(ds,coms,stax,law)
case(25)
call mstax(ds,coms,stax,law)
case(26)
call motax(ds,coms,stax,law)
case(27)
call mttax(ds,coms,stax,law)
case(28)
call netax(ds,coms,stax,law)
case(30)
call nhtax(ds,coms,stax,law)
case(31)
call njtax(ds,coms,stax,law)
case(32)
call nmtax(ds,coms,stax,law)
case(33)
call nytax(ds,coms,stax,law)
case(34)
call nctax(ds,coms,stax,law)
case(35)
call ndtax(ds,coms,stax,law)
case(36)
call ohtax(ds,coms,stax,law)
case(37)
call oktax(ds,coms,stax,law)
case(38)
call ortax(ds,coms,stax,law)
case(39)
call patax(ds,coms,stax,law)
case(40)
call ritax(ds,coms,stax,law)
case(41)
call sctax(ds,coms,stax,law)
case(43)
call tntax(ds,coms,stax,law)
case(45)
call uttax(ds,coms,stax,law)
case(46)
call vttax(ds,coms,stax,law)
case(47)
call vatax(ds,coms,stax,law)
case(49)
call wvtax(ds,coms,stax,law)
case(50)
call witax(ds,coms,stax,law)
case default
stax=0.d0
end select
comnew(74) = stax*flate
return
end
c
c Subroutines from Statutil
c
recursive double precision function socsec(data,comnew,law)
implicit double precision (A-H,O-Z)
dimension data(255),comnew(255),rate(1977:2025),ceil(1977:2029)
data rate
171300.d0,177300.d0,183600.d0,190200.d0/
c actual amounts through 2022 (03.21.2022)
mst = int(data(2))
if(mst.eq.2) then
fica = (min(data(85),ceil(law))+min(data(86),ceil(law)))
& rate(law)
if(data(85).gt.ceil(law))
& fica = fica + (data(85)-ceil(law)).0145
if(data(86).gt.ceil(law))
& fica = fica + (data(86)-ceil(law)).0145
else
fica = min(data(11),ceil(law))rate(law)
if(data(11).gt.ceil(law))
& fica = fica + (data(11)-ceil(law))*.0145
endif
c socsec = fica + data(43)+data(44)
c c175 = setax in sstax
socsec = fica + comnew(175)+data(44)
c Additional 0.9% Medicare Tax on Earned Income
if(law.ge.2013) socsec = socsec + comnew(180)
return
end
double precision function xjobs(data,law)
implicit double precision (A-H,O-Z)
dimension data(255),rate1(1977:1994),rate2(1977:1994)
data rate1/10.5d0,3.4d0,50.0d0/
data rate2/10.25d0,80.0d0/
amt1=0.
amt2=0.
xjobs=0.
if(law.le.1986) then
amt1=data(37)2/3
amt2=amt1/2
xjobs=min(12000.0d0,(amt1/rate1(law))+(amt2/rate2(law)))
elseif(law.ge.1987.and.law.le.1989) then
amt1=data(37)
amt2=0.
xjobs=min(6000.0d0,(amt1/rate1(law)))
elseif(law.ge.1990) then
xjobs=0.
endif
return
end
c
recursivesubroutine look(table,y,ntab,n,statax,aif,data2,rt,data) implicit double precision (A-H,O-Z) common/times/z,p,txrate,h dimension table(2,ntab),data(255) integer d2,d209 d209 = int(data(209)) d2 = int(data2) c negative data2 is signal that separate filing is allowed. h=0. c ntab=25 call look2(table,y,ntab,n,statax,aif,dabs(data2),rt,data) if(d2.eq.-2) then yh= max(data(85),data(86))+(y-data(11))/2. yw=y-yh h=2 call look2(table,yw,ntab,n,taxw,aif,1.0d0,rt,data) h=1 call look2(table,yh,ntab,n,taxh,aif,1.0d0,rt,data) if(taxw+taxh.gt.statax.and.d209.eq.2) then continue endif statax=min(statax,taxw+taxh) endif return end
subroutine look2(table,y,ntab,n,statax,aif,data2,rt,data) implicit double precision (A-H,O-Z) c aif=annual inflation factor if indexed,otherwise 1. common/times/z,p,txrate,h common/x/ct c data2=marital status if joint filing is allowed,otherwise 0. dimension table(2,ntab),data(255) integer d2 d2 = int(data2) c This line is in here to avoid unused variable errors n = n ajnt=1. if(d2.eq.2.or.d2.eq.5)ajnt=2 y1=max(y/aif/ajnt,0.0d0) statax=0. rt=0. yleft=y1 rate=table(2,1)/100. if(y1.lt.table(1,1)) goto 99 statax=table(1,1)table(2,1)/100. do 10 i=2,ntab if(table(1,i).lt.table(1,i-1).or.table(2,i).lt..1) then if(table(2,i).gt.0) then d101 = data(101) d100 = data(100) c write(,) 'TAXSIM:in look2', c & table(1,i),table(1,i-1),table(2,i),d101,data(6),d100 endif endif yleft=y1-table(1,i-1) rate=table(2,i)/100. if(y1.lt.table(1,i)) goto 99 statax=statax+(table(1,i)-table(1,i-1))rate 10 continue yleft=y1-table(1,ntab) 99 continue if(data(100).lt.-3) & write(,)'a',int(statax),int(yleft),int(yleftrate) & ,int(yleftrate+statax),int(y1) statax=aifajnt(yleft*rate+statax) c calculating marginal tax rate rt=rate return end
subroutine badlook2(table,y,ntab,n,statax,aif,data2,rt,data)
implicit double precision (A-H,O-Z)
c aif=annual inflation factor if indexed,otherwise 1.
common/times/z,p,txrate,h
common/x/ct
common/xcom/x(47)
c data2=marital status if income splitting is allowed,otherwise 0.
dimension table(2,ntab),data(255)
integer d2
d2 = int(data2)
c This line is in here to avoid unused variable errors
n = n
ajnt=1.
if(d2.eq.2.or.d2.eq.5)ajnt=2
y1=max(y/aif/ajnt,0.0d0)
if(x(3).gt.0.and.x(1).lt.-2)
& write(,)'y,aif,y1',int(y),sngl(aif),int(y1),int(ajnt)
statax=0.
rt=0.
yleft=y1
rate=table(2,1)/100.
if(y1.lt.table(1,1)) goto 99
statax=table(1,1)table(2,1)/100.
do 10 i=2,ntab
if(table(1,i).lt.table(1,i-1).or.table(2,i).lt..1) then
if(table(2,i).gt.0) then
d101 = data(101)
d100 = data(100)
write(,) 'TAXSIM: in look2',
& table(1,i),table(1,i-1),table(2,i),d101,data(6),d100
endif
endif
yleft=y1-table(1,i-1)
rate=table(2,i)/100.
if(y1.lt.table(1,i)) goto 99
statax=statax+(table(1,i)-table(1,i-1))rate
incr=int((table(1,i)-table(1,i-1))rate)
if(x(3).gt.0..and.x(1).lt.-1)
& write(,)'i rs',int(table(1,i)),'-',
& int(table(1,i-1)),''
& ,rate,incr,int(statax)
10 continue
@feenberg
I saw your comment "It turns out the Form 8812 doesn't reduce the Line 5 amount below 8,750" ~ just want to make sure we are talking about the same $1,000 rounding rule. There are two rounding rule appearances in the form: one in form 8812 Part 1-A line 9, the other one is in Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9
I'm referring to the 2021 Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9. Subtract line 8 from Schdule8812 line 3 * if more than zero ....enter the next multiple of $1,000
would be easier to refer to my manual calculation for details.
This is where the rounding rule got applied: line 5 Worksheet -- line 9: 177000 - 112500 = 64500; then apply the rounding rule 64500 -> 65000
Bodi
I agree, attached is the worksheet for line 5 which shows 65,000 on line 9.
The taxsim.f file I sent you is no good. I'll send a working one if you like. Can you remove the one I just sent from github? That would be helpful.
Thanks dan
On Tue, 24 Oct 2023, Bodi Yang wrote:
@feenberg
I saw your comment "It turns out the Form 8812 doesn't reduce the Line 5 amount below 8,750" ~ just want to make sure we are talking about the same $1,000 rounding rule. There are two rounding rule appearances in the form: one in form 8812 Part 1-A line 9, the other one is in Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9
I'm referring to the 2021 Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9. Subtract line 8 from Schdule8812 line 3 * if more than zero ....enter the next multiple of $1,000
would be easier to refer to my manual calculation for details.
This is where the rounding rule got applied: line 5 Worksheet -- line 9: 177000 - 112500 = 64500; then apply the rounding rule 64500 -> 65000
Bodi
-- Reply to this email directly or view it on GitHub: https://github.com/PSLmodels/Tax-Calculator/issues/2700#issuecomment-1777751828 You are receiving this because you were mentioned.
Message ID: @.***>
I agree, attached is the worksheet for line 5 which shows 65,000 on line 9. The taxsim.f file I sent you is no good. I'll send a working one if you like. Can you remove the one I just sent from github? That would be helpful. Thanks dan … On Tue, 24 Oct 2023, Bodi Yang wrote: @feenberg I saw your comment "It turns out the Form 8812 doesn't reduce the Line 5 amount below 8,750" ~ just want to make sure we are talking about the same $1,000 rounding rule. There are two rounding rule appearances in the form: one in form 8812 Part 1-A line 9, the other one is in Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9 I'm referring to the 2021 Form 8812 Instruction -- (at page 4) Line 5 Worksheet -- line 9. Subtract line 8 from Schdule8812 line 3 * if more than zero ....enter the next multiple of $1,000 would be easier to refer to [my manual calculation](#2700 (comment)) for details. This is where the rounding rule got applied: line 5 Worksheet -- line 9: 177000 - 112500 = 64500; then apply the rounding rule 64500 -> 65000 Bodi -- Reply to this email directly or view it on GitHub: #2700 (comment) You are receiving this because you were mentioned. Message ID: @.***>
Of course Dan. I think you may need to remove the previous taxsim.f from your git account. I can't do it on my side
Relates to Issue #2701
Resolved via PR #2704
There is an issue in child tax credit calculation for the year 2021. (noticed from the validation work with taxsim35 ~ many records are showing differences in child tax credit between Tax-Calc and Taxsim, as documented in PR 2698 )
Currently, Tax-Calculator's child tax credit calculation follows the IRS Publication 972, as in calcfunctions.py. The years before 2020 all follows IRS Publication 972.
Since 2021, child tax credit has been changed to follow IRS Sch 8812 in 2021. The tax logic is also changed for the year 2021, while to be noticed only for the year 2021. Year 2022's child tax credit still follows IRS Sch 8812, but the tax logic is the same as the years before 2020 which are under Publication 972, as can be seen in IRS Sch 8812 in 2022
As a result, the child tax credit calculation is correct for all the years except 2021. Tax logic has to be rewritten for the year 2021, following IRS Sch 8812 in 2021