feat(F-157): completed feature

This commit is contained in:
chattie
2026-08-22 17:42:35 +02:00
parent e48577c61a
commit 7159baf851
18 changed files with 255 additions and 599 deletions

View File

@@ -0,0 +1,15 @@
# F-157 — Diseño
## Decisión
Usar un layout anidado de Next.js en `app/(dashboard)/reporting/layout.tsx` para alojar navegación local persistente, siguiendo el patrón visual de las pestañas internas de Ajustes.
## Cambios
1. `permissions.ts`: el modelo del sidebar vuelve a ser plano; solo existe la entrada principal `/reporting`.
2. Dashboard layout: renderiza únicamente entradas del menú principal, sin subitems.
3. Reporting nested layout: lista local Dashboard, Ventas y Productos con estado activo según `usePathname`.
4. `/reporting`: redirige a `/reporting/dashboard`, que actúa como apartado inicial.
## Riesgos
- Evitar que `/reporting` se marque distinto: el sidebar usa `pathname.startsWith('/reporting')`.
- Evitar duplicar paddings: el layout local solo añade estructura flex y deja a cada página su contenido.
- Mantener RBAC existente; no se introducen rutas ni permisos nuevos.

View File

@@ -0,0 +1,7 @@
# F-157 — Documentación
Cambio de comportamiento visible:
- El menú principal contiene únicamente **Reporting**.
- Al abrir Reporting se selecciona **Dashboard** por defecto.
- **Dashboard**, **Ventas** y **Productos** son apartados internos del módulo y se muestran en la navegación local de Reporting, igual que los apartados de Ajustes.

View File

@@ -0,0 +1,23 @@
# F-157 — Implementer
## Implementación
- Eliminados Dashboard, Ventas y Productos de `NAV_ITEMS`; el menú principal conserva una única entrada Reporting.
- Simplificado el sidebar para renderizar solo `visibleNavItems`.
- Añadido `reporting/layout.tsx` con navegación local persistente, estilo Ajustes, y estado activo accesible mediante `aria-current`.
- `/reporting` redirige al apartado inicial `/reporting/dashboard`.
- Eliminados los enlaces redundantes «← Reporting» de las páginas internas.
- Corregido el contrato frontend de `sort` en productos para que el build del admin use el filtro backend existente en vez de enviar `groupBy=revenue`.
## Evidencia
- `cd project/apps/admin && npm run build`: PASS, 29 rutas generadas.
- `cd project && node_modules/.bin/tsc --noEmit`: PASS.
- `git diff --check`: PASS.
- `./scripts/verify.sh`: PASS.
## Archivos
- `project/apps/admin/src/app/(dashboard)/layout.tsx`
- `project/apps/admin/src/lib/permissions.ts`
- `project/apps/admin/src/app/(dashboard)/reporting/layout.tsx`
- `project/apps/admin/src/app/(dashboard)/reporting/page.tsx`
- `project/apps/admin/src/app/(dashboard)/reporting/{dashboard,sales,products}/page.tsx`
- `project/apps/admin/src/lib/reporting-client.ts`

View File

@@ -0,0 +1,15 @@
{
"feature_id": "F-157",
"agent": "leader",
"stage": "close",
"verdict": "APPROVED",
"summary": "Reporting queda como una entrada única del sidebar y sus tres apartados viven dentro del módulo.",
"checks": [
{ "item": "Reviewer approved", "ok": true },
{ "item": "Security approved", "ok": true },
{ "item": "QA approved", "ok": true },
{ "item": "Admin build passed", "ok": true },
{ "item": "verify.sh passed", "ok": true }
],
"issues": []
}

View File

@@ -0,0 +1,15 @@
{
"feature_id": "F-157",
"agent": "qa",
"stage": "qa_gate",
"verdict": "APPROVED",
"summary": "Los cuatro criterios de aceptación quedan cubiertos.",
"checks": [
{ "item": "Only one Reporting sidebar entry", "ok": true, "evidence": "Static acceptance check passed" },
{ "item": "Three page-local sections", "ok": true, "evidence": "Nested layout contains Dashboard, Ventas, Productos" },
{ "item": "Active section marker", "ok": true, "evidence": "usePathname plus aria-current=page" },
{ "item": "Admin build", "ok": true, "evidence": "Next.js production build passed" },
{ "item": "Harness", "ok": true, "evidence": "verify.sh passed" }
],
"issues": []
}

View File

@@ -0,0 +1,14 @@
{
"feature_id": "F-157",
"agent": "reviewer",
"stage": "review_gate",
"verdict": "APPROVED",
"summary": "El sidebar queda plano con una sola entrada Reporting y la navegación de secciones vive en el layout interno.",
"checks": [
{ "item": "Sidebar has only Reporting", "ok": true, "evidence": "permissions.ts contains no reporting child NAV_ITEMS" },
{ "item": "Local section navigation", "ok": true, "evidence": "reporting/layout.tsx lists Dashboard, Ventas and Productos" },
{ "item": "Admin production build", "ok": true, "evidence": "Next.js build generated 29 routes" },
{ "item": "TypeScript", "ok": true, "evidence": "project tsc --noEmit passed" }
],
"issues": []
}

View File

@@ -0,0 +1,13 @@
{
"feature_id": "F-157",
"agent": "security",
"stage": "security_gate",
"verdict": "APPROVED",
"summary": "Sin cambios de autenticación ni autorización; Reporting conserva el permiso reporting.read del menú principal y las rutas backend mantienen RBAC existente.",
"checks": [
{ "item": "RBAC unchanged", "ok": true, "evidence": "Only navigation presentation changed" },
{ "item": "Static internal links", "ok": true, "evidence": "All section hrefs are hard-coded same-origin paths" },
{ "item": "No secret or dependency change", "ok": true, "evidence": "No config secrets or packages modified" }
],
"issues": []
}