# アーキテクチャ Web アプリの計算エンジンは、UI 状態(`AppState`)に依存しない純粋関数群として `src/lib/payroll/` に配置されます。各モジュールは単一責務を持ち、上位の `calculate.ts` がそれらを合成して月次計算を実行します。 ## モジュール依存 ```{mermaid} flowchart TD types[payroll/types.ts
ドメイン型] lookup[payroll/lookup.ts
共通検索] rates[payroll/rates.ts] rem[payroll/remuneration.ts] kaigo[payroll/kaigo.ts] round[payroll/round.ts] calc[payroll/calculate.ts] agg[payroll/aggregate.ts] types --> lookup lookup --> rates lookup --> rem types --> kaigo types --> round rates --> calc rem --> calc kaigo --> calc round --> calc calc --> agg ``` ## モジュールの責務 | モジュール | 責務 | |---|---| | `payroll/types.ts` | ドメイン型(`AppState`、`RemunerationEntry`、`RateEntry` 等)と既存値検証関数 | | `payroll/lookup.ts` | 効力発生日順での共通検索(料率・報酬どちらの履歴検索でも利用) | | `payroll/rates.ts` | `lookup.ts` のラッパー(料率専用エラー型を持つ) | | `payroll/remuneration.ts` | `lookup.ts` のラッパー(報酬専用エラー型を持つ) | | `payroll/kaigo.ts` | 介護該当の月単位判定(40〜64 歳の境界処理) | | `payroll/round.ts` | 50 銭超切上げ + 残額方式の端数処理 | | `payroll/calculate.ts` | 月次保険料の合成計算(各保険料の全額・社員側・事業主側) | | `payroll/aggregate.ts` | 年次集計・履歴ビュー用の派生計算 | ## 設計原則 - **AppState 非依存**: 計算モジュールは UI 状態に触れず、必要なドメインデータを引数で受け取る。UI ストア層が `AppState` から抽出して呼び出す - **整数演算**: 料率は 1/100,000 単位の整数として保持。浮動小数点誤差を排除し、Excel 版と bit-perfect 一致させる - **明示的エラー伝播**: 履歴に該当エントリがない等の異常はエラー型を返し、`silent failure`(既定値での処理続行)はしない 計算の数学的根拠は [計算リファレンス](../reference/index.md) を参照してください。