mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-15 03:08:31 +02:00
fix Qlik rolling 12-month integrity
This commit is contained in:
1 parent
db886cd8d9
commit
4ef0e9fdeb
8 files changed
+221
-100
No files matched your search
@@ -62,10 +62,10 @@ export const TREND_COLOR: Record<NetworkTrend["direction"], string> = {
|
||||
* - un mois de la fenêtre **absent** du cache vaut 0 : côté Qlik, un produit
|
||||
* non vendu sur un mois ne produit tout simplement pas de ligne.
|
||||
*
|
||||
* Seule exception au remplissage par zéro : les mois **antérieurs au premier
|
||||
* mois réellement extrait**. Ils traduisent une extraction plus courte que 12
|
||||
* mois (`QLIK_SYNC_MONTHS_BACK`), pas une absence de ventes — les inventer à 0
|
||||
* simulerait une croissance qui n'existe pas.
|
||||
* Une série n'est affichée que si les **12 clés sont explicitement présentes**.
|
||||
* L'extracteur Qlik écrit lui-même les mois sans faits à 0 après avoir validé
|
||||
* la fenêtre et l'égalité avec le total Qlik. Une ancienne extraction partielle
|
||||
* ne peut donc plus être présentée comme une tendance réelle.
|
||||
*
|
||||
* Utilise tous les points (robuste au bruit d'un mois isolé). L'indicateur `pct` est la
|
||||
* variation modélisée sur la période (pente × durée) rapportée à la moyenne.
|
||||
@@ -77,17 +77,14 @@ export function computeNetworkTrend(
|
||||
): NetworkTrend {
|
||||
const empty: NetworkTrend = { values: [], labels: [], direction: "flat", pct: null, hasData: false };
|
||||
if (!qteByMonth) return empty;
|
||||
const presents = Object.keys(qteByMonth).sort(); // "YYYY-MM" trie chronologiquement
|
||||
if (presents.length === 0) return empty;
|
||||
const labels = buildRolling12QlikMonths(now);
|
||||
const complet = labels.every((label) =>
|
||||
Object.prototype.hasOwnProperty.call(qteByMonth, label) &&
|
||||
Number.isFinite(Number(qteByMonth[label])),
|
||||
);
|
||||
if (!complet) return empty;
|
||||
|
||||
const fenetre = buildRolling12QlikMonths(now);
|
||||
// Aucun mois extrait ne tombe dans la fenêtre glissante (cache périmé) :
|
||||
// rien de fiable à tracer.
|
||||
const premierMoisExtrait = presents[0];
|
||||
const labels = fenetre.filter((m) => m >= premierMoisExtrait);
|
||||
if (labels.length === 0 || !labels.some((m) => qteByMonth[m] != null)) return empty;
|
||||
|
||||
const values = labels.map((l) => Number(qteByMonth[l]) || 0);
|
||||
const values = labels.map((l) => Number(qteByMonth[l]));
|
||||
const n = values.length;
|
||||
let pct: number | null = null;
|
||||
let direction: NetworkTrend["direction"] = "flat";
|
||||
|
||||
Reference in new issue
Block a user