SKZOFRENIKO

Unified Control Room
AD
Administración
Órdenes Completadas
0
Tickets Hoy
Upsells IA Aceptados
0
Ventas Incremetales
Ingresos del Día
$0
MXN Netos
Ticket Promedio
$0
Consumo per cápita

Ventas por Hora (Hoy)

Top Rendimiento

Ventas por Día

Cargando estadísticas globales…

Cargando clientes...

📭

Sin pedidos entrantes. La línea está tranquila.

Corte por cajero: abres con un fondo, registras sangrías/entradas y al cerrar declaras el conteo físico. El sistema calcula lo esperado y la diferencia. El corte Z es inmutable.
Cargando…

Cortes anteriores

Pedidos de Uber Eats / Rappi / DiDi (vía middleware) pendientes de aceptar. Aceptar las manda a cocina y avisa al agregador; rechazar las cancela. Si autoAccept está activo entran directo a cocina y no aparecen aquí.
Tienda:
Cargando…
Venta, propina, cortesía, cuentas y comensales por mesero en la ventana seleccionada. Base para reparto de propina y cierre de turno. Excluye ítems VOIDED/COMPED del total de venta.
Cargando…
📋 Pedidos del Kiosco — Pasa a Caja. Pide primero el número grande del ticket. El código de 4 caracteres queda como respaldo si el cliente no trae claro el número.
📋

Sin pedidos pendientes en caja.

💵 Turno actual
EFECTIVO
$0
TERMINAL
$0
TOTAL
$0
COBROS
0
DESDE
🚥 Cola actual
EN COLA
0
POR COBRAR
$0
MÁS ANTIGUA
💵 Solicitudes legacy (tokens parciales)
Solicitudes de pago en vivo desde el kiosco (cliente espera ahí porque ya descontó tokens). Ingresa el monto recibido y confirma para que avance a la foto.
💵

Sin solicitudes legacy activas.

💰 Recargar Saldo SKZO

Cliente paga en caja (efectivo / terminal / transferencia), tú acreditas el saldo a su cuenta SKZO. El balance aparece instantáneamente en su app. Persiste en WalletTransaction + AuditLog.

🛵 Domicilio · Horario

Define cuándo el delivery aparece como "Abierto ahora" en la app. Fuera de este horario no se aceptan pedidos a domicilio. Zona: America/Mexico_City.

Solicitudes que los clientes hacen desde la PWA. Genera el CFDI en tu sistema externo y luego marca como Emitida con el UUID del CFDI.

Flujo (manual, sin PAC integrado):
1. ⏳ Tomar — te asignas la solicitud para que dos operadores no la procesen a la vez (no envía nada al cliente).
2. Genera el CFDI en tu sistema fiscal externo con los datos del recuadro.
3. ✓ Marcar emitida — pega el UUID (folio fiscal). Recién aquí el cliente recibe su correo con el comprobante.
4. ✗ Rechazar — si los datos fiscales están mal o no procede.
🧾

Cargando solicitudes...

Feedback de la tablet en piso y del correo de seguimiento (2 h post-entrega). Cada review acreditó +100 tokens si la orden estaba ligada a una cuenta.

Cargando reviews...

Fotos que los clientes subieron desde su app reclamando que las publicaron en IG / TikTok / FB. Cada aprobación otorga +50 tokens (configurable en AppConfig: social.claim_points).

📸

Cargando…

🤖 Inteligencia de Inventario

Analiza stock actual, ventas de los últimos 7 días y márgenes. Sugiere misiones para empujar lo que necesites mover — tú apruebas antes de crear.
Presiona "Analizar con IA" para obtener sugerencias basadas en inventario + ventas reales.

Cargando inventario...

💡 Asigna la estación que prepara este item. Alimenta el KPI de cuello de botella en KPIs → Cocina (KDS).
📸

El caos generativo de IA de Fal.ai aparecerá aquí.

➕ Nuevo Empleado

Cargando equipo...

Herramienta:

Cómo usar el editor

↖ Seleccionar: arrastra mesas, toca para editar.

▭ Pared: click + arrastra para dibujar línea.

⬜ Zona: click + arrastra para zona (barra, cocina, baños).

T Etiqueta: click coloca texto.

Pulsa Guardar plano al terminar.

Lista completa de mesas (CRUD rápido)

Cargando mesas...

Estado de conexion

El backend manda los tickets al room PRINTERS_SUCURSAL_1. Si el print-agent no esta corriendo en la PC del kiosco (o esta desconectado), los tickets se pierden en silencio — el server emite al vacio. Aqui ves cuantos agentes hay realmente conectados.

