Decisiones (Bloque B)
Registro autoritativo de las 13 decisiones oficiales tomadas por Eric el 2026-07-11 que guiaron la reconciliación código ↔ esquema Supabase. Cualquier sesión futura sigue esto sin volver a preguntar.
Principio rector: el esquema desplegado en Supabase (rebuild) es la fuente de verdad del diseño. El código del
pos-backendse adapta a él (no al revés). Lo desplegado en jsonb/consolidado gana sobre el modelo normalizado viejo del código.
Las 13 decisiones
| # | Tema | Elegido | Razón / detalle |
|---|---|---|---|
| A0 | orders/order_items/cash: código ↔ desplegado | Adaptar código al desplegado | Lo desplegado (combos, KDS kds_*, modifiers jsonb, cash con analítica) es el diseño superior; no revertir. |
| A1 | Pagos: normalizado vs jsonb | jsonb (orders.payment_details + cash_sessions.by_payment_method/total_tips) | Reportes SQL por método no son requisito hoy; se agrega tabla payments después si hace falta. |
| A2 | Delivery / mesas divididas | Columnas de orders (order_type, cc_*, parent_order_id, is_split) | El desplegado ya las tiene. Split-bill fino por comensal = pieza futura. |
| A3 | Modificadores en la orden | order_items.modifiers jsonb | Snapshot inmutable del modificador al momento de ordenar (correcto para ticket histórico). El catálogo menu_item_modifier_* es la definición. |
| A4 ✅ | “86” / agotados | menu_items.is_available + menu_86_log (auditoría) | Flag simple desplegado; “porciones restantes” = futuro no bloqueante. |
| B ✅ | Staff (3 vías) | Retirar (pivote tras diagnóstico) | La feature staff-legacy consultaba la tabla staff que nunca existió, sin frontend. Se retiró staff.ts + /api/staff; operators es la fuente de verdad única. |
| C ✅ | Auth de plataforma | Supabase Auth | requirePlatformAdmin reescrito (getUser + admin_users); platform.ts sin /login; admin-central usa signInWithPassword. |
| D | Modelo de sesión (3 → 1) | Consolidar en active_sessions | device_tokens/token_blacklist/restaurant_sessions/join_tokens → active_sessions. password_reset_tokens → Supabase Auth nativo. |
| E ✅ | Ads (linaje) | Supabase advertisers/campaigns (modelo QR/paquete) | El SERIAL ad_* nunca existió (fantasma). 11 tareas: auth anunciantes → Supabase Auth, pagos Stripe endurecidos (idempotentes), ad_impressions → qr_scans. |
| F1 | CFDI de ventas (restaurantes) | Diferir | No es requisito de MVP; es feature + integración PAC. cfdi.ts sigue huérfano (no montado). |
| F2 ✅ | CFDI de anunciantes / fiscal | Crear fiscal_invoices + invoice_items | Folio secuencial INV-YYYYMM-000NNN. invoices.ts repuntado. La invoices de anunciantes/Stripe queda intacta. |
| G-shifts ✅ | Turnos (shifts/shift_sessions) | Borrar router muerto | shifts.ts borrado (nadie lo montaba). La remoción de shift_session_id de cash.ts/mixed-payment.ts se hizo dentro de A0. |
| G-wallet | Wallet Aprovecho | Diferir (no enterrar) | Parte de la visión futura, fuera del MVP. No borrar sus tablas todavía. |
Orden de implementación acordado
- Piezas chicas de bajo riesgo primero: C (auth plataforma) → G-shifts → A4 (86) → F2 (fiscal) → B (staff).
- Proyectos grandes (sesión dedicada): A0-A2 (núcleo orders/cash/pagos/delivery) · D (sesiones) · E (ads).
- Diferidos: F1 (CFDI ventas) · G-wallet (Aprovecho).
Fuente:
MiMente/00-Inbox/2026-07-11-iFondita-bloque-B-decisiones.md(registro oficial).