diff --git a/app/routers/planning_import.py b/app/routers/planning_import.py index 99f587f..8812394 100644 --- a/app/routers/planning_import.py +++ b/app/routers/planning_import.py @@ -922,7 +922,347 @@ async def iexec_snapshot(request: Request, row_id: int, db=Depends(get_db)): return JSONResponse(result) -def _common_iexec_row_check(row_id: int, db, user, perms): +# ──────────────────────────────────────────────────────────────────────── +# Prévenance PCT — envoi d'un mail à PCT.reims@sanef.com pour annoncer +# une intervention sur un ou plusieurs serveurs sélectionnés. +# ──────────────────────────────────────────────────────────────────────── + +def _build_pct_email(rows, intervenant_name=""): + """Construit (subject, html_body) pour la prévenance PCT à partir de rows. + rows = list de tuples (asset_name, application_name, jour, heure, environnement, domaine). + """ + from datetime import datetime as _dt + # Détermine le sujet + apps = [r["application_name"] for r in rows if r.get("application_name")] + distinct_apps = sorted(set(a.strip() for a in apps if a and a.strip())) + server_names = [r["asset_name"] for r in rows if r.get("asset_name")] + + if len(distinct_apps) == 1: + target_label = distinct_apps[0] + elif len(distinct_apps) > 1: + target_label = ", ".join(distinct_apps) + elif server_names: + target_label = ", ".join(server_names) + else: + target_label = "(serveurs non identifiés)" + + subject = f"Intervention sur {target_label}" + + # Plage horaire = 20 min × N serveurs + n = len(rows) + plage_min = n * 20 + h = plage_min // 60 + m = plage_min % 60 + if h and m: + plage_str = f"{h}h{m:02d} (≈ {n} serveur(s) × 20 min)" + elif h: + plage_str = f"{h}h00 (≈ {n} serveur(s) × 20 min)" + else: + plage_str = f"{m} min (≈ {n} serveur(s) × 20 min)" + + # Liste serveurs avec date/heure + def _fmt_dh(jour, heure): + if not jour and not heure: + return "(non planifié)" + d_str = "" + if jour: + try: + d_str = jour.strftime("%d/%m/%Y") if hasattr(jour, "strftime") else str(jour) + except Exception: + d_str = str(jour) + h_str = "" + if heure: + try: + h_str = heure.strftime("%H:%M") if hasattr(heure, "strftime") else str(heure) + except Exception: + h_str = str(heure) + return (d_str + (" à " + h_str if h_str else "")).strip() or "(non planifié)" + + serv_table_rows = "" + for r in rows: + srv = r.get("asset_name") or "?" + dh = _fmt_dh(r.get("jour"), r.get("heure_t")) + env = r.get("environnement") or "" + app = r.get("application_name") or "" + serv_table_rows += ( + f'
| + + |