from jarca_ledger_mcp import service def test_loan_balance_requires_representative_liability_definition(tmp_path): path = str(tmp_path / "ledger.sqlite3") bank = service.create_ledger_account("은행", type="bank", db_path=path)["account"]["id"] loan = service.create_ledger_account("대출", type="loan", db_path=path)["account"]["id"] missing_definition = service.register_account_valuation( loan, "2026-06-30", 100, valuation_kind="balance", verification_status="verified", db_path=path, ) assert missing_definition["success"] is False assert missing_definition["error_code"] == "validation_error" assert service.list_account_valuations(loan, db_path=path)["count"] == 0 ordinary_balance = service.register_account_valuation( bank, "2026-06-30", 100, valuation_kind="balance", verification_status="verified", db_path=path, ) defined_loan_balance = service.register_account_valuation( loan, "2026-06-30", 100, valuation_kind="balance", representative_liability_definition="principal_only", verification_status="verified", db_path=path, ) assert ordinary_balance["success"] is True assert defined_loan_balance["success"] is True def test_correction_replays_by_evidence_and_conflicts_on_changed_payload(tmp_path): path = str(tmp_path / "ledger.sqlite3") account = service.create_ledger_account("계좌", db_path=path)["account"]["id"] parent = service.register_account_valuation( account, "2026-06-30", 100, source_ref="statement-1", verification_status="verified", db_path=path, )["valuation"] first = service.correct_account_valuation( parent["id"], 110, "statement correction", db_path=path, ) replay = service.correct_account_valuation( parent["id"], 110, "statement correction", db_path=path, ) changed_amount = service.correct_account_valuation( parent["id"], 111, "statement correction", db_path=path, ) changed_reason = service.correct_account_valuation( parent["id"], 110, "different correction", db_path=path, ) changed_source = service.correct_account_valuation( parent["id"], 110, "statement correction", source_ref="statement-2", db_path=path, ) assert first["success"] is True assert replay["success"] is True assert replay["reused"] is True assert replay["valuation"]["id"] == first["valuation"]["id"] for changed in (changed_amount, changed_reason, changed_source): assert changed["success"] is False assert changed["error_code"] == "correction_conflict" assert service.list_account_valuations(account, db_path=path)["count"] == 2