銀行エンジニアリング 28:預金の利息と手数料の会計(日次残高・中途解約・照合)
普通預金の利息は、日ごとの残高と、その日に有効な金利から計算します。手数料や中途解約の利息が、どの仕訳で、どのGL科目に入るかを追います。
v8以降に実装した台帳・記帳エンジンなどを実際に動かし、正常時と異常時の両方から銀行システムの構造を学ぶ。
Prerequisite: BANKING SYSTEMLEARNING GOALS
このページで学ぶこと
- 日次残高からの利息の計算
- 手数料の請求・免除・見送り
- 利息と手数料の仕訳とGL、実行記録との照合
PLAIN LANGUAGE
まず、ここだけつかむ
普通預金の利息は、日ごとの終わりの残高と、その日に有効な金利の積を足し合わせて計算します。
利息は借方が支払利息(5100)、貸方が顧客預金。手数料は借方が顧客預金、貸方が手数料収益(4200)です。
実行記録は仕訳と、契約の利息は契約の条件からの再計算と元帳の仕訳の両方と照合します。
DIFFICULT PARTS, STEP BY STEP
難しいポイントを、順番にほどく
専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。
日次残高
各日の終わりの預金残高です。
残高が増減した日から、利息を正しく数えるためです。
ledger の仕訳を、仕訳の実時刻のJST暦日で集計(営業日ではない。営業日が遅れている間の入金は実日付から数える)。
免除残高
これ以上の残高なら手数料を請求しない基準です。
残高の多い顧客には請求しない商品設計を表すためです。
WAIVED と fee_waiver_balance。
実行記録
いつ・どの期間を・いくら払ったかの記録です。
二重の支払を防ぎ、あとから再計算で確かめるためです。
pricing.interest_runs と pricing.fee_runs。
Level 1 基礎:残高が増えた日から、その分の利息が付く
普通預金の利息は、各日の終わりの残高に、その日に有効な金利をかけて足し合わせ、365で割って1円未満を切り捨てます。金利が期間の途中で切り替わる場合は、日ごとに正しい金利を使います。
| 期間 | その日の残高 | 日数 |
|---|---|---|
| 7/1〜7/9 | 100,000円 | 9日 |
| 7/10〜7/31 | 150,000円 | 22日 |
Level 2 銀行業務:例題と仕訳
支払う利息は銀行の費用です。仕訳は、借方が支払利息(GL 5100)、貸方が顧客の預金です。月次の口座維持手数料は逆で、借方が顧客預金、貸方が手数料収益(GL 4200)です。
| 条件 | 合計(残高×bps) |
|---|---|
| 7/1〜7/9:100,000円 × 2bp × 9日 | 1,800,000 |
| 7/10〜7/15:150,000円 × 2bp × 6日 | 1,800,000 |
| 7/16〜7/31:150,000円 × 100bp × 16日(7/16から新しい版) | 240,000,000 |
| 合計 ÷ (10,000 × 365) を切り捨て | 243,600,000 ÷ 3,650,000 = 66.7…→ 66円 |
Level 3 システム:MiniBankでの実装
- pricing.run_ordinary_interest は、口座と期間を指定して実行する。同じ口座・期間の再実行は元の結果を返し、期間が重なる別の実行は PR009
- 実行できるのは営業日より前の日だけ(PR008)。管理責任者のみ実行できる
- pricing.run_account_fee は月ごとに1回。免除残高が0より大きく、月末残高がそれ以上なら WAIVED(0は免除なし)、月末残高またはいまの残高が手数料に足りなければ SKIPPED_INSUFFICIENT(請求しない)、それ以外は CHARGED
- 満期・中途解約の利息も、契約に固定した年利と暦日数から計算する。中途解約は契約時の中途解約利率で、その日までの日数分(契約の日数を上限)を支払う。中途解約の利率は契約の年利を超えられない
- PRICING_ORDINARY_INTEREST などの event は、汎用の取消を PF002 で拒否する(実行記録だけが残る取り消しを防ぐ)
異常時:実行記録と仕訳の金額が合わない
| 段階 | 内容 |
|---|---|
| 症状 | 運用センターに PRICING_MISMATCH が出る |
| 調査 | pricing.reconcile の結果で、どの実行または契約の金額が、仕訳や再計算と違うかを見る |
| 原因の例 | 実行記録や契約の利息の値が、仕訳とは別に書き換えられた |
| 対応 | 仕訳を直接直さず、原因の記録側を調べる。汎用の取消は拒否されるので、専用の訂正を設計する |
Level 4 アーキテクチャ:計算根拠を残す
利息の金額だけでなく、『どの期間の、どの金利で、日ごとの残高の合計がいくらだったか』を実行記録に残します。金額が正しいことを、あとから誰でも再計算で確かめられるようにするためです。
どこを確認すればよいか
- 管理画面「預金価格」:利息・手数料の実行と実行記録、照合の結果
- 管理画面「銀行会計・締め」:5100 と 4200 の増減
CHECK YOUR UNDERSTANDING
3問で理解チェック
答えを頭の中で考えてから、各項目を開いて確認してください。
Q1同じ口座と期間で利息を二度実行するとどうなりますか?
二度目は元の結果を返し、二重には支払いません。
Q2手数料に足りない残高の口座では?
請求せず SKIPPED_INSUFFICIENT を記録します。月末残高では足りても、いまの残高が足りない場合も同じです。免除残高が0の商品は「免除なし」で、必ず請求の対象です。
Q3利息の event を汎用の取消で取り消せますか?
できません。PF002 で拒否されます。
完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。
SOURCE TRAIL
根拠と関連教材
CURRENT IMPLEMENTATIONは確認したrepository内の実装です。HISTORICAL IMPLEMENTATIONは導入・修正の履歴で、後続migrationによる再定義があり得ます。RELATED LESSONは教材への案内で、実装の一次Sourceではありません。ASSUMPTIONは仮定、UNKNOWNは未確認を表します。
確認基点: d02eae8914f39cbf06bfe422dc39c71886f82b3e / 2026-09-11。稼働環境への適用確認: UNKNOWN。パス実在の自動検査と、記述した技術的事実の確認は別です。
Implementation Status: IMPLEMENTED IN MINIBANK(この教材が扱うコードの範囲)
- RELATED LESSON/docs/be-deposit-pricing-versions価格の版と契約時の固定
- RELATED LESSON/docs/be-financial-statements受取利息・支払利息・手数料の科目
- CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlpricing.run_ordinary_interest / pricing.run_account_fee / pricing.simple_interest普通預金の利息(日次残高×その日の金利)と月次手数料 - CURRENT IMPLEMENTATION
supabase/migrations/20260930130000_v17_reliability.sqlpricing.reconcile実行記録を仕訳と、契約の利息を契約条件からの再計算と元帳の仕訳の両方と照合 - CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlplatform.guard_domain_reversal業務が所有するeventの汎用取消を拒否(登録制) - CURRENT IMPLEMENTATION
scripts/banking/v15-pricing.test.mjs版の承認、遡及の拒否、契約時の固定、見積りの失効、日次残高の利息、手数料、中途解約、照合のDBテスト