Ruby で学ぶアメリカ税制 - キャピタルゲイン税額計算

前回の受贈財産の売却益の計算が案外さくっとうまくいったので、それに味をしめて、Form 1040 Schedule D を直接 Ruby で記述しようと試みましたが、いやあ、大変。やはり、各フォームの line レベルでプログラムに記述するのは大変ですね。

考えるのが面倒なので、クラスを使っていません。おそらくは、各フォームおよびワークシートごとにクラス化すると、コードが美しくなるものと思われます。

下のコードはあくまでも「雰囲気」です。まだ動くコードではありません。

・・・それにしても。教科書にはいろいろ税額計算のヒントは書いてあっても、肝心の最終的な計算方法が書いていないんですよね。実は、教科書に書いてある程度の情報量では、とてもじゃないが最終的な税額を計算できないんですね。今日一日、Schedule D 周りのフォーム(Form 6252, 4684, 6781, 8824, 4797, Schedule-K 等)をさまよい歩いて、それがよくわかりました。やれやれ、こんな複雑な代物をよく考えついたもんだ。

# THIS PROGRAM IS UNDER DEVELOPMENT AND HAS NOT BEEN AT WORK

# calculation of tax for capital gain/loss for indivisuals.
# (not C corporation)

#schedule_d Schedule D hash object
def twenty_eight_percent_gain_worksheet(schedule_d)
  #dummy settings
  #schedule_d = {:line8_total => 0, :line8_sec1202_50 => 0, :line8_sec1202_60 => 0, :line7 => -10, :line14 => -30}
  
  form4686 = {:gain => 0}
  form6252 = {:gain => 0}
  form6871 = {:gain => 0}
  form8824 = {:gain => 0}
  form1099div = {:box2d => 0}
  form2439 = {:box1d => 0}
  schedule_k1 = {:gain => 0, :box11_c => 0}

  line1 = schedule_d[:line8_total]
  line2 = (schedule_d[:line8_sec1202_50] + schedule_d[:line8_sec1202_60] * (2/3)).abs
  line3 = form4686[:gain] + form6252[:gain] + form6871[:gain] + form8824[:gain]
  line4 = form1099div[:box2d] + form2439[:box1d] + schedule_k1[:gain]
  line5 = schedule_d[:line14] + schedule_k1[:box11_c]
  line6 = [0, schedule_d[:line7]].min
  line7 = line1 + line2 + line3 + line4 + line5 + line6

  return line7
end

# Try to simulate Schedule D Part III

#form1040  Form 1040 hash object
#line7 Short Term Capital Gain / Loss
#line15 Long Term Captial Gain / Loss
def schedule_d_part_3(schedule_d, form1040)
  line16 = schedule_d(:line7) + schedule_d(:line15)
  # gain
  if line16 > 0 
   form1040[:line13] = line16
   # line17
   if line15 > 0 and line16 > 0
     line18 = twenty_eight_percent_gain_worksheet(schedule_d)
     line19 = unrecaptured_section_1250_gain_worksheet(schedule_d)
     if line18 == 0 and line19 == 0
       form1040[:line44] = qualified_dvidends_and_capital_gain_tax_worksheet(form1040, schedule_d)
     else
       form1040[:line44] = schedule_d_tax_worksheet(form1040, schedule_d)
     end   
   end
  # zero or loss
  else
    form1040[:line13] = [line16, -3000].max
    # qualified dividends? 
    if form1040[:line9b] > 0
      form1040[:line44] = qualified_dividends_and_capital_gain_tax_worksheet(form1040, schedule_d)
    end
    form1040[:line44] = tax_table()
  end
end