mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-11 17:26:32 +02:00
feat: Implement a composite weighted score engine and update the task markdown with a master plan and progress log.
This commit is contained in:
1 parent
12809b9924
commit
cfbf293104
3 files changed
+17
-8
No files matched your search
@@ -48,8 +48,8 @@ IMPORTANT : La gamme C est RÉSERVÉE aux produits saisonniers et gérée MANUEL
|
||||
Sinon → A si actif (inactivité < 3 mois), Z si inactif ≥ 3 mois.
|
||||
— Quadrant WATCH ⚠️ : Signal négatif.
|
||||
Si poids CA rayon > 5% ou poids QTÉ rayon > 5% → A (surveiller).
|
||||
Si percentileCa >= 50 ou percentileQty >= 50 → A (produit trop important au fournisseur).
|
||||
Sinon → Z si inactivité ≥ 2 mois, A si actif.
|
||||
Si percentileCa >= 80 ou percentileQty >= 80 → A (produit majeur du lot, vital).
|
||||
Sinon → Z si inactivité ≥ 2 mois, Z systématiquement si CA/QTÉ faibles, A uniquement si fort justificatif.
|
||||
|
||||
--- COHÉRENCE INTER-PRODUITS ---
|
||||
Ne mets jamais Z un produit si son percentile CA ET son percentile QTÉ sont tous les deux supérieurs à un autre produit déjà classé A dans ce lot.
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* CollectFlow — Score Engine (Proposition B: MAX + Bonus polyvalence)
|
||||
* CollectFlow — Score Engine (Proposition C: Score Composite Pondéré)
|
||||
*
|
||||
* Calcule le score de performance d'un produit en fonction de son poids
|
||||
* relatif chez le fournisseur sur 3 axes : Quantité, CA, Marge.
|
||||
* relatif chez le fournisseur sur 3 axes : CA, Quantité, Marge.
|
||||
*
|
||||
* Formule :
|
||||
* poids = produit.metric / total_fournisseur × 100
|
||||
* base = MAX(poids_qty, poids_ca, poids_marge)
|
||||
* score_axe = produit.metric / max_metric_fournisseur × 100
|
||||
* base = (scoreCa × 45%) + (scoreQty × 35%) + (scoreMarge × 20%)
|
||||
* bonus = count(poids > seuil) × bonusParAxe
|
||||
* score = MIN(base + bonus, 100)
|
||||
*/
|
||||
@@ -84,8 +84,8 @@ export function computeProductScores(
|
||||
const scoreCa = maxCa > 0 ? (data.wCa / maxCa) * 100 : 0;
|
||||
const scoreMarge = maxMarge > 0 ? (data.wMarge / maxMarge) * 100 : 0;
|
||||
|
||||
// Base = meilleur score d'axe
|
||||
const base = Math.max(scoreQty, scoreCa, scoreMarge);
|
||||
// Base = Moyenne pondérée (CA: 45%, Qty: 35%, Marge: 20%)
|
||||
const base = (scoreCa * 0.45) + (scoreQty * 0.35) + (scoreMarge * 0.20);
|
||||
|
||||
let axesForts = 0;
|
||||
if (scoreQty > settings.seuilAxeFort) axesForts++;
|
||||
|
||||
Reference in new issue
Block a user