mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 11:45:23 +02:00
feat: sync vendor tab filters with global header filters
This commit is contained in:
@@ -1152,6 +1152,77 @@ export const filterData = (
|
||||
});
|
||||
};
|
||||
|
||||
export const filterBsrData = (
|
||||
bsrData: BSRRecord[],
|
||||
filters: FilterState,
|
||||
asinMetadata?: Map<string, { sku: string; title: string; line: string }>,
|
||||
stockMap?: Map<string, number>,
|
||||
vendorStockMap?: Map<string, { eu: number; uk: number }>,
|
||||
top50Mode: 'eu' | 'uk' = 'eu'
|
||||
): BSRRecord[] => {
|
||||
return bsrData.filter(record => {
|
||||
const asin = record.asin.trim().toUpperCase();
|
||||
const meta = asinMetadata?.get(asin);
|
||||
|
||||
const marketMapping: Record<string, string[]> = {
|
||||
'DE': ['Amazon DE', 'Amazon SC'],
|
||||
'UK': ['Amazon UK', 'Amazon SC'],
|
||||
'IT': ['Amazon IT', 'Amazon SC'],
|
||||
'FR': ['Amazon FR', 'Amazon SC'],
|
||||
'ES': ['Amazon ES', 'Amazon SC'],
|
||||
};
|
||||
|
||||
let countryMatch = true;
|
||||
if (filters.customer.length > 0) {
|
||||
const mappedCustomers = marketMapping[record.market] || [];
|
||||
countryMatch = filters.customer.some(c => mappedCustomers.includes(c));
|
||||
} else {
|
||||
countryMatch = PAN_EU_COUNTRIES.some(c => c.toUpperCase().includes(record.market));
|
||||
}
|
||||
|
||||
const weekStr = `W${record.week}`;
|
||||
const weekMatch = filters.week.length === 0 || filters.week.includes(weekStr);
|
||||
|
||||
const asinMatch = filters.asin.length === 0 || filters.asin.some(a => a.toUpperCase() === asin);
|
||||
|
||||
let skuMatch = true;
|
||||
if (filters.sku.length > 0) {
|
||||
skuMatch = meta ? filters.sku.some(s => s.toUpperCase() === meta.sku.toUpperCase()) : false;
|
||||
}
|
||||
|
||||
let lineMatch = true;
|
||||
if (filters.line.length > 0) {
|
||||
lineMatch = meta ? filters.line.includes(meta.line) : false;
|
||||
}
|
||||
|
||||
let titleMatch = true;
|
||||
if (filters.title.length > 0) {
|
||||
titleMatch = meta ? filters.title.includes(meta.title) : false;
|
||||
}
|
||||
|
||||
const stockMatch = checkStockFilter(meta?.sku || '', filters.stock, stockMap);
|
||||
const vendorStockMatch = checkVendorStockFilter(asin, filters.vendorStock, vendorStockMap, top50Mode);
|
||||
|
||||
let bulkMatch = true;
|
||||
if (filters.bulkSearch && filters.bulkSearch.trim()) {
|
||||
const searchTerms = filters.bulkSearch
|
||||
.split(/[\s,\n]+/)
|
||||
.map(t => t.trim().toUpperCase())
|
||||
.filter(t => t.length > 0);
|
||||
|
||||
if (searchTerms.length > 0) {
|
||||
const itemAsin = (record.asin || '').toUpperCase();
|
||||
const itemSku = (meta?.sku || '').toUpperCase();
|
||||
bulkMatch = searchTerms.some(term =>
|
||||
itemAsin.includes(term) || itemSku.includes(term)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return countryMatch && weekMatch && asinMatch && skuMatch && lineMatch && titleMatch && stockMatch && vendorStockMatch && bulkMatch;
|
||||
});
|
||||
};
|
||||
|
||||
const calculateSeasonality = (data: SalesRecord[]): { seasonality: SeasonalityPoint[], seasonalityUnits: SeasonalityPoint[], years: string[] } => {
|
||||
const seasonalityMap = new Map<string, SeasonalityPoint>();
|
||||
const seasonalityUnitsMap = new Map<string, SeasonalityPoint>();
|
||||
|
||||
Reference in New Issue
Block a user