diff --git a/CLAUDE.md b/CLAUDE.md index e14a152..620a312 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -94,6 +94,8 @@ Tutte le stored procedure sono su `FirstSolutionDB`. I dati tornano **già forma - `GET /api/report?p={isin_cifrato}` / `?alias={id}` / `/by-isin/{isin}` — PDF inline - `GET /api/report/download?p={...}` / `?alias={...}` — PDF come allegato - Tutti gli endpoint report accettano `?branding=true` (default `false`) per abilitare il footer "Powered by Smart Roots" +- Tutti gli endpoint report accettano `?dividend=true` (default `false`) per aggiungere la pagina Sottostanti+Dividendi +- Tutti gli endpoint report accettano `?natixis=true` (default `false`) per mostrare `info.Nome` nel box Tipologia invece di `info.Categoria` - `GET /api/chart/{isin}[?format=png|pdf&width=&height=]` — grafico standalone - `GET /health` — health check DB + chart service @@ -107,6 +109,22 @@ Con `branding=false` (default): solo numero pagina centrato. La cache usa chiavi separate: `{isin}:branded` vs `{isin}`. Il flag è propagato come `CertificateReportData.ShowBranding` e passato a `PdfTheme.DrawFooter(g, pageWidth, pageHeight, pageNumber, showBranding)`. L'hyperlink usa `PdfTextWebLink` (richiede `using Syncfusion.Pdf.Interactive;`). +## Parametri query report + +Tutti i flag booleani hanno default `false` e seguono lo stesso pattern di propagazione: `ReportController` → `IReportOrchestrator.GenerateReportAsync` → `CertificateReportData` → renderer. + +| Parametro | Flag su `CertificateReportData` | Effetto | +|-----------|--------------------------------|---------| +| `?branding=true` | `ShowBranding` | Footer con "Powered by Smart Roots" + link | +| `?dividend=true` | `ShowDividend` | Aggiunge pagina Sottostanti+Dividendi; nasconde tabella Sottostanti dalla Sezione 1 | +| `?natixis=true` | `ShowNatixis` | Box Tipologia mostra `info.Nome` invece di `info.Categoria` | + +**Cache key pattern** (Approccio A — suffissi concatenati): +- Suffissi: `:branded`, `:dividend`, `:natixis` — aggiunti in questo ordine se il flag è `true` +- Chiave base: `{isin}[suffissi]` +- Chiave expired: `{isin}:expired[suffissi]` +- Esempio: `?branding=true&natixis=true` → chiave `{isin}:branded:natixis` + ## Sezione 1 — AnagraficaSectionRenderer Struttura a 3 sezioni verticali in una singola pagina A4: @@ -115,7 +133,7 @@ Struttura a 3 sezioni verticali in una singola pagina A4: |---------|-----------| | **Titolo** | "Scheda Prodotto {ISIN}" blu + Bid/Ask a destra + linea separatrice blu | | **A — Caratteristiche Prodotto** | Tabella emittente a sinistra (ISIN, Mercato, Valuta, Date, Autocall) + tabella cedole a destra (CpnPagati/DaPagare/InMemoria, RendimentoAttuale) | -| **B — Analisi** | 8 KV a sinistra + 9 KV a destra. Leva/FattoreAirbag/TriggerOneStar mostrati come `"—"` anche se vuoti | +| **B — Analisi** | 9 KV a sinistra + 9 KV a destra. Leva/Memoria/FattoreAirbag/TriggerOneStar mostrati come `"—"` anche se vuoti | | **C — Sottostanti** | PdfGrid 9 colonne: Nome, Strike, Last, % Perf., Barr.K, Buffer K, Trig.CPN, Buf.CPN, Trig.AC (Dist.AC rimossa) | Se la tabella Sottostanti non entra (y > PageH-80pt), si crea una nuova pagina. Il footer viene disegnato su ogni pagina con `PdfTheme.DrawFooter`.