feat: wire DividendSectionRenderer into orchestrator — both active and expired flows

Also fix darkBlueBrush undefined reference in DividendSectionRenderer.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-23 16:14:50 +01:00
parent e994352bd7
commit 26f818486c
2 changed files with 41 additions and 7 deletions

View File

@@ -118,15 +118,15 @@ public class DividendSectionRenderer
DrawHeaderCell(g, cx, y, barriereW, rh, "BARRIERE", accentBrush, whiteBrush, headerFont); DrawHeaderCell(g, cx, y, barriereW, rh, "BARRIERE", accentBrush, whiteBrush, headerFont);
cx += barriereW; cx += barriereW;
// "DIVIDENDI" (cols 9-14) — blu scuro // "DIVIDENDI" (cols 9-14)
float dividendiW = cw[9] + cw[10] + cw[11] + cw[12] + cw[13] + cw[14]; float dividendiW = cw[9] + cw[10] + cw[11] + cw[12] + cw[13] + cw[14];
DrawHeaderCell(g, cx, y, dividendiW, rh, "DIVIDENDI", darkBlueBrush, whiteBrush, headerFont); DrawHeaderCell(g, cx, y, dividendiW, rh, "DIVIDENDI", DarkBlueBrush, whiteBrush, headerFont);
// ── Riga 2: Sottocolonne ─────────────────────────────────────── // ── Riga 2: Sottocolonne ───────────────────────────────────────
cx = x0; cx = x0;
for (int i = 0; i < cw.Length; i++) for (int i = 0; i < cw.Length; i++)
{ {
var bg = i >= 9 ? darkBlueBrush : accentBrush; var bg = i >= 9 ? DarkBlueBrush : accentBrush;
DrawHeaderCell(g, cx, y + rh, cw[i], rh, Col2Headers[i], bg, whiteBrush, headerFont); DrawHeaderCell(g, cx, y + rh, cw[i], rh, Col2Headers[i], bg, whiteBrush, headerFont);
cx += cw[i]; cx += cw[i];
} }

View File

@@ -22,6 +22,7 @@ public class ReportOrchestrator : IReportOrchestrator
private readonly IPdfCacheService _cache; private readonly IPdfCacheService _cache;
private readonly ILogger<ReportOrchestrator> _logger; private readonly ILogger<ReportOrchestrator> _logger;
private readonly ExpiredAnagraficaSectionRenderer _expiredAnagraficaRenderer; private readonly ExpiredAnagraficaSectionRenderer _expiredAnagraficaRenderer;
private readonly DividendSectionRenderer _dividendRenderer;
public ReportOrchestrator( public ReportOrchestrator(
ICertificateDataService dataService, ICertificateDataService dataService,
@@ -30,7 +31,8 @@ public class ReportOrchestrator : IReportOrchestrator
IPdfMergerService merger, IPdfMergerService merger,
IPdfCacheService cache, IPdfCacheService cache,
ILogger<ReportOrchestrator> logger, ILogger<ReportOrchestrator> logger,
ExpiredAnagraficaSectionRenderer expiredAnagraficaRenderer) ExpiredAnagraficaSectionRenderer expiredAnagraficaRenderer,
DividendSectionRenderer dividendRenderer)
{ {
_dataService = dataService; _dataService = dataService;
_sectionRenderers = sectionRenderers; _sectionRenderers = sectionRenderers;
@@ -39,13 +41,15 @@ public class ReportOrchestrator : IReportOrchestrator
_cache = cache; _cache = cache;
_logger = logger; _logger = logger;
_expiredAnagraficaRenderer = expiredAnagraficaRenderer; _expiredAnagraficaRenderer = expiredAnagraficaRenderer;
_dividendRenderer = dividendRenderer;
} }
public async Task<byte[]> GenerateReportAsync(string isin, bool showBranding = false) public async Task<byte[]> GenerateReportAsync(string isin, bool showBranding = false, bool showDividend = false)
{ {
// ── Cache check ──────────────────────────────────────────────── // ── Cache check ────────────────────────────────────────────────
var baseCacheKey = showBranding ? $"{isin}:branded" : isin; var dividendSuffix = showDividend ? ":dividend" : "";
var expiredCacheKey = showBranding ? $"{isin}:expired:branded" : $"{isin}:expired"; var baseCacheKey = showBranding ? $"{isin}:branded{dividendSuffix}" : $"{isin}{dividendSuffix}";
var expiredCacheKey = showBranding ? $"{isin}:expired:branded{dividendSuffix}" : $"{isin}:expired{dividendSuffix}";
var cached = _cache.Get(baseCacheKey) ?? _cache.Get(expiredCacheKey); var cached = _cache.Get(baseCacheKey) ?? _cache.Get(expiredCacheKey);
if (cached != null) if (cached != null)
@@ -63,6 +67,7 @@ public class ReportOrchestrator : IReportOrchestrator
Eventi = await _dataService.GetCertificateEventsAsync(isin), Eventi = await _dataService.GetCertificateEventsAsync(isin),
Scenario = await _dataService.GetScenarioAnalysisAsync(isin), Scenario = await _dataService.GetScenarioAnalysisAsync(isin),
ShowBranding = showBranding, ShowBranding = showBranding,
ShowDividend = showDividend,
}; };
// ── 2. Determina il tipo di report ──────────────────────────── // ── 2. Determina il tipo di report ────────────────────────────
@@ -95,6 +100,20 @@ public class ReportOrchestrator : IReportOrchestrator
throw; throw;
} }
if (reportData.ShowDividend)
{
try
{
pdfSections.Add(_dividendRenderer.Render(reportData));
_logger.LogInformation("Sezione 'Dividend' generata per {Isin}", isin);
}
catch (Exception ex)
{
_logger.LogError(ex, "Errore nella sezione 'Dividend' per {Isin}", isin);
throw;
}
}
try try
{ {
var eventiRenderer = _sectionRenderers.First(r => r.SectionName == "Eventi"); var eventiRenderer = _sectionRenderers.First(r => r.SectionName == "Eventi");
@@ -130,6 +149,21 @@ public class ReportOrchestrator : IReportOrchestrator
_logger.LogError(ex, "Errore nella sezione '{Section}' per {Isin}", renderer.SectionName, isin); _logger.LogError(ex, "Errore nella sezione '{Section}' per {Isin}", renderer.SectionName, isin);
throw; throw;
} }
// Inserire pagina dividend subito dopo Anagrafica (Sezione 1)
if (renderer.SectionName == "Anagrafica" && reportData.ShowDividend)
{
try
{
pdfSections.Add(_dividendRenderer.Render(reportData));
_logger.LogInformation("Sezione 'Dividend' generata per {Isin}", isin);
}
catch (Exception ex)
{
_logger.LogError(ex, "Errore nella sezione 'Dividend' per {Isin}", isin);
throw;
}
}
} }
} }