feat(sprint-1.5): rediseño visual PDF ROI + identidad InQ (Etapas 4-7)

- Header/footer compartidos con paleta InQ naranja en los 3 PDFs (Etapa 4)
- Layout híbrido portrait+landscape en PDFs Actual/Automatizado:
  página 2 landscape para diagrama BPMN heatmap (Etapa 5)
- Página 1 PDF ROI rediseñada: header denso, banner narrativo, KPI Hero
  con gradiente naranja→magenta, grid 2×2 de KPIs secundarios, Top 3
  actividades por ahorro (Etapa 6)
- Páginas 2-5 PDF ROI con identidad InQ: tabla con paleta naranja,
  análisis del ahorro, nota metodológica, trayectoria del ahorro
  acumulado con gráfico SVG nativo (Etapa 7)
- 500 tests verdes (+ 34 tests nuevos del Sprint 1.5)
- BACKLOG.md, TECH_DEBT.md, OBSERVATIONS.md: sistema de planificación
  reemplaza TODO.md

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-17 20:45:01 -03:00
parent 63c4fbac99
commit 2f4633a33c
20 changed files with 4163 additions and 117 deletions

View File

@@ -111,12 +111,16 @@ export function drawHeatmapImage(
): number {
if (!imageDataUrl) return startY
// Calcular altura proporcional (asumiendo aspect ratio ~2:1 del canvas BPMN)
const imgW = PDF.contentW
const imgH = Math.min(imgW / 2.2, 80) // máximo 80mm de alto
// Usar dimensiones dinámicas — funciona en portrait (210mm) y landscape (297mm)
const pageW = doc.internal.pageSize.getWidth()
const pageH = doc.internal.pageSize.getHeight()
const imgW = pageW - 2 * PDF.margin
// Altura: proporción ~2.2:1 del canvas BPMN, limitada por espacio disponible hasta el footer
const maxH = pageH - startY - PDF.margin - 20 // 20mm reservado para footer
const imgH = Math.min(imgW / 2.2, maxH)
const x = PDF.margin
if (startY + imgH > PDF.pageH - PDF.margin - 10) {
if (startY + imgH > pageH - PDF.margin - 10) {
doc.addPage()
startY = PDF.margin
}
@@ -131,7 +135,8 @@ export function drawHeatmapImage(
}
export function drawHeatmapLegend(doc: DocLike, startY: number): number {
const x = PDF.margin, barW = PDF.contentW, barH = 4
const pageW = doc.internal.pageSize.getWidth()
const x = PDF.margin, barW = pageW - 2 * PDF.margin, barH = 4
const labelY = startY + barH + 3.5
doc.setFontSize(7)