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