Pruebas de impresion

Control remoto del agent

Lanza comandos al print-agent en la mini-PC sin SSH. Requiere que el agent ya tenga el listener correspondiente (la primera vez después de añadir esta feature el agent se actualiza a mano: cd Skzo/print-agent && git pull && npm install && sudo systemctl restart skzo-print-agent).

🤖 Pipeline IA (SKZO Vision)

¿Qué analiza este panel? Tres cosas: (1) si hay REPLICATE_API_TOKEN configurado en el entorno del servidor; (2) si la flag ai.bypass está activa en AppConfig; y (3) el modo efectivo: live (transforma con IA), bypass (apagada manualmente) o no-token (falta env var).

Si está apagada (manual o por billing), las fotos se imprimen/muestran tal cual el cliente las tomó sin transformación. El flujo no falla, solo deja de consumir créditos de Replicate.

¿Falta el token? Ve a EasyPanel → Variables de entorno → agrega REPLICATE_API_TOKEN=r8_xxx → Redeploy. El badge debajo debe pasar a VIVO.

⏳ Cargando…

Reimprimir orden

Acepta el #shortId del ticket (ej. 045), el externalId del tracking, o el UUID interno.

Logs del pipeline

Ring buffer en memoria (últimas 200 entradas). Registra cada PRINT_KITCHEN/PRINT_CUSTOMER emitido, el PRINT_RESULT que devuelve el agente, hellos/disconnects, y warnings (room vacío, etc.). Si reinicia el server se pierde — para persistencia mover a EventLog.

🛡️

Cargando registros de seguridad...

Plantillas predefinidas. Elige el rango y descarga. Para análisis ad-hoc usa la pestaña KPIs; este módulo es para reportes que se mandan a contabilidad, dirección o se archivan.

💵

Cierre de Turno

Total efectivo / terminal / app SKZO / vouchers, propinas, # órdenes, ticket promedio. Para cuadrar caja al final del día.

Ventas por Hora

Día × hora con # órdenes y $ vendido. Identifica horas muertas / pico para staffing y promociones.

🍜

Performance de Productos

Cada item × categoría × unidades × ingreso × ticket promedio. Para decidir qué quitar/promover del menú.

Top Clientes

Top 30 por gasto y por visitas en el rango. Para programa VIP, atenciones especiales o campañas dirigidas.

💳

Mix por Método de Pago

Cada método × # órdenes × ingreso × ticket promedio × propinas. Para auditar conciliaciones y negociar comisiones bancarias.

🚫

Cancelaciones / Cortesías

Órdenes con status VOID o pago CANCELLED. Incluye auto-cancel de pending_cash, cortesías manuales y comp del mesero. Para auditar quién comió gratis.

💰

Recargas SKZO

Trazabilidad de dinero acreditado a saldos SKZO. Email × monto × fecha × notas. Cumplimiento fiscal y conciliación con caja.

👥

Actividad de Empleados

Subset de los logs de auditoría filtrado a acciones STAFF_*. Quién modificó qué y cuándo. Para revisión disciplinaria y onboarding.

🔁

Retención por Cohorte

Matriz semanal: cada cohorte (clientes que hicieron su 1ra orden esa semana) × % que volvió W1, W2, W3… Para presentaciones a inversores y métricas de loyalty.

🧾

CFDIs Solicitados

Solicitudes de factura del rango con RFC, razón social, uso CFDI y estado. Reconciliación con tu contador / sistema de timbrado.

📧

Lista para Email Marketing

Toda tu base de clientes en formato listo para subir a Mailchimp / Brevo. Columnas: email, nombre, fecha registro, última visita, tokens, status (opted-in/out) y tags automáticos (Nuevo / Activo / Inactivo / VIP).

💡 ¿Necesitas un reporte que no esté aquí? Avísame con: nombre del reporte, columnas que quieres y para qué lo usarías. Lo agrego como nueva plantilla.
Plan de verificación sistemática del sistema. Tachas lo que pasa, te queda guardado. 11 bloques numerados — sigue el orden si es la primera corrida. Cada item es un caso de prueba con criterio de éxito explícito. La fuente vive en docs/TESTING_PLAN.md — si la actualizas, pulsa Recargar fuente.
PROGRESO TOTAL 0 / 0
🩺

Cargando plan…

Cargando fotos...

🍳 KDS Cocina

Tiempo máximo antes de que el KDS muestre alerta roja y active el sonido Cyberpunk.

💰 Up-sell & Pagos

