feat: Introduce PostgreSQL client for bulk data retrieval and integrate it into product grid data fetching actions.

This commit is contained in:
Michael committed 2026-03-20 10:05:30 +01:00
1 parent 58d467a7ea
commit 4dd1b5f7c7
3 files changed
+36 -9

No files matched your search

+4 -3
View File
@@ -1,14 +1,15 @@
"use server";
import { getFournisseursFromApi, getSitesFromApi } from "@/lib/api-ff-client";
import { getSitesFromApi } from "@/lib/api-ff-client";
import { pgGetFournisseurs } from "@/lib/pg-ff-client";
import { getProductRows } from "./api/get-product-rows";
import type { ProductRow, GridFilters } from "@/types/grid";
/**
* Get the list of all suppliers from the FF Nancy API.
* Get the list of all suppliers from PostgreSQL (fouadr1).
*/
export async function getFournisseurs() {
return getFournisseursFromApi();
return pgGetFournisseurs();
}
/**
+7 -6
View File
@@ -10,6 +10,7 @@ import {
pgGetStockByFournisseur,
pgGetRankingByFournisseur,
pgGetCommandesByFournisseur,
type PgStockRow,
} from "@/lib/pg-ff-client";
import { db } from "@/db";
import { sessionSnapshots } from "@/db/schema";
@@ -38,12 +39,12 @@ export async function getProductRows(input: GetProductRowsInput): Promise<Produc
rankingResult,
commandesMap,
] = await Promise.all([
pgGetArticlesByFournisseur(codeFournisseur),
pgGetMensuelByFournisseur(codeFournisseur, dateDebut, dateFin),
pgGetGammesByFournisseur(codeFournisseur),
pgGetStockByFournisseur(codeFournisseur),
pgGetRankingByFournisseur(codeFournisseur),
pgGetCommandesByFournisseur(codeFournisseur),
pgGetArticlesByFournisseur(codeFournisseur).catch(e => { console.error("[getProductRows] pgGetArticlesByFournisseur ERROR:", e); return []; }),
pgGetMensuelByFournisseur(codeFournisseur, dateDebut, dateFin).catch(e => { console.error("[getProductRows] pgGetMensuelByFournisseur ERROR:", e); return []; }),
pgGetGammesByFournisseur(codeFournisseur).catch(e => { console.error("[getProductRows] pgGetGammesByFournisseur ERROR:", e); return new Map<string, string>(); }),
pgGetStockByFournisseur(codeFournisseur).catch(e => { console.error("[getProductRows] pgGetStockByFournisseur ERROR:", e); return new Map<string, PgStockRow[]>(); }),
pgGetRankingByFournisseur(codeFournisseur).catch(e => { console.error("[getProductRows] pgGetRankingByFournisseur ERROR:", e); return { rankings: new Map(), totalRankedProducts: 0 }; }),
pgGetCommandesByFournisseur(codeFournisseur).catch(e => { console.error("[getProductRows] pgGetCommandesByFournisseur ERROR:", e); return new Map<string, number>(); }),
]);
const { rankings: rankingMap, totalRankedProducts } = rankingResult;
+25
View File
@@ -59,6 +59,31 @@ export interface PgRankingRow {
ranking_mag_qte?: number;
}
// ---------------------------------------------------------------------------
// 0. Liste des fournisseurs
// ---------------------------------------------------------------------------
/**
* Retourne la liste de tous les fournisseurs depuis fouadr1.
* 1 requête SQL — remplace getFournisseursFromApi().
*/
export async function pgGetFournisseurs(search?: string): Promise<{ code: string; nom: string }[]> {
const result = await db.execute(sql`
SELECT DISTINCT
fa.code,
fa.raisonsociale AS nom
FROM fouadr1 fa
WHERE fa.sit_code = '000'
AND fa.raisonsociale IS NOT NULL
AND fa.code IS NOT NULL
${search ? sql`AND (fa.raisonsociale ILIKE ${'%' + search + '%'} OR fa.code ILIKE ${'%' + search + '%'})` : sql``}
ORDER BY fa.raisonsociale
`);
return (result.rows as unknown as { code: string; nom: string }[])
.filter(r => r.code && r.nom);
}
// ---------------------------------------------------------------------------
// 1. Articles du fournisseur
// ---------------------------------------------------------------------------