Aller au contenu

Workflow détaillé - PT2QE

Vue d'ensemble du workflow

PT2QE (Pricing Tier 2 Quote Engine) calcule des recommandations de prix personnalisées à la maille client × article en utilisant les corridors PT1CE comme référence. Le workflow est organisé en 3 étapes principales :

  1. Calcul des recommandations : Extraction des offres actuelles, enrichissement avec l'historique transactionnel, calcul de 2 types de recommandations (RECO1 et RECO2), application d'un arbre de décision à 3 chemins avec cascade de cappings
  2. Ajustement des cappings (optionnel) : Modification des paramètres de capping et recalcul des recommandations
  3. Génération des offres finales : Export final au format CSV pour utilisation opérationnelle

Caractéristiques clés du workflow : - Itératif : Possibilité d'ajuster les cappings et de recalculer - Traçable : Chaque exécution crée un dossier horodaté avec tous les résultats - Modulaire : Les étapes peuvent être relancées indépendamment - Conservateur : Les tables Oracle sont réutilisées entre les étapes

Périmètre de traitement : - Univers : ZOOM1 exclusivement - Scope temporel : 4 derniers trimestres fiscaux complets - Types de conditions : ZFAP, ZFSP, ZIAP, ZISP - Séquences : A305, A565


Prérequis obligatoires

Prérequis système

Base de données Oracle : - Connexion active à la base TARIFAIRE (ou autre base configurée) - Privilèges SELECT sur les tables SYS_ et PT0CE_ - Privilèges CREATE TABLE, DROP TABLE, INSERT, UPDATE, DELETE

Environnement Python : - Python 3.8 ou supérieur - Variable d'environnement PYTHONPATH incluant P:\PRD\Python\00_Commun\libs - Modules requis installés (voir requirements.txt)

Modules Python requis :

oracledb>=1.4.0
pandas>=2.0.0
numpy>=1.24.0
python-dateutil>=2.8.2
openpyxl>=3.1.0

Prérequis métier

Exécution préalable de PT1CE (OBLIGATOIRE) :

PT2QE utilise les corridors optimaux calculés par PT1CE. Avant de lancer PT2QE, il est impératif que PT1CE ait été exécuté complètement :

  1. PT1CE Option 1 : Application des nouveaux PAS/PRB
  2. PT1CE Option 2 : Finalisation des corridors (création des tables PT1CE_OPTIMAL_*)

Tables PT1CE requises : - PT1CE_OPTIMAL_ZOOM1 : Corridors optimaux pour ZOOM1 (utilisée par PT2QE) - PT1CE_OPTIMAL_ZOOM2 : Corridors optimaux pour ZOOM2 (non utilisée par PT2QE actuellement) - PT1CE_OPTIMAL_ZOOM3 : Corridors optimaux pour ZOOM3 (non utilisée par PT2QE actuellement)

Sans ces tables, PT2QE ne peut pas fonctionner.

Tables de mapping PT0CE requises : - PT0CE_TYPE_CLIENT_MAPPING : Mapping ID_TC_CG × ID_TC_CIBLE × FG_HM → TYPE_CLIENT - PT0CE_TYPE_RESTAURANT_MAPPING : Mapping LC_SFC_CIBLE → TYPE_RESTAURANT

Fichiers d'entrée

Fichier de capping obligatoire (Étape 1) :

Fichier : inputs/capping_type_client.csv

Format :

TYPE_CLIENT;CAPPING_HIGH;CAPPING_MEDIUM;CAPPING_LOW
RCI PI GI;0,025;0,05;0,075
RSI HM;0,025;0,05;0,075
RSC HM;0,025;0,05;0,075
RSC HM - SRCNAT;0,025;0,05;0,075
RSI HM - SRCREG;0,025;0,05;0,075
RCI autres;0,025;0,05;0,075
NATIONAL;0,025;0,05;0,075

Colonnes : - TYPE_CLIENT : Identifiant du type de client (doit correspondre aux valeurs dans PT0CE_TYPE_CLIENT_MAPPING) - CAPPING_HIGH : Capping pour produits à sensibilité HIGH (décimal avec virgule, ex: 0,025 = 2,5%) - CAPPING_MEDIUM : Capping pour produits à sensibilité MEDIUM (décimal avec virgule, ex: 0,05 = 5%) - CAPPING_LOW : Capping pour produits à sensibilité LOW (décimal avec virgule, ex: 0,075 = 7,5%)

Fichier de corrections de capping (Étape 2, optionnel) :

Fichier : corrections/capping_cubes_corrections.csv

Ce fichier est créé en copiant et modifiant le fichier capping_cubes_generated.csv généré à l'étape 1.

Format :

UNIVERS;TYPE_CLIENT;TYPE_RESTAURANT;GEO;CAPPING_HIGH;CAPPING_MEDIUM;CAPPING_LOW
ZOOM1;RCI PI GI;REST. TRADI;IDF;0,03;0,12;0,18
ZOOM1;RSI HM;SOCIAL;NO;0,02;0,08;0,12

Colonnes : - UNIVERS : Toujours "ZOOM1" pour PT2QE - TYPE_CLIENT : Type de client - TYPE_RESTAURANT : Type de restaurant - GEO : Zone géographique (peut être NULL) - CAPPING_HIGH, CAPPING_MEDIUM, CAPPING_LOW : Nouveaux cappings à appliquer

Fichier de configuration (optionnel)

Fichier : config/pt2qe_config.json

Ce fichier permet de personnaliser les règles de repositionnement RECO1, les cappings par défaut, et les paramètres de sortie.

Sections principales : - processing : Taille des batchs, degré de parallélisation - capping : Cappings par défaut, capping basiques (50%) - recommendations.reco1_rules : Règles de repositionnement par paliers pour RECO1 - output : Format des exports CSV

Modification des règles RECO1 :

Pour changer le comportement de RECO1 (repositionnement par paliers), éditer la section recommendations.reco1_rules dans pt2qe_config.json.

Exemple de règle :

{
    "position": "PL2_PL3",
    "condition": "PRIX_TARIF_ACTUEL > NEW_BORNE_PL3_PL4",
    "action": "TO_PL1",
    "target": "NEW_BORNE_PL1_PL2",
    "comment": "Remonter vers PL1"
}

Champs : - position : Nom de la position actuelle - condition : Condition SQL pour détecter cette position - action : Nom de l'action (description) - target : Colonne SQL cible (nouveau prix) - comment : Description de la règle

Règles par défaut : - ABOVE_PL1 → Pas de changement - PL1_PL2 → Remonter vers PL1 - PL2_PL3 → Remonter vers PL1 - PL3_PL4 → Remonter vers PL2 - PL4_PL5 → Remonter vers PL3 - PL5_PL6 → Remonter vers PL5 - PL6_PLX → Remonter vers PL6 - BELOW_PAS → Remonter au PAS


Phase 0 : Préparation et vérification

Lancement du menu principal

Étape 1 : Démarrer l'application

Exécuter le fichier START.bat à la racine du projet :

START.bat

Ce fichier : 1. Configure l'environnement Python (variable PYTHONPATH) 2. Affiche le logo PT2QE 3. Lance le menu principal PT2QE_Menu.bat

Étape 2 : Menu principal

Le menu principal propose 6 options :

========================================================================
          PRICING TIER 2 QUOTE ENGINE - MENU PRINCIPAL
========================================================================

  Niveau de log      : Normal
  Date/Heure         : 03/11/2025 14:30

========================================================================

Que souhaitez-vous faire ?

[1] CALCULER LES RECOMMANDATIONS
[2] AJUSTER LES CAPPINGS (optionnel)
[3] GENERER LES OFFRES FINALES
[4] AFFICHER L'AIDE DETAILLEE
[5] VERIFIER LES PREREQUIS
[6] CHANGER LE NIVEAU DE LOG
[Q] QUITTER

Vérification des prérequis (Option 5)

Avant de lancer le traitement, il est recommandé de vérifier les prérequis.

Étape 1 : Sélectionner l'option 5

Votre choix (1-6 ou Q): 5

Étape 2 : Analyse des résultats

Le script vérifie :

[1/10] Vérification Python - Vérifie que Python est installé et accessible - Affiche la version de Python

[2/10] Vérification des modules Python requis - pandas : Manipulation de données - oracledb : Connexion Oracle - openpyxl : Export Excel

[3/10] Vérification du fichier de capping principal - Vérifie l'existence de inputs/capping_type_client.csv - Affiche le nombre de lignes

[4/10] Vérification du dossier corrections - Vérifie l'existence du dossier corrections/ - Vérifie la présence de capping_cubes_corrections.csv (optionnel)

[5/10] Vérification de la connexion Oracle - Teste la connexion à la base TARIFAIRE - Exécute une requête simple (SELECT 1 FROM DUAL)

[6/10] Vérification des tables PT1CE (PREREQUIS OBLIGATOIRE) - Compte les tables PT1CE_OPTIMAL_ - CRITIQUE : Si aucune table trouvée, PT2QE ne peut pas fonctionner - Solution si tables manquantes* : 1. Lancer PT1CE (START.bat dans le dossier PT1CE) 2. Exécuter PT1CE Option 1 (Application nouveaux PAS/PRB) 3. Exécuter PT1CE Option 2 (Finalisation corridors) 4. Revenir à PT2QE et relancer la vérification

