feat(F-160): completed feature

This commit is contained in:
chattie
2026-08-22 18:05:33 +02:00
parent f802a83773
commit 83a44980c6
12 changed files with 87 additions and 45 deletions

View File

@@ -0,0 +1,8 @@
# F-160 — Diseño
Corrección mínima en `ReportingService.runSalesQuery`:
1. `selectExpr` representa cuatro columnas dimensionales y debe terminar con coma antes de métricas agregadas.
2. Para dimensión `terminal`, el resultado incluye tienda y terminal; ambas columnas deben estar en `GROUP BY`.
3. Las expresiones dinámicas permanecen limitadas al enum `GroupBy`; filtros siguen parametrizados `$1..$8`.
4. Verificación runtime autenticada de `day`, `channel`, `store` y `terminal` mediante proxy admin.

View File

@@ -0,0 +1,3 @@
# F-160
Corregido el error 500 de `/reporting/sales` para agrupaciones por día, canal, tienda y terminal. No cambia el contrato HTTP.

View File

@@ -0,0 +1,12 @@
# F-160 — Implementer
## Fix
- Añadida la coma ausente entre columnas dimensionales y agregados en `runSalesQuery`.
- `groupBy=terminal` agrupa por `store_id, terminal_id` porque ambas columnas se seleccionan.
- Añadidos 2 tests de regresión sobre SQL generado.
## Evidencia
- Reporting service: 16/16 tests PASS.
- TypeScript PASS.
- Runtime autenticado vía `:3004`: day=200, channel=200, store=200, terminal=200.
- Filtros continúan parametrizados; dimensiones proceden de enum controlado.

View File

