diff --git a/src/app.js b/src/app.js index cd6978c..59b0413 100644 --- a/src/app.js +++ b/src/app.js @@ -58,6 +58,7 @@ app.listen(PORT, () => { console.log(' GET /api/articles[?search=&codein=&ean=&codefou=&actif=&page=&limit=]'); console.log(' GET /api/articles/:id'); console.log(' GET /api/articles/:id/referentiel'); + console.log(' GET /api/articles/:id/dernier-fournisseur[?site=]'); console.log(' GET /api/articles/:id/mouvements'); console.log(' GET /api/fournisseurs[?search=]'); console.log(' GET /api/fournisseurs/:code/articles'); diff --git a/src/routes/articles.js b/src/routes/articles.js index 9f9002a..82a065d 100644 --- a/src/routes/articles.js +++ b/src/routes/articles.js @@ -258,6 +258,38 @@ router.get('/:id/referentiel', async (req, res) => { } }); +// GET /api/articles/:id/dernier-fournisseur?site= +// Retourne le fournisseur réel (dernière entrée en stock GenreMvt=1) par site +// C'est le seul moyen fiable d'identifier qui a livré le produit actuellement en rayon +router.get('/:id/dernier-fournisseur', async (req, res) => { + try { + const pool = getPool(); + const { site = '' } = req.query; + + const result = await pool.query(` + SELECT DISTINCT ON (m.Site) + m.Site, + m.DatMvt AS date_derniere_entree, + m.CODEFOU AS codefou, + fa.RAISONSOCIALE AS nom_fournisseur, + m.QteMvt AS qte_entree, + m.Prmp AS prmp + FROM MvtArt m + LEFT JOIN FOUADR1 fa ON fa.CODE = m.CODEFOU AND fa.SIT_CODE = '000' + WHERE m.ArtNoId = $1 + AND m.GenreMvt = 1 + AND m.CODEFOU IS NOT NULL + AND m.CODEFOU != '' + AND ($2 = '' OR m.Site LIKE $2) + ORDER BY m.Site, m.DatMvt DESC + `, [req.params.id, `%${site}%`]); + + res.json({ artnoid: req.params.id, fournisseurs_par_site: result.rows }); + } catch (err) { + res.status(500).json({ error: err.message }); + } +}); + // GET /api/articles/:id/mouvements?dateDebut=&dateFin=&site=&page=&limit= router.get('/:id/mouvements', async (req, res) => { try { diff --git a/src/routes/mouvements.js b/src/routes/mouvements.js index b768a37..8ede504 100644 --- a/src/routes/mouvements.js +++ b/src/routes/mouvements.js @@ -51,7 +51,27 @@ router.get('/articles', async (req, res) => { a.CODEIN, a.LIBELLE1, m.LibMvt, m.GenreMvt, m.QteMvt, m.ValMvt, m.MntMvtHt, m.MntMvtTTC, m.MargeMvt, - m.QteStock, m.Prmp, m.ValStock, m.CODEFOU + m.QteStock, m.Prmp, m.ValStock, + m.CODEFOU AS codefou_mouvement, + -- Pour les ventes (GenreMvt=3), le vrai fournisseur = dernière entrée avant cette vente + CASE WHEN m.GenreMvt = 3 THEN ( + SELECT e.CODEFOU FROM MvtArt e + WHERE e.ArtNoId = m.ArtNoId AND e.Site = m.Site + AND e.GenreMvt = 1 AND e.CODEFOU IS NOT NULL AND e.CODEFOU != '' + AND e.DatMvt <= m.DatMvt + ORDER BY e.DatMvt DESC LIMIT 1 + ) ELSE m.CODEFOU END AS codefou_reel, + CASE WHEN m.GenreMvt = 3 THEN ( + SELECT fa.RAISONSOCIALE FROM MvtArt e + LEFT JOIN FOUADR1 fa ON fa.CODE = e.CODEFOU AND fa.SIT_CODE = '000' + WHERE e.ArtNoId = m.ArtNoId AND e.Site = m.Site + AND e.GenreMvt = 1 AND e.CODEFOU IS NOT NULL AND e.CODEFOU != '' + AND e.DatMvt <= m.DatMvt + ORDER BY e.DatMvt DESC LIMIT 1 + ) ELSE ( + SELECT fa2.RAISONSOCIALE FROM FOUADR1 fa2 + WHERE fa2.CODE = m.CODEFOU AND fa2.SIT_CODE = '000' + ) END AS nom_fournisseur_reel FROM MvtArt m JOIN ARTICLES a ON a.NO_ID = m.ArtNoId WHERE m.DatMvt BETWEEN $1 AND $2