月次予算モデル(学習用)
関連: Grafana / Discord / src/finance_manager/taxonomy.py
考え方(固定費/変動枠/別枠貯金)
1. 前月の給与合計 (incomes.category = '給与')
= budget_months.ceiling_yen
2. − 固定貯金 (budget_months.savings_yen)
3. − 固定費マスタ合計 (fixed_cost_items.active の月額)
4. = 変動に使える枠 (variable_pool_yen)
5. 変動カテゴリへ割当 (budget_month_categories)
5a. 月初確定: 未割当余り → 別枠貯金 (surplus_ledger / month_unallocated)
5b. 月末締め: (変動枠 − 5aで計上済み − 変動実支出)の余り → 別枠貯金 (month_end_remainder)
臨時収入・ボーナスは 予算上限に使わない。
固定貯金(savings_yen)と別枠貯金(surplus_ledger)は別プール。
上限は前月の給与
- 今月(例: 2026-08)の上限 ← 前月(2026-07) の
category=給与合計 - 今月受け取った給料は 来月 の上限に効く
draft中は前月給与・固定費マスタから上限/変動枠を取り直すconfirmed/closed後は天井の自動更新はしない- 前月給与が無いときだけ
budget_settings.monthly_income_yen(例: 280000)フォールバック
| 経路 | 役割 |
|---|---|
| Discord | 月初の確定/固定費・枠変更、月末締め、支出直後の残り返信 |
| Grafana | 給与→固定→変動の内訳、変動消化、別枠貯金 |
テーブル
| テーブル | 内容 |
|---|---|
budget_months |
月ヘッダ(ceiling / savings / fixed_costs / variable_pool / status) |
budget_month_categories |
変動カテゴリのみの枠 |
fixed_cost_items |
固定費マスタ(name, monthly_yen, expense_category, active) |
surplus_ledger |
別枠貯金の入出金(month_unallocated / month_end_remainder / manual) |
budget_settings / category_budgets |
初回フォールバック・旧 seed 用 |
定義:
sql/007_budget_months.sqlsql/010_fixed_and_surplus.sql
Bot 起動時に自動適用。当月行が無ければ前月給与・固定費・前月枠(または旧 seed)から draft を作る。
固定費実績の簡易判定: fixed_cost_items.expense_category が設定されていれば、同名の expenses.category は変動枠消化に入れない。未設定ならマスタは「引く額」だけ・実績は手動確認。
Discord での運用
- 月初(status=draft): 前月給与・固定貯金・固定費・変動枠・割当・未割当を表示
- 「このままで」→
confirm_budget(未割当 → 別枠貯金) - 「貯金6万・食費7万にして」→
set_budget - 「家賃を8万に」→
set_fixed_cost(マスタ更新。draft なら変動枠を再計算) - 支出を記録するたびに【変動の残り】が付く
- 「月末締め」→
close_month(変動実残 → 別枠、status=closed) - 「別枠貯金いくら」→
show_surplus
既存データからの移行
現行の category_budgets / budget_month_categories は変動枠として残す。
通信・光熱などを固定に移す例:
sql/budget_seed.example.sqlを参考にfixed_cost_itemsへ INSERT- 同名カテゴリを
category_budgets/ 当月のbudget_month_categoriesから外す - Bot 再起動 or Discord で予算案を確認してから「このままで」
欲しいもの/大型出費(プラスアルファ)
固定貯金・別枠貯金とはさらに別:
wishlist_items… 欲しいものplanned_expenses… 期限付き大型出費
Discord 例: 「欲しいもの Switch 3万」「旅行で8万、期限9/30」
PayPay 通知(後段)
INGEST_BEARER_TOKEN をセットすると同一プロセスで POST /ingest/notifications が立つ。
支出化したあと、手動 Discord と同じ残り返信をチャンネルへ送る。詳細は Tasker / Cloudflare。