From 03b6ddb8c93945d035cd0ae1b568026f63d6da20 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 26 Jul 2026 04:41:36 +0000 Subject: [PATCH] =?UTF-8?q?fix(qlik):=20mesures=20r=C3=A9solues=20par=20ti?= =?UTF-8?q?tre=20+=20relev=C3=A9=20=C3=A9tiquet=C3=A9=20(v=C3=A9rifier=20q?= =?UTF-8?q?t=C3=A9=20vs=20nb=20magasins)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CA / Quantité / Nb magasins étaient pris depuis des qId d'environnement (GUID), sans garantie qu'ils pointent la bonne mesure — les deux autres mesures étaient déjà résolues par titre pour cette raison. Toutes le sont désormais ('CA N', 'Quantité N', 'Magasin Ventes Nb N'), avec repli sur l'env. Ajout de deux logs de vérification : - les identifiants de mesure réellement utilisés ; - un échantillon de ligne mensuelle avec chaque valeur ÉTIQUETÉE, pour comparer directement avec Qlik et confirmer que la courbe utilise bien la quantité vendue et non le nombre de magasins. --- src/lib/qlik-playwright.ts | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/lib/qlik-playwright.ts b/src/lib/qlik-playwright.ts index 77da045..16a491e 100644 --- a/src/lib/qlik-playwright.ts +++ b/src/lib/qlik-playwright.ts @@ -268,6 +268,16 @@ export async function fetchNetworkMetricsPlaywright( const pickMeasure = (title: string, fallback: string) => byTitle.get(norm(title)) ?? fallback; const rCamag = pickMeasure("CA par Magasin N", mcamag); const rMarge = pickMeasure("Marge % N", mmarge); + // Résolution par TITRE aussi pour CA / Quantité / Nb magasins : évite tout + // décalage si un qId d'env ne pointe pas sur la mesure attendue. + const rCa = pickMeasure("CA N", mca); + const rQte = pickMeasure("Quantité N", mqte); + const rNbMag = pickMeasure("Magasin Ventes Nb N", mnb); + console.log("[qlik-pw] mesures utilisées: " + JSON.stringify({ + "CA N": rCa, "Quantité N": rQte, "Magasin Ventes Nb N": rNbMag, + "CA par Magasin N": rCamag, "Marge % N": rMarge, + env: { mca, mqte, mnb }, + })); console.log("measures résolues par titre: " + JSON.stringify({ rCamag, rMarge }) + " (sur " + items.length + " mesures)"); // DUMP diagnostic : inventaire des mesures + dimensions (titre + id) pour // identifier une mesure "Quantité" NON annuelle et/ou une dimension "Mois/Période" @@ -314,7 +324,7 @@ export async function fetchNetworkMetricsPlaywright( const createCubeForBatch = async (timings?: Record, onCode15Retry?: () => void): Promise<{ handle: number; id: string }> => { const { value: obj } = await timed("createCube", "CreateSessionObject", () => rpcWithRetry("createCube", "CreateSessionObject", { qProp: { qInfo: { qType: "cf-net" }, qHyperCubeDef: { qDimensions: [{ qLibraryId: dim }], - qMeasures: [{ qLibraryId: mca }, { qLibraryId: mqte }, { qLibraryId: mnb }, { qLibraryId: rCamag }, { qLibraryId: rMarge }], + qMeasures: [{ qLibraryId: rCa }, { qLibraryId: rQte }, { qLibraryId: rNbMag }, { qLibraryId: rCamag }, { qLibraryId: rMarge }], qInitialDataFetch: [{ qTop: 0, qLeft: 0, qWidth: 6, qHeight: PAGE }], } } }, doc, onCode15Retry), timings); const qReturn = obj.qReturn as { qHandle: number; qGenericId?: string; qId?: string }; @@ -380,7 +390,7 @@ export async function fetchNetworkMetricsPlaywright( ): Promise => { const { value: obj } = await timed("createCube", "CreateSessionObject", () => rpcWithRetry("createCube", "CreateSessionObject", { qProp: { qInfo: { qType: "cf-net-mois" }, qHyperCubeDef: { qDimensions: [{ qLibraryId: dim }, { qLibraryId: moisDimId }], - qMeasures: [{ qLibraryId: mca }, { qLibraryId: mqte }, { qLibraryId: mnb }, { qLibraryId: rCamag }, { qLibraryId: rMarge }, { qLibraryId: mqteComp }], + qMeasures: [{ qLibraryId: rCa }, { qLibraryId: rQte }, { qLibraryId: rNbMag }, { qLibraryId: rCamag }, { qLibraryId: rMarge }, { qLibraryId: mqteComp }], qInitialDataFetch: [{ qTop: 0, qLeft: 0, qWidth: 8, qHeight: PAGEM }], } } }, doc, onCode15Retry), timings); const qReturn = obj.qReturn as { qHandle: number; qGenericId?: string; qId?: string }; @@ -422,6 +432,7 @@ export async function fetchNetworkMetricsPlaywright( // selectYear = 2025 → passe complémentaire : on sélectionne l'année pour // récupérer directement ses mois (seul moyen d'obtenir août→déc N-1, que // COMP ne peut pas fournir puisque l'année N ne va pas jusque-là). + let loggedSampleRow = false; const monthDimPath = async (selectYear: number | null): Promise => { const isMainPass = selectYear === null; if (yfh !== -1) { @@ -466,6 +477,13 @@ export async function fetchNetworkMetricsPlaywright( if (isMainPass) out.push([code, ca, qte, nbMag, caMag, marge]); const mm = normMois(mois); const y = parseInt(mm.slice(0, 4), 10); + if (!loggedSampleRow) { + loggedSampleRow = true; + console.log("[qlik-pw][mesures] échantillon ligne mensuelle: " + JSON.stringify({ + code, mois: mm, "CA N": ca, "Quantité N (utilisée pour la courbe)": qte, + "Magasin Ventes Nb N": nbMag, "CA par Magasin N": caMag, "Marge % N": marge, "Quantité COMP": qteComp, + })); + } (monthlyByCode[code] ??= {}); if (isMainPass && y === yearN) { // Mois de l'année N + son comparable N-1 (COMP = même mois, N-1).