Files
njts-accounting-core/backend/app/payroll/settings/schemas.py
2026-01-20 11:15:49 +09:00

221 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
給与設定・税率・保険料のスキーマ定義 (Settings Schemas)
"""
from pydantic import BaseModel
from datetime import date, datetime
from typing import Optional
from decimal import Decimal
class SalarySettingBase(BaseModel):
"""給与基本設定"""
employee_id: int
base_salary: Decimal = Decimal("0")
hourly_rate: Optional[Decimal] = None
employment_type: str # 正社員/契約社員/パート/アルバイト
payment_type: str # 月給/時給/日給
commute_allowance: Decimal = Decimal("0")
other_allowance: Decimal = Decimal("0")
valid_from: date
valid_to: Optional[date] = None
class SalarySettingCreate(SalarySettingBase):
"""給与設定の作成"""
pass
class SalarySettingUpdate(BaseModel):
"""給与設定の更新"""
base_salary: Optional[Decimal] = None
hourly_rate: Optional[Decimal] = None
employment_type: Optional[str] = None
payment_type: Optional[str] = None
commute_allowance: Optional[Decimal] = None
other_allowance: Optional[Decimal] = None
valid_from: Optional[date] = None
valid_to: Optional[date] = None
class SalarySetting(SalarySettingBase):
"""給与設定の情報"""
setting_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class InsuranceRateBase(BaseModel):
"""社会保険料率"""
rate_year: int # 適用年度(例: 2026
rate_type: str # 健康保険/介護保険/厚生年金/雇用保険/労災保険
calculation_target: str # 給与/賞与
prefecture: str = "東京都" # 事業所所在地
employee_rate: Decimal
employer_rate: Decimal
care_insurance_age_threshold: Optional[int] = None # 介護保険適用年齢下限
notes: Optional[str] = None
class InsuranceRateCreate(InsuranceRateBase):
"""保険料率の作成"""
pass
class InsuranceRateUpdate(BaseModel):
"""保険料率の更新"""
rate_year: Optional[int] = None
rate_type: Optional[str] = None
calculation_target: Optional[str] = None
prefecture: Optional[str] = None
employee_rate: Optional[Decimal] = None
employer_rate: Optional[Decimal] = None
care_insurance_age_threshold: Optional[int] = None
notes: Optional[str] = None
class InsuranceRate(InsuranceRateBase):
"""保険料率の情報"""
rate_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
class IncomeTaxTableBase(BaseModel):
"""所得税率表"""
monthly_income_from: Decimal
monthly_income_to: Decimal
dependents_count: int = 0
tax_amount: Decimal
valid_from: date
valid_to: Optional[date] = None
class IncomeTaxTableCreate(IncomeTaxTableBase):
"""所得税率表の作成"""
pass
class IncomeTaxTable(IncomeTaxTableBase):
"""所得税率表の情報"""
tax_id: int
created_at: datetime
class Config:
from_attributes = True
# ========================================
# 子ども・子育て拠出金率
# ========================================
class ChildSupportContributionRateBase(BaseModel):
"""子ども・子育て拠出金率"""
rate_year: int # 適用年度
income_threshold: Decimal # 所得基準額(標準報酬月額)
contribution_rate: Decimal # 拠出金率(事業主負担のみ)
notes: Optional[str] = None
class ChildSupportContributionRateCreate(ChildSupportContributionRateBase):
"""子ども・子育て拠出金率の作成"""
pass
class ChildSupportContributionRateUpdate(BaseModel):
"""子ども・子育て拠出金率の更新"""
income_threshold: Optional[Decimal] = None
contribution_rate: Optional[Decimal] = None
notes: Optional[str] = None
class ChildSupportContributionRate(ChildSupportContributionRateBase):
"""子ども・子育て拠出金率の情報"""
contribution_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
# ========================================
# 社会保険料上限設定
# ========================================
class InsuranceLimitSettingBase(BaseModel):
"""社会保険料上限設定"""
setting_type: str # 健康保険標準報酬月額上限/厚生年金標準報酬月額上限/通勤手当非課税限度額
limit_amount: Decimal
valid_from: date
valid_to: Optional[date] = None
notes: Optional[str] = None
class InsuranceLimitSettingCreate(InsuranceLimitSettingBase):
"""上限設定の作成"""
pass
class InsuranceLimitSettingUpdate(BaseModel):
"""上限設定の更新"""
limit_amount: Optional[Decimal] = None
valid_from: Optional[date] = None
valid_to: Optional[date] = None
notes: Optional[str] = None
class InsuranceLimitSetting(InsuranceLimitSettingBase):
"""上限設定の情報"""
limit_id: int
created_at: datetime
updated_at: datetime
class Config:
from_attributes = True
# ========================================
# 扶養家族判定条件
# ========================================
class DependentRuleBase(BaseModel):
"""扶養家族判定条件"""
rule_type: str # 所得限度額/年齢条件/同一生計
rule_value: str
valid_from: date
valid_to: Optional[date] = None
description: Optional[str] = None
class DependentRuleCreate(DependentRuleBase):
"""判定条件の作成"""
pass
class DependentRule(DependentRuleBase):
"""判定条件の情報"""
rule_id: int
created_at: datetime
class Config:
from_attributes = True
"""所得税率表の情報"""
tax_id: int
created_at: datetime
class Config:
from_attributes = True
class IncomeTaxImport(BaseModel):
"""所得税率表のインポート用"""
data: list[IncomeTaxTableCreate]
valid_from: date