Documentation exhaustive des regles appliquees a chaque indicateur. A lire avant toute interpretation.
Les dashboards sont generes a partir de 7 fichiers Call Reports hebdomadaires (1 semaine chacun, export 3CX via « Call Reports ») et d'un fichier Extension Statistics by Group :
| Fichier source | Libelle pipeline | Periode | Lignes |
|---|---|---|---|
call_reports (23).csv | S10 01-07/03 | 2026-03-01 Dim → 2026-03-07 Sam | 10 526 |
call_reports (24).csv | S11 08-14/03 | 2026-03-08 Dim → 2026-03-14 Sam | 10 443 |
call_reports (25).csv | S12 15-21/03 | 2026-03-15 Dim → 2026-03-21 Sam | 9 612 |
call_reports (26).csv | S13 22-28/03 | 2026-03-22 Dim → 2026-03-28 Sam | 7 648 |
call_reports (27).csv | S14 29/03-04/04 | 2026-03-29 Dim → 2026-04-04 Sam | 8 477 |
call_reports (28).csv | S15 05-11/04 | 2026-04-05 Dim → 2026-04-11 Sam | 6 882 |
call_reports (29).csv | S16 12-18/04 | 2026-04-12 Dim → 2026-04-18 Sam | 7 672 |
extension_statistics_by_group (9).csv | — | cumul Mars + Avril | reference audit |
Cumul lignes brutes sur les 7 CSV : 61 260 lignes. Audit du 2026-04-22 (scenario 2) : chaque fichier couvre exactement 7 jours calendaires, aucun chevauchement, aucune troncature.
Chaque appel 3CX genere generalement plusieurs lignes dans le journal, avec le meme Call ID :
Direction=Inbound Queue, Status=Waiting (entree dans la file) — etape intermediaireDirection=Inbound, Status=Answered (agent decroche) ou UnansweredPour eviter le double comptage, chaque Call ID est conserve une seule fois selon une priorite documentee :
Inbound Answered > Outbound Answered > Internal Answered
> Inbound Unanswered > Outbound Unanswered > Internal Unanswered
> Inbound Queue Waiting > Inbound Queue Unanswered
| Plage | Type | Inclusion dans les dashboards |
|---|---|---|
| 6xx / 7xx | Agents humains | Inclus dans Agents / Primes |
| 8xx | Files d'attente, SVI, renvois de fermeture | Utilise pour attribution client |
| 9xx | Systemes IA Volubil, support technique | Exclu des calculs agents |
Chaque Call ID est rattache a un client (MDF, PSUD, SLF) via le nom de la file d'attente rencontree (colonne To des lignes Inbound Queue). Mapping applique :
| File d'attente (sous-chaine) | Client |
|---|---|
| MDF Standard 27 28 21 · MDF METIER - RSS 27.90.39 · MDF PAM 28.00.20 · DRING - MDF * fermeture | MDF |
| PSUD - AIDEMED · IA PSUD DPASS · DRING - PSUD AIDEMED fermeture | PSUD |
| SLF BDV · DRING - SLF BDV fermeture | SLF |
Heuristique complementaire : les libelles contenant « MDF », « PSUD », « AIDEMED », « DPASS », « SLF » ou « BDV » sont rattaches au client correspondant meme si la file exacte ne figure pas dans le mapping principal.
Criteres d'eligibilite d'un appel (tous criteres cumulatifs) :
Direction = InboundStatus = AnsweredTalking > 20 secondesPaliers journaliers (palier le plus eleve atteint uniquement, non cumulatif) :
| Appels eligibles / jour | Prime (F CFP) |
|---|---|
| ≥ 64 appels | 500 |
| ≥ 80 appels | 1 000 |
| ≥ 100 appels | 3 000 |
| Semaine | Dates (jours ouvres dans data.json) | Nb jours |
|---|---|---|
| Mars S1 | 02, 03, 04, 05, 06 | 5 |
| Mars S2 | 09, 10, 11, 12, 13 | 5 |
| Mars S3 | 16, 17, 18, 19, 20 | 5 |
| Mars S4 | 23, 24, 25, 26, 27, 30, 31 | 7 |
| Avril S1 | 01, 02, 03 | 3 |
| Avril S2 | 07, 08, 09, 10 06/04 exclu | 4 |
| Avril S3 | 13, 14, 15, 16, 17 | 5 |
| Total | 34 |
Week-ends (samedis/dimanches) exclus par l'ingestion : tres faible activite agent (< 20 appels) et pas d'attribution agent humain.
Audit du 2026-04-22 (scenario 2) : recompte des jours ouvres a partir des 7 CSV bruts,
avant passage dans ingest2.py. Resultat :
data.json (dates agents actifs) : 34| Date | Jour ferie | Jour | Lignes brutes | Answered SVI | Unanswered | Call IDs apres dedup | Repartition client |
|---|---|---|---|---|---|---|---|
2026-04-06 | Lundi de Paques | Lundi | 66 | 32 | 34 | 29 | MDF=10, PSUD=18, SLF=1 |
Regle d'exclusion appliquee : un jour est exclu de data["dates"]
si ingest2.py ne genere aucun record agent_daily pour ce jour
(i.e. aucun appel attribue a une extension 6xx/7xx). Les appels captes par les SVI de
fermeture (800 MDF, 883 PSUD, 840 SLF) ne creent pas de record agent car le champ To
pointe sur une queue (ext 8xx), pas sur un agent humain.
Cette regle est coherente avec la realite operationnelle (aucun agent en poste) mais
le jour reste present dans daily_hourly avec ses 29 Call IDs (visible dans la
vue Clients si un filtre large est applique).
Horaires confirmes par le directeur Pascal Leroy le 2026-04-22. Ils servent de perimetre de reference pour les regles de detection superviseur par creneau horaire (regles R1/R2/C1/C2/A1/A2 dependant de l'heure/jour). Un appel recu en dehors de ces plages tombe sur le SVI de fermeture (ext 800 MDF / 883 PSUD / 840 SLF) et ne doit pas etre compte comme un appel manque par un agent.
| Client | Jours ouvres | Plage horaire | Regime |
|---|---|---|---|
| MDF | Lundi a Vendredi | 07h30 - 16h30 | Continu (pas de pause meridienne) |
| PSUD | Lundi a Vendredi | 07h30 - 16h00 | Continu (pas de pause meridienne) |
| SLF | Lundi a Jeudi | 07h00 - 16h00 | - |
| Vendredi | 07h00 - 15h00 | - |
Implementation technique : parametre HORAIRES_CLIENT dans _common.py
+ helper in_plage_client(client, dow, hour). Precision a l'heure entiere
(approximation +/-30 min en bord de plage, car data.json est agrege par heure entiere).
Impact mesure (audit 2026-04-22, re-mesure sur data.json courant) :
sur 26 149 (somme client_hourly.total), 384 appels (1,47%) sont hors plage
d'ouverture — MDF 131/13 859 (0,95%), PSUD 236/11 553 (2,04%), SLF 17/737 (2,31%).
Ces appels restent comptes dans les totaux et les primes (qui sont calculees par agent, pas par
creneau horaire) ; ils sont uniquement exclus des regles de detection creneau
et signales visuellement sur les heatmaps avec un motif rayure gris + bordure dashed.
Ce qui n'est PAS affecte par ce filtrage : taux globaux agent, primes agent (paliers 64/80/100 → 500/1000/3000 F CFP), volumes cumulus par client, Ext Stats.
| Parametre | Valeur | Source (code) |
|---|---|---|
| Cible productivite agent | 8 appels/h | _common.py : PROD_TARGET |
| Representativite agent : jours actifs min. | 10 | _common.py : MIN_JOURS_ACTIFS |
| Representativite agent : Talk effectif min. | 2.0h | _common.py : MIN_TALK_H_STAT |
| Cible taux global decrochage | 80% | gen_index.py R1 |
| Seuil alerte jour (taux decrochage) | < 70% | gen_index.py R2 |
| Seuil pic de volume journalier | > moy + 1.5σ | gen_index.py R4 |
Pipeline de generation complet :
ingest2.py — chargement des 7 CSV, normalisation, dedoublonnage, agregations, vue Ext Stats, calcul primes → produit data.jsonbuild_compare.py — comparaison vs Ext Stats by Group → produit compare_3cx.jsongen_index.py / gen_agent.py / gen_client.py / gen_pivot.py / gen_affectation.py / gen_recap_primes.py / gen_comparaison.py — templates HTML avec JSON embarquegen_analyse_superviseur.py — tableau de bord superviseur consolidegen_methodo.py — la presente pageChaque dashboard est un fichier HTML autonome ; aucune dependance externe ni appel reseau. Ils fonctionnent en local et peuvent etre ouverts directement dans un navigateur.
Pour mettre a jour les dashboards avec de nouvelles donnees : remplacer les fichiers CSV dans le dossier Dashboard de supervision et relancer ingest2.py, build_compare.py, puis tous les gen_*.py.
Version courante : v2026.07.06.1. Journal des versions : CHANGELOG.md.
daily_hourly (vue Clients) mais absents de agent_daily et des taux agents.