# Farmacia FASSID v1.4.0 — cobro continuo y adaptación móvil

## Actualizar desde v1.3

1. Respalda la base y conserva tu `.env`, APP_KEY y archivos propios de storage. Reemplaza el código y vendor del backend por los del nuevo ZIP.
2. Ejecuta `ACTUALIZAR.bat` en Windows. En Linux: `php artisan optimize:clear` y `php artisan migrate --seed --force`. No ejecutes migrate:fresh ni regeneres APP_KEY sobre una instalación existente.
3. Reemplaza el frontend y recompila con tu VITE_API_URL habitual: `npm ci`, `npm run build`. Publica todo el contenido de dist, incluida denominaciones.

Se conservan los puertos 8016/5184. Mantén tu configuración de HTTP o HTTPS y los orígenes FRONTEND_URL que ya funcionan; usa el protocolo exacto con el que abres el frontend. El ZIP no incluye .env ni cuentas de acceso precreadas. El dist incluido apunta a localhost:8016 y debe recompilarse para tu IP o dominio.

## Anular QR conservando la venta

- El carrito ya no se vacía al generar un QR. Mientras el cobro está activo, las cantidades y el descuento quedan bloqueados; puedes cerrar el modal y abrirlo nuevamente con Ver cobro QR.
- Al pulsar Anular QR, primero se consulta el pago. Si el proveedor ya recibió el dinero, se conserva ese pago y se sigue el flujo de confirmación; no se habilita otro cobro de la misma venta.
- Cuando el proveedor acepta la anulación, se liberan sus reservas y se vuelve a Cobrar venta dentro del POS, conservando productos, cantidades, cliente, descuento, receta y prescriptor. Se permite efectivo, transferencia, tarjeta o un nuevo QR con otro identificador.
- El retorno recupera los precios y la disponibilidad actuales. Si hubo una modificación mientras se esperaba el pago, se muestra el total actualizado y el servidor vuelve a validar los productos.
- La contraseña del regente no se conserva: si corresponde receta, se solicita su revisión de nuevo al cambiar de cobro.
- Si no se confirma la anulación, se mantiene el intento pendiente y no se habilita un cobro alternativo de ese carrito. Se puede consultar o reintentar.
- Al recargar o salir y regresar al POS en la misma sesión del navegador, se recupera el intento QR activo. Los intentos también siguen en Cobros QR. En un intento anulado o vencido, Retomar venta / otro medio recupera su borrador en el POS.

## Tiempo de cobro del QR

En Configuración → Cobros QR, cada proveedor y ambiente dispone de **Tiempo para pagar el QR**, entre 1 y 60 minutos, predeterminado **3 minutos**. Solo afecta a nuevos intentos; cada QR conserva el plazo con el que fue creado. Los QR previos a v1.4 mantienen su vencimiento anterior.

El modal muestra una cuenta regresiva calculada con la hora del servidor. Al llegar a cero, deja de mostrar la imagen y consulta el banco. Si ya se pagó, se conserva el pago. Si sigue sin pagar, solicita la anulación; solo después de la aceptación se marca vencido, se liberan unidades y vuelve al selector de medios.

**Límite del contrato bancario:** la documentación recibida de BNB y SIP solo permite enviar una fecha de vencimiento, sin hora/minutos. Por eso los 3 minutos son un plazo de cobro gestionado por el sistema con solicitud de anulación al proveedor. No se promete que el banco invalide un PNG descargado exactamente al segundo 180. Si la conexión o la anulación fallan, el QR puede seguir vigente en el banco hasta que acepte la anulación o su vencimiento bancario; se conserva la reserva y se exige resolverlo antes de cobrar por otro medio. Un pago que el banco informe como recibido se atiende aunque haya transcurrido el contador.

Para gestionar el plazo aunque cierres el navegador, el planificador debe estar activo:

```cron
* * * * * cd /var/www/farmacia/backend && php artisan schedule:run >> /dev/null 2>&1
```

En pruebas locales Windows, deja otra terminal abierta dentro del backend con:

```bat
php artisan schedule:work
```

El planificador consulta cada minuto, sujeto a conectividad y carga. Con el modal abierto, se consulta cada 8 segundos y al cumplirse el plazo. Los cambios de ambiente o credenciales no alteran la conexión cifrada guardada en intentos existentes.

## Menú y pantallas

- Escritorio: botón Contraer / Expandir menú. En modo contraído quedan los iconos y sus títulos; la preferencia se conserva en el navegador.
- Móvil y tableta: con ancho menor de 1024 px se utiliza hamburguesa y panel lateral superpuesto. Se cierra al elegir una sección, tocar fuera, pulsar X o Escape. El foco permanece dentro del menú abierto y se restituye al cerrarlo.
- El diseño responde al ancho disponible y a pantallas táctiles; no depende del nombre del dispositivo. Cambiar orientación adapta el menú.
- Ventas, compras, clientes y QR pasan a tarjetas con etiquetas en teléfonos. Los catálogos y tablas de detalle anchas mantienen desplazamiento dentro de su contenedor, sin desplazar toda la página.
- Formularios y modales adaptan columnas, botones y altura; se bloquea el desplazamiento de fondo al abrirlos. Se conservan los temas claro, oscuro y del equipo, los iconos y los formatos de impresión.

## Antes de preproducción

Las pruebas incluidas verifican contratos mediante respuestas bancarias controladas. Falta validar con las credenciales asignadas por BNB/SIP la autenticación, generación, consulta, anulación, la situación de pago simultáneo a la anulación y el callback público SIP. Confirma también el planificador y las impresoras reales. No se añadieron pagos simulados a la aplicación entregada.
