mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-14 02:37:55 +02:00
feat: implement AI analysis engine for generating retail product recommendation prompts.
This commit is contained in:
1 parent
2d3a90d6c7
commit
38e8fc1eac
4 files changed
+166
-86
No files matched your search
@@ -20,14 +20,22 @@ Tu analyses des produits pour recommander A (garder) ou Z (sortir).
|
||||
|
||||
IMPORTANT : La gamme C est RÉSERVÉE aux produits saisonniers et gérée MANUELLEMENT par l'acheteur. Tu ne dois JAMAIS recommander C.
|
||||
|
||||
--- LOGIQUE SIMPLIFIÉE (3 RÈGLES SEULEMENT) ---
|
||||
--- ORDRE DE PRIORITÉ (STRICT) ---
|
||||
|
||||
⛔ RÈGLE 1 — STOCK MORT ABSOLU (priorité absolue):
|
||||
📝 RÈGLE 1 — RÈGLE MANAGER (PRIORITÉ ABSOLUE):
|
||||
Si une règle manager est définie (section "RÈGLE MANAGER" dans le message) ET que le produit est concerné:
|
||||
→ Appliquer la consigne À LA LETTRE, même si elle contredit les autres règles.
|
||||
→ Mettre rule_applies = true et suivre EXACTEMENT la recommandation de la règle.
|
||||
→ Les règles 2 et 3 ci-dessous NE S'APPLIQUENT PAS si une règle manager est active.
|
||||
|
||||
Si AUCUNE règle manager n'est fournie → Passer directement aux règles 2 et 3.
|
||||
|
||||
⛔ RÈGLE 2 — STOCK MORT ABSOLU:
|
||||
SI CA réseau < 100€ ET Quantité réseau < 30 unités SIMULTANÉMENT → Z IMMÉDIAT, STOP.
|
||||
Les DEUX conditions doivent être vraies en même temps.
|
||||
Un produit à 30€ de CA sur 2 magasins (15€/magasin/an) coûte plus en gestion qu'il ne rapporte.
|
||||
|
||||
📊 RÈGLE 2 — PERFORMANCE RELATIVE AU FOURNISSEUR:
|
||||
📊 RÈGLE 3 — PERFORMANCE RELATIVE AU FOURNISSEUR:
|
||||
Le produit doit être évalué PAR RAPPORT à la moyenne de son lot fournisseur.
|
||||
|
||||
ÉTAPE 1: Calculer la moyenne du lot
|
||||
@@ -48,10 +56,6 @@ RATIONALE : Cette logique s'adapte automatiquement à TOUS les fournisseurs:
|
||||
- Gros fournisseur (50 produits) : moyenne faible, mais comparaison équitable
|
||||
- Même score relatif = même décision, indépendamment de la taille du fournisseur
|
||||
|
||||
📝 RÈGLE 3 — RÈGLE MANAGER (optionnel):
|
||||
Si le manager a défini une consigne ET que le produit est concerné → Appliquer la consigne À LA LETTRE.
|
||||
Si AUCUNE règle manager n'est fournie → IGNORER cette section.
|
||||
|
||||
--- FORMAT OBLIGATOIRE ---
|
||||
JSON uniquement, sans markdown.
|
||||
{
|
||||
@@ -89,6 +93,20 @@ JSON uniquement, sans markdown.
|
||||
lines.push(`DISTRIBUTION : ${storeLabel}`);
|
||||
lines.push("");
|
||||
|
||||
// ⚠️ RÈGLE MANAGER EN PRIORITÉ 1 — doit être visible AVANT toute analyse
|
||||
if (p.supplierContext) {
|
||||
lines.push(`🎯 ═══════════════════════════════════════════════════════════════`);
|
||||
lines.push(` ⚠️ RÈGLE MANAGER (PRIORITÉ ABSOLUE)`);
|
||||
lines.push(`═══════════════════════════════════════════════════════════════`);
|
||||
lines.push(`"${p.supplierContext}"`);
|
||||
lines.push(``);
|
||||
lines.push(`→ Ce produit ("${ctx.libelle1}") est-il concerné par cette règle ?`);
|
||||
lines.push(` Si OUI : rule_applies = true ET applique la consigne À LA LETTRE.`);
|
||||
lines.push(` Si NON : rule_applies = false ET applique les règles 2-3 normalement.`);
|
||||
lines.push(`═══════════════════════════════════════════════════════════════`);
|
||||
lines.push("");
|
||||
}
|
||||
|
||||
// KPIs bruts
|
||||
lines.push(`--- PERFORMANCE ABSOLUE ---`);
|
||||
lines.push(`• CA réseau : ${ctx.totalCaRaw.toLocaleString('fr-FR')}€`);
|
||||
@@ -117,14 +135,6 @@ JSON uniquement, sans markdown.
|
||||
lines.push(` → ${scoreRelatif >= 100 ? "✓ Au-dessus de la moyenne" : scoreRelatif >= 50 ? "⚠️ Entre 50% et 100% de la moyenne" : "✗ Très en dessous de la moyenne"}`);
|
||||
lines.push("");
|
||||
|
||||
// Règle manager
|
||||
if (p.supplierContext) {
|
||||
lines.push(`--- RÈGLE MANAGER ---`);
|
||||
lines.push(`"${p.supplierContext}"`);
|
||||
lines.push(`→ Ce produit ("${ctx.libelle1}") est-il concerné ? rule_applies = true/false.`);
|
||||
lines.push("");
|
||||
}
|
||||
|
||||
lines.push(`Génère UNIQUEMENT le JSON :`);
|
||||
return lines.join("\n");
|
||||
}
|
||||
|
||||
@@ -5,8 +5,9 @@ import { persist } from "zustand/middleware";
|
||||
import { DEFAULT_SCORE_SETTINGS, type ScoreSettings } from "@/lib/score-engine";
|
||||
|
||||
interface ScoreSettingsState extends ScoreSettings {
|
||||
setSeuilAxeFort: (v: number) => void;
|
||||
setBonusParAxe: (v: number) => void;
|
||||
setWeightCA: (v: number) => void;
|
||||
setWeightVolume: (v: number) => void;
|
||||
setWeightMarge: (v: number) => void;
|
||||
resetDefaults: () => void;
|
||||
}
|
||||
|
||||
@@ -15,8 +16,9 @@ export const useScoreSettingsStore = create<ScoreSettingsState>()(
|
||||
(set) => ({
|
||||
...DEFAULT_SCORE_SETTINGS,
|
||||
|
||||
setSeuilAxeFort: (v) => set({ seuilAxeFort: v }),
|
||||
setBonusParAxe: (v) => set({ bonusParAxe: v }),
|
||||
setWeightCA: (v) => set({ weightCA: v }),
|
||||
setWeightVolume: (v) => set({ weightVolume: v }),
|
||||
setWeightMarge: (v) => set({ weightMarge: v }),
|
||||
resetDefaults: () => set({ ...DEFAULT_SCORE_SETTINGS }),
|
||||
}),
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user