{"id":3021,"date":"2026-08-21T16:39:35","date_gmt":"2026-08-21T16:39:35","guid":{"rendered":"https:\/\/maroczain.com\/?page_id=3021"},"modified":"2026-08-21T17:47:49","modified_gmt":"2026-08-21T17:47:49","slug":"simulateur-vol-complet","status":"publish","type":"page","link":"https:\/\/maroczain.com\/en\/simulateur-vol-complet\/","title":{"rendered":"Simulateur Vol complet"},"content":{"rendered":"\n<!-- =========================================================\n MAROC ZAIN ACADEMY\n EXTENSION AUTOMATIQUE CHEF DE CABINE\n SIMULATEUR + CERTIFICAT + RELEVE + ESPACE FORMATEUR\n========================================================= -->\n\n<style>\n.mza-auto{\n  --navy:#061f38;\n  --blue:#0c6db5;\n  --gold:#d7b34f;\n  --green:#16845c;\n  --red:#c23b36;\n  --light:#f4f7fb;\n  --white:#fff;\n  --grey:#667085;\n  max-width:1280px;\n  margin:60px auto;\n  padding:20px;\n  font-family:Arial,Helvetica,sans-serif;\n}\n\n.mza-auto h2,\n.mza-auto h3{\n  color:var(--navy);\n}\n\n.mza-auto-grid{\n  display:grid;\n  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));\n  gap:18px;\n}\n\n.mza-auto-card{\n  background:white;\n  border-radius:16px;\n  padding:22px;\n  box-shadow:0 10px 30px rgba(0,0,0,.08);\n  margin-bottom:18px;\n}\n\n.mza-auto-stat{\n  text-align:center;\n}\n\n.mza-auto-stat strong{\n  display:block;\n  font-size:34px;\n  color:var(--blue);\n}\n\n.mza-auto-btn{\n  border:none;\n  padding:12px 18px;\n  border-radius:9px;\n  font-weight:bold;\n  cursor:pointer;\n  margin:5px;\n}\n\n.mza-auto-blue{background:var(--blue);color:white}\n.mza-auto-gold{background:var(--gold);color:var(--navy)}\n.mza-auto-green{background:var(--green);color:white}\n.mza-auto-red{background:var(--red);color:white}\n\n.mza-flight-step{\n  border-left:6px solid var(--blue);\n  padding:20px;\n  border-radius:14px;\n  background:white;\n  margin-bottom:15px;\n  box-shadow:0 8px 25px rgba(0,0,0,.06);\n}\n\n.mza-flight-step.active{\n  border-left-color:var(--gold);\n}\n\n.mza-flight-step.done{\n  border-left-color:var(--green);\n}\n\n.mza-choice{\n  width:100%;\n  display:block;\n  text-align:left;\n  padding:13px;\n  margin:8px 0;\n  border:1px solid #d5dee7;\n  background:white;\n  border-radius:9px;\n  cursor:pointer;\n}\n\n.mza-choice:hover{\n  background:#eef6fd;\n}\n\n.mza-choice.good{\n  background:#e7f7ef;\n  border-color:var(--green);\n}\n\n.mza-choice.bad{\n  background:#fff0ef;\n  border-color:var(--red);\n}\n\n.mza-feedback{\n  margin-top:12px;\n  padding:14px;\n  border-radius:10px;\n  background:#fff8e5;\n  border-left:5px solid var(--gold);\n}\n\n.mza-progress{\n  width:100%;\n  height:18px;\n  background:#e1e7ed;\n  border-radius:20px;\n  overflow:hidden;\n  margin:15px 0;\n}\n\n#mzaFlightProgress{\n  height:100%;\n  width:0%;\n  background:linear-gradient(90deg,var(--blue),var(--gold));\n  transition:.4s;\n}\n\n.mza-table{\n  width:100%;\n  border-collapse:collapse;\n  background:white;\n}\n\n.mza-table th{\n  background:var(--navy);\n  color:white;\n  padding:12px;\n}\n\n.mza-table td{\n  padding:12px;\n  border-bottom:1px solid #e6ebf0;\n}\n\n.mza-certificate{\n  background:white;\n  border:10px double var(--gold);\n  padding:50px;\n  text-align:center;\n  margin-top:25px;\n}\n\n.mza-certificate h1{\n  color:var(--navy);\n  font-size:42px;\n}\n\n.mza-certificate h2{\n  color:var(--blue);\n}\n\n.mza-input{\n  width:100%;\n  padding:12px;\n  border:1px solid #ccd5df;\n  border-radius:8px;\n  margin:6px 0 15px;\n}\n\n.mza-hidden{\n  display:none;\n}\n\n@media print{\n  body *{\n    visibility:hidden;\n  }\n\n  #mzaCertificate,\n  #mzaCertificate *{\n    visibility:visible;\n  }\n\n  #mzaCertificate{\n    position:absolute;\n    left:0;\n    top:0;\n    width:100%;\n  }\n}\n<\/style>\n\n\n<section class=\"mza-auto\">\n\n<div class=\"mza-auto-card\">\n\n<h2>\u2708\ufe0f Simulateur Vol Complet \u2014 Chef de Cabine<\/h2>\n\n<p>\nBriefing \u2192 Embarquement \u2192 D\u00e9collage \u2192 Croisi\u00e8re \u2192 Incident \u2192\nCoordination cockpit \u2192 Atterrissage \u2192 D\u00e9briefing\n<\/p>\n\n<div class=\"mza-progress\">\n  <div id=\"mzaFlightProgress\"><\/div>\n<\/div>\n\n<p>\n\u00c9tape :\n<strong id=\"mzaFlightStageText\">0 \/ 8<\/strong>\n<\/p>\n\n<\/div>\n\n\n<div class=\"mza-auto-grid\">\n\n<div class=\"mza-auto-card mza-auto-stat\">\n<strong id=\"mzaFlightScore\">0<\/strong>\nScore vol\n<\/div>\n\n<div class=\"mza-auto-card mza-auto-stat\">\n<strong id=\"mzaFlightCorrect\">0<\/strong>\nBonnes d\u00e9cisions\n<\/div>\n\n<div class=\"mza-auto-card mza-auto-stat\">\n<strong id=\"mzaFlightErrors\">0<\/strong>\nErreurs\n<\/div>\n\n<div class=\"mza-auto-card mza-auto-stat\">\n<strong id=\"mzaFlightGrade\">Non \u00e9valu\u00e9<\/strong>\nNiveau\n<\/div>\n\n<\/div>\n\n\n<div id=\"mzaFlightScenario\"><\/div>\n\n\n<div style=\"text-align:center;margin:20px 0\">\n\n<button\nclass=\"mza-auto-btn mza-auto-blue\"\nonclick=\"mzaStartFlight()\">\nD\u00e9marrer le vol\n<\/button>\n\n<button\nclass=\"mza-auto-btn mza-auto-red\"\nonclick=\"mzaResetFlight()\">\nR\u00e9initialiser\n<\/button>\n\n<\/div>\n\n\n<hr style=\"margin:50px 0\">\n\n\n<!-- ============================\n IDENTITE APPRENANT\n============================ -->\n\n<div class=\"mza-auto-card\">\n\n<h2>\ud83d\udc64 Identit\u00e9 apprenant<\/h2>\n\n<label>Nom et pr\u00e9nom<\/label>\n<input id=\"mzaStudentName\" class=\"mza-input\"\nplaceholder=\"Nom et pr\u00e9nom\">\n\n<label>Identifiant apprenant<\/label>\n<input id=\"mzaStudentId\" class=\"mza-input\"\nplaceholder=\"Ex : MZA-CDC-0001\">\n\n<button\nclass=\"mza-auto-btn mza-auto-green\"\nonclick=\"mzaSaveStudent()\">\nEnregistrer\n<\/button>\n\n<\/div>\n\n\n<!-- ============================\n RELEVE\n============================ -->\n\n<div class=\"mza-auto-card\">\n\n<h2>\ud83d\udcca Relev\u00e9 de notes automatique<\/h2>\n\n<table class=\"mza-table\">\n\n<thead>\n<tr>\n<th>\u00c9valuation<\/th>\n<th>Score<\/th>\n<th>R\u00e9sultat<\/th>\n<\/tr>\n<\/thead>\n\n<tbody id=\"mzaGradeRows\"><\/tbody>\n\n<\/table>\n\n<div style=\"margin-top:20px\">\n\n<strong>Moyenne g\u00e9n\u00e9rale :<\/strong>\n<span id=\"mzaAverage\">0%<\/span>\n\n<\/div>\n\n<\/div>\n\n\n<!-- ============================\n CERTIFICAT\n============================ -->\n\n<div class=\"mza-auto-card\">\n\n<h2>\ud83c\udf93 Certificat automatique<\/h2>\n\n<button\nclass=\"mza-auto-btn mza-auto-gold\"\nonclick=\"mzaGenerateCertificate()\">\nG\u00e9n\u00e9rer le certificat\n<\/button>\n\n<button\nclass=\"mza-auto-btn mza-auto-blue\"\nonclick=\"window.print()\">\nImprimer \/ Enregistrer PDF\n<\/button>\n\n<div id=\"mzaCertificate\" class=\"mza-certificate mza-hidden\">\n\n<div style=\"font-size:18px;letter-spacing:3px\">\nMAROC ZAIN ACADEMY\n<\/div>\n\n<h1>CERTIFICAT DE R\u00c9USSITE<\/h1>\n\n<p>Il est certifi\u00e9 que<\/p>\n\n<h2 id=\"mzaCertificateName\">\nNom de l&rsquo;apprenant\n<\/h2>\n\n<p>\na satisfait aux exigences du parcours\n<\/p>\n\n<h2>\nCHEF DE CABINE\n<\/h2>\n\n<p>\nLeadership \u2022 CRM \u2022 S\u00e9curit\u00e9 \u2022 Gestion \u00e9quipage \u2022 Commandement cabine\n<\/p>\n\n<p>\nScore final :\n<strong id=\"mzaCertificateScore\">0%<\/strong>\n<\/p>\n\n<p>\nNiveau obtenu :\n<strong id=\"mzaCertificateLevel\">&#8211;<\/strong>\n<\/p>\n\n<p>\nIdentifiant :\n<strong id=\"mzaCertificateId\">&#8211;<\/strong>\n<\/p>\n\n<p id=\"mzaCertificateDate\"><\/p>\n\n<br><br>\n\n<p>\n<strong>Direction p\u00e9dagogique<\/strong>\n<br>\nMaroc Zain Academy\n<\/p>\n\n<\/div>\n\n<\/div>\n\n\n<!-- ============================\n ESPACE FORMATEUR\n============================ -->\n\n<div class=\"mza-auto-card\">\n\n<h2>\ud83e\uddd1\u200d\ud83c\udfeb Espace formateur<\/h2>\n\n<div class=\"mza-auto-grid\">\n\n<div class=\"mza-auto-stat\">\n<strong id=\"mzaTeacherTotal\">0<\/strong>\n\u00c9valuations\n<\/div>\n\n<div class=\"mza-auto-stat\">\n<strong id=\"mzaTeacherAverage\">0%<\/strong>\nMoyenne\n<\/div>\n\n<div class=\"mza-auto-stat\">\n<strong id=\"mzaTeacherBest\">0%<\/strong>\nMeilleur score\n<\/div>\n\n<div class=\"mza-auto-stat\">\n<strong id=\"mzaTeacherStatus\">\u00c0 suivre<\/strong>\nStatut\n<\/div>\n\n<\/div>\n\n<button\nclass=\"mza-auto-btn mza-auto-blue\"\nonclick=\"mzaExportResults()\">\nExporter r\u00e9sultats CSV\n<\/button>\n\n<button\nclass=\"mza-auto-btn mza-auto-red\"\nonclick=\"mzaClearResults()\">\nEffacer r\u00e9sultats\n<\/button>\n\n<\/div>\n\n<\/section>\n\n\n<script>\n\n\/* =========================================================\n ETAPES DU VOL\n========================================================= *\/\n\nconst mzaFlightStages = [\n\n{\ntitle:\"1. Briefing \u00e9quipage\",\ntext:\"Avant le d\u00e9part, un PNC junior semble h\u00e9sitant sur son r\u00f4le en cas d'urgence.\",\nchoices:[\n\"Ne rien changer pour ne pas le stresser.\",\n\"Clarifier son r\u00f4le, v\u00e9rifier sa compr\u00e9hension et rappeler les priorit\u00e9s.\",\n\"Demander \u00e0 un autre PNC de tout faire.\",\n\"Reporter le briefing apr\u00e8s le d\u00e9collage.\"\n],\ncorrect:1,\nlesson:\"Le briefing doit cr\u00e9er une compr\u00e9hension commune des responsabilit\u00e9s et des priorit\u00e9s.\"\n},\n\n{\ntitle:\"2. Embarquement\",\ntext:\"Un passager refuse de ranger un bagage cabine volumineux conform\u00e9ment aux consignes.\",\nchoices:[\n\"Laisser faire pour \u00e9viter un conflit.\",\n\"Expliquer la consigne, maintenir une attitude ferme et appliquer la proc\u00e9dure.\",\n\"Demander \u00e0 un autre passager d'intervenir.\",\n\"Promettre un avantage commercial.\"\n],\ncorrect:1,\nlesson:\"Le respect des consignes de s\u00e9curit\u00e9 prime sur le confort ou la n\u00e9gociation commerciale.\"\n},\n\n{\ntitle:\"3. D\u00e9collage\",\ntext:\"Pendant la phase critique, un passager se d\u00e9tache et se l\u00e8ve.\",\nchoices:[\n\"Ignorer la situation.\",\n\"Intervenir selon les proc\u00e9dures et rappeler imm\u00e9diatement la consigne.\",\n\"Attendre que le cockpit appelle.\",\n\"Demander aux passagers voisins de g\u00e9rer.\"\n],\ncorrect:1,\nlesson:\"En phase critique, la s\u00e9curit\u00e9 cabine exige une r\u00e9action claire et adapt\u00e9e.\"\n},\n\n{\ntitle:\"4. Croisi\u00e8re\",\ntext:\"Un membre d'\u00e9quipage signale une odeur inhabituelle dans le galley arri\u00e8re.\",\nchoices:[\n\"Continuer le service.\",\n\"\u00c9valuer rapidement la source et coordonner l'information.\",\n\"Attendre la fin du vol.\",\n\"Ouvrir tous les compartiments sans pr\u00e9caution.\"\n],\ncorrect:1,\nlesson:\"Toute suspicion de fum\u00e9e ou d'odeur anormale doit \u00eatre \u00e9valu\u00e9e rapidement.\"\n},\n\n{\ntitle:\"5. Incident en cabine\",\ntext:\"Un passager devient agressif apr\u00e8s le refus d'une demande incompatible avec les r\u00e8gles de s\u00e9curit\u00e9.\",\nchoices:[\n\"R\u00e9pondre sur le m\u00eame ton.\",\n\"Utiliser la d\u00e9sescalade, rappeler les limites et renforcer la coordination \u00e9quipage.\",\n\"Promettre ce qu'il demande.\",\n\"Quitter la zone sans informer personne.\"\n],\ncorrect:1,\nlesson:\"La d\u00e9sescalade combine calme, fermet\u00e9 et coordination.\"\n},\n\n{\ntitle:\"6. Coordination cockpit\",\ntext:\"Le commandant demande un point imm\u00e9diat sur la situation cabine.\",\nchoices:[\n\"Raconter toute la chronologie en d\u00e9tail.\",\n\"Transmettre un r\u00e9sum\u00e9 factuel, court et utile \u00e0 la d\u00e9cision.\",\n\"Attendre la fin de l'incident.\",\n\"Donner uniquement votre opinion.\"\n],\ncorrect:1,\nlesson:\"Le cockpit a besoin d'informations concises, factuelles et directement exploitables.\"\n},\n\n{\ntitle:\"7. Approche et atterrissage\",\ntext:\"Un PNC vous signale qu'un passager anxieux refuse de respecter les consignes de pr\u00e9paration cabine.\",\nchoices:[\n\"Ignorer pour \u00e9viter une escalade.\",\n\"Renforcer la communication et faire appliquer les consignes selon proc\u00e9dure.\",\n\"Reporter la discussion apr\u00e8s l'atterrissage.\",\n\"Demander aux passagers voisins de le convaincre.\"\n],\ncorrect:1,\nlesson:\"La conformit\u00e9 aux consignes en approche reste essentielle.\"\n},\n\n{\ntitle:\"8. D\u00e9briefing\",\ntext:\"Apr\u00e8s le vol, plusieurs membres d'\u00e9quipage signalent que certaines informations ont circul\u00e9 trop tard.\",\nchoices:[\n\"Ne rien relever puisque le vol est termin\u00e9.\",\n\"Analyser l'\u00e9v\u00e9nement, identifier les \u00e9carts et formaliser les axes d'am\u00e9lioration.\",\n\"Accuser un seul membre d'\u00e9quipage.\",\n\"\u00c9viter d'en parler pour pr\u00e9server l'ambiance.\"\n],\ncorrect:1,\nlesson:\"Le d\u00e9briefing transforme l'exp\u00e9rience op\u00e9rationnelle en apprentissage collectif.\"\n}\n\n];\n\n\nlet mzaFlightIndex = -1;\nlet mzaFlightScore = 0;\nlet mzaFlightCorrect = 0;\nlet mzaFlightErrors = 0;\n\n\n\/* =========================================================\n VOL\n========================================================= *\/\n\nfunction mzaStartFlight(){\n\n  mzaFlightIndex = 0;\n  mzaFlightScore = 0;\n  mzaFlightCorrect = 0;\n  mzaFlightErrors = 0;\n\n  mzaRenderFlightStage();\n  mzaUpdateFlightStats();\n\n}\n\n\nfunction mzaRenderFlightStage(){\n\n  if(mzaFlightIndex >= mzaFlightStages.length){\n\n    mzaFinishFlight();\n    return;\n\n  }\n\n  const stage = mzaFlightStages[mzaFlightIndex];\n\n  const box =\n  document.getElementById(\"mzaFlightScenario\");\n\n  let html = `\n\n  <div class=\"mza-flight-step active\">\n\n  <h3>${stage.title}<\/h3>\n\n  <p>${stage.text}<\/p>\n\n  `;\n\n  stage.choices.forEach((choice,index)=>{\n\n    html += `\n\n    <button\n    class=\"mza-choice\"\n    onclick=\"mzaFlightAnswer(${index},this)\">\n\n    ${String.fromCharCode(65+index)} \u2014 ${choice}\n\n    <\/button>\n\n    `;\n\n  });\n\n  html += `\n\n  <div id=\"mzaFlightFeedback\"><\/div>\n\n  <\/div>\n\n  `;\n\n  box.innerHTML = html;\n\n  const progress =\n  (mzaFlightIndex \/\n   mzaFlightStages.length) * 100;\n\n  document.getElementById(\n    \"mzaFlightProgress\"\n  ).style.width =\n  progress + \"%\";\n\n  document.getElementById(\n    \"mzaFlightStageText\"\n  ).textContent =\n  (mzaFlightIndex+1) +\n  \" \/ \" +\n  mzaFlightStages.length;\n\n}\n\n\nfunction mzaFlightAnswer(answer,button){\n\n  const stage =\n  mzaFlightStages[mzaFlightIndex];\n\n  const parent =\n  button.parentElement;\n\n  const buttons =\n  parent.querySelectorAll(\".mza-choice\");\n\n  buttons.forEach(\n    b=>b.disabled=true\n  );\n\n  if(answer===stage.correct){\n\n    button.classList.add(\"good\");\n\n    mzaFlightCorrect++;\n    mzaFlightScore+=100;\n\n  }else{\n\n    button.classList.add(\"bad\");\n\n    buttons[\n      stage.correct\n    ].classList.add(\"good\");\n\n    mzaFlightErrors++;\n    mzaFlightScore+=10;\n\n  }\n\n  document.getElementById(\n    \"mzaFlightFeedback\"\n  ).innerHTML = `\n\n  <div class=\"mza-feedback\">\n\n  <strong>D\u00e9briefing :<\/strong>\n  <br>\n\n  ${stage.lesson}\n\n  <br><br>\n\n  <button\n  class=\"mza-auto-btn mza-auto-blue\"\n  onclick=\"mzaNextFlightStage()\">\n\n  \u00c9tape suivante \u2192\n\n  <\/button>\n\n  <\/div>\n\n  `;\n\n  mzaUpdateFlightStats();\n\n}\n\n\nfunction mzaNextFlightStage(){\n\n  mzaFlightIndex++;\n\n  mzaRenderFlightStage();\n\n}\n\n\nfunction mzaFinishFlight(){\n\n  const percent =\n  Math.round(\n    mzaFlightCorrect \/\n    mzaFlightStages.length *\n    100\n  );\n\n  let grade = \"\u00c0 renforcer\";\n\n  if(percent>=70)\n    grade=\"Op\u00e9rationnel\";\n\n  if(percent>=85)\n    grade=\"Confirm\u00e9\";\n\n  if(percent>=95)\n    grade=\"Expert\";\n\n\n  document.getElementById(\n    \"mzaFlightGrade\"\n  ).textContent =\n  grade;\n\n\n  document.getElementById(\n    \"mzaFlightProgress\"\n  ).style.width =\n  \"100%\";\n\n\n  document.getElementById(\n    \"mzaFlightScenario\"\n  ).innerHTML = `\n\n  <div class=\"mza-flight-step done\">\n\n  <h2>Vol termin\u00e9<\/h2>\n\n  <p>\n  Score final :\n  <strong>${percent}%<\/strong>\n  <\/p>\n\n  <p>\n  Niveau :\n  <strong>${grade}<\/strong>\n  <\/p>\n\n  <\/div>\n\n  `;\n\n\n  mzaAddGrade(\n    \"Simulation vol complet\",\n    percent\n  );\n\n}\n\n\nfunction mzaUpdateFlightStats(){\n\n  document.getElementById(\n    \"mzaFlightScore\"\n  ).textContent =\n  mzaFlightScore;\n\n  document.getElementById(\n    \"mzaFlightCorrect\"\n  ).textContent =\n  mzaFlightCorrect;\n\n  document.getElementById(\n    \"mzaFlightErrors\"\n  ).textContent =\n  mzaFlightErrors;\n\n}\n\n\nfunction mzaResetFlight(){\n\n  mzaFlightIndex = -1;\n  mzaFlightScore = 0;\n  mzaFlightCorrect = 0;\n  mzaFlightErrors = 0;\n\n  document.getElementById(\n    \"mzaFlightScenario\"\n  ).innerHTML = \"\";\n\n  document.getElementById(\n    \"mzaFlightProgress\"\n  ).style.width = \"0%\";\n\n  document.getElementById(\n    \"mzaFlightStageText\"\n  ).textContent = \"0 \/ 8\";\n\n  document.getElementById(\n    \"mzaFlightGrade\"\n  ).textContent = \"Non \u00e9valu\u00e9\";\n\n  mzaUpdateFlightStats();\n\n}\n\n\n\/* =========================================================\n APPRENANT\n========================================================= *\/\n\nlet mzaStudent =\nJSON.parse(\n  localStorage.getItem(\n    \"MZA_CDC_STUDENT\"\n  )\n) || {\n  name:\"\",\n  id:\"\"\n};\n\n\nfunction mzaSaveStudent(){\n\n  mzaStudent.name =\n  document.getElementById(\n    \"mzaStudentName\"\n  ).value.trim();\n\n  mzaStudent.id =\n  document.getElementById(\n    \"mzaStudentId\"\n  ).value.trim();\n\n  localStorage.setItem(\n    \"MZA_CDC_STUDENT\",\n    JSON.stringify(mzaStudent)\n  );\n\n  alert(\"Profil apprenant enregistr\u00e9.\");\n\n}\n\n\n\/* =========================================================\n NOTES\n========================================================= *\/\n\nlet mzaGrades =\nJSON.parse(\n  localStorage.getItem(\n    \"MZA_CDC_GRADES\"\n  )\n) || [];\n\n\nfunction mzaAddGrade(name,score){\n\n  mzaGrades.push({\n\n    name:name,\n    score:score,\n    date:new Date().toLocaleDateString(\"fr-FR\")\n\n  });\n\n  localStorage.setItem(\n    \"MZA_CDC_GRADES\",\n    JSON.stringify(mzaGrades)\n  );\n\n  mzaRenderGrades();\n\n}\n\n\nfunction mzaRenderGrades(){\n\n  const rows =\n  document.getElementById(\n    \"mzaGradeRows\"\n  );\n\n  rows.innerHTML = \"\";\n\n\n  mzaGrades.forEach(g=>{\n\n    const status =\n    g.score >= 70\n    ?\n    \"Valid\u00e9\"\n    :\n    \"\u00c0 renforcer\";\n\n\n    rows.innerHTML += `\n\n    <tr>\n\n    <td>\n    ${g.name}\n    <br>\n    <small>${g.date}<\/small>\n    <\/td>\n\n    <td>\n    ${g.score}%\n    <\/td>\n\n    <td>\n    ${status}\n    <\/td>\n\n    <\/tr>\n\n    `;\n\n  });\n\n\n  const average =\n  mzaGrades.length\n  ?\n  Math.round(\n    mzaGrades.reduce(\n      (sum,g)=>sum+g.score,\n      0\n    ) \/\n    mzaGrades.length\n  )\n  :\n  0;\n\n\n  document.getElementById(\n    \"mzaAverage\"\n  ).textContent =\n  average+\"%\";\n\n\n  mzaUpdateTeacher();\n\n}\n\n\n\/* =========================================================\n CERTIFICAT\n========================================================= *\/\n\nfunction mzaGenerateCertificate(){\n\n  const average =\n  mzaGrades.length\n  ?\n  Math.round(\n    mzaGrades.reduce(\n      (sum,g)=>sum+g.score,\n      0\n    ) \/\n    mzaGrades.length\n  )\n  :\n  0;\n\n\n  if(average < 70){\n\n    alert(\n      \"Le certificat est disponible \u00e0 partir d'une moyenne de 70%.\"\n    );\n\n    return;\n\n  }\n\n\n  const name =\n  mzaStudent.name\n  ||\n  \"Apprenant Maroc Zain Academy\";\n\n\n  let level =\n  \"Op\u00e9rationnel\";\n\n  if(average>=85)\n    level=\"Confirm\u00e9\";\n\n  if(average>=95)\n    level=\"Expert\";\n\n\n  document.getElementById(\n    \"mzaCertificateName\"\n  ).textContent =\n  name;\n\n\n  document.getElementById(\n    \"mzaCertificateScore\"\n  ).textContent =\n  average+\"%\";\n\n\n  document.getElementById(\n    \"mzaCertificateLevel\"\n  ).textContent =\n  level;\n\n\n  document.getElementById(\n    \"mzaCertificateId\"\n  ).textContent =\n  mzaStudent.id || \"MZA-CDC\";\n\n\n  document.getElementById(\n    \"mzaCertificateDate\"\n  ).textContent =\n  \"D\u00e9livr\u00e9 le \" +\n  new Date().toLocaleDateString(\"fr-FR\");\n\n\n  document.getElementById(\n    \"mzaCertificate\"\n  ).classList.remove(\n    \"mza-hidden\"\n  );\n\n}\n\n\n\/* =========================================================\n FORMATEUR\n========================================================= *\/\n\nfunction mzaUpdateTeacher(){\n\n  const total =\n  mzaGrades.length;\n\n\n  const average =\n  total\n  ?\n  Math.round(\n    mzaGrades.reduce(\n      (s,g)=>s+g.score,\n      0\n    ) \/\n    total\n  )\n  :\n  0;\n\n\n  const best =\n  total\n  ?\n  Math.max(\n    ...mzaGrades.map(\n      g=>g.score\n    )\n  )\n  :\n  0;\n\n\n  let status =\n  \"\u00c0 suivre\";\n\n  if(average>=70)\n    status=\"Progression satisfaisante\";\n\n  if(average>=85)\n    status=\"Tr\u00e8s bon niveau\";\n\n  if(average>=95)\n    status=\"Excellence\";\n\n\n  document.getElementById(\n    \"mzaTeacherTotal\"\n  ).textContent =\n  total;\n\n\n  document.getElementById(\n    \"mzaTeacherAverage\"\n  ).textContent =\n  average+\"%\";\n\n\n  document.getElementById(\n    \"mzaTeacherBest\"\n  ).textContent =\n  best+\"%\";\n\n\n  document.getElementById(\n    \"mzaTeacherStatus\"\n  ).textContent =\n  status;\n\n}\n\n\n\/* =========================================================\n EXPORT CSV\n========================================================= *\/\n\nfunction mzaExportResults(){\n\n  let csv =\n  \"Evaluation,Score,Date\\n\";\n\n\n  mzaGrades.forEach(g=>{\n\n    csv +=\n    `\"${g.name}\",${g.score},\"${g.date}\"\\n`;\n\n  });\n\n\n  const blob =\n  new Blob(\n    [csv],\n    {\n      type:\"text\/csv;charset=utf-8;\"\n    }\n  );\n\n\n  const url =\n  URL.createObjectURL(blob);\n\n\n  const link =\n  document.createElement(\"a\");\n\n\n  link.href = url;\n\n  link.download =\n  \"resultats-chef-de-cabine.csv\";\n\n\n  link.click();\n\n\n  URL.revokeObjectURL(url);\n\n}\n\n\n\/* =========================================================\n RESET NOTES\n========================================================= *\/\n\nfunction mzaClearResults(){\n\n  if(\n    confirm(\n      \"Effacer tous les r\u00e9sultats enregistr\u00e9s ?\"\n    )\n  ){\n\n    mzaGrades = [];\n\n    localStorage.removeItem(\n      \"MZA_CDC_GRADES\"\n    );\n\n    mzaRenderGrades();\n\n  }\n\n}\n\n\n\/* =========================================================\n INIT\n========================================================= *\/\n\ndocument.getElementById(\n  \"mzaStudentName\"\n).value =\nmzaStudent.name;\n\n\ndocument.getElementById(\n  \"mzaStudentId\"\n).value =\nmzaStudent.id;\n\n\nmzaRenderGrades();\nmzaUpdateTeacher();\nmzaUpdateFlightStats();\n\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>\u2708\ufe0f Simulateur Vol Complet \u2014 Chef de Cabine Briefing \u2192 Embarquement \u2192 D\u00e9collage \u2192 Croisi\u00e8re \u2192 Incident \u2192 Coordination cockpit \u2192 Atterrissage \u2192 D\u00e9briefing \u00c9tape : 0 \/ 8 0 Score vol 0 Bonnes d\u00e9cisions 0 Erreurs Non \u00e9valu\u00e9 Niveau D\u00e9marrer le vol R\u00e9initialiser \ud83d\udc64 Identit\u00e9 apprenant Nom et pr\u00e9nom Identifiant apprenant Enregistrer \ud83d\udcca Relev\u00e9 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3021","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/pages\/3021","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/comments?post=3021"}],"version-history":[{"count":2,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/pages\/3021\/revisions"}],"predecessor-version":[{"id":3119,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/pages\/3021\/revisions\/3119"}],"wp:attachment":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/media?parent=3021"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}