[7/10] Vérification des tables PT2QE - Compte les tables PT2QE_* (résultats d'exécutions précédentes) - Information uniquement, pas bloquant

[8/10] Vérification des tables de mapping - Vérifie PT0CE_TYPE_CLIENT_MAPPING (nombre de lignes) - Vérifie PT0CE_TYPE_RESTAURANT_MAPPING (nombre de lignes) - Si vide ou manquant, le matching sera incomplet

[9/10] Historique des exécutions - Compte les dossiers outputs/run_* (exécutions normales) - Compte les dossiers outputs/corrections_* (ajustements de capping) - Compte les dossiers outputs/final_* (exports finaux)

[10/10] Vérification de la configuration - Vérifie la présence de config/pt2qe_config.json - Si absent, les valeurs par défaut seront utilisées

Résumé final :

RESUME:
  - [1-2] Python et modules : Verifies
  - [3] Fichier capping : A verifier ci-dessus
  - [6] Tables PT1CE : CRITIQUE - Doit etre OK
  - [7] Tables PT2QE : Info sur l'existant
  - [8] Tables mapping : Necessaires pour enrichissement
  - [5] Connexion Oracle : Doit etre OK

Étape 3 : Corriger les problèmes éventuels

Si des erreurs sont signalées : - Tables PT1CE manquantes : Exécuter PT1CE complètement - Fichier capping manquant : Créer inputs/capping_type_client.csv - Connexion Oracle échouée : Vérifier les credentials et le réseau - Tables de mapping vides : Vérifier avec l'équipe data PT0CE


Phase 1 : Extraction et enrichissement des offres

Lancement du calcul des recommandations (Option 1)

Étape 1 : Sélectionner l'option 1

Votre choix (1-6 ou Q): 1

Étape 2 : Confirmer le lancement

L'écran affiche :

========================================================================
  ETAPE 1: CALCUL DES RECOMMANDATIONS
========================================================================

Configuration:
  - Base de donnees  : TARIFAIRE
  - Fichier capping  : inputs\capping_type_client.csv
  - Niveau de log    : Normal

PHASES QUI SERONT EXECUTEES:
  [1] Extraction des offres actuelles (ZOOM1 uniquement)
  [2] Enrichissement avec historique 4 derniers trimestres
  [3] Jointure avec corridors PT1CE_OPTIMAL_*
  [4] Calcul RECO1 (repositionnement paliers)
  [5] Calcul RECO2 (hausse proportionnelle PAS)
  [6] Application cascade cappings (sensibilite + basiques)
  [7] Arbre de decision (3 chemins)
  [8] Generation analyses et rapports

NOTE: Necessite que PT1CE ait ete execute au prealable
      pour que les tables PT1CE_OPTIMAL_* existent.

Lancer le traitement ? (O/N):

Taper O puis Entrée.

Détermination automatique de la période d'analyse

Processus automatique :

Le module PeriodManager interroge la table SYS_MD_CALENDRIER_SYSCO pour déterminer automatiquement les 4 derniers trimestres fiscaux complets.

Critères de sélection : - Date de référence : Date du jour (date d'exécution) - Trimestre complet : Un trimestre est considéré complet si sa dernière semaine est passée (END_DATE < date du jour) - Nombre de trimestres : 4 trimestres consécutifs

Affichage dans les logs :

Initialisation du gestionnaire de périodes...
Période d'analyse: 2024-02-05 → 2024-11-02
Trimestres fiscaux: 2024_Q01, 2024_Q02, 2024_Q03, 2024_Q04

Détail du calendrier fiscal Sysco : - Format 4-4-5 (4 semaines, 4 semaines, 5 semaines par trimestre) - Trimestres identifiés par ID_EXF (exercice fiscal) et NO_TRF (numéro de trimestre) - Chaque trimestre contient 13 semaines

Exemple concret :

Si l'exécution a lieu le 03/11/2025 : - Trimestre en cours : 2025_Q04 (non complet) - 4 derniers trimestres complets : 2024_Q04, 2025_Q01, 2025_Q02, 2025_Q03 - Période d'extraction : Du 1er jour de 2024_Q04 au dernier jour de 2025_Q03

Modification de la période (avancé) :

Pour utiliser une période différente, il faut modifier le code source dans pt2qe_main.py :

reference_date = date.today()  # Remplacer par une date fixe si nécessaire

Extraction des offres de prix actuelles

Phase 1.1 : Extraction depuis SYS_TARIF_SIMULATION

Table source : SYS_TARIF_SIMULATION

Filtres appliqués :

Conditions (table SYS_MD_CONDITION) : - ID_ACC IS NULL : Pas d'accord spécifique - FG_CND_VLD = 'X' : Condition valide - DT_FIN > SYSDATE : Condition encore en cours - ID_TYP_CND IN ('ZFAP', 'ZFSP', 'ZIAP', 'ZISP') : Types de conditions tarifaires - ID_SEQ IN ('A305', 'A565') : Séquences spécifiques

Clients (table SYS_MD_CLIENT) : - ID_TC_CG <> 'AUTRES' : Exclut type client "AUTRES" - ID_STA_CLN IN ('10', '20', '30', '50') ET LC_SEQ_CLN = 'CLIENT' : Clients actifs - OU ID_AGC <> 'A000' ET LC_SEQ_CLN IN ('HIERARCHIE CLIENT N4', 'N5', 'N6') : Hiérarchies

Articles (table SYS_MD_ARTICLE) : - ID_GMM <> 'PSN' : Exclut gamme PSN - LC_HI1 <> 'Qualificatif article inconnu' : Articles qualifiés - LC_HIC_SYSCO_N2 NOT IN ('Divers', 'Freezer') : Exclut catégories non pertinentes

Colonnes extraites : - Identifiants : ID_CLN, LC_CLN, ID_ART, LC_ART, ID_CND - Dates condition : DT_DEB_CONDITION, DT_FIN_CONDITION - Dimensions client : ID_TC_CG, ID_TC_CIBLE, LC_SFC_CIBLE, GEO (LC_ZDV_GRV), ID_KAM - Hiérarchie article : LC_HIC_SYSCO_N1 à N6, LC_MRQ, LC_ATTRIBUT - Prix : PX_OFF_ACTUEL (prix tarif actuel) - Métadonnées : ID_TYP_CND, LC_SEQ_CLN

Table créée : PT2QE_PRICE_OFFERS (temporaire)

Enrichissement avec l'historique transactionnel 4Q

Phase 1.2 : Récupération du FG_HM historique

Table source : SYS_FACTURE_LIGNE

Objectif : Déterminer pour chaque couple (client, article) s'il est "hors mercuriale" (FG_HM = '1') ou "mercuriale" (FG_HM = '0').

Logique : - Pour chaque (ID_CLN, ID_ART), chercher la dernière facture dans la période 4Q - Extraire le FG_HM de cette facture - Si FG_HM = 'X' dans la facture, stocker '1', sinon '0'

Filtres appliqués sur SYS_FACTURE_LIGNE : - DT_CDE BETWEEN start_date AND end_date : Période 4Q - ID_TC_CG <> 'AUTRES' - ID_GMM <> 'PSN' - LC_HIC_SYSCO_N2 NOT IN ('Divers', 'Freezer') - FG_PRESTA = '0' : Pas de prestation - FG_MARCHANDISE IN ('X', '1') : Marchandise uniquement - MT_GM4 IS NOT NULL - MT_CAB > 0 - QT_UF > 0 - ID_PRP NOT IN (Prix promo) : Exclut les prix promotionnels

Logique ROW_NUMBER :

ROW_NUMBER() OVER (PARTITION BY ID_CLN, ID_ART ORDER BY DT_CDE DESC, ID_FAC DESC) as RN
Conserve uniquement la ligne avec RN = 1 (dernière facture).

Colonnes générées : - LAST_FG_HM : '1' ou '0' - ID_MERC_HM : Identifiant mercuriale

Phase 1.3 : Calcul des métriques de performance 4Q

Métriques calculées :

Total global (hors prix promo) : - MT_CAB_4Q : Chiffre d'affaires total sur 4Q - QT_UF_4Q : Volume en unités facturées - QT_KG_4Q : Volume en kilogrammes

Prix fermes uniquement (LC_PRP_N1 = 'Prix fermes') : - MT_CAB_4Q_FERMES - QT_UF_4Q_FERMES - QT_KG_4Q_FERMES

Prix indexés uniquement (LC_PRP_N1 = 'Prix indexés') : - MT_CAB_4Q_INDEXES - QT_UF_4Q_INDEXES - QT_KG_4Q_INDEXES

Filtres appliqués : - Mêmes filtres que pour FG_HM - Agrégation par (ID_CLN, ID_ART) - Période : 4 derniers trimestres fiscaux complets

Dernière QT_UF connue : - LAST_QT_UF : Dernière quantité facturée (pour calcul prix unitaire)

Phase 1.4 : Calcul de l'UNIVERS selon BusinessRules

Logique de détermination de l'UNIVERS :

Le calcul de l'UNIVERS combine : - ID_TC_CG (type client CG) - ID_TC_CIBLE (type client cible) - FG_HM (hors mercuriale : '1' ou '0') - ID_KAM (présence ou non d'un KAM) - ID_MERC_HM (identifiant mercuriale)

Règles de calcul :

ZOOM1 : - RCI PI avec ou sans KAM - RCI GI SANS KAM - FG_HM = '1' (hors mercuriale) HORS RSC - RSC avec ID_MERC_HM = 'HM'

ZOOM2 : - RCI GI AVEC KAM - FG_HM = '0' (mercuriale) pour certains types - RCI GC_REG avec FG_HM = '1'

ZOOM3 : - RSC avec ID_MERC_HM <> 'HM' - RCC

Filtre PT2QE :

WHERE UNIVERS = 'ZOOM1'

PT2QE traite exclusivement l'UNIVERS ZOOM1.

Enrichissement avec les dimensions

Phase 1.5 : Jointure avec les tables de mapping

Mapping TYPE_CLIENT :

Table source : PT0CE_TYPE_CLIENT_MAPPING

Colonnes de jointure : - UNIVERS = UNIVERS calculé - ID_TC_CG = ID_TC_CG de l'offre - ID_TC_CIBLE = ID_TC_CIBLE de l'offre - FG_HM = FG_HM de l'offre

Colonne récupérée : - TYPE_CLIENT : Ex: "RCI PI GI", "RSI HM", "RSC HM", etc.

Valeur par défaut si pas de match : - 'Hors référentiel'

Mapping TYPE_RESTAURANT :

Table source : PT0CE_TYPE_RESTAURANT_MAPPING

Colonne de jointure : - LC_SFC_CIBLE = LC_SFC_CIBLE de l'offre

Colonne récupérée : - TYPE_RESTAURANT : Ex: "REST. TRADI", "SOCIAL", "RESTAURATION RAPIDE", etc.

Valeur par défaut si pas de match : - 'Hors référentiel'

GEO (déjà présent) : - Récupéré depuis LC_ZDV_GRV dans SYS_MD_CLIENT - Ex: "IDF", "NO", "SO", etc.

Table finale créée : PT2QE_PRICE_OFFERS

Colonnes finales : - Identifiants : ID_CLN, LC_CLN, ID_ART, LC_ART, ID_CND - Dates : DT_DEB_CONDITION, DT_FIN_CONDITION - Dimensions : TYPE_CLIENT, TYPE_RESTAURANT, GEO, UNIVERS - Hiérarchie article : HIE_N1 à HIE_N6, HIE_MRQ, LC_ATTRIBUT - Prix : PRIX_TARIF_ACTUEL - Historique 4Q : MT_CAB_4Q, QT_UF_4Q, QT_KG_4Q, MT_CAB_4Q_FERMES, etc. - Métadonnées : FG_HM, ID_MERC_HM, EXTRACTION_DATE

Logs affichés :

  Extraction des offres avec historique de performance
    ✓ XXX,XXX offres de prix extraites (ZOOM1 uniquement)
    Statistiques d'enrichissement:
      - Total offres: XXX,XXX
      - Clients uniques: X,XXX
      - Articles uniques: XX,XXX
      - Avec TYPE_CLIENT: XXX,XXX (XX.X%)
      - Avec TYPE_RESTAURANT: XXX,XXX (XX.X%)
      - Avec FG_HM: XXX,XXX (XX.X%)


Phase 2 : Calcul des recommandations

Matching avec les corridors PT1CE

Phase 2.1 : Stratégie de matching en cascade

Objectif : Associer chaque offre client × article avec un corridor PT1CE.

Stratégie : 1. Tentative MASTER : Match sur 4 dimensions (ID_ART, TYPE_CLIENT, TYPE_RESTAURANT, GEO) 2. Fallback NATIONAL : Si pas de match MASTER, utiliser le corridor NATIONAL (ID_ART uniquement)

Phase 2.1.1 : Tentative MASTER

Table source : PT1CE_OPTIMAL_ZOOM1

Colonnes de jointure : - ID_ART = ID_ART de l'offre - TYPE_CLIENT = TYPE_CLIENT de l'offre - TYPE_RESTAURANT = TYPE_RESTAURANT de l'offre - GEO = GEO de l'offre (avec NVL pour gérer les NULL) - CUBE_TYPE = 'MASTER' - STATUS = 'OPTIMAL'

Colonnes récupérées depuis PT1CE :

Prix et bornes actuels (PT0CE) : - PAS_ACTIF : Prix d'achat standard actuel - PRB_RC_ACTIF : Prix de référence brut RCI actuel - PRB_COLL_ACTIF : Prix de référence brut COLL actuel - PRB_TO_USE : Indicateur PRB à utiliser (1 = RC, sinon COLL) - PRB_ACTIF : PRB actuel calculé selon PRB_TO_USE - BORNE_PL1_PL2 à BORNE_PL6_PLX : Bornes des paliers actuels

Nouveaux prix et bornes (PT1CE) : - NEW_PAS : Nouveau prix d'achat standard - NEW_PRB_RC : Nouveau PRB RCI - NEW_PRB_COLL : Nouveau PRB COLL - NEW_PRB : Nouveau PRB calculé selon PRB_TO_USE - NEW_BORNE_PL1_PL2 à NEW_BORNE_PL6_PLX : Nouvelles bornes des paliers

Métadonnées : - PRICE_SENSITIVITY : Sensibilité prix (HIGH, MEDIUM, LOW) - ECART_TYPE : Écart-type des prix - CUBE_TYPE : 'MASTER' - STATUS : 'OPTIMAL'

Colonnes ajoutées : - PCT_HAUSSE_PAS : (NEW_PAS - PAS_ACTIF) / PAS_ACTIF (pourcentage de hausse du PAS) - HAS_CORRIDOR : 1 - MATCH_TYPE : 'MASTER' - SOURCE_ZOOM : 'ZOOM1'

Phase 2.1.2 : Fallback NATIONAL

Pour les offres non matchées en MASTER :

Colonnes de jointure : - ID_ART = ID_ART de l'offre - TYPE_CLIENT = 'NATIONAL' - TYPE_RESTAURANT = 'NATIONAL' - GEO = 'NATIONAL' ou NULL - CUBE_TYPE = 'NATIONAL' - STATUS = 'OPTIMAL'

Colonnes récupérées : Identiques à MASTER

Colonnes ajoutées : - MATCH_TYPE : 'NATIONAL'

Phase 2.1.3 : Offres sans corridor

Pour les offres qui n'ont matché ni en MASTER ni en NATIONAL :

Colonnes ajoutées : - Toutes les colonnes corridor sont NULL - HAS_CORRIDOR : 0 - MATCH_TYPE : 'NO_MATCH'

Ces offres seront exclues du calcul des recommandations.

Table créée : PT2QE_PRICE_OFFERS_ENRICHED

Logs affichés :

    Jointure offres × corridors
      → Résultats du matching :
        - MASTER : XXX,XXX offres, X,XXX clients, XX,XXX articles
        - NATIONAL : XX,XXX offres, XXX clients, X,XXX articles
        - NO_MATCH : X,XXX offres, XXX clients, XXX articles
      → Total : XXX,XXX/XXX,XXX offres avec corridor (XX.X%)

Calcul des 2 recommandations

Phase 2.2 : Calcul RECO1 (repositionnement par paliers)

Logique RECO1 :

RECO1 consiste à repositionner le prix actuel vers un palier supérieur du corridor en fonction de sa position actuelle.

Règles de repositionnement (configurables dans pt2qe_config.json) :

Position actuelle Action Cible
ABOVE_PL1 (prix > PL1_PL2) Pas de changement Prix actuel
PL1_PL2 Remonter vers PL1 NEW_BORNE_PL1_PL2
PL2_PL3 Remonter vers PL1 NEW_BORNE_PL1_PL2
PL3_PL4 Remonter vers PL2 NEW_BORNE_PL2_PL3
PL4_PL5 Remonter vers PL3 NEW_BORNE_PL3_PL4
PL5_PL6 Remonter vers PL5 NEW_BORNE_PL5_PL6
PL6_PLX Remonter vers PL6 NEW_BORNE_PL6_PLX
BELOW_PAS (prix < PAS) Remonter au PAS NEW_PAS

Calcul de RECO1_BASE :

Le code SQL généré dynamiquement depuis pt2qe_config.json produit une cascade de CASE WHEN :

CASE
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL1_PL2 THEN PRIX_TARIF_ACTUEL  -- Prix déjà en PL1
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL2_PL3 THEN NEW_BORNE_PL1_PL2  -- Remonter vers PL1
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL3_PL4 THEN NEW_BORNE_PL1_PL2  -- Remonter vers PL1
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL4_PL5 THEN NEW_BORNE_PL2_PL3  -- Remonter vers PL2
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL5_PL6 THEN NEW_BORNE_PL3_PL4  -- Remonter vers PL3
    WHEN PRIX_TARIF_ACTUEL > NEW_BORNE_PL6_PLX THEN NEW_BORNE_PL5_PL6  -- Remonter vers PL5
    WHEN PRIX_TARIF_ACTUEL >= NEW_PAS THEN NEW_BORNE_PL6_PLX           -- Remonter vers PL6
    ELSE NEW_PAS                                                        -- Remonter au PAS
END as RECO1_BASE

Colonne générée : RECO1_BASE

Phase 2.3 : Calcul RECO2 (hausse proportionnelle au PAS)

Logique RECO2 :

RECO2 applique au prix actuel le même pourcentage de hausse que le PAS.

Formule :

RECO2 = PRIX_TARIF_ACTUEL × (1 + PCT_HAUSSE_PAS)

Où PCT_HAUSSE_PAS = (NEW_PAS - PAS_ACTIF) / PAS_ACTIF

Exemple : - PAS actuel : 10€ - Nouveau PAS : 11€ - PCT_HAUSSE_PAS : +10% - Prix actuel : 15€ - RECO2 : 15€ × 1,10 = 16,50€

Colonne générée : RECO2

Application de la cascade de cappings

Phase 2.4 : Cascade de cappings sur RECO1

RECO1 subit une cascade de cappings en 2 étapes : 1. Capping sensibilité prix (HIGH/MEDIUM/LOW) 2. Capping basiques (50% maximum)

Phase 2.4.1 : Capping sensibilité prix

Logique :

Selon la sensibilité prix du produit (HIGH, MEDIUM, LOW), on applique un capping différent sur RECO1_BASE.

Cappings par sensibilité (configurables dans inputs/capping_type_client.csv) : - HIGH : Capping faible (ex: 2,5%) - MEDIUM : Capping moyen (ex: 5%) - LOW : Capping élevé (ex: 7,5%)

Formule :

Prix max avec capping = PRIX_TARIF_ACTUEL × (1 + taux_capping)

RECO1_APRES_CAPPING_SENSIBILITE = MIN(RECO1_BASE, Prix max avec capping)

Exemple : - Prix actuel : 15€ - RECO1_BASE : 18€ - Sensibilité : MEDIUM - Capping MEDIUM : 5% - Prix max : 15€ × 1,05 = 15,75€ - RECO1_APRES_CAPPING_SENSIBILITE : MIN(18€, 15,75€) = 15,75€

Code SQL :

CASE
    WHEN PRICE_SENSITIVITY = 'HIGH' AND CAPPING_HIGH IS NOT NULL THEN
        LEAST(RECO1_BASE, PRIX_TARIF_ACTUEL * (1 + CAPPING_HIGH))
    WHEN PRICE_SENSITIVITY = 'MEDIUM' AND CAPPING_MEDIUM IS NOT NULL THEN
        LEAST(RECO1_BASE, PRIX_TARIF_ACTUEL * (1 + CAPPING_MEDIUM))
    WHEN PRICE_SENSITIVITY = 'LOW' AND CAPPING_LOW IS NOT NULL THEN
        LEAST(RECO1_BASE, PRIX_TARIF_ACTUEL * (1 + CAPPING_LOW))
    ELSE RECO1_BASE
END as RECO1_APRES_CAPPING_SENSIBILITE

Colonne générée : RECO1_APRES_CAPPING_SENSIBILITE

Phase 2.4.2 : Capping basiques (50%)

Logique :

Pour les produits identifiés comme "Basiques" (LC_ATTRIBUT = 'Basiques'), on applique un capping additionnel de 50% maximum de hausse.

Ce capping vient après le capping sensibilité et peut l'écraser s'il est plus restrictif.

Formule :

Prix max basiques = PRIX_TARIF_ACTUEL × 1,50

RECO1_AVEC_CAPPING = MIN(RECO1_APRES_CAPPING_SENSIBILITE, Prix max basiques)

Exemple : - Prix actuel : 10€ - RECO1_APRES_CAPPING_SENSIBILITE : 12€ (hausse de 20%) - LC_ATTRIBUT : 'Basiques' - Prix max basiques : 10€ × 1,50 = 15€ - RECO1_AVEC_CAPPING : MIN(12€, 15€) = 12€ (le capping basiques n'a pas d'effet)

Exemple 2 : - Prix actuel : 10€ - RECO1_APRES_CAPPING_SENSIBILITE : 18€ (hausse de 80%) - LC_ATTRIBUT : 'Basiques' - Prix max basiques : 10€ × 1,50 = 15€ - RECO1_AVEC_CAPPING : MIN(18€, 15€) = 15€ (capping basiques actif)

Code SQL :

CASE
    WHEN LC_ATTRIBUT = 'Basiques' THEN
        LEAST(RECO1_APRES_CAPPING_SENSIBILITE, PRIX_TARIF_ACTUEL * 1.50)
    ELSE RECO1_APRES_CAPPING_SENSIBILITE
END as RECO1_AVEC_CAPPING

Colonne générée : RECO1_AVEC_CAPPING

Arbre de décision à 3 chemins

Phase 2.5 : Sélection du chemin décisionnel

PT2QE utilise un arbre de décision à 3 chemins pour déterminer le prix recommandé final.

Les 3 chemins :

CHEMIN 1 : PAS_BAISSE_GEL_PRIX - Condition : NEW_PAS < PAS_ACTIF (le nouveau PAS a baissé) - Action : Gel total du prix (PRIX_RECOMMANDE = PRIX_TARIF_ACTUEL) - Rationale : Ne pas répercuter les baisses de coût d'achat aux clients - Hausse : 0%

CHEMIN 2 : PL1_CONSERVATION_PREMIUM - Condition : Prix actuel dans PL1 des anciennes bornes (PRB_ACTIF ≥ Prix > BORNE_PL1_PL2) - Action : Conservation du prix actuel + application d'un plancher de sécurité (NEW_BORNE_PL2_PL3) - Formule : PRIX_RECOMMANDE = MAX(PRIX_TARIF_ACTUEL, NEW_BORNE_PL2_PL3) - Rationale : Maintenir les clients premium en position haute, avec garde-fou contre compression du corridor - Hausse : Variable (0% si prix déjà au-dessus du plancher, sinon hausse pour atteindre le plancher)

CHEMIN 3 : OPTIMISATION_STANDARD - Condition : Tous les autres cas - Action : MAX(RECO1_avec_capping, RECO2) - Rationale : Optimisation classique avec double recommandation - Hausse : Variable (dépend de RECO1 et RECO2)

Phase 2.5.1 : Détection des conditions

Détection PAS en baisse :

CASE WHEN NEW_PAS < PAS_ACTIF THEN 1 ELSE 0 END as IS_PAS_BAISSE

Détection PL1 anciennes bornes :

CASE 
    WHEN PRIX_TARIF_ACTUEL <= PRB_ACTIF
    AND PRIX_TARIF_ACTUEL > BORNE_PL1_PL2
    THEN 1 ELSE 0
END as IS_PL1_ANCIENNES

Phase 2.5.2 : Détermination du chemin

Code SQL :

CASE
    WHEN IS_PAS_BAISSE = 1 THEN 'PAS_BAISSE_GEL_PRIX'
    WHEN IS_PL1_ANCIENNES = 1 THEN 'PL1_CONSERVATION_PREMIUM'
    ELSE 'OPTIMISATION_STANDARD'
END as DECISION_PATH

Colonne générée : DECISION_PATH

Phase 2.5.3 : Calcul du prix avant capping PRB final

Code SQL :

CASE
    -- CHEMIN 1 : Gel total
    WHEN IS_PAS_BAISSE = 1 
    THEN PRIX_TARIF_ACTUEL

    -- CHEMIN 2 : Conservation avec plancher PL2_PL3
    WHEN IS_PL1_ANCIENNES = 1 
    THEN GREATEST(PRIX_TARIF_ACTUEL, NEW_BORNE_PL2_PL3)

    -- CHEMIN 3 : MAX(RECO1 cappée, RECO2)
    ELSE GREATEST(RECO1_AVEC_CAPPING, RECO2)
END as PRIX_AVANT_CAPPING_PRB

Colonne générée : PRIX_AVANT_CAPPING_PRB

Phase 2.5.4 : Détermination du type de recommandation

Code SQL :

CASE
    WHEN IS_PAS_BAISSE = 1 
    THEN 'GEL_PRIX'

    WHEN IS_PL1_ANCIENNES = 1
    THEN 'CONSERVATION_PREMIUM'

    WHEN RECO1_AVEC_CAPPING >= RECO2 
    THEN 'REPOSITIONNEMENT_PALIERS'
    ELSE 'HAUSSE_PROPORTIONNELLE_PAS'
END as RECO_TYPE

Colonne générée : RECO_TYPE

Nom explicite de la recommandation sélectionnée :

CASE
    WHEN IS_PAS_BAISSE = 1 
    THEN 'GEL_PRIX'

    WHEN IS_PL1_ANCIENNES = 1
    THEN 'CONSERVATION_PREMIUM'

    WHEN RECO1_AVEC_CAPPING >= RECO2 
    THEN 'RECO1_REPOSITIONNEMENT_PALIERS'
    ELSE 'RECO2_HAUSSE_PROPORTIONNELLE_PAS'
END as RECO_SELECTIONNEE

Colonne générée : RECO_SELECTIONNEE

Application du capping PRB final

Phase 2.6 : Capping PRB (tous chemins)

Logique :

Le capping PRB final s'applique à tous les chemins pour garantir que le prix recommandé ne dépasse jamais le PRB (Prix de Référence Brut).

Formule :

PRIX_RECOMMANDE = MIN(PRIX_AVANT_CAPPING_PRB, NEW_PRB)

Code SQL :

LEAST(PRIX_AVANT_CAPPING_PRB, NEW_PRB) as PRIX_RECOMMANDE

Colonne générée : PRIX_RECOMMANDE

Détection du capping PRB appliqué :

CASE
    WHEN PRIX_AVANT_CAPPING_PRB > NEW_PRB THEN 1
    ELSE 0
END as CAPPING_PRB_APPLIED

Synthèse du capping appliqué

Phase 2.7 : Détermination du capping le plus contraignant

Ordre de priorité des cappings : 1. GEL_PAS : Gel total (CHEMIN 1) 2. PRB_FINAL : Plafond absolu PRB 3. PLANCHER_PL2_PL3 : Plancher de sécurité (CHEMIN 2) 4. BASIQUES_50PCT : Capping produits basiques à +50% 5. SENSIBILITE : Capping selon sensibilité prix 6. NONE : Aucun capping appliqué

Code SQL :

CASE
    -- Priorité 1 : Gel total
    WHEN DECISION_PATH = 'PAS_BAISSE_GEL_PRIX' 
    THEN 'GEL_PAS'

    -- Priorité 2 : Capping PRB final
    WHEN CAPPING_PRB_APPLIED = 1 
    THEN 'PRB_FINAL'

    -- Priorité 3 : Plancher PL2_PL3
    WHEN PLANCHER_PL2_APPLIED = 1 
    THEN 'PLANCHER_PL2_PL3'

    -- Priorité 4 : Capping basiques
    WHEN CAPPING_BASIQUES_APPLIED = 1
    THEN 'BASIQUES_50PCT'

    -- Priorité 5 : Capping sensibilité
    WHEN CAPPING_SENSIBILITE_APPLIED = 1 
    THEN 'SENSIBILITE'

    -- Aucun capping
    ELSE 'NONE'
END as CAPPING_APPLIED

Colonne générée : CAPPING_APPLIED

Calcul des positions dans le corridor

Phase 2.8 : Calcul des 3 positions

PT2QE calcule et affiche 3 positions pour chaque offre, permettant de visualiser le déplacement du prix à travers le processus d'optimisation.

Position 1 : Prix actuel dans ANCIENNES bornes (PT0CE)

Utilité : Comprendre d'où on part (référence historique)

Code SQL :

CASE
    WHEN PRIX_TARIF_ACTUEL > PRB_ACTIF THEN 'ABOVE_PRB'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL1_PL2 THEN 'PL1'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL2_PL3 THEN 'PL2'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL3_PL4 THEN 'PL3'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL4_PL5 THEN 'PL4'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL5_PL6 THEN 'PL5'
    WHEN PRIX_TARIF_ACTUEL >= BORNE_PL6_PLX THEN 'PL6'
    WHEN PRIX_TARIF_ACTUEL >= PAS_ACTIF THEN 'PLX'
    ELSE 'BELOW_PAS'
END as POSITION_TARIF_ACTUEL_DANS_ANCIENNES_BORNES

Position 2 : Prix actuel dans NOUVELLES bornes (PT1CE)

Utilité : Voir l'impact du recalibrage PT1CE (le prix peut avoir changé de palier sans bouger)

Code SQL :

CASE
    WHEN PRIX_TARIF_ACTUEL > NEW_PRB THEN 'ABOVE_PRB'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL1_PL2 THEN 'PL1'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL2_PL3 THEN 'PL2'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL3_PL4 THEN 'PL3'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL4_PL5 THEN 'PL4'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL5_PL6 THEN 'PL5'
    WHEN PRIX_TARIF_ACTUEL >= NEW_BORNE_PL6_PLX THEN 'PL6'
    WHEN PRIX_TARIF_ACTUEL >= NEW_PAS THEN 'PLX'
    ELSE 'BELOW_PAS'
END as PALIER_TARIF_ACTUEL_VS_NOUVELLES_BORNES

Position 3 : Prix recommandé dans NOUVELLES bornes (PT2QE)

Utilité : Voir où on arrive après optimisation PT2QE (objectif : monter vers paliers supérieurs)

Code SQL :

CASE
    WHEN PRIX_RECOMMANDE > NEW_PRB THEN 'ABOVE_PRB'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL1_PL2 THEN 'PL1'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL2_PL3 THEN 'PL2'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL3_PL4 THEN 'PL3'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL4_PL5 THEN 'PL4'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL5_PL6 THEN 'PL5'
    WHEN PRIX_RECOMMANDE >= NEW_BORNE_PL6_PLX THEN 'PL6'
    WHEN PRIX_RECOMMANDE >= NEW_PAS THEN 'PLX'
    ELSE 'BELOW_PAS'
END as POSITION_NOUVEAU_PRIX_DANS_NOUVELLES_BORNES

Valeurs possibles : ABOVE_PRB, PL1, PL2, PL3, PL4, PL5, PL6, PLX, BELOW_PAS

Calcul du pourcentage de hausse final

Phase 2.9 : Calcul PCT_HAUSSE_FINALE

Formule :

PCT_HAUSSE_FINALE = (PRIX_RECOMMANDE - PRIX_TARIF_ACTUEL) / PRIX_TARIF_ACTUEL

Code SQL :

CASE 
    WHEN PRIX_TARIF_ACTUEL > 0 THEN
        (PRIX_RECOMMANDE - PRIX_TARIF_ACTUEL) / PRIX_TARIF_ACTUEL
    ELSE 0
END as PCT_HAUSSE_FINALE

Colonne générée : PCT_HAUSSE_FINALE (valeur décimale, ex: 0.05 = 5%)

Table finale créée : PT2QE_RECOMMENDATIONS

Logs affichés :

  Calcul des recommandations
    Jointure offres × corridors
    Génération des cappings par cube
      → XX,XXX cubes MASTER avec cappings
    ✓ XXX,XXX recommandations calculées
      - X,XXX clients
      - XX,XXX articles
      - Hausse moyenne: X.X%
    ✓ Cappings exportés : capping_cubes_generated.csv

Génération des analyses et exports

Phase 2.10 : Exports CSV détaillés

PT2QE génère 6 fichiers CSV détaillés dans le dossier de sortie.

Fichier 1 : recommendations_detail.csv

Contenu : Export ligne à ligne de TOUTES les recommandations avec cascade complète visible

Colonnes principales : - Identifiants : ID_CLN, LC_CLN, ID_ART, LC_ART, ID_CND - Dates : DT_DEB_CONDITION, DT_FIN_CONDITION - Dimensions : TYPE_CLIENT, TYPE_RESTAURANT, GEO, UNIVERS, MATCH_TYPE - Hiérarchie produit : CATEGORIE_N1 à N6, MARQUE, LC_ATTRIBUT - Métriques 4Q : MT_CAB_4Q, QT_UF_4Q, QT_KG_4Q (total, fermes, indexés) - Prix actuel : PRIX_TARIF_ACTUEL, PRIX_UNITAIRE_ACTUEL - Anciennes bornes : PAS_ACTIF, PRB_ACTIF, BORNE_PL1_PL2 à BORNE_PL6_PLX - Nouvelles bornes : NEW_PAS, NEW_PRB, NEW_BORNE_PL1_PL2 à NEW_BORNE_PL6_PLX - Les 3 positions : POSITION_TARIF_ACTUEL_DANS_ANCIENNES_BORNES, PALIER_TARIF_ACTUEL_VS_NOUVELLES_BORNES, POSITION_NOUVEAU_PRIX_DANS_NOUVELLES_BORNES - Cascade RECO1 : RECO1_BASE, RECO1_APRES_CAPPING_SENSIBILITE, RECO1_AVEC_CAPPING - RECO2 : RECO2 - Décision : DECISION_PATH, RECO_TYPE, RECO_SELECTIONNEE, CAPPING_APPLIED - Résultat : PRIX_RECOMMANDE, PCT_HAUSSE_FINALE

Tri : PCT_HAUSSE_FINALE DESC (hausses les plus fortes en haut)

Format : Séparateur ;, décimal ,, encodage CP1252

Fichier 2 : statistics_by_dimension.csv

Contenu : Agrégations par TYPE_CLIENT, TYPE_RESTAURANT, UNIVERS

Colonnes : - DIMENSION : TYPE_CLIENT / TYPE_RESTAURANT / UNIVERS - VALEUR : Valeur de la dimension - NB_OFFRES : Nombre d'offres - NB_CLIENTS : Nombre de clients uniques - NB_ARTICLES : Nombre d'articles uniques - PRIX_MOY_ACTUEL : Prix moyen actuel - PRIX_MOY_RECOMMANDE : Prix moyen recommandé - PCT_HAUSSE_MOY/MIN/MAX/STDDEV : Distribution des hausses

Utilité : Comparaison inter-segments, identification des segments les plus impactés

Fichier 3 : impact_analysis.csv

Contenu : Impact CA et distribution des hausses par TYPE_CLIENT × UNIVERS

Colonnes : - TYPE_CLIENT, UNIVERS - NB_OFFRES : Nombre d'offres - CA_ACTUEL, CA_FUTUR : CA total approximatif - IMPACT_EUROS : Gain CA en euros - IMPACT_PCT : Gain CA en pourcentage - HAUSSE_MOY_PCT : Hausse moyenne pondérée - Distribution par tranches : NB_SANS_HAUSSE, NB_0_2PCT, NB_2_5PCT, etc. - Pourcentages : PCT_SANS_HAUSSE, PCT_0_2, PCT_2_5, etc.

Utilité : Estimation du gain CA potentiel par segment, communication de l'impact business

Fichier 4 : price_increase_distribution.csv

Contenu : Histogramme global des hausses par tranches détaillées

Tranches : - 00. Pas de hausse (0%) - 01. 0-2% - 02. 2-5% - 03. 5-7% - 04. 7-10% - 05. 10-12% - 06. 12-15% - 07. 15-17% - 08. 17-20% - 09. Plus de 20%

Colonnes : - TRANCHE_HAUSSE - NB_OFFRES : Volume d'offres - NB_CLIENTS_UNIQUES, NB_ARTICLES_UNIQUES - PRIX_MOY_ACTUEL, PRIX_MOY_RECOMMANDE - HAUSSE_MIN/MAX/MOY_PCT : Statistiques de hausse dans la tranche - PCT_OFFRES : % d'offres dans cette tranche - PCT_CUMULE : % cumulé (jusqu'à cette tranche)

Utilité : Vision synthétique de l'agressivité globale, identification des outliers

Fichier 5 : decision_path_analysis.csv

Contenu : Statistiques par chemin de décision et type de recommandation

Colonnes : - DECISION_PATH : PAS_BAISSE_GEL_PRIX / PL1_CONSERVATION_PREMIUM / OPTIMISATION_STANDARD - RECO_SELECTIONNEE : GEL_PRIX / CONSERVATION_PREMIUM / RECO1_... / RECO2_... - NB_OFFRES, NB_CLIENTS, NB_ARTICLES - HAUSSE_MOY_PCT, HAUSSE_MEDIANE_PCT - Distribution des cappings : NB_CAP_GEL, NB_CAP_PRB, NB_CAP_PLANCHER, NB_CAP_BASIQUES, NB_CAP_SENSIBILITE, NB_SANS_CAPPING

Utilité : Comprendre la répartition entre les 3 chemins, analyser l'impact de chaque type de capping

Fichier 6 : capping_distribution.csv

Contenu : Distribution détaillée des cappings appliqués

Colonnes : - CAPPING_APPLIED : GEL_PAS / PRB_FINAL / PLANCHER_PL2_PL3 / BASIQUES_50PCT / SENSIBILITE / NONE - DECISION_PATH - RECO_SELECTIONNEE - NB_OFFRES - HAUSSE_MOY_PCT

Utilité : Mesurer l'impact de chaque type de capping, calibrer les paramètres

Fichier 7 : capping_cubes_generated.csv

Contenu : Cappings générés par cube (UNIVERS × TYPE_CLIENT × TYPE_RESTAURANT × GEO)

Colonnes : - UNIVERS, TYPE_CLIENT, TYPE_RESTAURANT, GEO - CUBE_TYPE : MASTER / NATIONAL - CAPPING_HIGH, CAPPING_MEDIUM, CAPPING_LOW

Utilité : Base pour créer les corrections de capping (copier vers corrections/)

Logs affichés :

  Analyse et export des résultats
    → Export détaillé : XXX,XXX lignes
    → Statistiques par dimension exportées
    → Statistiques par path exportées
    → Statistiques des distributions de capping exportées
    → Analyse d'impact exportée
    → Distribution des hausses exportée
    ✓ Cappings exportés : capping_cubes_generated.csv

Fichier récapitulatif : summary.txt

Contenu : Résumé de l'exécution

PT2QE - RÉSUMÉ D'EXÉCUTION
======================================================================

Date : 03/11/2025 14:35:42
Période analysée : 2024-02-05 -> 2024-11-02
Trimestres fiscaux : 2024_Q01, 2024_Q02, 2024_Q03, 2024_Q04
Table recommandations : PT2QE_RECOMMENDATIONS
Dossier résultats : outputs/run_20251103_143000

Fin de l'étape 1

Le traitement affiche :

========================================================================
  TRAITEMENT TERMINE AVEC SUCCES
========================================================================

Resultats disponibles dans : outputs\run_20251103_143000

Fichiers a analyser:
  - recommendations_detail.csv : Detail complet des recommandations
  - impact_analysis.csv : Analyse d'impact par segment
  - price_increase_distribution.csv : Distribution des hausses
  - decision_path_analysis.csv : Statistiques par chemin
  - capping_distribution.csv : Impact des cappings
  - capping_cubes_generated.csv : Cappings generes

PROCHAINES ETAPES:
  [Option 2] Ajuster les cappings si necessaire (optionnel)
  [Option 3] Generer les offres finales pour export

Appuyez sur une touche pour revenir au menu...


Phase 3 : Ajustement des cappings (optionnel)

Analyse des résultats de l'étape 1

Avant de lancer l'étape 2, analyser les fichiers générés :

Fichier à analyser en priorité : capping_cubes_generated.csv

Ce fichier contient les cappings appliqués par cube. Il sert de base pour créer les corrections.

Ouvrir dans Excel :

outputs\run_YYYYMMDD_HHMMSS\capping_cubes_generated.csv

Colonnes : - UNIVERS : Toujours ZOOM1 - TYPE_CLIENT : Ex: RCI PI GI, RSI HM, RSC HM, NATIONAL - TYPE_RESTAURANT : Ex: REST. TRADI, SOCIAL, RESTAURATION RAPIDE, NATIONAL - GEO : Ex: IDF, NO, SO, NULL, NATIONAL - CUBE_TYPE : MASTER ou NATIONAL - CAPPING_HIGH : Capping pour sensibilité HIGH (ex: 0,025 = 2,5%) - CAPPING_MEDIUM : Capping pour sensibilité MEDIUM (ex: 0,05 = 5%) - CAPPING_LOW : Capping pour sensibilité LOW (ex: 0,075 = 7,5%)

Autres fichiers à analyser :

recommendations_detail.csv : - Trier par PCT_HAUSSE_FINALE DESC - Identifier les hausses les plus fortes - Vérifier la cohérence des chemins de décision - Analyser les cappings appliqués

impact_analysis.csv : - Vérifier l'impact CA par TYPE_CLIENT × UNIVERS - Analyser la distribution des hausses par segment - Identifier les segments trop ou pas assez impactés

decision_path_analysis.csv : - Vérifier la répartition entre les 3 chemins - Analyser l'impact des cappings par chemin - Identifier les chemins sous-représentés ou sur-représentés

price_increase_distribution.csv : - Vérifier la distribution globale des hausses - Identifier les outliers (> 20%) - Vérifier que la majorité des hausses est dans les tranches cibles

Décision d'ajustement

Scénarios nécessitant un ajustement :

Scénario 1 : Hausses trop fortes sur un segment - Exemple : TYPE_CLIENT "RCI PI GI" avec 30% des offres > 15% de hausse - Action : Réduire les cappings pour ce TYPE_CLIENT

Scénario 2 : Hausses trop faibles sur un segment - Exemple : TYPE_CLIENT "RSI HM" avec 80% des offres < 5% de hausse - Action : Augmenter les cappings pour ce TYPE_CLIENT

Scénario 3 : Disparités géographiques - Exemple : GEO "IDF" avec hausses moyennes de 8%, GEO "NO" avec hausses moyennes de 3% - Action : Ajuster les cappings par GEO

Scénario 4 : Cube spécifique problématique - Exemple : Cube (ZOOM1, RCI PI GI, REST. TRADI, IDF) avec hausses systématiquement > 20% - Action : Ajuster spécifiquement ce cube

Si ajustement nécessaire, passer à l'étape suivante. Sinon, passer directement à la Phase 4.

Création du fichier de corrections

Étape 1 : Copier le fichier de cappings générés

Copier le fichier :

outputs\run_YYYYMMDD_HHMMSS\capping_cubes_generated.csv

Vers :

corrections\capping_cubes_corrections.csv

Étape 2 : Ouvrir dans Excel

Ouvrir le fichier corrections\capping_cubes_corrections.csv dans Excel.

Étape 3 : Modifier les cappings

Pour modifier un cube spécifique :

  1. Identifier la ligne du cube à modifier (combinaison UNIVERS, TYPE_CLIENT, TYPE_RESTAURANT, GEO)
  2. Modifier les valeurs CAPPING_HIGH, CAPPING_MEDIUM, CAPPING_LOW
  3. Enregistrer le fichier (format CSV, séparateur ;, décimal ,)

Exemples de modifications :

Exemple 1 : Réduire les cappings pour "RCI PI GI"

Ligne originale :

ZOOM1;RCI PI GI;REST. TRADI;IDF;MASTER;0,025;0,05;0,075

Ligne modifiée :

ZOOM1;RCI PI GI;REST. TRADI;IDF;MASTER;0,02;0,04;0,06

Exemple 2 : Augmenter les cappings pour "RSI HM" en zone NO

Ligne originale :

ZOOM1;RSI HM;SOCIAL;NO;MASTER;0,025;0,05;0,075

Ligne modifiée :

ZOOM1;RSI HM;SOCIAL;NO;MASTER;0,03;0,07;0,10

Étape 4 : Enregistrer le fichier

Enregistrer le fichier dans Excel : - Format : CSV (séparateur point-virgule) (*.csv) - Encodage : Windows-1252 / ANSI

⚠️ Important : Vérifier que le séparateur est bien ; et le décimal ,.

Lancement de l'ajustement (Option 2)

Étape 1 : Retour au menu principal

Appuyer sur une touche pour revenir au menu principal.

Étape 2 : Sélectionner l'option 2

Votre choix (1-6 ou Q): 2

Étape 3 : Confirmer le lancement

L'écran affiche :

========================================================================
  ETAPE 2: AJUSTEMENT DES CAPPINGS
========================================================================

Configuration:
  - Base de donnees : TARIFAIRE
  - Corrections     : corrections
  - Niveau de log   : Normal

PHASES QUI SERONT EXECUTEES:
  [1] Lecture des tables de recommandations existantes
  [2] Application des nouveaux cappings par cube
  [3] Recalcul complet de l'arbre de decision
  [4] Recalcul cascade cappings (sensibilite + basiques)
  [5] Generation des nouvelles analyses

Lancer le traitement ? (O/N):

Taper O puis Entrée.

Processus de recalcul

Phase 3.1 : Lecture des tables existantes

PT2QE lit les tables Oracle existantes : - PT2QE_PRICE_OFFERS : Offres extraites (non modifiées) - PT2QE_PRICE_OFFERS_ENRICHED : Offres enrichies avec corridors (non modifiées) - PT2QE_RECOMMENDATIONS : Recommandations à mettre à jour

Phase 3.2 : Upload des corrections

Les corrections sont uploadées dans une table temporaire TEMP_CAPPING_CORRECTIONS.

Phase 3.3 : Mise à jour des recommandations

Opération : UPDATE massif sur PT2QE_RECOMMENDATIONS avec une requête MERGE.

Colonnes recalculées :

Étape 1 : Recalcul RECO1_APRES_CAPPING_SENSIBILITE - Application du nouveau capping sensibilité selon les corrections

Étape 2 : Recalcul RECO1_AVEC_CAPPING - Application du capping basiques (50%) en cascade

Étape 3 : Recalcul PRIX_RECOMMANDE selon DECISION_PATH existant - CHEMIN 1 : Prix actuel (inchangé) - CHEMIN 2 : MAX(Prix actuel, NEW_BORNE_PL2_PL3) + capping PRB - CHEMIN 3 : MAX(RECO1_avec_capping, RECO2) + capping PRB

Étape 4 : Recalcul PCT_HAUSSE_FINALE - (PRIX_RECOMMANDE - PRIX_TARIF_ACTUEL) / PRIX_TARIF_ACTUEL

Étape 5 : Recalcul POSITION_NOUVEAU_PRIX_DANS_NOUVELLES_BORNES - Détermine le nouveau palier après recalcul

Étape 6 : Recalcul CAPPING_APPLIED - Détermine le capping le plus contraignant après ajustement

Étape 7 : Recalcul RECO_TYPE et RECO_SELECTIONNEE - Détermine quelle recommandation a gagné après recalcul

Logs affichés :

  Application des corrections de capping
    → XX corrections à appliquer
    ✓ XXX,XXX recommandations mises à jour

Phase 3.4 : Régénération des analyses

Tous les fichiers CSV sont régénérés avec les nouvelles données.

Logs affichés :

  Analyse et export des résultats
    → Export détaillé : XXX,XXX lignes
    → Statistiques par dimension exportées
    → Statistiques par path exportées
    → Statistiques des distributions de capping exportées
    → Analyse d'impact exportée
    → Distribution des hausses exportée

Fin de l'étape 2

Le traitement affiche :

========================================================================
  TRAITEMENT TERMINE AVEC SUCCES
========================================================================

Les cappings ont ete ajustes et les recommandations recalculees.

PROCHAINES ETAPES:
  - Verifier les nouveaux resultats
  - Comparer avec la version precedente
  [Option 2] Reajuster si necessaire (iteratif)
  [Option 3] Generer les offres finales

Appuyez sur une touche pour revenir au menu...

Comparaison des résultats

Pour comparer les résultats avant/après ajustement :

Dossier run initial :

outputs\run_20251103_143000\

Dossier corrections :

outputs\corrections_20251103_150000\

Fichiers à comparer :

1. recommendations_detail.csv - Comparer les colonnes PRIX_RECOMMANDE, PCT_HAUSSE_FINALE, CAPPING_APPLIED - Identifier les offres dont les recommandations ont changé

2. impact_analysis.csv - Comparer HAUSSE_MOY_PCT par TYPE_CLIENT × UNIVERS - Vérifier l'impact des ajustements sur les segments ciblés

3. decision_path_analysis.csv - Comparer la distribution des cappings (NB_CAP_SENSIBILITE, NB_CAP_BASIQUES, etc.) - Vérifier que les ajustements ont l'effet attendu

4. price_increase_distribution.csv - Comparer la distribution globale des hausses - Vérifier le déplacement entre les tranches

Décision : - Si résultats satisfaisants → Passer à la Phase 4 - Si nouveaux ajustements nécessaires → Modifier à nouveau corrections\capping_cubes_corrections.csv et relancer l'option 2


Phase 4 : Génération des offres finales

Validation des recommandations

Avant de générer les offres finales, vérifier :

1. Cohérence globale - Pas de hausse moyenne anormalement élevée (> 15%) - Pas de proportion anormale d'offres > 20% (doit être < 5%) - Distribution des hausses cohérente avec la stratégie

2. Qualité du matching - Taux de matching MASTER suffisant (> 70%) - Taux de NO_MATCH acceptable (< 5%)

3. Cohérence des chemins - Répartition entre les 3 chemins conforme aux attentes - Pas de sur-représentation du CHEMIN 1 (gel) sauf contexte de baisse PAS généralisée

4. Impact CA - Impact CA global cohérent avec les objectifs - Pas de disparités inter-segments trop importantes

Si validation OK, passer à la génération finale.

Lancement de la génération (Option 3)

Étape 1 : Retour au menu principal

Appuyer sur une touche pour revenir au menu principal.

Étape 2 : Sélectionner l'option 3

Votre choix (1-6 ou Q): 3

Étape 3 : Confirmer le lancement

L'écran affiche :

========================================================================
  ETAPE 3: GENERATION DES OFFRES FINALES
========================================================================

AVERTISSEMENT:
  Cette etape va generer le fichier final des offres de prix
  a la maille client × article.

  Assurez-vous d'avoir:
  - Execute l'etape 1 (calcul des recommandations)
  - Verifie et ajuste les cappings si necessaire (etape 2)
  - Valide les resultats obtenus

Configuration:
  - Base de donnees : TARIFAIRE
  - Niveau de log   : Normal

Generer les offres finales ? (O/N):

Taper O puis Entrée.

Processus de génération

Phase 4.1 : Extraction depuis PT2QE_RECOMMENDATIONS

Table source : PT2QE_RECOMMENDATIONS

Colonnes extraites : - Identifiants : ID_CLN, LC_CLN, ID_ART, LC_ART - Dimensions : TYPE_CLIENT, TYPE_RESTAURANT, GEO, UNIVERS - Condition : ID_CND, DT_DEB_CONDITION, DT_FIN_CONDITION - Prix : PRIX_TARIF_ACTUEL, PRIX_RECOMMANDE (alias NOUVEAU_PRIX) - Impact : PCT_HAUSSE_FINALE (alias PCT_HAUSSE), HAUSSE_EUROS calculée - Les 3 positions : POSITION_TARIF_ACTUEL_DANS_ANCIENNES_BORNES, PALIER_TARIF_ACTUEL_VS_NOUVELLES_BORNES, POSITION_NOUVEAU_PRIX_DANS_NOUVELLES_BORNES - Contexte : PRICE_SENSITIVITY, TYPE_HAUSSE (dérivé de RECO_SELECTIONNEE) - Métadonnées : DATE_CALCUL

Filtres appliqués :

WHERE PRIX_RECOMMANDE IS NOT NULL
ORDER BY ID_CLN, ID_ART

Phase 4.2 : Formatage des données

Arrondis : - Prix : 3 décimales - Pourcentages : 2 décimales

Ajout de colonnes calculées : - HAUSSE_EUROS : NOUVEAU_PRIX - PRIX_TARIF_ACTUEL - VALIDATION_STATUS : VALIDE / A_VERIFIER / ANOMALIE - TYPE_HAUSSE : REPOSITIONNEMENT / HAUSSE_PROPORTIONNELLE / AUTRE

Règles de validation : - VALIDATION_STATUS = 'VALIDE' : Par défaut - VALIDATION_STATUS = 'A_VERIFIER' : Si PCT_HAUSSE > 20% - VALIDATION_STATUS = 'ANOMALIE' : Si PCT_HAUSSE < 0 (baisse)

Phase 4.3 : Export CSV final

Fichier généré : final_price_offers.csv

Colonnes du fichier final : - ID_CLN : Identifiant client - LC_CLN : Libellé client - ID_ART : Identifiant article - LC_ART : Libellé article - TYPE_CLIENT : Type de client - TYPE_RESTAURANT : Type de restaurant - GEO : Zone géographique - UNIVERS : ZOOM1 - ID_CND : Identifiant condition - DT_DEB_CONDITION : Date début condition - DT_FIN_CONDITION : Date fin condition - PRIX_TARIF_ACTUEL : Prix actuel (3 décimales) - NOUVEAU_PRIX : Prix recommandé (3 décimales) - PCT_HAUSSE : Pourcentage de hausse (2 décimales, %) - HAUSSE_EUROS : Hausse en euros (3 décimales) - POSITION_TARIF_ACTUEL_DANS_ANCIENNES_BORNES : Position 1 - PALIER_TARIF_ACTUEL_VS_NOUVELLES_BORNES : Position 2 - POSITION_NOUVEAU_PRIX_DANS_NOUVELLES_BORNES : Position 3 - PRICE_SENSITIVITY : Sensibilité prix (HIGH/MEDIUM/LOW) - TYPE_HAUSSE : Type de recommandation appliquée - VALIDATION_STATUS : Statut de validation (VALIDE/A_VERIFIER/ANOMALIE) - DATE_CALCUL : Date/heure du calcul

Format : Séparateur ;, décimal ,, encodage CP1252

Génération des rapports complémentaires

Phase 4.4 : Rapport de validation

Fichier généré : validation_report.csv

Contenu : Statistiques de validation

Sections :

GLOBAL : - Nombre total d'offres - Nombre de clients - Nombre d'articles

HAUSSES : - Hausse moyenne (%) - Hausse médiane (%) - Hausse max (%)

TYPE_HAUSSE : - Nombre d'offres par TYPE_HAUSSE (REPOSITIONNEMENT, HAUSSE_PROPORTIONNELLE, etc.)

VALIDATION : - Nombre d'offres par VALIDATION_STATUS (VALIDE, A_VERIFIER, ANOMALIE)

Format : 3 colonnes (CATEGORIE, METRIQUE, VALEUR)

Phase 4.5 : Résumé textuel

Fichier généré : export_summary.txt

Contenu :

RÉSUMÉ EXPORT FINAL PT2QE
==================================================

Date : 03/11/2025 15:30:45

VOLUMÉTRIE
--------------------
Offres exportées : XXX,XXX
Clients uniques : X,XXX
Articles uniques : XX,XXX

HAUSSES DE PRIX
--------------------
Hausse moyenne : X.X%
Hausse médiane : X.X%
Hausse min : X.X%
Hausse max : XX.X%

VALIDATION
--------------------
VALIDE : XXX,XXX (XX.X%)
A_VERIFIER : X,XXX (X.X%)
ANOMALIE : XX (X.X%)

Logs affichés :

  Génération des offres finales
    ✓ XXX,XXX offres exportées
    → Rapport de validation généré

Fin de l'étape 3

Le traitement affiche :

========================================================================
  GENERATION TERMINEE AVEC SUCCES
========================================================================

Fichiers generes dans : outputs\final_20251103_153000

Fichiers disponibles:
  - final_price_offers.csv : Offres finales client × article
  - validation_report.csv : Rapport de validation
  - export_summary.txt : Resume de l'export

Le fichier final_price_offers.csv contient:
  - ID_CLN / ID_ART : Identifiants client et article
  - ID_CND : Identifiant condition
  - PRIX_TARIF_ACTUEL : Prix actuel
  - NOUVEAU_PRIX : Prix recommande
  - PCT_HAUSSE : Pourcentage de hausse
  - Les 3 positions : anciennes / nouvelles / apres reco
  - VALIDATION_STATUS : Statut de validation

Appuyez sur une touche pour revenir au menu...


Fichiers générés et structure de sortie

Arborescence des dossiers

PT2QE/
├── START.bat                                    # Point d'entrée
├── PT2QE_Menu.bat                              # Menu principal
├── pt2qe_main.py                               # Orchestrateur
├── inputs/
│   └── capping_type_client.csv                 # Cappings par type client (obligatoire)
├── corrections/
│   └── capping_cubes_corrections.csv           # Corrections de capping (optionnel)
├── config/
│   └── pt2qe_config.json                       # Configuration (optionnel)
├── outputs/
│   ├── run_20251103_143000/                    # Exécution normale (Étape 1)
│   │   ├── recommendations_detail.csv
│   │   ├── statistics_by_dimension.csv
│   │   ├── impact_analysis.csv
│   │   ├── price_increase_distribution.csv
│   │   ├── decision_path_analysis.csv
│   │   ├── capping_distribution.csv
│   │   ├── capping_cubes_generated.csv
│   │   └── summary.txt
│   ├── corrections_20251103_150000/            # Ajustement cappings (Étape 2)
│   │   ├── recommendations_detail.csv
│   │   ├── statistics_by_dimension.csv
│   │   ├── impact_analysis.csv
│   │   ├── price_increase_distribution.csv
│   │   ├── decision_path_analysis.csv
│   │   ├── capping_distribution.csv
│   │   └── summary.txt
│   └── final_20251103_153000/                  # Export final (Étape 3)
│       ├── final_price_offers.csv
│       ├── validation_report.csv
│       └── export_summary.txt
└── ...

Description des fichiers de sortie

Étape 1 : Calcul des recommandations

Dossier : outputs/run_YYYYMMDD_HHMMSS/

Fichier Contenu Utilisation
recommendations_detail.csv Export ligne à ligne de toutes les recommandations avec cascade complète Analyse détaillée, pivots Excel, investigation
statistics_by_dimension.csv Agrégations par TYPE_CLIENT, TYPE_RESTAURANT, UNIVERS Comparaison inter-segments
impact_analysis.csv Impact CA et distribution des hausses par TYPE_CLIENT × UNIVERS Estimation gain CA, communication business
price_increase_distribution.csv Histogramme global des hausses par tranches Vision synthétique agressivité
decision_path_analysis.csv Statistiques par chemin de décision et type de recommandation Compréhension de l'arbre de décision
capping_distribution.csv Distribution détaillée des cappings appliqués Mesure impact cappings, calibrage
capping_cubes_generated.csv Cappings générés par cube Base pour créer corrections
summary.txt Résumé de l'exécution Traçabilité

Étape 2 : Ajustement des cappings

Dossier : outputs/corrections_YYYYMMDD_HHMMSS/

Mêmes fichiers que l'Étape 1, avec les nouvelles valeurs après recalcul.

Étape 3 : Génération des offres finales

Dossier : outputs/final_YYYYMMDD_HHMMSS/

Fichier Contenu Utilisation
final_price_offers.csv Offres finales client × article Export opérationnel, import dans système cible
validation_report.csv Statistiques de validation Contrôle qualité
export_summary.txt Résumé de l'export Traçabilité

Format des exports CSV

Tous les fichiers CSV : - Séparateur : ; (point-virgule) - Décimal : , (virgule) - Encodage : CP1252 (Windows-1252, ANSI) - Format Excel Windows : Compatible ouverture directe dans Excel

Ouverture dans Excel : - Double-cliquer sur le fichier CSV - Excel détecte automatiquement le séparateur et le décimal

Import dans un système tiers : - Utiliser les paramètres : séparateur ;, décimal ,, encodage CP1252


Points de contrôle et validation

Métriques de suivi par phase

Phase 1 : Extraction - Nombre d'offres extraites (ZOOM1) - Taux d'offres avec historique 4Q (> 80% attendu) - Taux d'offres avec TYPE_CLIENT mappé (> 95% attendu) - Taux d'offres avec TYPE_RESTAURANT mappé (> 95% attendu)

Phase 2 : Matching corridors - Taux de matching MASTER (> 70% attendu) - Taux de matching NATIONAL (< 30% attendu) - Taux de NO_MATCH (< 5% attendu)

Phase 2 : Calcul recommandations - Nombre de recommandations calculées - Hausse moyenne globale - Distribution des hausses (% par tranche) - Répartition par chemin de décision - Répartition par type de recommandation (RECO1 vs RECO2)

Phase 3 : Ajustement cappings - Nombre de cubes ajustés - Impact sur la hausse moyenne - Évolution de la distribution des hausses

Phase 4 : Export final - Nombre d'offres exportées - Taux de validation (VALIDE > 95% attendu) - Taux d'anomalies (< 1% attendu)

Indicateurs d'alerte

Alerte CRITIQUE (arrêt recommandé) : - Tables PT1CE_OPTIMAL_* manquantes - Aucune offre extraite - Taux de NO_MATCH > 20% - Taux d'anomalies > 5%

Alerte MAJEURE (investigation recommandée) : - Taux de matching MASTER < 50% - Hausse moyenne > 15% - Plus de 10% des offres avec hausse > 20% - Disparités inter-segments très importantes (écart > 10 points)

Alerte MINEURE (surveillance) : - Taux de matching MASTER < 70% - Hausse moyenne < 2% (peut indiquer un problème de paramétrage) - Plus de 5% des offres avec hausse > 20%

Logs de progression

Format des logs :

[INFO] Phase X: Description
[INFO]   → Sous-étape
[INFO]     ✓ Résultat positif
[INFO]     ⚠ Avertissement
[ERROR]   ✗ Erreur

Exemple de log complet :

[INFO] Démarrage PRICING_TIER2_QUOTE_ENGINE v1.0.0
[INFO] ⚠️  MODE ZOOM1 EXCLUSIF
[INFO] ✓ Configuration chargée depuis config\pt2qe_config.json
[INFO] ✓ 8 règles RECO1 chargées
[INFO] Mode: NOUVEAU CALCUL complet

[INFO] Initialisation du gestionnaire de périodes...
[INFO] Période d'analyse: 2024-02-05 → 2024-11-02
[INFO] Trimestres fiscaux: 2024_Q01, 2024_Q02, 2024_Q03, 2024_Q04

[INFO] === Phase 1: Extraction des offres de prix avec historique ===
[INFO]   Extraction des offres avec historique de performance
[INFO]     ✓ 2,345,678 offres de prix extraites (ZOOM1 uniquement)
[INFO]     Statistiques d'enrichissement:
[INFO]       - Total offres: 2,345,678
[INFO]       - Clients uniques: 45,678
[INFO]       - Articles uniques: 23,456
[INFO]       - Avec TYPE_CLIENT: 2,312,456 (98.6%)
[INFO]       - Avec TYPE_RESTAURANT: 2,298,765 (98.0%)
[INFO]       - Avec FG_HM: 2,345,678 (100.0%)

[INFO] === Phase 2: Calcul des recommandations ===
[INFO]   Calcul des recommandations
[INFO]     Jointure offres × corridors
[INFO]       → Résultats du matching :
[INFO]         - MASTER : 1,987,654 offres, 38,765 clients, 21,234 articles
[INFO]         - NATIONAL : 345,678 offres, 12,345 clients, 5,678 articles
[INFO]         - NO_MATCH : 12,346 offres, 234 clients, 567 articles
[INFO]       → Total : 2,333,332/2,345,678 offres avec corridor (99.5%)
[INFO]     Génération des cappings par cube
[INFO]       → 1,234 cubes MASTER avec cappings
[INFO]       → 123 cubes NATIONAL avec cappings
[INFO]     ✓ 2,333,332 recommandations calculées
[INFO]       - 45,444 clients
[INFO]       - 22,889 articles
[INFO]       - Hausse moyenne: 4.2%
[INFO]     ✓ Cappings exportés : capping_cubes_generated.csv

[INFO] === Phase 4: Analyse et export des résultats ===
[INFO]   Analyse et export des résultats
[INFO]     → Export détaillé : 2,333,332 lignes
[INFO]     → Statistiques par dimension exportées
[INFO]     → Statistiques par path exportées
[INFO]     → Statistiques des distributions de capping exportées
[INFO]     → Analyse d'impact exportée
[INFO]     → Distribution des hausses exportée

[INFO] ✓ TRAITEMENT TERMINÉ AVEC SUCCÈS
[INFO] Résultats dans : outputs\run_20251103_143542


Modification des paramètres

Modification des cappings type client

Fichier : inputs/capping_type_client.csv

Quand modifier : - Avant la première exécution (Étape 1) - Pour changer la stratégie globale de capping

Comment modifier : 1. Ouvrir le fichier dans Excel 2. Modifier les valeurs CAPPING_HIGH, CAPPING_MEDIUM, CAPPING_LOW 3. Format : décimal avec virgule (ex: 0,025 pour 2,5%) 4. Enregistrer au format CSV (séparateur ;)

Exemple de modification :

Stratégie conservatrice (hausses limitées) :

TYPE_CLIENT;CAPPING_HIGH;CAPPING_MEDIUM;CAPPING_LOW
RCI PI GI;0,02;0,04;0,06
RSI HM;0,02;0,04;0,06

Stratégie aggressive (hausses importantes) :

TYPE_CLIENT;CAPPING_HIGH;CAPPING_MEDIUM;CAPPING_LOW
RCI PI GI;0,05;0,10;0,15
RSI HM;0,05;0,10;0,15

Impact : - Modifie les cappings appliqués sur RECO1 pour tous les cubes de ce TYPE_CLIENT - S'applique lors de l'Étape 1 (calcul initial)

Modification des cappings par cube

Fichier : corrections/capping_cubes_corrections.csv

Quand modifier : - Après l'Étape 1, si ajustements nécessaires - Pour affiner les cappings par segment (TYPE_CLIENT × TYPE_RESTAURANT × GEO)

Comment modifier : 1. Copier outputs/run_XXX/capping_cubes_generated.csv vers corrections/capping_cubes_corrections.csv 2. Ouvrir dans Excel 3. Modifier les lignes des cubes à ajuster 4. Enregistrer au format CSV (séparateur ;) 5. Lancer l'Étape 2

Exemple de modification ciblée :

Ajuster uniquement le cube (ZOOM1, RCI PI GI, REST. TRADI, IDF) :

UNIVERS;TYPE_CLIENT;TYPE_RESTAURANT;GEO;CAPPING_HIGH;CAPPING_MEDIUM;CAPPING_LOW
ZOOM1;RCI PI GI;REST. TRADI;IDF;0,03;0,06;0,09

Tous les autres cubes gardent les cappings du fichier capping_type_client.csv.

Impact : - Modifie uniquement les cubes spécifiés dans le fichier - S'applique lors de l'Étape 2 (ajustement)

Modification des règles RECO1

Fichier : config/pt2qe_config.json

Section : recommendations.reco1_rules

Quand modifier : - Rarement (règles métier stables) - Pour changer la logique de repositionnement par paliers

Comment modifier : 1. Ouvrir config/pt2qe_config.json dans un éditeur de texte 2. Modifier la section recommendations.reco1_rules 3. Enregistrer le fichier 4. Relancer l'Étape 1

Exemple de modification :

Règle par défaut :

{
    "position": "PL2_PL3",
    "condition": "PRIX_TARIF_ACTUEL > NEW_BORNE_PL3_PL4",
    "action": "TO_PL1",
    "target": "NEW_BORNE_PL1_PL2",
    "comment": "Remonter vers PL1"
}

Règle modifiée (remonter vers PL2 au lieu de PL1) :

{
    "position": "PL2_PL3",
    "condition": "PRIX_TARIF_ACTUEL > NEW_BORNE_PL3_PL4",
    "action": "TO_PL2",
    "target": "NEW_BORNE_PL2_PL3",
    "comment": "Remonter vers PL2"
}

Impact : - Modifie le calcul de RECO1_BASE - S'applique à toutes les offres en position PL2_PL3 - Rend les hausses moins agressives

Modification du capping basiques

Fichier : config/pt2qe_config.json

Section : capping.basiques

Quand modifier : - Pour ajuster le plafond de hausse sur les produits basiques

Comment modifier : 1. Ouvrir config/pt2qe_config.json 2. Modifier la valeur capping.basiques 3. Enregistrer le fichier 4. Relancer l'Étape 1

Exemple :

Valeur par défaut (50% maximum) :

"capping": {
    "basiques": 0.50
}

Valeur modifiée (40% maximum) :

"capping": {
    "basiques": 0.40
}

Impact : - Modifie le plafond de hausse pour les produits avec LC_ATTRIBUT = 'Basiques' - S'applique en cascade après le capping sensibilité

Modification du niveau de log

Dans le menu (Option 6) :

  1. Sélectionner l'option 6
  2. Choisir le niveau :
  3. [1] Silencieux (erreurs seulement)
  4. [2] Normal (tout afficher) - PAR DÉFAUT
  5. [3] Détaillé (mode debug)

Impact : - Silencieux : Affiche uniquement les erreurs critiques - Normal : Affiche INFO, WARNING, ERROR - Détaillé : Affiche DEBUG + tout le reste

En ligne de commande (avancé) :

python pt2qe_main.py TARIFAIRE -qq          # Silencieux
python pt2qe_main.py TARIFAIRE              # Normal
python pt2qe_main.py TARIFAIRE -vv          # Détaillé

Modification de la base de données

Par défaut : TARIFAIRE

Dans les fichiers .bat :

Modifier la ligne :

set DATABASE=TARIFAIRE

Par :

set DATABASE=AUTRE_BASE

En ligne de commande :

python pt2qe_main.py AUTRE_BASE --capping-file "inputs\capping_type_client.csv"

Impact : - Change la base Oracle utilisée pour toutes les opérations - Les tables PT1CE_OPTIMAL_* doivent exister dans la nouvelle base

Modification des filtres d'extraction

Fichier : extract_price_offers.py

Quand modifier : - Rarement (logique métier établie) - Pour changer les critères de sélection des offres

Filtres modifiables :

Types de conditions :

ID_TYP_CND IN ('ZFAP', 'ZFSP', 'ZIAP', 'ZISP')

Séquences :

ID_SEQ IN ('A305', 'A565')

Statuts clients :

ID_STA_CLN IN ('10', '20', '30', '50')

Exclusions articles :

LC_HIC_SYSCO_N2 NOT IN ('Divers', 'Freezer')

⚠️ Attention : Modifier ces filtres peut avoir un impact important sur le périmètre et les résultats.


Résumé du workflow complet

PRÉREQUIS : 1. PT1CE exécuté complètement (tables PT1CE_OPTIMAL_* créées) 2. Fichier inputs/capping_type_client.csv présent 3. Tables de mapping PT0CE existantes 4. Connexion Oracle fonctionnelle

ÉTAPE 0 : PRÉPARATION 1. Lancer START.bat 2. Sélectionner Option 5 (Vérifier les prérequis) 3. Corriger les problèmes éventuels

ÉTAPE 1 : CALCUL DES RECOMMANDATIONS 1. Sélectionner Option 1 2. Confirmer le lancement 3. Attendre la fin du traitement 4. Analyser les fichiers générés dans outputs/run_XXX/

ÉTAPE 2 : AJUSTEMENT DES CAPPINGS (optionnel) 1. Analyser capping_cubes_generated.csv 2. Copier vers corrections/capping_cubes_corrections.csv 3. Modifier les cappings souhaités 4. Sélectionner Option 2 5. Confirmer le lancement 6. Comparer les résultats avant/après dans outputs/corrections_XXX/ 7. Répéter si nécessaire

ÉTAPE 3 : GÉNÉRATION DES OFFRES FINALES 1. Valider les recommandations 2. Sélectionner Option 3 3. Confirmer le lancement 4. Récupérer final_price_offers.csv dans outputs/final_XXX/ 5. Utiliser le fichier pour import dans le système cible

WORKFLOW ALTERNATIF (ligne de commande) :

# Étape 1 : Calcul complet
python pt2qe_main.py TARIFAIRE --capping-file "inputs\capping_type_client.csv" --output-folder "outputs"

# Étape 2 : Ajustement cappings (optionnel)
python pt2qe_main.py TARIFAIRE --output-folder "outputs" --corrections-folder "corrections" --apply-corrections --skip-extraction

# Étape 3 : Export final
python pt2qe_main.py TARIFAIRE --output-folder "outputs" --generate-final-only

RÉCURRENCE : - Exécuter PT2QE après chaque exécution complète de PT1CE - Fréquence typique : Trimestrielle (après chaque nouveau trimestre fiscal complet) - Les tables Oracle PT2QE_* sont conservées entre les exécutions - Les dossiers outputs/ sont horodatés pour conserver l'historique