mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 12:15:23 +02:00
Optimize Forecast View performance and implement WOC filter across views
This commit is contained in:
@@ -21,6 +21,8 @@ interface WeeklyGridProps {
|
||||
vendorStockMap?: Map<string, { eu: number; uk: number }>;
|
||||
vendorStockFilter: string[];
|
||||
onVendorStockFilterChange: (newFilters: string[]) => void;
|
||||
wocFilter: string[];
|
||||
onWocFilterChange: (newFilters: string[]) => void;
|
||||
velocityMap?: Map<string, number>;
|
||||
}
|
||||
|
||||
@@ -152,6 +154,8 @@ const WeeklyGrid: React.FC<WeeklyGridProps & { top50Mode: 'eu' | 'uk' }> = ({
|
||||
onStockFilterChange,
|
||||
vendorStockFilter,
|
||||
onVendorStockFilterChange,
|
||||
wocFilter,
|
||||
onWocFilterChange,
|
||||
customerFilters,
|
||||
top50Mode,
|
||||
velocityMap
|
||||
@@ -272,8 +276,35 @@ const WeeklyGrid: React.FC<WeeklyGridProps & { top50Mode: 'eu' | 'uk' }> = ({
|
||||
}
|
||||
}
|
||||
|
||||
// WOC Filter
|
||||
if (wocFilter && wocFilter.length > 0 && velocityMap && vendorStockMap) {
|
||||
result = result.filter(r => {
|
||||
const asin = r.asin.trim().toUpperCase();
|
||||
const stockData = vendorStockMap.get(asin);
|
||||
if (!stockData) return false;
|
||||
|
||||
const stock = top50Mode === 'uk' ? stockData.uk : stockData.eu;
|
||||
const velocity = velocityMap.get(asin) || 0;
|
||||
|
||||
let woc: number = 0;
|
||||
if (velocity > 0) {
|
||||
woc = stock / velocity;
|
||||
} else if (stock > 0) {
|
||||
woc = 999;
|
||||
}
|
||||
|
||||
return wocFilter.some(f => {
|
||||
if (f === '< 4 Weeks') return woc < 4;
|
||||
if (f === '> 4 Weeks') return woc >= 4;
|
||||
if (f === 'Out of Stock') return woc === 0;
|
||||
if (f === 'Infinite Cover') return woc === 999;
|
||||
return true;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}, [rows, debouncedSearch, showOnlyTop50, top50Ranking, growthFilterMode, growthThreshold, sortConfig, weeks, top50Mode]);
|
||||
}, [rows, debouncedSearch, showOnlyTop50, top50Ranking, growthFilterMode, growthThreshold, sortConfig, weeks, top50Mode, wocFilter, velocityMap, vendorStockMap]);
|
||||
|
||||
// 2. Sort results
|
||||
const sortedRows = useMemo(() => {
|
||||
@@ -499,6 +530,17 @@ const WeeklyGrid: React.FC<WeeklyGridProps & { top50Mode: 'eu' | 'uk' }> = ({
|
||||
'Low Stock (<10)',
|
||||
]}
|
||||
/>
|
||||
<InColumnStockFilter
|
||||
currentFilters={wocFilter}
|
||||
onFilterChange={onWocFilterChange}
|
||||
title="Week Coverage"
|
||||
options={[
|
||||
'< 4 Weeks',
|
||||
'> 4 Weeks',
|
||||
'Out of Stock',
|
||||
'Infinite Cover'
|
||||
]}
|
||||
/>
|
||||
</div>
|
||||
{sortConfig?.metric === 'rank' && (
|
||||
<span className="text-amber-500 font-black text-sm animate-bounce-subtle">
|
||||
|
||||
Reference in New Issue
Block a user