7.1 KiB
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
#1565C0spessore 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
#1565C0bianco bold (es."EMITTENTE UBS") - Righe alternate: sfondo
#f9f9f9/ bianco - Bordi interni
#e5e5e50.5pt
KV pairs (sezione Analisi)
- Label a sinistra in grigio
#555, valore a destra bold - Separatori orizzontali
#e8e8e80.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
Small6.5pt diPdfTheme
3. Gestione spazio e pagina
Per fare entrare tutto in una pagina A4 (area utile ~757pt):
- Ridurre
PageMarginda 40pt a 36pt RowHeightper KV pairs: 14pt (attuale 18pt)RowHeightper tabella sottostanti: 13pt- Usare font
Small(6.5pt) per celle sottostanti,SmallBoldper 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 ShowBrandinga un nuovo modelloReportOptions(o direttamente aReportRequest) ReportControllerleggebrandingdalla query string e lo passa aReportOrchestratorReportOrchestratorpassaShowBrandingai renderer aggiungendobool ShowBrandingdirettamente aCertificateReportData(evita di cambiare la firma diIPdfSectionRenderer.Render)- Ogni renderer (a partire da
AnagraficaSectionRenderer) chiama un helper centralizzatoPdfTheme.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:
#dddddd0.5pt - Testo branding:
"Powered by "inSmall7pt grigio#666, seguito da"Smart Roots"comePdfTextWebLinkblu#1565C0che punta ahttps://www.smart-roots.net - Numero pagina:
Small7pt 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