# 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.
