{"id":15953,"date":"2026-05-01T02:24:08","date_gmt":"2026-05-01T01:24:08","guid":{"rendered":"https:\/\/elearning.nasla.cm\/?page_id=15953"},"modified":"2026-05-04T23:27:54","modified_gmt":"2026-05-04T22:27:54","slug":"dailytracker","status":"publish","type":"page","link":"https:\/\/elearning.nasla.cm\/index.php\/dailytracker\/","title":{"rendered":"Suivi journalier Agents DF"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15953\" class=\"elementor elementor-15953\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-1502165 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"1502165\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9b99b30\" data-id=\"9b99b30\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e1efc9e elementor-widget elementor-widget-html\" data-id=\"e1efc9e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Journal de bord - NASLA Division de la Formation<\/title>\n<style>\n:root {\n  --fi-dark:#1A4A7A; --fi-mid:#2E75B6; --fi-light:#E8F0FB; --fi-xlight:#F2F7FD;\n  --fc-dark:#6B3A00; --fc-mid:#C55A11; --fc-light:#FDF0E6; --fc-xlight:#FFF7F2;\n  --dark:#111827; --mid:#374151; --muted:#6B7280; --light-muted:#9CA3AF;\n  --border:#E5E7EB; --bg:#F9FAFB; --white:#FFFFFF;\n  --success-dark:#065F46; --success-light:#D1FAE5;\n  --warn-dark:#92400E; --warn-light:#FEF3C7;\n  --danger-dark:#991B1B; --danger-light:#FEE2E2;\n  --info-dark:#1E40AF; --info-light:#DBEAFE;\n  --radius:10px; --shadow:0 1px 3px rgba(0,0,0,.08);\n}\n*{box-sizing:border-box;margin:0;padding:0;}\nbody{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(--dark);min-height:100vh;}\n.app{max-width:660px;margin:0 auto;padding:0 16px 80px;}\n\n\/* HEADER *\/\n.hdr{background:var(--dark);color:#fff;padding:16px 20px 14px;margin:0 -16px 18px;position:sticky;top:0;z-index:100;}\n.hdr-top{display:flex;align-items:center;gap:12px;margin-bottom:10px;}\n.hdr-logo{width:36px;height:36px;background:#fff;border-radius:8px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}\n.hdr-logo svg{width:22px;height:22px;}\n.hdr-text h1{font-size:14px;font-weight:700;}\n.hdr-text p{font-size:11px;opacity:.55;margin-top:1px;}\n.prog-track{height:3px;background:rgba(255,255,255,.15);border-radius:2px;}\n.prog-bar{height:100%;border-radius:2px;background:linear-gradient(90deg,#3B82F6,#10B981);transition:width .4s;}\n\n\/* CELLULE BANNER *\/\n.cellule-banner{display:none;border-radius:var(--radius);padding:10px 14px;margin-bottom:12px;font-size:12px;font-weight:600;border:1px solid transparent;}\n.cellule-banner.fi{background:var(--fi-light);color:var(--fi-dark);border-color:#BFDBFE;}\n.cellule-banner.fcs{background:var(--fc-light);color:var(--fc-dark);border-color:#FED7AA;}\n.cellule-banner.show{display:flex;align-items:center;gap:8px;}\n.banner-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}\n\n\/* CARDS *\/\n.card{background:var(--white);border:1px solid var(--border);border-radius:var(--radius);padding:18px;margin-bottom:12px;box-shadow:var(--shadow);}\n.card-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);margin-bottom:14px;display:flex;align-items:center;gap:7px;}\n.card-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;}\n\n\/* FIELDS *\/\n.field{margin-bottom:12px;}\n.field:last-child{margin-bottom:0;}\n.field label{display:block;font-size:12px;font-weight:600;color:var(--mid);margin-bottom:5px;}\n.field input[type=text],.field input[type=date],.field select,.field textarea{\n  width:100%;padding:9px 12px;border:1px solid var(--border);border-radius:8px;\n  font-size:13px;font-family:inherit;color:var(--dark);background:var(--white);\n  outline:none;transition:border-color .15s,box-shadow .15s;-webkit-appearance:none;\n}\n.field input:focus,.field select:focus,.field textarea:focus{border-color:#3B82F6;box-shadow:0 0 0 3px rgba(59,130,246,.1);}\n.field textarea{resize:vertical;min-height:70px;line-height:1.5;}\n.row2{display:grid;grid-template-columns:1fr 1fr;gap:10px;}\n.hint{font-size:11px;color:var(--muted);margin-top:3px;}\n\n\/* NAME FIELD with memory *\/\n.name-wrap{position:relative;}\n.name-save-btn{position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:10px;padding:3px 8px;border:1px solid var(--border);border-radius:5px;background:var(--bg);cursor:pointer;color:var(--muted);font-family:inherit;transition:all .15s;}\n.name-save-btn:hover{background:var(--dark);color:#fff;border-color:var(--dark);}\n.name-saved-badge{display:none;font-size:10px;color:var(--success-dark);margin-top:3px;font-style:italic;}\n.name-saved-badge.show{display:block;}\n\n\/* SECTION PILOTAGE *\/\n.pilotage-intro{font-size:12px;color:var(--muted);background:var(--bg);border-radius:8px;padding:8px 12px;margin-bottom:12px;border-left:3px solid var(--border);}\n\n\/* PTA ACTIVITIES *\/\n.act-block{border:1px solid var(--border);border-radius:8px;margin-bottom:8px;overflow:hidden;}\n.act-hdr{padding:10px 14px;background:#F9FAFB;font-size:12px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:8px;user-select:none;transition:background .1s;}\n.act-hdr:hover{background:#F3F4F6;}\n.act-code{font-size:10px;font-family:monospace;font-weight:700;padding:2px 6px;border-radius:4px;flex-shrink:0;}\n.act-label{flex:1;color:var(--dark);}\n.act-chev{font-size:10px;color:var(--muted);transition:transform .2s;flex-shrink:0;}\n.act-chev.open{transform:rotate(90deg);}\n.task-list{display:none;}\n.task-list.open{display:block;}\n.task-wrap{border-top:1px solid var(--border);}\n\n\/* TASK ROWS *\/\n.task-row{padding:9px 14px 7px 38px;cursor:pointer;position:relative;transition:background .1s;}\n.task-row:hover{background:#FAFBFF;}\n.task-cb{position:absolute;left:14px;top:10px;width:16px;height:16px;border:1.5px solid #D1D5DB;border-radius:4px;background:#fff;display:flex;align-items:center;justify-content:center;transition:all .15s;flex-shrink:0;}\n.task-cb.on{background:#2563EB;border-color:#2563EB;}\n.task-cb.on::after{content:'';display:block;width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translate(1px,-1px);}\n.task-name{font-size:12px;font-weight:500;color:var(--dark);margin-bottom:1px;}\n.task-freq{font-size:10px;color:var(--muted);}\n\n\/* SUBOPS PANEL *\/\n.subops-panel{display:none;margin:0 14px 8px 38px;padding:10px 12px;background:#F8FAFF;border:1px solid #DBEAFE;border-radius:8px;}\n.subops-panel.open{display:block;}\n.subops-title{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:#3B82F6;margin-bottom:8px;}\n.subop-row{display:flex;align-items:flex-start;gap:8px;padding:4px 0;cursor:pointer;}\n.subop-cb{width:14px;height:14px;border:1.5px solid #93C5FD;border-radius:3px;background:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px;transition:all .15s;}\n.subop-cb.on{background:#3B82F6;border-color:#3B82F6;}\n.subop-cb.on::after{content:'';display:block;width:7px;height:4px;border-left:1.5px solid #fff;border-bottom:1.5px solid #fff;transform:rotate(-45deg) translate(1px,-1px);}\n.subop-label{font-size:11px;color:var(--mid);line-height:1.4;}\n.subop-free{margin-top:8px;}\n.subop-free label{font-size:10px;color:var(--muted);margin-bottom:3px;display:block;}\n.subop-free input{width:100%;padding:6px 9px;border:1px solid #BFDBFE;border-radius:6px;font-size:11px;font-family:inherit;background:#fff;outline:none;color:var(--dark);}\n.subop-free input:focus{border-color:#3B82F6;}\n\n\/* SELECTED RECAP *\/\n.recap-area{min-height:42px;}\n.no-sel{font-size:12px;color:var(--muted);font-style:italic;text-align:center;padding:10px 0;}\n.sel-item{display:flex;align-items:flex-start;gap:8px;padding:8px 10px;background:#EFF6FF;border:1px solid #BFDBFE;border-radius:8px;margin-bottom:5px;}\n.sel-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:4px;background:#DBEAFE;color:#1D4ED8;flex-shrink:0;margin-top:1px;}\n.sel-badge.fcs{background:#FED7AA;color:#92400E;}\n.sel-info{flex:1;min-width:0;}\n.sel-name{font-size:12px;font-weight:500;color:var(--dark);}\n.sel-subs{font-size:11px;color:#2563EB;margin-top:2px;}\n.sel-note{font-size:11px;color:var(--muted);font-style:italic;margin-top:1px;}\n.sel-remove{font-size:18px;color:#93C5FD;cursor:pointer;flex-shrink:0;line-height:1;}\n.sel-remove:hover{color:#EF4444;}\n\n\/* HORS PTA *\/\n.hors-add{display:flex;gap:8px;margin-bottom:8px;}\n.hors-add input{flex:1;}\n.hors-add button{padding:9px 14px;background:var(--dark);color:#fff;border:none;border-radius:8px;font-size:13px;cursor:pointer;font-family:inherit;transition:opacity .15s;white-space:nowrap;}\n.hors-add button:hover{opacity:.85;}\n.hors-item{display:flex;align-items:center;gap:8px;padding:7px 10px;background:var(--warn-light);border:1px solid #FDE68A;border-radius:8px;margin-bottom:5px;font-size:12px;}\n.hors-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:4px;background:#FEF3C7;color:#92400E;flex-shrink:0;}\n.hors-label{flex:1;}\n.hors-rm{font-size:16px;color:#FCD34D;cursor:pointer;}\n.hors-rm:hover{color:#EF4444;}\n\n\/* BILAN *\/\n.bilan-btns{display:flex;gap:8px;margin-bottom:12px;}\n.bilan-btn{flex:1;padding:10px 8px;border:1.5px solid var(--border);border-radius:8px;font-size:12px;font-weight:500;font-family:inherit;background:#fff;cursor:pointer;transition:all .15s;text-align:center;color:var(--mid);}\n.bilan-icon{font-size:18px;display:block;margin-bottom:3px;}\n.bilan-btn.g{background:var(--success-light);border-color:#10B981;color:var(--success-dark);}\n.bilan-btn.a{background:var(--warn-light);border-color:#F59E0B;color:var(--warn-dark);}\n.bilan-btn.r{background:var(--danger-light);border-color:#EF4444;color:var(--danger-dark);}\n\n\/* SUBMIT *\/\n.submit-btn{width:100%;padding:14px;background:var(--dark);color:#fff;border:none;border-radius:var(--radius);font-size:14px;font-weight:600;font-family:inherit;cursor:pointer;transition:all .15s;margin-top:4px;}\n.submit-btn:hover{background:#1F2937;transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,0,0,.2);}\n.submit-btn:disabled{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none;}\n.success-msg{display:none;background:var(--success-light);border:1px solid #10B981;border-radius:var(--radius);padding:14px 18px;margin-top:10px;font-size:13px;font-weight:500;color:var(--success-dark);text-align:center;}\n.success-msg.show{display:block;}\n.export-area{display:none;margin-top:8px;}\n.export-area.show{display:block;}\n.export-btn{width:100%;padding:11px;background:#1D4ED8;color:#fff;border:none;border-radius:8px;font-size:13px;font-weight:600;font-family:inherit;cursor:pointer;transition:opacity .15s;}\n.export-btn:hover{opacity:.9;}\n\n\/* GROUP HEADERS inside task list *\/\n.group-hdr{padding:6px 14px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;border-top:1px solid var(--border);}\n\n@media(max-width:420px){.row2{grid-template-columns:1fr}.bilan-btns{flex-direction:column}}\n<\/style>\n<\/head>\n<body>\n<div class=\"app\">\n\n  <!-- HEADER -->\n  <div class=\"hdr\">\n    <div class=\"hdr-top\">\n      <div class=\"hdr-logo\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#111827\" stroke-width=\"2\" stroke-linecap=\"round\">\n          <rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\"\/>\n          <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\"\/>\n          <line x1=\"9\" y1=\"4\" x2=\"9\" y2=\"9\"\/>\n          <line x1=\"7\" y1=\"13\" x2=\"12\" y2=\"13\"\/>\n          <line x1=\"7\" y1=\"16\" x2=\"10\" y2=\"16\"\/>\n        <\/svg>\n      <\/div>\n      <div class=\"hdr-text\">\n        <h1>Journal de bord quotidien<\/h1>\n        <p>NASLA - Division de la Formation \u00b7 PTA 2026<\/p>\n      <\/div>\n    <\/div>\n    <div class=\"prog-track\"><div class=\"prog-bar\" id=\"prog\" style=\"width:0%\"><\/div><\/div>\n  <\/div>\n\n  <!-- SECTION 1: IDENTIFICATION -->\n  <div class=\"card\">\n    <div class=\"card-title\">\n      <span class=\"card-dot\" style=\"background:#3B82F6\"><\/span>\n      Identification\n    <\/div>\n\n    <div class=\"field\">\n      <label>Nom et pr\u00e9nom *<\/label>\n      <div class=\"name-wrap\">\n        <input type=\"text\" id=\"agent-nom\" placeholder=\"Saisir votre nom et pr\u00e9nom...\" autocomplete=\"off\" oninput=\"onNomInput()\" style=\"padding-right:80px\">\n        <button class=\"name-save-btn\" onclick=\"saveName()\" title=\"M\u00e9moriser ce nom pour demain\">M\u00e9moriser<\/button>\n      <\/div>\n      <div class=\"name-saved-badge\" id=\"name-badge\"><\/div>\n    <\/div>\n\n    <div class=\"row2\">\n      <div class=\"field\">\n        <label>Date *<\/label>\n        <input type=\"date\" id=\"agent-date\" onchange=\"onChange()\">\n      <\/div>\n      <div class=\"field\">\n        <label>Grade \/ Fonction<\/label>\n        <input type=\"text\" id=\"agent-grade\" placeholder=\"Ex : Attach\u00e9 d'Administration\">\n      <\/div>\n    <\/div>\n\n    <div class=\"field\">\n      <label>Cellule d'appartenance *<\/label>\n      <select id=\"agent-cellule\" onchange=\"onCelluleChange()\">\n        <option value=\"\">-- Choisir votre cellule --<\/option>\n        <option value=\"FI\">Cellule de la Formation Initiale<\/option>\n        <option value=\"FCS\">Cellule de la Formation Continue et Sp\u00e9cifique<\/option>\n      <\/select>\n      <div class=\"hint\" id=\"cellule-hint\" style=\"display:none\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- CELLULE BANNER -->\n  <div class=\"cellule-banner\" id=\"cellule-banner\"><\/div>\n\n  <!-- SECTION 2: ACTIVITES DE PILOTAGE -->\n  <div class=\"card\" id=\"card-pilotage\" style=\"display:none\">\n    <div class=\"card-title\">\n      <span class=\"card-dot\" style=\"background:#6B7280\"><\/span>\n      Activit\u00e9s de pilotage et administratives\n    <\/div>\n    <p class=\"pilotage-intro\" id=\"pilotage-intro\"><\/p>\n    <div id=\"pilotage-container\"><\/div>\n  <\/div>\n\n  <!-- SECTION 3: TACHES PTA -->\n  <div class=\"card\" id=\"card-pta\" style=\"display:none\">\n    <div class=\"card-title\">\n      <span class=\"card-dot\" style=\"background:#10B981\"><\/span>\n      T\u00e2ches r\u00e9alis\u00e9es \u2014 inscrites au PTA\n    <\/div>\n    <p class=\"hint\" style=\"margin-bottom:12px\">Cochez les t\u00e2ches accomplies aujourd'hui. D\u00e9veloppez pour pr\u00e9ciser les sous-op\u00e9rations.<\/p>\n    <div id=\"pta-container\"><\/div>\n    <div style=\"margin-top:14px\">\n      <div class=\"card-title\" style=\"margin-bottom:8px\">\n        <span class=\"card-dot\" style=\"background:#3B82F6\"><\/span>R\u00e9capitulatif s\u00e9lection\n      <\/div>\n      <div class=\"recap-area\" id=\"recap-area\">\n        <p class=\"no-sel\">Aucune t\u00e2che s\u00e9lectionn\u00e9e<\/p>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <!-- SECTION 4: HORS PTA -->\n  <div class=\"card\" id=\"card-hors\" style=\"display:none\">\n    <div class=\"card-title\">\n      <span class=\"card-dot\" style=\"background:#F59E0B\"><\/span>\n      Activit\u00e9s hors PTA\n      <span style=\"font-size:10px;font-weight:400;text-transform:none;letter-spacing:0;color:var(--muted)\">(facultatif)<\/span>\n    <\/div>\n    <p class=\"hint\" style=\"margin-bottom:10px\">R\u00e9unions impr\u00e9vues, correspondances, missions non programm\u00e9es au PTA...<\/p>\n    <div class=\"hors-add\">\n      <input type=\"text\" id=\"hors-input\" placeholder=\"D\u00e9crire bri\u00e8vement l'activit\u00e9...\" onkeydown=\"if(event.key==='Enter'){event.preventDefault();addHors();}\">\n      <button onclick=\"addHors()\">+ Ajouter<\/button>\n    <\/div>\n    <div id=\"hors-list\"><\/div>\n  <\/div>\n\n  <!-- SECTION 5: BILAN -->\n  <div class=\"card\" id=\"card-bilan\" style=\"display:none\">\n    <div class=\"card-title\">\n      <span class=\"card-dot\" style=\"background:#8B5CF6\"><\/span>\n      Bilan de la journ\u00e9e\n    <\/div>\n    <div class=\"field\">\n      <label>Avancement g\u00e9n\u00e9ral *<\/label>\n      <div class=\"bilan-btns\">\n        <button class=\"bilan-btn\" id=\"btn-g\" onclick=\"selectBilan(this,'g','Journ\u00e9e productive')\">\n          <span class=\"bilan-icon\">&#10003;<\/span>Productive\n        <\/button>\n        <button class=\"bilan-btn\" id=\"btn-a\" onclick=\"selectBilan(this,'a','Partiellement r\u00e9alis\u00e9e')\">\n          <span class=\"bilan-icon\">&#8776;<\/span>Partielle\n        <\/button>\n        <button class=\"bilan-btn\" id=\"btn-r\" onclick=\"selectBilan(this,'r','Journ\u00e9e bloqu\u00e9e')\">\n          <span class=\"bilan-icon\">&#9651;<\/span>Bloqu\u00e9e\n        <\/button>\n      <\/div>\n    <\/div>\n    <div class=\"field\">\n      <label>Blocages \/ Difficult\u00e9s rencontr\u00e9es<\/label>\n      <textarea id=\"blocages\" placeholder=\"D\u00e9crire tout blocage, ressource manquante, besoin de validation...\" oninput=\"onChange()\"><\/textarea>\n    <\/div>\n    <div class=\"field\">\n      <label>Pr\u00e9visions pour demain<\/label>\n      <textarea id=\"previsions\" placeholder=\"T\u00e2ches prioritaires pr\u00e9vues pour le lendemain...\" rows=\"3\" oninput=\"onChange()\"><\/textarea>\n    <\/div>\n    <div class=\"field\">\n      <label>Information \u00e0 remonter au chef de cellule<\/label>\n      <textarea id=\"observations\" placeholder=\"Toute information utile pour le pilotage...\" rows=\"2\"><\/textarea>\n    <\/div>\n  <\/div>\n\n  <!-- SUBMIT -->\n  <button class=\"submit-btn\" id=\"submit-btn\" onclick=\"submitJournal()\" disabled>\n    Enregistrer mon journal de bord\n  <\/button>\n  <div class=\"success-msg\" id=\"success-msg\">Journal enregistr\u00e9 avec succ\u00e8s !<\/div>\n  <div class=\"export-area\" id=\"export-area\">\n    <button class=\"export-btn\" onclick=\"exportJSON()\">\n      T\u00e9l\u00e9charger le fichier pour le chef de cellule (.json)\n    <\/button>\n  <\/div>\n\n<\/div>\n\n<script>\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\/\/ STRUCTURE ORGANISATIONNELLE CORRIGEE\n\/\/ 2 cellules : FI et FCS (Formation Continue et Sp\u00e9cifique)\n\/\/ Gouvernance int\u00e9gr\u00e9e dans chaque cellule comme pilotage\n\/\/ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n\nconst ORG = {\n  FI: {\n    label: \"Cellule de la Formation Initiale\",\n    color: \"fi\",\n    hint: \"P\u00e9rim\u00e8tre : Formation Initiale \u2014 cycles A, B et C \u00b7 Stages \u00b7 Travaux de fin de formation\",\n    bannerText: \"Cellule de la Formation Initiale\",\n    pilotageIntro: \"Activit\u00e9s de coordination, suivi administratif et gouvernance propres \u00e0 la cellule FI.\",\n    pilotage: [\n      { code:\"PIL-FI-1\", lib:\"R\u00e9unions et concertations internes FI\", freq:\"Selon besoin\", sousOps:[\n        {id:\"pfi1a\", lib:\"Participation \u00e0 une r\u00e9union interne (cellule FI \/ DF)\"},\n        {id:\"pfi1b\", lib:\"Animation d'une r\u00e9union de coordination FI\"},\n        {id:\"pfi1c\", lib:\"R\u00e9daction d'un compte-rendu de r\u00e9union FI\"},\n        {id:\"pfi1d\", lib:\"Pr\u00e9paration d'un ordre du jour de r\u00e9union\"},\n      ]},\n      { code:\"PIL-FI-2\", lib:\"Correspondances et courriers FI\", freq:\"Quotidienne\", sousOps:[\n        {id:\"pfi2a\", lib:\"R\u00e9daction d'un courrier ou note de service FI\"},\n        {id:\"pfi2b\", lib:\"R\u00e9ception et traitement du courrier entrant FI\"},\n        {id:\"pfi2c\", lib:\"Transmission d'un dossier \u00e0 la hi\u00e9rarchie\"},\n        {id:\"pfi2d\", lib:\"Suivi d'un dossier administratif en attente\"},\n      ]},\n      { code:\"PIL-FI-3\", lib:\"Pilotage et suivi du PTA FI\", freq:\"Hebdomadaire\", sousOps:[\n        {id:\"pfi3a\", lib:\"Mise \u00e0 jour du tableau de bord de suivi PTA FI\"},\n        {id:\"pfi3b\", lib:\"R\u00e9daction d'un rapport d'activit\u00e9s FI (mensuel\/trimestriel)\"},\n        {id:\"pfi3c\", lib:\"Pr\u00e9paration d'une note de synth\u00e8se FI\"},\n        {id:\"pfi3d\", lib:\"Revue et validation de documents produits par l'\u00e9quipe FI\"},\n      ]},\n      { code:\"PIL-FI-4\", lib:\"Conseil p\u00e9dagogique et gouvernance FI\", freq:\"Annuelle\/trimestrielle\", sousOps:[\n        {id:\"pfi4a\", lib:\"Pr\u00e9paration du dossier pour le Conseil p\u00e9dagogique\"},\n        {id:\"pfi4b\", lib:\"Participation au Conseil p\u00e9dagogique\"},\n        {id:\"pfi4c\", lib:\"R\u00e9daction ou relecture du PV du Conseil p\u00e9dagogique\"},\n        {id:\"pfi4d\", lib:\"Suivi des recommandations du Conseil p\u00e9dagogique\"},\n        {id:\"pfi4e\", lib:\"Actualisation des curricula FI\"},\n        {id:\"pfi4f\", lib:\"Actualisation du sch\u00e9ma directeur de la formation\"},\n      ]},\n      { code:\"PIL-FI-5\", lib:\"Archivage et gestion documentaire FI\", freq:\"Selon besoin\", sousOps:[\n        {id:\"pfi5a\", lib:\"Classement et archivage de documents FI\"},\n        {id:\"pfi5b\", lib:\"Num\u00e9risation et enregistrement de documents\"},\n        {id:\"pfi5c\", lib:\"Mise \u00e0 jour du registre ou du tableau documentaire FI\"},\n      ]},\n    ],\n    activites: [\n      { codeAct:\"101T03\", libAct:\"Pr\u00e9paration, mise en \u0153uvre et \u00e9valuation des enseignements FI\", taches:[\n        { code:\"T03-1\", lib:\"Pr\u00e9paration des programmes semestriels\", freq:\"Semestrielle\", sousOps:[\n          {id:\"T03-1-a\", lib:\"\u00c9laboration \/ mise \u00e0 jour du calendrier acad\u00e9mique\"},\n          {id:\"T03-1-b\", lib:\"R\u00e9daction ou mise \u00e0 jour des emplois du temps\"},\n          {id:\"T03-1-c\", lib:\"Identification et invitation des enseignants\"},\n          {id:\"T03-1-d\", lib:\"Mise \u00e0 jour des syllabus et plans de cours\"},\n          {id:\"T03-1-e\", lib:\"\u00c9laboration des cahiers de charges enseignants\"},\n          {id:\"T03-1-f\", lib:\"Validation des programmes avec la direction\"},\n        ]},\n        { code:\"T03-2\", lib:\"Mise en \u0153uvre des enseignements FI\", freq:\"Quotidienne\", sousOps:[\n          {id:\"T03-2-a\", lib:\"Pr\u00e9paration du support de cours\"},\n          {id:\"T03-2-b\", lib:\"Animation du cours \/ s\u00e9ance p\u00e9dagogique\"},\n          {id:\"T03-2-c\", lib:\"Remplissage du cahier de texte \/ logbook\"},\n          {id:\"T03-2-d\", lib:\"Contr\u00f4le des pr\u00e9sences des apprenants\"},\n          {id:\"T03-2-e\", lib:\"Organisation d'un contr\u00f4le de connaissances (CC \/ devoir)\"},\n          {id:\"T03-2-f\", lib:\"Supervision d'un enseignant vacataire\"},\n          {id:\"T03-2-g\", lib:\"Signature des attestations de service fait\"},\n          {id:\"T03-2-h\", lib:\"R\u00e9union de coordination p\u00e9dagogique\"},\n        ]},\n        { code:\"T03-3\", lib:\"Organisation de la PMS\", freq:\"Annuelle\", sousOps:[\n          {id:\"T03-3-a\", lib:\"Contact et identification de l'encadreur militaire\"},\n          {id:\"T03-3-b\", lib:\"Constitution de la liste des \u00e9l\u00e8ves aptes\"},\n          {id:\"T03-3-c\", lib:\"Organisation logistique de la PMS\"},\n          {id:\"T03-3-d\", lib:\"Suivi du d\u00e9roulement de la PMS sur le terrain\"},\n          {id:\"T03-3-e\", lib:\"Collecte et validation des notes PMS\"},\n          {id:\"T03-3-f\", lib:\"R\u00e9daction du rapport de la PMS\"},\n          {id:\"T03-3-g\", lib:\"Remise des attestations PMS aux \u00e9l\u00e8ves\"},\n        ]},\n        { code:\"T03-4\", lib:\"\u00c9valuation des enseignements et enseignants FI\", freq:\"Semestrielle\", sousOps:[\n          {id:\"T03-4-a\", lib:\"\u00c9laboration \/ mise \u00e0 jour de la fiche d'\u00e9valuation\"},\n          {id:\"T03-4-b\", lib:\"Administration des fiches aupr\u00e8s des apprenants\"},\n          {id:\"T03-4-c\", lib:\"D\u00e9pouillement et analyse des r\u00e9sultats\"},\n          {id:\"T03-4-d\", lib:\"Entretien de restitution avec l'enseignant \u00e9valu\u00e9\"},\n          {id:\"T03-4-e\", lib:\"R\u00e9daction du rapport semestriel d'\u00e9valuation\"},\n          {id:\"T03-4-f\", lib:\"Transmission du rapport \u00e0 la hi\u00e9rarchie\"},\n        ]},\n      ]},\n      { codeAct:\"101T05\", libAct:\"Organisation des stages pratiques et professionnels\", taches:[\n        { code:\"T05-1\", lib:\"Stages d'impr\u00e9gnation\", freq:\"Annuelle\", sousOps:[\n          {id:\"T05-1-a\", lib:\"Identification des structures d'accueil\"},\n          {id:\"T05-1-b\", lib:\"R\u00e9daction des lettres d'affectation des \u00e9l\u00e8ves\"},\n          {id:\"T05-1-c\", lib:\"\u00c9laboration du guide \/ cahier de stage\"},\n          {id:\"T05-1-d\", lib:\"Briefing de d\u00e9part des stagiaires\"},\n          {id:\"T05-1-e\", lib:\"Suivi des stagiaires sur le terrain\"},\n          {id:\"T05-1-f\", lib:\"R\u00e9ception et correction des rapports de stage\"},\n          {id:\"T05-1-g\", lib:\"Organisation de la soutenance des rapports\"},\n          {id:\"T05-1-h\", lib:\"Remise des attestations de stage\"},\n        ]},\n        { code:\"T05-2\", lib:\"Stages professionnels\", freq:\"Annuelle\", sousOps:[\n          {id:\"T05-2-a\", lib:\"N\u00e9gociation des conventions avec les structures\"},\n          {id:\"T05-2-b\", lib:\"Affectation nominative des stagiaires\"},\n          {id:\"T05-2-c\", lib:\"\u00c9laboration du r\u00e9f\u00e9rentiel d'\u00e9valuation du stage\"},\n          {id:\"T05-2-d\", lib:\"Visites de suivi des stagiaires sur le terrain\"},\n          {id:\"T05-2-e\", lib:\"R\u00e9ception et \u00e9valuation des rapports de stage\"},\n          {id:\"T05-2-f\", lib:\"Organisation du jury d'\u00e9valuation des stages\"},\n          {id:\"T05-2-g\", lib:\"Remise des notes et attestations\"},\n        ]},\n      ]},\n      { codeAct:\"101T07\", libAct:\"\u00c9valuation des travaux de fin de formation (TFF)\", taches:[\n        { code:\"T07-1\", lib:\"Encadrement des TFF (m\u00e9moires, projets, rapports)\", freq:\"T3-T4\", sousOps:[\n          {id:\"T07-1-a\", lib:\"Attribution des th\u00e8mes et directeurs de m\u00e9moire\"},\n          {id:\"T07-1-b\", lib:\"S\u00e9ance de cadrage m\u00e9thodologique\"},\n          {id:\"T07-1-c\", lib:\"R\u00e9union de suivi avec les directeurs de m\u00e9moire\"},\n          {id:\"T07-1-d\", lib:\"Lecture et annotations d'une version interm\u00e9diaire\"},\n          {id:\"T07-1-e\", lib:\"R\u00e9ception du travail finalis\u00e9 (version d\u00e9finitive)\"},\n          {id:\"T07-1-f\", lib:\"Transmission des travaux aux membres du jury\"},\n        ]},\n        { code:\"T07-2\", lib:\"Examen des rapports de stage \u2014 Cycle C\", freq:\"Annuelle\", sousOps:[\n          {id:\"T07-2-a\", lib:\"Constitution et convocation du jury Cycle C\"},\n          {id:\"T07-2-b\", lib:\"Organisation logistique de l'\u00e9valuation\"},\n          {id:\"T07-2-c\", lib:\"Tenue des s\u00e9ances d'\u00e9valuation Cycle C\"},\n          {id:\"T07-2-d\", lib:\"Saisie et validation des notes Cycle C\"},\n          {id:\"T07-2-e\", lib:\"R\u00e9daction du PV d'\u00e9valuation Cycle C\"},\n          {id:\"T07-2-f\", lib:\"Transmission du PV \u00e0 la direction \/ scolarit\u00e9\"},\n        ]},\n        { code:\"T07-3\", lib:\"Examen des projets de fin de formation \u2014 Cycle B\", freq:\"Annuelle\", sousOps:[\n          {id:\"T07-3-a\", lib:\"Constitution et convocation du jury Cycle B\"},\n          {id:\"T07-3-b\", lib:\"Organisation logistique de la soutenance\"},\n          {id:\"T07-3-c\", lib:\"Tenue des s\u00e9ances d'\u00e9valuation Cycle B\"},\n          {id:\"T07-3-d\", lib:\"Saisie et validation des notes Cycle B\"},\n          {id:\"T07-3-e\", lib:\"R\u00e9daction du PV d'\u00e9valuation Cycle B\"},\n          {id:\"T07-3-f\", lib:\"Transmission du PV \u00e0 la direction\"},\n        ]},\n        { code:\"T07-4\", lib:\"Examen des m\u00e9moires et soutenances \u2014 Cycle A\", freq:\"Annuelle\", sousOps:[\n          {id:\"T07-4-a\", lib:\"Constitution et convocation du jury de m\u00e9moire\"},\n          {id:\"T07-4-b\", lib:\"Organisation logistique des soutenances\"},\n          {id:\"T07-4-c\", lib:\"Lecture pr\u00e9paratoire des m\u00e9moires par le jury\"},\n          {id:\"T07-4-d\", lib:\"Tenue des s\u00e9ances de soutenance\"},\n          {id:\"T07-4-e\", lib:\"D\u00e9lib\u00e9ration et saisie des notes finales\"},\n          {id:\"T07-4-f\", lib:\"R\u00e9daction du PV de soutenance et des d\u00e9cisions\"},\n          {id:\"T07-4-g\", lib:\"Remise des dipl\u00f4mes et transmission \u00e0 la scolarit\u00e9\"},\n        ]},\n      ]},\n    ]\n  },\n\n  FCS: {\n    label: \"Cellule de la Formation Continue et Sp\u00e9cifique\",\n    color: \"fcs\",\n    hint: \"P\u00e9rim\u00e8tre : Formation Continue \u00b7 S\u00e9minaires et Ateliers \u00b7 Police Municipale \u00b7 E-Learning et Num\u00e9rique\",\n    bannerText: \"Cellule de la Formation Continue et Sp\u00e9cifique\",\n    pilotageIntro: \"Activit\u00e9s de coordination, suivi administratif et gouvernance propres \u00e0 la cellule FCS.\",\n    pilotage: [\n      { code:\"PIL-FCS-1\", lib:\"R\u00e9unions et concertations internes FCS\", freq:\"Selon besoin\", sousOps:[\n        {id:\"pfcs1a\", lib:\"Participation \u00e0 une r\u00e9union interne (cellule FCS \/ DF)\"},\n        {id:\"pfcs1b\", lib:\"Animation d'une r\u00e9union de coordination FCS\"},\n        {id:\"pfcs1c\", lib:\"R\u00e9daction d'un compte-rendu de r\u00e9union FCS\"},\n        {id:\"pfcs1d\", lib:\"Pr\u00e9paration d'un ordre du jour de r\u00e9union\"},\n      ]},\n      { code:\"PIL-FCS-2\", lib:\"Correspondances et courriers FCS\", freq:\"Quotidienne\", sousOps:[\n        {id:\"pfcs2a\", lib:\"R\u00e9daction d'un courrier ou note de service FCS\"},\n        {id:\"pfcs2b\", lib:\"R\u00e9ception et traitement du courrier entrant FCS\"},\n        {id:\"pfcs2c\", lib:\"Transmission d'un dossier \u00e0 la hi\u00e9rarchie\"},\n        {id:\"pfcs2d\", lib:\"Suivi d'un dossier administratif en attente\"},\n      ]},\n      { code:\"PIL-FCS-3\", lib:\"Pilotage et suivi du PTA FCS\", freq:\"Hebdomadaire\", sousOps:[\n        {id:\"pfcs3a\", lib:\"Mise \u00e0 jour du tableau de bord de suivi PTA FCS\"},\n        {id:\"pfcs3b\", lib:\"R\u00e9daction d'un rapport d'activit\u00e9s FCS (mensuel\/trimestriel)\"},\n        {id:\"pfcs3c\", lib:\"Pr\u00e9paration d'une note de synth\u00e8se FCS\"},\n        {id:\"pfcs3d\", lib:\"Revue et validation de documents produits par l'\u00e9quipe FCS\"},\n      ]},\n      { code:\"PIL-FCS-4\", lib:\"Gouvernance p\u00e9dagogique FCS\", freq:\"Annuelle\/trimestrielle\", sousOps:[\n        {id:\"pfcs4a\", lib:\"Participation au Conseil p\u00e9dagogique\"},\n        {id:\"pfcs4b\", lib:\"R\u00e9daction ou relecture du PV du Conseil p\u00e9dagogique\"},\n        {id:\"pfcs4c\", lib:\"Suivi des recommandations du Conseil (volet FCS)\"},\n        {id:\"pfcs4d\", lib:\"Actualisation de la documentation de r\u00e9f\u00e9rence FC\"},\n        {id:\"pfcs4e\", lib:\"Actualisation du sch\u00e9ma directeur (volet FC)\"},\n        {id:\"pfcs4f\", lib:\"\u00c9valuation des besoins en formation \u2014 administration des grilles\"},\n        {id:\"pfcs4g\", lib:\"Analyse des donn\u00e9es et r\u00e9daction du rapport besoins\"},\n        {id:\"pfcs4h\", lib:\"Promotion des offres (web, r\u00e9seaux sociaux, supports physiques)\"},\n      ]},\n      { code:\"PIL-FCS-5\", lib:\"Archivage et gestion documentaire FCS\", freq:\"Selon besoin\", sousOps:[\n        {id:\"pfcs5a\", lib:\"Classement et archivage de documents FCS\"},\n        {id:\"pfcs5b\", lib:\"Num\u00e9risation et enregistrement de documents\"},\n        {id:\"pfcs5c\", lib:\"Mise \u00e0 jour du registre ou tableau documentaire FCS\"},\n      ]},\n    ],\n    activites: [\n      \/\/ \u2500\u2500 FORMATION CONTINUE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      { codeAct:\"102T01\", libAct:\"Formation Continue \u2014 Pr\u00e9paration, mise en oeuvre et \u00e9valuation\", groupe:\"Formation Continue\", taches:[\n        { code:\"FC01-1\", lib:\"Documents de cadrage et pilotage FC\", freq:\"Semestrielle\", sousOps:[\n          {id:\"fc011a\", lib:\"R\u00e9daction \/ mise \u00e0 jour du document de politique FC\"},\n          {id:\"fc011b\", lib:\"\u00c9laboration des fiches de suivi p\u00e9dagogique FC\"},\n          {id:\"fc011c\", lib:\"Mise \u00e0 jour des tableaux d'analyse FC\"},\n          {id:\"fc011d\", lib:\"\u00c9laboration des sc\u00e9narios p\u00e9dagogiques FC\"},\n          {id:\"fc011e\", lib:\"Validation des documents avec la hi\u00e9rarchie\"},\n        ]},\n        { code:\"FC01-2\", lib:\"Veille p\u00e9dagogique\", freq:\"Mensuelle\", sousOps:[\n          {id:\"fc012a\", lib:\"Recherche documentaire sur les innovations en formation locale\"},\n          {id:\"fc012b\", lib:\"Participation \u00e0 un webinaire ou \u00e9v\u00e9nement de formation\"},\n          {id:\"fc012c\", lib:\"\u00c9change avec des partenaires sur les pratiques FC\"},\n          {id:\"fc012d\", lib:\"R\u00e9daction d'une note ou fiche de veille\"},\n          {id:\"fc012e\", lib:\"R\u00e9daction du rapport annuel de veille p\u00e9dagogique\"},\n        ]},\n        { code:\"FC01-3\", lib:\"S\u00e9lection des formateurs et actualisation du fichier\", freq:\"Semestrielle\", sousOps:[\n          {id:\"fc013a\", lib:\"Lancement de l'appel \u00e0 candidatures de formateurs\"},\n          {id:\"fc013b\", lib:\"R\u00e9ception et enregistrement des dossiers\"},\n          {id:\"fc013c\", lib:\"Analyse et tri des dossiers re\u00e7us (CV, exp\u00e9riences)\"},\n          {id:\"fc013d\", lib:\"Conduite des entretiens ou tests de s\u00e9lection\"},\n          {id:\"fc013e\", lib:\"R\u00e9daction de la liste des formateurs retenus\"},\n          {id:\"fc013f\", lib:\"Mise \u00e0 jour de la banque de donn\u00e9es des formateurs\"},\n          {id:\"fc013g\", lib:\"Transmission de la liste valid\u00e9e \u00e0 la hi\u00e9rarchie\"},\n        ]},\n        { code:\"FC01-4\", lib:\"Animation du r\u00e9seau des formateurs \/ experts\", freq:\"Trimestrielle\", sousOps:[\n          {id:\"fc014a\", lib:\"Organisation d'une r\u00e9union du r\u00e9seau des formateurs\"},\n          {id:\"fc014b\", lib:\"Tenue de la r\u00e9union du r\u00e9seau\"},\n          {id:\"fc014c\", lib:\"R\u00e9daction du compte-rendu \/ note de synth\u00e8se\"},\n          {id:\"fc014d\", lib:\"Partage de ressources p\u00e9dagogiques avec le r\u00e9seau\"},\n          {id:\"fc014e\", lib:\"Suivi des engagements pris en r\u00e9union de r\u00e9seau\"},\n        ]},\n        { code:\"FC01-5\", lib:\"Pr\u00e9paration des contenus de formation\", freq:\"Par session\", sousOps:[\n          {id:\"fc015a\", lib:\"Analyse des besoins et d\u00e9finition des objectifs\"},\n          {id:\"fc015b\", lib:\"Conception \/ adaptation du support de cours\"},\n          {id:\"fc015c\", lib:\"\u00c9laboration du planning d\u00e9taill\u00e9 de la session\"},\n          {id:\"fc015d\", lib:\"Pr\u00e9paration des exercices et \u00e9valuations\"},\n          {id:\"fc015e\", lib:\"Reproduction \/ impression des supports\"},\n          {id:\"fc015f\", lib:\"Validation du contenu avec la hi\u00e9rarchie\"},\n        ]},\n        { code:\"FC01-6\", lib:\"Mise en oeuvre et suivi des enseignements FC\", freq:\"Par session\", sousOps:[\n          {id:\"fc016a\", lib:\"Accueil et installation des participants FC\"},\n          {id:\"fc016b\", lib:\"Animation d'une s\u00e9ance de formation continue\"},\n          {id:\"fc016c\", lib:\"Suivi de la pr\u00e9sence (feuilles d'\u00e9margement)\"},\n          {id:\"fc016d\", lib:\"Supervision d'un formateur externe en cours de session\"},\n          {id:\"fc016e\", lib:\"Administration de l'\u00e9valuation des apprentissages\"},\n          {id:\"fc016f\", lib:\"Cl\u00f4ture de la session (restitution, remise attestations)\"},\n        ]},\n        { code:\"FC01-7\", lib:\"Supervision des travaux professionnels des stagiaires\", freq:\"Par session\", sousOps:[\n          {id:\"fc017a\", lib:\"Attribution des sujets de travaux aux stagiaires\"},\n          {id:\"fc017b\", lib:\"S\u00e9ance de cadrage m\u00e9thodologique\"},\n          {id:\"fc017c\", lib:\"S\u00e9ance de suivi interm\u00e9diaire des travaux\"},\n          {id:\"fc017d\", lib:\"Lecture et annotations des productions interm\u00e9diaires\"},\n          {id:\"fc017e\", lib:\"Organisation et tenue de la restitution des travaux\"},\n        ]},\n        { code:\"FC01-8\", lib:\"Prise en charge financi\u00e8re des formateurs (honoraires)\", freq:\"Par session\", sousOps:[\n          {id:\"fc018a\", lib:\"V\u00e9rification des heures effectivement dispens\u00e9es\"},\n          {id:\"fc018b\", lib:\"\u00c9tablissement de l'\u00e9tat financier d'honoraires\"},\n          {id:\"fc018c\", lib:\"Collecte des signatures sur l'\u00e9tat financier\"},\n          {id:\"fc018d\", lib:\"Transmission du dossier financier \u00e0 la DAF\"},\n          {id:\"fc018e\", lib:\"Suivi du paiement et relance si n\u00e9cessaire\"},\n        ]},\n        { code:\"FC01-9\", lib:\"\u00c9valuation des enseignements et enseignants FC\", freq:\"Par session\", sousOps:[\n          {id:\"fc019a\", lib:\"Distribution et collecte des fiches d'\u00e9valuation FC\"},\n          {id:\"fc019b\", lib:\"D\u00e9pouillement et analyse des fiches FC\"},\n          {id:\"fc019c\", lib:\"R\u00e9daction du bilan d'\u00e9valuation de la session\"},\n          {id:\"fc019d\", lib:\"Restitution des r\u00e9sultats au formateur concern\u00e9\"},\n          {id:\"fc019e\", lib:\"Int\u00e9gration dans le rapport d'activit\u00e9s FC\"},\n        ]},\n      ]},\n      \/\/ \u2500\u2500 SEMINAIRES ET ATELIERS \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      { codeAct:\"102T02\", libAct:\"S\u00e9minaires et Ateliers (Formations Sp\u00e9cifiques)\", groupe:\"S\u00e9minaires et Ateliers\", taches:[\n        { code:\"FC02-1\", lib:\"Formulation des offres de formation th\u00e9matique\", freq:\"Semestrielle\", sousOps:[\n          {id:\"fc021a\", lib:\"Analyse des besoins des CTD et partenaires\"},\n          {id:\"fc021b\", lib:\"Identification des th\u00e8mes de formation prioritaires\"},\n          {id:\"fc021c\", lib:\"R\u00e9daction du catalogue des offres th\u00e9matiques\"},\n          {id:\"fc021d\", lib:\"Validation du catalogue avec la hi\u00e9rarchie\"},\n          {id:\"fc021e\", lib:\"Diffusion du catalogue aux partenaires (CTD, FEICOM, MINDDEVEL)\"},\n        ]},\n        { code:\"FC02-3\", lib:\"S\u00e9minaires pour les nouveaux \u00e9lus locaux\", freq:\"Annuelle\", sousOps:[\n          {id:\"fc023a\", lib:\"Identification et convocation des participants (\u00e9lus)\"},\n          {id:\"fc023b\", lib:\"Pr\u00e9paration du programme et des supports pour les \u00e9lus\"},\n          {id:\"fc023c\", lib:\"Organisation logistique du s\u00e9minaire (salle, h\u00e9bergement)\"},\n          {id:\"fc023d\", lib:\"Animation ou supervision du s\u00e9minaire des \u00e9lus\"},\n          {id:\"fc023e\", lib:\"\u00c9tablissement de l'\u00e9tat de prise en charge des participants\"},\n          {id:\"fc023f\", lib:\"R\u00e9daction du rapport du s\u00e9minaire des nouveaux \u00e9lus\"},\n        ]},\n        { code:\"FC02-4\", lib:\"Mise en oeuvre des ateliers ouverts\", freq:\"Trimestrielle\", sousOps:[\n          {id:\"fc024a\", lib:\"D\u00e9finition du th\u00e8me et objectifs de l'atelier\"},\n          {id:\"fc024b\", lib:\"Identification et invitation des participants\"},\n          {id:\"fc024c\", lib:\"Organisation logistique de l'atelier\"},\n          {id:\"fc024d\", lib:\"Animation ou co-animation de l'atelier ouvert\"},\n          {id:\"fc024e\", lib:\"R\u00e9daction du rapport de l'atelier ouvert\"},\n        ]},\n        { code:\"FC02-5\", lib:\"Coaching des CTD (clients)\", freq:\"Par mission\", sousOps:[\n          {id:\"fc025a\", lib:\"Prise de contact et diagnostic initial du CTD\"},\n          {id:\"fc025b\", lib:\"\u00c9laboration du plan d'accompagnement (coaching)\"},\n          {id:\"fc025c\", lib:\"Conduite d'une s\u00e9ance de coaching sur le terrain\"},\n          {id:\"fc025d\", lib:\"R\u00e9daction de la note de suivi de coaching\"},\n          {id:\"fc025e\", lib:\"\u00c9valuation de l'accompagnement avec le CTD\"},\n        ]},\n        { code:\"FC02-6\", lib:\"Production et mise en ligne des MOOC\", freq:\"Par module\", sousOps:[\n          {id:\"fc026a\", lib:\"Conception du sc\u00e9nario p\u00e9dagogique du module MOOC\"},\n          {id:\"fc026b\", lib:\"R\u00e9daction du contenu textuel du module MOOC\"},\n          {id:\"fc026c\", lib:\"Enregistrement des vid\u00e9os \/ capsules du module\"},\n          {id:\"fc026d\", lib:\"Int\u00e9gration du module sur la plateforme LMS\"},\n          {id:\"fc026e\", lib:\"Test et validation du module en ligne\"},\n          {id:\"fc026f\", lib:\"Publication et communication sur le nouveau module\"},\n        ]},\n      ]},\n      \/\/ \u2500\u2500 POLICE MUNICIPALE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      { codeAct:\"102T03\", libAct:\"Formations en Police Municipale\", groupe:\"Police Municipale\", taches:[\n        { code:\"FC03-1\", lib:\"Pr\u00e9paration des programmes d'enseignement PM\", freq:\"Annuelle\", sousOps:[\n          {id:\"fc031a\", lib:\"\u00c9laboration \/ r\u00e9vision des curricula et syllabus PM\"},\n          {id:\"fc031b\", lib:\"Construction des emplois du temps PM\"},\n          {id:\"fc031c\", lib:\"Identification et contractualisation des intervenants PM\"},\n          {id:\"fc031d\", lib:\"Pr\u00e9paration du kit p\u00e9dagogique PM\"},\n          {id:\"fc031e\", lib:\"Validation du programme PM avec les autorit\u00e9s\"},\n        ]},\n        { code:\"FC03-2\", lib:\"Mise en oeuvre et suivi des enseignements PM\", freq:\"Hebdomadaire\", sousOps:[\n          {id:\"fc032a\", lib:\"Tenue d'une s\u00e9ance d'enseignement th\u00e9orique PM\"},\n          {id:\"fc032b\", lib:\"Remplissage du cahier de texte PM\"},\n          {id:\"fc032c\", lib:\"Contr\u00f4le de la pr\u00e9sence des agents PM\"},\n          {id:\"fc032d\", lib:\"Administration d'un contr\u00f4le de connaissances PM\"},\n          {id:\"fc032e\", lib:\"Suivi individuel d'un agent PM en difficult\u00e9\"},\n          {id:\"fc032f\", lib:\"Supervision d'un intervenant externe PM\"},\n        ]},\n        { code:\"FC03-3\", lib:\"Supervision des exercices pratiques et terrain PM\", freq:\"Mensuelle\", sousOps:[\n          {id:\"fc033a\", lib:\"Conception du sc\u00e9nario d'exercice de simulation\"},\n          {id:\"fc033b\", lib:\"Organisation logistique de l'exercice terrain\"},\n          {id:\"fc033c\", lib:\"Tenue et supervision de l'exercice de simulation\"},\n          {id:\"fc033d\", lib:\"D\u00e9brief post-exercice avec les agents PM\"},\n          {id:\"fc033e\", lib:\"R\u00e9daction du rapport d'exercice terrain PM\"},\n        ]},\n        { code:\"FC03-4\", lib:\"\u00c9valuation des enseignants et enseignements PM\", freq:\"Semestrielle\", sousOps:[\n          {id:\"fc034a\", lib:\"Administration des questionnaires d'\u00e9valuation PM\"},\n          {id:\"fc034b\", lib:\"D\u00e9pouillement et analyse des \u00e9valuations PM\"},\n          {id:\"fc034c\", lib:\"Observation de classe PM (\u00e9valuation enseignant)\"},\n          {id:\"fc034d\", lib:\"R\u00e9daction du rapport d'\u00e9valuation PM\"},\n          {id:\"fc034e\", lib:\"Transmission du rapport \u00e0 la hi\u00e9rarchie\"},\n        ]},\n      ]},\n      \/\/ \u2500\u2500 E-LEARNING \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n      { codeAct:\"105T05\", libAct:\"E-Learning et Num\u00e9rique\", groupe:\"E-Learning et Num\u00e9rique\", taches:[\n        { code:\"NUM-1\", lib:\"Mise en oeuvre de la strat\u00e9gie de t\u00e9l\u00e9-enseignement\", freq:\"Trimestrielle\", sousOps:[\n          {id:\"num1a\", lib:\"Suivi de la feuille de route de la strat\u00e9gie\"},\n          {id:\"num1b\", lib:\"R\u00e9union de coordination sur la strat\u00e9gie\"},\n          {id:\"num1c\", lib:\"R\u00e9daction du rapport trimestriel de mise en oeuvre\"},\n          {id:\"num1d\", lib:\"Communication interne sur les avanc\u00e9es\"},\n        ]},\n        { code:\"NUM-2\", lib:\"Optimisation de l'environnement p\u00e9dagogique digital\", freq:\"Mensuelle\", sousOps:[\n          {id:\"num2a\", lib:\"Diagnostic et inventaire des \u00e9quipements num\u00e9riques\"},\n          {id:\"num2b\", lib:\"Installation ou configuration d'un \u00e9quipement\"},\n          {id:\"num2c\", lib:\"Mise \u00e0 jour des logiciels et outils num\u00e9riques\"},\n          {id:\"num2d\", lib:\"Formation ou appui technique d'un utilisateur\"},\n          {id:\"num2e\", lib:\"R\u00e9daction d'un rapport d'intervention technique\"},\n        ]},\n        { code:\"NUM-3\", lib:\"Maintenance et administration de la plateforme LMS\", freq:\"Hebdomadaire\", sousOps:[\n          {id:\"num3a\", lib:\"V\u00e9rification du bon fonctionnement de la plateforme\"},\n          {id:\"num3b\", lib:\"Cr\u00e9ation ou mise \u00e0 jour d'un compte utilisateur\"},\n          {id:\"num3c\", lib:\"Mise en ligne ou mise \u00e0 jour d'un contenu LMS\"},\n          {id:\"num3d\", lib:\"R\u00e9solution d'un incident technique (bug, acc\u00e8s)\"},\n          {id:\"num3e\", lib:\"Sauvegarde des donn\u00e9es de la plateforme\"},\n          {id:\"num3f\", lib:\"R\u00e9daction d'un rapport de maintenance\"},\n        ]},\n        { code:\"NUM-4\", lib:\"Formation et renforcement des ressources techniques\", freq:\"Trimestrielle\", sousOps:[\n          {id:\"num4a\", lib:\"Identification des besoins en renforcement num\u00e9rique\"},\n          {id:\"num4b\", lib:\"\u00c9laboration du plan de formation aux outils num\u00e9riques\"},\n          {id:\"num4c\", lib:\"Animation d'une s\u00e9ance de formation aux outils num\u00e9riques\"},\n          {id:\"num4d\", lib:\"\u00c9valuation des acquis post-formation num\u00e9rique\"},\n          {id:\"num4e\", lib:\"R\u00e9daction du rapport de formation num\u00e9rique\"},\n        ]},\n      ]},\n    ]\n  }\n};\n\n\/\/ \u2500\u2500 \u00c9tat \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nlet selectedPilotage = {};  \/\/ {code: {data, subOps:Set, note}}\nlet selectedTasks = {};     \/\/ {code: {codeAct, data, subOps:Set, note}}\nlet horsTasks = [];\nlet bilanStatus = '';\nlet bilanLabel = '';\nlet currentCellule = '';\n\n\/\/ \u2500\u2500 Init \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\ndocument.getElementById('agent-date').value = new Date().toISOString().split('T')[0];\n\n\/\/ Restore saved name\ntry {\n  const saved = localStorage.getItem('nasla_agent_nom');\n  if (saved) {\n    document.getElementById('agent-nom').value = saved;\n    const badge = document.getElementById('name-badge');\n    badge.textContent = 'Nom m\u00e9moris\u00e9 : ' + saved;\n    badge.classList.add('show');\n  }\n} catch(e){}\n\nfunction onNomInput() {\n  document.getElementById('name-badge').classList.remove('show');\n  onChange();\n}\n\nfunction saveName() {\n  const val = document.getElementById('agent-nom').value.trim();\n  if (!val) return;\n  try { localStorage.setItem('nasla_agent_nom', val); } catch(e){}\n  const badge = document.getElementById('name-badge');\n  badge.textContent = 'Nom m\u00e9moris\u00e9 pour demain : ' + val;\n  badge.classList.add('show');\n}\n\n\/\/ \u2500\u2500 Changement de cellule \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction onCelluleChange() {\n  currentCellule = document.getElementById('agent-cellule').value;\n  selectedPilotage = {};\n  selectedTasks = {};\n  horsTasks = [];\n  bilanStatus = '';\n  bilanLabel = '';\n  document.querySelectorAll('.bilan-btn').forEach(b => { b.className = 'bilan-btn'; });\n\n  const show = ['card-pilotage','card-pta','card-hors','card-bilan'];\n\n  if (!currentCellule) {\n    document.getElementById('cellule-banner').className = 'cellule-banner';\n    show.forEach(id => document.getElementById(id).style.display = 'none');\n    document.getElementById('cellule-hint').style.display = 'none';\n    onChange(); return;\n  }\n\n  const org = ORG[currentCellule];\n\n  \/\/ Banner\n  const banner = document.getElementById('cellule-banner');\n  const dotColor = currentCellule === 'FI' ? '#2E75B6' : '#C55A11';\n  banner.className = 'cellule-banner show ' + org.color;\n  banner.innerHTML = `<span class=\"banner-dot\" style=\"background:${dotColor}\"><\/span>${org.bannerText}`;\n\n  \/\/ Hint\n  const hint = document.getElementById('cellule-hint');\n  hint.textContent = org.hint;\n  hint.style.display = 'block';\n\n  \/\/ Pilotage\n  document.getElementById('pilotage-intro').textContent = org.pilotageIntro;\n  renderPilotage(org.pilotage, currentCellule);\n  document.getElementById('card-pilotage').style.display = 'block';\n\n  \/\/ PTA activit\u00e9s\n  renderPTA(org.activites, currentCellule);\n  document.getElementById('card-pta').style.display = 'block';\n\n  \/\/ Autres sections\n  document.getElementById('card-hors').style.display = 'block';\n  document.getElementById('card-bilan').style.display = 'block';\n\n  document.getElementById('hors-list').innerHTML = '';\n  renderRecap();\n  onChange();\n}\n\n\/\/ \u2500\u2500 Rendu Pilotage \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderPilotage(pilotage, cellule) {\n  const container = document.getElementById('pilotage-container');\n  const isFCS = cellule === 'FCS';\n  const accentColor = isFCS ? '#C55A11' : '#2E75B6';\n  const lightColor = isFCS ? '#FDF0E6' : '#E8F0FB';\n\n  container.innerHTML = '';\n  pilotage.forEach(p => {\n    const isChecked = !!selectedPilotage[p.code];\n    const div = document.createElement('div');\n    div.className = 'act-block';\n    div.innerHTML = `\n      <div class=\"task-wrap\">\n        <div class=\"task-row\" onclick=\"togglePilotage('${p.code}')\">\n          <div class=\"task-cb${isChecked?' on':''}\" id=\"pcb-${p.code}\"><\/div>\n          <div class=\"task-name\">${p.lib}<\/div>\n          <div class=\"task-freq\">${p.freq}<\/div>\n        <\/div>\n        <div class=\"subops-panel${isChecked?' open':''}\" id=\"psop-${p.code}\">\n          <div class=\"subops-title\">Ce que j'ai fait :<\/div>\n          ${p.sousOps.map(s=>`\n            <label class=\"subop-row\" onclick=\"togglePSub('${p.code}','${s.id}',event)\">\n              <div class=\"subop-cb${selectedPilotage[p.code]?.subOps?.has(s.id)?' on':''}\" id=\"pscb-${s.id}\"><\/div>\n              <div class=\"subop-label\">${s.lib}<\/div>\n            <\/label>`).join('')}\n          <div class=\"subop-free\">\n            <label>Pr\u00e9cision (facultatif)<\/label>\n            <input type=\"text\" id=\"pnote-${p.code}\" placeholder=\"Ex : r\u00e9union avec M. Atangana...\" value=\"${selectedPilotage[p.code]?.note||''}\" oninput=\"updatePNote('${p.code}',this.value)\">\n          <\/div>\n        <\/div>\n      <\/div>`;\n    container.appendChild(div);\n  });\n}\n\nfunction togglePilotage(code) {\n  const org = ORG[currentCellule];\n  const pData = org.pilotage.find(p => p.code === code);\n  if (selectedPilotage[code]) {\n    delete selectedPilotage[code];\n    const cb = document.getElementById('pcb-'+code);\n    if (cb) cb.classList.remove('on');\n    const sop = document.getElementById('psop-'+code);\n    if (sop) sop.classList.remove('open');\n  } else {\n    selectedPilotage[code] = { data: pData, subOps: new Set(), note: '' };\n    const cb = document.getElementById('pcb-'+code);\n    if (cb) cb.classList.add('on');\n    const sop = document.getElementById('psop-'+code);\n    if (sop) sop.classList.add('open');\n  }\n  renderRecap();\n  onChange();\n}\n\nfunction togglePSub(pCode, subId, e) {\n  e.stopPropagation();\n  if (!selectedPilotage[pCode]) return;\n  const s = selectedPilotage[pCode].subOps;\n  const cb = document.getElementById('pscb-'+subId);\n  if (s.has(subId)) { s.delete(subId); if(cb) cb.classList.remove('on'); }\n  else { s.add(subId); if(cb) cb.classList.add('on'); }\n  renderRecap();\n}\n\nfunction updatePNote(code, val) {\n  if (selectedPilotage[code]) selectedPilotage[code].note = val;\n}\n\n\/\/ \u2500\u2500 Rendu PTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderPTA(activites, cellule) {\n  const container = document.getElementById('pta-container');\n  const isFCS = cellule === 'FCS';\n  container.innerHTML = '';\n\n  \/\/ Group by \"groupe\" for FCS\n  let lastGroupe = '';\n\n  activites.forEach(act => {\n    \/\/ Group header for FCS\n    if (isFCS && act.groupe && act.groupe !== lastGroupe) {\n      lastGroupe = act.groupe;\n      const ghdr = document.createElement('div');\n      ghdr.className = 'group-hdr';\n      ghdr.style.cssText = 'background:#FDF0E6;color:#6B3A00;font-size:10px;';\n      ghdr.textContent = act.groupe;\n      container.appendChild(ghdr);\n    }\n\n    const actDiv = document.createElement('div');\n    actDiv.className = 'act-block';\n    const codeColor = isFCS ? '#6B3A00' : '#1A4A7A';\n    const codeBg = isFCS ? '#FDF0E6' : '#E8F0FB';\n    let taskHTML = '';\n    act.taches.forEach(t => {\n      const isChecked = !!selectedTasks[t.code];\n      taskHTML += `\n        <div class=\"task-wrap\">\n          <div class=\"task-row\" onclick=\"toggleTask('${act.codeAct}','${t.code}')\">\n            <div class=\"task-cb${isChecked?' on':''}\" id=\"tcb-${t.code}\"><\/div>\n            <div class=\"task-name\">${t.lib}<\/div>\n            <div class=\"task-freq\">${t.freq}<\/div>\n          <\/div>\n          <div class=\"subops-panel${isChecked?' open':''}\" id=\"sop-${t.code}\">\n            <div class=\"subops-title\">Pr\u00e9ciser ce que vous avez fait :<\/div>\n            ${t.sousOps.map(s=>`\n              <label class=\"subop-row\" onclick=\"toggleSub('${t.code}','${s.id}',event)\">\n                <div class=\"subop-cb${selectedTasks[t.code]?.subOps?.has(s.id)?' on':''}\" id=\"scb-${s.id}\"><\/div>\n                <div class=\"subop-label\">${s.lib}<\/div>\n              <\/label>`).join('')}\n            <div class=\"subop-free\">\n              <label>Pr\u00e9cision compl\u00e9mentaire (facultatif)<\/label>\n              <input type=\"text\" id=\"note-${t.code}\" placeholder=\"Ex : 12 dossiers trait\u00e9s, r\u00e9union avec M. Essama...\" value=\"${selectedTasks[t.code]?.note||''}\" oninput=\"updateNote('${t.code}',this.value)\">\n            <\/div>\n          <\/div>\n        <\/div>`;\n    });\n    actDiv.innerHTML = `\n      <div class=\"act-hdr\" onclick=\"toggleAct('${act.codeAct}',this)\">\n        <span class=\"act-code\" style=\"background:${codeBg};color:${codeColor}\">${act.codeAct}<\/span>\n        <span class=\"act-label\">${act.libAct}<\/span>\n        <span class=\"act-chev\">&#9658;<\/span>\n      <\/div>\n      <div class=\"task-list\" id=\"tlist-${act.codeAct}\">${taskHTML}<\/div>`;\n    container.appendChild(actDiv);\n  });\n}\n\nfunction toggleAct(codeAct, hdr) {\n  const list = document.getElementById('tlist-'+codeAct);\n  const chev = hdr.querySelector('.act-chev');\n  const open = list.classList.toggle('open');\n  if (chev) chev.classList.toggle('open', open);\n}\n\nfunction toggleTask(codeAct, code) {\n  const org = ORG[currentCellule];\n  if (selectedTasks[code]) {\n    delete selectedTasks[code];\n    const cb = document.getElementById('tcb-'+code);\n    if (cb) cb.classList.remove('on');\n    const sop = document.getElementById('sop-'+code);\n    if (sop) sop.classList.remove('open');\n  } else {\n    \/\/ Find task data\n    let tData = null;\n    for (const act of org.activites) {\n      if (act.codeAct === codeAct) {\n        tData = act.taches.find(t => t.code === code);\n        break;\n      }\n    }\n    if (!tData) return;\n    selectedTasks[code] = { codeAct, data: tData, subOps: new Set(), note: '' };\n    const cb = document.getElementById('tcb-'+code);\n    if (cb) cb.classList.add('on');\n    const sop = document.getElementById('sop-'+code);\n    if (sop) sop.classList.add('open');\n  }\n  renderRecap();\n  onChange();\n}\n\nfunction toggleSub(taskCode, subId, e) {\n  e.stopPropagation();\n  if (!selectedTasks[taskCode]) return;\n  const s = selectedTasks[taskCode].subOps;\n  const cb = document.getElementById('scb-'+subId);\n  if (s.has(subId)) { s.delete(subId); if(cb) cb.classList.remove('on'); }\n  else { s.add(subId); if(cb) cb.classList.add('on'); }\n  renderRecap();\n}\n\nfunction updateNote(code, val) {\n  if (selectedTasks[code]) selectedTasks[code].note = val;\n}\n\n\/\/ \u2500\u2500 R\u00e9capitulatif \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction renderRecap() {\n  const area = document.getElementById('recap-area');\n  const pilEntries = Object.values(selectedPilotage);\n  const ptaEntries = Object.values(selectedTasks);\n  const isFCS = currentCellule === 'FCS';\n  const badgeClass = isFCS ? 'sel-badge fcs' : 'sel-badge';\n\n  if (!pilEntries.length && !ptaEntries.length) {\n    area.innerHTML = '<p class=\"no-sel\">Aucune t\u00e2che s\u00e9lectionn\u00e9e<\/p>';\n    return;\n  }\n\n  let html = '';\n  pilEntries.forEach(entry => {\n    const subs = [...entry.subOps].map(sid => entry.data.sousOps.find(s=>s.id===sid)?.lib||sid).join(' \u00b7 ');\n    html += `<div class=\"sel-item\">\n      <span class=\"${badgeClass}\">Pilotage<\/span>\n      <div class=\"sel-info\">\n        <div class=\"sel-name\">${entry.data.lib}<\/div>\n        ${subs ? `<div class=\"sel-subs\">${subs}<\/div>` : ''}\n        ${entry.note ? `<div class=\"sel-note\">${entry.note}<\/div>` : ''}\n      <\/div>\n      <span class=\"sel-remove\" onclick=\"removePil('${entry.data.code}')\">x<\/span>\n    <\/div>`;\n  });\n  ptaEntries.forEach(entry => {\n    const subs = [...entry.subOps].map(sid => entry.data.sousOps.find(s=>s.id===sid)?.lib||sid).join(' \u00b7 ');\n    html += `<div class=\"sel-item\">\n      <span class=\"${badgeClass}\">${entry.codeAct}<\/span>\n      <div class=\"sel-info\">\n        <div class=\"sel-name\">${entry.data.lib}<\/div>\n        ${subs ? `<div class=\"sel-subs\">${subs}<\/div>` : ''}\n        ${entry.note ? `<div class=\"sel-note\">${entry.note}<\/div>` : ''}\n      <\/div>\n      <span class=\"sel-remove\" onclick=\"removeSel('${entry.data.code}')\">x<\/span>\n    <\/div>`;\n  });\n  area.innerHTML = html;\n}\n\nfunction removePil(code) {\n  delete selectedPilotage[code];\n  const cb = document.getElementById('pcb-'+code);\n  if (cb) cb.classList.remove('on');\n  const sop = document.getElementById('psop-'+code);\n  if (sop) sop.classList.remove('open');\n  renderRecap(); onChange();\n}\nfunction removeSel(code) {\n  delete selectedTasks[code];\n  const cb = document.getElementById('tcb-'+code);\n  if (cb) cb.classList.remove('on');\n  const sop = document.getElementById('sop-'+code);\n  if (sop) sop.classList.remove('open');\n  renderRecap(); onChange();\n}\n\n\/\/ \u2500\u2500 Hors PTA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction addHors() {\n  const inp = document.getElementById('hors-input');\n  const val = inp.value.trim();\n  if (!val) return;\n  horsTasks.push({ id: 'h'+Date.now(), lib: val });\n  inp.value = '';\n  renderHors();\n  onChange();\n}\nfunction renderHors() {\n  document.getElementById('hors-list').innerHTML = horsTasks.map(h => `\n    <div class=\"hors-item\">\n      <span class=\"hors-badge\">Hors PTA<\/span>\n      <span class=\"hors-label\">${h.lib}<\/span>\n      <span class=\"hors-rm\" onclick=\"removeHors('${h.id}')\">x<\/span>\n    <\/div>`).join('');\n}\nfunction removeHors(id) {\n  horsTasks = horsTasks.filter(h => h.id !== id);\n  renderHors(); onChange();\n}\n\n\/\/ \u2500\u2500 Bilan \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction selectBilan(btn, cls, label) {\n  document.querySelectorAll('.bilan-btn').forEach(b => { b.className = 'bilan-btn'; });\n  btn.classList.add(cls);\n  bilanStatus = cls;\n  bilanLabel = label;\n  onChange();\n}\n\n\/\/ \u2500\u2500 Progression \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction onChange() {\n  const nom = document.getElementById('agent-nom').value.trim();\n  const date = document.getElementById('agent-date').value;\n  const cellule = document.getElementById('agent-cellule').value;\n  const hasTasks = Object.keys(selectedPilotage).length + Object.keys(selectedTasks).length + horsTasks.length > 0;\n  let score = 0;\n  if (nom) score += 20;\n  if (date) score += 10;\n  if (cellule) score += 15;\n  if (hasTasks) score += 30;\n  if (bilanStatus) score += 15;\n  if (document.getElementById('previsions')?.value?.trim()) score += 10;\n  document.getElementById('prog').style.width = score + '%';\n  const ready = nom && date && cellule && bilanStatus && hasTasks;\n  document.getElementById('submit-btn').disabled = !ready;\n}\n\n\/\/ \u2500\u2500 Soumission \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nfunction buildPayload() {\n  const celluleEl = document.getElementById('agent-cellule');\n  return {\n    meta: {\n      agent: document.getElementById('agent-nom').value.trim(),\n      cellule: celluleEl.options[celluleEl.selectedIndex]?.text || '',\n      celluleCode: currentCellule,\n      grade: document.getElementById('agent-grade').value,\n      date: document.getElementById('agent-date').value,\n      soumisLe: new Date().toISOString(),\n      version: '2.0'\n    },\n    pilotage: Object.values(selectedPilotage).map(e => ({\n      code: e.data.code,\n      lib: e.data.lib,\n      subOps: [...e.subOps].map(sid => ({ id: sid, lib: e.data.sousOps.find(s=>s.id===sid)?.lib||sid })),\n      note: e.note\n    })),\n    tachesPTA: Object.values(selectedTasks).map(e => ({\n      codeAct: e.codeAct,\n      codeTache: e.data.code,\n      libelleTache: e.data.lib,\n      sousOps: [...e.subOps].map(sid => ({ id: sid, lib: e.data.sousOps.find(s=>s.id===sid)?.lib||sid })),\n      note: e.note\n    })),\n    horsePTA: horsTasks.map(h => ({ id: h.id, lib: h.lib })),\n    bilan: {\n      statut: bilanLabel,\n      statutCode: bilanStatus,\n      blocages: document.getElementById('blocages').value,\n      previsions: document.getElementById('previsions').value,\n      observations: document.getElementById('observations').value\n    }\n  };\n}\n\nfunction submitJournal() {\n  const payload = buildPayload();\n  window._payload = payload;\n  document.getElementById('success-msg').classList.add('show');\n  document.getElementById('export-area').classList.add('show');\n  document.getElementById('submit-btn').textContent = 'Journal enregistre';\n  document.getElementById('submit-btn').disabled = true;\n  window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });\n}\n\nfunction exportJSON() {\n  const p = window._payload || buildPayload();\n  const blob = new Blob([JSON.stringify(p, null, 2)], { type: 'application\/json' });\n  const url = URL.createObjectURL(blob);\n  const a = document.createElement('a');\n  a.href = url;\n  a.download = `journal_${p.meta.date}_${p.meta.celluleCode}_${p.meta.agent.replace(\/\\s+\/g,'_')}.json`;\n  a.click();\n  URL.revokeObjectURL(url);\n}\n<\/script>\n<\/body>\n<\/html>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Journal de bord &#8211; NASLA Division de la Formation Journal de bord quotidien NASLA &#8211; Division de la Formation \u00b7 PTA 2026 Identification Nom et pr\u00e9nom * M\u00e9moriser Date * Grade \/ Fonction Cellule d&rsquo;appartenance * &#8212; Choisir votre cellule &#8212;Cellule de la Formation InitialeCellule de la Formation Continue et Sp\u00e9cifique Activit\u00e9s de pilotage et [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-15953","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/pages\/15953","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/comments?post=15953"}],"version-history":[{"count":13,"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/pages\/15953\/revisions"}],"predecessor-version":[{"id":16027,"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/pages\/15953\/revisions\/16027"}],"wp:attachment":[{"href":"https:\/\/elearning.nasla.cm\/index.php\/wp-json\/wp\/v2\/media?parent=15953"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}