feat: add fournisseur filter to hitparade endpoint

Add codefou query param (ILIKE partial match) to /api/performance/hitparade.
Also return CODE_FOURNISSEUR and FOURNISSEUR (nom) columns in each result row.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Sonnet 4.6 committed 2026-05-21 15:55:45 +02:00
1 parent f83a090cfb
commit 329a4c018c
2 files changed
+19 -5

No files matched your search

+1 -1
View File
@@ -77,7 +77,7 @@ app.listen(PORT, () => {
console.log(' GET /api/mouvements/reglements[?dateDebut=&dateFin=]');
console.log(' GET /api/mouvements/synthese[?dateDebut=&dateFin=&site=]');
console.log(' GET /api/performance/ca[?dateDebut=&dateFin=&site=&groupBy=jour|mois]');
console.log(' GET /api/performance/hitparade[?dateDebut=&dateFin=&site=&limit=&groupBy=qte|ca|marge]');
console.log(' GET /api/performance/hitparade[?dateDebut=&dateFin=&site=&limit=&groupBy=qte|ca|marge&codefou=]');
console.log(' GET /api/performance/ca/nomenclature[?dateDebut=&dateFin=&site=&niveau=]');
console.log(' GET /api/performance/ca/gamme[?dateDebut=&dateFin=&site=]');
console.log(' GET /api/publicites[?search=&site=&dateDebut=&dateFin=&page=&limit=]');
+18 -4
View File
@@ -45,20 +45,30 @@ router.get('/ca', async (req, res) => {
}
});
// GET /api/performance/hitparade?dateDebut=&dateFin=&site=&limit=&groupBy=qte|ca|marge
// GET /api/performance/hitparade?dateDebut=&dateFin=&site=&limit=&groupBy=qte|ca|marge&codefou=
router.get('/hitparade', async (req, res) => {
try {
const pool = getPool();
const { dateDebut = '2024-01-01', dateFin = '2099-12-31', site = '', limit = 50, groupBy = 'ca' } = req.query;
const {
dateDebut = '2024-01-01', dateFin = '2099-12-31',
site = '', limit = 50, groupBy = 'ca', codefou = '',
} = req.query;
const limitNum = Math.max(1, Math.min(parseInt(limit) || 50, 500));
const orderCol = groupBy === 'qte' ? 'QTE_VENDUE' : groupBy === 'marge' ? 'MARGE' : 'CA_HT';
const fouFilter = codefou ? `AND af.code ILIKE $4` : '';
const params = codefou
? [dateDebut, dateFin, `%${site}%`, `%${codefou}%`]
: [dateDebut, dateFin, `%${site}%`];
const result = await pool.query(`
SELECT
a.CODEIN,
a.LIBELLE1,
m.Site,
af.code AS CODE_FOURNISSEUR,
COALESCE(fi.nom, af.code) AS FOURNISSEUR,
COUNT(*) AS NB_PASSAGES,
SUM(CASE WHEN m.mntmvtttc < 0 THEN ABS(m.qtemvt) ELSE 0 END) AS QTE_VENDUE,
SUM(CASE WHEN m.mntmvtttc < 0 THEN ABS(m.mntmvtht) ELSE 0 END) AS CA_HT,
@@ -70,18 +80,22 @@ router.get('/hitparade', async (req, res) => {
MAX(m.DatMvt) AS DERNIERE_VENTE
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 = true
LEFT JOIN fouident fi ON fi.code = af.code
WHERE m.GenreMvt IN (3, 4, 9)
AND m.DatMvt BETWEEN $1 AND $2
AND m.Site LIKE $3
GROUP BY a.CODEIN, a.LIBELLE1, m.Site
${fouFilter}
GROUP BY a.CODEIN, a.LIBELLE1, m.Site, af.code, fi.nom
ORDER BY ${orderCol} DESC
LIMIT ${limitNum}
`, [dateDebut, dateFin, `%${site}%`]);
`, params);
res.json({
dateDebut,
dateFin,
site: site || 'tous',
codefou: codefou || null,
classementPar: groupBy,
hitparade: result.rows,
});