Aller au contenu

Guide des corrections manuelles - PT1CE

Table des matières

  1. Principe des corrections
  2. Format des fichiers
  3. Stratégies de correction
  4. Processus technique
  5. Exemples pratiques
  6. Validation et contrôles

Principe des corrections

Objectif

Les corrections manuelles permettent d'ajuster les corridors identifiés comme sous-optimaux après l'application automatique des nouveaux prix.

Cas nécessitant correction

  1. PL6 = PAS : La borne maximale a atteint le prix d'achat
  2. Bornes incohérentes : Non respect de l'ordre croissant
  3. Ajustements métier : Décisions commerciales spécifiques

Workflow de correction

graph LR
    A[Analyser CSV<br/>sous-optimaux] --> B{Corrections<br/>nécessaires?}
    B -->|OUI| C[Créer fichiers<br/>corrections]
    B -->|NON| D[Export SAP direct]

    C --> E[Exécuter<br/>corrections]
    E --> F[Vérifier<br/>résultats]
    F --> G{OK?}
    G -->|NON| C
    G -->|OUI| D

    style A fill:#ffcc99
    style C fill:#99ff99
    style E fill:#99ccff

Format des fichiers

Structure générale

Les fichiers de correction suivent un format CSV strict avec :
- Colonnes d'identification du corridor
- Colonnes de nouvelles bornes
- Possibilité de corrections partielles

Format ZOOM1/ZOOM2

Avec dimension géographique :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;GEO;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075130;RCI PI GI;REST. TRADI;IDF;13,500;14,200;15,800;17,200;18,900;21,500
075131;RSI HM;ENSEIGNEMENT;NORD;9,250;9,750;10,800;11,750;12,900;14,650

Format ZOOM3

Sans dimension géographique :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075150;RSC HM;AUTRES;3,665;3,855;4,275;4,660;5,115;5,820
075150;NATIONAL;NATIONAL;3,665;3,855;4,275;4,660;5,115;5,820

Cas particulier : Corridors NATIONAL

Pour corriger un corridor NATIONAL :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;NEW_BORNE_PL1_PL2;...
075150;NATIONAL;NATIONAL;3,665;...

Corrections partielles

Possibilité de ne modifier que certaines bornes :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;GEO;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075140;RSI HM;SOCIAL;EST;;7,590;8,420;9,170;10,070;11,450
→ PL1 non modifié, corrections à partir de PL2

075142;RCI PI GI;HOTELS;OUEST;16,600;;19,200;20,900;22,980;26,150
→ PL1 et PL3-PL6 modifiés, PL2 conservé

Stratégies de correction

Stratégie 1 : Ajustement minimal

Pour un corridor avec PL6 = PAS :

Problème :
PAS = 10,00€
PL6 = 10,00€ (= PAS)

Solution minimale :
Augmenter PL6 de 5-10% au-dessus du PAS
PL6 = 10,50€ ou 11,00€

Stratégie 2 : Redistribution complète

Recalculer toutes les bornes avec de nouveaux écarts :

Ancien corridor problématique :
PAS = 15,00€
PL1 = 16,50€ (+10%)
PL2 = 16,00€ (+6.7%)
PL3 = 15,80€ (+5.3%)
PL4 = 15,50€ (+3.3%)
PL5 = 15,20€ (+1.3%)
PL6 = 15,00€ (+0%) ← Problème

Nouvelle distribution :
PL1 = 17,25€ (+15%)
PL2 = 16,80€ (+12%)
PL3 = 16,35€ (+9%)
PL4 = 15,90€ (+6%)
PL5 = 15,45€ (+3%)
PL6 = 15,15€ (+1%)

Stratégie 3 : Alignement sur corridors similaires

Analyser des corridors similaires optimaux :

-- Trouver corridors similaires optimaux
SELECT *
FROM PT1CE_OPTIMAL_ZOOM1
WHERE ID_ART = '075130'
  AND TYPE_CLIENT = 'RCI PI GI'
  AND STATUS = 'OPTIMAL'
  AND ABS(NEW_PAS - 15.00) < 1.00  -- PAS proche
ORDER BY CA_TOTAL DESC

Stratégie 4 : Correction par paliers

Corriger uniquement les paliers problématiques :

Si PL5 et PL6 sont trop proches du PAS :
- Garder PL1 à PL4 inchangés
- Augmenter seulement PL5 et PL6

Processus technique

Étape 1 : Analyse des corridors sous-optimaux

# Lire le fichier généré
df_subopt = pd.read_csv('corridors_sous_optimaux.csv', sep=';')

# Analyser par type de problème
df_subopt.groupby('PROBLEM_TYPE').agg({
    'ID_ART': 'count',
    'CA_TOTAL': 'sum'
})

# Identifier les priorités (par CA)
top_impact = df_subopt.nlargest(20, 'CA_TOTAL')

Étape 2 : Création du fichier de corrections

# Template pour corrections
corrections = []

for _, row in corridors_to_fix.iterrows():
    # Calculer nouvelles bornes
    new_bornes = calculate_new_distribution(row)

    corrections.append({
        'ID_ART': row['ID_ART'],
        'TYPE_CLIENT': row['TYPE_CLIENT'],
        'TYPE_RESTAURANT': row['TYPE_RESTAURANT'],
        'GEO': row['GEO'],
        **new_bornes
    })

