diff --git a/backend/src/routes/net-sales.js b/backend/src/routes/net-sales.js index 4018493..e28569c 100644 --- a/backend/src/routes/net-sales.js +++ b/backend/src/routes/net-sales.js @@ -27,19 +27,32 @@ export async function netSalesRoutes(fastify) { const { from, to } = request.query if (!from || !to) return reply.status(400).send({ error: 'from and to required' }) - const days = daysBetween(from, to) - const data = await fcFetch(`/forecast/revenue?start_date=${from}&days=${days}&type=all&dow_align=true`) + const MAX_DAYS = 365 + const totalDays = daysBetween(from, to) + const allDays = [] - const result = (data?.data ?? []).map(d => ({ - date: d.date, - net_sales: parseFloat(d.total?.otb ?? 0), - py_sales: parseFloat(d.total?.prior_final ?? 0), - accom: parseFloat(d.accom?.otb ?? 0), - dry: parseFloat(d.dry?.otb ?? 0), - wet: parseFloat(d.wet?.otb ?? 0), - is_past: d.is_past ?? true, - })) + // Batch into ≤365-day chunks if range exceeds API limit + let batchStart = new Date(from + 'T00:00:00') + const end = new Date(to + 'T00:00:00') + while (batchStart <= end) { + const remaining = Math.ceil((end - batchStart) / 86_400_000) + 1 + const batchDays = Math.min(remaining, MAX_DAYS) + const startStr = batchStart.toISOString().slice(0, 10) + const data = await fcFetch(`/forecast/revenue?start_date=${startStr}&days=${batchDays}&type=all&dow_align=true`) + for (const d of (data?.data ?? [])) { + allDays.push({ + date: d.date, + net_sales: parseFloat(d.total?.otb ?? 0), + py_sales: parseFloat(d.total?.prior_final ?? 0), + accom: parseFloat(d.accom?.otb ?? 0), + dry: parseFloat(d.dry?.otb ?? 0), + wet: parseFloat(d.wet?.otb ?? 0), + is_past: d.is_past ?? true, + }) + } + batchStart.setDate(batchStart.getDate() + batchDays) + } - return { days: result } + return { days: allDays } }) }