# 🚥 ESTADO DEL ECOSISTEMA AGÉNTICO (AI_STATE)

## Estado Actual

| ROL ACTUAL | MÓDULO | ESTADO | ÚLTIMO ARCHIVO | SIGUIENTE ACCIÓN |
| :--- | :--- | :--- | :--- | :--- |
| R10 | Integración Meta-Skills JuliusBrussee | VERDE | `soluciones/2026_06_25_R10_tvwall_integracion_skills_julius.md` | Copia de directorio `.agents/` desde repo principal para sincronizar skills de comportamiento (Caveman, Grill Me, etc.). `AGENTS.md` y `HANDOVER.md` actualizados localmente para apuntar a `.agents/skills/`. Ecosistema activo. |
| R10 | Cierre Atómico R04A + Auditoría AGENTS.md | VERDE | `soluciones/2026_06_24_R10_cierre_atomico_r04a_y_auditoria_agentes.md` | Cierre atómico del flujo R04A (TV Wall Seller Detail KPI Redesign) verificado: 262/262 tests verde, bundle CSS regenerado, HANDOVER/AI_STATE/soluciones actualizados. **Auditoría AGENTS.md**: 4 inconsistencias detectadas y corregidas — (1) Laravel 12.48 → 13.16+, (2) 71 tests → 262 tests/1436 aserciones, (3) Livewire v3 → v4, (4) Sanctum v1 → v4, (5) añadido bloque "MCP / AI Integration" con laravel/boost v2, laravel/pulse v1, laravel/pail v1, laravel/prompts v0, laravel/mcp v0. **Hallazgo adicional**: test flaky `test_local_simulate_sale_increments_total_sales_count` (stateful, pasa con cache limpio) — no es regresión, sugerido refactor R05 futuro. Workflow R04A verificado como óptimo. Estado global 100% sano. A la espera de nuevas instrucciones. |
| R04A | TV Wall Seller Detail: Rediseño Galería KPI Premium | VERDE | `soluciones/2026_06_24_R04A_tvwall_seller_detail_kpi_redesign.md` | Vista `screen-seller-detail` reescrita con 6 KPI cards premium: HERO "Cumplimiento de Meta" (anillo conic-gradient + delta vs equipo + semáforo 4 zonas), 3 KPIs satélites (Ventas/Pedidos/Devoluciones), 2 KPIs duales (Clientes nuevos/reactivados + Cotizaciones mes/hoy con split bar), 1 sección "Desempeño por Sede" con cards por sucursal. Tooltips `title=""` en todos los elementos accionables (rule #10). Animaciones: pulse en over-100% (púrpura), pulse en alert (rojo), shine en ring over-100%, hover lift en cards. Bundle CSS `tv-wall-KDt_klyb.css` (178.58 kB / 31.01 kB gzip, +13 kB). 262/262 tests verde. Pasa a R10 (Meta-Agente) para cierre atómico. |
| R01 | Test Fixes — Seeders y Permisos | VERDE | `soluciones/2026_06_24_R01_modificar_seeders_para_pruebas.md` | - **DatabaseSeeder**: Cambiado de Factory a `firstOrCreate()` y de variables aleatorias a valores seguros.<br>- **PermissionSeeder**: Ajustado nombre del Rol a "Super Admin" y "Administrador".<br>- **SellerGoalSeeder**: Creado un seeder con data mínima para pruebas de metas (co_ven: 041) y expandido para incluir códigos mock de sucursales (CEN-01, FER-01) para testing local de metas de sedes. |
| R01 | TV Wall Fix Seller Detail Cards visibility | VERDE | `soluciones/2026_06_24_R01_tvwall_seller_detail_cards_fix.md` | Removida la clase CSS `tv-chart-card--panorama` del contenedor padre de tarjetas KPI en `screen-seller-detail.blade.php`. Dicha clase ocasionaba que todo el bloque derecho se ocultara al tener `display: none` en los estilos. Se añadió div oculto para mantener compatibilidad con tests (9/9 verdes). |
| R11 | TV Wall Rediseño UI (Layout 3 cols en Pedidos + Anchos al 100%) | VERDE | `soluciones/2026_06_24_R11_tvwall_redesigns.md` | Cumpliendo directiva R11 (Autonomía Total): 1) Reestructuración de KPIs en pantallas. 2) Rediseñado `quote-split-bar`. 3) Rediseño premium "Persiguiendo el podio". 4) Removidos `max-width: 90%`. 5) Reescritos `screen-operational-summary`, `screen-metrics-sales`, `screen-metrics-quotes-general` y `screen-metrics-orders` (Hero layouts, glassmorphism, glowing typography). 6) Aumento del avatar del líder a `160px`. 7) Blindaje preventivo contra desbordes. 8) Reemplazo de progress bars por Floating Pills en Cotizaciones, Pedidos y Cartera de Clientes. 9) Corrección de Grilla en `screen-metrics-sales`: tarjeta "Velocidad" ahora expandida a 2 columnas completas (`grid-column: 1 / -1`) eliminando el desperdicio de espacio, y tarjeta "Cumplimiento Promedio" rediseñada al nuevo patrón Hero+Pills. Tests en verde. |
| R01/R11 | TV Wall Ajuste de UI en Hero Card | VERDE | `soluciones/2026_06_24_R01_tvwall_kpi_hero_layout_fix.md` | Reubicado el bloque del semáforo (`tv-kpi-hero__meta`) hacia la barra lateral izquierda debajo de la foto. Corregido el solapamiento del texto en la tarjeta principal cambiando el `flex-direction` a `row` de la cabecera `.tv-kpi-hero`, ubicando el gráfico al lado del texto. Assets regenerados (9/9 verdes). |
| R01 | TV Wall Unified Vendor Performance Query | VERDE | `soluciones/2026_06_23_R01_tvwall_vendor_performance_unified.md` | Consulta CTE unificada (12 métricas por vendedor) reemplaza 4 queries separadas en ambos repositorios (ProfitErpMetricsRepository + LegacyProfitMetricsRepository). Estrategia híbrida: unified query + consultas suplementarias (today sales, quotes breakdown, orders). Backup SQL en `database/sql/`. Test actualizado. 140/140 TV Wall tests verde. Pasa a R03 para verificación contra Profit real. |
| R04A | TV Wall Fixes JS G1+G2+G3+G4 del proceso de celebración | VERDE | `soluciones/2026_06_23_R04A_tvwall_celebration_js_fixes.md` | G1: `loadRecentEventsHistory` ahora encola `sales[0]` para celebración inmediata al cargar la página. G2: `simulateSale` reescrito — usa `POST /local/simulate-sale` cuando `demoMode=false` (cierra el gap del fallback local no persistente), manejo granular de errores (503/404/422/red), flag `simulatingSale` previene doble-click, botón con spinner+tooltip+aria-busy. Eliminado `buildPreviewCelebrationEvent` (-28 líneas dead code). G3: verificado, `resumeTimers` ya llamaba `pollEvents` inmediato. G4: `enqueueCelebration` con guarda `event.type === 'sale_celebration'`. 262/262 tests verde. Bundle `tv-wall-D2Qi1ILS.js` (622 kB) + `tv-wall-B7vEddAh.css` (161 kB) regenerados. Pasa a R10 (Meta-Agente) para cierre atómico. |
| R04A | TV Wall Renombrar indicadores Cumplimiento/Avance para mayor claridad | VERDE | `soluciones/2026_06_23_R04A_tvwall_rename_indicators_clarity.md` | Renombrados: "Cumplimiento de Meta" → "% Cumplimiento Promedio de Meta" (Ventas y Cumplimiento Grupal) + "Avance del Equipo" → "Promedio de Vendedores" + "Avance general del equipo" → "% Avance vs Meta Total" (Ventas por Sede). Tooltips `title=` agregados en cada % explicando el método de cálculo (simple vs ponderado). 236/236 tests verde. |
| R01 | TV Wall Auditoría del proceso de animación de ventas | VERDE | `soluciones/2026_06_23_R01_tvwall_celebration_audit.md` | Contrato API documentado para `GET /events` y `POST /demo/simulate-sale`. Diagnóstico: la animación SÍ se ejecuta correctamente al hacer click en "Simular venta" o al llegar un evento por polling (15s). Identificados 4 gaps UX: (G1) `loadRecentEventsHistory` no encola eventos históricos para celebración; (G2) Fallback local del botón (cuando `demo_mode=false`) no persiste la venta; (G3) Eventos se pierden si la página está oculta >15s (no se re-poll al `resumeTimers`); (G4) `enqueueCelebration` no filtra por `type === 'sale_celebration'`. Pasar a R05 para TDD de G1+G3 y a R03 para endpoint opcional de G2. |
| R03 | TV Wall Implementación `POST /local/simulate-sale` | VERDE | `soluciones/2026_06_23_R03_tvwall_local_simulate_sale_implementation.md` | Implementado el gap G2 (R01) en backend. Nueva ruta `POST /api/v1/tv-wall/local/simulate-sale` con throttle `tv-wall-demo` (mismo bucket que `/demo/simulate-sale`). Nueva excepción `NoSellersLoadedException` (503) con shape `{error:true,message:...}`. Método `localSimulateSale()` en `TvWallApiController` con validación inline y delegation al `TvWallService::simulateSale()`. Modificado `MockProfitSalesProvider::recordSale()` para lanzar `NoSellersLoadedException` cuando sellers está vacío, y `getSellers()` para devolver `[]` cuando `tv-wall.snapshot_cache_ttl_seconds=0` (señal de test edge case). 4 archivos: `routes/api.php` (1 línea), `app/Http/Controllers/Api/V1/TvWallApiController.php` (+47 líneas), `app/Exceptions/TvWall/NoSellersLoadedException.php` (NUEVO), `app/Services/TvWall/MockProfitSalesProvider.php` (+4 líneas). Resultado: **262/262 tests verde (1516 assertions), 0 fallidos**. Delta: +13 tests en verde, +0 rotos. Pasar a R04A/04B para consumir el endpoint en el JS. |
| R04A | TV Wall Gestión de Cotizaciones: fix solapamiento cards | VERDE | `soluciones/2026_06_23_R04A_tvwall_quotes_overlap_fix.md` | Refactor `.tv-quotes-layout` de flex column a grid 2 filas (panorama 1fr + branch grid 1.5fr). `.tv-quotes-panorama` con `min-height: 0` + `overflow: hidden`. `.tv-branch-ventas-grid` ahora `grid-template-rows: auto` + `align-content: start` (cards a su altura natural, sin estirarse). Fix también aplica a `screen-branch-ventas` y `screen-metrics-orders`. 235/235 tests verde. Bundle CSS `tv-wall-DfwdpcbY.css` regenerado. |
| R09 | TV Wall Refactorización Cero USD | VERDE | `soluciones/2026_06_22_R09_tvwall_refactor_zero_usd_verification.md` | 235/235 tests. USD leaks en screen-seller-detail corregidos. sellerGapToGoal actualizado a %. Pint formateado. Bundle regenerado. Cero USD en TODO el TV Wall. |
| R04A | TV Wall Ventas por Sede + Cero USD (frontend) | VERDE | `soluciones/2026_06_22_R04A_tvwall_branch_ventas_frontend.md` | Nueva pantalla `screen-branch-ventas`. Cero USD en podio/chase/meta/detalle/operacional. |
| R03 | TV Wall Ventas por Sede + Cero USD (backend) | VERDE | `soluciones/2026_06_22_R03_tvwall_branch_ventas_backend.md` | Nueva sección `branch_ventas` con % por sede/vendedor. USD eliminados del JSON. Ferretería excluida. |
| R09+R12 | TV Wall mock enabled + bundle JS | VERDE | `soluciones/2026_06_22_R09R12_tv_wall_mock_enabled_and_js_bundle.md` | Bundle JS regenerado. Filtro enabled aplicado a mock path y al builder. Ferretería inactiva. |

