--- 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 `` 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.