mirror of
https://github.com/christianvidalwolf-prog/CrazeAnalytix.git
synced 2026-08-03 20:15:23 +02:00
245 lines
5.9 KiB
TypeScript
245 lines
5.9 KiB
TypeScript
|
|
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';
|
|
}
|
|
|
|
export interface GrowthMetric {
|
|
line: string;
|
|
currentYearSellOut: number;
|
|
previousYearSellOut: number;
|
|
sellOutGrowthValue: number;
|
|
sellOutGrowthPercentage: number;
|
|
|
|
currentYearUnits: number;
|
|
previousYearUnits: number;
|
|
unitsGrowthValue: number;
|
|
unitsGrowthPercentage: number;
|
|
}
|
|
|
|
export type LineGrowthMetric = GrowthMetric;
|
|
|
|
export interface ItemGrowthMetric {
|
|
sku: string;
|
|
asin: string;
|
|
title: string;
|
|
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[];
|
|
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"
|
|
}
|
|
|
|
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)
|
|
asin: string;
|
|
cost: number; // Ad spend €
|
|
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)
|
|
attributedUnits30d: number;
|
|
attributedSales30d: number;
|
|
}
|
|
|
|
export interface TrafficRecord {
|
|
country: string; // Marketplace (DE, UK, etc.)
|
|
year: number;
|
|
week: number;
|
|
asin: string;
|
|
glanceViews: number; // Page views
|
|
}
|
|
|
|
export interface CombinedKPIs {
|
|
id: string;
|
|
marketplace: string;
|
|
customer: string; // Added for consistency with SalesRecord
|
|
month: string;
|
|
week: number; // Added for weekly analysis
|
|
year: number;
|
|
asin: string;
|
|
title: string;
|
|
line: string;
|
|
sku: string;
|
|
|
|
salesTotal: number;
|
|
unitsTotal: number;
|
|
|
|
salesAds: number;
|
|
unitsAds: number;
|
|
cost: number;
|
|
clicks: number;
|
|
impressions: number;
|
|
conversions: number;
|
|
|
|
salesOrganic: number;
|
|
unitsOrganic: number;
|
|
|
|
paidSalesShare: number;
|
|
organicSalesShare: number;
|
|
|
|
acos: number;
|
|
tacos: number;
|
|
roas: number;
|
|
ctr: number;
|
|
cpc: number;
|
|
cvrUnits: number;
|
|
glanceViews: number; // Traffic / page views
|
|
avgWeeklySales?: number; // Added for Weeks of Coverage
|
|
}
|
|
|
|
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' }
|
|
}
|