docs: fix spec review issues in dividend section design

This commit is contained in:
2026-03-23 12:01:03 +01:00
parent 001fbd90d9
commit cc3d3695fe

View File

@@ -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<DividendSectionRenderer>()` 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.