feat: implement movement and article route handlers and register them in the main application entry point
This commit is contained in:
1 parent
b4a9331fa8
commit
d3052a6235
3 files changed
+54
-1
No files matched your search
@@ -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');
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in new issue
Block a user