Cuando el total de carga supera este monto, el bloque El Upgrade parpadea con intensidad alta para empujar la venta.
0 = sin mínimo. Si el carrito está debajo, no se ofrece up-sell (evita molestar en órdenes pequeñas).
Si está activo, el kiosco espera a que el cajero confirme el cobro en efectivo desde el panel Caja / Cobros antes de avanzar al paso de foto.

📣 Banner dinámico (Kiosco V2)

Muestra un mensaje en banda arriba del menu del Kiosco V2 — útil para anuncios temporales (happy hour, agotados, eventos). Se actualiza en la próxima carga del kiosco. Apaga el toggle o pon una fecha de expiración para quitarlo sin borrar.

Si la fecha ya pasó, el banner deja de mostrarse automáticamente (no hay que borrar nada).

📊 Performance del Up-sell

Datos en vivo desde DB. source=ai = sugerencia de Claude Haiku con contexto. random = fallback aleatorio (cuando la IA no responde). uplift = monto extra que el cliente aceptó vs lo que tenía en el carrito al momento de la sugerencia.

Cargando estadísticas…

⏱ Tiempos del Kiosco

Todos los valores se aplican la próxima vez que el kiosco recargue su configuración. Usa valores razonables — tiempos muy cortos pueden expulsar al cliente mientras interactúa; tiempos muy largos dejan el kiosco ocupado.
Sin toque/tecla → resetea la sesión y vacía el carrito.
Sin sesión + sin interacción → muestra pantalla publicitaria.
Si el cliente no elige método de pago → regresa al menú.
Máximo esperando que el cajero confirme el cobro.
Si el cliente no elige tokens → cancela automáticamente y vuelve al menú.
Límite de tokens por transacción (ej. 1000 tkns = $100 desc.).

✨ Efectos del Kiosco

El +1 flotante y los efectos de humo / vapor siempre están activos (siempre se ven al tocar un platillo). Aquí puedes apagar o prender los efectos extra.
Cambios aplican la próxima vez que el kiosco recargue (F5 / reinicio automático).

📊 Métricas de tiempo

Promedio, mediana (p50) y percentil 90 (p90) de los tiempos clave del flujo. Actualiza al cambiar el rango.

Cargando…

📊 Estado del Sistema

Kiosco Frontend
✅ Activo (v2.0)
API Backend
🔄 Verificando...
KDS Cocina
✅ Activo (v1.5)
Google Sheets Sync
✔ Configurado
Cargando misiones...

Completaciones Recientes

Carga las misiones para ver completaciones
🎟️
Código de Canje
El cliente muestra este código en su App. Ingrésalo aquí para validarlo.

Define cuántos insumos consume cada platillo. Al confirmar una orden, el stock se descuenta automáticamente. ¿No tienes catálogo aún? Pulsa 🧪 Generar datos demo para popular ingredientes + recetas de ejemplo.

Agregar Asignación
Platillo del Menú
Ingrediente
Cantidad
Asignaciones Actuales
Platillo Ingrediente Qty / Porción Stock actual Acción
Cargando...

Niveles de Progresión

Cargando niveles…

Logros (Badges)

Cargando…

Recompensas

La descripción explica al usuario en qué consiste el premio (ej. "Ramen gratis en tu próxima visita — canjea en caja").

Cargando…

Misiones de Progreso (App)

Misiones basadas en contadores (órdenes, rachas, fotos). Diferente a las Señales del Caos (QR físicos).

Cargando…

🏆 Leaderboard (interno)

Top 20 clientes por XP / actividad. Útil para identificar power-users (regalos, campañas, eventos privados). Datos internos — no se exponen en la app del cliente.

# Cliente Nivel XP Streak
Cargando…

Ajuste Manual de Tokens

⏳ Vigencia de Tokens

Días que un token gana antes de vencer. 0 = sin vigencia (tokens permanentes). Cambiar este valor no retroactiva tokens ya emitidos — cada transacción guarda su propio vencimiento al momento de crearse. El job de expiración corre cada 6 horas y crea una transacción EXPIRED en el historial.

Top Usuarios por Saldo

Cargando…

Últimas Transacciones

Cargando…

Centro de prompts del sistema SKZO. Aqui viven las instrucciones que alimentan texto, sugerencias, misiones y fotos IA. La idea es que esta vista crezca por areas: Kiosco, App, Booth, Operaciones y Marketing. Los cambios aplican en nuevas peticiones.

Area
Kiosco
Diagnostico de caos y upsell.
Area
App / Misiones
Mision diaria personalizada.
Area
Booth IA
Fotos del ticket y prompt final.

