Skip to content

月次予算モデル(学習用)

関連: 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.sql
  • sql/010_fixed_and_surplus.sql

Bot 起動時に自動適用。当月行が無ければ前月給与・固定費・前月枠(または旧 seed)から draft を作る。

固定費実績の簡易判定: fixed_cost_items.expense_category が設定されていれば、同名の expenses.category は変動枠消化に入れない。未設定ならマスタは「引く額」だけ・実績は手動確認。

Discord での運用

  1. 月初(status=draft): 前月給与・固定貯金・固定費・変動枠・割当・未割当を表示
  2. 「このままで」→ confirm_budget(未割当 → 別枠貯金)
  3. 「貯金6万・食費7万にして」→ set_budget
  4. 「家賃を8万に」→ set_fixed_cost(マスタ更新。draft なら変動枠を再計算)
  5. 支出を記録するたびに【変動の残り】が付く
  6. 「月末締め」→ close_month(変動実残 → 別枠、status=closed
  7. 「別枠貯金いくら」→ show_surplus

既存データからの移行

現行の category_budgets / budget_month_categories は変動枠として残す。
通信・光熱などを固定に移す例:

  1. sql/budget_seed.example.sql を参考に fixed_cost_items へ INSERT
  2. 同名カテゴリを category_budgets / 当月の budget_month_categories から外す
  3. Bot 再起動 or Discord で予算案を確認してから「このままで」

欲しいもの/大型出費(プラスアルファ)

固定貯金・別枠貯金とはさらに別:

  • wishlist_items … 欲しいもの
  • planned_expenses … 期限付き大型出費

Discord 例: 「欲しいもの Switch 3万」「旅行で8万、期限9/30」

PayPay 通知(後段)

INGEST_BEARER_TOKEN をセットすると同一プロセスで POST /ingest/notifications が立つ。
支出化したあと、手動 Discord と同じ残り返信をチャンネルへ送る。詳細は Tasker / Cloudflare