fad4006f60
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.3 KiB
3.3 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0094 | kanban: bocadillo del agente + PDF descargable en reporte diario | pendiente | feature |
|
multi-app | media | 2026-05-17 | 2026-05-17 |
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 seeddaily_report_promptpor defecto.
Funciones en daily_summary.go:
GetDailySummary(date)/UpsertDailySummary(rec).GetSetting(key)/SetSetting(key, value, by).runClaudePrompt(ctx, prompt)ejecutaclaude -p --model <m>con stdin = prompt y devuelve stdout. ReutilizaclaudeBinary()yclaudeModel()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:
Paperazul claro con borde izquierdo gordo + iconoIconSparkles, texto del resumen, fecha de generacion + modelo. - Boton
IconRefresh->generateDailySummary. Loader durante la llamada. - Boton
IconSettingsabre modal con el prompt actual (cargado viagetSetting). Botones Guardar, Cancelar, Restablecer por defecto. - Filtros nuevos en la tabla de tareas hechas:
Selectsolicitante +Selectasignado. 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-ffa master.