Fonctionnalités principales

Un ensemble d'outils puissants pour gérer vos données terrain

Sync

Mise a jour FT/BT

Import du fichier FT-BT KO Excel, analyse des correspondances poteaux, puis mise a jour SQL directe PostgreSQL en thread background avec rollback atomique et triggers auto.

Validation

Verification CAP_FT

Comparaison des poteaux FT vs fiches appuis. Extraction single-pass unifiee (doublons, hors-etude, dico poteaux, terrains prives). Normalisation robuste via normalize_appui_num().

Database

Controle COMAC

Validation BT + VérifCabCOMAC (fddcpiax, CDI+posemode, capacites). Verification boitiers fibre optique (col AR). Filtrage poteaux par SRO. PostgreSQL natif (schema comac).

Chart

Comparaison C6 vs BD

Extraction IN+OUT single-pass via QgsSpatialIndex. Auto-detection champ etude centralise. Hors-perimetre explicit. Deduplication fichiers output.

Search

Police C6

Analyse via fddcpiax (NGE auto + Axione ST_Snap). Filtrage bold-only cables C6. Attaches-aware detection (cables + BPE). Compteur par etude. Exclusion appuis EDF. Securite NFC.

Folder

Mode Projet (BDD)

Chargement couches PostgreSQL par SRO derive du nom de dossier. Layers async en background. Disambiguation inline si multi-candidats. Persistance etat via QgsSettings.

Security

Verification Securite

Controle portees cables NFC 11201-A1. Zones ZVN/ZVF. Guards division par zero. Rapport unifie multi-modules avec KPI agreges et checks diagnostiques.

GraceTHD

GraceTHD Axione

Pipeline alternatif pour SRO Axione via fichiers locaux SHP+CSV. Detection auto NGE vs Axione. Fonction SQL fddcpiax avec ST_Snap tolerance elargie. Match mode ligne.

Diagnostic

Diagnostic et Preflight

Mode diagnostic 6 sections (structure, detection, couches, export, PG, modules). Preflight global avant batch. Messages actionnables. Tooltips prerequis par module.

0
Lignes de code
Python pur (-1400 lignes dead code)
0
Fichiers Python
Architecture modulaire
0
Workflows async
QgsTask + signaux Qt
0
Sprints optimisation
-30% a -40% temps batch
0
Modules metier
Execution par lot

Architecture et fichiers

Vue d'ensemble des composants du plugin v3.1

Modules d'analyse

Ordre Module Fichier metier Workflow Description
0 MAJ FT/BT Maj_Ft_Bt.py maj_workflow.py Import Excel FT-BT KO, MAJ SQL directe PostgreSQL en background, rollback atomique, triggers auto
1 C6 vs BD C6_vs_Bd.py c6bd_workflow.py Comparaison annexes C6 Excel vs couches QGIS, QgsSpatialIndex, auto-detection champ etude
2 CAP FT CapFt.py capft_workflow.py Verification poteaux FT vs fiches appuis, detection ecarts, rapport Excel
3 COMAC Comac.py comac_workflow.py Validation BT + VérifCabCOMAC (fddcpiax, CDI+posemode, capacites, boitiers FO), PostgreSQL schema comac
4 Police C6 PoliceC6.py police_workflow.py Analyse fddcpiax complete, bold-only C6, attaches-aware, CDI/posemode, exclusion EDF, securite NFC
5 C6-C3A-C7 C6_vs_C3A_vs_Bd.py c6c3a_workflow.py Croisement annexes C6, C3A et C7, detection incoherences inter-documents

Infrastructure et services

Couche Fichier Role
UI PoleAerien.py Point d'entree (128 lignes), toolbar, instanciation workflows, lazy init dialog
UI dialog_v2.py PoleAerienDialogV2 : interface unifiee, QSplitter, QgsCollapsibleGroupBox, journal
UI batch_orchestrator.py Pont dialog-workflows, caches fddcpi2/SRO/appuis_wkb inter-modules, preflight, recap post-batch
UI batch_runner.py Execution sequentielle des modules, progression globale par sous-plage
UI project_detector.py Auto-detection structure projet, SRO extraction, multi-candidats, deduplication, diagnostics
Async async_tasks.py 6 QgsTask (CapFtTask, ComacTask, C6BdTask, C6C3ATask, PoliceC6Task, MajSqlBg)
Async maj_sql_background.py MajSqlBackgroundTask : MAJ SQL directe PostgreSQL en thread background
Regles security_rules.py Verification portees NFC 11201-A1, zones ZVN/ZVF, guards division par zero
Regles pcm_parser.py Parsing XML fiches PCM (ISO-8859-1), extraction donnees etude
Regles gracethd_reader.py GraceTHDReader : cables, BPE, poteaux depuis fichiers SHP+CSV locaux (Axione)
Regles cable_analyzer.py Comptage cables par appui, CDI+posemode, group_by_gid, attaches, comparer_source_cables()
Donnees comac_db_reader.py PostgreSQL only (schema comac), cache thread-safe, 591 cables references
Donnees db_connection.py Connexion psycopg2 auto (credentials QGIS), fddcpiax() (NGE auto + Axione ST_Snap)
Donnees qgis_utils.py get_layer_safe(), normalize_appui_num(), build_spatial_index(), extraire_appuis
Donnees core_utils.py Fonctions pures Python : safe_float, safe_int, build_export_path, parse_bool
Donnees unified_report.py Rapport unifie multi-modules : KPI agreges, checks diagnostiques, export Excel
Donnees db_layer_loader.py Mode Projet : chargement couches PostgreSQL filtrees par SRO (infra_pt_pot, etudes)
Donnees dataclasses_results.py Dataclasses structurees pour resultats inter-modules

Couches QGIS requises

Couche Type Source Utilisation
infra_pt_pot Points PostgreSQL Poteaux FT/BT (champ inf_num), base de tous les modules
etude_cap_ft Polygones PostgreSQL Zones d'etude FT pour CAP FT, C6 vs BD, Police C6
etude_comac Polygones PostgreSQL Zones d'etude BT pour COMAC
bpe Points GraceTHD Boitiers de protection (Police C6)
t_cheminement Lignes GraceTHD Chemins reseau (filtre cm_typ_imp != 7)
t_cableline Lignes GraceTHD Trace geometrique des cables
t_noeud Points GraceTHD Points d'ancrage reseau

Evolution du plugin

Historique des versions majeures et fonctionnalites ajoutees

