chore: initial commit - baseline before redesign
This commit is contained in:
164
CertReports.Syncfusion/README.md
Normal file
164
CertReports.Syncfusion/README.md
Normal 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)
|
||||
Reference in New Issue
Block a user