# Sauvegarder
pd.DataFrame(corrections).to_csv(
    'corrections/corrections_ZOOM1.csv',
    sep=';',
    decimal=',',
    index=False
)

Étape 3 : Application des corrections

Le processus technique :

  1. Chargement en table temporaire

    CREATE TABLE TEMP_CORRECTIONS_ZOOM1 (
        ID_ART VARCHAR2(50),
        TYPE_CLIENT VARCHAR2(100),
        TYPE_RESTAURANT VARCHAR2(100),
        GEO VARCHAR2(100),
        NEW_BORNE_PL1_PL2 NUMBER,
        -- etc.
    )
    

  2. Update ciblé

    UPDATE PT1CE_CORRIDORS_ZOOM1 t
    SET NEW_BORNE_PL1_PL2 = (
        SELECT c.NEW_BORNE_PL1_PL2
        FROM TEMP_CORRECTIONS_ZOOM1 c
        WHERE t.ID_ART = c.ID_ART
          AND t.TYPE_CLIENT = c.TYPE_CLIENT
          AND t.TYPE_RESTAURANT = c.TYPE_RESTAURANT
          AND NVL(t.GEO, 'NULL') = NVL(c.GEO, 'NULL')
          AND c.NEW_BORNE_PL1_PL2 IS NOT NULL
    )
    WHERE EXISTS (...)
    

  3. Re-détection

  4. Relance de detect_suboptimal.py
  5. Mise à jour des statuts
  6. Génération nouveaux rapports

Exemples pratiques

Exemple 1 : Correction simple PL6 = PAS

Problème :

Article 075140, RSI HM, SOCIAL, EST
PAS = 6,890€
PL6 = 6,890€ (sous-optimal)

Fichier correction :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;GEO;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075140;RSI HM;SOCIAL;EST;;7,590;8,420;9,170;10,070;11,450

Résultat :
- PL1 conservé (vide dans le CSV)
- PL2 à PL6 ajustés
- PL6 = 11,450€ > PAS → Optimal

Exemple 2 : Redistribution complète

Problème :

Article 075142, écarts trop faibles
Toutes les bornes proches du PAS

Analyse :

# Calcul nouveaux écarts progressifs
pas = 15.670
ecarts_pct = [0.20, 0.16, 0.12, 0.08, 0.04, 0.01]
nouvelles_bornes = [pas * (1 + e) for e in ecarts_pct]

Fichier correction :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;GEO;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075142;RCI PI GI;HOTELS;OUEST;18,804;18,177;17,550;16,924;16,297;15,827

Exemple 3 : Correction avec contrainte PRB

Problème :

PRB_RC = 5,000€
Bornes calculées dépassent le PRB

Solution avec plafonnement :

ID_ART;TYPE_CLIENT;TYPE_RESTAURANT;NEW_BORNE_PL1_PL2;NEW_BORNE_PL2_PL3;NEW_BORNE_PL3_PL4;NEW_BORNE_PL4_PL5;NEW_BORNE_PL5_PL6;NEW_BORNE_PL6_PLX
075150;RSC HM;AUTRES;5,000;5,000;4,800;4,600;4,400;4,200

Note : PL1 et PL2 plafonnés au PRB

Validation et contrôles

Contrôles automatiques

PT1CE vérifie automatiquement :

  1. Cohérence des bornes

    PL1 ≤ PL2 ≤ PL3 ≤ PL4 ≤ PL5 ≤ PL6
    

  2. Respect des contraintes

    Borne ≥ PAS
    Borne ≤ PRB approprié
    

  3. Existence du corridor

    Vérification que la combinaison existe
    

Messages d'erreur

⚠ 3 corridors avec bornes incohérentes détectés
  - 075140 | RSI HM | SOCIAL | EST : PL3 (8,420) < PL2 (8,500)

Validation manuelle recommandée

Après application des corrections :

  1. Vérifier la résolution

    # Comparer avant/après
    diff corridors_sous_optimaux_avant.csv corridors_sous_optimaux_apres.csv
    

  2. Analyser l'impact

    -- Évolution moyenne des bornes
    SELECT 
        AVG((NEW_BORNE_PL6_PLX - OLD_BORNE_PL6_PLX) / OLD_BORNE_PL6_PLX * 100) as PCT_HAUSSE_PL6
    FROM comparison_table
    WHERE correction_applied = 1
    

  3. Contrôler les extrêmes

  4. Hausses > 20%
  5. Baisses (anormales)
  6. Écarts entre paliers

Bonnes pratiques

  1. Commencer par les plus impactants
  2. Trier par CA décroissant
  3. Corriger d'abord le top 20%

  4. Documenter les décisions

    # Commentaire : Ajustement suite analyse concurrence
    075142;RCI PI GI;HOTELS;OUEST;...
    

  5. Tester sur échantillon

  6. 5-10 corrections
  7. Valider le processus
  8. Étendre ensuite

  9. Garder une trace

  10. Archiver les fichiers de correction
  11. Noter les raisons
  12. Versioning si multiples itérations