Files
SmartReports/docs/superpowers/specs/2026-03-20-anagrafica-redesign-design.md

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 #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.


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).

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)
[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