feat(reseau): page Recherche réseau — chercher dans le catalogue Qlik

La Grille part de NOTRE catalogue : on extrait nos codes centraux puis on
demande à Qlik les métriques de ces codes. Un produit vendu par le réseau
mais absent de FF Nancy était donc invisible par construction.

Cette page inverse le sens : elle interroge Qlik d'abord, par libellé ou par
code centrale, et affiche aussi les produits que nous ne référençons pas.

- searchNetworkProductsPlaywright() : sélection par SelectValues sur
  « Article Code » (mode code) ou par SearchListObjectFor +
  AcceptListObjectSearch sur la dimension « Article » (mode plein texte,
  avec repli sur des noms de champs si la master dimension échoue).
  Cube [Article Code, Article, Mois] × 6 mesures, passe N-1 incluse pour
  obtenir 12 mois glissants contigus. Garde-fou à 300 produits/recherche.
- /api/qlik/search : job asynchrone (POST + polling GET) comme la sync,
  une seule recherche à la fois pour ménager le moteur Qlik. Met les
  résultats en cache dans qlik_network_metrics et enrichit avec le
  catalogue local (badge « Chez moi » / « Réseau uniquement », stock).
- Page /recherche-reseau : tableau triable, filtres, fiche produit avec la
  courbe 12 mois, export Excel.
- Composants de tendance extraits de heatmap-grid vers features/network
  pour être partagés (comportement inchangé).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y26nRZxTR57K7h8yqsF675
This commit is contained in:
Claude committed 2026-08-05 11:22:53 +00:00
1 parent 4b229acc9b
commit c565672259
10 files changed
+1514 -132

No files matched your search

+14
View File
@@ -93,6 +93,20 @@ export interface NetworkMetric {
qteByMonth?: Record<string, number>;
}
/**
* Produit réseau tel que renvoyé par la **recherche** Qlik (page Recherche réseau).
*
* Différence clé avec `NetworkMetric` : ces produits viennent du catalogue Qlik
* du réseau, pas de notre catalogue local. Ils peuvent donc être totalement
* inconnus de FF Nancy — d'où le libellé, qui n'est pas récupérable en base.
*/
export interface NetworkProduct extends NetworkMetric {
/** Libellé article tel qu'il apparaît dans Qlik (dimension « Article »). */
libelle: string;
fournisseur?: string;
famille?: string;
}
function makeXrfkey(): string {
return randomBytes(12).toString("base64").replace(/[^a-zA-Z0-9]/g, "").slice(0, 16).padEnd(16, "0");
}