# Plan ERP — POS Retail + Ventas Mayoristas

Plan completo para fortalecer seguridad, auditoría, multi-moneda, productos con variantes, crédito de clientes, y ventas mayoristas.

> **Leyenda:** ✅ Implementado | ⚠️ Parcial | ❌ Pendiente | 🔄 Reemplazado

---

## Estado Actual (YA existe — no reimplementar)

- ✅ **Seguridad Fase 1**: PIN supervisor, `autorizaciones_caja`, `dispositivos_autorizados`, 15 privilegios POS, `sesion_caja_documentos`, `arqueo_caja_detalle`
- ✅ **Sesiones de caja**: Apertura/cierre con autorización, fingerprint, montos por medio de pago, bloqueo
- ✅ **Movimientos de caja**: Autorización, categoría, moneda, cotización
- ✅ **Arqueo**: Parcial/cierre, detalle por denominación/moneda, diferencia permitida
- ✅ **POS Config**: Tipo documento, fondo fijo, flags autorización
- ✅ **Auditoría**: `audit_logs` con old/new value JSON, IP, user_agent, `caja_id`, `sesion_caja_id`
- ✅ **Multi-moneda parcial**: `cotizacion_moneda`, `empresa_monedas`, moneda en factura/movimientos
- ✅ **Inventario**: `stock_deposito`, `movimientos_inventario`, depósitos por sucursal, `deposito_id` en `factura_det` y `nota_credito_det`
- ✅ **Listas de precios**, **Planes de cuotas**, **Ofertas**, **Compras**, **Cobranzas**, **Anulación retail + SIFEN**
- ✅ **NC + Reversión SIFEN**: Stock se devuelve al crear NC, se descuenta al cancelar/inutilizar NC (eventos ECAN/EINU)

---

## FASE 1 — Completar Seguridad de Caja y Auditoría ⚠️

### 1.1 Autorización remota / desde otra terminal ⚠️

- ✅ **Backend**: WebSocket gateway `PosGateway` (`src/pos-gateway/`) con `notificarSolicitudAutorizacion`, `notificarAutorizacionAprobada`, `notificarAutorizacionRechazada`, `notificarCambioSesion`
- ✅ **Endpoints**: `AutorizacionesCajaService` con `solicitar`, `aprobar`, `rechazar`, `getPendientes`, `getHistorial`, `validarToken`
- ❌ **Frontend POS**: Falta modo "esperando autorización" con countdown + WS en `POSRetailTemplate`
- ✅ **Frontend Supervisor**: `PanelSupervisor.jsx` con WebSocket en tiempo real, aprobar/rechazar con PIN, historial, indicador de conexión
- ✅ **DB**: No requiere cambios (tablas ya existen)

### 1.2 Arqueos parciales desde UI ✅

- ✅ **Backend**: `POST /tesoreria/arqueo/:sesion_id` — crea arqueo con `tipo_arqueo: 'parcial'` sin cerrar sesión
- ✅ **Frontend**: Implementado en `POSRetailTemplate`, `POSAdminTemplate` y página `Tesoreria`
- ✅ **Si diferencia > permitida** → autorización requerida

### 1.3 Devoluciones (parciales, diferente de anulación) 🔄

- 🔄 **REEMPLAZADO**: No se necesita módulo separado de devoluciones. El stock se maneja íntegramente vía **Notas de Crédito + eventos SIFEN**:
  - Al crear NC → stock se **suma** (devuelve al inventario) usando `deposito_id` de `factura_det` o depósito principal
  - Al cancelar/inutilizar NC (ECAN/EINU aprobado) → stock se **descuenta** de nuevo
  - `nota_credito_det.deposito_id` almacena el depósito destino para reversiones precisas
  - Módulo `devoluciones` fue eliminado del backend y frontend

### 1.4 Auditoría avanzada ⚠️

- ⚠️ **DB**: `audit_logs` ya tiene `caja_id` y `sesion_caja_id` con índices. Falta `terminal_id`
- ✅ **Backend**: `AuditInterceptor` global captura todas las mutaciones automáticamente (POST/PUT/PATCH/DELETE)
- ⚠️ **Frontend**: `ReporteAuditoria.jsx` y `AuditoriaLogs.jsx` existen. Pendiente: filtros avanzados por caja/sesión, diff visual de cambios

---

## FASE 2 — Multi-Moneda Completa + Control de Crédito ❌

### 2.1 Multi-moneda en POS ⚠️

- ⚠️ **Backend**: `MonedasService` tiene `getUltimaCotizacion()`, `createCotizacion()`, `findCotizacionByFecha()`. Falta: validar conversión en `createFactura`, diferencia cambiaria, cierre por moneda
- ❌ **DB**: Faltan `factura_forma_pagos.monto_moneda_original`, `sesiones_caja.resumen_monedas` (JSONB)
- ❌ **Frontend**: Falta selector moneda por forma de pago, cotización en tiempo real, pago mixto multi-moneda, resumen cierre por moneda. ✅ Ya existe UI para cargar cotización diaria