Mars 2026

v3.1 - GraceTHD, Mode Projet, Optimisations

Pipeline GraceTHD Axione (SHP+CSV locaux, fddcpiax ST_Snap). Mode Projet BDD (layers async PostgreSQL par SRO). 4 sprints optimisation : caches inter-modules (fddcpi2, SRO, appuis_wkb, CRS), extractions single-pass, centralisation credentials PG. Police C6 : bold-only C6, attaches-aware, compteur etudes. COMAC : boitiers FO, group_by_gid. UX : disambiguation inline, diagnostic 6 sections, preflight, refresh, persistance etat, liens cliquables. Dead code -1400 lignes.

ACTUELLE
Fevrier 2026

v3.0 - Interface unifiee

Reecriture complete de l'interface : PoleAerienDialogV2 avec detection automatique du projet, execution par lot sequentielle via BatchRunner + BatchOrchestrator. PoleAerien.py reduit de 2100 a 128 lignes. 11 fichiers obsoletes supprimes. Architecture Workflows : God Object decouple en 6 workflows async.

Decembre 2025

v2.2.0 - Securite NFC

Module verification securite NFC 11201-A1, detection zones climatiques ZVN/ZVF, feuille VERIF_SECURITE.

Octobre 2025

v2.1.0 - Police C6

Analyse croisee C6/C3A/C7, couches erreur temporaires, integration donnees reseau.

2024

v2.0.0 - Refonte complete

Architecture MVC, execution asynchrone QgsTask, 6 modules d'analyse independants.

Cycle de vie QGIS

Comprendre le fonctionnement interne du plugin dans QGIS

1. QGIS Start classFactory(iface) __init__.py:64 Retourne PoleAerien 2. __init__(iface) • 6 Workflows (signaux) • Toolbar creation • Dialog lazy (None) • BatchRunner (None) • BatchOrchestrator (None) PoleAerien.py:30-58 Workflows: Maj, CapFt, Comac, C6Bd, C6C3A, Police 3. initGui() • Menu QGIS • Toolbar icon Ligne 82-88 4. run() • Lazy init DialogV2 • Init BatchRunner • Init BatchOrchestrator • init_default_layers() • dlg.show() non-modal • dlg.raise_() + activate Ligne 112-128 Dialog non-modal, QGIS reste utilisable 5. unload() • dlg.close() • Remove menu • Remove toolbar icons • del toolbar ↻ Utilisateur relance le plugin CYCLE DE VIE PLUGIN QGIS Fichier principal: PoleAerien.py Lignes de code: 128 lignes v Version: v3.0 QGIS 3.28+ | PostgreSQL natif

1. Démarrage QGIS

classFactory(iface) dans __init__.py est appelée par QGIS au démarrage. Cette fonction instancie et retourne l'objet PoleAerien.

2. Initialisation

__init__(iface) configure le plugin : instanciation de 6 workflows (Maj, CapFt, Comac, C6Bd, C6C3A, Police), creation de la toolbar. Le dialog, le BatchRunner et le BatchOrchestrator sont initialises en lazy dans run().

3. Interface GUI

initGui() ajoute l'icône du plugin au menu QGIS et à la toolbar. L'action est connectée à la méthode run().

4. Execution

run() cree le PoleAerienDialogV2 (lazy init), le BatchRunner et le BatchOrchestrator au premier appel. Initialise les couches par defaut, puis affiche le dialog en mode non-modal avec show(). QGIS reste utilisable pendant que le dialog est ouvert.

5. Nettoyage

unload() nettoie les ressources : fermeture du dialog, retrait des actions du menu QGIS, suppression des icones de la toolbar.

Workflows asynchrones

6 workflows (QObject) orchestrent les modules métier. Ils délèguent l'exécution à async_tasks.py (QgsTask) en arrière-plan. Signaux standardisés : progress_changed, message_received, analysis_finished, error_occurred.

Détails techniques : Initialisation des composants

+

Dans __init__() (lignes 30-58) :

  • self.maj_workflow = MajWorkflow() - Workflow MAJ FT/BT
  • self.comac_workflow = ComacWorkflow() - Workflow COMAC
  • self.capft_workflow = CapFtWorkflow() - Workflow CAP FT
  • self.c6bd_workflow = C6BdWorkflow() - Workflow C6 vs BD
  • self.police_workflow = PoliceWorkflow() - Workflow Police C6
  • self.c6c3a_workflow = C6C3AWorkflow() - Workflow C6-C3A-C7
  • self._dlg = None - Dialog lazy init dans run()
  • Creation toolbar : self.toolbar = self.iface.addToolBar()

Details techniques : Detection automatique du projet

+

