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 } 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; 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; } export interface PivotRow { id: string; customer: string; line: string; title: string; // Added Title articleName: string; sku: string; asin: string; // Dynamic buckets totalsByYear: Record; months: MonthlyPivot[]; // Always 12 elements // Ads data (optional, aggregated by ASIN) adsByYear?: Record; } 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; } export interface BuyBoxLostData { asin: string; countries: string[]; // ['DE', 'FR', 'IT', 'UK', 'ES'] reasons: Record; // { DE: 'Amazon', FR: 'Unknown' } }