### 2.2 Control de crédito de clientes ❌

- ❌ **DB** en `clientes`: Faltan `limite_credito`, `saldo_pendiente`, `moneda_credito`, `bloqueado_credito`, `fecha_ultimo_pago`, `dias_mora_maximo`
- ❌ **Backend**: Falta `verificarCredito()`, `actualizarSaldoPendiente()`, hook en createFactura para validar, job periódico para bloqueo automático
- ❌ **Frontend POS**: Falta badge saldo/crédito al seleccionar cliente, bloqueo con override supervisor, sección crédito en ficha cliente

---

## FASE 3 — Productos con Variantes y Presentaciones ❌

### 3.1 Atributos y variantes (padre/hijo) ⚠️

**DB — Tablas creadas:**

- ✅ `producto_atributos` — (Talla, Color, Material...) por empresa
- ✅ `producto_atributo_valores` — (S, M, L, XL; Rojo, Azul...)
- ✅ `producto_variante_valores` — valores específicos de cada variante (link producto↔atributo_valor)
- ✅ Campos en `productos`: `es_padre`, `producto_padre_id` + self-relation `producto_variantes_rel`

**Regla clave**: Cada variante es un producto real con su propio precio, stock, código de barras. Si no tiene imagen, hereda del padre.

- ✅ **Backend**: CRUD atributos/valores (`src/producto-atributos/`), generador automático de variantes (`POST /productos/:id/variantes`), listado de variantes (`GET /productos/:id/variantes`), búsqueda unificada padre→variantes con presentaciones
- ✅ **Backend**: `findOne` devuelve atributos, presentaciones, variantes hijas. `search` incluye `es_padre`, presentaciones, búsqueda por código de barras de presentaciones
- ❌ **Frontend**: Toggle "tiene variantes" en ABM, generador de combinaciones, en POS: popup selector de variante al elegir padre, búsqueda por SKU/barcode va directo a variante

### 3.2 Presentaciones (unidad/caja/paquete) ⚠️

- ✅ **DB**: Tabla `producto_presentaciones` — nombre, abreviatura, `factor_conversion`, código barras, precio opcional, `es_default`, orden
- ✅ **Backend**: CRUD presentaciones (`src/producto-presentaciones/`), búsqueda por código de barras de presentación integrada en `search`
- ❌ **Frontend POS**: Selector de presentación al agregar, precio dinámico según presentación

---

## FASE 4 — Módulo de Ventas Mayoristas ⚠️

### 4.1 Pedidos / Proformas ⚠️

**DB — Tablas creadas:**

- ✅ `pedidos` — empresa, sucursal, cliente, vendedor, moneda, condición, lista de precios, totales, estado (borrador→confirmado→en_caja→facturado→cancelado), vigencia, observaciones
- ✅ `pedido_detalle` — producto, presentación, cantidad, precio negociado, precio original, descuento, subtotal, IVA
- ✅ `pedido_historial` — log de cambios de precio/cantidad durante negociación

**Backend (`src/pedidos/`):**

- ✅ `PedidosService`: CRUD completo, calcular totales con lista de precios del cliente, recálculo automático
- ✅ `PedidosService.confirmar()`: Generar número de pedido secuencial (PED-0000001)
- ✅ `PedidosService.cancelar()`: Cancelar pedido con motivo
- ✅ `PedidosService.marcarEnCaja()`: Marcar como en caja para cobro
- ✅ `PedidosService.marcarFacturado()`: Vincular factura al pedido
- ✅ Items: agregar, modificar (cantidad, precio negociado, presentación), eliminar con recálculo
- ✅ Historial completo de acciones (creado, item_agregado, item_modificado, precio_negociado, confirmado, cancelado, facturado)
- ✅ Endpoint `GET /pedidos/pendientes-caja` para POS retail
- ❌ `PedidosService.convertirAFactura()`: Crear factura automáticamente desde pedido (integración completa con FacturasService)

**Frontend (`src/pages/PedidosMayoristas.jsx` + `src/components/pedidos/`):**

- ✅ API service completo (`src/api/pedidos.service.js`): CRUD, items, estados, consultas
- ✅ Página `PedidosMayoristas`: layout split-panel (catálogo + carrito), ruta `/pedidos-mayoristas`
- ✅ `ClienteSelector`: búsqueda por razón social/RUC/documento, selección para iniciar negociación
- ✅ `CatalogPanel`: búsqueda de productos con grid responsive, imágenes, stock, código barras
- ✅ Selector de presentación (unidad/caja/pack) con precios por presentación en cada producto
- ✅ `CartPanel`: carrito de negociación con cantidades editables (+/-/click), precio negociado editable inline
- ✅ Muestra: precio lista (tachado), precio negociado (verde), % descuento automático, subtotales
- ✅ `PedidoHeader`: estado del pedido con dot+tag, chip de cliente, botón nuevo pedido
- ✅ Confirmar pedido → genera número PED-XXXXXXX, Cancelar con motivo
- ✅ Sidebar entry "Mayoristas" con icono handshake
- ❌ Impresión de comprobante/proforma al confirmar
- ❌ El pedido aparece en cola del POS retail para cobro (endpoint existe, falta UI en POS)

