From b420dc2a2b6fec2b619b92fc50b13dabb3823fe2 Mon Sep 17 00:00:00 2001 From: Michael SCHAL Date: Tue, 31 Mar 2026 10:36:19 +0200 Subject: [PATCH] fix: prevent CA multiplication in analytics by using DISTINCT ON per article artfou1 has multiple rows per article (multi-supplier), causing each mvtart movement to be counted N times in the JOIN. Use a CTE with DISTINCT ON (art_no_id) ORDER BY no_id to pick one canonical supplier per article, matching the same pattern used in pgGetArticlesByFournisseur. Co-Authored-By: Claude Sonnet 4.6 --- src/lib/pg-ff-client.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/lib/pg-ff-client.ts b/src/lib/pg-ff-client.ts index c960ecd..cf71352 100644 --- a/src/lib/pg-ff-client.ts +++ b/src/lib/pg-ff-client.ts @@ -645,21 +645,27 @@ export async function pgGetCaByFournisseur( moisN1: string ): Promise { const result = await pgNoParallel(sql` + WITH art_fou AS ( + -- Un seul fournisseur par article (le plus ancien no_id = fournisseur principal) + SELECT DISTINCT ON (art_no_id) art_no_id, code AS codefou + FROM artfou1 + ORDER BY art_no_id, no_id + ) SELECT - af.code AS code, + af.codefou AS code, MAX(f.raisonsociale)::text AS nom, m.site, TO_CHAR(m.datmvt, 'YYYY-MM') AS mois, SUM(-m.mntmvtttc)::float AS ca_ttc FROM mvtart m - JOIN articles a ON a.no_id = m.artnoid - JOIN artfou1 af ON af.art_no_id = a.no_id - JOIN fouadr1 f ON f.code = af.code AND f.sit_code = '000' + JOIN articles a ON a.no_id = m.artnoid + JOIN art_fou af ON af.art_no_id = a.no_id + JOIN fouadr1 f ON f.code = af.codefou AND f.sit_code = '000' WHERE (TO_CHAR(m.datmvt, 'YYYY-MM') = ${mois} OR TO_CHAR(m.datmvt, 'YYYY-MM') = ${moisN1}) AND m.site IN ('292', '579') AND m.genremvt = 3 - GROUP BY af.code, m.site, TO_CHAR(m.datmvt, 'YYYY-MM') - ORDER BY af.code, m.site, TO_CHAR(m.datmvt, 'YYYY-MM') + GROUP BY af.codefou, m.site, TO_CHAR(m.datmvt, 'YYYY-MM') + ORDER BY af.codefou, m.site, TO_CHAR(m.datmvt, 'YYYY-MM') `); console.log(`[pg-ff] CaByFournisseur: ${result.rows.length} lignes pour ${mois}/${moisN1}`);