project_detector.py analyse le dossier projet selectionne et detecte automatiquement :

  • FT-BT KO : fichier Excel a la racine (pattern FT-BT KO*.xlsx)
  • CAP FT : sous-dossier CAP FT/ contenant les etudes par CMD
  • COMAC : sous-dossier COMAC/ ou ExportComac/
  • C6 : = dossier CAP FT (les annexes C6 sont les Excel d'etude FTTH-NGE-ETUDE-*.xlsx)
  • GraceTHD : BASE DE DONNEES/NGE/ (verifie bpe.shp ou t_cheminement.shp)
  • C7, C3A : fichiers ou dossiers a la racine

Les modules sont automatiquement coches selon les fichiers detectes.

Details techniques : Execution par lot (BatchRunner)

+

BatchRunner execute les modules selectionnes de facon sequentielle. Le BatchOrchestrator fait le lien entre le dialog, le runner et les workflows :

  • L'utilisateur clique "Demarrer" avec les modules coches
  • Le BatchRunner lance les modules un par un dans l'ordre
  • Le BatchOrchestrator traduit les parametres du dialog en appels workflow
  • Les signaux workflow (progress, message, finished, error) sont relies au dialog
  • La progression globale est calculee par sous-plage (module 2/4 = 25-50%)
  • A la fin, un rapport Excel unifie est genere si possible

Interface unifiee

Un seul dialog pour toutes les operations

Structure du dialog PoleAerienDialogV2

Folder

Detection intelligente

Auto-detection projet (FT-BT KO, CAP FT, COMAC, GraceTHD, C6, C3A, C7). Patterns elargis (ETUDE COMAC, KPFT). Deduplication fichiers output. Bouton refresh pour resync.

Layers

Mode Projet (BDD)

Toggle "Couches QGIS" / "Mode Projet". SRO derive du nom de dossier (63041-B1I-PMZ-00003). Chargement async couches PostgreSQL. Option "Charger dans le projet".

Check

Disambiguation et Diagnostic

Dropdowns inline si multi-candidats (COMAC, CAP FT, C7, C3A). Bouton Diagnostic : rapport 6 sections. Preflight global. Tooltips prerequis. Persistance etat QgsSettings.

Log

Journal et resultats

Liens cliquables vers rapports Excel. Compteur etude Police C6 [i/N]. Recap post-batch avec metriques. Progression SmoothProgressController. Export log texte.

Structure du dossier projet attendue

63041-B1I-PMZ-00003/ -- SRO = 63041/B1I/PMZ/00003 FT-BT KO B1L_00003.xlsx -- MAJ BD CAP FT/ -- CAP_FT + C6 browse dir CMD 1/ FTTH-NGE-ETUDE-B1L-63041-7/ -- Annexe C6 = study xlsx CMD 2/... COMAC/ -- COMAC (ou ETUDE COMAC, ETUDE-COMAC) C6/ -- Standalone C6 (si present) C3A/ -- Annexe C3A C7/ -- Annexe C7 BASE DE DONNEES/ NGE/ -- GraceTHD NGE (bpe.shp, t_cheminement.shp) GRACE_APD_DTR_*/ -- GraceTHD Axione (SHP+CSV a plat)

Architecture du plugin

Schémas explicatifs du fonctionnement des composants

Architecture applicative en couches

COUCHE UI (Qt) PoleAerien.py Point d'entree (128 lig.) dialog_v2.py PoleAerienDialogV2 batch_orchestrator.py Dialog - Workflows batch_runner.py Execution sequentielle project_detector.py Auto-detection projet COUCHE WORKFLOWS (Orchestration) MajWorkflow MAJ FT/BT CapFtWorkflow Vérif FT ComacWorkflow Vérif BT C6BdWorkflow C6 vs BD C6C3AWorkflow C6/C3A/C7 PoliceWorkflow Police C6 Infrastructure Async async_tasks.py (QgsTask) maj_sql_background.py SmoothProgressController TaskSignals (Qt) COUCHE MÉTIER (Logique Business) Maj_Ft_Bt.py CapFt.py Comac.py C6_vs_Bd.py C6_vs_C3A_vs_Bd.py PoliceC6.py cable_analyzer.py CDI + posemode qgis_utils.py + core_utils.py db_connection.py fddcpi2() + psycopg2 COUCHE RÈGLES & VALIDATION security_rules.py PORTEES_MAX verifier_portee() NFC 11201-A1 Guards division/0 pcm_parser.py parse_pcm_file() EtudePCM XML → dataclass ISO-8859-1 gracethd_reader.py GraceTHDReader SHP+CSV locaux Cables, BPE, poteaux Pipeline Axione COUCHE DONNÉES comac_db_reader PG only | cache 591 cables references fddcpiax() NGE + Axione ST_Snap 0.70m Couches QGIS infra_pt_pot etude_cap_ft/comac Fichiers Excel FT/BT, C6, C3A C7, CAP_FT, COMAC db_layer_loader Mode Projet BDD PG layers par SRO GraceTHD (SHP) gracethd_reader.py Axione locaux unified_report Rapport multi-modules KPI + checks + export v3.1 Bordures jaunes = nouveaux composants v3.1 (db_layer_loader, gracethd_reader, unified_report) Statistiques v3.1 ~26 fichiers Python ~10500 lignes 6 workflows 6 modules métier Thread-safe async QGIS 3.28+ Architecture en 5 couches : UI → Workflows → Métier → Règles → Données
Couche UI (Interface utilisateur)
Couche Orchestration (Async, signaux)
Couche Métier (Logique business)
Couche Règles (Validation, sécurité)
Couche Données (CSV, QGIS, Excel)

Vue d'ensemble - Architecture en flux (v3.1)

INPUTS CORE + ORCHESTRATION WORKFLOWS MODULES METIER EXCEL FT/BT, C6, C3A, C7 COMAC, CAP FT QGIS LAYERS infra_pt_pot etude_cap_ft / comac PostgreSQL fddcpiax(SRO) schema comac GraceTHD SHP + CSV locaux Axione (auto-detect) MODE PROJET db_layer_loader.py PG layers par SRO PoleAerienDialogV2 Detection + Disambiguation + Diagnostic Mode Projet toggle | QgsSettings BatchOrchestrator Preflight global Caches inter-modules fddcpi2 | SRO | appuis_wkb PoleAerien.py Point d'entree (128 lig.) BatchRunner Execution sequentielle project_detector.py SRO | multi-candidats | dedup diagnostics | patterns elargis MajWorkflow SQL background | rollback atomique 0 CapFtWorkflow single-pass extraction 2 ComacWorkflow boitiers FO | group_by_gid | SRO cache 3 C6BdWorkflow IN+OUT single-pass | dedup output 1 C6C3AWorkflow standalone C6 folder | c6_annexe_file 5 PoliceWorkflow bold-only | attaches | fddcpiax 4 async_tasks.py (6 QgsTask) Background threads | Signaux Qt MAJ FT/BT Maj_Ft_Bt.py + maj_sql_background.py CAP_FT CapFt.py | normalize_appui_num(strip_e) COMAC + VerifCab + Boitiers Comac.py | cable_analyzer | security_rules C6 vs BD C6_vs_Bd.py | QgsSpatialIndex C6/C3A/C7/BD C6_vs_C3A_vs_Bd.py | standalone C6 Police C6 PoliceC6.py | bold-only | attaches-aware | NFC CACHES INTER-MODULES fddcpi2 SRO appuis_wkb CRS detect_etude OUTPUTS unified_report.py KPI + checks + export Excel par module openpyxl colore Recap post-batch metriques + duree Liens cliquables log_result_link() MAJ SQL directe PG rollback atomique + triggers SERVICES TRANSVERSAUX security_rules.py NFC 11201-A1 | ZVN/ZVF cable_analyzer.py CDI | posemode | attaches gracethd_reader SHP+CSV | Axione db_connection.py fddcpiax() | psycopg2 comac_db_reader PG only | cache thread-safe qgis_utils.py layers | spatial | CRS core_utils.py safe_float | parse_bool pcm_parser.py XML .pcm | ISO-8859-1 v3.1 Mars 2026
Inputs (Excel, QGIS, PG, GraceTHD)
Core + Orchestration
Workflows (6)
Modules + Outputs
Caches inter-modules
GraceTHD Axione
Mode Projet BDD

Pipeline de traitement v3.1 - Dual-path NGE/Axione, Caches inter-modules, Preflight

COUCHE WORKFLOWS (Orchestration Async) 1 2 3 4 5 WF WF WF SOURCE Excel FT/BT KO .xlsx WORKFLOW MajWorkflow Async Task CORRESPONDANCE N° appui + Études Clé composite MODIFICATION Maj_Ft_Bt.py 6 attributs RÉSULTAT infra_pt_pot Modifié Couche QGIS infra_pt_pot source Filtrage spatial etude_cap_ft etude_comac Champs modifiés (8) inf_type POT-AC inf_propri RAUV noe_usage DI inf_mat typ_po_mod etat BT KO dce O modifie_par user date_modif timestamp
Source Excel
Extraction
Logique métier
Résultat QGIS

Ameliorations v3.1 (non visibles sur ce schema generique) :

Dual-path NGE/Axione (fddcpiax auto-detect) Caches: fddcpi2 + SRO + appuis_wkb + CRS Preflight global avant batch unified_report.py multi-modules Mode Projet: db_layer_loader async

Constellation des modules

WORKFLOWS CORE PoleAerien.py Orchestrateur Maj WF CapFt WF Comac WF C6Bd WF C6C3A WF Police WF MAJ FT/BT Maj_Ft_Bt.py 800 lignes 0 CAP_FT CapFt.py 154 lignes 2 COMAC Comac.py 564 lignes 3 C6 vs BD C6_vs_Bd.py 382 lignes 1 Police C6 PoliceC6.py 718 lignes 4 security _rules gracethd _reader pcm _parser comac _db_reader db_conn fddcpiax() cable _analyzer unified _report db_layer _loader CACHES fddcpi2 | SRO ARCHITECTURE v3.1 Workflows: 6 Fichiers Python: 26 Lignes total: 10500
MAJ FT/BT
CAP_FT
COMAC
C6 vs BD
Police C6
unified_report (v3.1)
db_layer_loader (v3.1)
Caches inter-modules (v3.1)

Dashboard Sécurité - NFC 11201-A1

VÉRIFICATION SÉCURITÉ Module: security_rules.py | Norme: NFC 11201-A1 ACTIF Alertes: 0 ENTRÉE Excel COMAC Col A: N° poteau Col AO: Type câble FO EXTRACTION Comac.py Colonnes: 6, 40, 46 portée, capacité_fo VALIDATION security_rules.py PORTEES_MAX CODES_PRYSMIAN verifier_portee() NFC 11201-A1 RÉSULTATS dico_verif_secu capacité_fo: 24FO valide: OK/KO EXPORT Feuille VERIF_ SECURITE ZONE CLIMATIQUE ZVN - Vent Normal ZVF - Vent Fort PORTÉES MAXIMALES NFC 11201-A1 (mètres) Zone 6 FO 12 FO 24 FO 36 FO 48 FO 72 FO 96 FO ZVN 81 77 73 74 78 77 76 ZVF 79 74 73 74 78 77 76 Source: Norme NFC 11201-A1 - Portées maximales câbles FO aériens CÂBLES RÉFÉRENCÉS CODES_PRYSMIAN: PCO-06-E1-A 6 FO PCO-12-E1-A 12 FO PCO-24-E1-A 24 FO PCO-48-E1-A 48 FO PCO-72-E1-A 72 FO 591 câbles référencés (PG) Fichier règles: security_rules.py Lignes de code: 434 Lecteur BD: comac_db_reader.py Source: PostgreSQL Parser PCM: pcm_parser.py Format: XML (.pcm) Export feuille: VERIF_SECURITE Format: .xlsx
Entrée / Zone
Validation sécurité
Résultats
Export

Graphe de Dependances (DAG) - Imports Python

__init__.py classFactory() PoleAerien.py Point d'entree - 128 lignes dialog_v2.py PoleAerienDialogV2 batch_orchestrator.py Dialog - Workflows batch_runner.py Execution sequentielle project_detector.py Auto-detection WORKFLOWS/ maj_workflow.py MajWorkflow capft_workflow.py CapFtWorkflow comac_workflow.py ComacWorkflow c6bd_workflow.py C6BdWorkflow c6c3a_workflow.py C6C3AWorkflow police_workflow.py PoliceWorkflow unified_report.py MODULES METIER Maj_Ft_Bt.py Module MAJ CapFt.py Module CAP FT C6_vs_Bd.py Module C6 BD C6_vs_C3A_vs_Bd.py Module C6-C3A Comac.py Module COMAC PoliceC6.py Module Police qgis_utils.py QGIS API (390 L) core_utils.py Python pur (220 L) db_connection.py fddcpiax() PG cable_analyzer.py CDI+posemode security_rules.py NFC 11201-A1 comac_db_reader.py BD officielle pcm_parser.py XML .pcm gracethd_reader.py GraceTHD Axione PostgreSQL schema comac db_layer_loader.py Mode Projet BDD (v3.1) dataclasses_results.py Structures KPI (v3.1) LEGENDE UI / Controller Workflows (6) Modules metier Regles securite v3.1 GraceTHD
UI / Controller
Workflows (Orchestration)
Modules metier
Regles securite
Lecteurs donnees
Donnees (PostgreSQL)
db_layer_loader (v3.1)
GraceTHD Axione (v3.1)

4 Police C6 - Refactoring v2.3.0

Architecture fddcpi2 : SRO → PostgreSQL → cables decoupes → intersection appuis → comparaison C6 Excel

718
Lignes PoliceC6.py
752
Lignes police_workflow.py
-78%
Temps extraction (10k poteaux)
-62%
Consommation memoire

Pipeline de filtrage Police C6 v2.3.0

PIPELINE DE FILTRAGE - PoliceC6.py + cable_analyzer.py + async_tasks.py 1. FILTRE SPATIAL (bbox) QgsRectangle + buffer 10% Zone etude → bbox etendu QgsFeatureRequest.setFilterRect() build_spatial_index() cache -80% temps extraction 2. FILTRE CABLE cab_type = 'CDI' uniquement Avant: cab_type != 'RAC' Types: CDI, RAC, TRA... Seul CDI = distribution cable_analyzer.py L364 3. FILTRE POSEMODE posemode in (1, 2) 1 = aerien 2 = facade 0 exclu 0=souterrain, 4=indefini → EXCLU async_tasks.py L619 4. EXCLUSION EDF Colonne AB (Effort disponible) Renseigne=FT Vide=EDF exclu lire_annexe_c6() L390-427 Appuis EDF elimines AVANT v2.3.0 Temps (10k poteaux): ~45s Memoire (50k poteaux): ~800 MB Filtre cable: cab_type != 'RAC' (trop large) Cleanup memoire: AUCUN (fuite ~500 MB) APRES v2.3.0 Temps (10k poteaux): <10s (-78%) Memoire (50k poteaux): <300 MB (-62%) Filtre cable: CDI + posemode(1,2) (precis) Cleanup memoire: pot_cache.clear() etc. (explicite) CORRECTIONS CRITIQUES IMPLEMENTEES CRIT-001: Filtres spatiaux QgsRectangle bbox + buffer -80% temps, -70% memoire PoliceC6.py L611-627 CRIT-003: Cleanup memoire pot_cache, bpe_cache .clear() Evite fuite 500 MB PoliceC6.py L932-942 CRIT-004: Division zero Guards portee/capacite_fo Validation None, <0 security_rules.py L234-346 CRIT-006: Fix injection SQL Avant: f"{champs} LIKE '{val}'" Apres: double quotes colonnes PoliceC6.py L1068
Filtre spatial
Filtre cable CDI
Filtre posemode
Exclusion EDF

FDDCPI2(SRO)

Fonction Dynamique de Découpage des Câbles par Point d'Infrastructure

PostgreSQL PostGIS EPSG:2154
AVANT 2 câbles continus + 7 points infra Câble Poteau (pot_) Chambre (chb_) Attache (atr_) Câble 1 (gid=1) Câble 2 (gid=2) pot_001 pot_002 chb_001 pot_003 pot_004 atr_FAC chb_002 gid: 1, 2 | geom: LINESTRING fddcpi2(zasro) / fddcpiax(zasro) rip_avg_nge | plpgsql | AUVERGNE | v3.1: dual-path NGE (0.20m) / Axione (0.70m) 1 infra(SRO) Collect points : pot_ + chb_ + atr_ 2 fdrca(SRO) Recalage : alignement câbles sur infra 3 ST_Snap(cable, infra, 0.2m) Accrochage câbles aux points (20cm) 4 ST_Split + ST_Dump Découpage géométrique aux points infra Filtre longueur > 0.2m | doublons éliminés 5 Posemode Analyse endpoints → type de pose 0 sout. 1 aérien 2 façade 4 indéf. APRÈS 7 segments + posemode assigné aérien pot↔pot souterrain chb↔* façade *↔atr_FAC indéfini DQE/??? 1.1 1.2 1.3 1.4 ? 2.1 2.2 2.3 7 segments | posemode assigné Table résultat fddcpiax() gid_dc2 gid cab_type posemode endpoints gid_dc2 gid cab_type posemode endpoints 1 1 CDI 1 pot→pot 2 1 CDI 0 pot→chb 3 1 CDI 0 chb→pot 4 1 CDI 4 pot→??? 5 2 CDI 2 pot→FAC 6 2 CDI 0 FAC→chb 7 2 CDI 0 chb→??? Règles de détermination du posemode 0 SOUTERRAIN chb↔chb, pot↔chb, atr_ADR 1 AÉRIEN pot↔pot, pot↔atr_IMM 2 FAÇADE *↔atr_FAC (prioritaire) 4 INDÉFINI DQE / endpoints inconnus Tolérance: 20cm | Filtre: longueur > 0.2m | Résultat dynamique (pas de table physique) Pipeline SQL interne 1. infra(SRO) → collecte poteaux, chambres, attaches de la zone 2. fdrca(SRO) → recalage et alignement des câbles sur l'infrastructure 3. ST_Snap(cable, infra, 0.70m) → accrochage géométrique 4. ST_Split + ST_Dump → découpage et extraction des segments 5. Endpoints → détermination du posemode (0/1/2/4) Source: fddcpi2(NGE) / fddcpiax(Axione) | Serveur: AUVERGNE (10.241.228.107) | Dépendances: infra(), fdrca()
Poteau (pot_)
Chambre (chb_)
Attache (atr_)
Aérien (1)
Souterrain (0)
Façade (2)

cable_analyzer.py

Nouveau module (402 lignes) : compter_cables_par_appui(), analyser_charge_appuis(). Filtre combine CDI + posemode pour comptage precis.

Workflow async PoliceWorkflow

768 lignes. Architecture fddcpi2 : SRO depuis QGIS → db_connection.py appelle fddcpi2() PostgreSQL → CableSegment → cable_analyzer.py intersecte appuis.

db_connection.py + PostgreSQL

Connexion psycopg2 auto (credentials QGIS). Fonction SQL fddcpi2() retourne cables decoupes. Schema comac : 591 cables, hypotheses. Serveur AUVERGNE 10.241.228.107.

1 Module C6 vs BD - Architecture complete

Comparaison intelligente des fichiers Excel C6 avec la base de données QGIS

382
Lignes C6_vs_Bd.py
218
Lignes c6bd_workflow.py
7s
Temps analyse (19 études)
-84%
Gain performance

Architecture asynchrone non-bloquante

MAIN THREAD START start_analysis() Auto-detect champ 5% STEP 1 extract_in() QgsSpatialIndex 25% STEP 2 extract_out() Hors périmètre 40% STEP 3 verify_etudes() CAP FT vs C6 50% QTimer 0ms entre chaque étape QgsTask WORKER THREAD STEP 4 - C6BdTask Worker Thread Non-bloquant Lecture fichiers Excel C6 Filtrage intelligent auto Fusion données QGIS Export Excel 3 feuilles 50% → 100% SOURCES Répertoire C6 Filtrage: FicheAppui, C7, GESPOT Détection feuille/colonne auto Couche QGIS: infra_pt_pot RÉSULTATS - Excel Multi-feuilles ANALYSE C6 BD Comparaison poteau par poteau HORS PERIMETRE Poteaux FT non couverts VERIF ETUDES Études sans C6 / C6 sans étude PERFORMANCE 7s pour 19 études Avant: ~45s -84% 5% 25% 40% 50% 100% UI reste 100% réactive - Annulation possible à tout moment
Orchestration
Extraction QGIS
Worker Thread
Performance

Auto-détection champ étude

Reconnaissance automatique via patterns regex: nom_etudes, etudes, decoupage, zone. Plus besoin de sélection manuelle.

Filtrage intelligent

Ignore automatiquement les fichiers non-C6: FicheAppui_*.xlsx, *_C7*.xlsx, GESPOT_*.xlsx. Zéro erreur de parsing.

Index spatial O(n log m)

Utilise QgsSpatialIndex pour intersections géométriques ultra-rapides. Cache géométries polygones CAP FT.

2 Module CAP FT - Architecture complete

Vérification correspondance poteaux FT vs fiches appuis individuelles

154
Lignes CapFt.py
110
Lignes capft_workflow.py
O(n+m)
Complexité index rapide
~95%
Gain temps traitement

Architecture Main Thread + Worker Thread

MAIN THREAD 1. Vérifications verificationsDonneesCapft() Doublons / Poteaux hors zone 2. Extraction liste_poteau_cap_ft() Intersection spatiale 3. CapFtWorkflow.start_analysis() Lancement CapFtTask (QgsTask) QgsTask WORKER THREAD 4. Lecture LectureFichiers FicheAppui_*.xlsx Par dossiers études 5. Comparaison traitementResultats Index O(n+m) Lookup O(1) 6. Export ecrireResultats ANALYSE CAP_FT Excel coloré NORMALISATION normalize_appui_num_bt() E000123, FicheAppui_E123.xlsx → 123 strip_e_prefix=True RÉSULTATS ROUGE ORANGE BLANC OK Bidirectionnel SIGNAUX WORKFLOW → UI progress_changed 0% → 100% message_received Message + couleur analysis_finished Résultats analyse export_finished Confirmation error_occurred Erreur critique PERFORMANCE O(n+m) Index rapide ~95% Gain temps EXPÉRIENCE UTILISATEUR UI 100% réactive pendant traitement Annulation possible à tout moment via task.cancel() Deep copy données pour isolation thread-safe
Main Thread (QGIS API)
Worker Thread (Python pur)
Traitement intensif
Communication async

Pattern FicheAppui_*.xlsx

Structure: 1 fichier par poteau. Organisation par dossiers études. Extraction nom fichier → Numéro appui automatique.

Normalisation robuste

Gestion formats variables: E000123, FicheAppui_E123.xlsx, E123/63041. Fonction normalize_appui_num_bt(strip_e_prefix=True).

Détection terrains privés

Extraction simultanée poteaux normaux et privés via champ spécifique. Retour: (dict_poteaux, dict_poteaux_prives).

0 MAJ BD - Consolidation v2.3.0

3 chemins d'execution dupliques → 1 chemin unique SQL background

800
Lignes Maj_Ft_Bt.py
328
Lignes maj_workflow.py
-716
Lignes supprimees Maj_Ft_Bt
6
Bugs corriges

Consolidation MAJ BD : 3 chemins → 1 chemin unique

AVANT v2.3.0 - 3 chemins dupliques 1. SYNCHRONE miseAjourFinalDesDonneesFT/BT() - Bloque UI SUPPRIME 2. INCREMENTAL (QTimer) _prepare/_apply/_finalize_update_ft/bt - Semi-async SUPPRIME 3. SQL BACKGROUND MajSqlBackgroundTask - SQL direct PostgreSQL, thread background GARDE v2.3.0 APRES v2.3.0 - Chemin unique CONFIRMER PoleAerien.py MajWorkflow start_updates_ sql_background() SQL Task Background Thread Avantages : SQL direct PostgreSQL (pas de QGIS API) Thread background (UI non bloquee) Rollback atomique si erreur Triggers PostgreSQL auto (inf_num, nommage) pending_comment centralise (pas d'ecrasement) 6 BUGS CORRIGES DANS LA CONSOLIDATION BUG-1: Commentaire FT IMPLANTATION Manquant dans SQL background → Ajoute BUG-2: inf_num=NULL → trigger nommage BUG-3: gids_pot_ac_bt perdu en BT Trigger ne se declenchait jamais → Corrige BUG-4: Conflit IMPLANTATION + zone_privee BUG-5: inf_mat hardcode 'BS8' Fallback FT implantation → Corrige BUG-6: Slash en tete quand commentaire NULL CODE SUPPRIME (Maj_Ft_Bt.py: 1591 → 800 lignes) MajUpdateTask, miseAjourFinalDesDonnees, miseAjourFinalDesDonneesFT/BT _prepare/_apply/_finalize_update_ft/bt, _execSqlTriggerBatch Imports: QApplication, QgsFeature, QgsGeometry, QgsPointXY, QSqlDatabase, QSqlQuery -791 lignes totales (Maj_Ft_Bt + maj_workflow + PoleAerien) CHEMIN UNIQUE CONSERVE maj_workflow.py → start_updates_sql_background() maj_sql_background.py → MajSqlBackgroundTask (388 lignes) SQL direct: UPDATE infra_pt_pot SET ... WHERE ... Rollback atomique + CRIT-005 transactions
Chemin supprime
Chemin conserve (SQL background)
Bugs corriges

Workflow d'utilisation

Processus étape par étape pour une utilisation optimale

Layers

Charger les couches QGIS + connexion PostgreSQL

Importez les couches dans votre projet QGIS et vérifiez la connexion PostgreSQL (serveur AUVERGNE, 10.241.228.107).

# Couches QGIS requises infra_pt_pot # Table poteaux (Point, PostgreSQL) etude_cap_ft # Périmètres CAP_FT (Polygon) cables_dc # Câbles découpés (via fddcpi2) # PostgreSQL: schema comac (591 câbles, hypotheses)
Settings

Selectionner le dossier projet

Ouvrez le plugin via Extensions > Pole Aerien. Selectionnez le dossier projet : le project_detector identifie automatiquement les fichiers et active les modules disponibles. Cochez les modules souhaites.

Play

Demarrer l'analyse par lot

Cliquez sur Demarrer. Le BatchRunner execute les modules coches sequentiellement via QgsTask en arriere-plan. La barre de progression et le journal montrent l'avancement en temps reel. QGIS reste utilisable.

Export

Consulter les resultats

Les rapports Excel sont generes automatiquement (openpyxl, coloration conditionnelle). Pour MAJ BD, le SQL s'execute en background avec rollback atomique. Les resultats sont affiches dans le journal du dialog.

Détail des modules

Spécifications techniques de chaque composant

Module Fonction Entrées Sorties
MAJ FT/BT MAJ attributs poteaux via SQL background (chemin unique v2.3.0) Excel .xlsx, couches QGIS, PostgreSQL Table modifiée, rollback atomique
CAP_FT Vérification fichiers capacitaires FT (154 L + 110 L workflow) Répertoire FicheAppui_*.xlsx, couches Rapport .xlsx coloré
COMAC Contrôle données COMAC via PostgreSQL natif (564 L) Répertoire COMAC, PostgreSQL (schema comac) Rapport .xlsx + VERIF_SECURITE
C6 vs BD Comparaison C6 / BD async (382 L + 218 L workflow) Fichiers C6, couches, QgsSpatialIndex Excel 3 feuilles, -84% temps
C6/C3A/C7 Analyse croisée multi-fichiers (406 L + 217 L workflow) C6, C3A, C7, couches Rapport consolidé
Police C6 fddcpi2 : SRO→PG→cables→appuis→C6 (718 L + 768 L wf) C6 Excel, infra_pt_pot, fddcpi2() PG, cable_analyzer Rapport conformité, -78% temps
VERIF_SECURITE Portées câbles NFC 11201-A1 (434 L security_rules.py) Excel COMAC, zone climatique ZVN/ZVF Feuille VERIF_SECURITE (OK/PORTEE MOLLE)
Norme NFC 11201-A1

Zones Climatiques

Comprendre l'impact du vent sur les portées maximales des câbles aériens

Carte interactive des vents en temps réel - Source: Windy.com

Rechercher une commune

ZVN - Vent Normal
ZVF - Vent Fort
Portées maximales autorisées (mètres)
6 FO
81m
79m
12 FO
77m
74m
24 FO
73m
73m
48 FO
78m
78m
72 FO
77m
77m

Foire aux questions

Tout ce qu'il faut savoir pour exploiter pleinement le plugin

Général

Quelle version de QGIS est requise ?

+

Le plugin Pole Aerien v3.0 est compatible avec QGIS 3.28 et les versions ulterieures (jusqu'a 3.99). Nous recommandons la version 3.28 LTS pour la stabilite en production. Le plugin utilise PostgreSQL comme base de donnees principale (schema comac, AUVERGNE).

Remarque : Les versions antérieures à 3.28 ne sont plus officiellement prises en charge. Si vous rencontrez des difficultés, vérifiez d'abord votre version de QGIS.

Quelles sont les couches QGIS indispensables ?

+

Selon les modules utilisés, les couches suivantes doivent être chargées dans votre projet :

  • infra_pt_pot : Poteaux (points) avec les champs inf_num, inf_type, etat
  • etude_cap_ft : Zones d'études FT (polygones) avec le champ nom_etudes
  • etude_comac : Zones d'études BT (polygones) avec le champ etudes
  • bpe : Boîtes de protection équipement (points)
  • attaches : Points d'attache (points)
  • infra_pt_chb : Chambres (points) - requis pour Police C6

Les noms des couches doivent correspondre exactement à ceux attendus par le plugin.

Est-il possible d'annuler une modification ?

+

Oui, de plusieurs manières :

  • Annulation immédiate : Utilisez Ctrl+Z dans QGIS juste après l'opération.
  • Restauration : Rechargez la couche depuis la base de données si les modifications n'ont pas été enregistrées.
  • Sauvegarde préalable : Nous conseillons vivement d'effectuer une sauvegarde de votre base de données avant toute mise à jour en lot.
Modules métier

Quels champs sont mis à jour par le module MAJ FT/BT ?

+

Le module de mise à jour des poteaux FT/BT modifie les champs suivants :

inf_type inf_propri noe_usage inf_mat etat dce

Les champs d'audit modifie_par et date_modif sont également renseignés automatiquement pour assurer la traçabilité.

Comment fonctionne le module C6 vs BD ?

+

Ce module compare les fichiers Excel Annexe C6 avec les données présentes dans QGIS afin d'identifier les écarts :

  • Extraction IN : Poteaux FT situés à l'intérieur des périmètres d'études CAP FT
  • Extraction OUT : Poteaux FT hors périmètre (alerte potentielle)
  • Vérification croisée : Études sans fichier C6 correspondant, et inversement

Le résultat est exporté dans un fichier Excel comportant trois feuilles : Analyse C6 BD, Poteaux hors périmètre et Vérification études.

Qu'est-ce que la vérification des portées molles ?

+

Le module VERIF CAP_COMAC analyse les portées de câbles fibre optique selon la norme NFC 11201-A1.

Le processus s'effectue comme suit :

  1. Lecture des colonnes AO (type de ligne FO) et AU (portée en mètres) des fichiers COMAC
  2. Détection de la capacité FO via les codes Prysmian (ex. : L1092-xx-P)
  3. Comparaison avec les valeurs maximales autorisées selon la zone climatique (ZVN ou ZVF)

Les dépassements sont signalés comme « PORTÉE MOLLE » et nécessitent une vérification terrain.

Police C6 & Données

Quelles sont les sources de données pour Police C6 ?

+

Le module Police C6 utilise plusieurs sources de données :

  • Couches QGIS : infra_pt_pot, cables_dc et couches réseau chargées dans le projet
  • Fichier C6 Excel : Auto-détecté par nom_etudes dans le répertoire de travail
  • Données COMAC : Via PostgreSQL exclusivement (schéma comac, serveur AUVERGNE)
  • cable_analyzer.py : Comptage câbles CDI + posemode(1,2) par appui

v2.3.0 : Filtres spatiaux bbox, exclusion appuis EDF, cleanup mémoire. Données COMAC via PostgreSQL uniquement (plus de GeoPackage/CSV/SQLite).

Qu'est-ce que l'auto-détection du fichier C6 ?

+

Lorsque le dossier projet est selectionne, le project_detector identifie automatiquement les fichiers C6 dans le dossier CAP FT. Les annexes C6 sont les Excel d'etude (FTTH-NGE-ETUDE-*.xlsx) situes dans les sous-dossiers CMD du dossier CAP FT.

Motifs de recherche utilises :

*nom_etudes*.xlsx *Annexe*C6*nom_etudes*.xlsx *C6*nom_etudes*.xlsx

La detection est automatique lors de la selection du dossier projet.

Résolution de problèmes

Pourquoi certains numéros d'appui ne correspondent-ils pas ?

+

La correspondance des numéros d'appui repose sur le couple N° appui + Nom d'études. Vérifiez les points suivants :

  • Format : Le numéro doit être identique (ex. : 1016436/63041 est normalisé en 1016436)
  • Nom d'études : Les noms doivent correspondre exactement (attention aux variantes QSB/DTR)
  • Espaces parasites : Des espaces en début ou fin de cellule peuvent fausser la correspondance

Astuce : Utilisez la fonction SUPPRESPACE() dans Excel pour nettoyer vos données avant l'import.

Que faire si le bouton "Demarrer" ne fonctionne pas ?

+

Le bouton "Demarrer l'analyse" necessite que les conditions suivantes soient remplies :

  • Dossier projet : Un dossier projet valide doit etre selectionne
  • Modules coches : Au moins un module doit etre selectionne (coche)
  • Couches QGIS : Les couches requises (infra_pt_pot, etude_cap_ft, etude_comac) doivent etre chargees dans le projet QGIS
  • Connexion PostgreSQL : La connexion au serveur AUVERGNE doit etre active pour les modules Police C6 et COMAC

Comment fonctionne le Mode Projet (BDD) ?

+

Le Mode Projet permet de charger les couches QGIS directement depuis PostgreSQL, filtrees par SRO :

  • SRO automatique : derive du nom de dossier (ex: 63041-B1I-PMZ-00003 donne SRO 63041/B1I/PMZ/00003)
  • Chargement async : les couches sont chargees en thread background (pas de freeze UI)
  • 3 couches : infra_pt_pot, etude_cap_ft, etude_comac filtrees par SRO
  • Cleanup auto : les couches temporaires sont supprimees apres le batch (sauf si "Charger dans le projet" coche)

Prerequis : La connexion PostgreSQL au serveur AUVERGNE doit etre configuree dans QGIS. Le nom du dossier projet doit suivre le format SRO (segments separes par des tirets).

Quelle est la difference entre NGE et Axione (GraceTHD) ?

+

Le plugin detecte automatiquement le type de bureau d'etudes (BE) via la table comac.sro_nge_axione :

  • NGE : Pipeline classique via fddcpi2 PostgreSQL. Cables deja recales sur l'infrastructure. Match par endpoints.
  • Axione : Pipeline fddcpiax avec ST_Snap tolerance elargie (0.70m). Cables decales par rapport aux poteaux. Utilise aussi GraceTHD local (fichiers SHP+CSV) si present.

Important : Les modifications GraceTHD/Axione n'impactent jamais le code NGE. Les chemins sont proteges par des conditions if be_type == 'axione'.

Comment signaler une anomalie ou suggérer une amélioration ?

+

Pour tout signalement, contactez Youcef ADDA en fournissant les informations suivantes :

  • Version de QGIS et du plugin Pôle Aérien
  • Message d'erreur complet (copie du panneau « Journal des messages »)
  • Étapes précises permettant de reproduire le problème
  • Captures d'écran si pertinent

Nouveautes v3.1

GraceTHD Axione, Mode Projet BDD, 4 sprints d'optimisation, ameliorations Police C6, COMAC et UX

GraceTHD Axione

Pipeline alternatif complet pour SRO Axione via fichiers locaux SHP+CSV. Detection auto NGE vs Axione via comac.sro_nge_axione. Fonction SQL fddcpiax avec ST_Snap tolerance elargie (0.70m). Match mode ligne pour cables BPE-to-BPE.

Fichiers : gracethd_reader.py, fddcpiax (SQL), db_connection.py (routage auto NGE/Axione)

Mode Projet (BDD)

Couches PostgreSQL par SRO derive du nom de dossier. Chargement async en background thread (_LoadProjectLayersTask). DbLayerLoader pour infra_pt_pot, etude_cap_ft, etude_comac filtres par SRO.

UX : Toggle radio, SRO display monospace, option "Charger dans le projet", cleanup auto apres batch

4 Sprints Optimisation

-30% a -40% temps batch. Caches inter-modules (fddcpi2, SRO, appuis_wkb, CRS). Extractions single-pass. Centralisation credentials PG. Connexions PG de ~10 a ~3.

  • Sprint 1 : Fusion extractions, connexion PG unique, detect_etude_field centralise
  • Sprint 2 : Cache SRO+appuis_wkb, comparer_source_cables() generique (-140 lignes)
  • Sprint 3 : CRS validation cache, centralisation credentials PG
  • Sprint 4 : Dead code cleanup (-414 lignes), factorisation Excel et MAJ

Police C6 avancee

Bold-only C6 : seuls les cables en gras (nouveaux) sont compares. Attaches-aware : verification cables et BPE de chaque cote des attaches. Compteur [i/N] par etude. Bilan post-boucle.

Fix : Liaison vs cable confusion (re.match L+digit), fddcpiax routage auto NGE/Axione

COMAC enrichi

Boitiers fibre optique : col AR (idx 43), extraction oui+non, verification BPE pour oui uniquement. group_by_gid : comptage cables physiques (pas segments). Normalisation appuis unifiee.

Hors-perimetre : log et Excel indiquent clairement filtrage SRO + message diagnostic

UX et Robustesse

Disambiguation inline pour multi-candidats. Diagnostic 6 sections. Preflight global avant batch. Persistance etat QgsSettings. Liens cliquables. Standalone C6 folder detection.

  • Patterns detection elargis (ETUDE COMAC, KPFT, etc.)
  • Rapport unifie multi-modules (unified_report.py)
  • Recap post-batch avec metriques par module

Workflow Police C6 - v3.1 : bold-only, attaches-aware, dual-path NGE/Axione, compteur [i/N]

1. Sélection étude Filtre Valeur: NGE-63A2D-73463-PA-21 AUTO 2. Auto-détection Recherche patterns: *nom_etudes*.xlsx *C6*nom_etudes*.xlsx 3. fddcpi2() SRO → PostgreSQL: db_connection.py cables decoupes retournes AUTO 4. Analyse cable_analyzer.py: • CDI + posemode(1,2) • Intersection appuis • Comparaison C6 Avant v2.2.4 • Recherche manuelle fichier C6 • Sélection manuelle fichier C6 = 2 étapes supplémentaires Depuis v2.2.4 • Auto-détection fichier C6 • PostgreSQL COMAC natif = Workflow simplifié ! Temps gagné ~30 sec par analyse
Interaction utilisateur
Automatique (nouveau)
Données internes
Traitement

Architecture v3.1 : 26 fichiers Python • ~10 500 lignes • 6 workflows • PostgreSQL natif • GraceTHD Axione • Mode Projet BDD • 4 sprints optimisation