### 4.2 Cobro de pedidos en caja ❌

- ❌ **Frontend POS**: Botón "Cobrar Pedido" → lista de pedidos confirmados pendientes → seleccionar → cargar como venta precargada → cobrar normal
- ❌ **Backend**: Al facturar pedido, actualizar estado pedido, liberar reserva de stock, descontar stock real

### 4.3 Panel de vendedor mayorista ❌

- ❌ Dashboard con: pedidos del día, metas, comisiones acumuladas
- ❌ Historial de negociaciones por cliente
- ❌ Catálogo con precios según lista asignada al cliente

---

## Mejoras Adicionales Recomendadas

### Performance POS ⚠️

- ✅ **Redis cache**: Módulo Redis implementado (`src/redis/`), usado en auth y referenciales. Pendiente: cache de productos frecuentes, cotizaciones del día
- ✅ **Búsqueda optimizada**: Índice trigram existe en productos para búsqueda fuzzy rápida
- ✅ **Offline-first mejorado**: PWA completa con Service Worker (Workbox), `SyncStore`, `useOfflinePOS`, Dexie.js (IndexedDB), `SyncStatusBar`, auto-sync cada 5min, push de ventas offline

### Reportes ⚠️

- ❌ **Reporte de cierre Z**: Consolidado fiscal diario por caja
- ❌ **Reporte X**: Lectura parcial sin cerrar
- ✅ **Dashboard gerencial**: `DashboardTemplateV2` con ventas por hora, ticket promedio, productos top, comparativa con período anterior, desglose por categoría
- ❌ **Reporte de merma**: Diferencias de arqueo acumuladas por cajero

### Integración ⚠️

- ✅ **Lector de código de barras**: Detección automática por timing de keystrokes (`BARCODE_SCAN_THRESHOLD_MS=80`), auto-add al carrito, config `barcode_auto_add`
- ❌ **Balanza electrónica**: Para productos por peso
- ❌ **Gaveta de dinero**: Apertura automática con comando ESC/POS

---

## Riesgos y Mitigaciones

| Riesgo                                                        | Impacto                   | Mitigación                                                                                               |
| ------------------------------------------------------------- | ------------------------- | -------------------------------------------------------------------------------------------------------- |
| Variantes multiplican registros de productos exponencialmente | Performance degradada     | Lazy loading, paginación, índices compuestos en variantes                                                |
| Multi-moneda introduce diferencias de redondeo                | Descuadres contables      | Usar 4 decimales internos, redondear solo en presentación, registrar diferencia cambiaria explícitamente |
| Pedidos mayoristas sin cobrar acumulan stock reservado        | Stock fantasma            | TTL en reservas (48h), job que libera reservas vencidas                                                  |
| Autorización remota depende de conectividad                   | Cajero bloqueado          | Fallback a PIN local siempre disponible                                                                  |
| Offline POS con multi-moneda                                  | Cotización desactualizada | Cachear última cotización, flag "cotización offline" en factura para revisión posterior                  |
| Devoluciones parciales complejizan conciliación SIFEN         | NC rechazadas             | Validar reglas SIFEN antes de emitir, cola de reintentos                                                 |

---

## Resumen de Fases

| Fase        | Alcance                                     | Estado  | Pendiente                                                                                      |
| ----------- | ------------------------------------------- | ------- | ---------------------------------------------------------------------------------------------- |
| **1**       | Seguridad completa + NC/SIFEN + auditoría   | ⚠️ ~85% | Frontend POS "esperando autorización", filtros avanzados auditoría, `terminal_id`              |
| **2**       | Multi-moneda POS + control crédito clientes | ❌ ~10% | DB multi-moneda, integración POS, control crédito completo                                     |
| **3**       | Variantes + presentaciones                  | ⚠️ ~60% | Backend completo. Pendiente: frontend ABM variantes, POS variante selector, POS presentaciones |
| **4**       | Ventas mayoristas completas                 | ❌ 0%   | Todo pendiente (depende de F2 + F3)                                                            |
| **Mejoras** | Performance, reportes, integración          | ⚠️ ~50% | Reportes Z/X, merma, balanza, gaveta                                                           |

**Próximo paso recomendado:** Completar los pendientes menores de Fase 1, luego abordar Fase 2.
