fix(dashboard): rebuild the booking funnel on the real bookings-status lifecycle
The admin dashboard still measured in-chat booking off the dead events-funnel
query (always zero) and treated link_issued as the only success, so paid,
confirmed, and e-ticketed bookings never showed and conversation.html painted
delivered red as if it were an error.
- Replace the events-based sub-funnel with
booking_status_counts(GROUP BY status) and rebuild funnel() as a monotonic cumulative funnel over the status lifecycle: Reached checkout -> Paid -> Order confirmed -> E-ticket delivered, with failed/expired shown as drops and a per-status breakdown + paid/delivery rates. - Success now means status IN (link_issued, processing, confirmed, delivered) across reached_booking / totals.bookings_issued / per-thread conversations; add bookings_paid + bookings_delivered totals and a "Paid bookings" KPI card.
- conversation.html: colour the booking pill by meaning (delivered/confirmed green, failed/expired red) instead of "!= link_issued", and show language.
- Widen the booking status Literals to include confirmed/expired.
- Cover the new funnel math (monotonic buckets, drops, rates, empty-safe).
Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com