KM

KM MOTOS · Organigrama Operativo E2E En Vivo

Flujo Completo de Negocio: RRHH → Bodega → Ventas → Cajas → Finanzas → Contabilidad

🟢 En Producción
6
Verificado en tiendas reales
🟢 Listos Mergeables
7
En cola develop / Certificados
🟡 En Revisión
8
Con PR y pruebas activas
⚠️ Bloqueado / HOLD
3
Requiere decisión o deploy
⚪ Disponibles (Bolsa)
4
Tickets listos para programar

🗺️ Cadena de Valor & Flujo Operativo End-to-End

Cómo viaja la mercadería, el dinero y los datos fiscales en todo el grupo

7 Bounded Contexts
👥 1. RRHH & TALENTO 📦 2. BODEGA & CD 🏷️ 3. VENTAS & POS 💰 4. CAJAS & BANCOS ┌─────────────────────┐ ┌──────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ Empleados, tiendas, │──────►│ Recepción atómica, │─────►│ Cotizaciones, │──────►│ Cobro estricto, │ │ metas de vendedor y │ │ empaque, packing y │ │ proformas, guard │ │ apertura de caja, │ │ control de bajas │ │ traslados foráneos │ │ CAI y descuentos │ │ depósitos y banco │ └─────────────────────┘ └──────────────────────┘ └────────────────────┘ └────────────────────┘ │ │ │ ▼ ▼ ▼ 🤝 5. CRM & COBRANZA 📊 6. FINANZAS 📑 7. CONTABILIDAD ┌─────────────────────┐ ┌────────────────────┐ ┌────────────────────┐ │ Clientes, cartera, │◄────────────────────────────────────────────│ Cartera FIFO, │──────►│ Catálogo cuentas, │ │ estados de cuenta │ │ conciliación banc. │ │ nómina mayoreo, │ │ PDF vía WhatsApp │ │ y anticipos cliente│ │ y cierre fiscal SAR│ └─────────────────────┘ └────────────────────┘ └────────────────────┘
R1 · RRHH 🟡 En Revisión

Persistencia de Sanciones y Override Supervisor (E15)

Saúl Cruz (@friday)
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.

Flujo Operativo:
Sanción aplicada ──► Validación con Supervisor
                         │
                         ▼
             Persistencia con auditoría en EmployeeSanction ✅
vendor/bin/pest backend/tests/Unit/Services/EmployeeSanctionServiceTest.php
Validación por RRHH: Aplicar una sanción y verificar en el perfil del empleado que quede fija y se refleje en la pre-nómina.
R2 · RRHH 🟢 En Develop

Traslado de Tienda Invalida Supervisor y Metas Viejas

Code / Batch 3
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.

Flujo Operativo:
Cambio de Sucursal ──► Transacción Atómica:
                        ├─► Invalida SellerGroup tienda vieja
                        ├─► Desasigna Supervisor anterior
                        └─► Inicializa metas en tienda nueva ✅
vendor/bin/pest backend/tests/Unit/Services/EmployeeStoreTransferTest.php
Validación por RRHH: Al cambiar a un colaborador en el módulo de personal, su supervisor anterior ya no lo ve en su equipo.
B1 · BODEGA ⚠️ Prometido Deploy

Recepción Atómica PI > 0 (E8, E10, E16)

Luis / Bodega
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.

Flujo Operativo:
Tienda hace "Recibir" ──► DB Transaction Atómica:
                          ├─► Transfer.status = 'completed'
                          ├─► ProductInventory::increment(qty)
                          └─► Ledger::record(IN)
              ¿PI incrementado? ──NO──► ROLLBACK TOTAL ❌
                                ──SÍ──► Confirmado ✅
ssh km-netcup "docker exec km-php php artisan tinker --execute='echo App\Models\ProductInventory::where(\"product_id\", 26997)->first()->quantity;'"
Validación por Bodega: Aceptar un traslado en Villa o Entrada #2; el stock del producto pasa a reflejarse en mostrador al instante.
B2 · BODEGA & TRASLADOS 🟢 Listo Mergeable

Lote r7 Emilia: Traslados, Packing y Pedidos

