PSLmodels / Tax-Calculator

USA Federal Individual Income and Payroll Tax Microsimulation Model
https://taxcalc.pslmodels.org
Other
262 stars 157 forks source link

credits for child tax & other dependents tax calculation of the year 2021 #2700

Closed bodiyang closed 11 months ago

bodiyang commented 1 year ago

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

jdebacker commented 1 year 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?

feenberg commented 1 year ago

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: @.***>

bodiyang commented 1 year ago

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

feenberg commented 1 year ago

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: @.***>

bodiyang commented 1 year ago

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:

feenberg commented 1 year ago

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: @.***>

jdebacker commented 1 year ago

@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.

jdebacker commented 1 year ago

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.

bodiyang commented 1 year ago

IMG_4939 copy

@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

feenberg commented 1 year ago

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: @.***>

feenberg commented 1 year ago

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: @.***>

bodiyang commented 1 year ago

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

feenberg commented 1 year ago

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

bodiyang commented 1 year ago

@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

feenberg commented 1 year ago

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: @.***>

bodiyang commented 1 year ago

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

jdebacker commented 12 months ago

Relates to Issue #2701

jdebacker commented 12 months ago

Resolved via PR #2704