mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-23 06:58:10 +02:00
feat: Replace per-article HTTP calls with direct bulk SQL queries via new PostgreSQL client for FF Nancy data.
This commit is contained in:
1 parent
4996e126b3
commit
1aed954606
1 file changed
+45
-19
+45
-19
@@ -118,12 +118,10 @@ export async function pgGetFournisseurs(search?: string): Promise<{ code: string
|
|||||||
* 1 seule requête SQL — remplace getArticlesByFournisseur() + per-article fetches.
|
* 1 seule requête SQL — remplace getArticlesByFournisseur() + per-article fetches.
|
||||||
*/
|
*/
|
||||||
export async function pgGetArticlesByFournisseur(codefou: string): Promise<PgArticle[]> {
|
export async function pgGetArticlesByFournisseur(codefou: string): Promise<PgArticle[]> {
|
||||||
// Filtrage sur les articles "actifs" uniquement :
|
// Requête principale : articles avec gamme OU ventes récentes (filtre "actifs")
|
||||||
// - avec gamme affectée (art_gamme_saison) → à gérer même sans ventes
|
// DISTINCT ON (a.no_id) car artfou1 peut avoir plusieurs lignes par article/fournisseur
|
||||||
// - OU avec au moins 1 vente sur les 12 derniers mois (mvtart genremvt=3)
|
const runFiltered = () => db.execute(sql`
|
||||||
// Cela évite d'envoyer 50 000 lignes vides pour les gros fournisseurs → page blanche
|
SELECT DISTINCT ON (a.no_id)
|
||||||
const result = await db.execute(sql`
|
|
||||||
SELECT
|
|
||||||
a.no_id,
|
a.no_id,
|
||||||
a.codein,
|
a.codein,
|
||||||
af.code AS codefou,
|
af.code AS codefou,
|
||||||
@@ -136,8 +134,7 @@ export async function pgGetArticlesByFournisseur(codefou: string): Promise<PgArt
|
|||||||
ai.prix_vente_mini AS pv_central,
|
ai.prix_vente_mini AS pv_central,
|
||||||
pa.pa
|
pa.pa
|
||||||
FROM artfou1 af
|
FROM artfou1 af
|
||||||
JOIN articles a
|
JOIN articles a ON a.no_id = af.art_no_id
|
||||||
ON a.no_id = af.art_no_id
|
|
||||||
-- Seulement articles avec gamme OU avec ventes récentes (scoped au fournisseur)
|
-- Seulement articles avec gamme OU avec ventes récentes (scoped au fournisseur)
|
||||||
JOIN (
|
JOIN (
|
||||||
SELECT DISTINCT ags.artnoid
|
SELECT DISTINCT ags.artnoid
|
||||||
@@ -150,21 +147,50 @@ export async function pgGetArticlesByFournisseur(codefou: string): Promise<PgArt
|
|||||||
WHERE m.genremvt = 3
|
WHERE m.genremvt = 3
|
||||||
AND m.datmvt >= CURRENT_DATE - INTERVAL '12 months'
|
AND m.datmvt >= CURRENT_DATE - INTERVAL '12 months'
|
||||||
) actif ON actif.artnoid = a.no_id
|
) actif ON actif.artnoid = a.no_id
|
||||||
LEFT JOIN fouadr1 fa
|
LEFT JOIN fouadr1 fa ON fa.code = af.code AND fa.sit_code = '000'
|
||||||
ON fa.code = af.code AND fa.sit_code = '000'
|
LEFT JOIN article_infosup ai ON ai.artnoid = a.no_id
|
||||||
LEFT JOIN article_infosup ai
|
LEFT JOIN cube_pa pa ON pa.artnoid = a.no_id
|
||||||
ON ai.artnoid = a.no_id
|
LEFT JOIN art_gtin ag ON ag.idarticle = a.no_id AND ag.preferentiel = 1
|
||||||
LEFT JOIN cube_pa pa
|
|
||||||
ON pa.artnoid = a.no_id
|
|
||||||
LEFT JOIN art_gtin ag
|
|
||||||
ON ag.idarticle = a.no_id AND ag.preferentiel = 1
|
|
||||||
WHERE af.code = ${codefou}
|
WHERE af.code = ${codefou}
|
||||||
AND a.codein IS NOT NULL
|
AND a.codein IS NOT NULL
|
||||||
ORDER BY a.codein
|
ORDER BY a.no_id, af.no_id
|
||||||
`);
|
`);
|
||||||
|
|
||||||
console.log(`[pg-ff] Articles actifs: ${result.rows.length} pour ${codefou}`);
|
// Fallback sans filtre "actif" (tous les articles du fournisseur)
|
||||||
return (result.rows as unknown as PgArticle[]).filter(r => r.codein);
|
const runAll = () => db.execute(sql`
|
||||||
|
SELECT DISTINCT ON (a.no_id)
|
||||||
|
a.no_id,
|
||||||
|
a.codein,
|
||||||
|
af.code AS codefou,
|
||||||
|
fa.raisonsociale AS nomfou,
|
||||||
|
a.libelle1,
|
||||||
|
af.pcb,
|
||||||
|
af.reference,
|
||||||
|
af.ean13,
|
||||||
|
COALESCE(ag.gtin, af.ean13) AS gtin,
|
||||||
|
ai.prix_vente_mini AS pv_central,
|
||||||
|
pa.pa
|
||||||
|
FROM artfou1 af
|
||||||
|
JOIN articles a ON a.no_id = af.art_no_id
|
||||||
|
LEFT JOIN fouadr1 fa ON fa.code = af.code AND fa.sit_code = '000'
|
||||||
|
LEFT JOIN article_infosup ai ON ai.artnoid = a.no_id
|
||||||
|
LEFT JOIN cube_pa pa ON pa.artnoid = a.no_id
|
||||||
|
LEFT JOIN art_gtin ag ON ag.idarticle = a.no_id AND ag.preferentiel = 1
|
||||||
|
WHERE af.code = ${codefou}
|
||||||
|
AND a.codein IS NOT NULL
|
||||||
|
ORDER BY a.no_id, af.no_id
|
||||||
|
`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await runFiltered();
|
||||||
|
console.log(`[pg-ff] Articles actifs (filtrés): ${result.rows.length} pour ${codefou}`);
|
||||||
|
return (result.rows as unknown as PgArticle[]).filter(r => r.codein);
|
||||||
|
} catch (e) {
|
||||||
|
console.error("[pg-ff] Articles filtrés échoué, fallback tous articles:", (e as Error).message?.slice(0, 300));
|
||||||
|
const result = await runAll();
|
||||||
|
console.log(`[pg-ff] Articles fallback (tous): ${result.rows.length} pour ${codefou}`);
|
||||||
|
return (result.rows as unknown as PgArticle[]).filter(r => r.codein);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|||||||
Reference in new issue
Block a user