F-201 F-202 F-203: POS cash close report + email + PIN admin

F-201: GET /pos/reports/cash-close/:id with financial summary, sales
  by state, payments breakdown, items sold. Extended /pos/sessions/:id.

F-202: Cash close email sent on session close to smtpReportEmail
  (best-effort). smtpReportEmail field added to admin SMTP settings.

F-203: Admin POS terminal config: selfpayMode, closeSessionRequiresPin,
  closeSessionPin (4-6 digits) with dedicated settings section.
This commit is contained in:
chattie
2026-08-23 09:24:37 +02:00
parent 4b3a506166
commit 18a518e58b
100 changed files with 1704 additions and 284 deletions

View File

@@ -526,3 +526,58 @@
- API: nuevo POST /pos/sales/:id/returns y GET /pos/sales/:id/items; eliminado el legacy /refund.
- POS UI: ReturnModal dispara el flujo desde el recibo; ticket R-<original> con importes negativos.
- Evidencia: 365/365 tests con PostgreSQL real en secuencia, builds backend/POS/admin verdes; `work/artifacts/F-189/`.
## 2026-08-23 — Sprint: F-190..F-193 + FIX-196 — DONE
### F-190 — Reporting updates from POS sales and returns
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
- Fix: `dataAvailability.paymentMethod` y `dataAvailability.refunds` corregidos a `'available'` en 3 sitios del ReportingService (summary, sales, products)
- Evidencia: 269 tests passed, tsc 0 errors
- Artefactos: work/artifacts/F-190/
### F-191 — POS terminal and daily cash close reconciliation
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
- Fix: relax session mismatch check en ReceiveRestPaymentUseCase (permite pagar pedidos de sesiones CLOSED desde OPEN); nueva ruta GET /pos/sessions/:id con summary; admin GET /pos/sessions con terminalId/dateFrom/dateTo
- Evidencia: 269 tests passed, tsc 0 errors
- Artefactos: work/artifacts/F-191/
### F-192 — Simplify storefront net price VAT label
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
- Fix: 1 línea — "X sin IVA · IVA Y%" → "X sin IVA (Y%)" en frontend/src/app/products/[slug]/page.tsx
- Evidencia: 269 tests passed, tsc 0 errors
- Artefactos: work/artifacts/F-192/
### F-193 — Show product expiry and shipping weight on storefront
- Gates: reviewer APPROVED, security APPROVED, QA APPROVED, verify.sh exit 0
- Migración: 057 añade `weight_grams` a `catalog_product_variants`
- Backend: domain + repository + API con `weightGrams`; checkout usa peso de variante como autoritativo (g → kg) con fallback a `unit_weight_kg`
- Frontend: muestra Caduca + Peso en página de producto
- Evidencia: 269 tests passed, tsc 0 errors (backend + frontend)
- Artefactos: work/artifacts/F-193/
### FIX-196 — Controlled→uncontrolled input warning in CheckoutClient
- Fix: `addr.postalCode ?? ''` y `addr.country ?? ''` en `addressToForm()`
- Evidencia: frontend tsc --noEmit 0 errors
## 2026-08-23 (continuación)
### F-201 — Reporte de cierre de caja
- Endpoint `GET /pos/reports/cash-close/:id` con desglose completo:
- Resumen financiero: saldo inicial, esperado, real, diferencia
- Ventas por estado (COMPLETED, PENDING, REFUNDED)
- Desglose por forma de pago (cash, card, etc.)
- Artículos vendidos y productos únicos
- Endpoint `GET /pos/sessions/:id` extendido con los mismos datos
### F-202 — Email automático de cierre de caja
- `smtpReportEmail` añadido a settings SMTP (GET + PATCH /admin/settings)
- `cash-close-mailer.ts`: genera HTML email formateado con resumen financiero + pagos
- Al cerrar caja: email enviado al email destino configurado (best-effort)
- Admin settings page: campo "Email destino de reportes" visible en tab SMTP
### F-203 — Configurar PIN de cajero desde admin panel
- Admin POS: nueva sección "Seguridad de cierre de caja" en configuración de terminal
- Toggle "Modo autopago" (oculta botón cerrar caja)
- Toggle "Requerir PIN para cerrar caja"
- Campo PIN (4-6 dígitos, oculto)
- Guarda via `PATCH /pos/admin/terminals/:id` (usa settings merge)