mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 12:45:23 +02:00
feat: restrict data to Amazon customers only (DE/FR/ES/IT/UK/SC)
This commit is contained in:
+23
-15
@@ -40,7 +40,7 @@ const parseCurrency = (value: string): number => {
|
||||
};
|
||||
|
||||
const parseUnits = (value: string): number => {
|
||||
if(!value) return 0;
|
||||
if (!value) return 0;
|
||||
// Remove dots (thousands separators in EU) and commas (thousands in US) just to be safe for integers
|
||||
const clean = value.replace(/[\.,]/g, '');
|
||||
const num = parseInt(clean, 10);
|
||||
@@ -151,6 +151,14 @@ const getColumnValue = (row: any, aliases: string[]): string => {
|
||||
}
|
||||
return '';
|
||||
};
|
||||
// Allowed Customers Whitelist
|
||||
const ALLOWED_CUSTOMERS = ['Amazon DE', 'Amazon FR', 'Amazon ES', 'Amazon IT', 'Amazon UK', 'Amazon SC'];
|
||||
|
||||
const isAllowedCustomer = (customer: string): boolean => {
|
||||
if (!customer) return false;
|
||||
const normCustomer = customer.trim().toLowerCase();
|
||||
return ALLOWED_CUSTOMERS.some(allowed => allowed.toLowerCase() === normCustomer);
|
||||
};
|
||||
|
||||
// --- SALES / SELL OUT MAPPING ---
|
||||
|
||||
@@ -216,8 +224,8 @@ export const processCSV = (fileOrContent: File | string): Promise<SalesRecord[]>
|
||||
const data: SalesRecord[] = results.data.map((row: any, index: number) => {
|
||||
return mapRowToRecord(row, index);
|
||||
})
|
||||
// Relaxed filtering: Only exclude rows with absolutely no year info even after backfill
|
||||
.filter((r: SalesRecord) => r.year > 0);
|
||||
// Filter: Valid Year AND Allowed Customer
|
||||
.filter((r: SalesRecord) => r.year > 0 && isAllowedCustomer(r.customer));
|
||||
|
||||
resolve(data);
|
||||
} catch (err) {
|
||||
@@ -240,8 +248,8 @@ export const processExcel = async (file: File): Promise<SalesRecord[]> => {
|
||||
const data: SalesRecord[] = jsonData.map((row: any, index: number) => {
|
||||
return mapRowToRecord(row, index);
|
||||
})
|
||||
// Relaxed filtering
|
||||
.filter((r: SalesRecord) => r.year > 0);
|
||||
// Filter: Valid Year AND Allowed Customer
|
||||
.filter((r: SalesRecord) => r.year > 0 && isAllowedCustomer(r.customer));
|
||||
|
||||
return data;
|
||||
} catch (error) {
|
||||
@@ -608,7 +616,7 @@ const calculateGenericSplit = (data: SalesRecord[], groupField: keyof SalesRecor
|
||||
totals.set(key, (totals.get(key) || 0) + item[valueField]);
|
||||
});
|
||||
|
||||
let sortedKeys = Array.from(totals.entries()).sort((a,b) => b[1] - a[1]).map(e => e[0]);
|
||||
let sortedKeys = Array.from(totals.entries()).sort((a, b) => b[1] - a[1]).map(e => e[0]);
|
||||
if (limit) sortedKeys = sortedKeys.slice(0, limit);
|
||||
const keySet = new Set(sortedKeys);
|
||||
|
||||
@@ -919,7 +927,7 @@ export const getUniqueValues = (data: SalesRecord[], field: keyof SalesRecord):
|
||||
export const pivotSalesData = (data: SalesRecord[], dimensions: string[] = ['title', 'customer', 'line', 'sku']): { rows: PivotRow[], years: string[] } => {
|
||||
// 1. Determine all years present in the data for columns
|
||||
const yearsSet = new Set(data.map(d => d.year));
|
||||
const years = Array.from(yearsSet).sort((a,b) => b-a).map(String);
|
||||
const years = Array.from(yearsSet).sort((a, b) => b - a).map(String);
|
||||
|
||||
const map = new Map<string, PivotRow>();
|
||||
|
||||
@@ -1036,14 +1044,14 @@ export const generateItemMoversCSV = (
|
||||
ASIN: item.asin || '-',
|
||||
'Product Title': item.title || '-',
|
||||
'Product Line': item.line || '-',
|
||||
[`Sell Out ${periods.previous}`]: item.previousYearSellOut.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
[`Sell Out ${periods.current}`]: item.currentYearSellOut.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
'SO Diff': item.sellOutGrowthValue.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
'SO Growth %': item.sellOutGrowthPercentage.toLocaleString('de-DE', {minimumFractionDigits: 1, maximumFractionDigits: 1}) + '%',
|
||||
[`Units ${periods.previous}`]: item.previousYearUnits.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
[`Units ${periods.current}`]: item.currentYearUnits.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
'Units Diff': item.unitsGrowthValue.toLocaleString('de-DE', {minimumFractionDigits: 0, maximumFractionDigits: 0}),
|
||||
'Units Growth %': item.unitsGrowthPercentage.toLocaleString('de-DE', {minimumFractionDigits: 1, maximumFractionDigits: 1}) + '%',
|
||||
[`Sell Out ${periods.previous}`]: item.previousYearSellOut.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
[`Sell Out ${periods.current}`]: item.currentYearSellOut.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
'SO Diff': item.sellOutGrowthValue.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
'SO Growth %': item.sellOutGrowthPercentage.toLocaleString('de-DE', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + '%',
|
||||
[`Units ${periods.previous}`]: item.previousYearUnits.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
[`Units ${periods.current}`]: item.currentYearUnits.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
'Units Diff': item.unitsGrowthValue.toLocaleString('de-DE', { minimumFractionDigits: 0, maximumFractionDigits: 0 }),
|
||||
'Units Growth %': item.unitsGrowthPercentage.toLocaleString('de-DE', { minimumFractionDigits: 1, maximumFractionDigits: 1 }) + '%',
|
||||
}));
|
||||
|
||||
// @ts-ignore
|
||||
|
||||
Reference in New Issue
Block a user