TC-BIL-008: Total Parity & Payment Reconciliation

🆕 New on stage — 2026-06-25 → 2026-06-29. This TC covers the canonical money-parity and payment-reconciliation features shipped after the prior guide freeze: the projectInvoiceTotals canonical projector (#443/#450) feeding detail/listing/exports/finance-summary identically, multi-invoice payment initiation (#149), the payment-confirmation reconcile job (#118), and rejected manual payments reverting the invoice to full balance while staying listed (#469). See the Test Plan banners and the Jun 25 / Jun 29 release notes.

Module: Billing & Invoicing — Totals / Payments

Primary Test User: treasurer@demo.membervu.com / Treasurer123! (Finance Manager); testmember@rcme.membervu.com / Member123! for the member-side multi-invoice pay

Priority: P1 (money parity + payment-confirmation durability are core billing-trust assertions)

Objectives

  1. Pick ONE invoice that has discounts + line items + credits/allocations, and confirm its total is byte-identical across detail view, the invoice listing, a reporting export, and the finance summary.
  2. Select several outstanding invoices and initiate ONE multi-invoice payment; confirm the resulting allocation lands correctly on each invoice.
  3. Complete a dues payment and confirm the confirmation email arrives — allowing the ~10 minute reconcile-job window before treating a missing email as a bug.
  4. Reject a manual payment and confirm the invoice stays visible in the list and its balance is restored to the full pre-payment amount (not a stale partial).

Scenario summary

IDScenarioKey data assertion
BIL8-01Total parity — detail vs. listingInvoice detail's amountCents/balanceCents (as computed) equals the same invoice's row in the admin invoice list, to the cent.
BIL8-02Total parity — reporting exportThe same invoice's total in a CSV/reporting export matches detail/listing exactly — no rounding or stale-cache drift.
BIL8-03Total parity — finance summaryThe finance dashboard's aggregate figures are consistent with (not double-counting or omitting) this invoice's contribution.
BIL8-04Multi-invoice payment initiationPOST /api/billing/member/invoices/bulk-pay/paynamics (GCash/Maya only) accepts multiple invoiceIds in one request; each invoice receives its own Allocation record with the correct amount — no invoice under- or over-allocated.
BIL8-05Payment-confirmation email reconcile windowA dues payment's confirmation email appears in MailHog either immediately or within ~10 minutes via the reconcile job (Payment.confirmationEmailSentAt gets set); do not fail the case before the window elapses.
BIL8-06Rejected manual payment reverts balanceAfter admin rejects a manual payment, the invoice (a) still appears in the invoice list, and (b) its balance/status reverts to the full pre-payment outstanding amount — not left at a phantom partial.
BIL8-07Payment rows show both referencesPayment list/detail rows display the internal payment reference AND the gateway reference (where applicable) — not just one.

➡️ Full click-by-click steps: TC-BIL-008 (Detailed).