49014c1544f644b524ca44ecfb867595f582fd92
Expired certificate report: removed 'Barriera Capitale' and 'Rimborso Capitale' columns from the eventi table (9 columns now). Added the same two fields to the Analisi section on page 1, mapped from LivelloBarriera and CapitalValue. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
SmartReports
Generatore di report PDF per certificati finanziari strutturati, sviluppato in ASP.NET Core 8 con libreria Syncfusion PDF (Community License) e SkiaSharp per i grafici.
Caratteristiche principali
- Generazione PDF multi-sezione da dati SQL Server
- Due template report: certificati in quotazione (4 sezioni) e certificati non in quotazione / scaduti / rimborsati / revocati (3 sezioni) — rilevamento automatico dal campo
Stato - Grafico performance sottostanti (SkiaSharp → PNG in memoria)
- Footer con branding opzionale e hyperlink cliccabile
- Cache in memoria per ISIN già generati (chiavi separate per tipo report e branding)
- Endpoint per PDF inline, download e grafico standalone
- Supporto Docker
Stack tecnologico
| Componente | Tecnologia |
|---|---|
| Framework | ASP.NET Core 8 |
| Syncfusion PDF v33 (Community License) | |
| Grafici | SkiaSharp |
| Database | SQL Server (Microsoft.Data.SqlClient v5) |
| Runtime | .NET 8 |
Struttura del report
Certificati in quotazione (Stato = "Quotazione") — 4 sezioni
| Sezione | Contenuto |
|---|---|
| 1 — Anagrafica | Header con Tipologia / Data / Bid / Ask, caratteristiche prodotto, analisi KV, tabella sottostanti |
| 2 — Eventi | Lista eventi cedole e autocall (tabella landscape multi-pagina) |
| 3 — Scenario | Scenari di rendimento (opzionale, saltato se assente) |
| 4 — Grafico | Performance storica dei sottostanti |
Certificati non in quotazione (Stato = "Scaduto" / "Rimborsato" / "Revocato") — 3 sezioni
| Sezione | Contenuto |
|---|---|
| 1 — Anagrafica (semplificata) | Header con solo Tipologia, caratteristiche con Valore/Data Rimborso, analisi KV, tabella sottostanti (9 colonne, senza Bid/Ask) |
| 2 — Eventi | Lista eventi con colonne adattate (Barriera Cedola, Soglia Rimborso, Barriera Capitale, Rimborso Capitale) |
| 3 — Grafico | Performance storica dei sottostanti |
Il tipo di report viene selezionato automaticamente dall'orchestratore in base al campo Stato restituito dalla SP rpt_Master_CFT_ISIN.
API Endpoints
GET /api/report/by-isin/{ISIN} → PDF inline
GET /api/report?p={isin_cifrato} → PDF inline (ISIN cifrato)
GET /api/report?alias={id} → PDF inline (alias)
GET /api/report/download?p={...} → PDF come allegato
GET /api/chart/{isin} → Grafico standalone (PNG/PDF)
GET /health → Health check DB + chart service
Tutti gli endpoint report accettano ?branding=true per aggiungere il footer "Powered by Smart Roots".
Avvio locale
# Restore e build
dotnet restore
dotnet build
# Run
dotnet run --project CertReports.Syncfusion
# → https://localhost:{porta}/api/report/by-isin/{ISIN}
Avvio con Docker
docker-compose up --build
# → http://localhost:5080/api/report/by-isin/{ISIN}
Configurazione
| File | Scopo |
|---|---|
appsettings.json |
Connection string (CertDb), Syncfusion license key, CryptoSettings passphrase, cache TTL |
appsettings.Development.json |
Override per sviluppo locale (non deve contenere ConnectionStrings) |
Connection string SQL Server:
"ConnectionStrings": {
"CertDb": "Data Source=tcp:IP;Initial Catalog=FirstSolutionDB;User Id=...;Password=...;Encrypt=False;"
}
Aggiungere una nuova sezione PDF
- Implementare
IPdfSectionRenderer - Impostare
SectionNameeOrder - Registrare in
Program.cs:builder.Services.AddScoped<IPdfSectionRenderer, NuovaSezione>();
L'orchestratore la include automaticamente ordinandola per Order.
Tema grafico
Tutto il tema (colori, font, layout, brush/pen) è centralizzato in CertReports.Syncfusion/Helpers/PdfTheme.cs.
| Colore | Hex | Utilizzo |
|---|---|---|
| AccentBlue | #1565C0 |
Titoli, header tabelle, valori chiave |
| NegativeRed | #CC0000 |
Valori negativi |
| PositiveGreen | #2E7D32 |
Valori positivi |
Architettura
HTTP (ISIN) → ReportController → ReportOrchestrator
├── CertificateDataService (SP → anagrafica, sottostanti, eventi, scenario)
│
├── [Stato == "Quotazione"] ──────────────────────────────────────────
│ ├── AnagraficaSectionRenderer → PdfDocument (Sezione 1)
│ ├── EventiSectionRenderer → PdfDocument (Sezione 2)
│ ├── ScenarioSectionRenderer → PdfDocument (Sezione 3, opzionale)
│ └── ChartSectionRenderer → PdfDocument (Sezione 4)
│
├── [Stato != "Quotazione"] ─────────────────────────────────────────
│ ├── ExpiredAnagraficaSectionRenderer → PdfDocument (Sezione 1)
│ ├── EventiSectionRenderer → PdfDocument (Sezione 2, colonne adattate)
│ └── ChartSectionRenderer → PdfDocument (Sezione 3)
│
├── ChartDataService (SP → dati grafico)
├── SkiaChartRenderer → PNG in memoria
└── PdfMergerService → byte[] → Response
Sviluppato da Smart Roots
Description
Languages
C#
99.3%
Dockerfile
0.7%