Strategy SELECT puis INSERT/UPDATE plutot que ON CONFLICT:
- Cherche par ioda_libelle d'abord, sinon par nom_court (apps non-IODA)
- Si UPDATE existant -> enrichit avec champs IODA
- Si INSERT et nom_court deja pris -> suffixe avec -IODA-<POS>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Le fichier IODA a parfois des integers/floats dans lib_court ou autres
cols texte. Helper s() coerce + trim + None si vide.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Source 1 (poids 3): Ayoub/Serveurs patchables 2026
Source 2 (poids 2): Plan de Patching/Histo-2025
Source 3 (poids 1 chacune): Plan de Patching/S02..S52 weekly
Source 4 (poids 1): fallback domain_environments
Par hostname et par role (responsable/referent), retient le nom au score max.
Canonicalise via contacts.name (case/accent-insensitive) avant ecriture.
Pour chaque serveur avec fond vert col A: insere patch_history avec
date (col N), heure (col O si presente), note 'Semaine XX'. Fallback
sur le lundi de la semaine ISO si pas de date.
cleanup_referentiel: aligne envs sur canoniques iTop (Test1/Test2->Test,
Developpement->Développement, Pre-production->Pré-Prod) + fusion domains
avec stem (Peages->Péage).
fill_emails --overwrite: force la reecriture des emails existants.
Contourne l'export Interface Réseau (souvent incomplet). Utilise la
colonne IP directe du CSV VMs (attribut iTop sur la VM) + VRF si
present. Gère plusieurs IPs separees par virgule.
Cree server_databases (FK servers.id, UNIQUE hostname+instance_name).
Pour chaque instance BDD iTop: match hostname via Serveur->Nom, store
type (SAP Hana/Oracle/PostgreSQL/SQL Server/MySQL), version, edition,
cluster, environnement, etat.
Fusionne 'Flux Libre'/'flux libre', 'Péage'/'peage'/'PeagE' en gardant la
forme propre (avec accents et capitale). Update domain_environments.domain_id
vers le keeper et supprime les doublons.
Auto-cree les domains / environments / domain_environments absents en
utilisant les valeurs iTop verbatim (domains.name='BI', etc.), avec codes
slug auto-generes (evite collision).
Pour chaque serveur:
- set servers.domain_env_id vers la paire (domaine, env)
- sync servers.environnement plain-text (pour filtre/affichage existant)
- populate domain_environments.responsable_nom / referent_nom si NULL
Preserve les valeurs existantes non-NULL dans domain_environments.
Lit la sheet 'Serveurs patchables 2026' et met a jour pour chaque hostname :
- domaine (nouvelle colonne text iTop verbatim, ajoutee si absente)
- environnement (override si non vide)
- responsable_nom (Responsable Domaine DTS)
- referent_nom (Referent technique)
Pas de jointure via domain_env_id: stockage plain-text aligne sur iTop.
Dry-run affiche les diff avant/apres.