PIT Coffee · Roadmap de backend
Qué necesita el servidor para que funcione cada pantalla, botón y función del lienzo PIT Coffee · App web. Los códigos (M04, E03, P05, A15) son los nombres de las pantallas en Doop. Las pantallas de escritorio del cliente (E01 a E13) usan las mismas llamadas que las de móvil, así que aparecen junto a su equivalente.
0. Cómo leer este documento
- Es una propuesta. Sale de las pantallas dibujadas, no de código existente. Las rutas y los nombres de campos son sugeridos.
- Los números son de muestra. 5 % de cashback, 8 sellos, 400 m de reparto, $15 de entrega, 12 pedidos por franja y los demás valores vienen de las pantallas. Todos deben ser configurables y los define el negocio.
- No elige tecnología. Falta decidir el procesador de pagos, el proveedor de SMS y WhatsApp, y el de facturas (sección 10).
- Regla general: el servidor nunca confía en lo que calcula la página. Precios, totales, cashback, distancia, cupo y permisos se vuelven a calcular en el servidor.
1. Piezas del backend
| # | Pieza | Qué hace | La usan |
|---|---|---|---|
| 1 | Cuentas y sesión | Entrar con celular y código, entrar con correo, recuperar cuenta, perfil, borrar cuenta | M27 a M30, M33, M34, M22, M26, E08, E09 |
| 2 | Personal y permisos | PIN, puestos, invitaciones, qué puede hacer cada puesto | P01, A12 |
| 3 | Ruta y paradas | Calendario semanal, paradas del día, abrir, cerrar, retrasar, cancelar, posición del camión | M01 a M04, M41, E02, P02, P03, A05, A06 |
| 4 | Menú y disponibilidad | Categorías, productos, tamaños, extras, alérgenos, agotados por hoy | M07, M08, E03, P06, A03, A04 |
| 5 | Inventario | Carga del día, consumo por receta, merma, apagado automático | A16, P06 |
| 6 | Carrito y cotización | Total, entrega, mínimo, cashback, promociones, cupo por franja | M09 a M12, M35, E01, E04, E13 |
| 7 | Pagos | Tarjetas guardadas, cobro, rechazos, reembolsos, conciliación | M13, M14, M37, M42, E11, A02, A15 |
| 8 | Pedidos | Crear, estados, código de entrega, cancelar, repetir, historial | M15 a M21, M32, E05, E06, P04, P05, A02 |
| 9 | Reparto | Zonas, asignación, viaje, entrega, cliente no encontrado | M10, M11, M17, P07 a P09, A07 |
| 10 | Lealtad | Cashback, sellos, recompensas, promociones, registro de movimientos | M18, M23, M24, E07, A09, A10, A13, A14 |
| 11 | Avisos | Notificación web, WhatsApp, SMS, correo, bandeja, preferencias | M05, M06, M25, A08 |
| 12 | Facturación | Datos fiscales, emitir y descargar factura | M38 |
| 13 | Ayuda | Reportes de problema con un pedido, respuesta y compensación | M39, A01 |
| 14 | Reportes | Ventas, productos, tiempos, exportar a Excel | A01, A11, A14 |
| 15 | Equipos del camión | Estado de dispositivos, impresora, cortes de internet | A17, P10, M31 |
| 16 | Tiempo real | Cambios de pedido, cola, posición del camión y del repartidor | M15 a M17, M41, P04, P07, A01 |
| 17 | Tareas programadas | Avisos de cercanía, vencimientos, conciliación, cierres automáticos | Sección 6 |
2. Datos principales
| Tabla | Campos clave |
|---|---|
clientes | celular verificado, correo, nombre, nota de gusto, parada habitual, estado (activa, por borrar) |
lugares_frecuentes | cliente, nombre, texto del lugar, coordenadas, indicaciones, principal |
personal | nombre, puestos, PIN cifrado, estado (invitado, activo, baja), última entrada |
permisos_puesto | puesto, acción, permitido, límite (por ejemplo ajuste hasta $100) |
paradas | nombre, coordenadas, radio de aviso, radio de reparto, tarifa, mínimo, cupo por franja, minutos de anticipación |
paradas_dia | parada, fecha, llega, se va, estado (programada, en camino, abierta, en pausa, cerrada, cancelada), retraso, motivo |
franjas | parada del día, hora, cupo, ocupados, apartados |
categorias, productos, tamanos, grupos_extra, extras | precio, alérgenos, cuenta como sello, foto, publicado |
agotados_dia | producto o extra, fecha, quién lo apagó, hora |
insumos, recetas, inventario_dia, mermas | cargado, usado, queda, límite de aviso |
carritos | cliente, parada del día, forma de recibir, líneas, nota, usa cashback, recompensa |
pedidos | folio, cliente, parada del día, franja, forma de recibir, estado, código de 3 dígitos, totales, propina, quiere factura |
pedido_lineas | producto, tamaño, extras, cantidad, precio cobrado |
pedido_eventos | pedido, estado, hora, quién, dispositivo (historial que no se borra) |
pagos | pedido, intento, monto, estado, id del procesador, llave de idempotencia |
reembolsos | pago, monto, motivo, estado, quién |
tarjetas | cliente, token del procesador, marca, últimos 4, vence, principal (nunca el número completo) |
entregas | pedido, repartidor, viaje, prometido, estado, motivo de no entrega, llamadas, espera |
cashback_movimientos | cliente, tipo, monto, origen, quién, vence, saldo después (solo se agrega) |
sellos_movimientos, recompensas | cliente, cantidad, origen, estado (disponible, usada, vencida) |
promociones | tipo, valor, tope, fechas, paradas, público, presupuesto, gastado, estado |
avisos_preferencias, suscripciones_push, avisos_enviados | por cliente, canal, tipo, parada |
datos_fiscales, facturas | RFC, razón social, CP, régimen, uso, archivos |
reportes_problema | pedido, tipo, texto, foto, estado, resolución |
solicitudes_parada | cliente, lugar pedido (E02, «Pedir que el camión pase por aquí») |
dispositivos, cortes_conexion | batería, última señal, impresora, duración del corte |
bitacora | quién, qué, cuándo, antes y después (toda acción del personal y del panel) |
3. Estados de un pedido
stateDiagram-v2
[*] --> PorPagar
PorPagar --> Pagado: cobro aprobado
PorPagar --> Vencido: pasó el apartado
Pagado --> EnPreparacion: Empezar (P04)
Pagado --> Cancelado: cliente cancela (M32)
EnPreparacion --> Listo: Marcar listo (P04)
Listo --> Entregado: código en ventanilla (P05)
Listo --> EnCamino: Lo llevo yo (P07)
EnCamino --> Entregado: Entregado a (P09)
EnCamino --> NoEntregado: no salió (P09)
NoEntregado --> Entregado: pasa a recoger
NoEntregado --> Reembolsado: decide admin (A02)
Listo --> Guardado: no alcanza a pasar (M16)
Guardado --> Entregado
Pagado --> Reembolsado: parada cancelada (P03)
Entregado --> [*]Reglas que el servidor hace cumplir:
- Cancelar sin costo solo mientras el pedido está en «Pagado». En cuanto alguien toca «Empezar», la cancelación del cliente se rechaza con el motivo.
- Cashback y sellos se acreditan al pasar a «Entregado», no al pagar.
- Cada cambio de estado guarda un evento, avisa por tiempo real y dispara su aviso al cliente.
- Dos personas a la vez: si dos dispositivos cambian el mismo pedido, gana el primero y el segundo recibe el estado actual.
4. Flujos completos
4.1 Pedir y recoger en el camión
- La página pide la ruta del día y el menú de la parada elegida (M01, M07).
- El cliente arma el carrito. Cada cambio pide una cotización al servidor (M09).
- Al tocar «Ir a pagar», el servidor valida todo otra vez y aparta un lugar en la franja por 5 minutos (M35).
- Al tocar «Pagar», el servidor crea el pedido «Por pagar», aparta el cashback y cobra con una llave de idempotencia (M13).
- El procesador confirma por webhook. El pedido pasa a «Pagado», recibe folio y código de 3 dígitos, y entra a la cola de preparación (P04).
- Preparación toca «Empezar» y luego «Marcar listo». El cliente ve cada paso en vivo (M15, M16) y recibe el aviso de «listo».
- En ventanilla, el personal teclea el código y toca «Entregar» (P05).
- Al entregar: se acredita el cashback, se suman sellos, se desbloquea la recompensa si toca y se descuenta el inventario (M18).
4.2 Entrega cercana
Igual que 4.1, con estos cambios:
- La cotización revisa que el lugar esté dentro del radio de reparto de la parada, suma la tarifa y exige el pedido mínimo. Si queda fuera, responde con las alternativas de M11.
- Al quedar «Listo», el pedido aparece en la lista del repartidor (P07). «Lo llevo yo» lo asigna. «Llevarlo en el mismo viaje» lo suma al viaje abierto.
- El teléfono del repartidor manda su posición mientras el viaje está abierto. El cliente la ve en M17.
- «Ya llegué, avisarle» manda el aviso y arranca un reloj de 5 minutos (P08, P09).
- «Entregado a…» cierra el pedido. Si el cliente no sale, «Regresar al camión» se activa al terminar el reloj, pide motivo y deja el pedido «No entregado» 20 minutos en la repisa. El reembolso lo decide la administradora (A02).
4.3 El pago falla
- Rechazado por el banco (M14): el pedido sigue «Por pagar», el lugar y el cashback siguen apartados 10 minutos, y el cliente puede pagar con otra tarjeta. Al vencer, se libera todo.
- Se corta la conexión al pagar: la página reintenta con la misma llave de idempotencia y el servidor contesta con el resultado del primer intento, sin cobrar dos veces.
- Cargo duplicado (M42): la conciliación detecta dos cobros para un pedido, reembolsa el segundo sola y avisa al cliente.
- Cobrado sin pedido (A15): la conciliación lo detecta y lo deja en «Pagos con problema» para que la administradora elija crear el pedido, reembolsar, o reembolsar con cashback de disculpa.
4.4 Retraso o cancelación de una parada
- Retraso (P03): cambia la hora de llegada, recalcula las horas prometidas de los pedidos anticipados y avisa a quienes tienen pedido y a quienes siguen la parada.
- Cancelación (P03, con PIN para el operador): cierra la parada, reembolsa cada pedido a su tarjeta, regresa el cashback usado, quita el cashback aún no acreditado y avisa a todos (M19). El cliente recibe la siguiente parada cercana para «Pedir lo mismo para mañana».
4.5 Sin conexión
- Cliente (M31): la página guarda la última respuesta de su pedido activo y su código. Para pedir o pagar exige conexión.
- Personal (P10): el dispositivo guarda los pedidos ya pagados y una cola de acciones («Empezar», «Marcar listo», «Entregar») con hora local. Al volver la señal las manda en orden. El servidor las acepta si el cambio de estado sigue siendo válido y contesta con el estado real si no.
- Camión sin señal: si el servidor deja de recibir latidos del camión, pone la parada «en pausa» sola y, pasados 10 minutos, avisa a la administradora por SMS (A17).
5. Pantalla por pantalla
Cada fila: qué toca la persona, qué llamada hace, qué manda, qué espera de vuelta y qué puede salir mal.
5.1 Cliente · entrar y cuenta
| Pantalla | Botón o función | Llamada | Manda | Espera | Errores que debe contestar |
|---|---|---|---|---|---|
| M27, E09 | Enviarme un código | POST /sesion/codigo | celular | segundos para pedir otro | número inválido, demasiados intentos |
| M28 | Continuar | POST /sesion/verificar | celular, código | sesión, y si es cuenta nueva | código incorrecto, 5 intentos agotados, código vencido |
| M28 | Recibirlo por WhatsApp | POST /sesion/codigo | celular, canal | igual que arriba | sin WhatsApp en ese número |
| M28 | Cambiar | sin llamada | |||
| M29 | Empezar a pedir | PATCH /yo | nombre, correo, parada habitual | perfil | correo ya usado en otra cuenta |
| M33 | Enviarme el enlace | POST /sesion/enlace | correo | confirmación | correo mal escrito, demasiados envíos |
| M33 | (abrir el enlace) | POST /sesion/enlace/usar | token | sesión | enlace vencido (15 min) o ya usado |
| M34 | Enviarme el enlace, número nuevo | POST /cuenta/recuperar, luego POST /cuenta/cambiar-celular | correo, después celular y código | cuenta con saldo y sellos intactos | sin correo registrado (se resuelve en el camión con identificación) |
| M27, E09 | Ver el menú sin cuenta | GET /ruta/hoy, GET /menu | datos públicos | ||
| E09 | Entrada del personal | navegación a P01 | |||
| M22, E08 | (abrir Cuenta) | GET /yo | perfil, saldo, sellos, resumen | ||
| M22, E08 | Cerrar sesión | DELETE /sesion | |||
| M26, E08 | Guardar cambios | PATCH /yo | nombre, correo, gusto | perfil | cambiar celular exige código nuevo |
| M26 | Agregar o editar lugar | POST, PATCH, DELETE /yo/lugares | nombre, lugar, indicaciones, principal | lista | lugar fuera del parque |
| M30, E08 | Eliminar mi cuenta | DELETE /yo | confirmación | fecha de borrado (30 días) | pedido en curso: se programa al cerrarlo |
| M40 | Descargar en PDF | GET /legal/{documento} | texto, versión, PDF |
5.2 Cliente · ruta, menú y avisos
| Pantalla | Botón o función | Llamada | Manda | Espera | Errores |
|---|---|---|---|---|---|
| M01 a M03, E01, E10 | (abrir Inicio) | GET /ruta/hoy | ubicación opcional | paradas, estado de cada una, distancia a pie, si acepta pedidos | sin ruta hoy: próxima fecha y semana (M03) |
| M04, E02 | Días de la semana | GET /ruta?fecha= | fecha | paradas de ese día | |
| M41 | (mapa en vivo) | canal camion | posición, llegada estimada, hora del dato | señal perdida: usar hora programada | |
| M01, M04, M41 | Avisarme, Avisarme cuando llegue, Avisarme el lunes | POST /avisos/seguir | parada del día o fecha | confirmación | sin permiso de avisos: mandar a M05 |
| M36 | Avisarme cuando reabran | POST /avisos/seguir | parada del día, tipo reapertura | confirmación | |
| E02 | Pedir que el camión pase por aquí | POST /solicitudes-parada | lugar | conteo de solicitudes | una por persona y lugar |
| M05 | Usar mi ubicación | POST /yo/ubicacion y POST /avisos/suscripcion | coordenadas, suscripción push | paradas a pie | permiso negado |
| M05 | Elegir mi parada a mano | PUT /yo/paradas | paradas | lista | |
| M25, E08 | Interruptores de avisos y canales | PATCH /yo/avisos | tipo, canal, activo | preferencias | WhatsApp requiere celular verificado |
| M25, E08 | Dejar de usar mi ubicación | DELETE /yo/ubicacion | confirmación | ||
| M06 | (abrir bandeja) | GET /yo/avisos, POST /yo/avisos/leidos | lista con enlace a su pedido o parada | ||
| M07, E01 | Categorías, lista | GET /menu?parada_dia= | parada del día | productos, precios, agotados, si se puede pedir | parada en pausa: menú visible, sin agregar (M36) |
| M08, E03 | (abrir producto) | GET /productos/{id} | tamaños, leches, extras, alérgenos, agotados |
5.3 Cliente · carrito, pago y pedido
| Pantalla | Botón o función | Llamada | Manda | Espera | Errores |
|---|---|---|---|---|---|
| M08, E03 | Agregar · $180 | POST /carrito/lineas | producto, tamaño, extras, cantidad | carrito cotizado | producto o extra agotado, parada cerrada |
| M07, M09, E01 | − y + | PATCH, DELETE /carrito/lineas/{id} | cantidad | carrito cotizado | |
| M09, M10 | Recojo en el camión, Que me lo lleven | PATCH /carrito | forma de recibir, lugar, indicaciones, teléfono | cotización con tarifa, mínimo y hora estimada | fuera de zona con alternativas (M11, E13), falta para el mínimo |
| M09, M10, E04 | Cambiar (parada u hora) | GET /paradas-dia/{id}/franjas, PATCH /carrito | franja | franjas con cupo | franja llena (M35) |
| M09 | Nota para el barista | PATCH /carrito | nota | largo máximo | |
| M09, E01 | Usar mi cashback | PATCH /carrito | usar, monto opcional | nuevo total | saldo insuficiente o vencido |
| M24, E07 | Usar, Usar en mi pedido | POST /carrito/recompensa | recompensa | carrito con la línea en $0 | recompensa vencida o no combinable |
| M12, M20, M18, E06 | Repetir, Repetir este pedido | POST /pedidos/{id}/repetir | parada del día actual | carrito nuevo y lo que cambió | productos agotados o con otro precio |
| M19, E12 | Pedir lo mismo para mañana | POST /pedidos/{id}/repetir | parada del día sugerida | carrito para esa parada | |
| M11, E13 | Recoger en el camión, Pedir para las 13:30, Usar otra dirección | PATCH /carrito | la opción elegida | cotización | |
| M09, M10 | Ir a pagar | POST /carrito/apartar | lugar apartado 5 min, total firme | cupo lleno, precios cambiaron | |
| M35 | Recoger a las 11:00 | POST /carrito/apartar | franja | apartado | franja se llenó mientras elegía |
| M13, E04 | Propina, Necesito factura | sin llamada, viaja al pagar | |||
| M13, E04 | Pagar $236.50 | POST /pedidos | carrito, tarjeta, propina, factura, llave de idempotencia | pedido con folio y estado, o paso extra del banco (3D Secure) | rechazo con motivo (M14, E11), apartado vencido, parada cerró |
| M14, E11 | Pagar con Mastercard | POST /pedidos/{id}/pagos | otra tarjeta, llave nueva | igual que arriba | apartado de 10 min vencido |
| M14, E11 | Volver a mi pedido | sin llamada | |||
| M37 | Guardar tarjeta | formulario del procesador, luego POST /yo/tarjetas | token, principal | tarjeta con últimos 4 | tarjeta inválida, cargo de prueba rechazado |
| M37 | Quitar | DELETE /yo/tarjetas/{id} | lista | tarjeta con pedido por cobrar | |
| M15 a M17, E05 | (seguimiento) | GET /pedidos/{id} y canal pedido:{id} | pasos con hora, posición en la cola, código, repartidor, llegada estimada | ||
| M15, M16 | Cómo llegar | abre mapas con las coordenadas | |||
| M15, M18, E05 | Ver recibo | GET /pedidos/{id}/recibo | recibo | ||
| M32 | Sí, cancelar y reembolsar | POST /pedidos/{id}/cancelar | motivo opcional | reembolso a tarjeta y cashback devuelto | ya entró a la barra: no se puede |
| M32 | Conservar mi pedido | sin llamada | |||
| M16 | No voy a alcanzar a pasar | POST /pedidos/{id}/guardar | parada donde se le guarda | última parada del día: ofrece reembolso según política | |
| M20, M21, E06 | Seguir, Ver los anteriores | GET /pedidos?pagina= | lista | ||
| M42 | Ver el comprobante del reembolso | GET /reembolsos/{id} | comprobante | ||
| M15, M18, M39, E05 | Necesito ayuda, Tuve un problema, Enviar reporte | POST /pedidos/{id}/reportes | tipo, texto, foto | número de reporte | fuera del plazo para reportar |
| M19, M39, M42 | Hablar con alguien, Escribirle por WhatsApp | enlace a WhatsApp con el folio |
5.4 Cliente · lealtad y facturas
| Pantalla | Botón o función | Llamada | Espera |
|---|---|---|---|
| M23, E07 | (saldo y movimientos) | GET /yo/cashback | saldo, cuánto vence y cuándo, movimientos, regla vigente |
| M24, E07 | (sellos y recompensas) | GET /yo/recompensas | sellos, recompensas disponibles, bloqueadas e historial |
| M18 | (pantalla de entregado) | viene en GET /pedidos/{id} | cashback ganado, sellos sumados, recompensa desbloqueada |
| M38 | Guardar datos | PUT /yo/datos-fiscales | datos validados (RFC, CP, régimen) |
| M38 | Facturar | POST /pedidos/{id}/factura | factura en proceso; error si pasó el fin de mes |
| M38 | Descargar | GET /facturas/{id} | PDF y XML |
5.5 Personal
Toda llamada del personal lleva la sesión del PIN y revisa el permiso del puesto.
| Pantalla | Botón o función | Llamada | Manda | Espera | Errores |
|---|---|---|---|---|---|
| P01 | Teclado y PIN | POST /personal/sesion | PIN, id del dispositivo | sesión, puestos, a qué pantalla va | PIN incorrecto, bloqueo tras varios intentos, persona dada de baja |
| P02 | (abrir) | GET /operador/hoy | parada actual, contadores, ruta | ||
| P02 | Recibir pedidos nuevos (interruptor) | POST /paradas-dia/{id}/pausa | activo, reapertura estimada | estado | |
| P02 | Cerrar parada y salir a la siguiente | POST /paradas-dia/{id}/cerrar | resumen y siguiente parada | pedidos sin entregar: pide qué hacer con cada uno | |
| P02 | (al llegar) abrir parada | POST /paradas-dia/{id}/abrir | posición | estado abierta, dispara aviso «llegó» | lejos del punto de la parada: pide confirmar |
| P03 | Avisar retraso de 15 min | POST /paradas-dia/{id}/retraso | minutos, motivo | nueva hora, a cuántos se avisó | |
| P03 | Cancelar parada | POST /paradas-dia/{id}/cancelar | motivo, PIN | pedidos reembolsados, avisos enviados | sin permiso, reembolso fallido en algún pedido (queda en A15) |
| P04 | Pestañas | GET /preparacion/cola?estado= y canal cola:{parada_dia} | pedidos ordenados por hora prometida, tiempos de espera | ||
| P04 | Empezar | POST /pedidos/{id}/empezar | pedido en preparación, manda a imprimir la etiqueta | cancelado por el cliente un segundo antes | |
| P04 | Marcar listo | POST /pedidos/{id}/listo | repisa o bolsa | pedido listo, aviso al cliente o al reparto | |
| P05 | Código de 3 números | GET /preparacion/buscar?codigo= | código, parada del día | pedido listo que coincide | no existe, ya entregado, es de otra parada |
| P05 | Buscar por nombre | GET /preparacion/buscar?texto= | nombre o teléfono | coincidencias | |
| P05 | Entregar pedido A-118 | POST /pedidos/{id}/entregar | código | entregado; dispara cashback, sellos e inventario | código no coincide |
| P06 | Interruptor de producto o extra | PUT /agotados-dia | producto o extra, agotado | estado y cuántos pedidos pagados lo traen | hay pedidos pagados que lo traen: avisa cuáles |
| P07 | (abrir) | GET /reparto/mis-entregas y canal reparto:{repartidor} | por salir, en espera, hechas | ||
| P07 | Lo llevo yo | POST /entregas/{id}/tomar | viaje abierto | ya lo tomó otro | |
| P07 | Llevarlo en el mismo viaje | POST /viajes/{id}/agregar | entrega | viaje con orden sugerido | |
| P08 | (en camino) | POST /reparto/posicion cada pocos segundos | coordenadas | ||
| P08 | Ya llegué, avisarle | POST /entregas/{id}/llegue | reloj de espera, aviso enviado | ||
| P08, P09 | Llamar al cliente | POST /entregas/{id}/llamada | número enmascarado o registro de la llamada | ||
| P09 | Entregado a Marco | POST /entregas/{id}/entregar | entregado, siguiente entrega del viaje | ||
| P08, P09 | No encuentro al cliente, Regresar al camión | POST /entregas/{id}/no-entregado | motivo | pedido en repisa 20 min, queda para decisión del admin | antes de cumplir la espera: rechazado |
| P10 | Empezar, Reintentar | cola local, luego POST /sincronizar | acciones con hora local e id único | resultado por acción | acción ya no válida |
5.6 Administración
| Pantalla | Botón o función | Llamada | Manda | Espera |
|---|---|---|---|---|
| A01 | (abrir Hoy) | GET /admin/hoy y canal admin | paradas con contadores, alertas, venta, cashback, equipo en turno | |
| A01 | Mandar aviso | lleva a A08 | ||
| A01 | Ver pedido, Reembolsar o guardar, Ver menú, Resolver | navegación con el id de la alerta | ||
| A02 | Filtros y búsqueda | GET /admin/pedidos | fecha, parada, estado, forma, texto | lista paginada |
| A02 | (detalle) | GET /admin/pedidos/{id} | líneas, pagos, eventos, quién hizo qué | |
| A02 | Reembolsar $68.00 y avisar al cliente | POST /admin/pedidos/{id}/reembolso | monto total o parcial, motivo | reembolso, ajuste de cashback, aviso enviado |
| A03 | Categorías, Nueva categoría | GET, POST /admin/categorias | nombre, orden | lista |
| A03 | Agregar producto, Editar | lleva a A04 | ||
| A03 | Interruptor «A la venta» | PUT /agotados-dia o PATCH /admin/productos/{id} | por hoy o definitivo | estado |
| A04 | Guardar y publicar | PUT /admin/productos/{id} | nombre, descripción, categoría, ingredientes, alérgenos, sello, tamaños, extras, receta | producto publicado; errores por campo (tamaño sin precio) |
| A04 | Agregar tamaño, Quitar | parte del guardado | ||
| A04 | Cambiar foto | POST /admin/archivos | imagen | URL |
| A04 | Descartar | sin llamada | ||
| A04 | Quitar del menú | DELETE /admin/productos/{id} | se archiva, no se borra, por el historial | |
| A05 | Semana anterior, Siguiente | GET /admin/paradas-dia?semana= | paradas por día con pedidos | |
| A05 | Copiar a la siguiente semana | POST /admin/semanas/copiar | semana origen | paradas creadas y choques |
| A06 | Guardar parada | PUT /admin/paradas-dia/{id} | lugar, horas, radio de aviso, radio de reparto, tarifa, mínimo, anticipación, cupo, qué hacer si se llena | parada; si ya hay pedidos, avisa a esos clientes |
| A06 | Mover pin | parte del guardado | coordenadas | cuántos clientes alcanza cada radio |
| A06 | Quitar parada | DELETE /admin/paradas-dia/{id} | con pedidos: los reembolsa como cancelación | |
| A07 | (abrir) | GET /admin/reparto | entregas en curso, repartidores, puntualidad | |
| A07 | Asignar o cambiar repartidor | PATCH /admin/entregas/{id} | repartidor | entrega |
| A07 | Agregar repartidor | POST /admin/personal | datos, puesto | invitación |
| A07 | Cambiar reglas | PUT /admin/reparto/reglas | espera, entregas por viaje, tiempo en repisa | reglas |
| A08 | Interruptores por aviso y canal, textos | PUT /admin/avisos/plantillas | texto, canales | plantillas |
| A08 | Mandar a 64 personas | POST /admin/avisos/enviar | público, texto, canales | cuántos se enviaron y cuántos fallaron |
| A09 | Guardar reglas | PUT /admin/lealtad/reglas | porcentaje, tope, cuándo se acredita, vigencia, pago con saldo, sellos, premio | reglas con fecha de inicio; no cambian lo ya ganado |
| A09 | Nueva (promoción) | lleva a A13 | ||
| A09 | Ver todo el registro | lleva a A14 | ||
| A10 | Pestañas y búsqueda | GET /admin/clientes | segmento, texto | lista |
| A10 | Sumar $20.00 a Daniela | POST /admin/clientes/{id}/ajuste | monto, motivo | movimiento; rechazo si pasa el límite del puesto |
| A10 | Ver sus 14 pedidos | GET /admin/pedidos?cliente= | lista | |
| A11 | Rangos de fecha | GET /admin/reportes | desde, hasta | venta por día y parada, productos, tiempos, lealtad |
| A11, A14 | Descargar en Excel | GET /admin/reportes/exportar | rango, tipo | archivo |
| A12 | Invitar a alguien | POST /admin/personal | nombre, celular, puestos | invitación enviada |
| A12 | Editar | PATCH /admin/personal/{id} | puestos, baja | persona; al dar de baja se cierran sus sesiones |
| A12 | Reenviar, Reactivar | POST /admin/personal/{id}/invitacion, PATCH | estado | |
| A12 | Cambiar permisos | PUT /admin/permisos | puesto, acción, permitido, límite | matriz |
| A13 | Guardar borrador, Programar promoción | PUT /admin/promociones/{id} | tipo, valor, tope, textos, fechas, paradas, público, mínimo, presupuesto, combinaciones, aviso al empezar | promoción y costo estimado |
| A13 | Eliminar promoción | DELETE /admin/promociones/{id} | solo si no ha empezado; si ya empezó, se termina | |
| A14 | Filtros | GET /admin/lealtad/movimientos | fecha, tipo, manuales, texto | movimientos con saldo después; no se editan ni se borran |
| A15 | Pestañas | GET /admin/pagos/problemas | estado | casos con su línea de tiempo |
| A15 | Crear pedido y avisar a Pablo | POST /admin/pagos/problemas/{id}/resolver | acción: crear pedido, reembolsar, reembolsar con cashback | caso resuelto, pedido o reembolso |
| A15 | Llamar al cliente | enlace telefónico, queda en bitácora | ||
| A16 | (abrir) | GET /admin/inventario/hoy | cargado, usado, queda, para cuánto alcanza, pronóstico de la siguiente parada | |
| A16 | Registrar merma | POST /admin/inventario/mermas | insumo, cantidad, motivo | inventario |
| A16 | Cargar inventario de mañana | PUT /admin/inventario/{fecha} | cantidades | carga |
| A16 | Pedir resurtido antes de la 1:00 | POST /admin/inventario/resurtido | insumos, hora | aviso a quien surte |
| A16 | Cambiar límites y recetas | PUT /admin/insumos, PUT /admin/recetas | ||
| A17 | (abrir) | GET /admin/equipos | dispositivos, batería, señal, impresora, cortes del día | |
| A17 | Imprimir etiqueta al empezar (interruptor) | PUT /admin/impresion | activo | ajuste |
| A17 | Imprimir prueba | POST /admin/impresion/prueba | orden enviada a la tableta | |
| A17 | Cambiar diseño | PUT /admin/impresion/plantilla | campos de la etiqueta | plantilla |
| A17 | Cambiar tiempos y a quién se avisa | PUT /admin/equipos/reglas | minutos, contactos | reglas |
6. Tareas que corren solas
| Tarea | Cada cuánto | Qué hace |
|---|---|---|
| Aviso de cercanía | cada minuto | Manda «llega en 10 min» a quienes siguen la parada o están dentro del radio de aviso |
| Liberar apartados | cada minuto | Suelta lugares de franja y cashback de pedidos «Por pagar» vencidos |
| Conciliación de pagos | cada 5 min | Compara cobros del procesador contra pedidos; detecta duplicados y cobros sin pedido |
| Vigilar la cola | cada minuto | Alerta en A01 si un pedido lleva más de la meta sin empezar |
| Latido del camión | continuo | Pausa la parada si se pierde la señal; SMS a la administradora a los 10 min |
| Repisa de no entregados | cada minuto | A los 20 min pasa el caso a decisión de la administradora |
| Inventario | con cada entrega | Descuenta por receta, apaga productos al llegar a cero, alerta de poco inventario |
| Vencimientos | diario | Vence cashback y recompensas; avisa unos días antes |
| Promociones | cada minuto | Las enciende y apaga por fecha y por presupuesto |
| Reencendido de agotados | diario, al cierre | Lo apagado «por hoy» vuelve a venderse |
| Cierre automático de parada | a la hora de salida | Avisa al operador y cierra si no responde |
| Borrado de cuentas | diario | Borra lo programado hace 30 días, conserva comprobantes fiscales |
| Reintento de reembolsos | cada hora | Reintenta los fallidos y los deja en A15 si el banco los rechaza |
7. Avisos: qué los dispara y por dónde salen
| Evento | Página (push) | SMS | Correo | |
|---|---|---|---|---|
| Código para entrar | opcional | sí | ||
| Enlace para entrar | sí | |||
| Camión llega en 10 min, llegó | sí | opcional | ||
| Retraso o cambio de lugar | sí | sí | ||
| Parada cancelada y reembolso | sí | sí | sí | |
| Pedido listo, en camino, entregado | sí | opcional | ||
| El repartidor llegó | sí | sí | ||
| Cashback ganado, recompensa lista, por vencer | sí | |||
| Recibo, factura, reembolso | sí | |||
| Pedidos reabiertos | sí | |||
| Promoción | sí | opcional | ||
| Camión sin señal (a la administradora) | sí |
Cada envío respeta las preferencias del cliente (M25), se guarda en la bandeja (M06) y registra si llegó o falló. En iPhone, la notificación de la página solo funciona si la persona agregó PIT Coffee a su pantalla de inicio, así que WhatsApp es el respaldo.
8. Tiempo real
| Canal | Quién escucha | Qué manda |
|---|---|---|
pedido:{id} | el cliente dueño del pedido | cambios de estado, hora estimada, posición del repartidor |
camion | cualquier cliente | posición del camión, parada actual, pausa o reapertura |
cola:{parada_dia} | preparación y operador | pedidos nuevos, cancelados y cambios de estado |
reparto:{repartidor} | repartidor | entregas listas y reasignaciones |
admin | panel | contadores, alertas y pagos con problema |
Si el canal se cae, la página vuelve a pedir el estado completo al reconectar. Ninguna pantalla depende solo de mensajes en vivo.
9. Roadmap por fases
Cada fase deja algo que se puede usar y probar. El orden sigue las dependencias: no se puede cobrar sin pedido, ni pedir sin menú y parada.
| Fase | Qué se construye | Pantallas que quedan funcionando | Depende de |
|---|---|---|---|
| 0 · Cimientos | Proyecto, base de datos, bitácora, manejo de errores, entornos de prueba, cuentas con los proveedores | ninguna | decisiones de la sección 10 |
| 1 · Entrar | Código por SMS, enlace por correo, perfil, PIN del personal, puestos y permisos | M27 a M29, M33, M22, M26, E08, E09, P01, A12 | 0 |
| 2 · Ruta y menú | Paradas, calendario, menú, productos, agotados por hoy | M01 a M04, M07, M08, E01 a E03, E10, A03 a A06, P06 | 1 |
| 3 · Pedir y pagar | Carrito, cotización, franjas, tarjetas, cobro, rechazo, idempotencia | M09, M12 a M14, M35, M37, E04, E11 | 2 |
| 4 · Operación del camión | Abrir y cerrar parada, pausa, cola, listo, código de ventanilla, seguimiento en vivo, historial | P02, P04, P05, M15, M16, M20, M21, M36, E05, E06, A01, A02 | 3 |
| 5 · Avisos | Notificación web, WhatsApp, plantillas, bandeja, preferencias, aviso de cercanía, retraso | M05, M06, M25, M41, P03 (retraso), A08 | 4 |
| 6 · Cancelaciones y reembolsos | Cancelar a tiempo, cancelar parada, reembolsos, conciliación, pagos con problema | M19, M32, M42, E12, P03 (cancelar), A15 | 4 |
| 7 · Lealtad | Cashback, sellos, recompensas, reglas, ajustes, registro | M18, M23, M24, E07, A09, A10, A14 | 4 |
| 8 · Entrega cercana | Zonas, tarifa, mínimo, asignación, viaje, posición, no entregado | M10, M11, M17, E13, P07 a P09, A07 | 4, 5 |
| 9 · Sin conexión | Caché del cliente, cola local del personal, sincronización, latido del camión | M31, P10, A17 (conexión) | 4 |
| 10 · Gestión | Promociones, inventario con recetas, reportes, Excel, impresora | A11, A13, A16, A17 | 7 |
| 11 · Cumplimiento | Facturas, ayuda y reportes, recuperar cuenta, borrar cuenta, textos legales | M30, M34, M38 a M40 | 6 |
Lo mínimo para operar un día real es de la fase 0 a la 6: entrar, pedir, pagar, preparar, entregar en ventanilla, avisar y poder reembolsar. Las fases 7 a 11 se pueden lanzar después sin rehacer lo anterior, siempre que desde la fase 3 el pedido ya guarde los campos de entrega, cashback y factura aunque vayan vacíos.
10. Decisiones que faltan (bloquean la fase 0)
| Tema | Qué hay que decidir | A qué afecta |
|---|---|---|
| Procesador de pagos | Cuál se usa, si guarda tarjetas, comisiones y tiempos de reembolso | M13, M14, M37, M42, A15 |
| SMS y WhatsApp | Proveedor y plantillas de WhatsApp aprobadas | M28, todos los avisos |
| Facturación | Proveedor de timbrado, si se factura propina y entrega | M38 |
| Reglas de lealtad | Porcentaje, tope, vigencia, cuántos sellos, qué se combina | Fase 7 |
| Reparto | Radio, tarifa, mínimo, minutos de espera, tiempo en repisa | Fase 8 |
| Política de reembolsos | Quién decide y cuándo se reembolsa un «no entregado» o un pedido no recogido | M16, P09, A02 |
| Permisos por puesto | La matriz de A12 es una propuesta | Fase 1 |
| Textos legales | Términos, aviso de privacidad y políticas | M40 |
| Posición del camión | Si sale del teléfono del operador o de un GPS del camión | M41, avisos de cercanía |
| Impresora | Modelo y cómo se conecta a la tableta | A17, P04 |
| Solicitudes de parada | Cuántas hacen falta para sumar una parada y quién las revisa | E02 |