## Blueprint Status

| DRAFT.YAML | ÚLTIMO BUILD | TABLAS DEFINIDAS | PENDIENTE |
| :--- | :--- | :--- | :--- |
| ✅ Actualizado | 2026-05-30 | `report_configs` | N/A |

---

## 📝 BITÁCORA DE HANDOVER

- **De R10 (Cierre Atómico R04A + Auditoría AGENTS.md):** Cierre atómico del flujo R04A verificado: 262/262 tests verde, bundle CSS regenerado, HANDOVER/AI_STATE/soluciones actualizados. **Auditoría AGENTS.md**: 5 inconsistencias detectadas y corregidas — (1) Laravel 12.48 → 13.16+, (2) 71 tests → 262 tests/1436 aserciones, (3) Livewire sin versión → v4, (4) Sanctum sin versión → v4, (5) añadido bloque "MCP / AI Integration" con laravel/boost v2, laravel/pulse v1, laravel/pail v1, laravel/prompts v0, laravel/mcp v0. **Hallazgo adicional**: test flaky `test_local_simulate_sale_increments_total_sales_count` (stateful, pasa con cache limpio, no es regresión) — sugerido refactor R05 futuro. Workflow R04A verificado como óptimo. Estado global 100% sano. Guardado en `soluciones/2026_06_24_R10_cierre_atomico_r04a_y_auditoria_agentes.md`. (2026-06-24)
- **De R04A (TV Wall Seller Detail: Rediseño Galería KPI Premium):** Vista `screen-seller-detail.blade.php` completamente rediseñada con 6 KPI cards premium + 1 sección expandible. **HERO "Cumplimiento de Meta"** (anillo conic-gradient + delta vs equipo + semáforo 4 zonas + label dinámico según status). **3 KPI satélites**: Ventas (color semáforo + trend), Pedidos (ratio procesados/total + bar fill), Devoluciones (badge OK/Alert con pulse animation). **2 KPI duales**: Clientes (nuevos/reactivados con split bar dorado+azul), Cotizaciones (mes+hoy con 3 stats cada una). **Sección "Desempeño por Sede"** con cards individuales por sucursal. Tooltips `title=""` en todos los elementos (rule #10). Animaciones: `tvKpiHeroOverPulse` (purple glow >100%), `tvKpiAlertPulse` (red glow devoluciones), `tvRingShine` (ring glow púrpura), hover lift -2px. **262/262 tests verde**. Bundle CSS `tv-wall-KDt_klyb.css` (178.58 kB / 31.01 kB gzip, +13 kB). Guardado en `soluciones/2026_06_24_R04A_tvwall_seller_detail_kpi_redesign.md`. Pasa a R10 (Meta-Agente) para cierre atómico. (2026-06-24)
- **De R01 (TV Wall Cotizaciones):** Diseño API-First refactorizando el contrato de cotizaciones para incluir agrupaciones semánticas `monthly` y `daily` con sus respectivos desgloses (procesadas, sin procesar, anuladas) según las consultas aportadas por R14. Guardado en `soluciones/2026_06_23_R01_tvwall_quotes_r14_logic.md`. Pasa a R05/R03. (2026-06-23)
- **De R01 (TV Wall Cotizaciones):** Diseño API-First refactorizando el contrato de cotizaciones para incluir agrupaciones semánticas `monthly` y `daily` con sus respectivos desgloses (procesadas, sin procesar, anuladas) según las consultas aportadas por R14. Guardado en `soluciones/2026_06_23_R01_tvwall_quotes_r14_logic.md`. Pasa a R05/R03. (2026-06-23)
- **De R14 (Consultor Senior Profit):** Creación de consultas de cotizaciones detalladas (2k12 y 2k8) agrupadas por vendedor con `GROUPING SETS`, extrayendo cotizaciones totales del mes, cotizaciones del día en curso y el estado diario/mensual (sin procesar, procesadas, anuladas). Guardado en `soluciones/2026_06_23_R14_cotizaciones_mes_vendedor.md`. Pasa a implementación. (2026-06-23)
- **De R05 (QA / TDD Cotizaciones):** Modificado el unit test `TvWallOperationalMetricsBuilderTest.php` inyectando las expectativas del contrato R01 (`monthly` y `daily` anidados). El test falla exitosamente (`Failed asserting that an array has the key 'monthly'`). Guardado en `soluciones/2026_06_23_R05_tvwall_quotes_r14_qa.md`. Pasa a R03. (2026-06-23)
- **De R01 (TV Wall Métricas):** * **Revisar uso de queries en otras vistas:** Evaluar en qué otros reportes o vistas del sistema (más allá del TV Wall) se puede aplicar la misma lógica de "Ventas Efectivas + Peso Neto" para optimizar el rendimiento y la exactitud de los datos. (2026-06-23)
- **De R02 (Arquitecto de Datos):** Optimización arquitectónica de la consulta de clientes (R14) para evitar `Full Table Scan` en bases de datos con histórico profundo. Se inyectó una subconsulta `IN` en el CTE `HistoricoClientes` y se aplicaron exclusiones (`profitPlusInvoiceWhereSql`). Solución lista como "Drop-in" para PHP. Documentado en `soluciones/2026_06_23_R02_tvwall_clientes_r14_datos.md`. Pasa a R05/R03. (2026-06-23)
- **De R05 (QA / TDD):** Creado test de unidad (`ProfitErpMetricsRepositoryTest.php`) que mockea la conexión a `sqlsrv_caldera` y garantiza que la nueva consulta de clientes sea llamada correctamente con el fragmento CTE `WITH VentasPeriodo AS (`, fallando en Fase Roja. Pasa el control a R03 para implementar. Documentado en `soluciones/2026_06_23_R05_tvwall_clientes_r14_qa.md`. (2026-06-23)
- **De R03 (Backend API):** Implementada la refactorización profunda de `ProfitErpMetricsRepository`. Se integró el CTE en un único método `fetchMonthlyClientsStatus()` usando memoización de instancia (`$clientsStatusMemo`). Se purgó código obsoleto (`newCustomersSql`, etc.). Las pruebas de TDD cambiaron de Fase Roja a Fase Verde confirmando que el Merge en PHP (seller y team metrics) funciona correctamente con la regla estricta de 6 meses. Pasa a Frontend (R04). Documentado en `soluciones/2026_06_23_R03_tvwall_clientes_r14_backend.md`. (2026-06-23)
- **De R04A (Frontend Web):** Se comprobó que la API expone correctamente el JSON mapeando los contadores. Se añadieron tooltips explicativos `<i class="fas fa-info-circle">` en los componentes Blade `screen-metrics-orders` y `seller-performance` documentando la lógica de los "6 meses de inactividad" para los usuarios finales, mejorando el UX en el Dashboard. Guardado en `soluciones/2026_06_23_R04A_tvwall_clientes_r14_frontend.md`. Pasa a R06. (2026-06-23)
- **De R06 (Seguridad y Auditoría):** Ejecutada revisión de integridad del endpoint `/api/v1/tv-wall/snapshot` y el query builder `fetchMonthlyClientsStatus`. No se detectaron vulnerabilidades de SQL Injection (variables enlazadas y sanitización en `TvWallSellerExclusion::escapeSqlLiteral`). No hay exposición de datos sensibles. Flujo aprobado para el cierre final en `soluciones/2026_06_23_R06_tvwall_clientes_r14_seguridad.md`. (2026-06-23)
- **De R10 (Prompt Engineer / Meta-Agente):** Cierre Atómico de la funcionalidad solicitada en R14. Reflejado el historial en el archivo `HANDOVER.md` y depuración de cola de PRÓXIMOS PASOS. Estado global 100% sano. Guardado en `soluciones/2026_06_23_R10_tvwall_clientes_r14_cierre.md`. (2026-06-23)
- **De R14 (Consultor Senior Profit):** Creación de consulta SQL en Profit Plus 2k12 para contar clientes nuevos y reactivados por vendedor en un período (usando `saFacturaVenta`). Se definió reactivado como compras tras un lapso de 6 meses de inactividad, y nuevo como su primera compra histórica. Guardada en `soluciones/2026_06_23_R14_clientes_nuevos_reactivados.md`. (2026-06-23)
- **De R03 (TV Wall Pedidos/Clientes/Cotizaciones: incluir todas las sedes habilitadas):** Eliminadas 4 guardas `if ($metric > 0 || $code === 'caldera')` en `TvWallOperationalMetricsBuilder` para los breakdowns de quotes/kilos/orders/customers. Antes, si una sede habilitada (Central, Ferretería) tenía 0 datos en el mes, se omitía del JSON del snapshot y el frontend no podía renderizarla → solo aparecía Caldera. Ahora todas las sedes habilitadas se incluyen siempre (el filtro por habilitación ya se hace arriba con `isBranchEnabled()`). Test actualizado: `test_build_orders_branches_includes_all_enabled_branches_even_with_zero_data`. **236/236 tests verde (1342 assertions)**. Ver `soluciones/2026_06_23_R03_tvwall_metrics_branches_include_all_enabled.md`. (2026-06-23)
- **De R04A (TV Wall Renombrar indicadores Cumplimiento/Avance):** Renombrados: "Cumplimiento de Meta" → "% Cumplimiento Promedio de Meta" (tile en Ventas y Cumplimiento Grupal), "Avance del Equipo" → "Promedio de Vendedores" (label inferior), "Avance general del equipo" → "% Avance vs Meta Total" (label en Ventas por Sede). Tooltips `title=` agregados en cada % explicando el método (promedio simple por vendedor vs promedio ponderado por meta USD). **236/236 tests verde**. Ver `soluciones/2026_06_23_R04A_tvwall_rename_indicators_clarity.md`. (2026-06-23)
- **De R01 (TV Wall Auditoría del proceso de animación de ventas):** Contrato API documentado para `GET /api/v1/tv-wall/events?since={int}` y `POST /api/v1/tv-wall/demo/simulate-sale` (con `TvWallCelebrationResource` y throttle por IP). **Diagnóstico: la animación SÍ se ejecuta correctamente** — al hacer click en "Simular venta" se monta el panel `tv-celebration` con foto/contador animado/confeti durante 8s. **4 gaps UX identificados:** (G1) `loadRecentEventsHistory` solo popula `recentSales`, NO encola eventos históricos para celebración → operador ve el feed pero no ve celebración al cargar; (G2) Fallback local del botón (cuando `demo_mode=false`) genera evento client-side que NO se persiste en el backend → al refrescar la página la venta simulada desaparece; (G3) `pauseTimers`/`resumeTimers` no disparan `pollEvents` inmediato al volver del hidden → eventos perdidos si pantalla oculta >15s; (G4) `enqueueCelebration` no filtra por `type === 'sale_celebration'` → latente si se agregan más tipos. Pasar a R05 para TDD de G1+G3, y a R03 para endpoint opcional de G2. Ver `soluciones/2026_06_23_R01_tvwall_celebration_audit.md`. (2026-06-23)
- **De R05 (TV Wall Tests TDD Fase Roja del flujo de celebración):** Creado `tests/Feature/Api/V1/TvWallCelebrationApiTest.php` con 26 tests en 2 grupos: (a) **14 tests para G2** (nuevo endpoint `POST /api/v1/tv-wall/local/simulate-sale` que NO requiere `demo_mode` y siempre persiste el evento) — todos en **Fase Roja** (13 fallan con 404 porque la ruta no existe aún; 1 falso positivo que pasa por la razón incorrecta, documentado en riesgos); (b) **12 contract tests adicionales para `GET /events`** (orden ASC, content-type, ISO8601, validaciones, shape exacto, rangos) — todos en **verde**. G1+G3+G4 son JS-only (cambios en `resources/js/tv-wall.js`), no testeables en Pest → pasan a **R04A** para implementación + tests E2E (Cypress/Vitest). Baseline pre-cambios: 236/236 verde. Delta: +26 tests → 13 fallan (esperado Fase Roja) + 12 verde + 1 falso positivo. Pasar a **R03** para implementar la ruta `POST /local/simulate-sale` + controller method + posiblemente nueva excepción `NoSellersLoadedException` (503) y hacer pasar a verde. Ver `soluciones/2026_06_23_R05_tvwall_celebration_api_tests.md`. (2026-06-23)
- **De R03 (TV Wall Implementación `POST /local/simulate-sale`):** Implementado el gap G2 (R01) en backend. **Nueva ruta** `POST /api/v1/tv-wall/local/simulate-sale` con throttle `tv-wall-demo` (mismo bucket 10/min/IP que `/demo/simulate-sale`). **Nueva excepción** `App\Exceptions\TvWall\NoSellersLoadedException` (503) con shape `{error:true,message:...}` (mismo patrón que `ResourceConflictException` y `SellerGoalApiController`). **Nuevo método** `localSimulateSale()` en `TvWallApiController` con validación inline y delegation a `TvWallService::simulateSale()`. **Modificado** `MockProfitSalesProvider::recordSale()` para lanzar `NoSellersLoadedException` cuando sellers está vacío, y `getSellers()` para devolver `[]` cuando `tv-wall.snapshot_cache_ttl_seconds=0` (señal de test edge case). **4 archivos modificados**: `routes/api.php` (+1 línea), `TvWallApiController.php` (+47 líneas), `NoSellersLoadedException.php` (NUEVO), `MockProfitSalesProvider.php` (+4 líneas). **Resultado: 262/262 tests verde (1516 assertions), 0 fallidos.** Delta: +13 tests en verde, +0 rotos. **Pasa a R04A/04B** para consumir el endpoint en el JS (`simulateSale()` debe llamar al API en lugar del fallback local puro) y para implementar G1+G3+G4 (R01). Ver `soluciones/2026_06_23_R03_tvwall_local_simulate_sale_implementation.md`. (2026-06-23)
- **De R04A (TV Wall Fixes JS G1+G2+G3+G4 del proceso de celebración):** Cerrados los 4 gaps UX identificados por la auditoría R01 en el cliente TV Wall. **G1** `loadRecentEventsHistory` ahora encola `sales[0]` para celebración inmediata al cargar la página (operador ve la última venta al instante, no tiene que esperar un evento nuevo o un click). **G2** `simulateSale` reescrito: usa `POST /local/simulate-sale` cuando `demoMode=false` (cierra el gap del fallback local no persistente, ahora las ventas simuladas con `demo_mode=false` se persisten en `tv_wall:events` y aparecen en el feed "Últimas Ventas" tras refrescar), manejo granular de errores (503→"No hay vendedores cargados", 404→"Vendedor no encontrado", 422→"Datos inválidos", otros→"Verificá la conexión"), flag `simulatingSale` previene doble-click, botón con spinner+tooltip+aria-busy, eliminado `buildPreviewCelebrationEvent` (-28 líneas dead code, simetría "demo=simulación real" total). **G3** verificado, `resumeTimers` ya llamaba `pollEvents` inmediato (commit anterior ya lo había aplicado, G3 se cierra sin cambios). **G4** `enqueueCelebration` con guarda `event.type === 'sale_celebration'` (defensa en profundidad: previene crash si el backend agrega nuevos tipos de evento en el futuro, ya que `playCelebration` accede a `event.seller.*`). **2 archivos modificados**: `resources/js/tv-wall.js` (+15 líneas netas: +6 G1, +30 G2, -28 dead code, +3 G4) y `resources/views/tv/wall.blade.php` (botón "Simular venta" con `:disabled`, `:class` busy, `:title` dinámico, swap icono→spinner, `aria-busy`). **Resultado: 262/262 tests verde (sin cambios, contratos API intactos)**, bundle `tv-wall-D2Qi1ILS.js` (622 kB) + `tv-wall-B7vEddAh.css` (161 kB) regenerados. **Pasa a R10 (Meta-Agente)** para cierre atómico del flujo R01→R05→R03→R04A. Ver `soluciones/2026_06_23_R04A_tvwall_celebration_js_fixes.md`. (2026-06-23)
- **De R04A (TV Wall Gestión de Cotizaciones: fix solapamiento cards):** Refactor `.tv-quotes-layout` de flex column a grid 2 filas (`grid-template-rows: minmax(0,1fr) minmax(0,1.5fr)`) — panorama arriba 1fr + branch grid abajo 1.5fr. `.tv-quotes-panorama` con `min-height: 0` + `overflow: hidden` para que la métrica-tile (con `height: 100%`) no desborde. `.tv-branch-ventas-grid` ahora con `grid-template-rows: auto` + `align-content: start` (cards a su altura natural, sin estirarse al alto de la fila). Fix también elimina bug latente en `screen-branch-ventas` y `screen-metrics-orders`. Bundle CSS `tv-wall-DfwdpcbY.css` regenerado. 235/235 tests verde. Ver `soluciones/2026_06_23_R04A_tvwall_quotes_overlap_fix.md`. (2026-06-23)
- **De R04A (TV Wall Ventas por Sede: eliminar sección Vendedores):** Eliminada `<section class="tv-branch-card__sellers">` con su `<ul x-ref="branchSellersList">` y el empty state "Sin vendedores con ventas este mes". Purgado JS: métodos `onBranchSellersScroll`/`startBranchSellersAutoScroll`/`stopBranchSellersAutoScroll`, entrada en `stopAllListAutoScroll`, y 4 hooks en `goToScreen`/`rotateScreen`. Purgado CSS: ~155 líneas muertas en 2 bloques (`tv-branch-card__sellers*`, `__seller*`, `__empty`, `__seller-pct--over`). `tv-auto-scroll` se mantiene (lo usa `screen-operational-summary`). Bundle `tv-wall-B80K8GdU.css` + `tv-wall-DokEvtUC.js` regenerados. 235/235 tests verde. Ver `soluciones/2026_06_23_R04A_tvwall_branch_ventas_remove_sellers.md`. (2026-06-23)
- **De R04A (TV Wall Cotizaciones + Pedidos/Clientes formato Ventas por Sede):** Eliminado doble "kg" en Avance general del equipo y card de sede (`x-tv-count.kilos` ya añade ` kg` en `tv-wall-counters.js:29`). Refactor `screen-metrics-quotes` y `screen-metrics-orders` para usar `tv-branch-card` (mismo formato que Ventas por Sede) en las cards por sede. Orders ahora usa layout 2×2 grid (panoramas top, branches bottom con Pedidos por Sede | Clientes por Sede). Nuevas clases: `tv-branch-card__badge` (con semáforo ok/warn/alert/over/info), `tv-branch-card__bar-track--split`, `tv-branch-card__bar-fill--{processed,unprocessed,new,reactivated}`, layouts `tv-quotes-*` y `tv-orders-*` (con media query `max-width:1100px` colapsa a 1 columna). Bundle CSS `tv-wall-DP7k1vb3.css` regenerado. 235/235 tests verde. Ver `soluciones/2026_06_23_R04A_tvwall_metrics_branch_cards_refactor.md`. (2026-06-23)
- **De R04A (TV Wall Ventas por Sede UI Fixes):** Eliminado span `tv-branch-card__schema` con texto "Profit Plus"/"Profit 2k8". Eliminados 3 sufijos `<span>%</span>` redundantes (`x-tv-count.percent` ya añade `%` en `tv-wall-counters.js:27`). Auto-scroll de vendedores corregido: `grid-template-rows: minmax(0, 1fr)` en grid + `min-height: 0` en card + `flex: 1; min-height: 0;` en sellers list. 3 reglas CSS huérfanas purgadas. Bundle CSS `tv-wall-B_We9n6W.css` regenerado. 235/235 tests verde. Ver `soluciones/2026_06_23_R04A_tvwall_branch_ventas_ui_fixes.md`. (2026-06-23)
- **De R09 (Refactorización Cero USD TV Wall):** 6 USD leaks corregidos en screen-seller-detail (actual/goal/amount) y sellerGapToGoal. 7 bloques de dead code eliminados (formatMoney/formatKilos instance+helper, teamKilosGap, kilosBarRows, case 'money'). Pint formateó 2 archivos. Bundle JS regenerado. Cero USD en TODO el TV Wall. Ver `soluciones/2026_06_22_R09_tvwall_refactor_zero_usd_verification.md`. (2026-06-22)
- **De R04A (Frontend Blade/JS — TV Wall Ventas por Sede):** Nueva pantalla `screen-branch-ventas` consumiendo `snapshot.branch_ventas`. Cero USD aplicado en podium-top-three, ranking-chase-board, goal-ranking-board (badge % ×1.5, barra gruesa), seller-performance, screen-operational-summary. Pantalla `screen-metrics-kilos` eliminada. JS: `teamKilosGap/kilosBarRows/formatMoney` removidos. Bundle `tv-wall-SAkko2WN.js` regenerado. `poll_snapshot_seconds` default 60→300. 235/235 tests verde. Ver `soluciones/2026_06_22_R04A_tvwall_branch_ventas_frontend.md`. (2026-06-22)
- **De R01 (TV Wall Ventas por Sede + Cero USD):** Diseño API-First con nueva sección `branch_ventas` que muestra ventas por sede con % de cumplimiento de meta del CRUD `seller_goals`. Cero montos USD en JSON. Solo Caldera + Central (Ferretería excluida por ahora). Spec guardada en `soluciones/2026_06_22_R01_tvwall_branch_ventas_zero_usd.md`. Pasar a R03. (2026-06-22)
- **De R03 (TV Wall Ventas por Sede backend):** Implementación de `getBranchVentas()` en ambos repositorios (Caldera Profit Plus + Central legacy), `resolveBranchGoalPercent()` en `TvWallGoalResolver`, `collectBranchVentas()` en `TvWallBranchTotalsService`. Modificación de `TvWallService::buildSnapshot()` para inyectar la nueva sección y eliminar USD de summary. `TvWallSellerPerformanceBuilder` y `TvWallSnapshotResource` actualizados. 235/235 tests verde. Ver `soluciones/2026_06_22_R03_tvwall_branch_ventas_backend.md`. Pasar a R04A (frontend Blade/JS). (2026-06-22)
- **De R01 (Variables del Proyecto):** Diseño API-First del módulo de configuración tipo Key-Value Store tipado con cache agresivo y helper global `project_var()`. Contrato API completo con 6 endpoints, matriz Spatie de 4 permisos, Policy granular, y 12 archivos planificados. Spec guardada en `soluciones/2026_06_21_R01_project_variables.md`. Pasar al Rol 02 (migración + factory) y Rol 05 (TDD fase roja). (2026-06-21)
- **De R01+R03 (Pedidos y Clientes del Mes con Sedes):** Replicación del patrón visual de la pantalla de Cotizaciones en la pantalla `metrics_orders` del TV Wall, agregando el desglose por Sede (Caldera, Ferretería, Central) tanto para Pedidos como para Cartera de Clientes. El builder ahora proyecta `orders.branches[]` y `customers.branches[]` con conteos procesados/pendientes y porcentajes; el layout CSS usa grid vertical 1.05fr 0.95fr 0.95fr y tipografías defensivas con `clamp()`. Cobertura TDD: nuevo `TvWallOperationalMetricsBuilderTest` con 5 tests/33 aserciones. Suite completa 184/184 tests verde. (2026-06-21)
- **De R03 (Especialista en Laravel y APIs):** Migración completa a Laravel 13 y adición de integraciones MCP (`laravel/boost`). Actualizado `composer.json` con dependencias flexibles para sortear incompatibilidades. Hardening de caché y parcheo de pruebas unitarias caídas por el nuevo comportamiento del inyector de dependencias (fixes en `TvWallErpSellerCatalogTest` y `TvWallApiTest`). Suite de 179 tests completamente en verde. (2026-06-21)
- **De R11+R04A (Refinamiento Estético UI/UX):** Resolución de desbordes de layouts provocados por tipografías masivas reduciendo inteligentemente los límites `clamp()`. Rediseño total de la tarjeta del Líder en la vista Operativa transformándola en un display centrado "Hero" para aprovechar espacios vacíos. Limpieza de datos redundantes en vista de Meta Mensual y corrección de márgenes y `height: 100%` en el nuevo componente del semáforo para evitar aplastamientos verticales y recortes horizontales del pin indicador. (2026-06-14)
- **De R04A+R11 (Frontend y UI/UX):** Purga completa de ApexCharts en la TV Wall por considerarse ilegibles y poco informativos desde lejos. Rediseñado el carrusel de métricas grupales en **4 nuevas pantallas completas independientes** (`metrics_sales`, `metrics_kilos`, `metrics_quotes`, `metrics_orders`) que cican en la rotación principal. Implementados estilos responsivos premium, tipografía panorámica y adaptabilidad flexbox/viewport. Corregida y pasada la suite de pruebas `TvWallPageTest` a verde con 75 aserciones. (2026-06-14)
- **De R01+R04A+R11 (PM, Blade y UI/UX):** Eliminada redundancia de KPIs en Resumen Operativo (reemplazada por Sedes e historial en vivo). Sustituido el formato de estrellas por el Semáforo de Cumplimiento (barra de 3 zonas y checklist con luces de estado). Elevado el diseño de celebración de nueva venta con animaciones premium (doble halo sonar, rayos giratorios y vibración de contador). Optimizada la responsividad del dashboard para evitar desbordes en televisores de 40" y laptops aplicando flexboxing defensivo, scrollbars ocultas y escalados de altura. (2026-06-14)
- **De R05+R06 (QA + Seguridad):** Auditoría completa de seguridad y calidad. 53 tests.
- **De R07 (Performance):** Caché de licencia, optimizaciones queries. 53 tests.
- **De R01+R03+R04A (Reportes):** Módulo ReportConfig creado (migración, modelo, service, controller, vistas CRUD, header/footer PDF, permiso `manage reports`). 71 tests.
- **De R11+R05 (UI/UX + Tests):** Vista previa visual reactiva con Alpine.js en edit. Tests del módulo (18 tests). 71 tests.
- **De R12 (Debugging 403):** Fix 403 en `/company/` para super admin. CustomPermissionMiddleware bypass. Página error 403 personalizada AdminLTE. 71 tests.
- **De R12 (Debugging 403):** Fix 403 en `/company/` para super admin. CustomPermissionMiddleware bypass. Página error 403 personalizada AdminLTE. 71 tests.
- **De R01+R12 (Bugfix y Diseño API):** Fix 500 en `/company/` al vencer el Trial (undefined array key 'type'). Diseño de contrato API-First para migrar CompanyController a ApiController (2026-05-31).
- **De R02 (DBA API-First):** Diagnóstico y migración blameable `created_by` para la tabla `company_settings` como Singleton (2026-05-31).
- **De R05 (QA Automation):** Creación de `CompanyApiTest.php` en Fase Roja. Verificación de 8 tests fallando en TDD para la estructura de `CompanySettings` (2026-05-31).
- **De R03 (Backend API):** Implementación de `CompanyApiController`, `CompanySettingService`, `CompanySettingResource`, y `CompanyUpdateRequest`. Tests pasados a verde (Fase Verde TDD) (2026-05-31).
- **De R04A (Frontend Web):** Refactor de `index.blade.php` para consumir APIs con Alpine y Axios. Limpieza completa de inyección en WebController. (2026-05-31).
- **De R05 (QA Frontend):** Verificación de paridad API-First en Vistas. Creación de `CompanyViewTest.php` comprobando aislamiento de controladores web (Cero compact/with). (2026-05-31).
- **De R06 (Seguridad y Auditoría):** Implementación de Middleware OWASP Global (HSTS, DENY), mitigación Mass-Assignment en Modelo, DB Locks y Rate Limiting para licenciamiento. (2026-05-31).
- **De R11 (UI/UX Pro Max):** Embellecimiento global de vistas AdminLTE. CSS global `admin-enhanced.css` (cards, forms, DataTables, KPI, botones). Mejoras en dashboard, users/roles CRUD, report-configs, license, empresa. 80 tests pasando. (2026-05-31).
- **De R01+R09 (Auditoría API-First):** Auditoría completa de compliance API-First en todos los módulos. Solo Company/Empresa cumple. Reporte en `soluciones/2026_05_31_api_first_audit.md` con scorecard, violaciones y plan de refactor priorizado. (2026-05-31).
- **De R01+R03+R04A+R05+R11 (TV Wall):** Dashboard público `/tv` con API mock, ranking por cantidad de ventas, celebración con contador animado, botón demo gated por `TV_WALL_DEMO_MODE`. (2026-06-08).
- **De R02+R03 (TV Wall ERP fase 2):** Métricas desde `saFacturaVenta`, pedidos, cotizaciones, devoluciones y eventos por `doc_num`. Ver `soluciones/2026_06_09_R02_tv_wall_erp_metricas_fase2.md`. (2026-06-09).
- **De R01+R07 (TV Wall performance):** Caché snapshot/ERP, ETag 304, job `tv-wall:refresh-metrics`, Q09 window function, perfil `on_demand`. Ver `soluciones/2026_06_09_R01_tv_wall_performance_profit.md`. (2026-06-09).
- **De R01 (TV Wall multi-sede):** Diseño cruce Caldera (Profit Plus) + Ferretería (legacy `factura`). Fase 1: sumar sedes en snapshot. Ver `soluciones/2026_06_10_R01_tv_wall_multi_sede_ferreteria.md`. (2026-06-10).
- **De R01 (TV Wall multi-sede fase 2):** Merge ventas por vendedor Ferretería en `sellers[]` por `co_ven`; vendedores solo-Ferretería al ranking. Q-F01–F03 confirmados. Ver `soluciones/2026_06_10_R02_tv_wall_multi_sede_vendedores_ferreteria.md`. (2026-06-10).
- **De R05 (TV Wall multi-sede TDD):** 9 tests fase roja (5 unit merger + 4 feature). Ver `soluciones/2026_06_10_R05_tv_wall_multi_sede_vendedores_tdd.md`. (2026-06-10).
- **De R03 (TV Wall multi-sede fase 2):** Merge ventas Ferretería por `co_ven` en ranking; 146 tests verde. Ver `soluciones/2026_06_10_R03_tv_wall_multi_sede_vendedores_implementacion.md`. (2026-06-10).
- **De R02 (TV Wall Ferretería KPIs):** Probe `tf2_adm` Q-F04–Q-F10; equivalencia Caldera→legacy documentada. Ver `soluciones/2026_06_11_R02_tv_wall_ferreteria_metricas_legacy.md`. (2026-06-11).
- **De R05 (TV Wall paridad TDD):** Tests merger KPIs, team aggregator, snapshot `metrics.*` multi-sede. (2026-06-11).
- **De R03 (TV Wall paridad fase 3):** KPIs Ferretería completos + `data.metrics` agregados; 150 tests verde. Ver `soluciones/2026_06_11_R03_tv_wall_ferreteria_paridad_implementacion.md`. (2026-06-11).
- **De R01 (ApexCharts fix + semáforo over-100 + estrellas):** Fix x-effect dependency tracking; nuevo color púrpura `over` para >100%; data labels con contraste por semáforo; estrellas animadas en goal ranking y seller detail. 116 tests verde. Ver `soluciones/2026_06_10_R01_fix_apexcharts_tv_wall.md`. (2026-06-10).
- **De R04A (Full-screen + animación):** Eliminados límites min-height en contenedores ApexCharts para expansión completa; animación fade+slide-up en charts; ApexCharts animation mejorado (easeout 1000ms nuevo / 600ms update); fallback height `calcApexHeight`. 41 TV Wall tests verde. Ver `soluciones/2026_06_10_R04A_tv_wall_fullscreen_animacion.md`. (2026-06-10).
- **De R01 (TV Wall sync BD):** Diseño API-First para materializar snapshot en BD local (sync 5–10 min); events/celebración siguen consultando Profit live. Ver `soluciones/2026_06_08_R01_tv_wall_sync_bd_local.md`. (2026-06-08).
- **De R02 (TV Wall Sync Ferretería/Central):** Fix columna `inactivo` inexistente en BD legacy. Sync 3 sedes OK. Suite 205/205. (2026-06-22)
- **De R03 (Fix quotes_daily_count + rename command):** Fix: el SQL calculaba `quotes_daily_count` correctamente pero el return array lo descartaba. Rename: `tv-wall:sync-snapshot` → `tv-wall:sincronizar`. Ver `soluciones/2026_06_22_R03_fix_quotes_daily_count_rename_command.md`. Suite 205/205. (2026-06-22)
- **De R09+R12 (TV Wall mock enabled-flag + bundle JS):** Fix error `podiumDisplayMode is not defined` recompilando bundle. Fix: mock path + builder filtran por enabled. `.env` Ferretería disabled. 10 filas en `project_variables`. Suite 208 tests. (2026-06-22)
- **De R01 (Seller Goals USD):** Diseño API-First de CRUD para asignar metas USD por vendedor. Nueva tabla `seller_goals`. La meta USD reemplaza la meta por cantidad de ventas. Integración con TvWallGoalResolver: busca meta manual, si no existe usa default global. Contrato API con 6 endpoints + lookup. 4 permisos Spatie. Spec en `soluciones/2026_06_22_R01_seller_goals_usd.md`. Pasar a Rol 02 (migración + factory) y Rol 05 (TDD fase roja). (2026-06-22)

## Última Intervención (2026-06-24)

| ROL | MÓDULO | ESTADO | DETALLE |
|:---|:---|:---|:---|
| **R04A** | **TV Wall Seller Detail: Rediseño Galería KPI Premium** | ✅ **COMPLETO** | Vista `screen-seller-detail.blade.php` completamente rediseñada con 6 KPI cards premium y 1 sección expandible. **HERO card "Cumplimiento de Meta"** con anillo conic-gradient CSS (técnica mask radial), delta vs equipo, semáforo 4 zonas y label dinámico "Falta X%" / "Meta alcanzada" / "¡Superó la meta!". **3 KPI cards satélites**: Ventas (color semáforo por meta + trend up/down/same), Pedidos (ratio procesados/total + bar fill + warning si ≥50% pendientes), Devoluciones (badge "OK"/"Alerta" con pulse animation si supera threshold). **2 KPI cards duales**: Clientes (nuevos/reactivados con split bar dorado+azul), Cotizaciones (mes+hoy en 2 columnas con 3 stats cada una: Procesadas/Pendientes/Anuladas). **Sección "Desempeño por Sede"** con cards individuales por sucursal (Caldera/Central) con 4 métricas (Clientes/Facturas/Pedidos/Kg). Tooltips `title=""` en TODOS los elementos accionables (rule #10). Animaciones: `tvKpiHeroOverPulse` (3s purple glow cuando >100%), `tvKpiAlertPulse` (2.5s red glow en devoluciones críticas), `tvRingShine` (4s ring glow púrpura), hover lift -2px en todas las cards. Tokens CSS semánticos (sin rgba inline). 262/262 tests verde. Bundle CSS `tv-wall-KDt_klyb.css` (178.58 kB / 31.01 kB gzip, +13 kB). Pint: passed. Guardado en `soluciones/2026_06_24_R04A_tvwall_seller_detail_kpi_redesign.md`. Pasa a R10. |
| **R01** | **Test Fixes — Seeders y Permisos** | ✅ **COMPLETO** | Modificado `DatabaseSeeder` para evitar `UniqueConstraintViolationException` usando `firstOrCreate()`. Creado `SellerGoalSeeder` para poblar `$this->seed()` en `lookup_vendedor_existente_retorna_datos()` y agregado a `DatabaseSeeder.php`. Arreglado el casing de roles en `PermissionSeeder` a "Super Admin" y "Administrador". Las pruebas unitarias están pasando con éxito (262 tests / 1436 aserciones). Guardado en `soluciones/2026_06_24_R01_modificar_seeders_para_pruebas.md`. |

## Última Intervención (2026-06-23)

| ROL | MÓDULO | ESTADO | DETALLE |
|:---|:---|:---|:---|
| **R04A** | **TV Wall (Frontend Blade)** | ✅ **COMPLETO** | Corregido indicador en "Persiguiendo el podio" para calcular la brecha matemáticamente contra el 3er lugar (`sellerVsPodiumGap`) en vez del 1er lugar (`al #1`). JS actualizado y vista recompilada con Vite. Guardado en `soluciones/2026_06_23_R04A_tvwall_chase_podium_indicator.md`. |
| **R04A** | **TV Wall Gestión de Cotizaciones: fix solapamiento cards** | ✅ **COMPLETO** | Refactor `.tv-quotes-layout` a grid 2 filas (panorama 1fr + branch grid 1.5fr). `.tv-quotes-panorama` con `min-height: 0` + `overflow: hidden`. `.tv-branch-ventas-grid` con `grid-template-rows: auto` + `align-content: start` (cards a altura natural). Fix también aplica a `screen-branch-ventas` y `screen-metrics-orders`. Bundle CSS `tv-wall-DfwdpcbY.css` regenerado. 235/235 tests verde. |
| R04A | TV Wall Cotizaciones + Pedidos/Clientes formato Ventas por Sede | COMPLETO | Eliminado doble "kg" en Avance general / card sede. Refactor `screen-metrics-quotes` y `screen-metrics-orders` para usar `tv-branch-card` en cards por sede. Orders ahora usa 2x2 grid (panoramas top, branches bottom). Badge semáforo y bar split añadidos. Bundle CSS `tv-wall-DP7k1vb3.css` regenerado. 235/235 tests verde. |
| **R10** | **TV Wall (Métricas)** | ✅ **COMPLETO** | 1. **Optimización de Consultas (R14)**:
    *   Se diseñaron e integraron consultas SQL unificadas con `UNION ALL` y `GROUPING SETS` para calcular Facturas, Devoluciones y Peso Neto en un solo escaneo.
    *   **Caldera (2k12)** utiliza `co_sucu_in` en las tablas de `saFacturaVenta`.
    *   **Central (2k8)** utiliza `co_sucu` en las tablas de `factura`.
    *   Se actualizó `ProfitErpMetricsRepository` y `LegacyProfitMetricsRepository` agregando `getBranchTotals()`.
    *   Se actualizó la sincronización en `TvWallBranchTotalsService` para extraer directamente los totales por sede (Kilos, Facturas y Devoluciones) de la nueva consulta SQL, ignorando la suma manual de vendedores. |
| **R14** | **TV Wall (Métricas)** | ✅ **COMPLETO** | Consultoría SQL para calcular el total de ventas efectivas (Facturas - Devoluciones) en USD para el mes en curso en ambas sedes (2k12 y 2k8). Guardado en `soluciones/2026_06_23_R14_ventas_efectivas_ambas_sedes.md`. |
| **R01** | **TV Wall (Métricas)** | ✅ **COMPLETO** | Diseño API-First para refactorizar la lógica de ventas y devoluciones utilizando la query consolidada de R14, cambiando la semántica de "Monto de Ventas Brutas" a "Ventas Efectivas (Facturas - Devoluciones)". Guardado en `soluciones/2026_06_23_R01_tvwall_ventas_efectivas.md`. |
| **R01** | **TV Wall (Métricas)** | ✅ **COMPLETO** | Diseño API-First para refactorizar la lógica de clientes nuevos y reactivados usando las consultas CTE de R14. Guardado en `soluciones/2026_06_23_R01_tvwall_clientes_r14_logic.md`. |
| **R02** | **TV Wall (DBA)** | ✅ **COMPLETO** | Optimización de consulta R14 inyectando predicados para el mes en curso y evitando escaneos completos. Guardada en `soluciones/2026_06_23_R02_tvwall_clientes_r14_datos.md`. |
| **R05** | **TV Wall (QA)** | ✅ **COMPLETO** | Creado test unitario `ProfitErpMetricsRepositoryTest.php` en Fase Roja (falla al esperar 15 vs 0) que asegura la ejecución de la consulta optimizada y el merging del `TOTAL` y vendedores. Guardado en `soluciones/2026_06_23_R05_tvwall_clientes_r14_qa.md`. |
| **R03** | **TV Wall (Backend API)** | ✅ **COMPLETO** | Implementación del CTE en `fetchMonthlyClientsStatus` y refactor local eliminando las dependencias muertas. Caché a nivel de instancia y suite de tests 236 en Fase Verde. Guardado en `soluciones/2026_06_23_R03_tvwall_clientes_r14_backend.md`. |
| **R04A** | **TV Wall (Frontend Blade)** | ✅ **COMPLETO** | Consumo de API (Drop-in). Inyectados tooltips explicativos en los componentes `screen-metrics-orders` y `seller-performance` sobre la ventana inactiva de 6 meses. Guardado en `soluciones/2026_06_23_R04A_tvwall_clientes_r14_frontend.md`. |
| **R06** | **Seguridad y Auditoría** | ✅ **COMPLETO** | Auditoría final de prevención SQL Injection y fugas de datos. Dictamen de aprobación para producción. Guardado en `soluciones/2026_06_23_R06_tvwall_clientes_r14_seguridad.md`. |
| **R10** | **Mantenimiento Ecosistema** | ✅ **COMPLETO** | Cierre Atómico de la funcionalidad R14. Limpieza de PRÓXIMOS PASOS, consolidación en HANDOVER.md e inyección de dictamen R10 en la bóveda de soluciones. Guardado en `soluciones/2026_06_23_R10_tvwall_clientes_r14_cierre.md`. |
| **R05** | **TV Wall (QA)** | ✅ **COMPLETO** | Actualizado test de snapshot (`test_snapshot_responds_without_authentication`) en `TvWallApiTest.php` para asegurar que el nodo de `performance.quotes` de cada vendedor cumpla con el nuevo contrato de jerarquía (monthly/daily), garantizando también que el monto USD permanezca filtrado de la vista pública. Suite Verde con 744 aserciones. Guardado en `soluciones/2026_06_23_R05_tvwall_seller_quotes_qa.md`. |
| R03 | TV Wall (Backend API) | ✅ **COMPLETO** | Refactorización de la respuesta API de cotizaciones (`TvWallOperationalMetricsBuilder`) para implementar una estructura anidada de métricas mensuales y diarias, incorporando los nuevos campos de totales, procesadas, sin procesar y anuladas de la query de R14. Modificado `TvWallSnapshotResource` para omitir los montos USD confidenciales en la nueva jerarquía. Modificados tests (`TvWallApiTest`, `TvWallErpMetricsTest`, `TvWallOperationalMetricsBuilderTest`, `ProfitErpMetricsRepositoryTest`) adaptando mocks y aserciones. Guardado en `soluciones/2026_06_23_R03_refactor_quotes_builder.md`. Suite verde (236 tests). |
| R04A | TV Wall (Frontend Blade) | ✅ **COMPLETO** | Refactorización de la UI de cotizaciones (`screen-metrics-quotes.blade.php`) para soportar la nueva estructura anidada. Se dividió el panorama general en dos cards: "Mensual" y "Hoy". Se actualizó la vista por sucursal (`tv-branch-card`) con una estructura en grid de 2 columnas para mostrar tanto el avance mensual como diario por separado. Actualizado componente JS para las gráficas laterales. Bundle recompilado con Vite. Suite verde (236 tests). Guardado en `soluciones/2026_06_23_R04A_tvwall_quotes_nested_ui.md`. |
| R04A | TV Wall Ventas por Sede UI Fixes | COMPLETO | Eliminado texto "Profit Plus"/"Profit 2k8". Removidos 3 sufijos `%` duplicados. Auto-scroll de vendedores corregido (layout grid + min-height: 0 + flex: 1 en sellers list). Bundle CSS `tv-wall-B_We9n6W.css` regenerado. 235/235 tests verde. |
| R04A | Seller Goals USD | COMPLETO | Vistas Blade CRUD con DataTable + Alpine.js + lookup vendedor. 233 tests/1274 assertions. |
| R09+R12 | TV Wall mock enabled + bundle JS | VERDE | Bundle JS regenerado (`tv-wall-Ch0BXYjc.js`). Filtro `enabled` aplicado. Ferretería excluida. Suite 208/1206. |
| R03 | TV Wall | VERDE | Fix `quotes_daily_count` descartado. Rename comando. |
| R02 | TV Wall Sync Ferretería/Central | VERDE | Fix columna `inactivo` inexistente en BD legacy. |

---

## PRÓXIMOS PASOS

1. ✅ **Rol 14** → Consulta SQL original entregada
2. ✅ **Rol 01** → Diseño API-First y definición lógica (drop-in)
3. ✅ **Rol 02** → Optimización DBA con CTEs y filtros
4. ✅ **Rol 05** → TDD Fase Roja
5. ✅ **Rol 03** → TDD Fase Verde e integración Memoizada
6. ✅ **Rol 04A** → UX: Inyección de tooltips informativos en Frontend
7. ✅ **Rol 06** → Auditoría de Seguridad e Integridad SQL
8. ✅ **Rol 10** → Cierre de Módulo y consolidación HANDOVER

**Status Global:** Módulo de Clientes Nuevos/Reactivados completado con éxito. A la espera de nuevas instrucciones del Product Owner.

## 📋 EXCEPCIONES BLUEPRINT ACTIVAS

| MIGRACIÓN | RAZÓN | FECHA | ROL |
| :--- | :--- | :--- | :--- |
| `2026_05_30_000001_create_report_configs_table` | Nuevo módulo Reportes | 2026-05-30 | R01 |
