diff --git a/src/components/Report/ReportForm.tsx b/src/components/Report/ReportForm.tsx index a8af9fb..b87b42e 100644 --- a/src/components/Report/ReportForm.tsx +++ b/src/components/Report/ReportForm.tsx @@ -88,7 +88,7 @@ export default function ReportForm({ config: cfg, onChange, allMuseums, allChann )} - diff --git a/src/components/Report/index.tsx b/src/components/Report/index.tsx index eefc9a1..8f4f8bb 100644 --- a/src/components/Report/index.tsx +++ b/src/components/Report/index.tsx @@ -22,6 +22,10 @@ export default function ReportPage({ data }: Props) { const patch = useCallback((p: Partial) => setConfig(c => ({ ...c, ...p })), []); const handleGenerate = async () => { + if (config.startDate > config.endDate) { + alert('End date must be after start date.'); + return; + } setGenerating(true); try { const reportData = computeReportData(data, config); @@ -31,10 +35,13 @@ export default function ReportPage({ data }: Props) { const slug = (config.clientName || 'report').toLowerCase().replace(/\s+/g, '-'); a.href = url; a.download = `hihala-${slug}-${config.startDate.slice(0, 7)}.pdf`; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - URL.revokeObjectURL(url); + try { + document.body.appendChild(a); + a.click(); + } finally { + document.body.removeChild(a); + URL.revokeObjectURL(url); + } } catch (err) { console.error('PDF generation failed:', err); alert('Failed to generate PDF. Please try again.'); diff --git a/src/components/Report/reportHelpers.ts b/src/components/Report/reportHelpers.ts index 43c144b..da7edbc 100644 --- a/src/components/Report/reportHelpers.ts +++ b/src/components/Report/reportHelpers.ts @@ -106,8 +106,7 @@ function buildTrend(rows: MuseumRecord[], start: string, cfg: ReportConfig): { l const labels = Array.from({ length: maxK }, (_, i) => `W${i + 1}`); const values = labels.map((_, i) => { const group = acc[i + 1] || []; - const revenueField = cfg.includeVAT ? 'revenue_gross' : 'revenue_net'; - return group.reduce((s, r) => s + parseFloat(String((r as any)[revenueField] || 0)), 0); + return group.reduce((s, r) => s + (cfg.includeVAT ? r.revenue_gross : r.revenue_net) || 0, 0); }); return { labels, values }; }