---
id: "0093"
title: "kanban: reporte diario al pulsar numero del dia en el calendario"
status: open
created_at: 2026-05-14
priority: medium
app: kanban
---

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