From 99e4d4c69abc94342f25c1159c90b558bfb4d176 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Wed, 12 Aug 2026 20:57:54 +0800 Subject: [PATCH] fix(bx): allow reimburse submit when invoice wallet balance is insufficient Drop the hard balance check in debit_reimburse so occupancy can exceed uploaded invoices; balance may go negative until later top-ups. Co-authored-by: Cursor --- backend/app/services/bx/invoice_ledger.py | 7 ------- backend/tests/test_bx_invoice_ledger.py | 12 ++++++++++++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/backend/app/services/bx/invoice_ledger.py b/backend/app/services/bx/invoice_ledger.py index 76376c06e..e3eb0af33 100644 --- a/backend/app/services/bx/invoice_ledger.py +++ b/backend/app/services/bx/invoice_ledger.py @@ -223,13 +223,6 @@ class InvoiceLedgerService: user_id=user.id, dept_id=user.dept_id, ) - totals = InvoiceLedgerService.calc_summary(db, tenant_no, owner_user_id) - balance = totals["balance"] - if balance < amt: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"发票额度不足(余额 {balance},本次 {amt})", - ) entry = InvoiceLedgerService.add_entry( db, tenant_no=tenant_no, diff --git a/backend/tests/test_bx_invoice_ledger.py b/backend/tests/test_bx_invoice_ledger.py index bfc81168a..7bd62b29e 100644 --- a/backend/tests/test_bx_invoice_ledger.py +++ b/backend/tests/test_bx_invoice_ledger.py @@ -39,3 +39,15 @@ def test_release_idempotent_guard(): assert should_skip_release(has_debit=True, has_release=True) is True assert should_skip_release(has_debit=True, has_release=False) is False assert should_skip_release(has_debit=False, has_release=False) is True + + +def test_summarize_allows_negative_balance(): + """提交占用可超过已上传总额,余额可为负(补票后再回升)。""" + rows = [ + {"entry_type": ENTRY_CREDIT_UPLOAD, "amount": Decimal("100")}, + {"entry_type": ENTRY_DEBIT_REIMBURSE, "amount": Decimal("300")}, + ] + s = summarize_entries(rows) + assert s["total_amount"] == Decimal("100") + assert s["used_amount"] == Decimal("300") + assert s["balance"] == Decimal("-200")