Skip to content

Instantly share code, notes, and snippets.

@yukoba
Last active July 2, 2018 14:23
Show Gist options
  • Save yukoba/66bbbf6a971817d28c48586d60a68b0d to your computer and use it in GitHub Desktop.
Save yukoba/66bbbf6a971817d28c48586d60a68b0d to your computer and use it in GitHub Desktop.
# 2018年度用
def calc_kojin(income, age):
# 基礎控除
kisokoujyo_kuni = 38
kisokoujyo_chihou = 33
# 給与所得控除 https://www.nta.go.jp/m/taxanswer/1410.htm
if income <= 180:
kyuyo_shotoku_koujyo = max(65, income * 0.4)
elif income <= 360:
kyuyo_shotoku_koujyo = income * 0.3 + 18
elif income <= 660:
kyuyo_shotoku_koujyo = income * 0.2 + 54
elif income <= 1000:
kyuyo_shotoku_koujyo = income * 0.1 + 120
else:
kyuyo_shotoku_koujyo = 220
# 厚生年金 https://www.kyoukaikenpo.or.jp/~/media/Files/shared/hokenryouritu/h30/ippan4gatu_2/h30413tokyo_02.pdf
if income <= 9.3 * 12:
kousei_nenkin = 1.6104 * 12
elif income <= 63.5 * 12:
kousei_nenkin = income * 0.183
else:
kousei_nenkin = 11.346 * 12
# 協会けんぽ
if 40 <= age <= 64:
if income <= 6.3 * 12:
kenpo = 0.5742 * 12
elif income <= 135.5 * 12:
kenpo = income * 0.1147
else:
kenpo = 15.9433 * 12
else:
if income <= 6.3 * 12:
kenpo = 0.66526 * 12
elif income <= 135.5 * 12:
kenpo = income * 0.099
else:
kenpo = 13.7610 * 12
# 所得税 https://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/2260.htm
kazei_income_kuni = max(0,
income - kisokoujyo_kuni -
kyuyo_shotoku_koujyo - (kousei_nenkin + kenpo) / 2)
if kazei_income_kuni <= 195:
syotokuzei = kazei_income_kuni * 0.05
elif kazei_income_kuni <= 330:
syotokuzei = kazei_income_kuni * 0.1 - 9.75
elif kazei_income_kuni <= 695:
syotokuzei = kazei_income_kuni * 0.2 - 42.75
elif kazei_income_kuni <= 900:
syotokuzei = kazei_income_kuni * 0.23 - 63.6
elif kazei_income_kuni <= 1800:
syotokuzei = kazei_income_kuni * 0.33 - 153.6
elif kazei_income_kuni <= 4000:
syotokuzei = kazei_income_kuni * 0.4 - 279.6
else:
syotokuzei = kazei_income_kuni * 0.45 - 479.6
# 特別復興所得税
syotokuzei = syotokuzei * 1.021
# 住民税
kazei_income_chihou = max(0,
income - kisokoujyo_chihou - \
kyuyo_shotoku_koujyo - (kousei_nenkin + kenpo) / 2)
jyuminzei = kazei_income_chihou * 0.1
zei = syotokuzei + jyuminzei + kenpo
# print("%d\t%f" % (income, zei / income))
return zei, (kousei_nenkin + kenpo) / 2
def calc_houjin(income):
# 法人税
houjinzei = min(800, income) * 0.15 + max(0, income - 800) * 0.232
# 地方法人税
chihou_houjinzei = houjinzei * 0.044
# 法人住民税
houjin_jyuminzei = houjinzei * 0.129 if houjinzei <= 1000 else houjinzei * 0.163
# 法人事業税
if income <= 2500:
houjin_jigyouzei = min(400, income) * 0.034 + \
max(0, min(400, income - 400)) * 0.051 + \
max(0, income - 800) * 0.067
else:
houjin_jigyouzei = min(400, income) * 0.0365 + \
max(0, min(400, income - 400)) * 0.05465 + \
max(0, income - 800) * 0.0718
# 地方法人特別税
houjin_toubetsuzei = houjin_jigyouzei * 0.432
hyoumen_zeigaku = houjinzei + chihou_houjinzei + houjin_jyuminzei + houjin_jigyouzei + houjin_toubetsuzei
jikkou_zeiritsu = hyoumen_zeigaku / (income + houjin_jigyouzei + houjin_toubetsuzei)
hyoumen_zeigaku_kintouwari = hyoumen_zeigaku + 7
jikkou_zeiritsu_kintouwari = hyoumen_zeigaku_kintouwari / (income + houjin_jigyouzei + houjin_toubetsuzei)
# print("法人税 = %f" % houjinzei)
# print("地方法人税 = %f" % chihou_houjinzei)
# print("法人住民税 = %f" % houjin_jyuminzei)
# print("法人事業税 = %f" % houjin_jigyouzei)
# print("地方法人特別税 = %f" % houjin_toubetsuzei)
# print("表面税額(-均等割) = %f" % hyoumen_zeigaku)
# print("実効税率(-均等割) = %f" % (jikkou_zeiritsu * 100))
# print("表面税額(+均等割) = %f" % hyoumen_zeigaku_kintouwari)
# print("実効税率(+均等割) = %f" % (jikkou_zeiritsu_kintouwari * 100))
# print("%d\t%f" % (income, jikkou_zeiritsu))
# print("%d\t%f" % (income, jikkou_zeiritsu_kintouwari))
return income * jikkou_zeiritsu
def find_best(income, age):
best_zei_total = 1e100
best_kojin_income = 0
# for kojin_income in range(80, income + 10, 10):
for kojin_income in range(80, 1300, 1):
zei_kojin, koujyo = calc_kojin(kojin_income, age)
if income > kojin_income + koujyo:
zei_houjin = calc_houjin(income - kojin_income - koujyo)
else:
zei_houjin = 0
zei_total = zei_kojin + zei_houjin
# print("%d\t%d\t%d\t%d\t%d" % (kojin_income, zei_kojin, koujyo, zei_houjin, zei_total))
if zei_total <= best_zei_total:
best_zei_total = zei_total
best_kojin_income = kojin_income
print("%d\t%d" % (income, best_kojin_income))
def main():
for income in range(80, 5010, 10):
find_best(income, 39)
# calc_houjin(income)
# calc_kojin(income, 39)
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment