{"id":3902,"date":"2026-08-23T11:50:13","date_gmt":"2026-08-23T11:50:13","guid":{"rendered":"https:\/\/maroczain.com\/?p=3902"},"modified":"2026-08-23T11:50:13","modified_gmt":"2026-08-23T11:50:13","slug":"3902","status":"publish","type":"post","link":"https:\/\/maroczain.com\/en\/2026\/08\/23\/3902\/","title":{"rendered":""},"content":{"rendered":"\n<!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>Maroc Zain \u2014 Passenger Flight Scheduler<\/title>\n<style>\n:root{\n  --navy:#071d3a;--blue:#0f5f9a;--gold:#e9c84a;--bg:#f4f7fb;--card:#fff;\n  --text:#17243a;--muted:#6f7d90;--border:#e4ebf3;--ok:#1f9d66;--warn:#c48700;--bad:#b43b32;\n}\n*{box-sizing:border-box}\nbody{margin:0;font-family:Arial,Helvetica,sans-serif;background:var(--bg);color:var(--text)}\n.wrap{max-width:1400px;margin:auto;padding:24px}\n.hero{background:linear-gradient(135deg,var(--navy),var(--blue));color:#fff;border-radius:26px;padding:34px;display:grid;grid-template-columns:1.6fr 1fr;gap:24px;align-items:center;box-shadow:0 16px 38px rgba(20,48,80,.12)}\n.hero h1{font-size:40px;line-height:1.08;margin:0 0 12px}.hero p{opacity:.9;max-width:800px}\n.badge{display:inline-block;background:rgba(255,255,255,.14);padding:7px 10px;border-radius:999px;font-size:12px;font-weight:800}\n.hero-card{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.2);padding:22px;border-radius:18px}\n.hero-card strong{display:block;font-size:34px}\n.section-title{font-size:26px;color:#0e315c;margin:28px 0 14px}\n.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}\n.card{background:#fff;border:1px solid var(--border);border-radius:17px;padding:19px;box-shadow:0 10px 26px rgba(20,48,80,.06)}\n.card h3{margin-top:0}\nlabel{display:block;font-weight:700;font-size:14px;margin:10px 0}\ninput,select{width:100%;padding:10px;border:1px solid #d9e2ec;border-radius:10px;margin-top:5px}\n.actions{display:flex;gap:10px;flex-wrap:wrap;margin:18px 0}\n.btn{border:0;border-radius:11px;padding:12px 16px;font-weight:800;cursor:pointer}\n.btn-blue{background:var(--blue);color:#fff}.btn-gold{background:var(--gold);color:var(--navy)}.btn-soft{background:#edf5fc;color:var(--blue)}\n.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px}\n.kpi{background:#fff;border:1px solid var(--border);border-radius:15px;padding:17px}\n.kpi .label{font-size:13px;color:var(--muted)}.kpi .value{font-size:29px;font-weight:900;color:var(--blue);margin-top:5px}\n.table-wrap{overflow:auto}\ntable{width:100%;border-collapse:collapse}\nth,td{padding:11px 10px;border-bottom:1px solid var(--border);text-align:left;white-space:nowrap}\nth{font-size:12px;color:var(--muted);text-transform:uppercase}\n.ok{color:var(--ok);font-weight:800}.warn{color:var(--warn);font-weight:800}.bad{color:var(--bad);font-weight:800}\n.note{background:#fff8dc;border:1px solid #f0dc7b;color:#705a00;padding:13px;border-radius:11px;margin-top:18px}\n.tabs{display:flex;gap:10px;flex-wrap:wrap;margin:22px 0}\n.tab{background:#fff;border:1px solid var(--border);padding:11px 14px;border-radius:11px;font-weight:800;cursor:pointer}\n.tab.active{background:var(--navy);color:#fff}\n.panel{display:none}.panel.active{display:block}\n.two{display:grid;grid-template-columns:1fr 1fr;gap:14px}\n@media(max-width:1000px){.grid,.kpis{grid-template-columns:repeat(2,1fr)}.hero,.two{grid-template-columns:1fr}}\n@media(max-width:620px){.grid,.kpis{grid-template-columns:1fr}.wrap{padding:14px}.hero h1{font-size:30px}}\n<\/style>\n<\/head>\n<body>\n<div class=\"wrap\">\n\n<section class=\"hero\">\n  <div>\n    <span class=\"badge\">PASSENGER FLIGHT PROGRAMMING ENGINE<\/span>\n    <h1>Programmation des vols passagers<\/h1>\n    <p>Planifiez des lignes, horaires et avions, estimez la demande, le remplissage et le chiffre d\u2019affaires, puis d\u00e9tectez les conflits de rotation.<\/p>\n  <\/div>\n  <div class=\"hero-card\">\n    <strong>Commercial Scheduler<\/strong>\n    <span>Planification \u2022 Simulation \u2022 Rentabilit\u00e9<\/span>\n  <\/div>\n<\/section>\n\n<div class=\"tabs\">\n  <button class=\"tab active\" data-tab=\"scheduler\">\ud83d\udeeb Scheduler<\/button>\n  <button class=\"tab\" data-tab=\"program\">\ud83d\udcc5 Programme<\/button>\n  <button class=\"tab\" data-tab=\"network\">\ud83c\udf0d R\u00e9seau<\/button>\n  <button class=\"tab\" data-tab=\"analysis\">\ud83d\udcca Analyse<\/button>\n<\/div>\n\n<section id=\"scheduler\" class=\"panel active\">\n  <h2 class=\"section-title\">Cr\u00e9er un vol<\/h2>\n  <div class=\"grid\">\n    <div class=\"card\">\n      <h3>Route<\/h3>\n      <label>Origine\n        <select id=\"origin\">\n          <option>CMN<\/option><option>RAK<\/option><option>AGA<\/option><option>RBA<\/option><option>FEZ<\/option>\n        <\/select>\n      <\/label>\n      <label>Destination\n        <select id=\"destination\">\n          <option>ORY<\/option><option>CDG<\/option><option>MAD<\/option><option>RAK<\/option><option>AGA<\/option>\n        <\/select>\n      <\/label>\n      <label>Distance km\n        <input type=\"number\" id=\"distance\" value=\"1900\">\n      <\/label>\n    <\/div>\n\n    <div class=\"card\">\n      <h3>Horaire<\/h3>\n      <label>Date\n        <input type=\"date\" id=\"date\">\n      <\/label>\n      <label>D\u00e9part\n        <input type=\"time\" id=\"departure\" value=\"08:00\">\n      <\/label>\n      <label>Dur\u00e9e estim\u00e9e (min)\n        <input type=\"number\" id=\"duration\" value=\"180\">\n      <\/label>\n    <\/div>\n\n    <div class=\"card\">\n      <h3>Avion<\/h3>\n      <label>Type\n        <select id=\"aircraft\">\n          <option value=\"100|4500\">E190 \u2014 100 si\u00e8ges<\/option>\n          <option value=\"180|6100\">A320 \u2014 180 si\u00e8ges<\/option>\n          <option value=\"189|5600\">B737-800 \u2014 189 si\u00e8ges<\/option>\n          <option value=\"300|14000\">B787-9 \u2014 300 si\u00e8ges<\/option>\n        <\/select>\n      <\/label>\n      <label>Code avion\n        <input id=\"aircraftCode\" value=\"AC001\">\n      <\/label>\n    <\/div>\n\n    <div class=\"card\">\n      <h3>March\u00e9<\/h3>\n      <label>Pr\u00e9vision demande\n        <input type=\"number\" id=\"demand\" value=\"210\">\n      <\/label>\n      <label>Tarif moyen MAD\n        <input type=\"number\" id=\"fare\" value=\"2300\">\n      <\/label>\n      <label>Co\u00fbt estim\u00e9 du vol MAD\n        <input type=\"number\" id=\"cost\" value=\"250000\">\n      <\/label>\n    <\/div>\n  <\/div>\n\n  <div class=\"actions\">\n    <button class=\"btn btn-blue\" onclick=\"simulate()\">Simuler<\/button>\n    <button class=\"btn btn-gold\" onclick=\"addFlight()\">Ajouter au programme<\/button>\n    <button class=\"btn btn-soft\" onclick=\"resetForm()\">R\u00e9initialiser<\/button>\n  <\/div>\n\n  <div id=\"simulation\"><\/div>\n<\/section>\n\n<section id=\"program\" class=\"panel\">\n  <h2 class=\"section-title\">Programme de vols<\/h2>\n  <div class=\"card table-wrap\">\n    <table>\n      <thead>\n        <tr>\n          <th>Vol<\/th><th>Date<\/th><th>Route<\/th><th>D\u00e9part<\/th><th>Arriv\u00e9e<\/th>\n          <th>Avion<\/th><th>Capacit\u00e9<\/th><th>Demande<\/th><th>LF<\/th><th>CA<\/th><th>Marge<\/th><th>Alerte<\/th>\n        <\/tr>\n      <\/thead>\n      <tbody id=\"programBody\"><\/tbody>\n    <\/table>\n  <\/div>\n<\/section>\n\n<section id=\"network\" class=\"panel\">\n  <h2 class=\"section-title\">R\u00e9seau commercial<\/h2>\n  <div class=\"two\">\n    <div class=\"card\">\n      <h3>Routes de d\u00e9monstration<\/h3>\n      <table>\n        <thead><tr><th>Route<\/th><th>Demande<\/th><th>Tarif moyen<\/th><\/tr><\/thead>\n        <tbody>\n          <tr><td>CMN \u2192 ORY<\/td><td>210<\/td><td>2 200 MAD<\/td><\/tr>\n          <tr><td>CMN \u2192 CDG<\/td><td>240<\/td><td>2 500 MAD<\/td><\/tr>\n          <tr><td>CMN \u2192 MAD<\/td><td>180<\/td><td>1 400 MAD<\/td><\/tr>\n          <tr><td>CMN \u2192 AGA<\/td><td>170<\/td><td>720 MAD<\/td><\/tr>\n          <tr><td>CMN \u2192 RAK<\/td><td>150<\/td><td>650 MAD<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <div class=\"card\">\n      <h3>Indicateurs r\u00e9seau<\/h3>\n      <p><strong>Objectif :<\/strong> arbitrer capacit\u00e9, fr\u00e9quence et horaire.<\/p>\n      <p><strong>Priorit\u00e9s :<\/strong> demande, marge, correspondances, utilisation avion, saisonnalit\u00e9.<\/p>\n      <p><strong>\u00c0 ajouter c\u00f4t\u00e9 serveur :<\/strong> historique ventes, courbes de r\u00e9servation, no-show, classes tarifaires, saisonnalit\u00e9.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section id=\"analysis\" class=\"panel\">\n  <h2 class=\"section-title\">Analyse du programme<\/h2>\n  <div id=\"analysisKpis\" class=\"kpis\"><\/div>\n  <div class=\"card\">\n    <h3>Lecture manag\u00e9riale<\/h3>\n    <div id=\"analysisText\">Ajoutez des vols au programme pour obtenir une analyse consolid\u00e9e.<\/div>\n  <\/div>\n<\/section>\n\n<div class=\"note\">\n  Outil de simulation commerciale et p\u00e9dagogique. Il ne remplace pas un syst\u00e8me r\u00e9el certifi\u00e9 de dispatch, maintenance, contr\u00f4le des vols ou s\u00e9curit\u00e9 a\u00e9rienne.\n<\/div>\n\n<\/div>\n\n<script>\nlet program=[];\n\nfunction mins(t){const [h,m]=t.split(':').map(Number);return h*60+m}\nfunction timeFrom(total){total=((total%1440)+1440)%1440;return String(Math.floor(total\/60)).padStart(2,'0')+':'+String(total%60).padStart(2,'0')}\nfunction acData(){\n  const [seats,range]=document.getElementById('aircraft').value.split('|').map(Number);\n  return {seats,range};\n}\nfunction getFlight(){\n  const origin=document.getElementById('origin').value;\n  const destination=document.getElementById('destination').value;\n  const date=document.getElementById('date').value || new Date().toISOString().slice(0,10);\n  const departure=document.getElementById('departure').value || '08:00';\n  const duration=parseInt(document.getElementById('duration').value||0);\n  const distance=parseInt(document.getElementById('distance').value||0);\n  const demand=parseInt(document.getElementById('demand').value||0);\n  const fare=parseFloat(document.getElementById('fare').value||0);\n  const cost=parseFloat(document.getElementById('cost').value||0);\n  const aircraftCode=document.getElementById('aircraftCode').value.trim()||'AC001';\n  const ac=acData();\n  const pax=Math.min(demand,ac.seats);\n  const lf=ac.seats?Math.round((pax\/ac.seats)*100):0;\n  const revenue=pax*fare;\n  const margin=revenue-cost;\n  const arrival=timeFrom(mins(departure)+duration);\n  let alert='OK';\n  if(distance>ac.range) alert='Rayon insuffisant';\n  else if(lf>98) alert='Saturation';\n  else if(lf<60) alert='Sous-remplissage';\n  else if(margin<0) alert='Marge n\u00e9gative';\n  return {origin,destination,date,departure,duration,distance,demand,fare,cost,aircraftCode,seats:ac.seats,range:ac.range,pax,lf,revenue,margin,arrival,alert};\n}\nfunction simulate(){\n  const f=getFlight();\n  document.getElementById('simulation').innerHTML=`\n    <div class=\"kpis\">\n      <div class=\"kpi\"><div class=\"label\">Capacit\u00e9<\/div><div class=\"value\">${f.seats}<\/div><\/div>\n      <div class=\"kpi\"><div class=\"label\">Passagers servis<\/div><div class=\"value\">${f.pax}<\/div><\/div>\n      <div class=\"kpi\"><div class=\"label\">Load Factor<\/div><div class=\"value\">${f.lf}%<\/div><\/div>\n      <div class=\"kpi\"><div class=\"label\">CA estim\u00e9<\/div><div class=\"value\">${Math.round(f.revenue).toLocaleString()} MAD<\/div><\/div>\n    <\/div>\n    <div class=\"card\">\n      <strong>Marge estim\u00e9e :<\/strong> ${Math.round(f.margin).toLocaleString()} MAD<br>\n      <strong>Arriv\u00e9e :<\/strong> ${f.arrival}<br>\n      <strong>Analyse :<\/strong> <span class=\"${f.alert==='OK'?'ok':(f.alert==='Sous-remplissage'?'warn':'bad')}\">${f.alert}<\/span>\n    <\/div>`;\n}\nfunction addFlight(){\n  const f=getFlight();\n  f.flightNo='MZ'+String(101+program.length);\n  f.conflict='';\n  for(const p of program){\n    if(p.date===f.date && p.aircraftCode===f.aircraftCode){\n      const a1=mins(p.departure), a2=mins(p.arrival), b1=mins(f.departure), b2=mins(f.arrival);\n      if(!(b2<=a1 || b1>=a2)) f.conflict='Conflit avion';\n    }\n  }\n  program.push(f);\n  renderProgram();\n  renderAnalysis();\n  simulate();\n}\nfunction renderProgram(){\n  document.getElementById('programBody').innerHTML=program.map(f=>`\n    <tr>\n      <td>${f.flightNo}<\/td><td>${f.date}<\/td><td>${f.origin} \u2192 ${f.destination}<\/td>\n      <td>${f.departure}<\/td><td>${f.arrival}<\/td><td>${f.aircraftCode}<\/td>\n      <td>${f.seats}<\/td><td>${f.demand}<\/td><td>${f.lf}%<\/td>\n      <td>${Math.round(f.revenue).toLocaleString()} MAD<\/td>\n      <td>${Math.round(f.margin).toLocaleString()} MAD<\/td>\n      <td class=\"${f.conflict||f.alert!=='OK'?'bad':'ok'}\">${f.conflict||f.alert}<\/td>\n    <\/tr>`).join('');\n}\nfunction renderAnalysis(){\n  if(!program.length)return;\n  const revenue=program.reduce((s,f)=>s+f.revenue,0);\n  const margin=program.reduce((s,f)=>s+f.margin,0);\n  const seats=program.reduce((s,f)=>s+f.seats,0);\n  const pax=program.reduce((s,f)=>s+f.pax,0);\n  const lf=seats?Math.round(pax\/seats*100):0;\n  const conflicts=program.filter(f=>f.conflict).length;\n  document.getElementById('analysisKpis').innerHTML=`\n    <div class=\"kpi\"><div class=\"label\">Vols<\/div><div class=\"value\">${program.length}<\/div><\/div>\n    <div class=\"kpi\"><div class=\"label\">LF global<\/div><div class=\"value\">${lf}%<\/div><\/div>\n    <div class=\"kpi\"><div class=\"label\">CA total<\/div><div class=\"value\">${Math.round(revenue).toLocaleString()} MAD<\/div><\/div>\n    <div class=\"kpi\"><div class=\"label\">Marge totale<\/div><div class=\"value\">${Math.round(margin).toLocaleString()} MAD<\/div><\/div>`;\n  document.getElementById('analysisText').innerHTML=\n    `Le programme compte <strong>${program.length}<\/strong> vol(s), avec un remplissage global de <strong>${lf}%<\/strong>. `+\n    `Conflits avion d\u00e9tect\u00e9s : <strong>${conflicts}<\/strong>. `+\n    (margin>=0?`La marge consolid\u00e9e estim\u00e9e est positive.`:`La marge consolid\u00e9e estim\u00e9e est n\u00e9gative et n\u00e9cessite une r\u00e9vision de capacit\u00e9, tarif, co\u00fbts ou fr\u00e9quence.`);\n}\nfunction resetForm(){\n  document.getElementById('origin').value='CMN';\n  document.getElementById('destination').value='ORY';\n  document.getElementById('distance').value='1900';\n  document.getElementById('departure').value='08:00';\n  document.getElementById('duration').value='180';\n  document.getElementById('aircraft').selectedIndex=1;\n  document.getElementById('aircraftCode').value='AC001';\n  document.getElementById('demand').value='210';\n  document.getElementById('fare').value='2300';\n  document.getElementById('cost').value='250000';\n  document.getElementById('simulation').innerHTML='';\n}\ndocument.querySelectorAll('.tab').forEach(b=>b.addEventListener('click',()=>{\n  document.querySelectorAll('.tab').forEach(x=>x.classList.remove('active'));\n  document.querySelectorAll('.panel').forEach(x=>x.classList.remove('active'));\n  b.classList.add('active');\n  document.getElementById(b.dataset.tab).classList.add('active');\n}));\n<\/script>\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>Maroc Zain \u2014 Passenger Flight Scheduler PASSENGER FLIGHT PROGRAMMING ENGINE Programmation des vols passagers Planifiez des lignes, horaires et avions, estimez la demande, le remplissage et le chiffre d\u2019affaires, puis d\u00e9tectez les conflits de rotation. Commercial Scheduler Planification \u2022 Simulation \u2022 Rentabilit\u00e9 \ud83d\udeeb Scheduler \ud83d\udcc5 Programme \ud83c\udf0d R\u00e9seau \ud83d\udcca Analyse Cr\u00e9er un vol Route Origine [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-3902","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/posts\/3902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/types\/post"}],"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=3902"}],"version-history":[{"count":1,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/posts\/3902\/revisions"}],"predecessor-version":[{"id":3903,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/posts\/3902\/revisions\/3903"}],"wp:attachment":[{"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/media?parent=3902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/categories?post=3902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maroczain.com\/en\/wp-json\/wp\/v2\/tags?post=3902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}