diff --git a/src/app/(dashboard)/hit-parade/page.tsx b/src/app/(dashboard)/hit-parade/page.tsx index cca29c5..65b9c6b 100644 --- a/src/app/(dashboard)/hit-parade/page.tsx +++ b/src/app/(dashboard)/hit-parade/page.tsx @@ -1,4 +1,4 @@ -import { pgGetHitParade, pgGetStockForCodeins } from "@/lib/pg-ff-client"; +import { pgGetHitParade, HitParadeRow } from "@/lib/pg-ff-client"; import { HitParadeClient } from "./client"; export interface HitParadePivotRow { @@ -19,9 +19,7 @@ export interface HitParadePivotRow { stockTotal: number; } -function pivotHitParade( - rows: Array<{ codein: string; libelle: string; fournisseur: string; site: string; qte_vendue: number; ca_ttc: number; marge: number }> -): HitParadePivotRow[] { +function pivotHitParade(rows: HitParadeRow[]): HitParadePivotRow[] { const map = new Map(); for (const row of rows) { @@ -33,7 +31,10 @@ function pivotHitParade( qte292: 0, ca292: 0, marge292: 0, qte579: 0, ca579: 0, marge579: 0, qteTotal: 0, caTotal: 0, margeTotal: 0, - stock292: 0, stock579: 0, stockTotal: 0, + // Stock comes from the SQL query directly (LEFT JOIN cube_stock) + stock292: row.stock292 ?? 0, + stock579: row.stock579 ?? 0, + stockTotal: row.stockTotal ?? 0, }); } const entry = map.get(row.codein)!; @@ -75,13 +76,6 @@ export default async function HitParadePage(props: { const rows = await pgGetHitParade(dateDebut, dateFin); const pivotted = pivotHitParade(rows); - const codeins = pivotted.map(r => r.codein); - const stockMap = await pgGetStockForCodeins(codeins); - for (const row of pivotted) { - const s = stockMap.get(row.codein); - if (s) { row.stock292 = s.stock292; row.stock579 = s.stock579; row.stockTotal = s.stockTotal; } - } - return (
diff --git a/src/lib/pg-ff-client.ts b/src/lib/pg-ff-client.ts index 3bb5dd7..b870110 100644 --- a/src/lib/pg-ff-client.ts +++ b/src/lib/pg-ff-client.ts @@ -706,30 +706,60 @@ export interface HitParadeRow { qte_vendue: number; ca_ttc: number; marge: number; + stock292: number; + stock579: number; + stockTotal: number; } /** - * Retourne les ventes produit sur une période, avec fournisseur, qté, CA TTC et marge par site. + * Retourne les ventes produit sur une période, avec fournisseur, qté, CA TTC, marge et stock par site. + * Le stock est intégré via un LEFT JOIN — pas de requête séparée, pas de tableau de paramètres. */ export async function pgGetHitParade(dateDebut: string, dateFin: string): Promise { const result = await pgNoParallel(sql` + WITH ventes AS ( + SELECT + a.no_id AS art_no_id, + a.codein::text AS codein, + a.libelle1::text AS libelle, + COALESCE(fi.nom, af.code, 'Sans fournisseur')::text AS fournisseur, + m.site, + SUM(ABS(m.qtemvt))::float AS qte_vendue, + ABS(SUM(m.mntmvtttc))::float AS ca_ttc, + SUM(m.margemvt)::float AS marge + FROM mvtart m + JOIN articles a ON a.no_id = m.artnoid + LEFT JOIN artfou1 af ON af.art_no_id = a.no_id AND af.preference = 1 + LEFT JOIN fouident fi ON fi.code = af.code + WHERE m.datmvt BETWEEN ${dateDebut}::date AND ${dateFin}::date + AND m.site IN ('292', '579') + AND m.genremvt = 3 + GROUP BY a.no_id, a.codein, a.libelle1, fi.nom, af.code, m.site + ), + stock_agg AS ( + SELECT + cs.artnoid, + SUM(CASE WHEN cs.site = '292' THEN cs.stockdispo ELSE 0 END)::float AS stock292, + SUM(CASE WHEN cs.site = '579' THEN cs.stockdispo ELSE 0 END)::float AS stock579, + SUM(cs.stockdispo)::float AS stockTotal + FROM cube_stock cs + WHERE cs.artnoid IN (SELECT DISTINCT art_no_id FROM ventes) + GROUP BY cs.artnoid + ) SELECT - a.codein::text AS codein, - a.libelle1::text AS libelle, - COALESCE(fi.nom, af.code, 'Sans fournisseur')::text AS fournisseur, - m.site, - SUM(ABS(m.qtemvt))::float AS qte_vendue, - ABS(SUM(m.mntmvtttc))::float AS ca_ttc, - SUM(m.margemvt)::float AS marge - FROM mvtart m - JOIN articles a ON a.no_id = m.artnoid - LEFT JOIN artfou1 af ON af.art_no_id = a.no_id AND af.preference = 1 - LEFT JOIN fouident fi ON fi.code = af.code - WHERE m.datmvt BETWEEN ${dateDebut}::date AND ${dateFin}::date - AND m.site IN ('292', '579') - AND m.genremvt = 3 - GROUP BY a.codein, a.libelle1, fi.nom, af.code, m.site - ORDER BY ca_ttc DESC + v.codein, + v.libelle, + v.fournisseur, + v.site, + v.qte_vendue, + v.ca_ttc, + v.marge, + COALESCE(s.stock292, 0) AS stock292, + COALESCE(s.stock579, 0) AS stock579, + COALESCE(s.stockTotal, 0) AS "stockTotal" + FROM ventes v + LEFT JOIN stock_agg s ON s.artnoid = v.art_no_id + ORDER BY v.ca_ttc DESC `); console.log(`[pg-ff] HitParade: ${result.rows.length} lignes pour ${dateDebut}→${dateFin}`);