🌀 Diagnóstico de Caos (Kiosco)

POST /api/orders/skizofrenizar · max 80 tokens

Genera una frase corta e irreverente basada en lo que ordenó el cliente. Placeholder: {items}

💡 Sugerencia de Upgrade [Variant A]

POST /api/suggest · Haiku 4.5 · JSON

Placeholders: {items} {upgrades} {cartTotal} {contextBlock}. Respuesta DEBE ser JSON {"product":"...","text":"..."}

🧪 Sugerencia de Upgrade [Variant B · opcional]

A/B testing · split 50/50

Si rellenas este campo, el server hará split 50/50 entre A y B y la métrica en Configuración → Performance del Up-sell mostrará el ganador. Deja vacío para desactivar el A/B y usar solo Variant A.

🎯 Misión del Día (App Cliente)

GET /api/missions/daily · max 300 tokens · JSON · caché 24h

Genera una misión personalizada al historial del usuario. Placeholders disponibles: {totalOrders} {streakDays} {uniqueNucleos} {hasOrderedAtNight} {totalSpend} {referralCount} {recentItems} — Respuesta DEBE ser JSON con: icon, title, description, conditionType, conditionParam, requiredCount, pointsReward.

📸 Booth IA

Ajusta la inspiración visual de la foto del ticket. El sistema mantiene guardas fijas: cara visible, 1:1, fondo claro, sin props tapando. Lo que escribas aquí se usa como inspiración secundaria para nuevas fotos.

Motor editable del booth

Estas reglas se combinan con la inspiracion de arriba. Los cambios aplican a fotos nuevas.

Cada tarjeta controla un estilo que el cliente puede elegir o que el modo sorpresa puede tomar al azar. Deja un campo vacio para usar el default del sistema.

Prompt final que se enviara al modelo

            

Los retos activos aparecen automáticamente en la app del cliente. El progreso se calcula a partir de las órdenes de la semana en curso (lun–dom).

Cargando retos…

Las misiones dinámicas se evalúan automáticamente contra los datos del usuario (pedidos, rachas, referidos, etc.) cada vez que paga en el kiosco. Crea condiciones y el sistema calcula progreso solo.

Cargando misiones…

Promos en vivo: Happy Hour, Reto Relámpago, etc. Al lanzarlas, todos los clientes conectados ven un banner y el bonus se aplica solo en cada compra del kiosco durante la ventana. Termina cuando alcanza la capacidad o al expirar.

⚡ Lanzamiento rápido

Lanzamiento personalizado

