TC-PAY-008: Proof Storage, Walk-in Records & Payment Refs

🆕 New on stage — 2026-06-25 → 2026-06-29. This TC covers the payment-adjacent features shipped after the prior guide freeze: proof-of-payment stored as a bare S3 key and served through a proxy route (#451), rejected manual payments reverting the invoice to full balance while staying listed (#469), payment rows showing both payment ref and gateway ref (#490), paid walk-in registration creating real Invoice + Payment records with the gateway inert (#424/#425), and the memberOnly ticket flag rejecting non-member paid registration (#448). See the Payment Test Cases banners and the Jun 25 / Jun 29 release notes.

Module: Payments — Proof Storage / Walk-in / References

Primary Test User: testmember@rcme.membervu.com / Member123! (submits proof); treasurer@demo.membervu.com / Treasurer123! (approves/rejects); events@demo.membervu.com / Events123! (walk-in check-in)

Priority: P1 (money-record integrity + a security-adjacent storage change)

Objectives

  1. Submit a bank-transfer proof of payment and confirm it is stored as a bare key (not a URL) and still renders after a refresh, via the proof-serving route.
  2. Reject that manual payment and confirm the invoice stays listed with its balance reverted to the full pre-payment amount.
  3. Confirm a settled payment's row shows BOTH the internal payment reference and the gateway reference where applicable.
  4. Run a paid walk-in check-in and confirm it creates real Invoice + Payment records with no live gateway charge.
  5. Confirm a memberOnly ticket rejects a non-member (or non-ACTIVE-member) attempting a self-service paid registration.

Scenario summary

IDScenarioKey data assertion
PAY8-01Proof stored as bare key, renders via proxy routeSubmitted proofUrl does NOT start with http:///https://; GET /api/billing/admin/payments/:paymentId/proof returns 200 with the image content-type after a hard refresh.
PAY8-02Reject manual payment reverts balancePOST /api/billing/admin/payments/:paymentId/reject200; invoice still appears in the Outstanding list; balance = full pre-payment amount, not ₱0 or a stale partial.
PAY8-03Payment row shows both referencesSettled payment row/detail displays payment.reference ("Ref: …") AND payment.externalReference ("Gateway: …") when both are set — not just one.
PAY8-04Paid walk-in creates records, gateway inertWalk-in check-in for a paid event with offline payment confirmed → a real Invoice (source EVENT) + a Payment (channel: MANUAL_OTHER, status: SUCCEEDED) exist. No Paynamics call is made.
PAY8-05memberOnly ticket rejects non-memberA guest/non-ACTIVE-member attempting self-registration on a memberOnly ticket gets a clear rejection, not a silent success or a generic 500.

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