⚠️ PENDING UPDATE — Payments section is under active development
These payment test cases are KNOWN STALE (staleness audit 2026-06-10) and are being rewritten against current code. Do not execute as written. Known drift: TraxionPay removed; channel codes changed (no BDO/BPI/CASH); Credits admin UI & most of its API not built; approve/reject set SUCCEEDED/FAILED (not "APPROVED"/"REJECTED"); live Paynamics flows are untestable now (no prod credentials, events currently free).

URLs in this section were NOT migrated to the staging-subdomain form (stg-rcme.membervu.com) in the 2026-06-10 env pass — they will be corrected during the rewrite.

Reference: _bmad-output/test-artifacts/test-reviews/test-guide-html-staleness-audit-2026-06-10.md

Test Cases: Payment Approval Workflow

Module: Payments - Payment Approval

Backend Endpoints:

Frontend Page: mmp/frontend/pwa-app/src/pages/admin/AdminPaymentsPage.tsx

Prerequisites

Test Data

PaymentInvoiceMemberAmountStatus
PAY-2024-0002INV-2024-0002Antonio Dela CruzPHP 15,000PENDING
PAY-2024-0003INV-2024-0003Antonio Dela CruzPHP 2,500REJECTED

Test Cases

TC-PAY-025: View All Pending Payments

StepActionExpected Result
1Login as Ana Reyes (FINANCE_MANAGER).Dashboard displayed.
2Navigate to Admin > Payments.Payment list displayed.
3Filter by status: PENDING.Only pending payments shown.
4Verify PAY-2024-0002 visible.Antonio Dela Cruz's pending payment listed.
5Verify columns.Payment ID, Member, Invoice, Amount, Method, Date, Status, Proof.

TC-PAY-026: View Payment Details

StepActionExpected Result
1Click on PAY-2024-0002 in payment list.Payment detail modal/page opens.
2Verify payment info.Amount: PHP 15,000, Method: GCash, Reference: 9171234567-001.
3Verify linked invoice.Invoice INV-2024-0002 displayed with link.
4Verify member info.Antonio Dela Cruz's details shown.
5Verify payment proof.Proof image displayed (if uploaded).

TC-PAY-027: Approve Payment

StepActionExpected Result
1Open pending payment PAY-2024-0002.Payment details displayed.
2Review payment proof.Proof image visible and verifiable.
3Click "Approve" button.Confirmation dialog may appear.
4Confirm approval.API POST /api/billing/admin/payments/:id/approve called.
5Verify success message."Payment approved" displayed.
6Verify payment status.Status changed to "APPROVED".
7Verify invoice status.Linked invoice status updated to "PAID".
8Verify notification sent.Member receives payment confirmation email.

TC-PAY-028: Approve Payment with Notes

StepActionExpected Result
1Click "Approve" on pending payment.Approval form opens.
2Enter approval notes: "Verified with bank statement".Notes entered.
3Confirm approval.Payment approved with notes recorded.
4Verify audit trail.Notes visible in payment history/audit.

TC-PAY-029: Reject Payment

StepActionExpected Result
1Open pending payment.Payment details displayed.
2Click "Reject" button.Rejection form opens.
3Enter rejection reason: "Reference number not found in bank records".Reason entered (required).
4Confirm rejection.API POST /api/billing/admin/payments/:id/reject called.
5Verify success message."Payment rejected" displayed.
6Verify payment status.Status changed to "REJECTED".
7Verify invoice unchanged.Invoice remains PENDING (not paid).
8Verify member notified.Member receives rejection email with reason.

TC-PAY-030: Reject Payment Without Reason

StepActionExpected Result
1Click "Reject" on pending payment.Rejection form opens.
2Leave reason field empty.-
3Attempt to confirm.Validation error: "Rejection reason is required".

TC-PAY-031: Approve Already Approved Payment

StepActionExpected Result
1Open payment PAY-2024-0001 (APPROVED).Payment displayed.
2Look for "Approve" button.Button not visible or disabled.
3Attempt via API.Status 400 Bad Request - "Payment already approved".

TC-PAY-032: Reject Already Rejected Payment

StepActionExpected Result
1Open payment PAY-2024-0003 (REJECTED).Payment displayed.
2Look for "Reject" button.Button not visible or disabled.

TC-PAY-033: Re-approve Rejected Payment

StepActionExpected Result
1Open rejected payment.-
2Check if "Approve" is available.May be available for re-review.
3If available, approve.Payment status changed to APPROVED.
4Verify audit trail.Both rejection and approval recorded.

