fix: 社会保険料の端数処理を四捨五入から切り捨てに変更 (健康保険・介護保険・厚生年金・雇用保険・子育て支援金)
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import functools
|
import functools
|
||||||
from decimal import Decimal, ROUND_HALF_UP
|
from decimal import Decimal, ROUND_HALF_UP, ROUND_DOWN
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
from ...core.database import get_connection
|
from ...core.database import get_connection
|
||||||
@@ -203,7 +203,7 @@ class BonusCalculationService:
|
|||||||
if health_insurance_rate:
|
if health_insurance_rate:
|
||||||
health_insurance = (
|
health_insurance = (
|
||||||
health_standard_bonus * Decimal(str(health_insurance_rate["employee_rate"]))
|
health_standard_bonus * Decimal(str(health_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
|
|
||||||
# 介護保険(40歳以上65歳未満が対象)
|
# 介護保険(40歳以上65歳未満が対象)
|
||||||
care_insurance = Decimal("0")
|
care_insurance = Decimal("0")
|
||||||
@@ -212,7 +212,7 @@ class BonusCalculationService:
|
|||||||
if care_insurance_rate:
|
if care_insurance_rate:
|
||||||
care_insurance = (
|
care_insurance = (
|
||||||
health_standard_bonus * Decimal(str(care_insurance_rate["employee_rate"]))
|
health_standard_bonus * Decimal(str(care_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
|
|
||||||
# 厚生年金
|
# 厚生年金
|
||||||
pension_insurance_rate = BonusCalculationService.get_insurance_rate("厚生年金", payment_date)
|
pension_insurance_rate = BonusCalculationService.get_insurance_rate("厚生年金", payment_date)
|
||||||
@@ -220,7 +220,7 @@ class BonusCalculationService:
|
|||||||
if pension_insurance_rate:
|
if pension_insurance_rate:
|
||||||
pension_insurance = (
|
pension_insurance = (
|
||||||
pension_standard_bonus * Decimal(str(pension_insurance_rate["employee_rate"]))
|
pension_standard_bonus * Decimal(str(pension_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
|
|
||||||
# 雇用保険
|
# 雇用保険
|
||||||
employment_insurance_rate = BonusCalculationService.get_insurance_rate("雇用保険", payment_date)
|
employment_insurance_rate = BonusCalculationService.get_insurance_rate("雇用保険", payment_date)
|
||||||
@@ -228,7 +228,7 @@ class BonusCalculationService:
|
|||||||
if employment_insurance_rate:
|
if employment_insurance_rate:
|
||||||
employment_insurance = (
|
employment_insurance = (
|
||||||
total_bonus * Decimal(str(employment_insurance_rate["employee_rate"]))
|
total_bonus * Decimal(str(employment_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
|
|
||||||
# 子ども・子育て支援金(令和8年5月支給分以降のみ適用)
|
# 子ども・子育て支援金(令和8年5月支給分以降のみ適用)
|
||||||
# 賞与は bonus_month でなく実際の支給日(payment_date)で判定する
|
# 賞与は bonus_month でなく実際の支給日(payment_date)で判定する
|
||||||
@@ -241,7 +241,7 @@ class BonusCalculationService:
|
|||||||
if child_support_rate:
|
if child_support_rate:
|
||||||
child_support = (
|
child_support = (
|
||||||
total_bonus * Decimal(str(child_support_rate["employee_rate"]))
|
total_bonus * Decimal(str(child_support_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
print(f"[DEBUG] 賞与子育て支援金: 賞与総額={total_bonus} × 料率={child_support_rate['employee_rate']} = {child_support}")
|
print(f"[DEBUG] 賞与子育て支援金: 賞与総額={total_bonus} × 料率={child_support_rate['employee_rate']} = {child_support}")
|
||||||
|
|
||||||
# 所得税の計算(賞与特有の計算)
|
# 所得税の計算(賞与特有の計算)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"""
|
"""
|
||||||
給与計算サービス (Payroll Calculation Service)
|
給与計算サービス (Payroll Calculation Service)
|
||||||
"""
|
"""
|
||||||
from decimal import Decimal, ROUND_HALF_UP
|
from decimal import Decimal, ROUND_HALF_UP, ROUND_DOWN
|
||||||
from datetime import date
|
from datetime import date
|
||||||
from typing import Dict, Any
|
from typing import Dict, Any
|
||||||
from ...core.database import get_connection
|
from ...core.database import get_connection
|
||||||
@@ -381,7 +381,7 @@ class PayrollCalculationService:
|
|||||||
if health_insurance_rate:
|
if health_insurance_rate:
|
||||||
health_insurance = (
|
health_insurance = (
|
||||||
health_standard_salary * Decimal(str(health_insurance_rate["employee_rate"]))
|
health_standard_salary * Decimal(str(health_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
elif calc_social_insurance:
|
elif calc_social_insurance:
|
||||||
errors.append(f"健康保険料率が見つかりません(年度: {payment_date.year})")
|
errors.append(f"健康保険料率が見つかりません(年度: {payment_date.year})")
|
||||||
|
|
||||||
@@ -392,7 +392,7 @@ class PayrollCalculationService:
|
|||||||
if care_insurance_rate:
|
if care_insurance_rate:
|
||||||
care_insurance = (
|
care_insurance = (
|
||||||
health_standard_salary * Decimal(str(care_insurance_rate["employee_rate"]))
|
health_standard_salary * Decimal(str(care_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
print(f"[DEBUG] 介護保険計算: {health_standard_salary} × {care_insurance_rate['employee_rate']}% = {care_insurance}")
|
print(f"[DEBUG] 介護保険計算: {health_standard_salary} × {care_insurance_rate['employee_rate']}% = {care_insurance}")
|
||||||
else:
|
else:
|
||||||
errors.append(f"介護保険料率が見つかりません(年度: {payment_date.year})") if calc_social_insurance else None
|
errors.append(f"介護保険料率が見つかりません(年度: {payment_date.year})") if calc_social_insurance else None
|
||||||
@@ -403,7 +403,7 @@ class PayrollCalculationService:
|
|||||||
if pension_insurance_rate:
|
if pension_insurance_rate:
|
||||||
pension_insurance = (
|
pension_insurance = (
|
||||||
pension_standard_salary * Decimal(str(pension_insurance_rate["employee_rate"]))
|
pension_standard_salary * Decimal(str(pension_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
print(f"[DEBUG] 厚生年金計算: {pension_standard_salary} × {pension_insurance_rate['employee_rate']}% = {pension_insurance}")
|
print(f"[DEBUG] 厚生年金計算: {pension_standard_salary} × {pension_insurance_rate['employee_rate']}% = {pension_insurance}")
|
||||||
elif calc_social_insurance:
|
elif calc_social_insurance:
|
||||||
errors.append(f"厚生年金保険料率が見つかりません(年度: {payment_date.year})")
|
errors.append(f"厚生年金保険料率が見つかりません(年度: {payment_date.year})")
|
||||||
@@ -423,7 +423,7 @@ class PayrollCalculationService:
|
|||||||
if child_support_rate:
|
if child_support_rate:
|
||||||
child_support = (
|
child_support = (
|
||||||
standard_monthly_salary * Decimal(str(child_support_rate["employee_rate"]))
|
standard_monthly_salary * Decimal(str(child_support_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
print(f"[DEBUG] 子育て支援金: 標準報酬月額={standard_monthly_salary} × 料率={child_support_rate['employee_rate']} = {child_support}")
|
print(f"[DEBUG] 子育て支援金: 標準報酬月額={standard_monthly_salary} × 料率={child_support_rate['employee_rate']} = {child_support}")
|
||||||
|
|
||||||
# 雇用保険加入対象かどうか確認
|
# 雇用保険加入対象かどうか確認
|
||||||
@@ -432,7 +432,7 @@ class PayrollCalculationService:
|
|||||||
if is_employment_insurance_eligible and employment_insurance_rate:
|
if is_employment_insurance_eligible and employment_insurance_rate:
|
||||||
employment_insurance = (
|
employment_insurance = (
|
||||||
total_payment * Decimal(str(employment_insurance_rate["employee_rate"]))
|
total_payment * Decimal(str(employment_insurance_rate["employee_rate"]))
|
||||||
).quantize(Decimal("1"), rounding=ROUND_HALF_UP)
|
).quantize(Decimal("1"), rounding=ROUND_DOWN)
|
||||||
elif not is_employment_insurance_eligible:
|
elif not is_employment_insurance_eligible:
|
||||||
print(f"[DEBUG] この従業員は雇用保険非対象です")
|
print(f"[DEBUG] この従業員は雇用保険非対象です")
|
||||||
elif not employment_insurance_rate and calc_social_insurance:
|
elif not employment_insurance_rate and calc_social_insurance:
|
||||||
|
|||||||
Reference in New Issue
Block a user