# Grano POS v2 — base offline-first

## Ejecutar en la red local

```bash
cd outputs
python3 server.py
```

Abrir `http://IP-DE-LA-COMPUTADORA:8080/punto-de-venta-cafeteria.html` en cada dispositivo. La primera visita requiere conexión con el servidor; después la PWA puede abrir su interfaz sin red.

## Alcance de esta fase

- Interfaz instalable como PWA.
- Caché offline de la aplicación.
- Identificador único por dispositivo.
- Cola durable de eventos en IndexedDB.
- Reintento automático y sincronización cada 30 segundos.
- Servidor central de desarrollo con SQLite, WAL e idempotencia.
- Fusión por entidad en lugar de reemplazo total de datos.
- UUID para ventas y eventos creados sin conexión.
- Inventario basado en movimientos acumulables por producto.
- Marcas de baja para impedir que comandas entregadas reaparezcan.
- Resolución por fecha para cambios administrativos sobre la misma entidad.
- Inventario por ingredientes y recetas con movimientos trazables.
- Combos que descuentan automáticamente cada producto o ingrediente incluido.
- Promociones 2×1 o porcentuales por producto, cantidad, día, horario y cupón.
- División equitativa de cuenta, propinas y pagos combinados.
- Dos flujos operativos: cobro inmediato o cuenta abierta para pagar después.
- Indicadores de cantidad sobre cada producto y cobro posterior desde la comanda o mesa.
- Directorio de clientes, historial de compra, puntos configurables y canje en caja.
- Adaptador de terminal bancaria con simulación y conexión a un proveedor mediante `POS_PAYMENT_URL`.
- Impresión directa por la cola del sistema con `POS_PRINTER`, además del modo navegador.

## Integraciones físicas

El modo simulación permite validar cobros e impresión sin hardware. Para producción, reinicia el servidor definiendo el adaptador de la terminal y la impresora registrada en el sistema:

```bash
POS_PAYMENT_URL=http://127.0.0.1:9000/charge POS_PRINTER=EPSON-TM-T20 python3 server.py
```

El adaptador bancario debe responder JSON con `status: "approved"` y una referencia. Las llaves y credenciales permanecen en el servicio del proveedor, nunca en el navegador.

En **Ajustes → Terminal, impresión y lealtad**, el POS consulta `/api/printers` para mostrar las impresoras instaladas y `/api/terminals` para listar proveedores. Mercado Pago Point puede utilizarse inicialmente como cobro manual confirmado; la integración automática se habilita al configurar el adaptador del proveedor.

## CFDI, compras y utilidad

- Bandeja CFDI 4.0 con datos de emisor y receptor, borradores individuales, borrador global y motivos de cancelación.
- Los borradores se identifican como documentos sin validez fiscal. El timbrado exige configurar `POS_PAC_URL` con un PAC y mantener CSD/credenciales fuera del navegador.
- Catálogo de proveedores, compras por ingrediente, costo unitario promedio y entradas automáticas de inventario.
- Mermas con motivo, costo e impacto inmediato en existencias.
- Costo de receta, costo vendido y utilidad estimada por ventas menos mermas.

## Conflictos cubiertos

- Dos dispositivos pueden registrar ventas simultáneas sin que una sustituya a la otra.
- Reenviar el mismo evento no duplica la operación.
- Las salidas de inventario de varios dispositivos se suman.
- Una comanda entregada permanece eliminada después de sincronizar.
- Cancelaciones y devoluciones conservan el estado más reciente.

Este servidor es para pruebas de arquitectura en una red controlada. Antes de exponerlo a Internet se debe añadir HTTPS, autenticación de dispositivos, PostgreSQL, cifrado de secretos, control por sucursal, resolución de conflictos por entidad y respaldos administrados.
