学習・技術検証用デモ — 本システムは実際の銀行サービスではありません。

公開情報をもとに構築した教育目的のシステムです。実在する個人情報・口座情報・機密情報・認証情報等を入力しないでください。

ミニ銀行ACADEMY SYSTEM LEARNING
教材メニュー
学習進捗0 / 134
あと134項目
INTERMEDIATE · 中級COURSE 09 · BANKING ENGINEERING

銀行エンジニアリング 25:利息と返済 — 日割・切捨て・元金均等

利息は実際の経過日数で日割りし、1円未満を切り捨てます。年6.00%・120,000円・31日で611円。その611円が、仕訳・返済額・GLにどうつながるかを追います。

31 / 55
BANKING ENGINEERING · 銀行エンジニアリング

v8以降に実装した台帳・記帳エンジンなどを実際に動かし、正常時と異常時の両方から銀行システムの構造を学ぶ。

Prerequisite: BANKING SYSTEM

LEARNING GOALS

このページで学ぶこと

  • 日割利息と切捨ての計算
  • 返済の充当順と仕訳
  • 計上を何回に分けても総額が同じになる理由

PLAIN LANGUAGE

まず、ここだけつかむ

1

利息は、元本×年利×実際の日数÷365で日割りし、1円未満を切り捨てます。

2

利息の発生と返済は別の仕訳で、返済は未収利息、次に元金へ充当します。

3

応答が消えても、元の冪等キーで状態を照会でき、二重に引き落とされません。

DIFFICULT PARTS, STEP BY STEP

難しいポイントを、順番にほどく

専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。

01

日割り利息

やさしく言うと

経過日数に応じて利息を計算することです。

なぜ必要?

返済が遅れた日数分だけ利息が増え、早い返済では減るからです。

Minibankでは

lending.interest_to_date。120,000円・31日で611円。

02

未収利息

やさしく言うと

発生したが、まだ受け取っていない利息です。

なぜ必要?

受け取る前から収益を正しい期間に計上するためです。

Minibankでは

LOAN_ACCRUED_INTEREST(GL 1400)。

03

冪等キー

やさしく言うと

同じ操作の再送を見分ける番号です。

なぜ必要?

応答が消えても二重に実行しないためです。

Minibankでは

lending.command_status で元のキーの結果を照会。

Level 1 基礎:利息は「元本 × 年利 × 日数 ÷ 365」

元金は毎月の均等払い(最初の11回は元本÷12の切捨て、最後の回で残りを返す)。たとえば120,000円なら毎回10,000円です。最初の返済額は、元金10,000円に利息611円を足した10,611円になります。

項目値
元本120,000円
年利(固定)6.00%(600 bps)
日数31日(実行日の翌日〜約定日)
計算120,000 × 600 × 31 ÷ (10,000 × 365) = 611.5…
利息611円(1円未満を切り捨て)

Level 2 銀行業務:利息の発生と返済は別の仕訳

利息はまず「まだ受け取っていないが、受け取る権利がある」(未収利息)として収益を認識します。返済のときに、その未収利息と元金へ充当します。返済の充当順は、確定済みの未収利息、次に元本です。

出来事借方貸方
利息の発生(LOAN_INTEREST_ACCRUAL)未収利息 611円(1400)貸出金利息 611円(4110・収益)
返済(LOAN_REPAYMENT)顧客預金 10,611円貸付金 10,000円(1300)+未収利息 611円(1400)

Level 3 システム:MiniBankでの実装

  • 利息は、元本が変わらない期間ごとの累積値を切り捨て、その差分を計上する。日次で計上しても一括でも総額が同じになる(端数が積み上がらない)
  • 基準日は営業日(ops.business_day_state)。約定日は実行日から「n か月後」を直接計算し、月末は暦月末に丸める(1月31日 → 2月28日 → 3月31日)
  • 休日カレンダーはない。利息は、返済のとき(lending.repay が営業日まで計上する)と、管理者が lending.accrue_all を実行したときに、営業日までまとめて計上される。日次の自動実行(EOD 連携)はまだない
  • 返済額はDBが営業日で計算する。画面は見た金額を添えて送り、金額が変わっていれば LN017 で拒否される
  • 返済は、前の回が未払いなら LN016、約定日前でも LN016。残高が不足するときは全額失敗(PE010)で、部分的な引落しはしない
  • 契約の残高と、仕訳から再計算した残高が一致することは、管理者の照合操作と運用センター、GL の日次締めが lending.reconcile() で確かめる(返済のたびに自動で走るわけではない)

異常時:応答が途中で切れた

段階内容
症状返済ボタンを押したあと、通信が切れて結果が分からない
やってはいけないこと新しく返済を始める(別のキーの操作は、別の返済として二重に引き落とし得る)
確認元の冪等キーで状態を照会する(command_status)。COMPLETED なら確定済み、NOT_FOUND なら未確定
対応NOT_FOUND なら同じキーで再送してよい。同じ内容は元の結果を返し、二重にならない

Level 4 アーキテクチャ:契約の残高は写し、正本は仕訳

契約の元本残高と未収利息は表示用の写しです。正本は追記専用の仕訳で、契約ごとに仕訳から再計算できます。差異があれば GL 1300・1400 と補助元帳の照合と、契約ごとの再計算の両方で検出され、GLの締めが止まります。

どこを確認すればよいか

  • 顧客画面「ローン」:次回の返済額の内訳(元金・利息・合計)と返済予定表
  • 管理画面「融資・与信」→ 契約詳細:利息計上の対象期間・基準元本・仕訳
  • 管理画面「融資・与信」→ GL と補助元帳の照合

CHECK YOUR UNDERSTANDING

3問で理解チェック

答えを頭の中で考えてから、各項目を開いて確認してください。

Q1年6.00%・120,000円・31日の利息は?
答え

611円です(120,000×600×31÷3,650,000の小数を切り捨て)。

Q2その回の返済額は?
答え

元金10,000円+利息611円の10,611円です。

Q3残高が足りないとき、一部だけ引き落としますか?
答え

しません。全額失敗(PE010)で、何も変わりません。

ここまで読めましたか?

完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。

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-lending-basics申込から実行まで
  • RELATED LESSON/docs/be-business-day-eod営業日と日次処理(v7)
  • CURRENT IMPLEMENTATIONsupabase/migrations/20260930100000_v14_lending.sqllending.accrue_locked / lending.accrue_all / lending.interest_to_date日割利息の計上(元本一定の期間ごとの累積値を切り捨て)
  • CURRENT IMPLEMENTATIONsupabase/migrations/20260930100000_v14_lending.sqllending.repay / lending.amount_due / lending.command_status返済の充当と、応答が消えたときの状態照会
  • CURRENT IMPLEMENTATIONsupabase/migrations/20260930100000_v14_lending.sqllending.reconcileGLの貸付金・未収利息と契約、契約ごとの仕訳再計算の照合
  • CURRENT IMPLEMENTATIONscripts/banking/v14-lending.test.mjs審査・決裁・実行・利息・返済・延滞・分類・訂正・競合・権限のDBテスト