mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 15:45:24 +02:00
Fix Weeks of Coverage: use unfiltered velocity map for robust calculation
This commit is contained in:
@@ -5,8 +5,8 @@ import Dashboard from './components/Dashboard';
|
||||
import FilterBar from './components/FilterBar';
|
||||
import AIChat from './components/AIChat';
|
||||
import CrazeLogo from './components/CrazeLogo';
|
||||
import { processCSV, processExcel, filterData, aggregateData, processAdsCSV, processAdsExcel, mergeSalesAndAdsData, processTrafficExcel, processStockExcel, filterAdsData, calculateForecastViewData, processVendorStockExcel, calculateVelocityMap, getUniqueValues, processForecastExcel } from './services/dataProcessor';
|
||||
import { SalesRecord, FilterState, AggregatedData, AdsRecord, TrafficRecord, ForecastRecord, ProductForecastData } from './types';
|
||||
import { processCSV, filterData, filterAdsData, aggregateData, getUniqueValues, processAdsCSV, processAdsExcel, processTrafficExcel, mergeSalesAndAdsData, processForecastExcel, calculateForecastViewData, processStockExcel, processVendorStockExcel } from './services/dataProcessor';
|
||||
import { queryGemini } from './services/geminiService';
|
||||
import { ChartIcon, TableIcon, UploadIcon, DownloadIcon, CloseIcon, TrendingIcon, MegaphoneIcon } from './components/Icons';
|
||||
import { loadSalesData, saveSalesData, clearSalesData, loadAdsData, saveAdsData, clearAdsData } from './services/storage';
|
||||
@@ -198,13 +198,13 @@ const App: React.FC = () => {
|
||||
}
|
||||
});
|
||||
|
||||
const viewData = calculateForecastViewData(sales, fcRecords, meta, activeFilters);
|
||||
const viewData = calculateForecastViewData(sales, fcRecords, meta, activeFilters, velocityMap);
|
||||
setForecastData(viewData);
|
||||
console.log('[App] Forecast loaded:', viewData.length, 'records');
|
||||
} catch (error) {
|
||||
console.warn("Forecast fetch failed:", error);
|
||||
}
|
||||
}, []);
|
||||
}, [velocityMap]); // Added velocityMap to dependencies
|
||||
|
||||
// Update forecast when filters change
|
||||
useEffect(() => {
|
||||
@@ -450,10 +450,26 @@ const App: React.FC = () => {
|
||||
};
|
||||
}, [rawData]);
|
||||
|
||||
// Calculate 4-week Sales Velocity Map (Context-Aware)
|
||||
const velocityMap = useMemo(() => {
|
||||
// Determine which dataset to use for velocity calculation based on top50Mode (which reflects region filter)
|
||||
// If 'uk', use UK data. If 'eu', use EU data.
|
||||
// IMPOTANT: We do NOT filter by Week/Month here, so we get the full history for velocity calculation
|
||||
const regionData = rawData.filter(r => {
|
||||
if (top50Mode === 'uk') return r.customer.toLowerCase().includes('uk');
|
||||
// for EU, exclude UK
|
||||
return !r.customer.toLowerCase().includes('uk');
|
||||
});
|
||||
return calculateVelocityMap(regionData);
|
||||
}, [rawData, top50Mode]);
|
||||
|
||||
// Combine Sales & Ads Data dynamically based on current filters
|
||||
const combinedAdsData = useMemo(() => {
|
||||
return mergeSalesAndAdsData(filteredData, filteredAdsData, globalAsinMetadata, trafficData);
|
||||
}, [filteredData, filteredAdsData, globalAsinMetadata, trafficData]);
|
||||
return mergeSalesAndAdsData(filteredData, filteredAdsData, globalAsinMetadata, trafficData, velocityMap);
|
||||
}, [filteredData, filteredAdsData, globalAsinMetadata, trafficData, velocityMap]);
|
||||
|
||||
// Derived Data for Views
|
||||
const years = useMemo(() => getUniqueValues(rawData, 'year').sort().reverse(), [rawData]);
|
||||
|
||||
// Derive Context Data (Product Line Context when drilling down)
|
||||
const contextAggregatedData = useMemo(() => {
|
||||
|
||||
Reference in New Issue
Block a user