Cargando misiones…
Tipos: ■ String ■ Int ■ Float ■ DateTime ■ Bytes ■ Boolean ? = nullable  ·  PK = clave primaria  ·  FK = clave foránea  ·  M2M = tabla junction
👤 Usuarios & Autenticación
User 25 campos
id String PK uuid
email String @unique
password String?
role String CUSTOMER | CASHIER | ADMIN
pointsBalance Int tokens SKZO
skzoBalance Float saldo monetario $
streakCount Int
xpPoints Int XP acumulado (nunca baja)
loginPin String? PIN kiosco 4-char
pinExpiry DateTime? vence 30 min
referralCode String? @unique
referredBy String?
avatarUrl String?
avatarData Bytes? binario avatar persistente
emailVerified Boolean
verifyToken String?
lastVisit DateTime?
→ Order[] · Photo[] · PointTransaction[] · WalletTransaction[] · UserBadge[] · RewardClaim[] · QrMissionCompletion[] · PushSubscription[]
PushSubscription
id String PK
userId String FK→User
endpoint String @unique URL push
p256dh String
auth String
createdAt DateTime
💸 Transacciones
PointTransaction
id String PK
userId String FK→User
amount Int + ganados / − gastados
type String WELCOME | ORDER | REDEEM | REFERRAL | STREAK | MISSION | MANUAL
description String
orderId String? FK→Order
createdAt DateTime
WalletTransaction
id String PK
userId String FK→User
amount Float + crédito / − débito $
type String RECHARGE | PAYMENT | REFUND | MANUAL
description String
orderId String? FK→Order
createdAt DateTime
📦 Pedidos
Order
id String PK uuid interno
externalId String? trackingId del frontend (8-char random)
userId String? FK→User (null = anónimo)
branchId String SUCURSAL_1 | DELIVERY
totalPrice Float
status String PENDING | PREPARING | READY | COMPLETED
orderType String LOCAL | DELIVERY
deliveryAddress String?
customerEmail String?
aiPhrase String? frase SKZO Vision
aiImageUrl String?
→ OrderItem[]
OrderItem
id String PK
orderId String FK→Order
productId String ref MenuItem.id
name String snapshot del nombre
price Float
quantity Int
type String NUCLEO | CARGA | UPGRADE
🍜 Menú & Recetas
MenuItem
id String PK
category String nucleo | carga | upgrade
name, img, desc, emoji String
price Float
available Boolean
sortOrder Int
→ MenuItemIngredient[]
Ingredient
id String PK
code String @unique ej. ING-001
name, category, unit String
stock, minStock Int
status String OK | LOW | CRITICAL
→ MenuItemIngredient[]
MenuItemIngredient M2M
menuItemId String FK→MenuItem
ingredientId String FK→Ingredient
quantity Int unidades por porción
@@unique([menuItemId, ingredientId])
🎮 Gamificación
GamificationBadge
id, icon, name, description
conditionType String POINTS | STREAK | ORDERS | MISSIONS | REFERRALS
requirementValue Int
→ UserBadge[]
GamificationMission
id, icon, title, description
pointsReward Int default 100
requiredCount Int veces a completar
GamificationReward
id, icon, name
cost Int costo en tokens
GamificationLevel
id, icon, name
threshold Int XP mínimo para alcanzar
benefit String
UserBadge M2M
userId String FK→User
badgeId String FK→GamificationBadge
earnedAt DateTime
@@unique([userId, badgeId])
📸 Booth & Media
Photo
id String PK
userId String? FK→User (null = anónimo)
imageUrl String URL foto original
aiImageUrl String? CDN Replicate (puede expirar)
aiImageData Bytes? binario IA persistente en BD
rawImageData Bytes? binario foto original persistente en BD
promptUsed String?
createdAt DateTime
🎯 Misiones QR & Recompensas
QrMission
id, title, description, emoji
points Int
type String PRESENCE | PHOTO
hint String pista ubicación
active Boolean
→ QrMissionCompletion[]
QrMissionCompletion M2M
missionId String FK→QrMission
userId String FK→User
createdAt DateTime
@@unique([missionId, userId])
RewardClaim
id, rewardId?, rewardName
userId String FK→User
code String @unique voucher
used Boolean
usedAt DateTime?
expiresAt DateTime
⚙️ Sistema & Logs
Employee
pin String @unique 4-char
name String
role String STAFF | CASHIER | CHEF | ADMIN
status String ACTIVE | INACTIVE
EventLog
id String PK
userId String? null = anónimo
type String LOGIN_PIN | ORDER_CREATED | QR_SCANNED | REFERRAL_USED…
meta String JSON contexto adicional
ip String?
AuditLog
id String PK
action String MENU_UPDATE | STOCK_ADJUST…
userId String?
details String
AppConfig
key String PK
value String
updatedAt DateTime
referral_reward_amount=30 · referral_min_purchase=200 · kds_alarm_minutes=10

Cargando…

Compone correos promocionales y envíalos a un segmento de clientes. Respeta automáticamente User.emailReceiptOptOut. Variables soportadas: {nombre} {tokens}.

Cargando campañas...

Promueve el campo Ingredient.supplier a tabla persistente con email/teléfono/lead time. Permite enviar Órdenes de Compra por correo al proveedor desde Pronóstico → OCs.

Cargando proveedores...

Registro de entrada y salida del personal. El empleado teclea su PIN en la terminal y el sistema deduce si es check-in o check-out automáticamente.
Terminal de checado
El empleado teclea su PIN y mira a la cámara. El sistema verifica tu rostro con IA antes de registrar.
📷 Cámara
Cámara desactivada
Encuadra tu rostro dentro del círculo punteado.
La foto se captura al tocar ✓.
🔢 PIN

👥 Trabajando ahora

Cargando…

📋 Histórico de asistencia

Cargando…

Cargando catálogo…
+ Línea libre (no está en catálogo)
Un embajador gana un % de cada cuenta pagada de las cuentas que tiene vinculadas; el bono cae en su monedero skzo (saldo real). También puedes adjudicar tokens a mano.
Cargando…
Cada evento del sistema (orden pagada, stock crítico, requerimiento de insumos, etc.) puede disparar un POST a un endpoint externo — por ejemplo un flujo de n8n que reenvía a WhatsApp. El body va firmado con HMAC-SHA256 (header X-Skzo-Signature).
Cargando…

Entregas recientes

Documentos de operación para el personal: procesos, menú, recetas, manuales. Sube PDF, imágenes u otros archivos. Esto es distinto de Docs del Sistema (documentación técnica de la plataforma).
Cargando…