Skip to content
GitLab
Projects Groups Topics Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Register
  • Sign in
  • A Ahad Mobile
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributor statistics
    • Graph
    • Compare revisions
  • Issues 0
    • Issues 0
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Terraform modules
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • holatech
  • Ahad Mobile
  • Merge requests
  • !111

feat(admin): fiat payouts list with withdrawer phone and a dedicated detail page

  • Review changes

  • Download
  • Patches
  • Plain diff
Merged Khanh Pham requested to merge feat/admin-fiat-payout-detail into develop Oct 09, 2026
  • Overview 0
  • Commits 8
  • Pipelines 1
  • Changes 23

What

Rebuilds the admin Bank withdrawals screen.

  • List: the withdrawer column shows the phone number (name or email underneath) instead of the user id; bank name + •••• last4 (with a "removed" tag); gross amount with fee · net; status with the failure reason; created time with relative age. Status filter is a pill group (Needs review first, still the default). The whole row links to the detail page.
  • Detail page /fiat-payouts/:payoutId: amount header with phone → bank •••• last4 and status, an alert strip when the payout needs attention, gross/fee/net, withdrawer (link to the user), destination bank, Airwallex provider data (copyable ids), a timeline with the next pending step, and the resolution panel. LINK / RELEASE / RETURN are choice cards; RELEASE and RETURN need an inline confirm. A recorded resolution shows the admin's name instead of an id.
  • Backend: FiatPayoutAdminService list / getOne / resolve return an enriched view with user (id, phone, email, name), bank (beneficiary incl. soft-deleted, no Airwallex beneficiary id) and resolvedBy (id, email, name). Batch-loaded (one query per relation per page), no migration, permissions unchanged.

Verification

  • admin: pnpm test 270 pass, pnpm lint:check 0 errors, pnpm type-check clean.
  • be: yarn test src/modules/fiat-payout pass; fiat-payout-admin.postgres.spec.ts 17/17 against a throwaway DB (new case: getOne returns phone + bank last4).
  • resolvedBy was checked by hand end to end (worktree BE on a cloned local DB: the API returned the resolving admin and the detail page rendered "Resolved by …"); no automated spec covers that query against Postgres.
  • Pages checked visually in a browser with 8 payouts across every status, light and dark.
  • Opus review gate: PASS after 2 rounds.

🤖 Generated with Claude Code

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: feat/admin-fiat-payout-detail