From c98c71dc92cab8e187dc0009c96fc5f9cb9ab81e Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 14 Oct 2026 13:51:35 +0000 Subject: [PATCH] =?UTF-8?q?Synchro=20Qlik=20:=20message=20d'=C3=A9chec=20v?= =?UTF-8?q?isible=20et=20journal=20des=20extractions=20de=20nuit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit La page Synchronisation n'affichait qu'un badge « Échec » alors que l'erreur est enregistrée par fournisseur : elle apparaît désormais dans la colonne Remarque. Sur la Grille, l'erreur du bouton réseau reste affichée jusqu'à la tentative suivante (elle s'effaçait après 4 s et était masquée hors très grands écrans). L'extraction Qlik de nuit ouvre un journal téléchargeable dans Paramètres, comme la synchro manuelle. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01NjmvaJ5VTadoufBQ8a57no --- server/src/admin/sync_scheduler.rs | 9 ++++++++ .../admin/synchronisation/client.tsx | 22 ++++++++++++++++--- .../grid/components/sync-qlik-button.tsx | 2 +- src/features/qlik-sync/use-qlik-sync-job.ts | 16 ++++++++------ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/server/src/admin/sync_scheduler.rs b/server/src/admin/sync_scheduler.rs index 7e002f4..6560cd7 100644 --- a/server/src/admin/sync_scheduler.rs +++ b/server/src/admin/sync_scheduler.rs @@ -260,6 +260,10 @@ async fn traiter_qlik(code: &str, nom: &Option) { e.fournisseur_courant = Some(libelle(code, nom)); e.etape = Some("qlik"); } + // Journal téléchargeable depuis Paramètres, comme la synchro manuelle : la + // sortie du conteneur ne garde pas les milliers de lignes d'une extraction. + let journal = format!("sync-nuit_qlik_{}_{}", code, Local::now().format("%Y%m%d-%H%M%S")); + crate::logcapture::start_capture(&journal, Some(&format!("synchro de nuit Qlik fournisseur={}", libelle(code, nom)))); let res: anyhow::Result> = async { let articles = crate::ff::pg::pg_get_articles_by_fournisseur(code).await?; let mut vus = HashSet::new(); @@ -276,6 +280,11 @@ async fn traiter_qlik(code: &str, nom: &Option) { Ok(Some(n)) } .await; + let pied = match &res { + Ok(_) => "statut final=success".to_string(), + Err(e) => format!("statut final=error — {e:#}"), + }; + crate::logcapture::stop_capture(&journal, Some(&pied)); let ms = t0.elapsed().as_millis() as i32; let Ok(pool) = crate::db::pool() else { return }; match res { diff --git a/src/app/(dashboard)/admin/synchronisation/client.tsx b/src/app/(dashboard)/admin/synchronisation/client.tsx index 4f0dd8a..deb66b5 100644 --- a/src/app/(dashboard)/admin/synchronisation/client.tsx +++ b/src/app/(dashboard)/admin/synchronisation/client.tsx @@ -50,9 +50,11 @@ interface FournisseurRow { dernierSqlStatut: string | null; dernierSqlLignes: number | null; dernierSqlMs: number | null; + dernierSqlErreur: string | null; dernierQlikAt: string | null; dernierQlikStatut: string | null; dernierQlikCodes: number | null; + dernierQlikErreur: string | null; } interface Resume { @@ -357,9 +359,23 @@ export function SynchronisationClient() { { id: "remarque", header: "Remarque", - cell: (r) => (r.desactiveMotif - ? {r.desactiveMotif} - : null), + // Le badge « Échec » seul ne dit pas quoi corriger : on affiche le + // message enregistré par la dernière tentative. + cell: (r) => { + const erreurs = [ + r.dernierSqlStatut === "echec" && r.dernierSqlErreur ? `${VENTES} : ${r.dernierSqlErreur}` : null, + r.dernierQlikStatut === "echec" && r.dernierQlikErreur ? `${RESEAU} : ${r.dernierQlikErreur}` : null, + ].filter((e): e is string => e !== null); + if (!r.desactiveMotif && erreurs.length === 0) return null; + return ( +
+ {r.desactiveMotif &&
{r.desactiveMotif}
} + {erreurs.map((e) => ( +
{e}
+ ))} +
+ ); + }, }, ]; diff --git a/src/features/grid/components/sync-qlik-button.tsx b/src/features/grid/components/sync-qlik-button.tsx index 4ba5991..af812b7 100644 --- a/src/features/grid/components/sync-qlik-button.tsx +++ b/src/features/grid/components/sync-qlik-button.tsx @@ -36,7 +36,7 @@ export function SyncQlikButton({ codeFournisseur, lastUpdate }: SyncQlikButtonPr return (