Files
CrazeAnalytix/types.ts
T

413 lines
10 KiB
TypeScript
Raw Normal View History

export interface SalesRecord {
id: string;
customer: string;
year: number;
month: string; // "Apr-23"
week?: number;
asin: string;
sku: string;
title: string; // Added Product Title
articleName: string; // Kept for backward compatibility if mixed files used
units: number;
sellOut: number; // Parsed numeric value
line: string;
}
export interface FilterState {
customer: string[];
year: string[];
month: string[];
line: string[];
asin: string[];
sku: string[];
title: string[]; // Added Title filter
week: string[]; // Added Week filter
stock: string[]; // Added Stock filter
vendorStock: string[]; // Added Vendor Stock filter
woc: string[]; // Added Weeks of Coverage filter
bulkSearch: string; // Added Bulk Search support
columnFilters: Record<string, ColumnFilterCondition>; // Added Excel-style column filters
}
export interface ColumnFilterCondition {
textFilter?: {
operator: 'equals' | 'notEquals' | 'contains' | 'notContains' | 'startsWith' | 'notStartsWith' | 'endsWith' | 'notEndsWith' | 'gt' | 'lt' | 'gte' | 'lte';
value: string;
};
selectedValues?: string[];
sort?: 'asc' | 'desc';
}
2025-12-11 14:03:33 +01:00
export interface GrowthMetric {
line: string;
currentYearSellOut: number;
previousYearSellOut: number;
sellOutGrowthValue: number;
sellOutGrowthPercentage: number;
currentYearUnits: number;
previousYearUnits: number;
unitsGrowthValue: number;
unitsGrowthPercentage: number;
}
2025-12-11 14:03:33 +01:00
export type LineGrowthMetric = GrowthMetric;
export interface ItemGrowthMetric {
sku: string;
asin: string;
title: string;
2025-12-11 14:03:33 +01:00
line: string;
currentYearSellOut: number;
previousYearSellOut: number;
sellOutGrowthValue: number;
sellOutGrowthPercentage: number;
currentYearUnits: number;
previousYearUnits: number;
unitsGrowthValue: number;
unitsGrowthPercentage: number;
}
export interface SeasonalityPoint {
name: string; // "Jan", "Feb", etc.
[year: string]: number | string; // Dynamic keys for years: "2023": 500, "2024": 600
}
export interface YearlySplitData {
name: string;
// Dynamic keys like "2023", "2024" or "2023_value", "2023_units"
[key: string]: number | string;
}
export interface AggregatedData {
totalSellOut: number;
totalUnits: number;
totalsByYear: Record<string, { sellOut: number; units: number }>;
byLine: { name: string; value: number; units: number }[];
byCustomer: { name: string; value: number }[];
seasonality: SeasonalityPoint[];
seasonalityUnits: SeasonalityPoint[];
availableYears: string[];
2025-12-11 14:03:33 +01:00
topMovers: GrowthMetric[];
bottomMovers: GrowthMetric[];
comparisonPeriods: { current: string; previous: string };
topLinesSplit: YearlySplitData[];
byCustomerSplit: YearlySplitData[];
byLineOverviewSplit: YearlySplitData[];
}
export interface ChatMessage {
role: 'user' | 'model';
text: string;
timestamp: Date;
}
// New Interfaces for Dynamic Pivot Grid
export interface YearlyData {
sellOut: number;
units: number;
}
export interface MonthlyPivot {
monthIndex: number;
byYear: Record<string, YearlyData>;
}
export interface PivotRow {
id: string;
customer: string;
line: string;
title: string; // Added Title
articleName: string;
sku: string;
asin: string;
// Dynamic buckets
totalsByYear: Record<string, YearlyData>;
months: MonthlyPivot[]; // Always 12 elements
// Ads data (optional, aggregated by ASIN)
adsByYear?: Record<string, {
adSpend: number;
attributedSales: number;
acos: number;
tacos: number;
}>;
}
export interface TimeSeriesData {
name: string; // e.g., "Apr '23" or "W21 '23"
sellOut: number;
units: number;
}
export interface ComparisonTimeSeriesPoint {
week: number;
name: string; // "W1", "W2", etc.
[key: string]: number | string; // Dynamic keys like "2023_sellOut", "2024_units"
2025-12-11 14:03:33 +01:00
}
export interface AdsRecord {
country: string; // Marketplace (Amazon DE, IT, ES, FR, UK)
year: number; // Year extracted from sheet name
week: number; // Week number (1-52)
2025-12-11 14:03:33 +01:00
asin: string;
cost: number; // Ad spend €
2025-12-11 14:03:33 +01:00
clicks: number;
impressions: number;
cpc: number; // Cost per click €
ctr: number; // Click-through rate %
acos: number; // Advertising cost of sale %
conversions: number; // Attributed conversions (30d)
2025-12-11 14:03:33 +01:00
attributedUnits30d: number;
attributedSales30d: number;
2025-12-11 14:03:33 +01:00
}
export interface TrafficRecord {
country: string; // Marketplace (DE, UK, etc.)
year: number;
week: number;
asin: string;
glanceViews: number; // Page views
}
2025-12-11 14:03:33 +01:00
export interface CombinedKPIs {
id: string;
marketplace: string;
customer: string; // Added for consistency with SalesRecord
2025-12-11 14:03:33 +01:00
month: string;
2026-01-21 13:19:13 +01:00
week: number; // Added for weekly analysis
2025-12-11 14:03:33 +01:00
year: number;
asin: string;
title: string;
line: string;
sku: string;
2025-12-11 14:03:33 +01:00
salesTotal: number;
unitsTotal: number;
2025-12-11 14:03:33 +01:00
salesAds: number;
unitsAds: number;
cost: number;
clicks: number;
impressions: number;
2026-01-22 13:25:06 +01:00
conversions: number;
2025-12-11 14:03:33 +01:00
salesOrganic: number;
unitsOrganic: number;
2025-12-11 14:03:33 +01:00
paidSalesShare: number;
organicSalesShare: number;
2025-12-11 14:03:33 +01:00
acos: number;
tacos: number;
roas: number;
ctr: number;
cpc: number;
cvrUnits: number;
glanceViews: number; // Traffic / page views
detailLevelBSR?: number; // Added for Detail Level BSR in Experiments
avgWeeklySales?: number; // Added for Weeks of Coverage
2025-12-11 14:03:33 +01:00
}
export interface ForecastRecord {
asin: string;
annualForecast: number;
sku?: string;
title?: string;
line?: string;
}
export interface MonthlyForecastPoint {
month: string;
forecastUnits: number;
actualUnits: number;
}
export interface ProductForecastData {
asin: string;
sku: string;
title: string;
line: string;
annualForecast: number;
actualUnits: number;
forecastUnits: number;
accuracy: number;
avgWeeklySales: number; // Added for Weeks of Coverage
monthlyData: Record<string, MonthlyForecastPoint>;
}
export interface BuyBoxLostData {
asin: string;
countries: string[]; // ['DE', 'FR', 'IT', 'UK', 'ES']
reasons: Record<string, string>; // { DE: 'Amazon', FR: 'Unknown' }
}
export interface VendorDailyRow {
id?: number;
date: string;
market: string;
asin: string;
product_title: string | null;
tags: string | null;
bsr_top_rank: number | null;
bsr_top_category: string | null;
bsr_detail_rank: number | null;
bsr_detail_category: string | null;
avg_rating: number | null;
num_reviews: number | null;
buybox_owner: string | null;
buybox_price: number | null;
amazon_has_buybox: boolean | null;
glance_views: number | null;
}
export interface VendorCSVRow {
Date: string;
Market: string;
ASIN: string;
'Product Title': string;
Tags: string;
'Top Level Category (Rank)': string;
'Top Level Category (Name)': string;
'Detail Level Category (Rank)': string;
'Detail Level Category (Name)': string;
'Average Rating': string;
'Number of Reviews': string;
'Buybox Seller Name': string;
'Buybox Price': string;
'Amazon Has Buybox': string;
'Glance Views': string;
}
2026-02-20 19:31:44 +01:00
2026-03-02 15:22:12 +01:00
export interface BSRRecord {
week: number;
date?: string; // ISO date string (YYYY-MM-DD) when available — enables daily resolution charts
2026-03-02 15:22:12 +01:00
market: string;
asin: string;
topLevelBSR: number | null;
topLevelName: string | null;
detailLevelBSR: number | null;
detailLevelName: string | null;
avgRating: number | null;
}
2026-02-20 19:31:44 +01:00
// Experiment Tracking Types
export type ExperimentType = 'pricing' | 'advertising' | 'content' | 'promotion' | 'seo';
2026-02-20 19:31:44 +01:00
export type ExperimentStatus = 'planned' | 'active' | 'completed' | 'paused';
export type ExperimentMetric = 'units' | 'sessions' | 'cvr' | 'ctr' | 'roas' | 'revenue' | 'acos' | 'detail_bsr';
export type ExperimentVerdict = 'winner' | 'loser' | 'inconclusive';
export interface ExperimentChangeAnnotation {
field: string;
before_value: string;
after_value: string;
}
export interface DiDMetricResult {
treatment_before: number;
treatment_after: number;
control_before: number;
control_after: number;
did_estimate: number;
lift_percent: number;
posterior_prob_positive: number;
}
export interface DifferenceInDifferencesResult {
metrics: Record<string, DiDMetricResult>;
computed_at: string;
}
2026-02-20 19:31:44 +01:00
export interface Experiment {
id: string;
name: string;
description?: string;
type: ExperimentType;
status: ExperimentStatus;
asins: string[];
control_asins: string[];
2026-02-20 19:31:44 +01:00
marketplace: string;
start_date: string;
end_date?: string;
baseline_start_date?: string;
baseline_end_date?: string;
2026-02-20 19:31:44 +01:00
created_at: string;
updated_at: string;
hypothesis?: string;
primary_metric: ExperimentMetric;
target_lift_percent?: number;
changes: ExperimentChangeAnnotation[];
// Legacy results (kept for backward compat)
2026-02-20 19:31:44 +01:00
baseline_units?: number;
baseline_revenue?: number;
baseline_gv?: number;
baseline_cvr?: number;
baseline_acos?: number;
2026-02-20 19:31:44 +01:00
experiment_units?: number;
experiment_revenue?: number;
experiment_gv?: number;
experiment_cvr?: number;
experiment_acos?: number;
2026-02-20 19:31:44 +01:00
actual_lift_percent?: number;
statistical_significance?: number;
// DiD results
did_results?: DifferenceInDifferencesResult;
verdict?: ExperimentVerdict;
verdict_probability?: number;
2026-02-20 19:31:44 +01:00
learnings?: string;
owner?: string;
}
export interface ExperimentCreateInput {
name: string;
description?: string;
type: ExperimentType;
asins: string[];
control_asins: string[];
2026-02-20 19:31:44 +01:00
marketplace: string;
start_date: string;
end_date?: string;
baseline_start_date?: string;
baseline_end_date?: string;
2026-02-20 19:31:44 +01:00
hypothesis?: string;
primary_metric: ExperimentMetric;
target_lift_percent?: number;
changes: ExperimentChangeAnnotation[];
2026-02-20 19:31:44 +01:00
owner?: string;
}
export interface ExperimentListItem {
id: string;
name: string;
type: ExperimentType;
status: ExperimentStatus;
asin_count: number;
asins: string[];
control_asin_count: number;
2026-02-20 19:31:44 +01:00
marketplace: string;
start_date: string;
end_date?: string;
progress_percent: number;
primary_metric: ExperimentMetric;
verdict?: ExperimentVerdict;
verdict_probability?: number;
2026-02-20 19:31:44 +01:00
actual_lift_percent?: number;
owner?: string;
}
export interface ActiveExperiment {
asin: string;
experiment_id: string;
experiment_name: string;
type: ExperimentType;
status: ExperimentStatus;
start_date: string;
end_date?: string;
days_remaining?: number;
}