feat: add monthly settlement read model

Implements REQ-022 monthly settlement read-model foundation.
This commit is contained in:
2026-07-12 00:43:50 +09:00
committed by GitHub
parent ef07fba765
commit c0580f7173
4 changed files with 149 additions and 0 deletions
+32
View File
@@ -147,6 +147,38 @@ def test_budget_vs_actual_and_investable_cashflow(tmp_path):
assert investable["investable_cashflow"] == 1_250_000
def test_monthly_settlement_summary_read_model_foundation(tmp_path):
db_path = str(tmp_path / "ledger.sqlite3")
service.create_ledger_budget("2026-06", "식비", 500_000, db_path=db_path)
service.create_ledger_transaction("2026-06-01", "income", 4_000_000, category="수입", db_path=db_path)
service.create_ledger_transaction("2026-06-02", "expense", 550_000, category="식비", db_path=db_path)
service.create_ledger_transaction("2026-06-03", "expense", 150_000, category="", db_path=db_path)
summary = service.get_monthly_settlement_summary("2026-06", db_path=db_path)
assert summary["success"] is True
assert summary["selected_month"] == "2026-06"
assert summary["basis_date"] == "2026-06-30"
assert summary["actual_income"] == 4_000_000
assert summary["actual_expense"] == 550_000
assert summary["net_cashflow"] == 3_450_000
assert summary["savings_rate"] == 0.8625
assert summary["budget_overrun_count"] == 1
assert summary["unresolved_blocker_count"] >= 1
assert summary["unresolved_blockers"]["counts"]["uncategorized_recommendation_backlog"] == 1
assert summary["source_coverage"]["assets"]["basis_date"] == "2026-06-30"
assert summary["read_only"] is True
def test_monthly_settlement_summary_rejects_invalid_month(tmp_path):
db_path = str(tmp_path / "ledger.sqlite3")
summary = service.get_monthly_settlement_summary("2026-99", db_path=db_path)
assert summary["success"] is False
assert summary["error_code"] == "validation_error"
def test_duplicate_detection_and_soft_delete(tmp_path):
db_path = str(tmp_path / "ledger.sqlite3")
first = service.create_ledger_transaction("2026-06-10", "expense", 10_000, merchant="카페", account_id="card1", db_path=db_path)