Eysthen (IT)
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.

Sub-PRs Certificadas con Medición:
  • • #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.
gh pr view 3079 --repo osmanrgb/new-dashboard
Validación por Bodega/IT: Cada PR tiene medición publicada anclada a su commit y controles positivos aprobados.
B3 · BODEGA & PACKING 🟢 Listo Mergeable

Lote r8 Emilia: Metas, Aviso Cliente y Surtido

Eysthen (IT)
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).

gh pr view 3088 --repo osmanrgb/new-dashboard
Validación por Bodega: Empaque y traslado con tracking integral para tiendas foráneas.
B4 · BODEGA 🟡 En Revisión

Tratamiento de SKUs Huérfanos y Ubicaciones

Saúl Cruz (@friday)
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.

vendor/bin/pest backend/tests/Unit/Services/ProductOrphanSkuGuardTest.php
Validación por Bodega: Todo SKU nuevo exige al menos una ubicación física predeterminada.
V1 · VENTAS ⚠️ HOLD Deploy

Conversión Cotización con Fecha Real (E1)

Luis / Go-Live
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.

Flujo Operativo:
Cotización COT-000033 (Fecha: Ayer)
              │
              ▼ [Acción: Convertir a Factura]
Factura PRO-000143: invoice_date = now() (NUNCA hereda fecha vieja) ✅
vendor/bin/pest backend/tests/Unit/Services/QuoteToInvoiceDateGuardTest.php
Validación por Tiendas: Convertir una cotización de fecha pasada y verificar que la factura salga con la fecha y hora de hoy.
V2 · VENTAS 🟢 En Producción

RTN de Empresa Emisora en Facturas (E6)

Eysthen / Fiscal
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.

Flujo Operativo:
Emisión de Factura ──► Consulta tenant.company_rtn
                       │
                       ▼
          Inyección obligatoria en cabecera de PDF y Ticket Térmico ✅
pnpm --dir frontend test:unit src/utils/userPayload.test.ts
Validación en Vivo: Confirmado por Eysthen (IT): los 6 RTNs con sus membretes fiscales están emitiendo correctamente en producción.
V3 · VENTAS 🟢 Blindaje 100% (2 PRs)

Guard contra Facturar Proformas Anuladas (Crédito + Contado)

Claude + ITKM
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.

Doble Barrera Anti-Fraude:
  • • 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.
vendor/bin/pest backend/tests/Unit/Repositories/ProformaAnuladaNoSeFacturaPorPagoTest.php
Validación Fiscal: Ninguna proforma anulada puede salir facturada ni por mostrador ni por crédito.
V4 · VENTAS 🟡 En Revisión

Cotización no Exige Caja Abierta al Guardarse

Saúl Cruz
PR #3100

El Dolor: Guardar una cotización (que no mueve dinero ni rebaja inventario) bloqueaba al vendedor diciendo "Abre la caja primero".

vendor/bin/pest backend/tests/Unit/Http/QuoteWithoutCashCountGuardTest.php
Validación por Ventas: Cualquier asesor puede cotizar a las 7 AM sin tener caja aperturada.
W1 · WAZE ERP 🟡 En Revisión

Interlock Proforma vs Factura (ADR-003)

Osman / Antigravity
PR #3059

El Dolor: Cajeros entregaban mercadería con proformas pensando que eran ventas finales. La proforma no rebajaba stock ni sumaba comisiones.

Flujo Operativo:
Cobro con Proforma ──► BLOQUEO: "Convertir a Factura"
                       │ (skipStock=true, sin comisiones)
                       ▼
            Conversión a Factura ──► Rebaja Stock + Ticket Fiscal ✅
vendor/bin/pest backend/tests/Unit/Console/AuditProformasCommandTest.php
Validación por Tiendas: Al presionar "Cobrar" en una proforma, el Copilot bloquea la impresión y abre el asistente de conversión.
W2 · WAZE ERP 🟡 En Revisión

Gate de Proformas al Abrir Caja (ADR-003)

Osman / Antigravity
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.

