20 lines
1.8 KiB
JSON
20 lines
1.8 KiB
JSON
{
|
|
"feature_id": "F-147",
|
|
"agent": "reviewer",
|
|
"stage": "review_gate",
|
|
"verdict": "APPROVED",
|
|
"summary": "Admin reporting shell with navigation entry, global filters (channel/date/compare), URL persistence via Next.js searchParams, KPI grid with KpiCards, AvailabilityBadge per metric, and explicit loading/empty/error states. 2 pages: /reporting (summary) and /reporting/sales (grouped table). tsc 0, boundaries 0.",
|
|
"checks": [
|
|
{"item": "AC1 nav visible", "ok": true, "evidence": "permissions.ts: 'reporting.read' permission added to Permission type; NAV_ITEMS has { href: '/reporting', icon: '📈' } entry; can(role) for admin returns true"},
|
|
{"item": "AC2 default load", "ok": true, "evidence": "page.tsx uses DATE_PRESETS[1]='Últimos 30 días' as default; channel defaults to 'all'"},
|
|
{"item": "AC3 URL persistence", "ok": true, "evidence": "useSearchParams reads initial values; router.replace() updates URL on every filter change; page reload maintains state"},
|
|
{"item": "AC4 loading state", "ok": true, "evidence": "KPI grid shows animate-pulse skeletons while loading; spinner on refresh button"},
|
|
{"item": "AC5 empty state", "ok": true, "evidence": "'No hay datos para este período' with 📊 icon when items.length===0"},
|
|
{"item": "AC6 error state", "ok": true, "evidence": "error message + 'Reintentar' button renders on catch"},
|
|
{"item": "AC7 AvailabilityBadge", "ok": true, "evidence": "KpiCard shows AvailabilityBadge per metric; legend with all dataAvailability fields at bottom of summary page"},
|
|
{"item": "tsc/verify", "ok": true, "evidence": "npx tsc --noEmit 0 errors; boundaries 0 new; verify.sh green"},
|
|
{"item": "No new boundary violation", "ok": true, "evidence": "git diff: permissions.ts + lib/reporting-client.ts + components/reporting/ + app/(dashboard)/reporting/"}
|
|
],
|
|
"issues": []
|
|
}
|