銀行エンジニアリング 27:預金の価格は「版」で管理する(金利・見積り・契約時の固定)
金利を変えても、すでに結んだ契約は変えません。価格を版として提案・承認し、契約の瞬間に条件を契約へ固定します。MiniBank v15の定期預金で、その仕組みを確かめます。
v8以降に実装した台帳・記帳エンジンなどを実際に動かし、正常時と異常時の両方から銀行システムの構造を学ぶ。
Prerequisite: BANKING SYSTEMLEARNING GOALS
このページで学ぶこと
- 価格を版で管理する理由
- 見積りと契約時の固定(snapshot)
- 旧契約(legacy)を推測で書き換えない理由
PLAIN LANGUAGE
まず、ここだけつかむ
価格(金利・手数料・中途解約)は版として提案・承認し、未来の契約にだけ適用します。
契約を結ぶ瞬間に、その時点の条件を契約へ固定します。あとから価格が変わっても契約は変わりません。
見積りと契約の間で条件が変わったときは、契約を止めて見積りをやり直します。
DIFFICULT PARTS, STEP BY STEP
難しいポイントを、順番にほどく
専門用語を覚えることより、「なぜ必要か」「このシステムのどこで使うか」を理解することが目標です。
価格の版
ある期間に有効な金利や手数料の一式です。
いつ、誰の承認で価格が決まったかを残すためです。
pricing.product_versions。発行後は書き換え不可(PR012)。
契約時の固定(snapshot)
契約を結んだ時点の条件を契約に写すことです。
価格表が変わっても、利息を契約だけで再計算できるようにするためです。
time_deposits の interest_rate_bps・early_rate_bps・pricing_version_id。
legacy(従来の契約)
新しい仕組みの前に結ばれた契約です。
過去の契約を推測で書き換えないためです。
pricing_version_id が空の契約。従来の式のまま。
Level 1 基礎:昨日結んだ契約の金利が、今日変わってはいけない
預金の金利や手数料は、経営の判断で変わります。しかし、すでに結んだ契約の条件まで一緒に変わると、顧客は約束と違う利息を受け取り、銀行は過去の会計を説明できなくなります。
そこで価格を『版』として持ち、新しい版は未来の契約にだけ適用し、契約には結んだ時点の条件を写して残します。
- 01価格の版を提案(maker)
- 02別の管理責任者が承認(checker)
- 03有効開始日(未来の営業日)に有効になる
- 04見積り → 契約で条件を契約へ固定
Level 2 銀行業務:MiniBankの価格と版の項目
利息の計算は『元本 × 年利bps × 日数 ÷ (10,000 × 365)』を1円未満切り捨てです。日数は、開始日から満期日までのJST暦日の差で数えます。
| 項目 | 内容 | 例 |
|---|---|---|
| 商品・期間 | 普通預金、または定期預金の3/6/12/24/36か月 | 定期預金 12か月 |
| 年利(bps) | 1bp=0.01%。契約時に固定される | 80(0.80%)→ 120(1.20%) |
| 中途解約の年利 | 満期前に解約したときの利息の利率 | 0(元本のみ)→ 50(0.50%) |
| 最低預入額 | これ未満は見積りも契約もできない | 10,000円 |
| 口座維持手数料と免除残高 | 普通預金の月次手数料。残高が免除残高以上なら請求しない | 550円/100,000円 |
| 有効開始日 | 承認日の翌営業日以降。過去や当日の遡及はできない | 2027-02-01 |
Level 3 システム:MiniBankでの実装
- pricing.propose_version が版を提案し、pricing.decide_version が別の管理責任者の承認を記録する。提案者本人は PR005、承認済みの版の書き換えは PR012
- 有効開始日が営業日以前なら PR004。承認するときにも再確認するので、提案したあとに日付が過ぎた版は承認できない
- 見積り(pricing.quote_time_deposit)は保存され、発行と同じJST日のうちで、かつ発行の翌営業日まで有効。契約の直前に、期限・版が今も有効かを確かめる(切り替わっていれば PR003)
- 契約(public.create_time_deposit)は、営業日に有効な版の年利・中途解約の利率・版IDを time_deposits へ写す。あとから書き換えようとすると PR013
- v15より前の契約は版を持たない(legacy)。金利は従来の値のまま、満期の計算式も従来のまま。推測で版に結びつけない
異常時:見積りのあとで金利が変わった
| 段階 | 内容 |
|---|---|
| 症状 | 見積りは1.20%だったのに、契約しようとすると PR003 で拒否される |
| 原因 | 見積りの翌日に別の版が有効になった(または見積りの期限が過ぎた) |
| 確認 | 契約は1件も作られていない。見積りは使用済みにならず、そのまま残る |
| 対応 | 見積りをやり直し、新しい条件を確認してから契約する |
Level 4 アーキテクチャ:条件を契約に持たせる
契約が自分の条件を持っていれば、価格表が何度変わっても、満期の利息は契約の値だけで再計算できます。MiniBankは満期や中途解約の利息を契約の写しから計算し、実行記録と仕訳を突き合わせて照合します(pricing.reconcile)。
どこを確認すればよいか
- 管理画面「預金価格」:版の一覧、提案と承認、有効開始日
- 顧客画面「定期預金」:見積り(年利・満期利息・中途解約の目安)と契約
CHECK YOUR UNDERSTANDING
3問で理解チェック
答えを頭の中で考えてから、各項目を開いて確認してください。
Q1新しい金利は、いつから、どの契約に適用されますか?
有効開始日以降に結ぶ新しい契約だけです。既存の契約は変わりません。
Q2提案した人が自分で承認できますか?
できません。別の管理責任者が承認します(PR005)。
Q3見積りのあとで版が切り替わったら契約できますか?
できません。PR003 で拒否され、見積りをやり直します。
完全に暗記する必要はありません。大切な考え方を説明できそうなら押してください。
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提案者と決裁者の分離(v14)
- CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlpricing.propose_version / pricing.decide_version / pricing.version_on価格の版の提案・別人の承認と、営業日に有効な版の選択 - CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlpricing.quote_time_deposit / pricing.open_from_quote見積りの保存と、見積りからの契約(失効・版の切替を検出) - CURRENT IMPLEMENTATION
supabase/migrations/20260930110000_v15_pricing.sqlpublic.create_time_deposit / public.cancel_time_deposit契約時に価格の版と金利を固定し、中途解約は契約時の利率で計算 - CURRENT IMPLEMENTATION
scripts/banking/v15-pricing.test.mjs版の承認、遡及の拒否、契約時の固定、見積りの失効、日次残高の利息、手数料、中途解約、照合のDBテスト