mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-24 15:38:09 +02:00
feat: add PostgreSQL client to fetch FF Nancy data via bulk SQL queries, replacing per-article HTTP requests.
This commit is contained in:
1 parent
6827257f95
commit
dd846247c9
1 file changed
+43
-20
+43
-20
@@ -71,21 +71,40 @@ export interface PgRankingRow {
|
|||||||
* 1 requête SQL — remplace getFournisseursFromApi().
|
* 1 requête SQL — remplace getFournisseursFromApi().
|
||||||
*/
|
*/
|
||||||
export async function pgGetFournisseurs(search?: string): Promise<{ code: string; nom: string }[]> {
|
export async function pgGetFournisseurs(search?: string): Promise<{ code: string; nom: string }[]> {
|
||||||
const result = await db.execute(sql`
|
try {
|
||||||
SELECT
|
const result = await db.execute(sql`
|
||||||
fi.code,
|
SELECT
|
||||||
fi.nom
|
fi.code,
|
||||||
FROM fouident fi
|
fi.nom
|
||||||
WHERE fi.actif = true
|
FROM fouident fi
|
||||||
AND fi.suspendu = false
|
WHERE fi.actif = true
|
||||||
AND fi.code IS NOT NULL
|
AND fi.suspendu = false
|
||||||
AND fi.nom IS NOT NULL
|
AND fi.code IS NOT NULL
|
||||||
${search ? sql`AND (fi.nom ILIKE ${'%' + search + '%'} OR fi.code ILIKE ${'%' + search + '%'})` : sql``}
|
AND fi.nom IS NOT NULL
|
||||||
ORDER BY fi.nom
|
${search ? sql`AND (fi.nom ILIKE ${'%' + search + '%'} OR fi.code ILIKE ${'%' + search + '%'})` : sql``}
|
||||||
`);
|
ORDER BY fi.nom
|
||||||
|
`);
|
||||||
return (result.rows as unknown as { code: string; nom: string }[])
|
return (result.rows as unknown as { code: string; nom: string }[]).filter(r => r.code && r.nom);
|
||||||
.filter(r => r.code && r.nom);
|
} catch (e) {
|
||||||
|
console.error("[pg-ff] pgGetFournisseurs error:", e);
|
||||||
|
// Fallback : fouident inaccessible → fouadr1 avec artfou1
|
||||||
|
try {
|
||||||
|
const fallback = await db.execute(sql`
|
||||||
|
SELECT DISTINCT fa.code, fa.raisonsociale AS nom
|
||||||
|
FROM fouadr1 fa
|
||||||
|
INNER JOIN artfou1 af ON af.code = fa.code
|
||||||
|
WHERE fa.sit_code = '000'
|
||||||
|
AND fa.raisonsociale IS NOT NULL
|
||||||
|
AND fa.raisonsociale !~ '^\s*\d'
|
||||||
|
${search ? sql`AND (fa.raisonsociale ILIKE ${'%' + search + '%'} OR fa.code ILIKE ${'%' + search + '%'})` : sql``}
|
||||||
|
ORDER BY fa.raisonsociale
|
||||||
|
`);
|
||||||
|
return (fallback.rows as unknown as { code: string; nom: string }[]).filter(r => r.code && r.nom);
|
||||||
|
} catch (e2) {
|
||||||
|
console.error("[pg-ff] pgGetFournisseurs fallback error:", e2);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
@@ -117,13 +136,17 @@ export async function pgGetArticlesByFournisseur(codefou: string): Promise<PgArt
|
|||||||
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
|
-- Seulement articles avec gamme OU avec ventes récentes (scoped au fournisseur)
|
||||||
JOIN (
|
JOIN (
|
||||||
SELECT artnoid FROM art_gamme_saison
|
SELECT DISTINCT ags.artnoid
|
||||||
|
FROM art_gamme_saison ags
|
||||||
|
JOIN artfou1 af2 ON af2.art_no_id = ags.artnoid AND af2.code = ${codefou}
|
||||||
UNION
|
UNION
|
||||||
SELECT artnoid FROM mvtart
|
SELECT DISTINCT m.artnoid
|
||||||
WHERE genremvt = 3
|
FROM mvtart m
|
||||||
AND datmvt >= CURRENT_DATE - INTERVAL '12 months'
|
JOIN artfou1 af2 ON af2.art_no_id = m.artnoid AND af2.code = ${codefou}
|
||||||
|
WHERE m.genremvt = 3
|
||||||
|
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'
|
||||||
|
|||||||
Reference in new issue
Block a user