Fix Forecast View discrepancy: Align Chart/Summary with Search Filters

This commit is contained in:
christian.vidal
2026-01-29 20:50:31 +01:00
parent db2c67060b
commit 2060f82348
+37 -32
View File
@@ -218,37 +218,8 @@ const ForecastView: React.FC<ForecastViewProps> = ({
return result;
}, [data, filters.line, filters.asin, filters.sku]);
const globalSummary = useMemo(() => {
return baseFilteredData.reduce((acc, curr) => {
const itemPeriodForecast = activeMonths.reduce((sum, month) => {
return sum + (curr.monthlyData?.[month]?.forecastUnits || 0);
}, 0);
return {
actualUnits: acc.actualUnits + (curr.actualUnits || 0),
forecastUnits: acc.forecastUnits + itemPeriodForecast,
annualForecast: acc.annualForecast + (curr.annualForecast || 0),
};
}, { actualUnits: 0, forecastUnits: 0, annualForecast: 0 });
}, [baseFilteredData, activeMonths]);
const chartData = useMemo(() => {
const dataMap = new Map<string, { name: string; actual: number; forecast: number }>();
MONTH_ORDER.forEach(m => dataMap.set(m, { name: m, actual: 0, forecast: 0 }));
baseFilteredData.forEach(item => {
if (item.monthlyData) {
Object.values(item.monthlyData).forEach((m: any) => {
const entry = dataMap.get(m.month);
if (entry) {
entry.actual += m.actualUnits || 0;
entry.forecast += m.forecastUnits || 0;
}
});
}
});
return Array.from(dataMap.values());
}, [baseFilteredData]);
// [MOVED] chartData moved below processedData to depend on it
// [MOVED] globalSummary moved below processedData to depend on it
const calculatedData = useMemo(() => {
return baseFilteredData.map(item => {
@@ -333,7 +304,41 @@ const ForecastView: React.FC<ForecastViewProps> = ({
});
return result;
}, [calculatedData, debouncedSearch, showOnlyTop50, top50Ranking, top50Mode, sortConfig]);
}, [calculatedData, debouncedSearch, showOnlyTop50, top50Ranking, top50Mode, sortConfig, wocFilter, vendorStockMap]);
// [MOVED HERE] Global Summary - Now respects all filters including Search/WOC
const globalSummary = useMemo(() => {
return processedData.reduce((acc, curr) => {
const itemPeriodForecast = activeMonths.reduce((sum, month) => {
return sum + (curr.monthlyData?.[month]?.forecastUnits || 0);
}, 0);
return {
actualUnits: acc.actualUnits + (curr.actualUnits || 0),
forecastUnits: acc.forecastUnits + itemPeriodForecast,
annualForecast: acc.annualForecast + (curr.annualForecast || 0),
};
}, { actualUnits: 0, forecastUnits: 0, annualForecast: 0 });
}, [processedData, activeMonths]);
// [MOVED HERE] Chart Data - Now respects all filters including Search/WOC
const chartData = useMemo(() => {
const dataMap = new Map<string, { name: string; actual: number; forecast: number }>();
MONTH_ORDER.forEach(m => dataMap.set(m, { name: m, actual: 0, forecast: 0 }));
processedData.forEach(item => {
if (item.monthlyData) {
Object.values(item.monthlyData).forEach((m: any) => {
const entry = dataMap.get(m.month);
if (entry) {
entry.actual += m.actualUnits || 0;
entry.forecast += m.forecastUnits || 0;
}
});
}
});
return Array.from(dataMap.values());
}, [processedData]);
const paginatedData = useMemo(() => processedData.slice(0, displayCount), [processedData, displayCount]);