# Design Spec: Redesign Pagina 1 Report + Parametro Footer **Data:** 2026-03-20 **Progetto:** CertReports.Syncfusion **Scope:** `AnagraficaSectionRenderer.cs`, `ReportController.cs`, `PdfTheme.cs`, modelli dati --- ## Obiettivo Ridisegnare la prima pagina del report PDF per renderla graficamente più professionale, riallineare i campi all'ordine del vecchio report DevExpress, e fare entrare la tabella Sottostanti nella prima pagina. Aggiungere inoltre un parametro API opzionale per abilitare/disabilitare il footer con branding Smart Roots. --- ## 1. Stile visivo (Opzione C — "Ibrido elegante") Approvato dall'utente. ### Titolo pagina - Testo: `"Scheda Prodotto {ISIN}"` — grande, **blu** (`#1565C0`), font bold 17pt - Sottotitolo: `"Tipologia: {Categoria}"` — grigio, 9.5pt - Separatore: linea orizzontale blu `#1565C0` spessore 2.5pt sotto il titolo - **Bid/Ask in alto a destra** del titolo: data/ora piccola in grigio, Bid e Ask in blu bold 13pt ### Intestazioni di sezione - Niente header-bar scura (attuale). Sostituire con: `font bold 10.5pt colore #1565C0` + accent line verticale sinistra 3pt blu - Esempio: `"Caratteristiche Prodotto"`, `"Analisi"`, `"Sottostanti"` ### Tabelle dati emittente - Border 1px `#bbb`, border-radius 2px - Prima riga: header piena `#1565C0` bianco bold (es. `"EMITTENTE UBS"`) - Righe alternate: sfondo `#f9f9f9` / bianco - Bordi interni `#e5e5e5` 0.5pt ### KV pairs (sezione Analisi) - Label a sinistra in grigio `#555`, valore a destra bold - Separatori orizzontali `#e8e8e8` 0.3pt - Valori negativi in rosso `#CC0000`, valori chiave (cedola) in blu `#1565C0` --- ## 2. Struttura e ordine campi — Pagina 1 La prima pagina è divisa in **3 sezioni** verticali, tutte dentro una singola pagina A4. ### Sezione A — "Caratteristiche Prodotto" Due colonne: | Colonna sinistra (tabella con header) | Colonna destra (KV list) | |---------------------------------------|--------------------------| | EMITTENTE (header blu) | Importo Cedole Pagate | | ISIN | Importo Cedole da Pagare | | Mercato | Importo Cedole in Memoria | | Valuta | Rendimento Totale (rosso se negativo) | | Data Emissione | | | Data Scadenza | | | Prossimo Autocall | | > La colonna destra non contiene più il box Bid/Ask separato: Bid/Ask sono già nel titolo pagina. ### Sezione B — "Analisi" Due colonne KV: | Colonna sinistra | Colonna destra | |------------------|----------------| | Importo Cedola (p.a.) | Rendimento Capitale a Scadenza | | Frequenza Cedola | IRR | | Valore Nominale | Protezione Capitale | | Prezzo Emissione | Protezione Coupon | | Barriera Capitale | Valore Autocall | | Tipo Barriera | Distanza Autocall | | Tipo Basket | Rendimento Autocall | | Leva | Fattore Airbag | | | Trigger OneStar | > I campi vuoti (Leva, Fattore Airbag, Trigger OneStar) vengono mostrati con valore `"—"` invece di essere omessi, per mantenere la struttura fissa come nel vecchio report. ### Sezione C — "Sottostanti" Tabella full-width con **9 colonne** (la colonna "Dist. AC" presente nel report attuale viene rimossa per consentire l'inserimento nella pagina 1): | Nome | Strike | Last | % Perf. | Barr. Cap. | Buffer K | Trigger CPN | Buffer CPN | Trig. AC | |------|--------|------|---------|------------|----------|-------------|------------|----------| - Header: sfondo `#1565C0`, testo bianco bold 7.5pt - Righe alternate: `#f7f9fc` / bianco - Valori performance negativi: rosso `#CC0000`; positivi: verde `#2E7D32` - Font celle sottostanti: 7.5pt (sia header che celle dati) — sovrascrive il valore generico `Small` 6.5pt di `PdfTheme` --- ## 3. Gestione spazio e pagina Per fare entrare tutto in una pagina A4 (area utile ~757pt): - Ridurre `PageMargin` da 40pt a 36pt - `RowHeight` per KV pairs: 14pt (attuale 18pt) - `RowHeight` per tabella sottostanti: 13pt - Usare font `Small` (6.5pt) per celle sottostanti, `SmallBold` per header - Nelle sezioni Analisi, saltare i campi null/vuoti **eccetto** questi tre che vengono sempre mostrati con `"—"`: `Leva`, `Fattore Airbag`, `Trigger OneStar` (sono visibili anche nel vecchio report anche quando vuoti) Se la tabella Sottostanti non entra comunque (certificati con molti sottostanti), aggiungere una nuova pagina solo per essa — non alterare la struttura della pagina 1. --- ## 4. Parametro API footer ### Modifica API Tutti gli endpoint di generazione report accettano un nuovo parametro query opzionale: ``` GET /api/report/by-isin/{isin}?branding=true GET /api/report?p={encrypted}&branding=true GET /api/report?alias={id}&branding=true GET /api/report/download?p={encrypted}&branding=true ``` Default: `branding=false` (nessuna modifica comportamentale agli URL esistenti). ### Comportamento footer | `branding` | Footer | |------------|--------| | `false` (default) | Solo numero di pagina centrato, nessuna scritta | | `true` | `"Powered by [Smart Roots](https://www.smart-roots.net)"` a sinistra + numero pagina a destra. "Smart Roots" è un hyperlink PDF cliccabile che punta a `https://www.smart-roots.net` | ### Implementazione - Aggiungere `bool ShowBranding` a un nuovo modello `ReportOptions` (o direttamente a `ReportRequest`) - `ReportController` legge `branding` dalla query string e lo passa a `ReportOrchestrator` - `ReportOrchestrator` passa `ShowBranding` ai renderer aggiungendo `bool ShowBranding` direttamente a `CertificateReportData` (evita di cambiare la firma di `IPdfSectionRenderer.Render`) - Ogni renderer (a partire da `AnagraficaSectionRenderer`) chiama un helper centralizzato `PdfTheme.DrawFooter(g, pageWidth, pageHeight, pageNumber, showBranding)` ### Footer layout ``` [Solo numero pagina] ──────────────────────────────────────────────── 1 [Con branding] ──────────────────────────────────────────────── Powered by [Smart Roots↗] Pagina 1 ↑ hyperlink → https://www.smart-roots.net ``` - Linea separatrice: `#dddddd` 0.5pt - Testo branding: `"Powered by "` in `Small` 7pt grigio `#666`, seguito da `"Smart Roots"` come `PdfTextWebLink` blu `#1565C0` che punta a `https://www.smart-roots.net` - Numero pagina: `Small` 7pt grigio, allineato a destra --- ## 5. File modificati | File | Modifica | |------|----------| | `AnagraficaSectionRenderer.cs` | Riscrivere completamente il metodo `Render()` con nuova struttura 3-sezioni | | `PdfTheme.cs` | Ridurre margini/row height, aggiungere `DrawFooter()`, aggiungere colori `AccentBlue`, `NegativeRed`, `PositiveGreen` | | `ReportController.cs` | Leggere parametro `branding` da query string | | `CertificateReportData.cs` (o nuovo `ReportOptions.cs`) | Aggiungere `bool ShowBranding` | | `ReportOrchestrator.cs` | Propagare `ShowBranding` ai renderer | | `IServices.cs` | Aggiornare firma `Render()` se necessario | --- ## 6. Fuori scope - Nessuna modifica alle altre sezioni (Eventi, Scenario, Grafico) - Nessuna modifica alle stored procedure - Nessuna modifica al `ChartController` - Nessuna aggiunta di nuovi campi al modello `CertificateInfo` — si usano i campi già esistenti riorganizzati