vendor/bin/pest backend/tests/Unit/Services/CashCountOpeningGuardTest.php
Validación por Auditoría: Si hay proformas huérfanas sin convertir del día anterior, el sistema exige resolverlas antes del corte inicial.
W3 · WAZE ERP 🟢 Listo Mergeable

Vista Previa de Apertura con Grupo Seleccionado

Saúl Cruz (@friday)
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.

vendor/bin/pest backend/tests/Unit/Services/CashCountPreviewSellerGroupTest.php
Validación en CD: El usuario con múltiples grupos selecciona cuál abrir y la vista previa carga sus saldos correctos.
F1 · FINANZAS ⚙️ CI Shard 1

Available Cash Sale de la Deuda Declarada

Osman / Code
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.

Certificación CI en Curso:
✓ deploy-contract (1m 28s)
✓ backend-test-shards (2) (27m 31s)
⏳ backend-test-shards (1) (Corriendo en Runner 2)
vendor/bin/pest backend/tests/Unit/Architecture/ChartDefaultsFieldsExistTest.php
Validación por Finanzas: El efectivo disponible del corte cuadra al centavo con el arqueo físico de billetes y monedas.
F2 · FINANZAS 🟢 En Develop

Cuentas Bancarias en Adelantos de Clientes (E2)

Luis (@lajy)
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.

gh pr view 3069 --repo osmanrgb/new-dashboard
Validación por Tesorería: Captar un anticipo de cliente y verificar que liste las cuentas de Banco de Occidente, BAC y Atlántida del tenant activo.
F3 · FINANZAS 🟢 Listo Mergeable

Botón Asignar CAI y Rangos Fiscales en Tiempo Real

Luis (@lajy)
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.

gh pr view 3049 --repo osmanrgb/new-dashboard
Validación Fiscal: El administrador asigna el CAI desde la UI y las terminales de esa tienda facturan de inmediato.
F4 · FINANZAS 🟡 En Revisión

Cartera de Créditos en Cascada FIFO

Saúl Cruz
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.

Flujo Operativo:
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) ✅
vendor/bin/pest backend/tests/Unit/Http/CreditServiceAndControllerTest.php
Validación por Créditos: En el estado de cuenta del cliente, el abono liquida de forma estricta las cuotas en orden cronológico.
K1 · CONTABILIDAD ⚪ Por Asignar

Facturas en Giras (`tour_invoices`) — Planilla Mayoreo

Kellin / Agente 8
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.

Los 3 Huecos a Corregir:
  • • 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.
Scope Lease: backend/app/Jobs/Reports/GenerateTourInvoicesJob.php
Validación por Mayoreo: Kellin descarga el Excel y el total cuadra facturado contra cobrado con preventas incluidas.
K2 · CONTABILIDAD 🟢 Listo Mergeable

Alcance de Reportes Cross-Empresa

Luis (@lajy)
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.

gh pr view 3092 --repo osmanrgb/new-dashboard
Validación por Contabilidad: Auditoría emite el balance y el reporte recorre todos los tenants con un solo clic.
K3 · CONTABILIDAD 🟢 Listo Mergeable

Descarga Masiva en Streaming sin Tope de 2,000 Filas

Luis / IT
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.

gh pr view 2973 --repo osmanrgb/new-dashboard
Validación por Contraloría: Descargar el histórico anual completo en Excel sin error 504 Gateway Timeout.
CRM 1 · CLIENTES 🟢 Listo Mergeable

Estado de Cuenta de Cliente en PDF para WhatsApp

IT KM Motos
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.

Flujo Operativo:
Ficha del Cliente ──► "Generar Estado de Cuenta PDF"
                           │
                           ▼
               Envío con un clic directo a WhatsApp del cliente ✅
gh pr view 2980 --repo osmanrgb/new-dashboard
Validación por Cobranza: El cobrador abre la app en su teléfono y genera el PDF limpio para cobrar en el instante.
CRM 2 · CLIENTES ⚠️ Rescate en Cola

Validación de DNI/RTN Único y Limpieza de Duplicados

Parches Prod
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.

Scope Lease: backend/app/Http/Controllers/ClientController.php:validateUniqueField()
Validación por Créditos: Al digitar la identidad de un cliente existente, el sistema avisa de inmediato y muestra su expediente activo.