From ef47a1acfe9a029eec306fbe9f52ce1e72a6e509 Mon Sep 17 00:00:00 2001 From: egutierrez Date: Thu, 14 May 2026 18:08:19 +0200 Subject: [PATCH] docs(issues): kanban 0094 bocadillo agente + PDF Adjunta el issue del nuevo reporte diario con agente. --- dev/issues/0094-kanban-daily-summary-pdf.md | 71 +++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 dev/issues/0094-kanban-daily-summary-pdf.md diff --git a/dev/issues/0094-kanban-daily-summary-pdf.md b/dev/issues/0094-kanban-daily-summary-pdf.md new file mode 100644 index 00000000..6ebe8b7f --- /dev/null +++ b/dev/issues/0094-kanban-daily-summary-pdf.md @@ -0,0 +1,71 @@ +--- +id: "0094" +title: "kanban: bocadillo del agente + PDF descargable en reporte diario" +status: open +created_at: 2026-05-14 +priority: medium +app: kanban +--- + +## Problema + +El reporte diario (issue 0093) muestra tablas y graficos pero no resume el dia en lenguaje natural ni permite compartir el listado de tareas con solicitantes externos. + +## Solucion + +### Backend + +Migration 013 anade: +- `daily_summaries (date PK, summary, prompt, model, generated_at, generated_by)` para cachear el resumen del agente por dia. +- `settings (key PK, value, updated_at, updated_by)` clave/valor con un seed `daily_report_prompt` por defecto. + +Funciones en `daily_summary.go`: +- `GetDailySummary(date)` / `UpsertDailySummary(rec)`. +- `GetSetting(key)` / `SetSetting(key, value, by)`. +- `runClaudePrompt(ctx, prompt)` ejecuta `claude -p --model ` con stdin = prompt y devuelve stdout. Reutiliza `claudeBinary()` y `claudeModel()` del chat. +- `BuildDailySummaryPrompt(template, report)` interpola la plantilla con el JSON del reporte. +- `GenerateDailySummary(ctx, date, tz, actor)` orquesta: report + template + claude + persist. + +Endpoints: +- `GET /api/reports/daily/summary?date=YYYY-MM-DD` -> {exists, summary, prompt, model, generated_at, generated_by}. +- `POST /api/reports/daily/summary?date=...&tz=...` regenera y persiste. +- `GET /api/settings/{key}` -> {key, value}. +- `PUT /api/settings/{key}` body {value} -> 204. + +### Frontend + +`DailyReportView` ahora: +- Carga el resumen al abrir (`getDailySummary`). Si no existe, muestra placeholder "Aun no hay resumen del dia". +- Bocadillo visual: `Paper` azul claro con borde izquierdo gordo + icono `IconSparkles`, texto del resumen, fecha de generacion + modelo. +- Boton `IconRefresh` -> `generateDailySummary`. Loader durante la llamada. +- Boton `IconSettings` abre modal con el prompt actual (cargado via `getSetting`). Botones Guardar, Cancelar, Restablecer por defecto. +- Filtros nuevos en la tabla de tareas hechas: `Select` solicitante + `Select` asignado. La tabla y el contador "N k/total" reflejan el filtro. +- Boton "PDF": abre ventana nueva con HTML print-ready (page A4, CSS inline) que incluye: + * Cabecera + sub con filtros activos. + * 4 KPIs (Hechas filtradas, Lead time avg, Deadlines on-time, Reabiertas). + * Resumen del agente como blockquote azul (si existe). + * Tabla con links absolutos `${origin}/?card=${id}` para que el solicitante pueda saltar a cada card. + * Auto `window.print()` al cargar. + +### Tests + +`e2e/daily-summary-pdf.spec.ts`: +- CRUD roundtrip del setting `daily_report_prompt`. +- GET summary del dia devuelve estructura coherente (exists, summary). +- UI: modal del reporte expone boton PDF, boton Configurar prompt y boton Regenerar. + +No invocamos `claude -p` real en CI (depende del binario externo). El generador se prueba manualmente. + +## Criterios de aceptacion + +- [ ] Migration 013 crea ambas tablas con seed del prompt por defecto. +- [ ] Bocadillo del agente arriba de "Tareas hechas". +- [ ] Boton Regenerar invoca al agente, persiste y actualiza la UI. +- [ ] Modal de configuracion permite editar y guardar el prompt; reset. +- [ ] Filtros solicitante/asignado actualizan tabla y PDF. +- [ ] PDF con tabla, KPIs y enlaces internos a cada card. + +## Rama / commits + +- Rama: `issue/0094-kanban-daily-summary-pdf` +- Merge `--no-ff` a master.