chore: initial commit - baseline before redesign

This commit is contained in:
2026-03-20 12:03:38 +01:00
commit 85ee66750a
31 changed files with 3426 additions and 0 deletions

View File

@@ -0,0 +1,164 @@
# 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`
```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
```bash
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 `DecryptCombined` completa (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
1. **Test con DB reale** — Verificare che i nomi colonna nel `SqlDataReader` corrispondano
esattamente all'output delle SP (usa `GetStringSafe` che gestisce colonne mancanti)
2. **Layout PDF fine-tuning** — Posizioni, margini, colori per replicare il look originale
3. **Chart service** — L'endpoint ChartFSWeb.aspx funziona ancora? Altrimenti
implementare la generazione interna con SkiaSharp in `ChartSectionRenderer`
4. **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ù `WebRequest` bloccanti
- **Logging strutturato**: Serilog con log rotanti
- **Sezioni modulari**: aggiungere un nuovo tipo di report = aggiungere un `IPdfSectionRenderer`
- **Tema centralizzato**: un cambio in `PdfTheme.cs` aggiorna tutti i PDF
- **API REST**: può essere consumata da qualsiasi client (non solo browser)