mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-22 06:28:09 +02:00
feat: Add PostgreSQL client for FF Nancy to replace per-article HTTP calls with bulk SQL queries.
This commit is contained in:
1 parent
966b13cdf0
commit
eb8ca92847
1 file changed
+32
-10
+32
-10
@@ -513,6 +513,28 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
yesterday.setDate(yesterday.getDate() - 1);
|
yesterday.setDate(yesterday.getDate() - 1);
|
||||||
const dateHier = yesterday.toISOString().split("T")[0];
|
const dateHier = yesterday.toISOString().split("T")[0];
|
||||||
|
|
||||||
|
// Probe schéma : vérifier l'existence de cumstat dans mvtart et de statopcajour
|
||||||
|
const [schemaCheck, statopCheck] = await Promise.all([
|
||||||
|
db.execute(sql`
|
||||||
|
SELECT column_name FROM information_schema.columns
|
||||||
|
WHERE table_name = 'mvtart' AND column_name ILIKE 'cum%'
|
||||||
|
LIMIT 5
|
||||||
|
`).catch(() => ({ rows: [] })),
|
||||||
|
db.execute(sql`
|
||||||
|
SELECT column_name FROM information_schema.columns
|
||||||
|
WHERE table_name ILIKE 'statop%'
|
||||||
|
ORDER BY table_name, column_name
|
||||||
|
LIMIT 20
|
||||||
|
`).catch(() => ({ rows: [] })),
|
||||||
|
]);
|
||||||
|
|
||||||
|
const cumstatCol = (schemaCheck.rows as { column_name: string }[])[0]?.column_name ?? null;
|
||||||
|
const statopCols = (statopCheck.rows as { column_name: string }[]).map(r => r.column_name);
|
||||||
|
console.log(`[pg-ff] Dashboard schema probe → mvtart cumstat col: "${cumstatCol}", statopcajour cols: [${statopCols.join(", ")}]`);
|
||||||
|
|
||||||
|
// Filtre cumstat dynamique selon disponibilité de la colonne
|
||||||
|
const cumstatFilter = cumstatCol ? sql`AND m.${sql.raw(cumstatCol)} = 1` : sql``;
|
||||||
|
|
||||||
const [caTicketsResult, mvtSitesResult, top10CaResult, top10QteResult, top10MargeResult, evolutionResult] =
|
const [caTicketsResult, mvtSitesResult, top10CaResult, top10QteResult, top10MargeResult, evolutionResult] =
|
||||||
await Promise.all([
|
await Promise.all([
|
||||||
// CA + Tickets par site depuis statopcajour : hier vs même date N-1
|
// CA + Tickets par site depuis statopcajour : hier vs même date N-1
|
||||||
@@ -536,7 +558,7 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
console.error("[pg-ff] statopcajour query failed:", err.message);
|
console.error("[pg-ff] statopcajour query failed:", err.message);
|
||||||
return { rows: [] };
|
return { rows: [] };
|
||||||
}),
|
}),
|
||||||
// QTE + Marge + Lignes par site depuis mvtart (cumstat = 1)
|
// QTE + Marge + Lignes par site depuis mvtart
|
||||||
pgNoParallel(sql`
|
pgNoParallel(sql`
|
||||||
SELECT
|
SELECT
|
||||||
m.site,
|
m.site,
|
||||||
@@ -546,12 +568,12 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
FROM mvtart m
|
FROM mvtart m
|
||||||
WHERE m.datmvt = CURRENT_DATE - 1
|
WHERE m.datmvt = CURRENT_DATE - 1
|
||||||
AND m.genremvt = 3
|
AND m.genremvt = 3
|
||||||
AND m.cumstat = 1
|
${cumstatFilter}
|
||||||
AND m.site IN ('292', '579')
|
AND m.site IN ('292', '579')
|
||||||
GROUP BY m.site
|
GROUP BY m.site
|
||||||
ORDER BY m.site
|
ORDER BY m.site
|
||||||
`).catch((err) => { console.error("[pg-ff] mvtSites query failed:", err.message); return { rows: [] }; }),
|
`).catch((err) => { console.error("[pg-ff] mvtSites query failed:", err.message); return { rows: [] }; }),
|
||||||
// Top 10 CA réseau hier (cumstat = 1)
|
// Top 10 CA réseau hier
|
||||||
pgNoParallel(sql`
|
pgNoParallel(sql`
|
||||||
SELECT
|
SELECT
|
||||||
a.codein,
|
a.codein,
|
||||||
@@ -563,13 +585,13 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
JOIN articles a ON a.no_id = m.artnoid
|
JOIN articles a ON a.no_id = m.artnoid
|
||||||
WHERE m.datmvt = CURRENT_DATE - 1
|
WHERE m.datmvt = CURRENT_DATE - 1
|
||||||
AND m.genremvt = 3
|
AND m.genremvt = 3
|
||||||
AND m.cumstat = 1
|
${cumstatFilter}
|
||||||
AND m.site IN ('292', '579')
|
AND m.site IN ('292', '579')
|
||||||
GROUP BY a.codein, a.libelle1
|
GROUP BY a.codein, a.libelle1
|
||||||
ORDER BY ca DESC
|
ORDER BY ca DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
`).catch((err) => { console.error("[pg-ff] top10Ca query failed:", err.message); return { rows: [] }; }),
|
`).catch((err) => { console.error("[pg-ff] top10Ca query failed:", err.message); return { rows: [] }; }),
|
||||||
// Top 10 QTE réseau hier (cumstat = 1)
|
// Top 10 QTE réseau hier
|
||||||
pgNoParallel(sql`
|
pgNoParallel(sql`
|
||||||
SELECT
|
SELECT
|
||||||
a.codein,
|
a.codein,
|
||||||
@@ -581,13 +603,13 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
JOIN articles a ON a.no_id = m.artnoid
|
JOIN articles a ON a.no_id = m.artnoid
|
||||||
WHERE m.datmvt = CURRENT_DATE - 1
|
WHERE m.datmvt = CURRENT_DATE - 1
|
||||||
AND m.genremvt = 3
|
AND m.genremvt = 3
|
||||||
AND m.cumstat = 1
|
${cumstatFilter}
|
||||||
AND m.site IN ('292', '579')
|
AND m.site IN ('292', '579')
|
||||||
GROUP BY a.codein, a.libelle1
|
GROUP BY a.codein, a.libelle1
|
||||||
ORDER BY qte DESC
|
ORDER BY qte DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
`).catch((err) => { console.error("[pg-ff] top10Qte query failed:", err.message); return { rows: [] }; }),
|
`).catch((err) => { console.error("[pg-ff] top10Qte query failed:", err.message); return { rows: [] }; }),
|
||||||
// Top 10 Marge réseau hier (cumstat = 1)
|
// Top 10 Marge réseau hier
|
||||||
pgNoParallel(sql`
|
pgNoParallel(sql`
|
||||||
SELECT
|
SELECT
|
||||||
a.codein,
|
a.codein,
|
||||||
@@ -599,13 +621,13 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
JOIN articles a ON a.no_id = m.artnoid
|
JOIN articles a ON a.no_id = m.artnoid
|
||||||
WHERE m.datmvt = CURRENT_DATE - 1
|
WHERE m.datmvt = CURRENT_DATE - 1
|
||||||
AND m.genremvt = 3
|
AND m.genremvt = 3
|
||||||
AND m.cumstat = 1
|
${cumstatFilter}
|
||||||
AND m.site IN ('292', '579')
|
AND m.site IN ('292', '579')
|
||||||
GROUP BY a.codein, a.libelle1
|
GROUP BY a.codein, a.libelle1
|
||||||
ORDER BY marge DESC
|
ORDER BY marge DESC
|
||||||
LIMIT 10
|
LIMIT 10
|
||||||
`).catch((err) => { console.error("[pg-ff] top10Marge query failed:", err.message); return { rows: [] }; }),
|
`).catch((err) => { console.error("[pg-ff] top10Marge query failed:", err.message); return { rows: [] }; }),
|
||||||
// Évolution mensuelle sur 25 mois (cumstat = 1)
|
// Évolution mensuelle sur 25 mois
|
||||||
pgNoParallel(sql`
|
pgNoParallel(sql`
|
||||||
SELECT
|
SELECT
|
||||||
TO_CHAR(m.datmvt, 'YYYY-MM') AS mois,
|
TO_CHAR(m.datmvt, 'YYYY-MM') AS mois,
|
||||||
@@ -616,7 +638,7 @@ export async function pgGetDashboardData(): Promise<DashboardData> {
|
|||||||
WHERE m.datmvt >= (CURRENT_DATE - INTERVAL '25 months')
|
WHERE m.datmvt >= (CURRENT_DATE - INTERVAL '25 months')
|
||||||
AND m.datmvt < CURRENT_DATE
|
AND m.datmvt < CURRENT_DATE
|
||||||
AND m.genremvt = 3
|
AND m.genremvt = 3
|
||||||
AND m.cumstat = 1
|
${cumstatFilter}
|
||||||
AND m.site IN ('292', '579')
|
AND m.site IN ('292', '579')
|
||||||
GROUP BY TO_CHAR(m.datmvt, 'YYYY-MM')
|
GROUP BY TO_CHAR(m.datmvt, 'YYYY-MM')
|
||||||
ORDER BY mois
|
ORDER BY mois
|
||||||
|
|||||||
Reference in new issue
Block a user