1.8 KiB
Phase 05 — BNPL doesn't work at all
Blocker: blockers.md § "Payments" (installments). Depends on: nothing. Two distinct bugs, both small.
Bug A — server-side: no active BNPL gateway is ever seeded
SeedPaymentGatewaysAsync (ServiceCollectionExtensions.cs:135-154) seeds exactly
one PaymentGatewayType.Standard (card) gateway row — never a PaymentGatewayType.Bnpl row.
CheckBnplEligibilityQuery.Handler.cs:45-47 and InitiateBnplOrderCommand.Handler.cs:42-44 both short-circuit
with "No active BNPL gateway is configured" before ever calling IBnplProvider (mock or real — both are
correctly registered, just unreached).
Fix: extend SeedPaymentGatewaysAsync (or add a sibling seeder called next to it in Program.cs:137,156)
to idempotently insert a PaymentGatewayType.Bnpl row (ProviderCode="balinyaar", the in-house net-of-fee
provider per archive/docs/rules/server/money.md §6 — needs no external credentials), same
AnyAsync(...) idempotency guard as the existing seeder.
Bug B — client-side: still fully mocked, and the mock itself is broken
client/src/services/bnpl/constants.ts:18 — USE_BNPL_MOCK = true, never flipped.
Even as a demo the mock is broken: client/.../bnpl/apis/mockApi.ts:5-8 imports directly from the retired
bookingRequests mock store, bypassing that domain's own (real) seam — so any real booking-request id 404s
inside the BNPL mock. That store only ever seeds ids 1/2, which age out to expired_no_response almost
immediately, so the D1–D5 wizard is practically unreachable today regardless.
Fix: once Bug A lands, flip USE_BNPL_MOCK to false — the real CheckoutBnplController endpoints are
otherwise complete. The mock's cross-import isn't worth fixing in isolation; it becomes moot once the flag
flips.