mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 14:45:24 +02:00
fix: adapt experiment calculation engine to consume both CombinedKPIs and SalesRecord data structures
This commit is contained in:
@@ -92,11 +92,15 @@ const ExperimentDetail: React.FC<ExperimentDetailProps> = ({ experimentId, onClo
|
|||||||
const asin = (r.asin || '').toUpperCase();
|
const asin = (r.asin || '').toUpperCase();
|
||||||
if (!asinMap.has(asin)) return;
|
if (!asinMap.has(asin)) return;
|
||||||
|
|
||||||
|
const mkt = (r.marketplace || (r as any).customer || '').toLowerCase();
|
||||||
|
const isMarket = !experiment.marketplace || experiment.marketplace === 'All' || mkt.includes(experiment.marketplace.toLowerCase());
|
||||||
|
if (!isMarket) return;
|
||||||
|
|
||||||
const recordDate = new Date(r.year, 0, 1 + ((r.week || 1) - 1) * 7);
|
const recordDate = new Date(r.year, 0, 1 + ((r.week || 1) - 1) * 7);
|
||||||
if (recordDate >= startDate && recordDate <= endDate) {
|
if (recordDate >= startDate && recordDate <= endDate) {
|
||||||
const d = asinMap.get(asin)!;
|
const d = asinMap.get(asin)!;
|
||||||
d.units += r.unitsTotal || 0;
|
d.units += (r.unitsTotal ?? (r as any).units ?? 0);
|
||||||
d.revenue += r.salesTotal || 0;
|
d.revenue += (r.salesTotal ?? (r as any).sellOut ?? 0);
|
||||||
d.gv += r.glanceViews || 0;
|
d.gv += r.glanceViews || 0;
|
||||||
d.spend += r.cost || 0;
|
d.spend += r.cost || 0;
|
||||||
}
|
}
|
||||||
@@ -125,6 +129,10 @@ const ExperimentDetail: React.FC<ExperimentDetailProps> = ({ experimentId, onClo
|
|||||||
const asin = (r.asin || '').toUpperCase();
|
const asin = (r.asin || '').toUpperCase();
|
||||||
if (!asinSet.has(asin)) return;
|
if (!asinSet.has(asin)) return;
|
||||||
|
|
||||||
|
const mkt = (r.marketplace || (r as any).customer || '').toLowerCase();
|
||||||
|
const isMarket = !experiment.marketplace || experiment.marketplace === 'All' || mkt.includes(experiment.marketplace.toLowerCase());
|
||||||
|
if (!isMarket) return;
|
||||||
|
|
||||||
const weekNum = r.week || 1;
|
const weekNum = r.week || 1;
|
||||||
const yearStr = r.year || new Date().getFullYear();
|
const yearStr = r.year || new Date().getFullYear();
|
||||||
const weekStr = `${yearStr}-W${String(weekNum).padStart(2, '0')}`;
|
const weekStr = `${yearStr}-W${String(weekNum).padStart(2, '0')}`;
|
||||||
@@ -142,8 +150,8 @@ const ExperimentDetail: React.FC<ExperimentDetailProps> = ({ experimentId, onClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
const w = weeklyMap.get(weekStr);
|
const w = weeklyMap.get(weekStr);
|
||||||
w.units += r.unitsTotal || 0;
|
w.units += (r.unitsTotal ?? (r as any).units ?? 0);
|
||||||
w.revenue += r.salesTotal || 0;
|
w.revenue += (r.salesTotal ?? (r as any).sellOut ?? 0);
|
||||||
w.gv += r.glanceViews || 0;
|
w.gv += r.glanceViews || 0;
|
||||||
w.spend += r.cost || 0;
|
w.spend += r.cost || 0;
|
||||||
});
|
});
|
||||||
|
|||||||
+10
-6
@@ -260,25 +260,29 @@ export const calculateExperimentPerformance = async (
|
|||||||
|
|
||||||
const baselineData = salesData.filter(r => {
|
const baselineData = salesData.filter(r => {
|
||||||
const recordDate = new Date(r.year, 0, 1 + (r.week - 1) * 7);
|
const recordDate = new Date(r.year, 0, 1 + (r.week - 1) * 7);
|
||||||
return asinSet.has(r.asin.toUpperCase()) &&
|
const mkt = (r.marketplace || (r as any).customer || '').toLowerCase();
|
||||||
|
const isMarket = !experiment.marketplace || experiment.marketplace === 'All' || mkt.includes(experiment.marketplace.toLowerCase());
|
||||||
|
return isMarket && asinSet.has(r.asin.toUpperCase()) &&
|
||||||
recordDate >= baselineStart && recordDate < baselineEnd;
|
recordDate >= baselineStart && recordDate < baselineEnd;
|
||||||
});
|
});
|
||||||
|
|
||||||
const experimentData = salesData.filter(r => {
|
const experimentData = salesData.filter(r => {
|
||||||
const recordDate = new Date(r.year, 0, 1 + (r.week - 1) * 7);
|
const recordDate = new Date(r.year, 0, 1 + (r.week - 1) * 7);
|
||||||
return asinSet.has(r.asin.toUpperCase()) &&
|
const mkt = (r.marketplace || (r as any).customer || '').toLowerCase();
|
||||||
|
const isMarket = !experiment.marketplace || experiment.marketplace === 'All' || mkt.includes(experiment.marketplace.toLowerCase());
|
||||||
|
return isMarket && asinSet.has(r.asin.toUpperCase()) &&
|
||||||
recordDate >= startDate && recordDate <= endDate;
|
recordDate >= startDate && recordDate <= endDate;
|
||||||
});
|
});
|
||||||
|
|
||||||
const baseline_units = baselineData.reduce((sum, r) => sum + (r.unitsTotal || 0), 0);
|
const baseline_units = baselineData.reduce((sum, r) => sum + (r.unitsTotal ?? (r as any).units ?? 0), 0);
|
||||||
const baseline_revenue = baselineData.reduce((sum, r) => sum + (r.salesTotal || 0), 0);
|
const baseline_revenue = baselineData.reduce((sum, r) => sum + (r.salesTotal ?? (r as any).sellOut ?? 0), 0);
|
||||||
const baseline_gv = baselineData.reduce((sum, r) => sum + (r.glanceViews || 0), 0);
|
const baseline_gv = baselineData.reduce((sum, r) => sum + (r.glanceViews || 0), 0);
|
||||||
const baseline_cvr = baseline_gv > 0 ? (baseline_units / baseline_gv) * 100 : 0;
|
const baseline_cvr = baseline_gv > 0 ? (baseline_units / baseline_gv) * 100 : 0;
|
||||||
const baseline_spend = baselineData.reduce((sum, r) => sum + (r.cost || 0), 0);
|
const baseline_spend = baselineData.reduce((sum, r) => sum + (r.cost || 0), 0);
|
||||||
const baseline_acos = baseline_revenue > 0 ? (baseline_spend / baseline_revenue) * 100 : 0;
|
const baseline_acos = baseline_revenue > 0 ? (baseline_spend / baseline_revenue) * 100 : 0;
|
||||||
|
|
||||||
const experiment_units = experimentData.reduce((sum, r) => sum + (r.unitsTotal || 0), 0);
|
const experiment_units = experimentData.reduce((sum, r) => sum + (r.unitsTotal ?? (r as any).units ?? 0), 0);
|
||||||
const experiment_revenue = experimentData.reduce((sum, r) => sum + (r.salesTotal || 0), 0);
|
const experiment_revenue = experimentData.reduce((sum, r) => sum + (r.salesTotal ?? (r as any).sellOut ?? 0), 0);
|
||||||
const experiment_gv = experimentData.reduce((sum, r) => sum + (r.glanceViews || 0), 0);
|
const experiment_gv = experimentData.reduce((sum, r) => sum + (r.glanceViews || 0), 0);
|
||||||
const experiment_cvr = experiment_gv > 0 ? (experiment_units / experiment_gv) * 100 : 0;
|
const experiment_cvr = experiment_gv > 0 ? (experiment_units / experiment_gv) * 100 : 0;
|
||||||
const experiment_spend = experimentData.reduce((sum, r) => sum + (r.cost || 0), 0);
|
const experiment_spend = experimentData.reduce((sum, r) => sum + (r.cost || 0), 0);
|
||||||
|
|||||||
Reference in New Issue
Block a user