TC-PAY-034: Manual Payment Entry by Admin

StepActionExpected Result
1Login as FINANCE_MANAGER.-
2Navigate to Admin > Payments.Payment list displayed.
3Click "Record Manual Payment".Manual payment form opens.
4Select invoice: INV-2024-0002.Invoice selected.
5Select member: Antonio Dela Cruz.Member auto-selected from invoice.
6Enter amount: PHP 15,000.Amount entered.
7Select method: Cash.Cash selected.
8Enter reference: CASH-20240127-001.Reference entered.
9Enter notes: "Cash received at office".Notes entered.
10Submit.API POST /api/billing/admin/payments/manual called.
11Verify payment created.Payment created with status "APPROVED" (admin-entered).
12Verify invoice updated.Invoice marked as PAID.

TC-PAY-035: Filter Payments by Status

StepActionExpected Result
1Navigate to Admin > Payments.Full list displayed.
2Filter: PENDING.Only pending payments shown.
3Filter: APPROVED.Only approved payments shown.
4Filter: REJECTED.Only rejected payments shown.
5Filter: All.All payments shown.

TC-PAY-036: Filter Payments by Date Range

StepActionExpected Result
1Set date range: This week.Payments from this week displayed.
2Set date range: This month.Payments from this month displayed.
3Set custom date range.Payments within range displayed.

TC-PAY-037: Filter Payments by Member

StepActionExpected Result
1Search/filter by member: Antonio Dela Cruz.Only Roberto's payments shown.
2Verify all his payments listed.PAY-2024-0002, PAY-2024-0003 visible.

TC-PAY-038: Bulk Approve Payments

StepActionExpected Result
1Select multiple pending payments (checkboxes).Multiple rows selected.
2Click "Bulk Approve".Confirmation dialog.
3Confirm.All selected payments approved.
4Verify status changes.All selected now "APPROVED".
5Verify invoices updated.All linked invoices updated.

TC-PAY-039: Permission Check - Member Cannot Approve

StepActionExpected Result
1Login as Maria Cruz (MEMBER).Member dashboard.
2Attempt to access Admin > Payments.Access denied.
3Attempt direct API call to approve.Status 403 Forbidden.

TC-PAY-040: View Payment Proof

StepActionExpected Result
1Open payment with proof attached.Payment details displayed.
2Click on proof thumbnail.Full-size image opens in modal/new tab.
3Verify image quality.Clear enough to verify payment details.
4Download proof if option available.File downloads.

API Test Cases

TC-PAY-API-009: GET /api/billing/admin/payments

Request: GET /api/billing/admin/payments?status=PENDING

Expected Response: 200 OK

{

"payments": [

{

"id": "PAY-2024-0002",

"invoiceId": "INV-2024-0002",

"invoiceNumber": "INV-2024-0002",

"member": { "id": "...", "name": "Antonio Dela Cruz" },

"amount": 15000,

"method": "GCASH",

"referenceNumber": "9171234567-001",

"status": "PENDING",

"proofUrl": "https://...",

"createdAt": "timestamp"

}

],

"pagination": { "page": 1, "total": 5 }

}

TC-PAY-API-010: POST /api/billing/admin/payments/:id/approve

Request: POST /api/billing/admin/payments/PAY-2024-0002/approve

{

"notes": "Verified with GCash transaction history"

}

Expected Response: 200 OK

{

"payment": {

"id": "PAY-2024-0002",

"status": "APPROVED",

"approvedAt": "timestamp",

"approvedBy": "treasurer@demo.membervu.com"

},

"invoice": {

"id": "INV-2024-0002",

"status": "PAID"

}

}

TC-PAY-API-011: POST /api/billing/admin/payments/:id/reject

Request: POST /api/billing/admin/payments/PAY-2024-0002/reject

{

"reason": "Reference number not found in bank records"

}

Expected Response: 200 OK

{

"payment": {

"id": "PAY-2024-0002",

"status": "REJECTED",

"rejectedAt": "timestamp",

"rejectedBy": "treasurer@demo.membervu.com",

"rejectionReason": "Reference number not found in bank records"

}

}

TC-PAY-API-012: POST /api/billing/admin/payments/manual

Request:

{

"invoiceId": "INV-2024-0002",

"amount": 15000,

"paymentMethod": "CASH",

"referenceNumber": "CASH-20240127-001",

"paymentDate": "2024-01-27",

"notes": "Cash received at office"

}

Expected Response: 201 Created

{

"payment": {

"id": "PAY-2024-XXXX",

"status": "APPROVED",

"isManualEntry": true

}

}