CertReports.Syncfusion
Progetto ASP.NET Core 8 per la generazione di report PDF per certificati finanziari,
basato su Syncfusion PDF Library (Community License).
Sostituisce il vecchio progetto WebForms con DevExpress + PdfSharp.
Architettura
┌──────────────────────────────────────────────────────────────────────┐
│ ReportController │
│ GET /api/report?p={encrypted} | GET /api/report?alias={id} │
└──────────────────────┬───────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────────┐
│ ReportOrchestrator │
│ │
│ 1. CertificateDataService ──→ SQL Server (stored procedures) │
│ 2. AnagraficaSectionRenderer ──→ PDF Sezione 1 │
│ 3. EventiSectionRenderer ──→ PDF Sezione 2 │
│ 4. ScenarioSectionRenderer ──→ PDF Sezione 3 (se non Protect.) │
│ 5. ChartSectionRenderer ──→ PDF Sezione 4 (ext. service) │
│ 6. PdfMergerService ──→ PDF Finale unificato │
└──────────────────────────────────────────────────────────────────────┘
Struttura file
CertReports.Syncfusion/
├── Controllers/
│ └── ReportController.cs # API endpoint (sostituisce WebForm)
├── Helpers/
│ ├── CryptoHelper.cs # Decodifica ISIN cifrato
│ └── PdfTheme.cs # Colori, font, stili centralizzati
├── Models/
│ └── CertificateModels.cs # Modelli dati (Info, Eventi, Scenario)
├── Services/
│ ├── Interfaces/
│ │ └── IServices.cs # Contratti per tutti i servizi
│ └── Implementations/
│ ├── CertificateDataService.cs # Accesso DB via stored procedures
│ ├── AnagraficaSectionRenderer.cs # Sezione 1: dati + sottostanti
│ ├── EventiSectionRenderer.cs # Sezione 2: tabella eventi
│ ├── ScenarioSectionRenderer.cs # Sezione 3: matrice scenario
│ ├── ChartSectionRenderer.cs # Sezione 4: grafico
│ ├── PdfMergerService.cs # Merge PDF Syncfusion
│ └── ReportOrchestrator.cs # Coordinatore principale
├── GlobalUsings.cs
├── Program.cs # Entry point + DI setup
├── appsettings.json # Configurazione
└── CertReports.Syncfusion.csproj # Progetto + NuGet packages
Mapping Vecchio → Nuovo
| Vecchio (DevExpress/WebForms) | Nuovo (Syncfusion/ASP.NET Core) |
|---|---|
ReportFSSiteCrypt.aspx (Page_Load) |
ReportController.cs (API REST) |
XtraReport + .repx template |
IPdfSectionRenderer implementations |
report.ExportToPdf() per ogni sezione |
Ogni renderer restituisce PdfDocument |
PdfSharp.PdfReader.Open + CopyPages |
Syncfusion PdfMergerService |
CommonClass.DecryptCombined() |
CryptoHelper.DecryptIsin() |
CommonClass.execSP_Scalar() |
CertificateDataService (async) |
CallWebApi() per chart |
ChartSectionRenderer (HttpClientFactory) |
File temp su disco + File.Delete |
Tutto in memoria (MemoryStream) |
Response.BinaryWrite() |
return File(bytes, "application/pdf") |
Setup e Configurazione
1. Prerequisiti
- .NET 8 SDK
- SQL Server con le stored procedures esistenti
- Syncfusion Community License Key (gratuita per < $1M fatturato)
2. Configurazione appsettings.json
{
"ConnectionStrings": {
"CertDb": "Server=...;Database=...;User Id=...;Password=...;"
},
"Syncfusion": {
"LicenseKey": "LA_TUA_CHIAVE_QUI"
},
"ChartService": {
"BaseUrl": "https://reports.smart-roots.net:4004",
"ChartEndpoint": "/ChartFSWeb.aspx?width=800&height=600&isin={0}&tipo=pdf"
}
}
3. Avvio
dotnet restore
dotnet run
4. Test
# Con ISIN cifrato (compatibile vecchie URL)
GET https://localhost:5001/api/report?p=0x0200000047...
# Con Alias ID
GET https://localhost:5001/api/report?alias=MY_ALIAS
# Diretto (debug/interno)
GET https://localhost:5001/api/report/by-isin/CH1277653163
# Download come file
GET https://localhost:5001/api/report/download?alias=MY_ALIAS
Stored Procedures Utilizzate
| SP | Sezione Report | Descrizione |
|---|---|---|
rpt_Master_CFT_ISIN(@ISIN) |
1 - Anagrafica | Dati certificato (1 record, campi pre-formattati) |
rpt_Details_UL_ISIN(@ISIN) |
1 - Sottostanti | N sottostanti con strike, barriere, dividendi |
rpt_Events_CFT_ISIN(@ISIN) |
2 - Eventi | Lista eventi con date, cedole, autocall |
rpt_AnalisiRischio_ISIN(@ISIN) |
3 - Scenario | Tabella pivot 3×11 (variazioni -70%..+70%) |
rpt_FindIsinbyAliasID(@AliasID) |
Risoluzione | Alias ID → ISIN |
TODO Rimasti
Completato ✓
- ✓ CryptoHelper con logica
DecryptCombinedcompleta (v1 TripleDES, v2 AES) - ✓ Mapping colonne SP reali (
rpt_Master_CFT_ISIN,rpt_Details_UL_ISIN, ecc.) - ✓ Modelli aggiornati per ricevere stringhe pre-formattate dalla SP
- ✓ Analisi scenario adattata al formato pivot
col0..col11
Da Verificare/Completare
- Test con DB reale — Verificare che i nomi colonna nel
SqlDataReadercorrispondano esattamente all'output delle SP (usaGetStringSafeche gestisce colonne mancanti) - Layout PDF fine-tuning — Posizioni, margini, colori per replicare il look originale
- Chart service — L'endpoint ChartFSWeb.aspx funziona ancora? Altrimenti
implementare la generazione interna con SkiaSharp in
ChartSectionRenderer - SP
rpt_FindIsinbyAliasID— Verificare nome esatto e parametro
Vantaggi rispetto al Vecchio Progetto
- Nessun file temporaneo su disco: tutto in MemoryStream
- Dependency Injection: ogni servizio è testabile e sostituibile
- Async/await: niente più
WebRequestbloccanti - Logging strutturato: Serilog con log rotanti
- Sezioni modulari: aggiungere un nuovo tipo di report = aggiungere un
IPdfSectionRenderer - Tema centralizzato: un cambio in
PdfTheme.csaggiorna tutti i PDF - API REST: può essere consumata da qualsiasi client (non solo browser)