Files
CrazeAnalytix/types.ts
T

245 lines
5.9 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';
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
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' }
}