Payment Test Cases

♻️ Reconciled against current code — 2026-07-01. This section was flagged KNOWN STALE on 2026-06-10 with a "do not execute" warning; that blanket warning is now lifted. Confirmed still-valid drift from the original audit: TraxionPay is fully removed (Paynamics is the sole gateway); channel codes are not BDO/BPI/CASH (admin-recorded channels are MANUAL_CASH / MANUAL_BANK / MANUAL_OTHER / SIMULATED; member-selectable gateway channels are GCASH / MAYA / CREDITCARD / OTC_*); approve/reject on a manual payment sets SUCCEEDED/FAILED (not "APPROVED"/"REJECTED"); Credits admin UI is still thin (TC-PAY-007 largely aspirational — spot-check before trusting it). Newly testable since the 2026-06-15 accounting milestone (!136): manual/record payments, proof of payment, treasury reconciliation, and bulk (multi-invoice) payments are all live on stage. "Simulate Payment" as a user-facing button is REMOVED (2026-06-26, MR saas!242) — use Record Payment for manual/offline payments instead; the SIMULATED payment-method enum and the simulated gateway are kept only as a non-prod test harness, not a UI affordance. TC-PAY-001 through 004 still reference the old flow in places — trust this page and the code over stale wording in those child pages until they get their own rewrite pass. See the green banner below for what's new since Jun 19.
🆕 New on stage — 2026-07-09 (#528). Treasury verify/dispute maker-checker separation of duties: verifying/disputing a treasury reconciliation entry now requires FINANCE:VERIFY:treasury — a permission key distinct from FINANCE:EDIT:payments (billing payment approve/reject). A new PermissionAction.VERIFY backs it, and the admin Roles/Permissions matrix has a new VERIFY column so a tenant can split maker and checker onto separate custom roles. Default ADMIN and FINANCE_MANAGER hold both grants out of the box — no behavior change until an admin deliberately splits a custom role. See TC-PAY-009 — Treasury Verify/Dispute — Maker-Checker SoD for full coverage.
🆕 New on stage — 2026-07-08 (payments sweep, !283 & !285). See the Jul 8 release note for full test steps.
🆕 New on stage — 2026-06-19 → 2026-07-01. See TC-PAY-008 — Proof Storage, Walk-in Records & Payment Refs for full coverage of the above.
Payment gateway is INERT on stage (Paynamics). Every "paid" path in this section — including the walk-in path above — creates Invoice/Payment records only; there is never a live charge. Say so explicitly whenever you file a bug against a paid flow.

💳 Paynamics Sandbox — Test Accounts

When these apply. Use the accounts below only when the Paynamics gateway is configured in sandbox mode (PAYNAMICS_ENVIRONMENT=sandbox). As noted in the red box above, live/online payment is currently PARKED / INERT on stage (no prod credentials) — so on today's staging build the gateway steps are N/A and you exercise paid flows only up to REGISTERED_UNPAID / ISSUED via Record Payment. Keep this table for when sandbox is switched on.

Credit / Debit Cards (Processor MIGS)

Card TypeNumberCVVExpiry3DSExpected Result
VISA (Non-3DS)443426000000000812301/2039NoApproved
JCB (Non-3DS)352824999999175512301/2039NoApproved
MasterCard (3DS)512345000000000812301/2039Yes3DS OTP page shown (enter an OTP below)
AMEX345678901234564123401/2039NoApproved

3DS OTP Codes (Metrobank processor)

On the 3D-Secure OTP page for the MasterCard above, enter one of these to drive the outcome — assert the invoice/payment lands in the matching state:

OTPDrivesAssert
123456SuccessPayment SUCCEEDED, invoice → PAID
111111FailedPayment FAILED, invoice stays ISSUED
333333Card Issuer DeclinedRed "card was declined" banner; invoice unchanged (ISSUED)
444444Incorrect OTPOTP rejected on the bank page; no settlement

E-Wallets

WalletTest AccountNotes
MayaUsername 09193890579 · Password Password@1 · OTP 123456Choose "Express Pay out" on the Maya page.
GCashNo sandbox test account — uses a real GCash wallet⚠️ Real money. There is no fake GCash sandbox login; if you must exercise GCash, use a real wallet with a PHP 1.00 invoice, or skip and use a card/Maya instead.
Notes. Sandbox initiate returns a redirectUrl on *.payserv.net (e.g. https://testpti.payserv.net/…). Settlement is confirmed by a webhook, so the invoice flips to PAID a moment after you return (watch the processing → success banner). Full click-by-click gateway flows (GCash/card/Maya happy paths, decline, cancel, replaced-payment, timeout, gateway-not-ready) live in the source test file tester-files/01_TEST_CASES/payments/TC_PAY_005_PAYMENT_GATEWAY.md — these accounts are lifted verbatim from there. Assert on the data (payment status, invoice status, no double-charge), not just "it redirected".