fix(hit-parade): ventes nettes par magasin — corrige les chiffres faussés (579)

La requête Hit Parade divergeait du calcul canonique de la Grille :
- SUM(ABS(qtemvt)) additionnait les retours clients comme des ventes au
  lieu de les déduire → quantités et CA gonflés sur le magasin ayant des
  retours/avoirs sur la période (visible sur 579).
- ABS(SUM(mntmvtttc)) inversait le signe d'un CA net négatif.
- GROUP BY no_id + jointure artfou1 preference=1 non dédupliquée pouvait
  produire plusieurs lignes par (codein, site), écrasées par le pivot.

Corrections :
- Hit Parade : ventes nettes SUM(-qtemvt) / SUM(-mntmvtttc), agrégation
  par (codein, site), fournisseur préféré via LATERAL ... LIMIT 1,
  stock agrégé par codein ; pivot en accumulation (+=) par sécurité.
- Analytics (même classe de bug) : pgGetCaByFournisseur et
  pgGetCaByNomenclature passent en CA net ; jointure fournisseur
  dédupliquée (LATERAL LIMIT 1) pour éviter le double comptage.
- Gestion de stock : pgGetStockNegatif et pgGetSansVente6Mois dédupliquent
  le fournisseur préféré (LATERAL LIMIT 1) pour éviter les lignes en double.

Audit complet du mapping par magasin (292/579) côté client : aucun champ
inversé (hit-parade, analytics, dashboard, grid, heatmap). Build OK.
This commit is contained in:
Claude committed 2026-07-06 15:55:43 +00:00
1 parent 32f9a27563
commit d733755659
2 files changed
+66 -26

No files matched your search

+11 -8
View File
@@ -42,14 +42,17 @@ function pivotHitParade(rows: HitParadeRow[]): HitParadePivotRow[] {
});
}
const entry = map.get(row.codein)!;
if (row.site === "292") {
entry.qte292 = row.qte_vendue;
entry.ca292 = row.ca_ttc;
entry.marge292 = row.marge;
} else if (row.site === "579") {
entry.qte579 = row.qte_vendue;
entry.ca579 = row.ca_ttc;
entry.marge579 = row.marge;
// Accumulation (+=) et non affectation : si la requête renvoyait plusieurs
// lignes pour un même (codein, site), aucune valeur ne serait écrasée.
const site = String(row.site).trim();
if (site === "292") {
entry.qte292 += row.qte_vendue;
entry.ca292 += row.ca_ttc;
entry.marge292 += row.marge;
} else if (site === "579") {
entry.qte579 += row.qte_vendue;
entry.ca579 += row.ca_ttc;
entry.marge579 += row.marge;
}
}