fad4006f60
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
76 lines
3.2 KiB
Markdown
76 lines
3.2 KiB
Markdown
---
|
|
id: "0093"
|
|
title: "kanban: reporte diario al pulsar numero del dia en el calendario"
|
|
status: pendiente
|
|
type: feature
|
|
domain:
|
|
- kanban
|
|
scope: multi-app
|
|
priority: media
|
|
depends: []
|
|
blocks: []
|
|
related: []
|
|
created: 2026-05-17
|
|
updated: 2026-05-17
|
|
tags: []
|
|
---
|
|
|
|
## Problema
|
|
|
|
El calendario muestra conteos de creadas/hechas/deadlines por dia pero no permite profundizar. Falta un reporte tipo "retro diaria" con rankings, lista de tareas hechas con enlaces, y metricas operativas (lead time, reabiertas, estancadas).
|
|
|
|
## Solucion
|
|
|
|
### Backend
|
|
|
|
Endpoint `GET /api/reports/daily?date=YYYY-MM-DD&tz=Europe/Madrid` con agregaciones sobre `cards`, `card_events`, `card_column_history`, `card_lock_history`.
|
|
|
|
Estructura del reporte:
|
|
- `kpis`: done, created, moves, blocked_ms, deadlines met/missed, reopened, archived_auto, archived_manual.
|
|
- `top_assignees_done`, `top_assignees_created`, `top_requesters_added`, `top_requesters_done` (top 5).
|
|
- `done_cards`: lista completa de hechas con `id`, `seq_num`, titulo, solicitante, asignado (id+nombre), tags, columna, completed_at, lead_time_ms.
|
|
- `reopened_cards`: cards que el dia X entraron a una columna no-done viniendo de una previa done. Incluye actor.
|
|
- `stale_cards`: 3 buckets (7-13d, 14-29d, 30+d) por columnas activas (no done, no archived).
|
|
- `lead_time`: avg/p50/p95/samples de las hechas del dia.
|
|
- `hourly_moves`: array de 24 con conteo de movimientos por hora local.
|
|
- `deadlines`: contadores + lista de vencidas con `late_ms`.
|
|
- `tags_done`: top 10 tags trabajadas hoy.
|
|
- `archived_today`: total archivadas en el dia.
|
|
|
|
Funcion: `db.DailyReportFor(date, tz)` en `backend/reports.go`. Day range = [t, t+24h) en TZ del cliente, convertido a UTC para consultar columnas TEXT ISO.
|
|
|
|
### Frontend
|
|
|
|
Componente `DailyReportView` (`components/DailyReport.tsx`) que recibe `date` y `onJumpToCard`. Layout:
|
|
- Header: titulo + fecha formateada en es-ES.
|
|
- 6 KPI cards (`SimpleGrid` cols 2/4/6).
|
|
- 4 rankings con avatares (`SimpleGrid` cols 1/2/4).
|
|
- Tabla de tareas hechas (scrollable, click en titulo -> `onJumpToCard` -> cierra modal -> highlight + scroll al tablero).
|
|
- `BarChart` (Mantine Charts) con movimientos por hora.
|
|
- Tags trabajadas en chips.
|
|
- Bloque reabiertas (solo si hay).
|
|
- Bloque deadlines (solo si hay actividad).
|
|
- 3 columnas de estancadas con click-to-jump.
|
|
|
|
Apertura: `CalendarView` recibe `onOpenDailyReport(date)` y envuelve el numero del dia en un `UnstyledButton` (`data-test="calendar-day-YYYY-MM-DD"`). `App` abre un `modals.open` con `size="90%"` y `<DailyReportView />` dentro.
|
|
|
|
### Tests
|
|
|
|
Playwright `e2e/daily-report.spec.ts`:
|
|
- Endpoint devuelve estructura esperada (kpis, done_cards, hourly_moves[24], stale_cards.d7/d14/d30).
|
|
- Click en numero del dia del calendario abre el modal con titulo "Reporte diario" y textos "Hechas"/"Movimientos" visibles.
|
|
|
|
## Criterios de aceptacion
|
|
|
|
- [ ] GET `/api/reports/daily?date=...&tz=...` responde JSON estructurado.
|
|
- [ ] Click en numero del dia en el calendario abre modal full-width con KPIs.
|
|
- [ ] Tabla de hechas con click-to-jump funcional.
|
|
- [ ] Reabiertas detectadas correctamente (card que viene de columna `is_done=1` previa).
|
|
- [ ] Estancadas listadas por buckets 7/14/30d.
|
|
- [ ] Tests Playwright pasan.
|
|
|
|
## Rama / commits
|
|
|
|
- Rama: `issue/0093-kanban-daily-report`
|
|
- Merge `--no-ff` a master.
|