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 };
}