# Objective
Evolve the model-directory order flow into an escrow + proof-review system:
pending → accepted → paid → proof_uploaded → completed (+ rejected/cancelled/refunded).
Payment happens AFTER model accepts (into admin escrow), model uploads proof photo,
admin reviews proof, then 90/10 split releases from escrow.

# Key decisions
- Escrow is physically held in the platform admin wallet (escrow_in on capture,
  escrow_out on release/settle/refund). Net admin change per completed order = +10%.
- Capture timing: model accept auto-attempts charge if customer has funds (→ paid);
  if short, order rests at "accepted" and customer gets a "Pay now" button.
- Admin-only approves proof (proof_uploaded → completed). Reject proof → back to paid.
- Refund allowed only pre-completion (paid / proof_uploaded), admin-only.
- New "night" duration + profiles.priceNight.
- order_proofs table (supports re-upload; latest row is current).

# Tasks
### T001: DB schema
- bookings.status enum += paid, proof_uploaded, rejected
- bookings.duration enum += night
- profiles += priceNight
- wallet_transactions.type enum += escrow_in, escrow_out
- new order_proofs table (id, bookingId, photoUrl, status[pending/approved/rejected], note, reviewedAt, createdAt) + export
- push schema

### T002: wallet lib
- add escrow_in/escrow_out to WalletTxType

### T003: backend routes
- POST /bookings: create as pending, NO charge; validate night price
- PATCH /bookings/:id/status: new transition graph + role rules; capture on accept(best-effort)/paid; settle on completed; refund on paid|proof_uploaded→refunded/cancelled
- POST /bookings/:id/proof (provider): paid→proof_uploaded + order_proofs row
- GET /me/orders (provider incoming bookings + customer name)
- admin.ts: GET /admin/proofs, PATCH /admin/proofs/:id (approve→settle+completed / reject→paid), GET /admin/escrow ({held, balance})

### T004: OpenAPI + codegen
- Booking status/duration enums, profile priceNight, OrderProof/ProofReview schemas,
  new endpoints, WalletTransactionType escrow types, UpdateBookingStatusBody enum

### T005: frontend
- booking-flow: add Night; reframe as request (no upfront charge)
- pricing.tsx: add Night price
- bookings.tsx: role-aware — customer (Pay now / Cancel), model (Accept/Reject, Upload proof)
- admin.tsx: Proofs review tab (view photo, approve/reject) + escrow held display

### T006: typecheck, restart, e2e smoke, code review, commit
