From 86df5d6f29939eda9b8d51126b1877162f25c256 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Mon, 23 Mar 2026 12:43:02 +0100 Subject: [PATCH] feat: introduce BulkAiAnalyzer component for bulk product classification and AI context profiling. --- .../grid/components/bulk-ai-analyzer.tsx | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/features/grid/components/bulk-ai-analyzer.tsx b/src/features/grid/components/bulk-ai-analyzer.tsx index fc95a9a..0d51011 100644 --- a/src/features/grid/components/bulk-ai-analyzer.tsx +++ b/src/features/grid/components/bulk-ai-analyzer.tsx @@ -55,7 +55,20 @@ export function BulkAiAnalyzer() { } } - const initialPayloads: ProductAnalysisInput[] = rows.map((r) => { + // 2a. Produits sans aucune vente → Z direct, sans appel IA (avant de construire les payloads) + const zeroSalesRows = rows.filter((r) => (r.totalQuantite || 0) === 0); + if (zeroSalesRows.length > 0) { + const zChanges: Record = {}; + zeroSalesRows.forEach(r => { zChanges[r.codein] = "Z"; }); + batchSetDraftGamme(zChanges); + zeroSalesRows.forEach(r => { + setInsight(r.codein, "Aucune vente sur 12 mois — produit classé Z automatiquement."); + }); + } + + // Construire les payloads uniquement pour les produits avec ventes + const rowsWithSales = rows.filter((r) => (r.totalQuantite || 0) > 0); + const initialPayloads: ProductAnalysisInput[] = rowsWithSales.map((r) => { const sc = r.workingStores?.length || 1; const weight = sc === 1 ? 2 : 1; @@ -105,20 +118,8 @@ export function BulkAiAnalyzer() { totalFournisseurCa: r.totalFournisseurCa, supplierContext: supplierContext, }; - }); - // 2a. Produits sans aucune vente → Z direct, sans appel IA - const zeroSalesRows = rows.filter((r) => (r.totalQuantite || 0) === 0); - if (zeroSalesRows.length > 0) { - const zChanges: Record = {}; - zeroSalesRows.forEach(r => { zChanges[r.codein] = "Z"; }); - batchSetDraftGamme(zChanges); - zeroSalesRows.forEach(r => { - setInsight(r.codein, "Aucune vente sur 12 mois — produit classé Z automatiquement."); - }); - } - // 2b. Stock mort absolu : CA < 100€ ET quantité < 30 → Z direct, sans appel IA const deadStockRows = rows.filter(r => (r.totalQuantite || 0) > 0 &&