Probleme initial: nom snap base sur 'intervenant' (champ libre Excel modifiable) -> peu fiable
pour identifier qui a cree le snap. De plus, sans heure dans le nom, collisions si meme
serveur patche 2x dans la journee.
Solution:
- Format snap PatchCenter v2: <user_jwt>_YYYY-MM-DD_HH-MM_avant_patch
user = login JWT (sub) immutable, traçable cote AD
HH-MM ajoute pour eviter collisions
- Service: nouveau regex SNAP_PATCHCENTER_V2_RE (avec heure), v1 conservee pour
les snapshots existants legacy
- Router iexec_snapshot: utilise user.get('sub') au lieu de row.intervenant
- UI:
* Renomme checkbox 'Format gere' -> 'Snapshots PatchCenter uniquement'
* Filtre origin === 'patchcenter' (exclut SLPM .exe par defaut)
* Combine avec 'Mes snapshots' (author = login user) -> seulement TES snapshots
PatchCenter visibles, parfait pour le cleanup post-patching
- Regex WINDOWS_OS_RE: \bwin(dows)?\b ou 'microsoft' insensible casse
- _is_skipped_os(os) : true si OS Windows
- Skip dans la boucle, comptage skipped_windows
- Append au note de l'import un suffix '[skip-windows: N ligne(s) Windows ignoree(s)]'
pour tracer combien de rows ont ete filtrees
lastval() retourne la derniere valeur de sequence de la session — si un trigger sur
patch_planning_imports bumpe une autre sequence (ex: audit log), lastval() retourne
la mauvaise valeur. Resultat: import_id pointe vers un ID inexistant et les INSERT
sur patch_planning_import_rows echouent en FK violation.
Fix: INSERT ... RETURNING id qui est sans ambiguite, et early-return si NULL.
- Migration migrate_pct_workflow_20260507.sql: ajoute patch_planning_import_rows
pct_required (boolean default false), pct_confirmed_at (timestamptz),
pct_confirmed_by_user_id (FK users). Backfill depuis servers.pct_required.
- Auto-detection a l'import (planning_import.py): scan referent_technique +
mode_operatoire + impacts + commentaire pour pattern \bPCT\b mot entier
(insensible casse) -> pct_required=true sur la row. Propage egalement vers
servers.pct_required si pas deja true.
- UI iexec: badge orange '⚠ Prév PCT à faire' sur la cellule asset_name si
pct_required=true et pas confirme, badge vert '✅ PCT ok' une fois confirme.
- Gate avant Step 3 (PATCH REEL): scan des serveurs cibles, si certains ont
pct_required && !pct_confirmed -> 2 confirmations successives + appel
POST /patching/iexec/confirm-pct qui marque pct_confirmed_at + user_id.
Ne lance pas le patch si l'operateur annule.
- Endpoint POST /patching/iexec/confirm-pct: marque les rows comme PCT confirmes
(pct_confirmed_at = now(), pct_confirmed_by_user_id = current user).
- Notif Teams: send_notification accepte planning_row_id optionnel ; si la row
a pct_required && pct_confirmed, le message debut/fin est suffixe par
' (Prévenance PCT ok)' pour informer le responsable que l'amont a ete gere.