Files
edr-platform/apps/edr-freight-api/src/modules
Nathnael 97bfe95ec3 feat(payment): integrate CAC Bank OTP payments into freight flows
CAC Bank is an OTP debit with no redirect and no webhook: initiate SMSes a
code to the payer's mobile, and the charge only settles when that code is
confirmed. The payment service already spoke it (passenger uses it); the
freight side had the enum values but none of the flow.

API:
- PaymentClientService.confirmOtp forwards the code to
  POST /payments/intents/:id/confirm, mapping 400/404 to BadRequest so a
  mistyped code stays retryable instead of surfacing as a gateway failure.
- PaymentService.confirmOtp is keyed by the LOCAL intent id (the invoice's
  paymentId) rather than the domain reference, so the right invoice settles
  when several share a booking. On success billing settles the invoice.
- payInvoice rejects CAC_BANK without payerAccount before calling the
  gateway, and no longer runs the demo auto-settle for a COLLECT_OTP intent
  (it is not paid until the payer confirms).
- POST /billing/my-invoices/:id/confirm — ownership-checked, and since
  warehouse fee invoices are central invoices it covers those too.

Portal:
- useInvoicePayment owns the whole flow (initiate, redirect-or-OTP, confirm)
  and replaces the five near-identical pay mutations at the call sites.
- PaymentMethodModal gains the CAC Bank option, the payer mobile field, and
  the OTP step. Click-outside is disabled there so a stray click cannot drop
  the payer out of a live OTP window.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 08:11:23 +00:00
..
2026-07-23 07:40:48 +00:00
2026-07-31 00:41:51 +00:00
2026-07-06 12:05:52 +00:00
2026-07-16 00:33:31 +00:00
2026-06-16 09:06:11 +00:00
fix
2026-07-03 15:21:23 +00:00
2026-07-16 00:33:31 +00:00
gps
2026-07-10 15:23:49 +00:00
2026-07-16 00:33:31 +00:00
2026-07-16 00:33:31 +00:00
2026-07-22 07:34:41 +00:00
2026-07-16 00:33:31 +00:00
2026-07-31 00:41:51 +00:00
2026-07-16 00:33:31 +00:00
2026-07-30 11:30:34 +00:00
2026-07-25 06:05:20 +00:00
2026-07-30 11:30:34 +00:00