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

176 lines
7.1 KiB
Markdown

# 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