3 blocker phases

This commit is contained in:
hamid
2026-08-02 23:12:44 +03:30
parent 90e0cdcc34
commit 66a60ce874
38 changed files with 536 additions and 234 deletions
+7 -14
View File
@@ -25,16 +25,15 @@ Effort is a rough size, not a schedule: **S** = small/contained, **M** = a real
make the first screen show an error immediately instead of the outdated-mock failure it shows now. Those
three endpoints need to be built before this can be turned on for real. *(Effort: SM, one part fixed, one
part bigger than first scoped)*
- **Refunds are demo-only today.** The refund screens read fake, disconnected sample data; turning that off
today would show a refund of the wrong amount (off by a factor of 100) for any real cancellation.
*(Effort: M)*
- ~~**Refunds are demo-only today.**~~ **Fixed (phase 08)** for the customer-facing flow: the cancellation
preview, the cancel confirmation, and the refund-status screen now read the real backend, and the ×100
percent-display bug is gone. The **admin refund console** (preview / retry / reject) is still mocked —
those three endpoints don't exist on the real server yet (see `mvp/fix-plan.md` follow-ups).
### Trust — nurse verification
- **A nurse's verification badge does not reflect reality.** The verified/unverified status shown to
customers and to the nurse herself comes from a fake demo layer, not the real, already-working
verification data underneath. A genuinely verified nurse can show as unverified everywhere in the app, and
vice versa — silently hiding the real "you're not searchable yet" warning a nurse needs to see.
*(Effort: L)*
- ~~**A nurse's verification badge does not reflect reality.**~~ **Fixed (phase 09).** The badge everywhere
(search, nurse's own profile, admin case review) now reads the real verification data; the admin
whole-verification approve/reject actions got real endpoints (they previously 404'd).
### Patient records & visit notes
- **Everything a nurse writes about a visit, and everything a family sees about a patient's care plan, is
@@ -56,12 +55,6 @@ Effort is a rough size, not a schedule: **S** = small/contained, **M** = a real
more than it sounds — see [forgotten-features.md](forgotten-features.md) for why the business plan leans on
this feature specifically. *(Effort: L)*
### Search
- **Search results aren't de-duplicated nurses — they're raw pricing-option rows.** One nurse with 3 services
in 3 areas shows up as "9 nurses." The trust information on a result card is also fake, and a nurse who
isn't verified yet can still be opened directly and shown as "verified" if you know her profile link.
*(Effort: M)*
### Booking lifecycle
- **A booking whose remaining visits get automatically marked "missed" can get stuck forever** and never
reach a state where the nurse can actually be paid for the visits she did complete. The "today's visits"
+16 -3
View File
@@ -23,9 +23,9 @@ whatever order you prefer.
| 05 | [bnpl-setup](blocker-phases/05-bnpl-setup.md) | Installments (BNPL) don't work at all | — | — |
| 06 | [catalog-admin-page](blocker-phases/06-catalog-admin-page.md) | No admin page for service categories/pricing | — | — |
| 07 | [card-payment-redirect](blocker-phases/07-card-payment-redirect.md) | Card payment can never complete | — | ✅ Done (follow-up filed below) |
| 08 | [refunds-demock](blocker-phases/08-refunds-demock.md) | Refunds are demo-only, off by 100× | — | |
| 09 | [nurse-verification-badge](blocker-phases/09-nurse-verification-badge.md) | Verification badge doesn't reflect reality | pairs with 10 | |
| 10 | [search-dedup-and-trust](blocker-phases/10-search-dedup-and-trust.md) | Search isn't de-duplicated; trust info hardcoded | pairs with 09 | |
| 08 | [refunds-demock](blocker-phases/08-refunds-demock.md) | Refunds are demo-only, off by 100× | — | ✅ Done (customer surface only, follow-up filed below) |
| 09 | [nurse-verification-badge](blocker-phases/09-nurse-verification-badge.md) | Verification badge doesn't reflect reality | pairs with 10 | ✅ Done |
| 10 | [search-dedup-and-trust](blocker-phases/10-search-dedup-and-trust.md) | Search isn't de-duplicated; trust info hardcoded | pairs with 09 | ✅ Done |
| 11 | [nurse-payouts](blocker-phases/11-nurse-payouts.md) | Nurse pay/payouts are fake, no "process" action | benefits from 01 | — |
| 12 | [patient-records](blocker-phases/12-patient-records.md) | Patient records & visit notes are fake demo data | needs a product decision first | — |
| 13 | [booking-lifecycle](blocker-phases/13-booking-lifecycle.md) | Stuck bookings; "today's visits" unfiltered | pairs with 04 | — |
@@ -34,6 +34,19 @@ whatever order you prefer.
## Follow-ups filed (not yet phases of their own)
- **Phase 08 closed the customer-facing refund surface only — the admin refund console stays mocked.**
`AdminRefundsController` only implements create-and-execute (`POST admin_refunds`, matching
`initiateRefund`); there is no real read-only preview, no retry/approve, and no reject route. The phase
doc's own read ("real server side is live and correct") only checked the customer half
(`RefundsController`, `CreateRefundCommand`, `GetCancellationPolicyPreviewQuery`) — the admin gaps weren't
called out and would have 404'd the console had the single mock flag been flipped wholesale. Split into
two independently-selected flags instead (`client/src/services/refunds/constants.ts`):
`USE_CUSTOMER_REFUNDS_MOCK = false` (real — closes the actual ×100 money-safety bug) and
`USE_ADMIN_REFUNDS_MOCK = true` (stays mocked; the four admin methods are kept together rather than mixed,
since a real `initiateRefund` executing against a mocked preview's numbers would be actively dangerous).
Building the missing preview/retry/reject endpoints needs real design (retry semantics re-executing a
channel call, what "reject" reverses) that isn't specified anywhere — filed as its own future phase, not
guessed here.
- **Same timezone bug as 04, lower severity, not fixed.** Phase 04 fixed `BookingRequest.PaymentDeadlineAt`/
`NurseResponseDeadlineAt` — a `DateTime` (not `DateTimeOffset`) read back from SQL Server's `datetime2`
loses its `Kind` tag (comes back `Unspecified`), so JSON serialization drops the trailing `Z` and a client