@@ -0,0 +1 @@
{"feature_id":"F-160","agent":"leader","stage":"close","verdict":"APPROVED","summary":"Reporting sales grouped endpoints fixed and validated.","checks":[{"item":"all gates","ok":true},{"item":"runtime HTTP 200","ok":true},{"item":"verify","ok":true}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-160","agent":"qa","stage":"qa_gate","verdict":"APPROVED","summary":"Todos los agrupamientos usados por Dashboard responden 200.","checks":[{"item":"day","ok":true},{"item":"channel","ok":true},{"item":"store","ok":true},{"item":"terminal","ok":true},{"item":"unit regression","ok":true,"evidence":"16/16"}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-160","agent":"reviewer","stage":"review_gate","verdict":"APPROVED","summary":"SQL corregido mínimamente con cobertura de regresión.","checks":[{"item":"tests","ok":true,"evidence":"16/16"},{"item":"runtime groups","ok":true,"evidence":"day/channel/store/terminal HTTP 200"}],"issues":[]}

View File

@@ -0,0 +1 @@
{"feature_id":"F-160","agent":"security","stage":"security_gate","verdict":"APPROVED","summary":"Sin nueva superficie de inyección SQL.","checks":[{"item":"values parameterized","ok":true,"evidence":"Filters remain $1..$8"},{"item":"dimension allowlist","ok":true,"evidence":"Group expressions selected from GroupBy switch"}],"issues":[]}

View File

@@ -1,23 +1,14 @@
# Feature activa: F-159Admin responsive collapsible sidebar
# Feature activa: F-160Fix Reporting sales grouped queries returning 500
## Objetivo
Añadir un único `SidebarToggle` reutilizando el layout y `NAV_ITEMS` existentes.
## Causa raíz
`runSalesQuery` concatena `${selectExpr}` directamente antes de `COUNT(...)` sin coma, generando SQL inválido en todos los grupos. Además, el grupo `terminal` selecciona `o.store_id` pero agrupa solo por `terminal_id`.
## Comportamiento
- Desktop (`lg+`): expandido a 240px o colapsado a 80px mostrando solo iconos; preferencia guardada en `localStorage`.
- Mobile/tablet: sidebar como drawer superpuesto con backdrop; siempre muestra iconos y etiquetas.
- El estado del drawer no duplica ni sustituye el estado persistido de desktop.
- Transición suave de ancho y desplazamiento.
## Accesibilidad
- Botones con `aria-label`, `aria-expanded` y `aria-controls`.
- Drawer cerrado no es visible ni alcanzable por teclado.
- Escape cierra el drawer.
- Los enlaces conservan etiquetas accesibles y tooltips al colapsar.
## Solución
- Añadir coma explícita tras las columnas dimensionales.
- Agrupar terminal por `store_id, terminal_id`.
- Añadir tests de integración del servicio SQL real para day/channel/store/terminal.
## Aceptación
1. Toggle visible y operable por teclado.
2. Preferencia desktop persiste tras recarga.
3. Sidebar desktop colapsado muestra solo iconos.
4. Mobile/tablet usa drawer con backdrop y cierre por Escape.
5. Una sola fuente de navegación y build responsive sin regresiones.
- Los cuatro endpoints usados por Dashboard responden 200.
- No hay interpolación de valores del usuario; solo expresiones de enum controlado.
- Build, tests y verify pasan.

View File

@@ -1,68 +1,68 @@
{
"feature_id": "F-159",
"feature_id": "F-160",
"stage": "close",
"agent": "leader",
"action": "Close SidebarToggle feature",
"action": "Close Reporting sales fix",
"state": "running",
"next_agent": "leader",
"waiting_for": "Seleccionar una feature pending y actualizar este estado",
"updated_at": "2026-08-22T16:01:58Z",
"updated_at": "2026-08-22T16:05:20Z",
"timeline": [
{
"ts": "2026-08-22T15:58:39Z",
"ts": "2026-08-22T16:02:17Z",
"agent": "leader",
"stage": "intake",
"state": "running",
"message": "Define responsive persisted SidebarToggle"
"message": "Diagnose grouped Reporting sales SQL 500"
},
{
"ts": "2026-08-22T15:59:15Z",
"ts": "2026-08-22T16:02:44Z",
"agent": "architect",
"stage": "design",
"state": "running",
"message": "Design shared desktop collapse and mobile drawer state"
"message": "Specify grouped sales SQL correction"
},
{
"ts": "2026-08-22T15:59:47Z",
"ts": "2026-08-22T16:03:01Z",
"agent": "implementer",
"stage": "build",
"state": "running",
"message": "Implement accessible persisted SidebarToggle"
"message": "Fix grouped sales SQL and add regression coverage"
},
{
"ts": "2026-08-22T16:01:08Z",
"ts": "2026-08-22T16:04:34Z",
"agent": "reviewer",
"stage": "review_gate",
"state": "running",
"message": "Review shared responsive sidebar implementation"
"message": "Review SQL regression fix"
},
{
"ts": "2026-08-22T16:01:19Z",
"ts": "2026-08-22T16:04:45Z",
"agent": "security",
"stage": "security_gate",
"state": "running",
"message": "Audit localStorage and navigation accessibility"
"message": "Verify SQL parameterization remains safe"
},
{
"ts": "2026-08-22T16:01:30Z",
"ts": "2026-08-22T16:04:57Z",
"agent": "qa",
"stage": "qa_gate",
"state": "running",
"message": "Validate desktop/mobile/accessibility acceptance"
"message": "Validate grouped reporting endpoints"
},
{
"ts": "2026-08-22T16:01:48Z",
"ts": "2026-08-22T16:05:11Z",
"agent": "documenter",
"stage": "document",
"state": "running",
"message": "Document sidebar responsive behavior"
"message": "Record Reporting SQL fix"
},
{
"ts": "2026-08-22T16:01:58Z",
"ts": "2026-08-22T16:05:20Z",
"agent": "leader",
"stage": "close",
"state": "running",
"message": "Close SidebarToggle feature"
"message": "Close Reporting sales fix"
}
]
}