ふるさと納税控除額を計算するプログラム例
ふるさと納税の納税額の計算をするプログラムを書いた。
完全に自分に特化した内容であるが、計算方法は来年の自分、或いはもしかすると誰かの役に立つかもしれないのでここに貼っておく。
はじめに給与収入、ふるさと納税額、所得控除額等を入力する。 そのふるさと納税額が多すぎて全額控除対象にならない場合、計算の途中で assert に引っ掛かる。 ふるさと納税額が全額控除の限度額に収まっている場合には計算結果が出力される。
注意書き
すぐ上で全額控除とは言ったが、正確に言うと、ふるさと納税額から2,000円を引いた額が控除対象になる。ふるさと納税では一旦自治体に寄付したあと、年度末に確定申告等をしておくと、その年の6月くらいに控除額分が還付される仕組みなのでもっと正確に言えば、寄付した額-2,000円が返ってくる。
このプログラムは私と同じく品川区に住み、かつ同じくらいの給与収入の方ならば概ね正しい数値を出してくれるだろう。
逆に、私と違う地域に住んでいる、または給与収入が私よりも多い、もしくは少ない場合には税率等の定数が違ってくるので、そのままは使えない。 そこはソースコードを理解して書き換える必要がある。
品川区に住んでいるが、想定している収入範囲と異なる場合には assert が止めてくれる。
また、私は税制については完全なる素人であるので、このプログラムの計算結果は自己責任で利用して欲しい。計算式は国税庁およびいくつかのWebページを見ながら頑張って調べたものだが、間違っていても私は全く責任をとることができない。
でも勉強になるので、間違い、考慮漏れがあったら教えていただけるとうれしい。
ソースコード
謎クラス。
class Sheet(object):
VALUE = 0
CAPTION = 1
def __init__(self):
self.items = []
self.keys = set()
def __getitem__(self, key):
if key in self.keys:
for ty, k, item in self.items:
if ty == Sheet.VALUE and k == key:
return item
raise KeyError(key)
def __setitem__(self, key, item):
if key in self.keys:
for i in range(0, len(self.items)):
if self.items[i][0] == key:
self.items[i][1] = item
return
raise KeyError(key)
else:
self.items.append((Sheet.VALUE, key, item))
self.keys.add(key)
def __str__(self):
lines = []
for ty, key, item in self.items:
if ty == Sheet.VALUE:
if item < 1.0:
lines.append('{k}\t\t{v:.4f}'.format(k=key, v=item))
else:
lines.append('{k}\t\t{v:7,.0f}'.format(k=key, v=item))
elif ty == Sheet.CAPTION:
lines.append('# {k}'.format(k=key))
return '\n'.join(lines)
def addCaption(self, caption):
self.items.append((Sheet.CAPTION, caption, None))
x = Sheet()
本編。
x['給与収入'] = 6600001 # 660万以上でないとエラーになります. m(_ _)m
x['所得控除計(寄付金控除以外)'] = 1300000 # 適当
x['ふるさと納税寄付額'] = 80000 # 寄付したい額. うち2,000円は自己負担.
x['人的控除差額'] = 0 # 扶養者や持家がある場合には変わってきます.
x.addCaption('所得')
assert 6600000 < x['給与収入'] < 10000000
x['給与所得'] = x['給与収入'] * 0.9 - 1200000
x['給与所得控除'] = x['給与収入'] * 0.1 + 1200000
x['寄付金控除'] = x['ふるさと納税寄付額']
x['所得控除計'] = x['所得控除計(寄付金控除以外)'] + x['寄付金控除']
x['課税標準額'] = x['給与所得'] - x['所得控除計']
assert 3300000 < x['課税標準額'] < 6950000
x['所得控除額'] = 427500
x['所得税率'] = 0.20
x['所得税額'] = x['課税標準額'] * x['所得税率'] - x['所得控除額']
x['復興特別所得税率'] = x['所得税率'] * 0.021
x.addCaption('住民税')
x['所得割額(都民税)'] = x['課税標準額'] * 0.04
x['所得割額(特別区民税)'] = x['課税標準額'] * 0.06
x['所得割額経計'] = x['所得割額(都民税)'] + x['所得割額(特別区民税)']
x['調整控除額(都民税)'] = max(50000, x['所得割額(都民税)'] - 2000000) * 0.02
x['調整控除額(特別区民税)'] = max(50000, x['所得割額(特別区民税)'] - 2000000) * 0.03
x['調整控除後所得割(都民税)'] = x['所得割額(都民税)'] - x['調整控除額(都民税)']
x['調整控除後所得割(特別区民税)'] = \
x['所得割額(特別区民税)'] - x['調整控除額(特別区民税)']
x['調整控除後所得割計'] = \
x['調整控除後所得割(都民税)'] + x['調整控除後所得割(特別区民税)']
x['均等割額(都民税)'] = 1500
x['均等割額(特別区民税)'] = 3500
x['住民税額(都民税)'] = x['調整控除後所得割(都民税)'] + x['均等割額(都民税)']
x['住民税額(特別区民税)'] = \
x['調整控除後所得割(特別区民税)'] + x['均等割額(特別区民税)']
x['住民税額計'] = x['住民税額(都民税)'] + x['住民税額(特別区民税)']
x.addCaption('ふるさと納税')
x['所得税からの控除額'] = \
(x['ふるさと納税寄付額'] - 2000) * (x['所得税率'] + x['復興特別所得税率'])
x['寄付金控除(基本分)'] = \
(x['ふるさと納税寄付額'] - 2000) * 0.1
x['寄付金控除(特例分)'] = \
(x['ふるさと納税寄付額'] - 2000) * (0.9 - x['所得税率'] - x['復興特別所得税率'])
assert x['寄付金控除(特例分)'] < x['調整控除後所得割計'] * 0.2
x['ふるさと納税控除額'] = \
x['所得税からの控除額'] + x['寄付金控除(基本分)'] + x['寄付金控除(特例分)']
print(x)
上記コードは GitHub にも公開しておいた。
https://github.com/kikei/furusato-tax-simulator
出力例
上記設定でプログラムを実行すると、以下のように出力される。
# 入力値
給与収入 6,600,001
所得控除計(寄付金控除以外) 1,300,000
ふるさと納税寄付額 80,000
人的控除差額 0.0000
# 所得
給与所得 4,740,001
給与所得控除 1,860,000
寄付金控除 80,000
所得控除計 1,380,000
課税標準額 3,360,001
所得控除額 427,500
所得税率 0.2000
所得税額 244,500
復興特別所得税率 0.0042
# 住民税
所得割額(都民税) 134,400
所得割額(特別区民税) 201,600
所得割額経計 336,000
調整控除額(都民税) 1,000
調整控除額(特別区民税) 1,500
調整控除後所得割(都民税) 133,400
調整控除後所得割(特別区民税) 200,100
調整控除後所得割計 333,500
均等割額(都民税) 1,500
均等割額(特別区民税) 3,500
住民税額(都民税) 134,900
住民税額(特別区民税) 203,600
住民税額計 338,500
# ふるさと納税
所得税からの控除額 15,928
寄付金控除(基本分) 7,800
寄付金控除(特例分) 54,272
ふるさと納税控除額 78,000
ふるさと納税寄付額 80,000 円に対し、78,000 円が控除され、還付される。 2,000 円は自己負担。