diff --git a/src/pages/Products.tsx b/src/pages/Products.tsx index 8cf308b..caae4e8 100644 --- a/src/pages/Products.tsx +++ b/src/pages/Products.tsx @@ -12,7 +12,7 @@ type StockStatusFilter = 'all' | StockRisk; type StockQuantityFilter = 'all' | 'zero' | 'positive' | 'low' | 'high'; type SalesFilter = 'all' | 'sold' | 'not_sold'; type CoverageFilter = 'all' | 'up_to_7' | 'up_to_14' | 'up_to_30' | 'over_30' | 'none'; -type ProductSortOption = 'sold_desc' | 'sold_asc' | 'revenue_desc' | 'revenue_asc' | 'stock_asc' | 'stock_desc' | 'coverage_asc' | 'coverage_desc' | 'name_asc'; +type ProductSortOption = 'sold_desc' | 'sold_asc' | 'stock_priority' | 'revenue_desc' | 'revenue_asc' | 'stock_asc' | 'stock_desc' | 'coverage_asc' | 'coverage_desc' | 'name_asc'; type ProductRow = ProductAnalyticsItem & { dailySales: number; @@ -28,22 +28,22 @@ const riskStyles: Record30 dias', + label: 'Saudável', className: 'border-emerald-400/35 bg-emerald-400/10 text-emerald-300', dotClass: 'bg-emerald-400' }, @@ -57,13 +57,22 @@ const riskStyles: Record = [ { value: 'all', label: 'Todos' }, { value: 'rupture', label: 'Sem estoque' }, - { value: 'critical', label: '0-7 dias' }, - { value: 'attention', label: '8-14 dias' }, - { value: 'monitor', label: '15-30 dias' }, - { value: 'healthy', label: '>30 dias' }, + { value: 'critical', label: 'Repor agora' }, + { value: 'attention', label: 'Atenção' }, + { value: 'monitor', label: 'Monitorar' }, + { value: 'healthy', label: 'Saudável' }, { value: 'no_sales', label: 'Sem venda' } ]; +const stockPriority: Record = { + rupture: 0, + critical: 1, + attention: 2, + monitor: 3, + healthy: 4, + no_sales: 5 +}; + const dateFilterPresets = [ { value: 'today', label: 'Hoje', getRange: () => rangeForDay(new Date()) }, { value: 'yesterday', label: 'Ontem', getRange: () => rangeForPreviousDay() }, @@ -258,8 +267,8 @@ const Products = () => { coverageFilter === 'all' || (coverageFilter === 'none' && product.daysOfCover === null) || (coverageFilter === 'up_to_7' && product.daysOfCover !== null && product.daysOfCover <= 7) || - (coverageFilter === 'up_to_14' && product.daysOfCover !== null && product.daysOfCover <= 14) || - (coverageFilter === 'up_to_30' && product.daysOfCover !== null && product.daysOfCover <= 30) || + (coverageFilter === 'up_to_14' && product.daysOfCover !== null && product.daysOfCover > 7 && product.daysOfCover <= 14) || + (coverageFilter === 'up_to_30' && product.daysOfCover !== null && product.daysOfCover > 14 && product.daysOfCover <= 30) || (coverageFilter === 'over_30' && product.daysOfCover !== null && product.daysOfCover > 30); return matchesStatus && matchesStockQuantity && matchesSales && matchesCoverage; @@ -268,6 +277,11 @@ const Products = () => { return detailedFilteredProducts.sort((a, b) => { switch (sortBy) { case 'sold_asc': return a.quantitySold - b.quantitySold; + case 'stock_priority': { + const priorityDiff = stockPriority[a.risk] - stockPriority[b.risk]; + if (priorityDiff !== 0) return priorityDiff; + return b.quantitySold - a.quantitySold; + } case 'revenue_desc': return b.revenue - a.revenue; case 'revenue_asc': return a.revenue - b.revenue; case 'stock_asc': return a.stock - b.stock; @@ -433,6 +447,7 @@ const Products = () => { > + @@ -464,7 +479,7 @@ const Products = () => {