diff --git a/docs/superpowers/specs/2026-03-23-dividend-section-design.md b/docs/superpowers/specs/2026-03-23-dividend-section-design.md index 684e85f..a18a89a 100644 --- a/docs/superpowers/specs/2026-03-23-dividend-section-design.md +++ b/docs/superpowers/specs/2026-03-23-dividend-section-design.md @@ -37,7 +37,7 @@ Il report è identico a quello attuale. Nessuna modifica visibile. ## Struttura tabella landscape Pagina A4 orizzontale (landscape), margini standard (`PdfTheme.PageMargin`). -Larghezza utile: ~770pt. Font: `PdfTheme.TableFont` (7pt). +Larghezza utile calcolata a runtime: `var size = page.GetClientSize(); float w = size.Width - 2 * PdfTheme.PageMargin; float h = size.Height - 2 * PdfTheme.PageMargin - PdfTheme.FooterHeight;` — NON usare costanti hardcoded. Font: `PdfTheme.TableFont` (7pt). ### Header a 2 livelli (colspan) @@ -72,7 +72,7 @@ Larghezza utile: ~770pt. Font: `PdfTheme.TableFont` (7pt). | Rend.Fut. | 40 | | **Totale** | **742** | -Le larghezze vengono scalate proporzionalmente a `w / total` per adattarsi alla larghezza utile esatta. +Le larghezze vengono scalate proporzionalmente: `float scale = w / total;` dove `w` proviene da `page.GetClientSize().Width - 2 * PdfTheme.PageMargin` (calcolato a runtime, non hardcoded). --- @@ -123,17 +123,18 @@ Stessa condizione: se `data.ShowDividend == true`, saltare il blocco "SEZIONE C: - Registrazione: `AddScoped()` in `Program.cs` - Metodo: `PdfDocument Render(CertificateReportData data)` - Pagina landscape A4, titolo "Sottostanti e Dividendi", tabella con header a 2 livelli -- Footer: `PdfTheme.DrawFooter(g, w, h, 1, data.ShowBranding)` +- Dimensioni pagina: ricavare da `page.GetClientSize()` — `w = size.Width - 2 * PageMargin`, `h = size.Height - 2 * PageMargin - FooterHeight` +- Footer: `PdfTheme.DrawFooter(g, w, h, 1, data.ShowBranding)` — il numero pagina `1` è relativo alla pagina interna del documento parziale, coerente con lo stesso pattern usato da tutti gli altri renderer (la numerazione assoluta è una limitazione nota del sistema di merge) ### 7. `ReportOrchestrator` -- Iniettare `DividendSectionRenderer` nel costruttore -- In entrambi i flussi (attivo ed expired): se `data.ShowDividend == true`, chiamare `DividendSectionRenderer.Render(data)` e aggiungerlo alla lista documenti da mergiare, subito dopo la Sezione 1 (Anagrafica) +- Aggiungere `DividendSectionRenderer dividendRenderer` come parametro del costruttore, accanto a `ExpiredAnagraficaSectionRenderer expiredRenderer` già presente — stesso pattern di iniezione diretta +- In entrambi i flussi (attivo ed expired): se `data.ShowDividend == true`, chiamare `dividendRenderer.Render(data)` e inserire il `PdfDocument` risultante nella lista documenti da mergiare **subito dopo** il documento della Sezione 1 (Anagrafica), prima di tutti gli altri --- ## Note implementative -- **Header colspan su PdfGrid**: Syncfusion `PdfGrid` non supporta nativamente colspan negli header. Implementare i due livelli di header come righe manuali disegnate con `DrawRectangle` + `DrawString`, poi la griglia dati sotto. Questa è la stessa tecnica usata per altri header complessi nel progetto. +- **Header colspan su PdfGrid**: Syncfusion `PdfGrid` non supporta nativamente colspan negli header. Implementare i due livelli di header come righe manuali disegnate con `DrawRectangle` + `DrawString` (seguire il pattern di `AnagraficaSectionRenderer.DrawEmittenteTable` per le altezze delle righe header: `rh = PdfTheme.RowHeight`). Riga 1 (gruppi): altezza `rh`; riga 2 (sotto-colonne): altezza `rh`. La `PdfGrid` dati viene disegnata a `y` iniziale = `y + rh * 2`. Le larghezze delle singole colonne nella riga 2 devono sommarsi esattamente alle larghezze dei gruppi in riga 1 per allineamento corretto. - **Colori negativi/positivi**: applicare `ColorPerformanceCell` su % Perf., Buf.Cap., Buf.CPN, Rend., Rend.Fut. — stessa logica di `AnagraficaSectionRenderer`. - **Valori assenti**: celle dividendo vuote mostrano `"—"`. - Il parametro `dividend` è indipendente da `branding` — entrambi possono essere attivi contemporaneamente.