🗺️ Cadena de Valor & Flujo Operativo End-to-End
Cómo viaja la mercadería, el dinero y los datos fiscales en todo el grupo
Persistencia de Sanciones y Override Supervisor (E15)
PR #3073 · PR #3097
El Dolor (Emergencia E15): Sanciones y deducciones aplicadas en el expediente del empleado se perdían al cambiar de ciclo o tienda, distorsionando el cálculo de planilla.
Sanción aplicada ──► Validación con Supervisor
│
▼
Persistencia con auditoría en EmployeeSanction ✅
Traslado de Tienda Invalida Supervisor y Metas Viejas
PR #3080 (Mergeado)
El Dolor Resuelto: Al mover a un vendedor a otra sucursal, seguía reportando comisiones al supervisor de la tienda anterior y arrastraba metas cruzadas.
Cambio de Sucursal ──► Transacción Atómica:
├─► Invalida SellerGroup tienda vieja
├─► Desasigna Supervisor anterior
└─► Inicializa metas en tienda nueva ✅
Recepción Atómica PI > 0 (E8, E10, E16)
Fix prometido
El Dolor (Emergencias E8/E10/E16): Tiendas aceptan transferencias, el estado dice "Aceptada", pero `ProductInventory` queda en 0. Mercadería física en tienda pero no facturable.
Tienda hace "Recibir" ──► DB Transaction Atómica:
├─► Transfer.status = 'completed'
├─► ProductInventory::increment(qty)
└─► Ledger::record(IN)
¿PI incrementado? ──NO──► ROLLBACK TOTAL ❌
──SÍ──► Confirmado ✅
Lote r7 Emilia: Traslados, Packing y Pedidos
PR #3079 (5 PRs)
El Dolor Resuelto: 97/100 cuentas de banco salían vacías en traslados y 5,176 traslados cross-empresa mostraban cuentas ajenas. Packing no mostraba responsable ni orden.
- • #2680: Tienda receptora ve cuenta origen (97 vacías → 0).
- • #2676: Cuenta destino cross-empresa en SU base (5,176 corregidos).
- • #3042: Packing muestra responsable y apoyos del surtido.
- • #3044: Pedidos muestra order_number en packing.
- • #3062: Coordinar packing exige tienda asignada.
Lote r8 Emilia: Metas, Aviso Cliente y Surtido
PR #3088 (6 PRs)
Alcance: Metas de surtido, aviso automático al cliente, fecha programada de traslado, packing y optimización de surtido CD (#3075, #3077, #3084, #2996, #3060, #3063).
Tratamiento de SKUs Huérfanos y Ubicaciones
PR #3085
El Dolor: Productos dados de alta sin lote o sin asignación de ubicación física bloqueaban la consulta de inventario por pasillo.
Conversión Cotización con Fecha Real (E1)
PR en cola (PRO-000143)
El Dolor (Emergencia E1): Cotizaciones hechas ayer al convertirse hoy a factura conservaban la fecha de ayer (`invoice_date=2026-09-17`), generando reparo fiscal SAR.
Cotización COT-000033 (Fecha: Ayer)
│
▼ [Acción: Convertir a Factura]
Factura PRO-000143: invoice_date = now() (NUNCA hereda fecha vieja) ✅
RTN de Empresa Emisora en Facturas (E6)
En Producción (1 sem)
Cerrado y Verificado: Los 6 RTN actualizados + logo + nombre de comerciante individual o conglomerado. Editable, revisado y operando en producción.
Emisión de Factura ──► Consulta tenant.company_rtn
│
▼
Inyección obligatoria en cabecera de PDF y Ticket Térmico ✅
Guard contra Facturar Proformas Anuladas (Crédito + Contado)
PR #3107 · PR #3109
Blindaje Completo de 2 Puntas: PR #3107 bloquea la conversión a crédito en InvoiceService y PR #3109 bloquea el cobro por caja/banco en PaymentRepository. 101 tests pasando.
- • Vía Crédito (#3107):
$invoice->isVoided()en transición a pagaré. - • Vía Contado (#3109): Rechaza cobro de proforma anulada antes de emitir CAI.
Cotización no Exige Caja Abierta al Guardarse
PR #3100
El Dolor: Guardar una cotización (que no mueve dinero ni rebaja inventario) bloqueaba al vendedor diciendo "Abre la caja primero".
Interlock Proforma vs Factura (ADR-003)
PR #3059
El Dolor: Cajeros entregaban mercadería con proformas pensando que eran ventas finales. La proforma no rebajaba stock ni sumaba comisiones.
Cobro con Proforma ──► BLOQUEO: "Convertir a Factura"
│ (skipStock=true, sin comisiones)
▼
Conversión a Factura ──► Rebaja Stock + Ticket Fiscal ✅
Gate de Proformas al Abrir Caja (ADR-003)
PR #3065
El Dolor: Cajeros dejaban proformas pendientes de días anteriores y abrían caja nueva sin haber liquidado ni facturado lo del turno anterior.
Vista Previa de Apertura con Grupo Seleccionado
PR #3101
El Dolor Resuelto: Osman Figueroa no podía abrir caja en el CD porque el sistema usaba `sellerGroups()->first()` sin respetar el grupo seleccionado por el cajero.
Available Cash Sale de la Deuda Declarada
PR #3104
El Dolor: `available_cash` en reportes de corte leía campos virtuales en vez de la deuda declarada real, arrojando diferencias en auditoría de caja física.
✓ backend-test-shards (2) (27m 31s)
⏳ backend-test-shards (1) (Corriendo en Runner 2)
Cuentas Bancarias en Adelantos de Clientes (E2)
PR #3069 (Mergeado 62493ef)
El Dolor (Emergencia E2): Al registrar anticipos de clientes por transferencia, el selector de cuentas bancarias de la empresa salía vacío o congelado.
Botón Asignar CAI y Rangos Fiscales en Tiempo Real
PR #3049
El Dolor Resuelto: Asignar una nueva autorización SAR de facturación a una tienda exigía intervención manual en base de datos.
Cartera de Créditos en Cascada FIFO
PR #3058
El Dolor: Abonos de clientes se aplicaban a pagarés recientes dejando pagarés viejos acumulando mora y distorsionando la antigüedad de saldo.
Cliente abona L 5,000 ──► Algoritmo Cascada FIFO
│
├─► Liquida Cuota #1 (Vencida hace 30 días)
├─► Liquida Cuota #2 (Vencida hace 10 días)
└─► Aplica remanente a Cuota #3 (Por vencer) ✅
Facturas en Giras (`tour_invoices`) — Planilla Mayoreo
2026-09-19.md
El Dolor (Bloqueo de Planilla Mayoreo): Faltan 9 de las 19 columnas, omite 254 preventas (17% del volumen) y filtra por fecha de gira en vez de fecha de factura.
- • 1. Filtrar por
invoices.invoice_date(no por fechas de gira). - • 2. Unir
tours_invoices(Venta) +tours_presales(Preventa). - • 3. Sumar columnas: Fecha Pago, Balance, Estatus, Tipo y Es Crédito.
Alcance de Reportes Cross-Empresa
PR #3092
El Dolor Resuelto: Para auditar las 6 razones sociales había que iniciar sesión empresa por empresa. Permite consolidación de saldos en un solo reporte.
Descarga Masiva en Streaming sin Tope de 2,000 Filas
PR #2973
El Dolor Resuelto: La descarga de reportes moría por límite de memoria o recortaba a 2,000 registros cuando el mes traía 15,000 transacciones.
Estado de Cuenta de Cliente en PDF para WhatsApp
PR #2980 · PR #3036
El Dolor Resuelto: Cobradores en calle no podían mostrarle al cliente su saldo desglosado con cuotas pagadas y pendientes desde el móvil.
Ficha del Cliente ──► "Generar Estado de Cuenta PDF"
│
▼
Envío con un clic directo a WhatsApp del cliente ✅
Validación de DNI/RTN Único y Limpieza de Duplicados
PR #2986 · PR #3076
El Dolor: Se creaban clientes duplicados con diferente nombre pero mismo número de identidad, fragmentando el historial de crédito.