{"id":386935,"date":"2026-05-21T12:41:42","date_gmt":"2026-05-21T10:41:42","guid":{"rendered":"https:\/\/axelor.com\/?page_id=386935"},"modified":"2026-08-25T16:26:12","modified_gmt":"2026-08-25T14:26:12","slug":"calculateur-roi-erp","status":"publish","type":"page","link":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/","title":{"rendered":"Calculateur ROI ERP : retour sur investissement"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.23.1&#8243; _module_preset=&#8221;default&#8221; width=&#8221;100%&#8221; max_width=&#8221;100%&#8221; custom_css_main_element=&#8221;    background: linear-gradient(135deg, var(&#8211;navy-dark) 0%, var(&#8211;navy) 100%);||    background-attachment: fixed;||    min-height: 100vh;&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.23.1&#8243; _module_preset=&#8221;default&#8221; width=&#8221;100%&#8221; max_width=&#8221;100%&#8221; module_alignment=&#8221;center&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.23.1&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_text _builder_version=&#8221;4.23.1&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; sticky_enabled=&#8221;0&#8243;]<\/p>\n<div id=\"cf7RoiFormWrap\" style=\"display:none;\">\n\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f387090-o1\" lang=\"fr-FR\" dir=\"ltr\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/fr\/wp-json\/wp\/v2\/pages\/386935#wpcf7-f387090-o1\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulaire de contact\" novalidate=\"novalidate\" data-status=\"init\">\n<div style=\"display: none;\">\n<input type=\"hidden\" name=\"_wpcf7\" value=\"387090\" \/>\n<input type=\"hidden\" name=\"_wpcf7_version\" value=\"5.8.7\" \/>\n<input type=\"hidden\" name=\"_wpcf7_locale\" value=\"fr_FR\" \/>\n<input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f387090-o1\" \/>\n<input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/>\n<input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_hidden_group_fields\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_hidden_groups\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_visible_groups\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_repeaters\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_steps\" value=\"{}\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_options\" value=\"{&quot;form_id&quot;:387090,&quot;conditions&quot;:[],&quot;settings&quot;:{&quot;animation&quot;:&quot;yes&quot;,&quot;animation_intime&quot;:200,&quot;animation_outtime&quot;:200,&quot;conditions_ui&quot;:&quot;normal&quot;,&quot;notice_dismissed&quot;:false,&quot;repeater_remove_button&quot;:&quot;bottom&quot;,&quot;notice_dismissed_update-cf7-5.8&quot;:true,&quot;notice_dismissed_update-cf7-6.0.6&quot;:true}}\" \/>\n<input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/div>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_first_name\" value=\"\" type=\"hidden\" name=\"cf7_first_name\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_last_name\" value=\"\" type=\"hidden\" name=\"cf7_last_name\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_email\" value=\"\" type=\"hidden\" name=\"cf7_email\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_company\" value=\"\" type=\"hidden\" name=\"cf7_company\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_role\" value=\"\" type=\"hidden\" name=\"cf7_role\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_phone\" value=\"\" type=\"hidden\" name=\"cf7_phone\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_users\" value=\"\" type=\"hidden\" name=\"cf7_users\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_license_cost\" value=\"\" type=\"hidden\" name=\"cf7_license_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_implementation_cost\" value=\"\" type=\"hidden\" name=\"cf7_implementation_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_training_cost\" value=\"\" type=\"hidden\" name=\"cf7_training_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_maintenance_pct\" value=\"\" type=\"hidden\" name=\"cf7_maintenance_pct\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_maint_included\" value=\"\" type=\"hidden\" name=\"cf7_maint_included\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_hosting_cost\" value=\"\" type=\"hidden\" name=\"cf7_hosting_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_hosting_included\" value=\"\" type=\"hidden\" name=\"cf7_hosting_included\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_existing_systems_cost\" value=\"\" type=\"hidden\" name=\"cf7_existing_systems_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_manual_hours\" value=\"\" type=\"hidden\" name=\"cf7_manual_hours\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_hourly_rate\" value=\"\" type=\"hidden\" name=\"cf7_hourly_rate\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_data_reliability\" value=\"\" type=\"hidden\" name=\"cf7_data_reliability\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_error_cost_estimate\" value=\"\" type=\"hidden\" name=\"cf7_error_cost_estimate\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_ai_uplift\" value=\"\" type=\"hidden\" name=\"cf7_ai_uplift\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_horizon\" value=\"\" type=\"hidden\" name=\"cf7_horizon\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_scenario\" value=\"\" type=\"hidden\" name=\"cf7_scenario\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_currency\" value=\"\" type=\"hidden\" name=\"cf7_currency\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_cost_license\" value=\"\" type=\"hidden\" name=\"cf7_cost_license\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_cost_impl\" value=\"\" type=\"hidden\" name=\"cf7_cost_impl\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_cost_maint\" value=\"\" type=\"hidden\" name=\"cf7_cost_maint\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_cost_hosting\" value=\"\" type=\"hidden\" name=\"cf7_cost_hosting\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_cost_training\" value=\"\" type=\"hidden\" name=\"cf7_cost_training\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_gain_prod\" value=\"\" type=\"hidden\" name=\"cf7_gain_prod\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_gain_errors\" value=\"\" type=\"hidden\" name=\"cf7_gain_errors\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_gain_ai\" value=\"\" type=\"hidden\" name=\"cf7_gain_ai\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_gain_existing\" value=\"\" type=\"hidden\" name=\"cf7_gain_existing\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_roi_pct\" value=\"\" type=\"hidden\" name=\"cf7_roi_pct\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_payback_months\" value=\"\" type=\"hidden\" name=\"cf7_payback_months\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_net_gain\" value=\"\" type=\"hidden\" name=\"cf7_net_gain\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_hours_reclaimed\" value=\"\" type=\"hidden\" name=\"cf7_hours_reclaimed\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_total_cost\" value=\"\" type=\"hidden\" name=\"cf7_total_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" id=\"cf7_total_gain\" value=\"\" type=\"hidden\" name=\"cf7_total_gain\" \/>\n<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Envoyer\" \/>\n<\/p><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n\n<\/div>\n<p>[\/et_pb_text][et_pb_text _builder_version=&#8221;4.23.1&#8243; _module_preset=&#8221;default&#8221; hover_enabled=&#8221;0&#8243; global_colors_info=&#8221;{}&#8221; sticky_enabled=&#8221;0&#8243;]<\/p>\n<!DOCTYPE html>\r\n<html lang=\"fr\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Calculateur ROI ERP : retour sur investissement | Axelor<\/title>\r\n<meta name=\"description\" content=\"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.\">\r\n<meta name=\"robots\" content=\"index, follow\">\r\n<meta name=\"author\" content=\"Axelor\">\r\n<meta name=\"theme-color\" content=\"#010165\">\r\n<link rel=\"canonical\" href=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\">\r\n<!-- Open Graph (partage LinkedIn \/ r\u00e9seaux) -->\r\n<meta property=\"og:type\" content=\"website\">\r\n<meta property=\"og:locale\" content=\"fr_FR\">\r\n<meta property=\"og:site_name\" content=\"Axelor\">\r\n<meta property=\"og:title\" content=\"Calculateur ROI ERP : retour sur investissement | Axelor\">\r\n<meta property=\"og:description\" content=\"TCO sur 3 \u00e0 10 ans, productivit\u00e9, fiabilit\u00e9 des donn\u00e9es et IA agentique. M\u00e9thodologie NPV actualis\u00e9e, 3 sc\u00e9narios. Outil gratuit pour cadrer et d\u00e9fendre votre projet ERP.\">\r\n<meta property=\"og:url\" content=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\">\r\n<meta property=\"og:image\" content=\"https:\/\/axelor.com\/wp-content\/uploads\/2023\/06\/logo_og.jpg\">\r\n<meta name=\"twitter:card\" content=\"summary_large_image\">\r\n<meta name=\"twitter:title\" content=\"Calculateur ROI ERP | Axelor\">\r\n<meta name=\"twitter:description\" content=\"Estimez le retour sur investissement de votre projet ERP : m\u00e9thodologie NPV, 3 sc\u00e9narios, IA agentique.\">\r\n<meta name=\"twitter:image\" content=\"https:\/\/axelor.com\/wp-content\/uploads\/2023\/06\/logo_og.jpg\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins:wght@300;400;500;600;700&family=Chakra+Petch:wght@400;500;600&display=swap\" rel=\"stylesheet\">\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.0\/dist\/chart.umd.min.js\"><\/script>\r\n<script>\r\n\/\/ === ANALYTICS (dataLayer \/ GTM) ===\r\n\/\/ [FIX] En prod ce bloc \u00e9tait \u00e9crit \u00c0 L'INT\u00c9RIEUR de la balise <script src=\"chart.js\">.\r\n\/\/ Une balise avec src ignore son contenu inline : track() n'existait pas et AUCUN\r\n\/\/ \u00e9v\u00e9nement (calc_start \/ calc_result \/ calc_lead_*) n'\u00e9tait envoy\u00e9.\r\nwindow.dataLayer = window.dataLayer || [];\r\nfunction track(ev, data){ try { window.dataLayer.push(Object.assign({ event: ev }, data || {})); } catch(e){} }\r\n(function(){\r\n  var started=false, resultTracked=false, resTimer=null;\r\n  function txt(id){ var e=document.getElementById(id); return e ? (e.textContent||'').trim() : ''; }\r\n  function activeData(sel,key,def){ var e=document.querySelector(sel+'.active'); return (e&&e.dataset&&e.dataset[key])?e.dataset[key]:def; }\r\n  function fireStart(){ if(started) return; started=true; track('calc_start',{}); }\r\n  function scheduleResult(){\r\n    if(resultTracked) return;\r\n    clearTimeout(resTimer);\r\n    resTimer=setTimeout(function(){\r\n      resultTracked=true;\r\n      track('calc_result',{ roi:txt('roiPct'), payback:txt('paybackMonths'), net_gain:txt('netGain'),\r\n        scenario:activeData('.scenario-option','scenario','realistic'), horizon:activeData('.horizon-option','years','5') });\r\n    },1500);\r\n  }\r\n  function onInteract(){ fireStart(); scheduleResult(); }\r\n  document.addEventListener('input',onInteract,true);\r\n  document.addEventListener('change',onInteract,true);\r\n  document.addEventListener('click',function(e){\r\n    if(e.target.closest && e.target.closest('.profile-btn, .scenario-option, .horizon-option')) onInteract();\r\n  },true);\r\n})();\r\n<\/script>\r\n<style>:root{\r\n    --magnolia: #F5F5FF;\r\n    --magnolia-2: #FAFAFF;\r\n    --navy: #010165;\r\n    --navy-dark: #0D021E;\r\n    --ocean: #3ECF8E;\r\n    --ocean-dark: #2BB57A;\r\n    --ocean-soft: rgba(62, 207, 142, 0.12);\r\n    --wheelwright: #5D6B90;\r\n    --white: #FFFFFF;\r\n    --border: rgba(1, 1, 101, 0.12);\r\n    --line: rgba(1, 1, 101, 0.08);\r\n    --line-strong: rgba(1, 1, 101, 0.16);\r\n    --shadow-sm: 0 1px 2px rgba(1, 1, 101, 0.04), 0 1px 3px rgba(1, 1, 101, 0.06);\r\n    --shadow-md: 0 4px 12px rgba(1, 1, 101, 0.06), 0 2px 4px rgba(1, 1, 101, 0.04);\r\n    --shadow-lg: 0 24px 60px rgba(13, 2, 30, 0.18), 0 8px 24px rgba(13, 2, 30, 0.12);\r\n    --radius: 14px;\r\n    --radius-sm: 10px;\r\n    --radius-lg: 20px;\r\n  }\/* ===== COMPARATEUR ROI : ERP classique vs Axelor IA ===== *\/\r\n  .roi-wrap .roi-compare {\r\n    display: grid; grid-template-columns: 1fr auto 1fr; align-items: stretch; gap: 0;\r\n    margin-bottom: 14px; border-radius: 16px; overflow: hidden;\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n  }.roi-wrap .roi-compare__col { padding: 22px 20px; text-align: center; display: flex; flex-direction: column; justify-content: center; gap: 6px; }.roi-wrap .roi-compare__base { background: rgba(255,255,255,0.04); }.roi-wrap .roi-compare__axelor {\r\n    background: linear-gradient(160deg, rgba(62,207,142,0.16) 0%, rgba(62,207,142,0.05) 100%);\r\n    position: relative;\r\n  }.roi-wrap .roi-compare__axelor::before {\r\n    content: \"\"; position: absolute; top: 0; left: 0; width: 100%; height: 3px;\r\n    background: var(--ocean);\r\n  }.roi-wrap .roi-compare__tag {\r\n    font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;\r\n    color: rgba(255,255,255,0.55); display: inline-flex; align-items: center; justify-content: center; gap: 6px;\r\n  }.roi-wrap .roi-compare__axelor .roi-compare__tag { color: var(--ocean); }.roi-wrap .roi-compare__axelor .roi-compare__tag svg { width: 14px; height: 14px; }.roi-wrap .roi-compare__value { font-size: 40px; font-weight: 700; line-height: 1; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }.roi-wrap .roi-compare__base .roi-compare__value { color: rgba(255,255,255,0.85); }.roi-wrap .roi-compare__axelor .roi-compare__value { color: var(--ocean); }.roi-wrap .roi-compare__value.negative { color: #F4C95D !important; }.roi-wrap .roi-compare__sub { font-size: 11.5px; color: rgba(255,255,255,0.50); line-height: 1.4; }.roi-wrap .roi-compare__plus {\r\n    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\r\n    padding: 0 18px; background: rgba(255,255,255,0.02);\r\n    border-left: 1px solid rgba(255,255,255,0.08); border-right: 1px solid rgba(255,255,255,0.08);\r\n  }.roi-wrap .roi-compare__plus svg { width: 22px; height: 22px; stroke: var(--ocean); fill: none; }.roi-wrap .roi-compare__plus-badge {\r\n    font-size: 13px; font-weight: 700; color: var(--navy); background: var(--ocean);\r\n    padding: 4px 10px; border-radius: 100px; white-space: nowrap; font-variant-numeric: tabular-nums;\r\n    box-shadow: 0 4px 12px rgba(62,207,142,0.3);\r\n  }.roi-wrap .roi-compare__note {\r\n    display: flex; align-items: flex-start; gap: 10px; margin-bottom: 22px;\r\n    padding: 13px 16px; border-radius: 12px;\r\n    background: rgba(62,207,142,0.07); border: 1px solid rgba(62,207,142,0.20);\r\n    font-size: 12.5px; color: rgba(255,255,255,0.78); line-height: 1.55;\r\n  }.roi-wrap .roi-compare__note svg { width: 16px; height: 16px; stroke: var(--ocean); fill: none; flex-shrink: 0; margin-top: 1px; }.roi-wrap .roi-compare__note strong { color: var(--white); font-weight: 600; }@media (max-width: 600px){.roi-wrap .roi-compare { grid-template-columns: 1fr; }.roi-wrap .roi-compare__plus { flex-direction: row; padding: 12px; border-left: none; border-right: none; border-top: 1px solid rgba(255,255,255,0.08); border-bottom: 1px solid rgba(255,255,255,0.08); }.roi-wrap .roi-compare__plus svg { transform: rotate(90deg); }.roi-wrap .roi-compare__value { font-size: 34px; }\r\n  }.roi-wrap * { margin: 0; padding: 0; box-sizing: border-box; }.roi-wrap {\r\n    font-family: 'Poppins', sans-serif;\r\n    background: linear-gradient(135deg, var(--navy-dark) 0%, var(--navy) 100%);\r\n    background-attachment: fixed;\r\n    min-height: 100vh;\r\n    color: var(--wheelwright);\r\n    font-weight: 400;\r\n    line-height: 1.5;\r\n    -webkit-font-smoothing: antialiased;\r\n    -moz-osx-font-smoothing: grayscale;\r\n  }\/* === HEADER === *\/\r\n  .roi-wrap .topbar {\r\n    padding: 28px 40px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    max-width: 1340px;\r\n    margin: 0 auto;\r\n  }.roi-wrap .topbar img {\r\n    height: 36px;\r\n    width: auto;\r\n  }.roi-wrap .topbar-tag {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-size: 13px;\r\n    font-weight: 400;\r\n    letter-spacing: 0.02em;\r\n  }.roi-wrap .topbar-tag span {\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n  }\/* === HERO === *\/\r\n  .roi-wrap .hero {\r\n    text-align: center;\r\n    padding: 56px 24px 40px;\r\n    max-width: 920px;\r\n    margin: 0 auto;\r\n    color: var(--white);\r\n    position: relative;\r\n  }\/* ==== S\u00c9LECTEUR DE DEVISE (minimaliste, sans encadr\u00e9, align\u00e9 \u00e0 gauche) ==== *\/\r\n  .roi-wrap .currency-bar {\r\n    margin-bottom: 18px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: flex-end;\r\n    gap: 9px;\r\n  }.roi-wrap .currency-bar__label {\r\n    font-size: 11.5px; font-weight: 600; letter-spacing: .02em;\r\n    color: var(--wheelwright); text-transform: uppercase;\r\n  }.roi-wrap .currency-hint {\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    font-style: italic;\r\n    padding-left: 4px;\r\n  }\/* badge d'\u00e9tape en t\u00eate du bandeau profil *\/\r\n  .roi-wrap .card-step--lead { margin-bottom: 14px; }\/* ==== Profils types (pr\u00e9-remplissage) ==== *\/\r\n  .roi-wrap .profiles-bar {\r\n    background: linear-gradient(160deg, var(--magnolia-2, #FAFAFF), #fff);\r\n    border: 1px solid var(--border, rgba(1,1,101,.12));\r\n    border-radius: 16px; padding: 22px 22px; margin-bottom: 24px;\r\n    box-shadow: 0 4px 16px rgba(1,1,101,0.05);\r\n  }.roi-wrap .profiles-bar__label { display: flex; align-items: flex-start; gap: 9px; font-size: 13.5px; font-weight: 500; color: var(--navy, #010165); margin-bottom: 14px; line-height: 1.5; }.roi-wrap .profiles-bar__label svg { width: 17px; height: 17px; stroke: var(--ocean-dark, #2BB57A); flex-shrink: 0; margin-top: 1px; }.roi-wrap .profiles-bar__btns { display: flex; gap: 10px; flex-wrap: wrap; }.roi-wrap .profile-btn {\r\n    flex: 1; min-width: 120px; font-family: inherit; cursor: pointer;\r\n    background: #fff; border: 1.5px solid var(--border, rgba(1,1,101,.14)); border-radius: 12px;\r\n    padding: 13px 14px; font-size: 15px; font-weight: 600; color: var(--navy, #010165);\r\n    display: flex; flex-direction: column; align-items: center; gap: 3px; transition: all .18s;\r\n  }.roi-wrap .profile-btn span { font-size: 11.5px; font-weight: 400; color: var(--wheelwright, #5D6B90); }.roi-wrap .profile-btn:hover { border-color: var(--ocean, #3ECF8E); transform: translateY(-2px); box-shadow: 0 6px 16px rgba(62,207,142,.18); }.roi-wrap .profile-btn.active { background: var(--navy, #010165); border-color: var(--navy, #010165); color: #fff; box-shadow: 0 8px 20px rgba(1,1,101,.2); }.roi-wrap .profile-btn.active span { color: rgba(255,255,255,.7); }.roi-wrap .profiles-bar__note { font-size: 11px; color: var(--wheelwright, #5D6B90); margin-top: 12px; font-style: italic; line-height: 1.5; }@media (max-width: 600px){.roi-wrap .profile-btn { min-width: 0; } }.roi-wrap .currency-switcher {\r\n    position: relative;\r\n  }.roi-wrap .currency-trigger {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    padding: 10px 16px 10px 12px;\r\n    background: var(--white);\r\n    border: 1.5px solid var(--border);\r\n    border-radius: 10px;\r\n    color: var(--navy);\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    user-select: none;\r\n    box-shadow: 0 2px 6px rgba(13, 2, 30, 0.04);\r\n  }.roi-wrap .currency-trigger:hover {\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 4px 12px rgba(62, 207, 142, 0.15);\r\n  }.roi-wrap .currency-trigger .cur-flag {\r\n    width: 26px; height: 26px;\r\n    border-radius: 50%;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-size: 12px; font-weight: 800;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .currency-trigger .cur-code { font-weight: 700; color: var(--navy); }.roi-wrap .currency-trigger .cur-arrow {\r\n    width: 14px; height: 14px;\r\n    opacity: 0.5;\r\n    transition: transform 0.2s;\r\n    color: var(--navy);\r\n  }.roi-wrap .currency-switcher.open .cur-arrow { transform: rotate(180deg); }.roi-wrap .currency-dropdown {\r\n    position: absolute;\r\n    top: calc(100% + 8px);\r\n    right: 0;\r\n    min-width: 300px;\r\n    background: var(--white);\r\n    border: 1px solid var(--border);\r\n    border-radius: 14px;\r\n    box-shadow: 0 20px 40px rgba(13, 2, 30, 0.15);\r\n    padding: 8px;\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transform: translateY(-6px);\r\n    transition: all 0.2s;\r\n    z-index: 100;\r\n    max-height: 420px;\r\n    overflow-y: auto;\r\n  }.roi-wrap .currency-switcher.open .currency-dropdown {\r\n    opacity: 1;\r\n    pointer-events: auto;\r\n    transform: translateY(0);\r\n  }.roi-wrap .currency-search {\r\n    width: 100%;\r\n    padding: 10px 12px;\r\n    border: 1px solid var(--border);\r\n    border-radius: 8px;\r\n    font-size: 13px;\r\n    font-family: inherit;\r\n    margin-bottom: 6px;\r\n    color: var(--navy);\r\n    background: var(--magnolia-2);\r\n  }.roi-wrap .currency-search:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n  }.roi-wrap .currency-option {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding: 10px 12px;\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .currency-option:hover {\r\n    background: var(--magnolia);\r\n  }.roi-wrap .currency-option.active {\r\n    background: var(--ocean-soft);\r\n  }.roi-wrap .currency-option.active .opt-name { color: var(--ocean-dark); font-weight: 600; }.roi-wrap .currency-option .opt-flag {\r\n    width: 28px; height: 28px;\r\n    border-radius: 50%;\r\n    background: linear-gradient(135deg, var(--ocean) 0%, var(--ocean-dark) 100%);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-size: 12px; font-weight: 800;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .currency-option .opt-info { flex: 1; min-width: 0; }.roi-wrap .currency-option .opt-name {\r\n    font-size: 13.5px;\r\n    color: var(--navy);\r\n    font-weight: 500;\r\n    line-height: 1.2;\r\n  }.roi-wrap .currency-option .opt-code {\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    margin-top: 2px;\r\n  }.roi-wrap .currency-option .opt-check {\r\n    width: 18px; height: 18px;\r\n    color: var(--ocean);\r\n    opacity: 0;\r\n    transition: opacity 0.15s;\r\n  }.roi-wrap .currency-option.active .opt-check { opacity: 1; }.roi-wrap .currency-divider {\r\n    height: 1px;\r\n    background: var(--border);\r\n    margin: 6px 8px;\r\n  }.roi-wrap .currency-section-label {\r\n    padding: 8px 12px 4px;\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.06em;\r\n  }\/* Toast confirmation *\/\r\n  .roi-wrap .currency-toast {\r\n    position: fixed;\r\n    bottom: 28px;\r\n    left: 50%;\r\n    transform: translateX(-50%) translateY(20px);\r\n    background: var(--navy);\r\n    color: var(--white);\r\n    padding: 12px 22px;\r\n    border-radius: 10px;\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    box-shadow: 0 12px 28px rgba(13, 2, 30, 0.25);\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n    z-index: 1000;\r\n    display: flex; align-items: center; gap: 10px;\r\n  }.roi-wrap .currency-toast.show {\r\n    opacity: 1;\r\n    transform: translateX(-50%) translateY(0);\r\n  }.roi-wrap .currency-toast .toast-icon {\r\n    width: 22px; height: 22px;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    border-radius: 50%;\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-weight: 800; font-size: 12px;\r\n  }@media (max-width: 700px){.roi-wrap .currency-bar { padding: 14px 16px; }.roi-wrap .currency-bar-left { width: 100%; min-width: 0; }.roi-wrap .currency-switcher { width: 100%; }.roi-wrap .currency-trigger { width: 100%; justify-content: center; }.roi-wrap .currency-dropdown { min-width: 100%; right: 0; left: 0; }\r\n  }.roi-wrap .hero-eyebrow {\r\n    display: inline-block;\r\n    color: var(--ocean);\r\n    font-size: 12px;\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 18px;\r\n    padding: 6px 14px;\r\n    background: var(--ocean-soft);\r\n    border-radius: 999px;\r\n  }.roi-wrap .hero h1 {\r\n    font-size: 52px;\r\n    line-height: 1.08;\r\n    font-weight: 600;\r\n    letter-spacing: -0.02em;\r\n    margin-bottom: 18px;\r\n    color: var(--white);\r\n  }.roi-wrap .hero h1 .accent {\r\n    color: var(--ocean);\r\n  }.roi-wrap .hero p {\r\n    font-size: 17px;\r\n    color: rgba(255, 255, 255, 0.72);\r\n    max-width: 640px;\r\n    margin: 0 auto;\r\n    font-weight: 300;\r\n    line-height: 1.6;\r\n  }.roi-wrap .hero-meta {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 24px;\r\n    padding: 12px 22px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.08);\r\n    border-radius: 999px;\r\n    backdrop-filter: blur(10px);\r\n  }.roi-wrap .hero-meta-item {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.7);\r\n    font-weight: 400;\r\n  }.roi-wrap .hero-meta-item strong {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n  }.roi-wrap .hero-meta-sep {\r\n    width: 1px;\r\n    height: 14px;\r\n    background: rgba(255, 255, 255, 0.12);\r\n  }\/* === LAYOUT === *\/\r\n  .roi-wrap .container {\r\n    max-width: 1440px;\r\n    margin: 0 auto;\r\n    padding: 0 40px 60px;\r\n  }.roi-wrap .layout {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 28px;\r\n    align-items: start;\r\n  }.roi-wrap .layout > * {\r\n    margin-bottom: 0;\r\n    min-width: 0;\r\n  }.roi-wrap .layout > *:last-child {\r\n    margin-bottom: 0;\r\n  }\/* === BLOC 2 COLONNES POUR LES 2 \u00c9TAPES === *\/\r\n  .roi-wrap .inputs-grid {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 22px;\r\n    align-items: stretch;\r\n  }\/* ===== WIZARD \u00c0 ONGLETS (\u00e9pur\u00e9) ===== *\/\r\n  .roi-wrap .wiz-tabs { display: flex; gap: 10px; margin-bottom: 24px; }.roi-wrap .wiz-tab {\r\n    flex: 1; display: flex; align-items: center; justify-content: center; gap: 10px;\r\n    padding: 15px 14px; border-radius: 12px; background: rgba(255,255,255,0.04);\r\n    border: 1px solid rgba(255,255,255,0.12); color: rgba(255,255,255,0.55);\r\n    font-family: inherit; font-size: 14px; font-weight: 500; cursor: pointer; transition: all .2s;\r\n  }.roi-wrap .wiz-tab .wiz-ico {\r\n    display: flex; align-items: center; justify-content: center;\r\n    width: 34px; height: 34px; border-radius: 10px;\r\n    background: rgba(255,255,255,0.06); flex-shrink: 0; transition: all .2s;\r\n  }.roi-wrap .wiz-tab .wiz-ico svg { width: 18px; height: 18px; stroke: rgba(255,255,255,0.5); fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: stroke .2s; }.roi-wrap .wiz-tab:hover .wiz-ico { background: rgba(255,255,255,0.1); }.roi-wrap .wiz-tab:hover .wiz-ico svg { stroke: #fff; }.roi-wrap .wiz-tab.active .wiz-ico { background: var(--ocean, #3ECF8E); }.roi-wrap .wiz-tab.active .wiz-ico svg { stroke: var(--navy, #010165); }.roi-wrap .wiz-tab.done .wiz-ico { background: rgba(62,207,142,0.2); }.roi-wrap .wiz-tab.done .wiz-ico svg { stroke: var(--ocean, #3ECF8E); }.roi-wrap .wiz-tab:hover { background: rgba(255,255,255,0.07); border-color: rgba(255,255,255,0.2); color: #fff; }.roi-wrap .wiz-tab.active {\r\n    background: rgba(62,207,142,0.12); border-color: var(--ocean, #3ECF8E);\r\n    color: #fff; font-weight: 600;\r\n  }.roi-wrap .wiz-tab.done { border-color: rgba(62,207,142,0.3); color: rgba(255,255,255,0.7); }.roi-wrap .wiz-tab-label { white-space: nowrap; }.roi-wrap .wiz-panel { display: none; }.roi-wrap .wiz-panel.active { display: block; animation: wizFade .35s ease; }@keyframes wizFade{ from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }.roi-wrap .wiz-nav { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border, rgba(1,1,101,.08)); }.roi-wrap .wiz-btn {\r\n    padding: 13px 26px; border-radius: 11px; font-family: inherit; font-size: 14.5px; font-weight: 600;\r\n    cursor: pointer; border: none; transition: transform .2s, box-shadow .2s, opacity .2s, background .2s; display: inline-flex; align-items: center; gap: 8px;\r\n  }.roi-wrap .wiz-btn svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.4; }.roi-wrap .wiz-btn.prev { background: var(--magnolia, #F5F5FF); color: var(--navy, #010165); border: 1px solid var(--border, rgba(1,1,101,.14)); }.roi-wrap .wiz-btn.prev:hover:not(:disabled) { background: #ECECF7; border-color: rgba(1,1,101,.22); }.roi-wrap .wiz-btn.next { background: linear-gradient(135deg, var(--ocean, #3ECF8E), var(--ocean-dark, #2BB57A)); color: var(--navy, #010165); margin-left: auto; box-shadow: 0 8px 22px rgba(62,207,142,.3); }.roi-wrap .wiz-btn.next:hover { transform: translateY(-2px); box-shadow: 0 12px 28px rgba(62,207,142,.42); }.roi-wrap .wiz-btn.next svg { stroke: var(--navy, #010165); }.roi-wrap .wiz-btn:disabled { opacity: .35; cursor: not-allowed; }.roi-wrap .wiz-btn:disabled:hover { transform: none; box-shadow: none; }@media (max-width: 600px){.roi-wrap .wiz-tab-label { font-size: 12px; }.roi-wrap .wiz-tab { padding: 12px 8px; gap: 7px; }\r\n  }.roi-wrap .faq-section-wrapper {\r\n    margin-top: 48px;\r\n  }\/* Zone conversion + m\u00e9thodologie, sous le cockpit (align\u00e9e sur la largeur du contenu) *\/\r\n  .roi-wrap .post-cockpit {\r\n    max-width: 1140px;\r\n    margin: 40px auto 0;\r\n  }.roi-wrap .post-cockpit .cta { margin-top: 0; }.roi-wrap .inputs-grid > .card {\r\n    margin-bottom: 0;\r\n  }\/* === APER\u00c7U LIVE - synth\u00e8se en pied d'\u00e9tape 2 (pleine largeur) === *\/\r\n  .roi-wrap .preview-inline {\r\n    margin-top: 24px;\r\n    padding: 22px 24px;\r\n    border-radius: 14px;\r\n    background: linear-gradient(160deg, rgba(62,207,142,0.07) 0%, rgba(62,207,142,0.02) 100%);\r\n    border: 1px solid rgba(62, 207, 142, 0.20);\r\n  }.roi-wrap .preview-inline-row {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 16px;\r\n    margin-bottom: 18px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .preview-inline-eyebrow {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 7px;\r\n    padding: 4px 11px 4px 9px;\r\n    background: var(--ocean-soft);\r\n    border: 1px solid rgba(62, 207, 142, 0.35);\r\n    border-radius: 100px;\r\n    font-size: 10px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.10em;\r\n    text-transform: uppercase;\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n  }.roi-wrap .preview-inline-dot {\r\n    width: 6px;\r\n    height: 6px;\r\n    background: var(--ocean);\r\n    border-radius: 50%;\r\n    animation: previewPulseInline 1.6s ease-in-out infinite;\r\n  }@keyframes previewPulseInline{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.4; transform: scale(0.7); }\r\n  }.roi-wrap .preview-inline-kpis {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 18px;\r\n  }.roi-wrap .preview-inline-kpi {\r\n    text-align: right;\r\n  }.roi-wrap .preview-inline-value {\r\n    font-size: 30px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--ocean-dark);\r\n    letter-spacing: -0.02em;\r\n    font-variant-numeric: tabular-nums;\r\n    transition: color 0.2s;\r\n  }.roi-wrap .preview-inline-value.negative { color: #F4C95D; }.roi-wrap .preview-inline-value-sub {\r\n    font-size: 20px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--navy);\r\n    letter-spacing: -0.01em;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .preview-inline-label {\r\n    font-size: 10.5px;\r\n    color: var(--wheelwright);\r\n    margin-top: 5px;\r\n    font-weight: 500;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n  }.roi-wrap .preview-inline-divider-v {\r\n    width: 1px;\r\n    height: 36px;\r\n    background: var(--border);\r\n  }\/* Mini-barre de r\u00e9partition co\u00fbts \/ gains *\/\r\n  .roi-wrap .preview-inline-bar {\r\n    margin: 18px 0;\r\n    padding: 16px 0;\r\n    border-top: 1px solid rgba(62, 207, 142, 0.18);\r\n    border-bottom: 1px solid rgba(62, 207, 142, 0.18);\r\n  }.roi-wrap .preview-inline-bar-track {\r\n    display: flex;\r\n    height: 14px;\r\n    border-radius: 8px;\r\n    overflow: hidden;\r\n    background: var(--magnolia-2);\r\n    gap: 3px;\r\n  }.roi-wrap .preview-inline-bar-cost {\r\n    background: linear-gradient(90deg, #C7CEDD, #AEB8CC);\r\n    border-radius: 6px;\r\n    width: 30%;\r\n    transition: width 0.5s ease;\r\n  }.roi-wrap .preview-inline-bar-gain {\r\n    background: linear-gradient(90deg, var(--ocean), var(--ocean-dark));\r\n    border-radius: 6px;\r\n    width: 70%;\r\n    transition: width 0.5s ease;\r\n  }.roi-wrap .preview-inline-bar-legend {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    margin-top: 10px;\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    flex-wrap: wrap;\r\n    gap: 8px;\r\n  }.roi-wrap .preview-inline-bar-legend strong {\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .preview-inline-bar-legend .dot {\r\n    display: inline-block;\r\n    width: 8px; height: 8px;\r\n    border-radius: 2px;\r\n    margin-right: 5px;\r\n    vertical-align: middle;\r\n  }.roi-wrap .preview-inline-bar-legend .dot-cost { background: #AEB8CC; }.roi-wrap .preview-inline-bar-legend .dot-gain { background: var(--ocean); }.roi-wrap .preview-inline-trust {\r\n    list-style: none;\r\n    padding: 0;\r\n    margin: 0;\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr 1fr;\r\n    gap: 10px;\r\n  }.roi-wrap .preview-inline-trust li {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    line-height: 1.3;\r\n  }.roi-wrap .preview-inline-trust svg {\r\n    width: 12px;\r\n    height: 12px;\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n  }\/* Sur mobile : trust en colonne, KPIs c\u00f4te \u00e0 c\u00f4te centr\u00e9s *\/\r\n  @media (max-width: 600px){.roi-wrap .preview-inline-row { justify-content: center; flex-direction: column; align-items: stretch; }.roi-wrap .preview-inline-kpis { justify-content: center; }.roi-wrap .preview-inline-trust { grid-template-columns: 1fr; }\r\n  }\/* \u00c9tapes empil\u00e9es : les champs de chaque carte se rangent en grille adaptative.\r\n     auto-fit + minmax \u2192 3-4 champs par ligne en grand \u00e9cran, se r\u00e9organise seul. *\/\r\n  .roi-wrap .inputs-grid .fields-pool {\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));\r\n    gap: 22px 18px;\r\n    align-items: start;\r\n  }\/* Les champs \"larges\" (toggles SaaS, syst\u00e8mes actuels) occupent toute la largeur *\/\r\n  .roi-wrap .inputs-grid .fields-pool .field-span {\r\n    grid-column: 1 \/ -1;\r\n  }@media (max-width: 600px){.roi-wrap .inputs-grid .fields-pool { grid-template-columns: 1fr; }\r\n  }\/* \u00c9tape 3 - Gains : co\u00fbt horaire pleine largeur en haut, puis 2 sliders c\u00f4te \u00e0 c\u00f4te (50\/50 sur toute la largeur) *\/\r\n  .roi-wrap .inputs-grid .fields-pool.fields-pool--gains { grid-template-columns: 1fr 1fr; }.roi-wrap .inputs-grid .fields-pool.fields-pool--gains .field-span { grid-column: 1 \/ -1; }@media (max-width: 760px){.roi-wrap .inputs-grid .fields-pool.fields-pool--gains { grid-template-columns: 1fr; }\r\n  }\/* === S\u00c9LECTEUR HORIZON (pill buttons) === *\/\r\n  .roi-wrap .horizon-picker {\r\n    margin-bottom: 14px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 12px;\r\n  }\/* === CONSENTEMENT RGPD === *\/\r\n  .roi-wrap .privacy-consent {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 10px;\r\n    margin: 16px 0;\r\n    padding: 12px 14px;\r\n    background: rgba(255, 255, 255, 0.06);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 8px;\r\n    font-size: 12px;\r\n    line-height: 1.5;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .privacy-consent:hover { background: rgba(255, 255, 255, 0.09); }.roi-wrap .privacy-consent input[type=\"checkbox\"] {\r\n    width: 16px; height: 16px;\r\n    margin-top: 2px;\r\n    accent-color: var(--ocean);\r\n    cursor: pointer;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .privacy-consent a {\r\n    color: var(--ocean);\r\n    text-decoration: underline;\r\n    text-underline-offset: 2px;\r\n  }.roi-wrap .privacy-consent a:hover { color: var(--white); }\/* === CHAMP OPTIONNEL \"Syst\u00e8mes actuels\" (pilier co\u00fbt de l'inaction) === *\/\r\n  .roi-wrap .field-optional-tag {\r\n    display: inline-block;\r\n    margin-left: 6px;\r\n    padding: 2px 7px;\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    border-radius: 100px;\r\n    font-size: 9.5px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.06em;\r\n    text-transform: uppercase;\r\n    vertical-align: middle;\r\n  }.roi-wrap .field-hint-bar {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 8px;\r\n    margin-top: 8px;\r\n    padding: 9px 12px;\r\n    background: rgba(62, 207, 142, 0.08);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 8px 8px 0;\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.45;\r\n  }.roi-wrap .field-hint-bar svg {\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n    margin-top: 2px;\r\n  }.roi-wrap .field-hint-bar strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n  }\/* === TOGGLE MAINTENANCE SAAS === *\/\r\n  .roi-wrap .field-maint-disabled .input-suffix {\r\n    opacity: 0.45;\r\n    pointer-events: none;\r\n  }.roi-wrap .field-maint-disabled label {\r\n    color: var(--wheelwright);\r\n  }.roi-wrap .maint-saas-toggle {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 10px;\r\n    margin-top: 10px;\r\n    padding: 10px 12px;\r\n    background: var(--magnolia);\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .maint-saas-toggle:hover { background: var(--ocean-soft); }.roi-wrap .maint-saas-toggle input[type=\"checkbox\"] {\r\n    width: 16px;\r\n    height: 16px;\r\n    margin-top: 3px;\r\n    accent-color: var(--ocean-dark);\r\n    cursor: pointer;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .maint-saas-text {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 2px;\r\n    font-size: 12.5px;\r\n    line-height: 1.4;\r\n  }.roi-wrap .maint-saas-text strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n  }.roi-wrap .maint-saas-hint {\r\n    color: var(--wheelwright);\r\n    font-size: 11.5px;\r\n  }.roi-wrap .maint-axelor-note {\r\n    display: block;\r\n    margin-top: 10px;\r\n    padding: 11px 14px;\r\n    background: var(--ocean-soft);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 8px;\r\n    font-size: 12px;\r\n    line-height: 1.5;\r\n    color: var(--navy);\r\n  }.roi-wrap .maint-axelor-note strong { font-weight: 600; }\/* === SCENARIO PICKER === *\/\r\n  .roi-wrap .scenario-picker {\r\n    margin-bottom: 24px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 12px;\r\n  }.roi-wrap .scenario-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    margin-bottom: 10px;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .scenario-options {\r\n    display: grid;\r\n    grid-template-columns: repeat(3, 1fr);\r\n    gap: 6px;\r\n    background: rgba(0, 0, 0, 0.25);\r\n    border-radius: 10px;\r\n    padding: 4px;\r\n  }.roi-wrap .scenario-option {\r\n    padding: 9px 4px;\r\n    border-radius: 8px;\r\n    color: rgba(255, 255, 255, 0.65);\r\n    cursor: pointer;\r\n    transition: all 0.18s;\r\n    user-select: none;\r\n    text-align: center;\r\n  }.roi-wrap .scenario-option-num { font-size: 13px; font-weight: 700; line-height: 1.2; }.roi-wrap .scenario-option-hint {\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    margin-top: 2px;\r\n    opacity: 0.7;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n  }.roi-wrap .scenario-option:hover:not(.active) {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    color: var(--white);\r\n  }.roi-wrap .scenario-option.active {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.25);\r\n  }.roi-wrap .scenario-option.active .scenario-option-hint { color: var(--navy); opacity: 0.8; }.roi-wrap .scenario-option.conservative.active {\r\n    background: #5FE3D0;\r\n    box-shadow: 0 2px 8px rgba(95, 227, 208, 0.30);\r\n  }.roi-wrap .scenario-option.optimistic.active {\r\n    background: #F4C95D;\r\n    box-shadow: 0 2px 8px rgba(244, 201, 93, 0.30);\r\n  }.roi-wrap .scenario-info {\r\n    margin-top: 10px;\r\n    font-size: 11.5px;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    line-height: 1.45;\r\n  }.roi-wrap .scenario-info strong { color: rgba(255, 255, 255, 0.85); font-weight: 600; }.roi-wrap .horizon-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    margin-bottom: 10px;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .horizon-options {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 6px;\r\n    background: rgba(0, 0, 0, 0.25);\r\n    border-radius: 10px;\r\n    padding: 4px;\r\n  }.roi-wrap .horizon-option {\r\n    padding: 9px 4px;\r\n    border-radius: 8px;\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-size: 13px;\r\n    font-weight: 600;\r\n    text-align: center;\r\n    cursor: pointer;\r\n    transition: all 0.18s;\r\n    user-select: none;\r\n  }.roi-wrap .horizon-option-num {\r\n    font-size: 14px;\r\n    font-weight: 700;\r\n    line-height: 1.2;\r\n  }.roi-wrap .horizon-option-hint {\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    margin-top: 2px;\r\n    opacity: 0.7;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n  }.roi-wrap .horizon-option:hover:not(.active) {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    color: var(--white);\r\n  }.roi-wrap .horizon-option.active {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.25);\r\n  }.roi-wrap .horizon-option.active .horizon-option-hint {\r\n    color: var(--navy);\r\n    opacity: 0.8;\r\n  }\/* === CARDS (LEFT) === *\/\r\n  .roi-wrap .card {\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    padding: 32px;\r\n    margin-bottom: 24px;\r\n    box-shadow: var(--shadow-md);\r\n    border: 1px solid var(--line);\r\n  }.roi-wrap .card-head {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 16px;\r\n    padding-bottom: 24px;\r\n    margin-bottom: 24px;\r\n    border-bottom: 1px solid var(--line);\r\n  }.roi-wrap .card-icon {\r\n    flex-shrink: 0;\r\n    width: 44px;\r\n    height: 44px;\r\n    border-radius: 12px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    background: var(--ocean-soft);\r\n  }.roi-wrap .card-icon svg {\r\n    width: 22px;\r\n    height: 22px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .card-step {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    letter-spacing: 0.14em;\r\n    text-transform: uppercase;\r\n    color: var(--ocean);\r\n    margin-bottom: 8px;\r\n  }.roi-wrap .card-step .step-num {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    padding: 4px 9px;\r\n    border-radius: 6px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.08em;\r\n  }.roi-wrap .card-step .step-name {\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n  }.roi-wrap .card-title {\r\n    font-size: 19px;\r\n    font-weight: 600;\r\n    color: var(--navy);\r\n    margin-bottom: 4px;\r\n    letter-spacing: -0.01em;\r\n  }.roi-wrap .card-subtitle {\r\n    font-size: 13px;\r\n    color: var(--wheelwright);\r\n    font-weight: 400;\r\n  }\/* === FIELDS === *\/\r\n  .roi-wrap .field-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 16px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .field-row:last-child {\r\n    margin-bottom: 0;\r\n  }\/* Field-row sp\u00e9cial : slider \u00e0 gauche sur 2 rang\u00e9es, 2 champs courts \u00e0 droite *\/\r\n  .roi-wrap .field-row-slider {\r\n    grid-template-columns: 1fr 1fr;\r\n    grid-template-rows: auto auto;\r\n    align-items: start;\r\n  }\/* Pleine largeur : 2 sliders c\u00f4te \u00e0 c\u00f4te (hauteurs proches) sur la 1re ligne,\r\n     co\u00fbt horaire compact en 2e ligne \u2192 plus de vide sous le slider de gauche. *\/\r\n  .roi-wrap .field-row-slider .field-slider-wrap { grid-column: 1; grid-row: 1; }.roi-wrap .field-row-slider > .field:nth-child(3) { grid-column: 2; grid-row: 1; }\/* slider fiabilit\u00e9 *\/\r\n  .roi-wrap .field-row-slider > .field:nth-child(2) { grid-column: 1; grid-row: 2; }\/* co\u00fbt horaire *\/\r\n  @media (max-width: 600px){.roi-wrap .field-row-slider {\r\n      grid-template-columns: 1fr;\r\n      grid-template-rows: auto auto auto;\r\n    }\/* Annule le placement explicite desktop : chaque champ reprend sa ligne naturelle *\/\r\n  .roi-wrap .field-row-slider .field-slider-wrap { grid-column: 1; grid-row: auto; }.roi-wrap .field-row-slider > .field:nth-child(2) { grid-column: 1; grid-row: auto; }.roi-wrap .field-row-slider > .field:nth-child(3) { grid-column: 1; grid-row: auto; }\r\n  }.roi-wrap .field {\r\n    display: flex;\r\n    flex-direction: column;\r\n  }.roi-wrap .field-full {\r\n    grid-column: 1 \/ -1;\r\n  }.roi-wrap label {\r\n    display: flex;\r\n    align-items: baseline;\r\n    flex-wrap: wrap;\r\n    gap: 5px;\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    margin-bottom: 9px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .label-help {\r\n    font-weight: 400;\r\n    color: #98A0BC;\r\n    font-size: 11.5px;\r\n  }.roi-wrap .input-wrap {\r\n    position: relative;\r\n  }.roi-wrap input[type=\"number\"], .roi-wrap input[type=\"text\"], .roi-wrap input[type=\"email\"], .roi-wrap input[type=\"tel\"], .roi-wrap select {\r\n    width: 100%;\r\n    padding: 13px 16px;\r\n    border: 1.5px solid var(--line-strong);\r\n    border-radius: var(--radius-sm);\r\n    font-size: 15px;\r\n    font-family: 'Poppins', sans-serif;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    background: var(--white);\r\n    transition: all 0.15s ease;\r\n  }.roi-wrap input::placeholder {\r\n    color: #B0B7CC;\r\n    font-weight: 400;\r\n  }.roi-wrap input:focus, .roi-wrap select:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n    box-shadow: 0 0 0 4px var(--ocean-soft);\r\n  }.roi-wrap input:hover:not(:focus), .roi-wrap select:hover:not(:focus) {\r\n    border-color: rgba(1, 1, 101, 0.24);\r\n  }.roi-wrap .input-prefix {\r\n    position: relative;\r\n  }\/* Pr\u00e9fixe via span enfant (fiable cross-browser, mis \u00e0 jour en JS) *\/\r\n  .roi-wrap .input-prefix .prefix-symbol {\r\n    position: absolute;\r\n    left: 14px;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    font-size: 15px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    pointer-events: none;\r\n    z-index: 2;\r\n    white-space: nowrap;\r\n  }.roi-wrap .input-prefix input {\r\n    padding-left: 34px;\r\n  }.roi-wrap .input-prefix.wide-prefix input {\r\n    padding-left: 52px;\r\n  }.roi-wrap .input-prefix.xwide-prefix input {\r\n    padding-left: 70px;\r\n  }.roi-wrap .input-suffix {\r\n    position: relative;\r\n  }.roi-wrap .input-suffix::after {\r\n    content: attr(data-suffix);\r\n    position: absolute;\r\n    right: 16px;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    font-size: 13px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    pointer-events: none;\r\n  }.roi-wrap .input-suffix input {\r\n    padding-right: 40px;\r\n  }\/* === SLIDER POURCENTAGE === *\/\r\n  .roi-wrap .slider-block {\r\n    background: var(--magnolia-2);\r\n    border: 1px solid var(--line);\r\n    border-radius: 12px;\r\n    padding: 14px 16px;\r\n    transition: border-color 0.2s;\r\n  }.roi-wrap .slider-block:hover { border-color: var(--line-strong); }.roi-wrap .slider-block:focus-within {\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n    box-shadow: 0 0 0 3px rgba(62, 207, 142, 0.10);\r\n  }.roi-wrap .slider-value-row {\r\n    display: flex;\r\n    align-items: baseline;\r\n    justify-content: space-between;\r\n    gap: 10px;\r\n    margin-bottom: 12px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .slider-value {\r\n    display: inline-flex;\r\n    align-items: baseline;\r\n    gap: 4px;\r\n    color: var(--navy);\r\n  }.roi-wrap .slider-value-num {\r\n    font-size: 28px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--ocean-dark);\r\n    letter-spacing: -0.02em;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .slider-value-unit {\r\n    font-size: 16px;\r\n    font-weight: 600;\r\n    color: var(--ocean-dark);\r\n  }.roi-wrap .slider-equiv {\r\n    font-size: 12.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    text-align: right;\r\n    line-height: 1.4;\r\n  }\/* L'input range stylis\u00e9 *\/\r\n  .roi-wrap .slider-input {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n    width: 100%;\r\n    height: 6px;\r\n    border-radius: 100px;\r\n    background: linear-gradient(to right,\r\n      var(--ocean) 0%,\r\n      var(--ocean) var(--slider-fill, 25%),\r\n      rgba(1, 1, 101, 0.12) var(--slider-fill, 25%),\r\n      rgba(1, 1, 101, 0.12) 100%);\r\n    outline: none;\r\n    margin: 0;\r\n    cursor: pointer;\r\n  }.roi-wrap .slider-input::-webkit-slider-thumb {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 50%;\r\n    background: var(--white);\r\n    border: 3px solid var(--ocean);\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.40);\r\n    cursor: grab;\r\n    transition: transform 0.15s, box-shadow 0.15s;\r\n  }.roi-wrap .slider-input::-webkit-slider-thumb:hover {\r\n    transform: scale(1.15);\r\n    box-shadow: 0 4px 14px rgba(62, 207, 142, 0.55);\r\n  }.roi-wrap .slider-input:active::-webkit-slider-thumb { cursor: grabbing; transform: scale(1.2); }.roi-wrap .slider-input::-moz-range-thumb {\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 50%;\r\n    background: var(--white);\r\n    border: 3px solid var(--ocean);\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.40);\r\n    cursor: grab;\r\n    transition: transform 0.15s;\r\n  }.roi-wrap .slider-input::-moz-range-thumb:hover { transform: scale(1.15); }\/* \u00c9chelle sous le slider *\/\r\n  .roi-wrap .slider-scale {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    margin-top: 10px;\r\n    font-size: 10.5px;\r\n    color: var(--wheelwright);\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n    line-height: 1.3;\r\n  }.roi-wrap .slider-scale span { flex: 1; text-align: left; }.roi-wrap .slider-scale .slider-scale-mid { text-align: center; }.roi-wrap .slider-scale .slider-scale-right { text-align: right; }.roi-wrap .slider-scale strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    font-size: 11px;\r\n    letter-spacing: 0;\r\n    text-transform: none;\r\n  }\/* Estimation affich\u00e9e sous le slider de fiabilit\u00e9 *\/\r\n  .roi-wrap .slider-estimate {\r\n    margin-top: 14px;\r\n    padding: 10px 14px;\r\n    background: var(--ocean-soft);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 8px 8px 0;\r\n    font-size: 12.5px;\r\n    color: var(--navy);\r\n    line-height: 1.4;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .slider-estimate strong {\r\n    color: var(--ocean-dark);\r\n    font-weight: 700;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .slider-estimate-icon {\r\n    flex-shrink: 0;\r\n    font-size: 14px;\r\n  }\/* === TOGGLE === *\/\r\n  .roi-wrap .toggle-card {\r\n    background: var(--magnolia);\r\n    border: 1px solid var(--line);\r\n    border-radius: var(--radius);\r\n    padding: 18px 20px;\r\n    margin-bottom: 20px;\r\n    cursor: pointer;\r\n    transition: all 0.2s ease;\r\n  }.roi-wrap .toggle-card:hover {\r\n    border-color: var(--line-strong);\r\n  }.roi-wrap .toggle-card.active {\r\n    background: var(--ocean-soft);\r\n    border-color: var(--ocean);\r\n  }.roi-wrap .toggle-row {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 14px;\r\n  }.roi-wrap .toggle-switch {\r\n    flex-shrink: 0;\r\n    width: 42px;\r\n    height: 24px;\r\n    background: rgba(1, 1, 101, 0.18);\r\n    border-radius: 999px;\r\n    position: relative;\r\n    transition: background 0.2s ease;\r\n  }.roi-wrap .toggle-switch::after {\r\n    content: '';\r\n    position: absolute;\r\n    top: 3px;\r\n    left: 3px;\r\n    width: 18px;\r\n    height: 18px;\r\n    background: var(--white);\r\n    border-radius: 50%;\r\n    transition: transform 0.2s ease;\r\n    box-shadow: 0 1px 3px rgba(0,0,0,0.18);\r\n  }.roi-wrap .toggle-card.active .toggle-switch {\r\n    background: var(--ocean);\r\n  }.roi-wrap .toggle-card.active .toggle-switch::after {\r\n    transform: translateX(18px);\r\n  }.roi-wrap .toggle-text {\r\n    flex: 1;\r\n  }.roi-wrap .toggle-title {\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .toggle-desc {\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n  }.roi-wrap .toggle-checkbox {\r\n    display: none;\r\n  }.roi-wrap .toggle-content {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.4s ease;\r\n  }.roi-wrap .toggle-content.show {\r\n    max-height: 600px;\r\n  }.roi-wrap .toggle-content-inner {\r\n    padding-top: 8px;\r\n  }\/* === HELP TOOLTIP === *\/\r\n  .roi-wrap .field label, .roi-wrap .advanced-field label {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .help-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 16px;\r\n    height: 16px;\r\n    border-radius: 50%;\r\n    background: transparent;\r\n    color: #B0B7CC;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    cursor: help;\r\n    transition: color 0.15s, background 0.15s;\r\n    border: 1px solid #DADEEC;\r\n    margin-left: 3px;\r\n    flex-shrink: 0;\r\n    user-select: none;\r\n  }.roi-wrap .help-icon:hover {\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    border-color: var(--ocean);\r\n  }\/* Modal popup d'aide *\/\r\n  .roi-wrap .help-modal-overlay {\r\n    position: fixed;\r\n    inset: 0;\r\n    background: rgba(13, 2, 30, 0.55);\r\n    backdrop-filter: blur(4px);\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transition: opacity 0.2s;\r\n    z-index: 1500;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    padding: 24px;\r\n  }.roi-wrap .help-modal-overlay.show {\r\n    opacity: 1;\r\n    pointer-events: auto;\r\n  }.roi-wrap .help-modal {\r\n    background: var(--white);\r\n    border-radius: 16px;\r\n    max-width: 560px;\r\n    width: 100%;\r\n    max-height: 85vh;\r\n    overflow-y: auto;\r\n    box-shadow: 0 24px 60px rgba(13, 2, 30, 0.30);\r\n    transform: scale(0.95);\r\n    transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n  }.roi-wrap .help-modal-overlay.show .help-modal {\r\n    transform: scale(1);\r\n  }.roi-wrap .help-modal-head {\r\n    padding: 24px 28px 16px;\r\n    border-bottom: 1px solid var(--border);\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 16px;\r\n  }.roi-wrap .help-modal-icon {\r\n    width: 44px;\r\n    height: 44px;\r\n    border-radius: 12px;\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    font-size: 20px;\r\n    flex-shrink: 0;\r\n    font-weight: 700;\r\n  }.roi-wrap .help-modal-title-wrap { flex: 1; min-width: 0; }.roi-wrap .help-modal-eyebrow {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .help-modal-title {\r\n    font-size: 19px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    line-height: 1.3;\r\n  }.roi-wrap .help-modal-close {\r\n    width: 32px;\r\n    height: 32px;\r\n    border-radius: 50%;\r\n    background: var(--magnolia);\r\n    border: none;\r\n    cursor: pointer;\r\n    color: var(--wheelwright);\r\n    font-size: 18px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: all 0.15s;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .help-modal-close:hover {\r\n    background: var(--navy);\r\n    color: var(--white);\r\n  }.roi-wrap .help-modal-body {\r\n    padding: 20px 28px 24px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.65;\r\n    font-size: 14.5px;\r\n  }.roi-wrap .help-modal-body p { margin-bottom: 12px; }.roi-wrap .help-modal-body p:last-child { margin-bottom: 0; }.roi-wrap .help-modal-body strong { color: var(--navy); font-weight: 600; }.roi-wrap .help-modal-body .formula-box {\r\n    background: var(--magnolia);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 10px 10px 0;\r\n    padding: 14px 16px;\r\n    margin: 14px 0;\r\n    font-family: 'Chakra Petch', monospace;\r\n    font-size: 13px;\r\n    color: var(--navy);\r\n  }.roi-wrap .help-modal-body .formula-box .formula-label {\r\n    font-family: 'Poppins', sans-serif;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .help-modal-body .example-box {\r\n    background: rgba(62, 207, 142, 0.06);\r\n    border: 1px solid rgba(62, 207, 142, 0.20);\r\n    border-radius: 10px;\r\n    padding: 14px 16px;\r\n    margin: 14px 0;\r\n    font-size: 13.5px;\r\n  }.roi-wrap .help-modal-body .example-box .example-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .results {\r\n    background: linear-gradient(135deg, var(--navy-dark) 0%, var(--navy) 100%);\r\n    border-radius: var(--radius-lg);\r\n    padding: 32px;\r\n    box-shadow: var(--shadow-lg);\r\n    color: var(--white);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n  }.roi-wrap .results-head {\r\n    margin-bottom: 28px;\r\n    padding-bottom: 22px;\r\n    border-bottom: 1px solid rgba(255, 255, 255, 0.08);\r\n  }.roi-wrap .results-eyebrow {\r\n    font-size: 11px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 8px;\r\n  }.roi-wrap .results-title {\r\n    font-size: 22px;\r\n    font-weight: 600;\r\n    color: var(--white);\r\n    letter-spacing: -0.01em;\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .results-subtitle {\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.6);\r\n    font-weight: 300;\r\n  }.roi-wrap .live-dot {\r\n    display: inline-block;\r\n    width: 6px;\r\n    height: 6px;\r\n    background: var(--ocean);\r\n    border-radius: 50%;\r\n    margin-right: 6px;\r\n    animation: pulse 2s ease-in-out infinite;\r\n  }@keyframes pulse{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.5; transform: scale(0.8); }\r\n  }\/* === KPIs === *\/\r\n  .roi-wrap .kpi-grid {\r\n    display: grid;\r\n    grid-template-columns: 1.4fr 1fr 1fr 1fr;\r\n    gap: 12px;\r\n    margin-bottom: 24px;\r\n  }\/* KPI hero (le ROI vedette) *\/\r\n  .roi-wrap .kpi.kpi-hero {\r\n    background: linear-gradient(135deg, rgba(62, 207, 142, 0.18) 0%, rgba(62, 207, 142, 0.06) 100%);\r\n    border: 1.5px solid rgba(62, 207, 142, 0.35);\r\n    position: relative;\r\n    overflow: hidden;\r\n  }.roi-wrap .kpi.kpi-hero::before {\r\n    content: \"\"; position: absolute;\r\n    top: -50%; right: -30%;\r\n    width: 200px; height: 200px;\r\n    background: radial-gradient(circle, rgba(62, 207, 142, 0.25) 0%, transparent 70%);\r\n    pointer-events: none;\r\n  }.roi-wrap .kpi.kpi-hero .kpi-label {\r\n    color: rgba(255, 255, 255, 0.85);\r\n    font-weight: 600;\r\n  }.roi-wrap .kpi.kpi-hero .kpi-value {\r\n    font-size: 36px;\r\n    color: var(--ocean);\r\n    line-height: 1;\r\n  }.roi-wrap .kpi-badge {\r\n    display: inline-flex; align-items: center; gap: 5px;\r\n    padding: 3px 9px;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    border-radius: 100px;\r\n    font-size: 10px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.04em;\r\n    margin-top: 8px;\r\n    opacity: 0;\r\n    transition: opacity 0.3s;\r\n    text-transform: uppercase;\r\n  }.roi-wrap .kpi-badge.show { opacity: 1; }\/* === ROW 2 COLONNES POUR CHARTS \/ BREAKDOWNS === *\/\r\n  .roi-wrap .results-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 18px;\r\n    margin-bottom: 22px;\r\n  }.roi-wrap .results-row > * { min-width: 0; }\/* Garde-fou : un canvas ne d\u00e9passe jamais son conteneur (s\u00e9curit\u00e9 si Chart.js tarde\/\u00e9choue) *\/\r\n  .roi-wrap canvas { max-width: 100%; }.roi-wrap .results-row > .chart-block, .roi-wrap .results-row > .breakdown {\r\n    margin: 0;\r\n    height: 100%;\r\n  }@media (max-width: 1100px){.roi-wrap .results-row { grid-template-columns: 1fr; gap: 16px; }\r\n  }.roi-wrap .kpi {\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.08);\r\n    border-radius: var(--radius);\r\n    padding: 18px 16px;\r\n    transition: all 0.25s ease;\r\n  }.roi-wrap .kpi:hover {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    border-color: rgba(255, 255, 255, 0.14);\r\n  }.roi-wrap .kpi-label {\r\n    font-size: 11px;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.14em;\r\n    margin-bottom: 10px;\r\n    font-weight: 500;\r\n  }.roi-wrap .kpi-value {\r\n    font-size: 24px;\r\n    font-weight: 600;\r\n    color: var(--white);\r\n    line-height: 1.05;\r\n    letter-spacing: -0.02em;\r\n  }.roi-wrap .kpi-value.green { color: var(--ocean); }.roi-wrap .kpi-value.negative, .roi-wrap .kpi-value.green.negative { color: #F4C95D; }.roi-wrap .kpi.kpi-hero .kpi-value.negative { color: #F4C95D; }\/* Badge variante warning (ROI extr\u00eame) *\/\r\n  .roi-wrap .kpi-badge.warning {\r\n    background: #F4C95D;\r\n    color: #4a3a00;\r\n  }\/* Bandeau de garde-fou ROI extr\u00eame *\/\r\n  .roi-wrap .roi-warning {\r\n    display: none;\r\n    align-items: flex-start;\r\n    gap: 12px;\r\n    padding: 14px 16px;\r\n    background: rgba(244, 201, 93, 0.12);\r\n    border: 1px solid rgba(244, 201, 93, 0.35);\r\n    border-left: 4px solid #F4C95D;\r\n    border-radius: 10px;\r\n    margin-bottom: 24px;\r\n    color: rgba(255, 255, 255, 0.92);\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }.roi-wrap .roi-warning.show { display: flex; }.roi-wrap .roi-warning svg { color: #F4C95D; flex-shrink: 0; margin-top: 1px; }.roi-wrap .roi-warning strong { color: #F4C95D; font-weight: 700; }.roi-wrap .roi-warning em { color: var(--white); font-style: normal; font-weight: 500; }.roi-wrap .kpi-value.cyan { color: #5FE3D0; }.roi-wrap .kpi-value.amber { color: #F4C95D; }.roi-wrap .kpi-trend {\r\n    font-size: 12px;\r\n    color: rgba(255, 255, 255, 0.5);\r\n    margin-top: 6px;\r\n    font-weight: 400;\r\n  }\/* === CHARTS === *\/\r\n  .roi-wrap .chart-block {\r\n    background: rgba(255, 255, 255, 0.03);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n    border-radius: var(--radius);\r\n    padding: 22px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .chart-title {\r\n    font-size: 13px;\r\n    font-weight: 500;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    margin-bottom: 4px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .chart-subtitle {\r\n    font-size: 11px;\r\n    color: rgba(255, 255, 255, 0.45);\r\n    margin-bottom: 18px;\r\n    font-weight: 300;\r\n  }.roi-wrap .chart-wrap {\r\n    position: relative;\r\n    height: 200px;\r\n  }.roi-wrap .chart-wrap.donut {\r\n    height: 220px;\r\n  }\/* === BREAKDOWN === *\/\r\n  .roi-wrap .breakdown {\r\n    background: rgba(255, 255, 255, 0.03);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n    border-radius: var(--radius);\r\n    padding: 22px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .breakdown-title {\r\n    font-size: 13px;\r\n    font-weight: 500;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    margin-bottom: 16px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .breakdown-row {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 11px 0;\r\n    border-bottom: 1px solid rgba(255, 255, 255, 0.05);\r\n    font-size: 13px;\r\n  }.roi-wrap .breakdown-row:last-child {\r\n    border-bottom: none;\r\n  }.roi-wrap .breakdown-label {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-weight: 400;\r\n  }.roi-wrap .breakdown-value {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .breakdown-row.total {\r\n    margin-top: 8px;\r\n    padding-top: 16px;\r\n    border-top: 1px solid rgba(255, 255, 255, 0.14);\r\n    border-bottom: none;\r\n  }.roi-wrap .breakdown-row.total .breakdown-label {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n    font-size: 14px;\r\n  }.roi-wrap .breakdown-row.total .breakdown-value {\r\n    font-size: 17px;\r\n    font-weight: 600;\r\n  }.roi-wrap .breakdown-row.total.gain .breakdown-value {\r\n    color: var(--ocean);\r\n  }\/* === CTA === *\/\r\n  .roi-wrap .cta {\r\n    background: linear-gradient(135deg, var(--ocean) 0%, #2BB57A 100%);\r\n    border-radius: var(--radius);\r\n    padding: 28px;\r\n    margin-top: 24px;\r\n    color: var(--white);\r\n    position: relative;\r\n    overflow: hidden;\r\n  }.roi-wrap .cta::before {\r\n    content: \"\"; position: absolute;\r\n    top: -100px; right: -100px;\r\n    width: 280px; height: 280px;\r\n    background: radial-gradient(circle, rgba(255, 255, 255, 0.18) 0%, transparent 70%);\r\n    pointer-events: none;\r\n  }.roi-wrap .cta-head {\r\n    position: relative; z-index: 1;\r\n    margin-bottom: 20px;\r\n  }.roi-wrap .cta-eyebrow {\r\n    display: inline-flex; align-items: center; gap: 6px;\r\n    font-size: 10.5px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.16em;\r\n    text-transform: uppercase;\r\n    color: var(--navy);\r\n    background: rgba(255, 255, 255, 0.30);\r\n    padding: 4px 10px;\r\n    border-radius: 100px;\r\n    margin-bottom: 12px;\r\n  }.roi-wrap .cta-eyebrow-dot {\r\n    width: 6px; height: 6px;\r\n    background: var(--navy);\r\n    border-radius: 50%;\r\n    animation: pulse-cta 2s infinite;\r\n  }@keyframes pulse-cta{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.4; transform: scale(1.4); }\r\n  }.roi-wrap .cta h3 {\r\n    font-size: 20px;\r\n    font-weight: 600;\r\n    margin-bottom: 6px;\r\n    letter-spacing: -0.01em;\r\n  }.roi-wrap .cta p {\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.88);\r\n    margin-bottom: 0;\r\n    font-weight: 300;\r\n  }\/* Preuve sociale *\/\r\n  .roi-wrap .cta-social-proof {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding: 12px 14px;\r\n    background: rgba(255, 255, 255, 0.14);\r\n    border-radius: 10px;\r\n    margin-bottom: 18px;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .cta-social-avatars {\r\n    display: flex;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .cta-social-icon {\r\n    width: 38px; height: 38px;\r\n    border-radius: 50%;\r\n    background: rgba(255, 255, 255, 0.25);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .cta-avatar {\r\n    width: 26px; height: 26px;\r\n    border-radius: 50%;\r\n    border: 2px solid var(--ocean);\r\n    color: var(--white);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    display: flex; align-items: center; justify-content: center;\r\n    margin-left: -8px;\r\n  }.roi-wrap .cta-avatar:first-child { margin-left: 0; }.roi-wrap .cta-social-text {\r\n    font-size: 12.5px;\r\n    color: rgba(255, 255, 255, 0.95);\r\n    line-height: 1.4;\r\n  }.roi-wrap .cta-social-text strong { color: var(--white); font-weight: 600; }.roi-wrap .form-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 12px;\r\n    margin-bottom: 12px;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .field-required {\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    font-size: 13px;\r\n  }.roi-wrap .field-optional {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-weight: 400;\r\n    font-size: 10.5px;\r\n    font-style: italic;\r\n  }.roi-wrap .cta label {\r\n    color: var(--white);\r\n    font-size: 12px;\r\n    font-weight: 500;\r\n    margin-bottom: 5px;\r\n  }.roi-wrap .cta input, .roi-wrap .cta select {\r\n    background: rgba(255, 255, 255, 0.96);\r\n    border: 1.5px solid transparent;\r\n    color: var(--navy);\r\n    padding: 11px 14px;\r\n    font-size: 14px;\r\n  }.roi-wrap .cta input:focus, .roi-wrap .cta select:focus {\r\n    border-color: var(--white);\r\n    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.22);\r\n  }.roi-wrap .btn-submit {\r\n    width: 100%;\r\n    padding: 16px 24px;\r\n    background: var(--navy);\r\n    color: var(--white);\r\n    border: none;\r\n    border-radius: 12px;\r\n    font-size: 15px;\r\n    font-weight: 600;\r\n    font-family: 'Poppins', sans-serif;\r\n    cursor: pointer;\r\n    transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;\r\n    margin-top: 10px;\r\n    letter-spacing: -0.005em;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 10px;\r\n    box-shadow: 0 8px 22px rgba(1, 1, 101, 0.28);\r\n  }.roi-wrap .btn-submit:hover:not(:disabled) {\r\n    background: #0a0a7a;\r\n    transform: translateY(-2px);\r\n    box-shadow: 0 14px 32px rgba(1, 1, 101, 0.4);\r\n  }.roi-wrap .btn-submit:active:not(:disabled) {\r\n    transform: translateY(0);\r\n  }.roi-wrap .btn-submit:disabled {\r\n    background: rgba(1, 1, 101, 0.25);\r\n    cursor: not-allowed;\r\n    box-shadow: none;\r\n  }.roi-wrap .btn-arrow {\r\n    transition: transform 0.2s ease;\r\n  }.roi-wrap .btn-submit:hover .btn-arrow {\r\n    transform: translateX(3px);\r\n  }\/* Signaux de confiance sous le bouton *\/\r\n  .roi-wrap .cta-trust {\r\n    display: flex;\r\n    justify-content: center;\r\n    gap: 18px;\r\n    margin-top: 14px;\r\n    flex-wrap: wrap;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .cta-trust-item {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    font-size: 11.5px;\r\n    color: rgba(255, 255, 255, 0.92);\r\n    font-weight: 500;\r\n  }.roi-wrap .cta-trust-item svg {\r\n    width: 14px;\r\n    height: 14px;\r\n    flex-shrink: 0;\r\n    opacity: 0.95;\r\n  }.roi-wrap .success-message {\r\n    display: none;\r\n    margin-top: 14px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.14);\r\n    border: 1px solid rgba(255, 255, 255, 0.25);\r\n    border-radius: var(--radius-sm);\r\n    color: var(--white);\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }.roi-wrap .success-message.show {\r\n    display: block;\r\n  }\/* === FOOTER === *\/\r\n  .roi-wrap .methodology {\r\n    margin-top: 24px;\r\n    padding: 22px 26px;\r\n    background: rgba(255, 255, 255, 0.02);\r\n    border: 1px solid rgba(255, 255, 255, 0.05);\r\n    border-radius: var(--radius);\r\n    font-size: 12px;\r\n    color: rgba(255, 255, 255, 0.5);\r\n    line-height: 1.65;\r\n  }.roi-wrap .methodology-title {\r\n    font-size: 12.5px;\r\n    font-weight: 700;\r\n    color: rgba(255, 255, 255, 0.78);\r\n    margin-bottom: 11px;\r\n    letter-spacing: 0.01em;\r\n  }.roi-wrap .methodology p { margin-bottom: 9px; }.roi-wrap .methodology p:last-child { margin-bottom: 0; }.roi-wrap .methodology strong {\r\n    color: rgba(255, 255, 255, 0.85);\r\n    font-weight: 500;\r\n  }.roi-wrap .methodology .sep {\r\n    margin: 0 6px;\r\n    color: rgba(255, 255, 255, 0.2);\r\n  }\/* === ADVANCED PARAMETERS (collapsible) === *\/\r\n  .roi-wrap .advanced-card {\r\n    margin-top: 24px;\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    border: 1px solid var(--line);\r\n    overflow: hidden;\r\n  }.roi-wrap .advanced-head {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    padding: 18px 24px;\r\n    cursor: pointer;\r\n    user-select: none;\r\n    transition: background 0.15s ease;\r\n  }.roi-wrap .advanced-head:hover {\r\n    background: var(--magnolia);\r\n  }.roi-wrap .advanced-head-left {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n  }.roi-wrap .advanced-head-icon {\r\n    width: 36px;\r\n    height: 36px;\r\n    border-radius: 10px;\r\n    background: var(--ocean-soft);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .advanced-head-icon svg {\r\n    width: 18px;\r\n    height: 18px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .advanced-head-text-eyebrow {\r\n    font-size: 10px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .advanced-head-text h3 {\r\n    font-size: 15px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    letter-spacing: -0.01em;\r\n    line-height: 1.3;\r\n  }.roi-wrap .advanced-toggle-icon {\r\n    width: 24px;\r\n    height: 24px;\r\n    border-radius: 6px;\r\n    background: var(--magnolia);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: transform 0.2s ease;\r\n  }.roi-wrap .advanced-card.open .advanced-toggle-icon {\r\n    transform: rotate(180deg);\r\n  }.roi-wrap .advanced-toggle-icon svg {\r\n    width: 12px;\r\n    height: 12px;\r\n    stroke: var(--navy);\r\n    fill: none;\r\n    stroke-width: 2.2;\r\n    stroke-linecap: round;\r\n  }.roi-wrap .advanced-body {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.35s ease;\r\n  }.roi-wrap .advanced-card.open .advanced-body {\r\n    max-height: 800px;\r\n  }.roi-wrap .advanced-body-inner {\r\n    padding: 0 24px 24px;\r\n    border-top: 1px solid var(--line);\r\n    padding-top: 20px;\r\n  }.roi-wrap .advanced-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 14px;\r\n    margin-bottom: 14px;\r\n  }.roi-wrap .advanced-field label {\r\n    display: block;\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .advanced-field input, .roi-wrap .advanced-field select {\r\n    width: 100%;\r\n    padding: 10px 12px;\r\n    border: 1px solid var(--line);\r\n    border-radius: 8px;\r\n    font-family: 'Poppins', sans-serif;\r\n    font-size: 13px;\r\n    color: var(--navy);\r\n    background: var(--white);\r\n    transition: border-color 0.15s ease;\r\n  }.roi-wrap .advanced-field input:focus, .roi-wrap .advanced-field select:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n  }.roi-wrap .advanced-hint {\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.5;\r\n    padding-top: 8px;\r\n    border-top: 1px dashed var(--line);\r\n    margin-top: 8px;\r\n  }\/* === FAQ COMPACTE - Int\u00e9gr\u00e9e colonne gauche === *\/\r\n  .roi-wrap .faq-inline {\r\n    margin-top: 24px;\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    padding: 28px;\r\n    box-shadow: var(--shadow-md);\r\n    border: 1px solid var(--line);\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 0 32px;\r\n    align-content: start;\r\n  }.roi-wrap .faq-inline > .faq-head-inline {\r\n    grid-column: 1 \/ -1;\r\n  }@media (max-width: 800px){.roi-wrap .faq-inline { grid-template-columns: 1fr; gap: 0; }\r\n  }.roi-wrap .faq-head-inline {\r\n    padding-bottom: 20px;\r\n    margin-bottom: 16px;\r\n    border-bottom: 1px solid var(--line);\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 14px;\r\n  }.roi-wrap .faq-head-icon {\r\n    flex-shrink: 0;\r\n    width: 40px;\r\n    height: 40px;\r\n    border-radius: 11px;\r\n    background: var(--ocean-soft);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }.roi-wrap .faq-head-icon svg {\r\n    width: 20px;\r\n    height: 20px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .faq-head-text-eyebrow {\r\n    font-size: 10px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .faq-head-text h2 {\r\n    font-size: 18px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    letter-spacing: -0.01em;\r\n    line-height: 1.3;\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .faq-head-text p {\r\n    font-size: 12.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 300;\r\n    line-height: 1.4;\r\n  }.roi-wrap .faq-item {\r\n    border-bottom: 1px solid var(--line);\r\n    transition: all 0.18s ease;\r\n    align-self: start;\r\n  }.roi-wrap .faq-item:last-child {\r\n    border-bottom: 1px solid var(--line);\r\n  }.roi-wrap .faq-item:nth-last-child(-n+2):nth-child(odd), .roi-wrap .faq-item:nth-last-child(1) {\r\n    \/* gestion fine du dernier item dans chaque colonne *\/\r\n  }.roi-wrap .faq-question {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 14px 4px;\r\n    cursor: pointer;\r\n    user-select: none;\r\n    gap: 14px;\r\n    transition: color 0.15s ease;\r\n  }.roi-wrap .faq-question:hover .faq-question-text {\r\n    color: var(--ocean);\r\n  }.roi-wrap .faq-question-text {\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    letter-spacing: -0.005em;\r\n    line-height: 1.4;\r\n    flex: 1;\r\n    transition: color 0.15s ease;\r\n  }.roi-wrap .faq-icon {\r\n    flex-shrink: 0;\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 6px;\r\n    background: var(--magnolia);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: all 0.2s ease;\r\n  }.roi-wrap .faq-item.open .faq-icon {\r\n    background: var(--ocean);\r\n    transform: rotate(45deg);\r\n  }.roi-wrap .faq-icon svg {\r\n    width: 11px;\r\n    height: 11px;\r\n    stroke: var(--navy);\r\n    fill: none;\r\n    stroke-width: 2.4;\r\n    stroke-linecap: round;\r\n    transition: stroke 0.2s ease;\r\n  }.roi-wrap .faq-item.open .faq-icon svg {\r\n    stroke: var(--white);\r\n  }.roi-wrap .faq-answer {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.35s ease, padding 0.35s ease;\r\n  }.roi-wrap .faq-item.open .faq-answer {\r\n    max-height: 600px;\r\n    padding: 0 4px 14px;\r\n  }.roi-wrap .faq-answer-content {\r\n    color: var(--wheelwright);\r\n    font-size: 12.5px;\r\n    line-height: 1.6;\r\n  }.roi-wrap .faq-answer-content strong {\r\n    color: var(--navy);\r\n    font-weight: 500;\r\n  }\/* === RESPONSIVE === *\/\r\n  @media (max-width: 1024px){.roi-wrap .layout {\r\n      grid-template-columns: 1fr;\r\n    }.roi-wrap .results {\r\n      position: static;\r\n    }\r\n  }\/* ============================================================\r\n     ============ RESPONSIVE MOBILE (3 PALIERS) =================\r\n     ============================================================ *\/\r\n  \/* ----- TABLETTE (\u2264 1024px) ----- *\/\r\n  \/* g\u00e9r\u00e9 plus haut : .layout 1fr, .results position static, .inputs-grid 1fr *\/\r\n  \/* ----- MOBILE LARGE (\u2264 768px) ----- *\/\r\n  @media (max-width: 768px){.roi-wrap .topbar { padding: 18px 20px; }.roi-wrap .container { padding: 0 16px 32px; }.roi-wrap .hero { padding: 18px 0 32px; }.roi-wrap .hero h1 { font-size: 30px; line-height: 1.1; }.roi-wrap .hero p { font-size: 14.5px; }.roi-wrap .card { padding: 22px 20px; }.roi-wrap .results { padding: 22px 20px; }.roi-wrap .field-row { grid-template-columns: 1fr; gap: 14px; }.roi-wrap .form-row { grid-template-columns: 1fr; gap: 12px; }.roi-wrap .kpi-grid { grid-template-columns: 1fr 1fr; gap: 10px; }.roi-wrap .kpi.kpi-hero { grid-column: 1 \/ -1; }.roi-wrap .kpi.kpi-hero .kpi-value { font-size: 34px; }.roi-wrap .kpi-value { font-size: 22px; }.roi-wrap .results-row { grid-template-columns: 1fr; }\/* S\u00e9lecteur horizon : 4 pills sur 2 lignes (2x2) plut\u00f4t que 4x1 trop serr\u00e9 *\/\r\n  .roi-wrap .horizon-options { grid-template-columns: repeat(2, 1fr); gap: 8px; }.roi-wrap .horizon-option-hint { font-size: 9.5px; }\/* Scenario : labels plus compacts *\/\r\n  .roi-wrap .scenario-option-num { font-size: 12px; }.roi-wrap .scenario-option-hint { font-size: 9px; }\/* Aper\u00e7u live : KPIs centr\u00e9s au-dessus, trust en colonne *\/\r\n  .roi-wrap .preview-inline-row { flex-direction: column; align-items: stretch; gap: 12px; }.roi-wrap .preview-inline-kpis { justify-content: center; }.roi-wrap .preview-inline-trust { grid-template-columns: 1fr; }\/* CTA + breakdown *\/\r\n  .roi-wrap .cta { padding: 22px 20px; }.roi-wrap .breakdown { padding: 18px; }.roi-wrap .breakdown-row { font-size: 13px; }\/* Charts : hauteur ajust\u00e9e *\/\r\n  .roi-wrap .chart-container { height: 240px; }\/* RGPD consent et trust signals *\/\r\n  .roi-wrap .cta-trust { gap: 14px; }.roi-wrap .cta-trust-item { font-size: 11px; }\/* Tooltips help icons : taille touch-friendly *\/\r\n  .roi-wrap .help-icon { min-width: 22px; min-height: 22px; }\r\n  }\/* ----- MOBILE \u00c9TROIT (\u2264 480px) ----- *\/\r\n  @media (max-width: 480px){.roi-wrap .container { padding: 0 12px 28px; }.roi-wrap .topbar { padding: 14px 16px; }.roi-wrap .hero { padding: 12px 0 24px; }.roi-wrap .hero h1 { font-size: 26px; }.roi-wrap .hero p { font-size: 13.5px; }.roi-wrap .card, .roi-wrap .results { padding: 18px 16px; }\/* KPIs en 1 colonne compl\u00e8te *\/\r\n  .roi-wrap .kpi-grid { grid-template-columns: 1fr; }.roi-wrap .kpi.kpi-hero { grid-column: 1; }.roi-wrap .kpi { padding: 14px 16px; }\/* S\u00e9lecteur de sc\u00e9nario : encore plus compact *\/\r\n  .roi-wrap .scenario-option { padding: 7px 2px; }.roi-wrap .scenario-option-num { font-size: 11px; }.roi-wrap .scenario-option-hint { display: none; }\/* S\u00e9lecteur horizon : pareil pour gain de place *\/\r\n  .roi-wrap .horizon-option-hint { display: none; }.roi-wrap .horizon-option { padding: 8px 4px; }\/* CTA + form *\/\r\n  .roi-wrap .cta { padding: 20px 16px; }.roi-wrap .cta h3 { font-size: 18px; }.roi-wrap .cta-social-proof { padding: 10px 12px; flex-direction: column; align-items: flex-start; gap: 8px; }\/* Aper\u00e7u live : ROI vedette plus modeste *\/\r\n  .roi-wrap .preview-inline-value { font-size: 26px; }.roi-wrap .preview-inline-value-sub { font-size: 18px; }.roi-wrap .preview-inline-divider-v { display: none; }.roi-wrap .preview-inline-kpis { gap: 24px; }\/* Modal d'aide en plein \u00e9cran sur mobile *\/\r\n  .roi-wrap .help-modal-content { width: 95vw; max-height: 92vh; padding: 22px 18px; }\/* Footer m\u00e9thodologie *\/\r\n  .roi-wrap .methodology { font-size: 12px; line-height: 1.55; padding: 16px; }\/* Sliders touch-friendly garantis *\/\r\n  .roi-wrap .slider-input::-webkit-slider-thumb { width: 26px; height: 26px; }.roi-wrap .slider-input::-moz-range-thumb { width: 26px; height: 26px; }.roi-wrap .slider-block { padding: 14px; }.roi-wrap .slider-value-num { font-size: 28px; }\/* Toggles maintenance + RGPD : full largeur, plus a\u00e9r\u00e9s *\/\r\n  .roi-wrap .maint-saas-toggle { padding: 12px; }.roi-wrap .privacy-consent { padding: 12px; font-size: 11.5px; }\/* Bouton submit : taille tactile correcte *\/\r\n  .roi-wrap .btn-submit { padding: 16px 20px; font-size: 14.5px; }\/* Currency switcher : adapt\u00e9 *\/\r\n  .roi-wrap .currency-trigger { padding: 10px 14px; font-size: 13px; }\/* Champ \"syst\u00e8mes actuels\" : encart hint plus compact *\/\r\n  .roi-wrap .field-hint-bar { font-size: 11.5px; padding: 10px; }\/* Warning ROI extr\u00eame *\/\r\n  .roi-wrap .roi-warning { padding: 12px 14px; font-size: 12.5px; }.roi-wrap .roi-warning svg { width: 16px; height: 16px; }\r\n  }\/* ----- MOBILE TR\u00c8S \u00c9TROIT (\u2264 380px - iPhone SE etc.) ----- *\/\r\n  @media (max-width: 380px){.roi-wrap .container { padding: 0 10px 24px; }.roi-wrap .hero h1 { font-size: 23px; }.roi-wrap .card, .roi-wrap .results { padding: 16px 14px; }.roi-wrap .card-title { font-size: 17px; }.roi-wrap .results-title { font-size: 20px; }\/* Tout en 1 col strict *\/\r\n  .roi-wrap .horizon-options { grid-template-columns: repeat(2, 1fr); gap: 6px; }\/* Breakdown plus compact *\/\r\n  .roi-wrap .breakdown-row { font-size: 12px; padding: 8px 0; }\/* Aper\u00e7u live : KPIs empil\u00e9s verticalement si trop serr\u00e9 *\/\r\n  .roi-wrap .preview-inline-kpis { flex-direction: column; gap: 14px; }.roi-wrap .preview-inline-kpi { text-align: center; }\/* Champs : padding r\u00e9duit *\/\r\n  .roi-wrap .field input, .roi-wrap .field select { padding: 11px 12px; font-size: 14px; }.roi-wrap .input-prefix input { padding-left: 38px; }.roi-wrap .input-suffix input { padding-right: 38px; }\r\n  }\/* Accessibilit\u00e9 - respect de la pr\u00e9f\u00e9rence syst\u00e8me \"r\u00e9duire les animations\".\r\n     Coupe les boucles infinies (pulses) et neutralise les transitions\/d\u00e9filement anim\u00e9\r\n     pour les personnes sensibles au mouvement (RGAA \/ vestibular safety). *\/\r\n  @media (prefers-reduced-motion: reduce){.roi-wrap *, .roi-wrap *::before, .roi-wrap *::after {\r\n      animation-duration: 0.001ms !important;\r\n      animation-iteration-count: 1 !important;\r\n      transition-duration: 0.001ms !important;\r\n      scroll-behavior: auto !important;\r\n    }.roi-wrap { scroll-behavior: auto; }\r\n  }\r\n\r\n\r\n  \/* \u2550\u2550 FIX SPANS - neutralise les styles globaux WordPress \u2550\u2550 *\/\r\n  .roi-wrap .results span, .roi-wrap .kpi span, .roi-wrap .kpi-label span, .roi-wrap .kpi-value span,\r\n  .roi-wrap .roi-compare span, .roi-wrap .breakdown span, .roi-wrap .chart-title span,\r\n  .roi-wrap .scenario-info span, .roi-wrap .scenario-label span, .roi-wrap .horizon-label span,\r\n  .roi-wrap .horizon-option span, .roi-wrap .scenario-option span, .roi-wrap .methodology span,\r\n  .roi-wrap .roi-warning span, .roi-wrap .wiz-tab span, .roi-wrap .wiz-tab-label,\r\n  .roi-wrap .results-title span, .roi-wrap .results-subtitle span, .roi-wrap .results-eyebrow span { color: inherit; }\r\n  .roi-wrap .card span, .roi-wrap .card-title span, .roi-wrap .card-subtitle span, .roi-wrap .card-step span,\r\n  .roi-wrap .profiles-bar span, .roi-wrap .profile-btn span, .roi-wrap .field span, .roi-wrap label span,\r\n  .roi-wrap .label-help, .roi-wrap .slider-block span, .roi-wrap .slider-equiv, .roi-wrap .slider-scale span,\r\n  .roi-wrap .maint-saas-text span, .roi-wrap .field-hint-bar span, .roi-wrap .faq-question-text span,\r\n  .roi-wrap .faq-answer-content span, .roi-wrap .currency-bar__label { color: inherit; }\r\n  .roi-wrap .cta span, .roi-wrap .cta label span, .roi-wrap .cta-social-text span,\r\n  .roi-wrap .cta-trust-item span, .roi-wrap .privacy-consent span, .roi-wrap .btn-submit span { color: inherit; }\r\n  .roi-wrap .step-num { color: var(--navy) !important; background: var(--ocean) !important; }\r\n  .roi-wrap .step-name { color: var(--wheelwright) !important; }\r\n  .roi-wrap .horizon-text { color: inherit !important; }\r\n  .roi-wrap .currency-symbol { color: var(--wheelwright) !important; }\r\n  .roi-wrap .field-optional-tag { color: var(--ocean-dark) !important; background: var(--ocean-soft) !important; }\r\n  .roi-wrap .live-dot { background: var(--ocean) !important; }\r\n  .roi-wrap .cta-eyebrow-dot { background: var(--navy) !important; }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"roi-wrap\">\r\n\r\n<!-- Toast confirmation -->\r\n<div class=\"currency-toast\" id=\"currencyToast\">\r\n  <span class=\"toast-icon\">\u2713<\/span>\r\n  <span id=\"toastText\">Devise chang\u00e9e : Euro (\u20ac)<\/span>\r\n<\/div>\r\n\r\n<!-- Modal d'aide universel pour les champs -->\r\n<div class=\"help-modal-overlay\" id=\"helpModalOverlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"helpModalTitle\">\r\n  <div class=\"help-modal\">\r\n    <div class=\"help-modal-head\">\r\n      <div class=\"help-modal-icon\" id=\"helpModalIcon\">?<\/div>\r\n      <div class=\"help-modal-title-wrap\">\r\n        <div class=\"help-modal-eyebrow\">Aide sur ce champ<\/div>\r\n        <div class=\"help-modal-title\" id=\"helpModalTitle\">Titre<\/div>\r\n      <\/div>\r\n      <button class=\"help-modal-close\" id=\"helpModalClose\" aria-label=\"Fermer\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"help-modal-body\" id=\"helpModalBody\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"hero\">\r\n  <div class=\"hero-eyebrow\">Outil d'aide \u00e0 la d\u00e9cision<\/div>\r\n  <h1>Calculez le ROI<br>de votre projet <span class=\"accent\">ERP<\/span><\/h1>\r\n  <p>Estimez en 2 minutes le retour sur investissement d'un ERP int\u00e9gr\u00e9, selon la m\u00e9thodologie TCO appliqu\u00e9e par les cabinets de r\u00e9f\u00e9rence du secteur.<\/p>\r\n<\/div>\r\n\r\n<div class=\"container\">\r\n  <div class=\"layout\">\r\n\r\n    <!-- LEFT - INPUTS -->\r\n    <div>\r\n\r\n      <!-- ==== S\u00c9LECTEUR DE DEVISE (discret, en haut \u00e0 droite) ==== -->\r\n      <div class=\"currency-bar\">\r\n        <span class=\"currency-bar__label\">Devise<\/span>\r\n        <div class=\"currency-switcher\" id=\"currencySwitcher\">\r\n          <button class=\"currency-trigger\" type=\"button\" id=\"currencyTrigger\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n            <span class=\"cur-flag\" id=\"curFlag\">\u20ac<\/span>\r\n            <span><span class=\"cur-code\" id=\"curCode\">EUR<\/span> | <span id=\"curName\">Euro<\/span><\/span>\r\n            <svg class=\"cur-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\r\n          <\/button>\r\n          <div class=\"currency-dropdown\" id=\"currencyDropdown\" role=\"menu\">\r\n            <input type=\"text\" class=\"currency-search\" id=\"currencySearch\" placeholder=\"Rechercher une devise...\" aria-label=\"Rechercher une devise\">\r\n            <div class=\"currency-section-label\">Devises principales<\/div>\r\n            <div id=\"currencyMain\"><\/div>\r\n            <div class=\"currency-divider\"><\/div>\r\n            <div class=\"currency-section-label\">Autres devises<\/div>\r\n            <div id=\"currencyOther\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- ==== WIZARD : barre d'onglets ==== -->\r\n      <div class=\"wiz-tabs\" id=\"wizTabs\">\r\n        <button type=\"button\" class=\"wiz-tab active\" data-w=\"0\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\/><circle cx=\"12\" cy=\"7\" r=\"4\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Votre profil<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"wiz-tab\" data-w=\"1\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\"\/><line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Investissement<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"wiz-tab\" data-w=\"2\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M3 17l6-6 4 4 8-8\"\/><path d=\"M17 7h4v4\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Gains<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- ==== PANNEAU 1 - PROFIL ==== -->\r\n      <div class=\"wiz-panel active\" data-wp=\"0\">\r\n      <div class=\"profiles-bar\">\r\n        <div class=\"card-step card-step--lead\"><span class=\"step-num\">\u00c9tape 1<\/span><span class=\"step-name\">Votre profil<\/span><\/div>\r\n        <div class=\"profiles-bar__label\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n          <span>Pour d\u00e9marrer, choisissez le profil le plus proche de votre entreprise. Les champs se pr\u00e9-remplissent : vous n'avez plus qu'\u00e0 les ajuster dans les \u00e9tapes suivantes.<\/span>\r\n        <\/div>\r\n        <div class=\"profiles-bar__btns\">\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"pme\">PME <span>jusqu'\u00e0 80 utilisateurs<\/span><\/button>\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"eti\">ETI <span>81 \u00e0 300 utilisateurs<\/span><\/button>\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"grands_comptes\">Grands Comptes <span>plus de 300 utilisateurs<\/span><\/button>\r\n        <\/div>\r\n        <div class=\"profiles-bar__note\">Estimations indicatives bas\u00e9es sur le nombre d'utilisateurs ERP. \u00c0 affiner avec nos \u00e9quipes selon votre organisation.<\/div>\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\" disabled><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Suivant<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 1 -->\r\n\r\n      <!-- ==== PANNEAUX 2 + 3 ==== -->\r\n      <div class=\"inputs-grid\">\r\n\r\n      <!-- PANNEAU 2 - INVESTISSEMENT -->\r\n      <div class=\"wiz-panel\" data-wp=\"1\">\r\n      <!-- TCO -->\r\n      <div class=\"card\">\r\n        <div class=\"card-head\">\r\n          <div class=\"card-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><path d=\"M3 7h18M3 12h18M3 17h18\"\/><\/svg>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"card-step\"><span class=\"step-num\">\u00c9tape 2<\/span><span class=\"step-name\">Investissement<\/span><\/div>\r\n            <h2 class=\"card-title\">Co\u00fbts totaux sur <span class=\"horizon-text\">5<\/span> ans<\/h2>\r\n            <div class=\"card-subtitle\">Total Cost of Ownership : toutes les d\u00e9penses du projet<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"fields-pool\">\r\n          <div class=\"field\">\r\n            <label>Nombre d'utilisateurs ERP <span class=\"help-icon\" data-help=\"users\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <input type=\"text\" inputmode=\"numeric\" id=\"users\" data-format=\"integer\" placeholder=\"ex. 30\">\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt licence <span class=\"label-help\"><span class=\"currency-symbol\">\u20ac<\/span> \/ utilisateur \/ mois<\/span> <span class=\"help-icon\" data-help=\"licenseCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"licenseCost\" data-format=\"currency\" placeholder=\"ex. 55\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt d'impl\u00e9mentation <span class=\"help-icon\" data-help=\"implementationCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"implementationCost\" data-format=\"currency\" placeholder=\"ex. 60 000\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt de formation <span class=\"label-help\">total projet<\/span> <span class=\"help-icon\" data-help=\"trainingCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"trainingCost\" data-format=\"currency\" placeholder=\"ex. 500\">\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span\">\r\n            <label>Maintenance annuelle <span class=\"label-help\">% du co\u00fbt licence<\/span> <span class=\"help-icon\" data-help=\"maintenancePct\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-suffix\" data-suffix=\"%\">\r\n              <input type=\"text\" inputmode=\"numeric\" id=\"maintenancePct\" data-format=\"integer\" placeholder=\"ex. 20\">\r\n            <\/div>\r\n            <label class=\"maint-saas-toggle\">\r\n              <input type=\"checkbox\" id=\"maintIncluded\" checked>\r\n              <span class=\"maint-saas-text\">\r\n                <strong>Maintenance d\u00e9j\u00e0 incluse dans l'abonnement SaaS<\/strong>\r\n                <span class=\"maint-saas-hint\">D\u00e9cochez si votre \u00e9diteur facture la maintenance en plus (cas des ERP on-premise ou licences perp\u00e9tuelles)<\/span>\r\n              <\/span>\r\n            <\/label>\r\n            <span class=\"maint-axelor-note\"><strong>Chez Axelor :<\/strong> la maintenance de la plateforme standard est 100 % incluse dans l'abonnement (laissez l'option coch\u00e9e). Pour d'\u00e9ventuels d\u00e9veloppements sp\u00e9cifiques sur-mesure, comptez une maintenance du sp\u00e9cifique d'environ 15 % du co\u00fbt de ces d\u00e9veloppements.<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span\">\r\n            <label>H\u00e9bergement annuel <span class=\"label-help\">serveurs, cloud, sauvegardes, s\u00e9curit\u00e9<\/span> <span class=\"help-icon\" data-help=\"hostingCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"hostingCost\" data-format=\"currency\" placeholder=\"ex. 6 000\">\r\n            <\/div>\r\n            <label class=\"maint-saas-toggle\">\r\n              <input type=\"checkbox\" id=\"hostingIncluded\" checked>\r\n              <span class=\"maint-saas-text\">\r\n                <strong>H\u00e9bergement d\u00e9j\u00e0 inclus dans l'abonnement SaaS<\/strong>\r\n                <span class=\"maint-saas-hint\">D\u00e9cochez si vous h\u00e9bergez en interne ou sur votre propre cloud (cas on-premise \/ cloud priv\u00e9)<\/span>\r\n              <\/span>\r\n            <\/label>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span field-existing-systems\">\r\n            <label>\r\n              Co\u00fbt annuel de vos syst\u00e8mes actuels\r\n              <span class=\"field-optional-tag\">optionnel<\/span>\r\n              <span class=\"label-help\">licences, maintenance, serveurs, outils remplac\u00e9s, laissez vide si aucun<\/span>\r\n              <span class=\"help-icon\" data-help=\"existingSystemsCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span>\r\n            <\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"existingSystemsCost\" data-format=\"currency\" placeholder=\"ex. 12 000\">\r\n            <\/div>\r\n            <div class=\"field-hint-bar\">\r\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n              <span>Si vous remplacez un ancien ERP ou plusieurs outils \u00e9parpill\u00e9s (CRM, compta, outils m\u00e9tier), renseignez uniquement les co\u00fbts qui pourront <strong>r\u00e9ellement \u00eatre supprim\u00e9s ou r\u00e9duits<\/strong> apr\u00e8s Axelor.<\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\"><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Suivant<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 2 -->\r\n\r\n      <!-- PANNEAU 3 - GAINS -->\r\n      <div class=\"wiz-panel\" data-wp=\"2\">\r\n      <!-- GAINS OP -->\r\n      <div class=\"card\">\r\n        <div class=\"card-head\">\r\n          <div class=\"card-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><path d=\"M13 2L4 14h7l-1 8 9-12h-7l1-8z\"\/><\/svg>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"card-step\"><span class=\"step-num\">\u00c9tape 3<\/span><span class=\"step-name\">Gains op\u00e9rationnels<\/span><\/div>\r\n            <h2 class=\"card-title\">Productivit\u00e9 et qualit\u00e9<\/h2>\r\n            <div class=\"card-subtitle\">Temps lib\u00e9r\u00e9 par l'automatisation et r\u00e9duction des erreurs m\u00e9tier<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"fields-pool fields-pool--gains\">\r\n          <div class=\"field field-span\">\r\n            <label>Co\u00fbt horaire charg\u00e9 <span class=\"label-help\"><span class=\"currency-symbol\">\u20ac<\/span> \/ h moyen entreprise<\/span> <span class=\"help-icon\" data-help=\"hourlyRate\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"hourlyRate\" data-format=\"currency\" placeholder=\"ex. 45\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field field-slider-wrap\">\r\n            <label>Part du temps en t\u00e2ches manuelles <span class=\"label-help\">ressaisie, reporting, consolidation Excel<\/span> <span class=\"help-icon\" data-help=\"manualHours\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"slider-block\">\r\n              <div class=\"slider-value-row\">\r\n                <div class=\"slider-value\">\r\n                  <span class=\"slider-value-num\" id=\"manualHoursDisplay\">15<\/span>\r\n                  <span class=\"slider-value-unit\">%<\/span>\r\n                <\/div>\r\n                <div class=\"slider-equiv\" id=\"manualHoursEquiv\">\u2248 5,3 h \/ semaine<\/div>\r\n              <\/div>\r\n              <input type=\"range\" id=\"manualHours\" class=\"slider-input\" value=\"15\" min=\"5\" max=\"45\" step=\"1\">\r\n              <div class=\"slider-scale\">\r\n                <span>Faible<br><strong>5 %<\/strong><\/span>\r\n                <span class=\"slider-scale-mid\">Moyen<br><strong>25 %<\/strong><\/span>\r\n                <span class=\"slider-scale-right\">\u00c9lev\u00e9<br><strong>45 %<\/strong><\/span>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field field-slider-wrap\">\r\n            <label>Fiabilit\u00e9 actuelle des donn\u00e9es <span class=\"label-help\">coh\u00e9rence, ressaisies, \u00e9carts entre rapports<\/span> <span class=\"help-icon\" data-help=\"dataReliability\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"slider-block\">\r\n              <div class=\"slider-value-row\">\r\n                <div class=\"slider-value\">\r\n                  <span class=\"slider-value-num\" id=\"dataReliabilityDisplay\">40<\/span>\r\n                  <span class=\"slider-value-unit\">%<\/span>\r\n                <\/div>\r\n                <div class=\"slider-equiv\" id=\"dataReliabilityLabel\">Donn\u00e9es fragment\u00e9es<\/div>\r\n              <\/div>\r\n              <input type=\"range\" id=\"dataReliability\" class=\"slider-input\" value=\"40\" min=\"10\" max=\"90\" step=\"5\">\r\n              <div class=\"slider-scale\">\r\n                <span>Tr\u00e8s fragment\u00e9<br><strong>10 %<\/strong><\/span>\r\n                <span class=\"slider-scale-mid\">Moyen<br><strong>40-50 %<\/strong><\/span>\r\n                <span class=\"slider-scale-right\">Tr\u00e8s fiable<br><strong>90 %<\/strong><\/span>\r\n              <\/div>\r\n              <div class=\"slider-estimate\" id=\"dataReliabilityEstimate\">\r\n                <span class=\"slider-estimate-icon\">\u26a0\ufe0f<\/span>\r\n                <span>Co\u00fbt annuel estim\u00e9 des erreurs : <strong id=\"errorCostEstimate\">- \u20ac<\/strong><\/span>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- APER\u00c7U LIVE - int\u00e9gr\u00e9 au pied de la card \u00c9tape 2 pour \u00e9quilibrer les hauteurs -->\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\"><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Voir mon ROI<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 3 -->\r\n\r\n      <\/div><!-- \/inputs-grid -->\r\n\r\n    <\/div>\r\n\r\n    <!-- RIGHT - RESULTS -->\r\n    <div>\r\n      <div class=\"results\">\r\n        <div class=\"results-head\">\r\n          <div class=\"results-eyebrow\"><span class=\"live-dot\"><\/span>Estimation en direct<\/div>\r\n          <div class=\"results-title\">Votre ROI sur <span id=\"horizonLabel\">5<\/span> ans<\/div>\r\n          <div class=\"results-subtitle\">Mise \u00e0 jour automatique selon vos donn\u00e9es<\/div>\r\n        <\/div>\r\n\r\n        <!-- S\u00c9LECTEUR D'HORIZON -->\r\n        <div class=\"horizon-picker\">\r\n          <div class=\"horizon-label\">\r\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\r\n            Horizon d'analyse\r\n          <\/div>\r\n          <div class=\"horizon-options\" id=\"horizonOptions\">\r\n            <div class=\"horizon-option\" data-years=\"3\">\r\n              <div class=\"horizon-option-num\">3 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Court terme<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option active\" data-years=\"5\">\r\n              <div class=\"horizon-option-num\">5 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Standard ERP<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option\" data-years=\"7\">\r\n              <div class=\"horizon-option-num\">7 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Long terme<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option\" data-years=\"10\">\r\n              <div class=\"horizon-option-num\">10 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Vision d\u00e9cennale<\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- S\u00c9LECTEUR DE SC\u00c9NARIO -->\r\n        <div class=\"scenario-picker\">\r\n          <div class=\"scenario-label\">\r\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 1 1 7.072 0l-.548.547A3.374 3.374 0 0 0 14 18.469V19a2 2 0 1 1-4 0v-.531c0-.895-.356-1.754-.988-2.387l-.548-.547z\"\/><\/svg>\r\n            Niveau d'hypoth\u00e8ses\r\n          <\/div>\r\n          <div class=\"scenario-options\" id=\"scenarioOptions\">\r\n            <div class=\"scenario-option conservative\" data-scenario=\"conservative\">\r\n              <div class=\"scenario-option-num\">Conservateur<\/div>\r\n              <div class=\"scenario-option-hint\">Prudent<\/div>\r\n            <\/div>\r\n            <div class=\"scenario-option realistic active\" data-scenario=\"realistic\">\r\n              <div class=\"scenario-option-num\">R\u00e9aliste<\/div>\r\n              <div class=\"scenario-option-hint\">Recommand\u00e9<\/div>\r\n            <\/div>\r\n            <div class=\"scenario-option optimistic\" data-scenario=\"optimistic\">\r\n              <div class=\"scenario-option-num\">Optimiste<\/div>\r\n              <div class=\"scenario-option-hint\">Best case<\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"scenario-info\" id=\"scenarioInfo\">\r\n            <strong>R\u00e9aliste<\/strong> : 60 % d'automatisation, 75 % de mon\u00e9tisation des heures, 70 % de r\u00e9duction d'erreurs, ramp-up 50 % en ann\u00e9e 1. Align\u00e9 sur les benchmarks Panorama Consulting et Gartner pour les ETI.\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- ===== COMPARATEUR ROI : ERP classique vs Axelor IA ===== -->\r\n        <div class=\"roi-compare\" id=\"roiCompare\">\r\n          <div class=\"roi-compare__col roi-compare__base\">\r\n            <div class=\"roi-compare__tag\">ERP classique<\/div>\r\n            <div class=\"roi-compare__value\" id=\"roiBase\">- %<\/div>\r\n            <div class=\"roi-compare__sub\">Productivit\u00e9, fiabilit\u00e9, \u00e9conomies<\/div>\r\n          <\/div>\r\n          <div class=\"roi-compare__plus\">\r\n            <div class=\"roi-compare__plus-badge\" id=\"roiDeltaBadge\" title=\"Estimation de l'apport des agents IA sur les t\u00e2ches non encore automatis\u00e9es (hypoth\u00e8se Axelor, \u00e0 affiner selon votre p\u00e9rim\u00e8tre lors d'un \u00e9change avec nos experts).\">+- pts<\/div>\r\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\r\n          <\/div>\r\n          <div class=\"roi-compare__col roi-compare__axelor\">\r\n            <div class=\"roi-compare__tag\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m12 3-1.9 5.8a2 2 0 0 1-1.3 1.3L3 12l5.8 1.9a2 2 0 0 1 1.3 1.3L12 21l1.9-5.8a2 2 0 0 1 1.3-1.3L21 12l-5.8-1.9a2 2 0 0 1-1.3-1.3z\"\/><\/svg>\r\n              Avec l'ERP Axelor\r\n            <\/div>\r\n            <div class=\"roi-compare__value\" id=\"roiAxelor\">- %<\/div>\r\n            <div class=\"roi-compare__sub\">+ l'IA agentique qui agit dans vos modules<\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"roi-compare__note\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n          <span>L\u00e0 o\u00f9 un ERP classique automatise, les <strong>agents IA d'Axelor ex\u00e9cutent<\/strong> les t\u00e2ches \u00e0 votre place. Apport estim\u00e9 sur les t\u00e2ches non encore automatis\u00e9es : hypoth\u00e8se Axelor, affin\u00e9e avec vous lors d'un \u00e9change.<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"kpi-grid\">\r\n          <div class=\"kpi kpi-hero\">\r\n            <div class=\"kpi-label\">ROI sur <span class=\"horizon-text\">5<\/span> ans <span style=\"opacity:.55;font-weight:400;\">avec l'ERP Axelor<\/span><\/div>\r\n            <div class=\"kpi-value green\" id=\"roiPct\">- %<\/div>\r\n            <span class=\"kpi-badge\" id=\"roiBadge\">\u2605 Excellent<\/span>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">Point d'\u00e9quilibre <span style=\"opacity:.55;font-weight:400;\">(actualis\u00e9)<\/span><\/div>\r\n            <div class=\"kpi-value cyan\" id=\"paybackMonths\">- mois<\/div>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">B\u00e9n\u00e9fice net <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n            <div class=\"kpi-value\" id=\"netGain\">- \u20ac<\/div>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">Heures gagn\u00e9es \/ an<\/div>\r\n            <div class=\"kpi-value amber\" id=\"hoursReclaimed\">- h<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Garde-fou hypoth\u00e8ses agressives (ROI \u2265 700 % ou inputs extr\u00eames) -->\r\n        <div class=\"roi-warning\" id=\"roiWarning\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n          <div id=\"roiWarningText\">\r\n            <strong>Hypoth\u00e8ses \u00e0 valider.<\/strong>\r\n            Le r\u00e9sultat reste calcul\u00e9 honn\u00eatement, mais certaines valeurs m\u00e9ritent une v\u00e9rification avant pr\u00e9sentation.\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"results-row\">\r\n          <div class=\"chart-block\">\r\n            <div class=\"chart-title\">Co\u00fbts vs gains cumul\u00e9s<\/div>\r\n            <div class=\"chart-subtitle\">Projection sur <span class=\"horizon-text\">5<\/span> ans, point d'\u00e9quilibre visualis\u00e9<\/div>\r\n            <div class=\"chart-wrap\"><canvas id=\"cumulativeChart\"><\/canvas><\/div>\r\n          <\/div>\r\n\r\n          <div class=\"chart-block\">\r\n            <div class=\"chart-title\">R\u00e9partition des gains annuels<\/div>\r\n            <div class=\"chart-subtitle\">Par cat\u00e9gorie<\/div>\r\n            <div class=\"chart-wrap donut\"><canvas id=\"gainsChart\"><\/canvas><\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"results-row\">\r\n          <div class=\"breakdown\">\r\n            <div class=\"breakdown-title\">D\u00e9tail des co\u00fbts sur <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Licences \/ SaaS<\/span>\r\n              <span class=\"breakdown-value\" id=\"costLicense\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Impl\u00e9mentation<\/span>\r\n              <span class=\"breakdown-value\" id=\"costImpl\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Maintenance \/ support<\/span>\r\n              <span class=\"breakdown-value\" id=\"costMaint\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\" id=\"costHostingRow\" style=\"display:none;\">\r\n              <span class=\"breakdown-label\">H\u00e9bergement<\/span>\r\n              <span class=\"breakdown-value\" id=\"costHosting\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Formation<\/span>\r\n              <span class=\"breakdown-value\" id=\"costTraining\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row total\">\r\n              <span class=\"breakdown-label\">TCO total <span class=\"horizon-text\">5<\/span> ans<\/span>\r\n              <span class=\"breakdown-value\" id=\"totalCost\">- \u20ac<\/span>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"breakdown\">\r\n            <div class=\"breakdown-title\">D\u00e9tail des gains sur <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n          <div class=\"breakdown-row\">\r\n            <span class=\"breakdown-label\">Productivit\u00e9 (automatisation)<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainProd\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\">\r\n            <span class=\"breakdown-label\">R\u00e9duction des erreurs<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainErrors\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\" id=\"gainAiRow\" style=\"display:none;\">\r\n            <span class=\"breakdown-label\">Productivit\u00e9 (IA agentique)<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainAi\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\" id=\"gainExistingRow\" style=\"display:none;\">\r\n            <span class=\"breakdown-label\">\u00c9conomies sur l'existant<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainExisting\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row total gain\">\r\n            <span class=\"breakdown-label\">Gains totaux <span class=\"horizon-text\">5<\/span> ans<\/span>\r\n            <span class=\"breakdown-value\" id=\"totalGain\">- \u20ac<\/span>\r\n          <\/div>\r\n        <\/div>\r\n        <\/div><!-- \/results-row breakdowns -->\r\n\r\n\r\n      <\/div>\r\n    <\/div>\r\n\r\n\r\n  <\/div><!-- \/.layout -->\r\n\r\n  <!-- ZONE DE CONVERSION + M\u00c9THODOLOGIE (pleine largeur sous le cockpit) -->\r\n  <div class=\"container\">\r\n    <div class=\"post-cockpit\">\r\n            <div class=\"cta\">\r\n              <div class=\"cta-head\">\r\n                <div class=\"cta-eyebrow\"><span class=\"cta-eyebrow-dot\"><\/span>\u00c9tape suivante<\/div>\r\n                <h3>Recevez votre analyse ROI personnalis\u00e9e<\/h3>\r\n                <p>Recevez votre analyse personnalis\u00e9e et \u00e9changez avec un expert Axelor sur vos r\u00e9sultats.<\/p>\r\n              <\/div>\r\n    \r\n              <!-- Accroche neutre (pas de chiffre marketing non prouv\u00e9) -->\r\n              <div class=\"cta-social-proof\">\r\n                <div class=\"cta-social-icon\">\r\n                  <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11H1l8-8 8 8h-3v6H9v-6z\" transform=\"rotate(45 12 12)\"\/><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>\r\n                <\/div>\r\n                <div class=\"cta-social-text\">\r\n                  Un outil d'aide \u00e0 la d\u00e9cision pour <strong>cadrer et d\u00e9fendre votre projet ERP<\/strong> en interne.\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Pr\u00e9nom <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"firstName\" placeholder=\"Pr\u00e9nom\">\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>Nom <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"lastName\" placeholder=\"Nom\">\r\n                <\/div>\r\n              <\/div>\r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Email professionnel <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"email\" id=\"email\" placeholder=\"vous@entreprise.com\">\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>Entreprise <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"company\" placeholder=\"Nom de l'entreprise\">\r\n                <\/div>\r\n              <\/div>\r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Fonction <span class=\"field-optional\">(optionnel)<\/span><\/label>\r\n                  <select id=\"role\">\r\n                    <option value=\"\">S\u00e9lectionner<\/option>\r\n                    <option>Directeur G\u00e9n\u00e9ral<\/option>\r\n                    <option>DAF<\/option>\r\n                    <option>DSI<\/option>\r\n                    <option>Directeur Op\u00e9rationnel<\/option>\r\n                    <option>Autre<\/option>\r\n                  <\/select>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>T\u00e9l\u00e9phone <span class=\"field-optional\">(optionnel)<\/span><\/label>\r\n                  <input type=\"tel\" id=\"phone\" placeholder=\"+33 6 12 34 56 78\">\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <label class=\"privacy-consent\">\r\n                <input type=\"checkbox\" id=\"privacyConsent\">\r\n                <span>J'accepte qu'Axelor traite mes donn\u00e9es pour me recontacter au sujet de mon estimation ROI. Consultez notre <a href=\"https:\/\/axelor.com\/fr\/politique-de-confidentialite\/\" target=\"_blank\" rel=\"noopener\" style=\"color:white\">politique de confidentialit\u00e9<\/a>.<\/span>\r\n              <\/label>\r\n    \r\n              <button class=\"btn-submit\" onclick=\"submitForm(event)\">\r\n                <span>Recevoir mon analyse personnalis\u00e9e<\/span>\r\n                <svg class=\"btn-arrow\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\r\n              <\/button>\r\n    \r\n              <!-- Signaux de confiance sous le bouton -->\r\n              <div class=\"cta-trust\">\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg>\r\n                  <span>Sans engagement<\/span>\r\n                <\/div>\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\r\n                  <span>R\u00e9ponse rapide<\/span>\r\n                <\/div>\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\r\n                  <span>Donn\u00e9es prot\u00e9g\u00e9es RGPD<\/span>\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <div class=\"success-message\" id=\"successMessage\">\r\n                <strong>\u2713 Demande enregistr\u00e9e.<\/strong> Un expert Axelor vous contactera prochainement pour \u00e9changer sur vos r\u00e9sultats et r\u00e9pondre \u00e0 vos questions.\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"methodology\">\r\n            <p class=\"methodology-title\">M\u00e9thodologie & hypoth\u00e8ses<\/p>\r\n            <p><strong>Formule.<\/strong> ROI = (Gains actualis\u00e9s \u2212 Co\u00fbts nominaux) \/ Co\u00fbts \u00d7 100. Les gains sont actualis\u00e9s au WACC selon la m\u00e9thode NPV (Net Present Value) ; les co\u00fbts sont conserv\u00e9s en valeur nominale, par prudence.<\/p>\r\n            <p><strong>Trois piliers de gains.<\/strong> (1) Productivit\u00e9 : heures \u00e9conomis\u00e9es \u00d7 co\u00fbt horaire \u00d7 taux de mon\u00e9tisation. (2) R\u00e9duction des erreurs m\u00e9tier, li\u00e9e \u00e0 la fiabilit\u00e9 des donn\u00e9es. (3) \u00c9conomies sur les syst\u00e8mes actuels remplac\u00e9s : vieil ERP, licences \u00e9parpill\u00e9es, serveurs. Ce troisi\u00e8me pilier est optionnel et renseign\u00e9 par l'utilisateur.<\/p>\r\n            <p><strong>Pilier optionnel IA agentique.<\/strong> Lorsqu'il est activ\u00e9, il valorise la part additionnelle de temps manuel, non d\u00e9j\u00e0 automatis\u00e9, que les agents IA d'Axelor peuvent absorber. Il est calcul\u00e9 sur les heures restantes, pour \u00e9viter tout double comptage avec la productivit\u00e9.<\/p>\r\n            <p><strong>Hypoth\u00e8ses de mod\u00e9lisation.<\/strong> Les param\u00e8tres sont ajustables via le s\u00e9lecteur Conservateur, R\u00e9aliste ou Optimiste : taux d'automatisation, taux de mon\u00e9tisation des heures gagn\u00e9es, taux de r\u00e9duction d'erreurs et mont\u00e9e en charge la premi\u00e8re ann\u00e9e. Le pilier \u00ab \u00e9conomies sur l'existant \u00bb est appliqu\u00e9 d\u00e8s la premi\u00e8re ann\u00e9e, sans mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate. Le WACC est fix\u00e9 \u00e0 8 % (m\u00e9diane indicative pour les ETI, inspir\u00e9e de la KPMG Cost of Capital Study 2025). Une marge automatique de 15 % est ajout\u00e9e sur l'impl\u00e9mentation pour les co\u00fbts cach\u00e9s (Standish Group Chaos Report).<\/p>\r\n            <p><strong>Sources de r\u00e9f\u00e9rence.<\/strong> Les ordres de grandeur d'automatisation et de r\u00e9duction d'erreurs s'appuient sur les benchmarks McKinsey Global Institute, Panorama Consulting ERP Reports et IBM Data Quality Studies. Les coefficients pr\u00e9cis sont des <em>hypoth\u00e8ses de mod\u00e9lisation internes<\/em> Axelor, calibr\u00e9es pour des ETI fran\u00e7aises, et non des chiffres exacts cit\u00e9s par ces sources.<\/p>\r\n            <p><strong>Avertissement.<\/strong> Les r\u00e9sultats sont indicatifs et d\u00e9pendent int\u00e9gralement des donn\u00e9es saisies. Ils ne constituent pas un engagement contractuel. Pour une \u00e9tude chiffr\u00e9e personnalis\u00e9e et engageante, contactez un expert Axelor.<\/p>\r\n          <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ===== FAQ : APR\u00c8S LE RAPPORT ET LE FORMULAIRE ===== -->\r\n  <div class=\"faq-section-wrapper\">\r\n      <div class=\"faq-inline\">\r\n        <div class=\"faq-head-inline\">\r\n          <div class=\"faq-head-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n          <\/div>\r\n          <div class=\"faq-head-text\">\r\n            <div class=\"faq-head-text-eyebrow\">FAQ<\/div>\r\n            <h2>Questions fr\u00e9quentes<\/h2>\r\n            <p>Tout ce qu'il faut savoir avant de chiffrer son projet ERP.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment calcule-t-on le ROI d'un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le retour sur investissement d'un ERP se calcule avec la formule standard : <strong>ROI = (Gains \u2212 Co\u00fbts) \/ Co\u00fbts \u00d7 100<\/strong>, projet\u00e9 sur l'horizon retenu (3, 5, 7 ou 10 ans selon votre choix). C'est la m\u00e9thodologie utilis\u00e9e par les cabinets de r\u00e9f\u00e9rence (Gartner, Panorama Consulting, Forrester) pour \u00e9valuer la rentabilit\u00e9 d'un projet ERP.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Qu'est-ce que le TCO d'un ERP et que comprend-il ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le <strong>TCO (Total Cost of Ownership)<\/strong> repr\u00e9sente le co\u00fbt total de possession d'un ERP sur l'horizon retenu. Il inclut quatre postes : licences ou abonnements SaaS, frais d'impl\u00e9mentation, formation des utilisateurs, et maintenance annuelle (18 \u00e0 22 % du co\u00fbt licence pour les ERP on-premise, souvent incluse dans les abonnements SaaS).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment estimer le co\u00fbt d'impl\u00e9mentation d'un ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon les benchmarks <strong>Panorama Consulting<\/strong>, le co\u00fbt moyen d'impl\u00e9mentation d'un ERP mid-market s'\u00e9l\u00e8ve \u00e0 plusieurs centaines de milliers d'euros. En r\u00e8gle g\u00e9n\u00e9rale, les entreprises consacrent <strong>1 \u00e0 3 % de leur chiffre d'affaires annuel<\/strong> \u00e0 l'impl\u00e9mentation. Ce co\u00fbt couvre le param\u00e9trage, l'int\u00e9gration, la migration des donn\u00e9es et la conduite du changement. Pour une estimation pr\u00e9cise, demandez un devis \u00e0 un int\u00e9grateur Axelor.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment estimer la part de temps pass\u00e9 en t\u00e2ches manuelles ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Estimez la <strong>proportion du temps de travail<\/strong> consacr\u00e9e \u00e0 des t\u00e2ches manuelles r\u00e9p\u00e9titives plut\u00f4t qu'au c\u0153ur de m\u00e9tier : ressaisie inter-outils, consolidation Excel, recherche d'informations entre fichiers, g\u00e9n\u00e9ration manuelle de reportings, validation de factures. Pour la plupart des ETI, ce pourcentage se situe entre <strong>15 et 30 %<\/strong>. Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \u00ab se battre avec Excel \u00bb, vous \u00eates \u00e0 <strong>~20 %<\/strong>.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">C'est quoi un co\u00fbt horaire \u00ab charg\u00e9 \u00bb et comment le calculer ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le co\u00fbt horaire <strong>charg\u00e9<\/strong> repr\u00e9sente le co\u00fbt total pour l'entreprise, pas le salaire brut. Il inclut le salaire, les charges patronales, les avantages sociaux, les frais d'\u00e9quipement et les co\u00fbts indirects (bureau, IT). <strong>R\u00e8gle empirique : multiplier le salaire brut par 1,3 \u00e0 1,4<\/strong>. Exemple : un salari\u00e9 \u00e0 40 000 \u20ac de salaire brut annuel co\u00fbte 52 000 \u00e0 56 000 \u20ac charg\u00e9s, soit environ 32 \u00e0 35 \u20ac\/h sur une base de 1 600 h travaill\u00e9es.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Cloud SaaS ou On-Premise : quel impact sur le TCO ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon <strong>Forrester Research<\/strong>, les ERP cloud r\u00e9duisent le TCO de <strong>30 \u00e0 50 % sur 5 ans<\/strong> par rapport au d\u00e9ploiement on-premise, principalement gr\u00e2ce \u00e0 l'\u00e9limination des co\u00fbts d'infrastructure et de maintenance hardware. \u00c0 l'inverse, l'on-premise peut s'av\u00e9rer plus \u00e9conomique sur 10 ans pour les grandes entreprises avec beaucoup d'utilisateurs et des besoins de personnalisation lourds. Axelor propose les deux mod\u00e8les.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels sont les co\u00fbts cach\u00e9s d'un projet ERP \u00e0 anticiper ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Quatre postes sont souvent sous-estim\u00e9s : <strong>temps interne<\/strong> (vos \u00e9quipes mobilis\u00e9es 0,5 \u00e0 1 jour\/semaine par utilisateur cl\u00e9), <strong>migration de donn\u00e9es<\/strong> (5 \u00e0 15 % du co\u00fbt d'impl\u00e9mentation), <strong>conduite du changement<\/strong> (communication, accompagnement), <strong>\u00e9volutions futures<\/strong> (nouveaux modules, int\u00e9grations). Selon Panorama Consulting, <strong>plus d'un quart des projets d\u00e9passent leur budget<\/strong>. Anticipez une marge de 15-20 % sur le co\u00fbt d'impl\u00e9mentation.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels signaux indiquent qu'il faut changer d'ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Cinq signaux indiquent qu'un ERP arrive en fin de vie : <strong>multiplication des fichiers Excel<\/strong> en parall\u00e8le de l'ERP, <strong>impossibilit\u00e9 d'int\u00e9grer<\/strong> les nouveaux outils (CRM, e-commerce, IA), <strong>temps de cl\u00f4ture comptable<\/strong> qui s'allonge, <strong>incapacit\u00e9 \u00e0 \u00e9voluer<\/strong> sans co\u00fbt de d\u00e9veloppement majeur, et <strong>support \u00e9diteur d\u00e9grad\u00e9<\/strong> (fin de version, hausses tarifaires). La dur\u00e9e de vie moyenne d'un ERP est de <strong>7 \u00e0 10 ans<\/strong>.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Pourquoi 18-22 % de maintenance annuelle ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            C'est le <strong>standard du march\u00e9 ERP<\/strong>, appliqu\u00e9 par tous les \u00e9diteurs (SAP, Sage, Microsoft Dynamics, Oracle, Axelor). Ce pourcentage couvre les mises \u00e0 jour fonctionnelles, les correctifs de s\u00e9curit\u00e9, le support technique et la mise en conformit\u00e9 r\u00e9glementaire (fiscale, comptable, RGPD).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">D'o\u00f9 viennent les taux d'automatisation utilis\u00e9s ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le taux d'automatisation varie selon le sc\u00e9nario retenu : <strong>40 %<\/strong> (Conservateur), <strong>60 %<\/strong> (R\u00e9aliste), <strong>70 %<\/strong> (Optimiste). Ces fourchettes sont inspir\u00e9es des benchmarks McKinsey Global Institute sur l'automatisation des activit\u00e9s tertiaires et des rapports Panorama Consulting sur les d\u00e9ploiements ERP mid-market. Ils repr\u00e9sentent la part des t\u00e2ches manuelles r\u00e9p\u00e9titives (ressaisie, reporting, consolidation Excel) qu'un ERP int\u00e9gr\u00e9 permet d'\u00e9liminer ou de r\u00e9duire fortement. Le sc\u00e9nario R\u00e9aliste refl\u00e8te une adoption normale ; le Conservateur prend une marge de prudence pour d\u00e9fendre le projet devant un comit\u00e9.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">D'o\u00f9 viennent les taux de r\u00e9duction d'erreurs utilis\u00e9s ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Comme pour l'automatisation, le taux varie selon le sc\u00e9nario : <strong>50 %<\/strong> (Conservateur), <strong>70 %<\/strong> (R\u00e9aliste), <strong>80 %<\/strong> (Optimiste). Ces ordres de grandeur s'inspirent des rapports annuels Panorama Consulting et IBM Data Quality Studies sur plusieurs centaines d'impl\u00e9mentations ERP. La r\u00e9duction provient de l'\u00e9limination de la ressaisie inter-outils, des r\u00e8gles de validation automatiques, de la tra\u00e7abilit\u00e9 compl\u00e8te et des contr\u00f4les de coh\u00e9rence en temps r\u00e9el.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quel est le d\u00e9lai de retour moyen sur un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon Panorama Consulting et Gartner, le payback se situe entre <strong>12 et 24 mois<\/strong> pour un projet mid-market bien cadr\u00e9, avec une moyenne autour de 18 mois. Les projets simples bien men\u00e9s peuvent descendre \u00e0 6-12 mois ; les projets mal pr\u00e9par\u00e9s d\u00e9passent 36 mois.\r\n            <br><br>\r\n            <em>Note m\u00e9thodologique : ce calculateur affiche un <strong>point d'\u00e9quilibre actualis\u00e9<\/strong> (flux ramen\u00e9s en valeur pr\u00e9sente au WACC), l\u00e9g\u00e8rement plus prudent que le payback nominal des benchmarks ci-dessus. L'\u00e9cart est faible sur les paybacks courts (~12-18 mois), plus visible sur les paybacks longs.<\/em>\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Faut-il prendre en compte le co\u00fbt de mon ERP\/CRM actuel ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            <strong>Oui, absolument.<\/strong> C'est ce qu'on appelle le <em>co\u00fbt de l'inaction<\/em>, et c'est souvent <strong>un pilier de gain important<\/strong> dans un projet ERP de remplacement. Si vous payez aujourd'hui des licences Sage, Cegid, SAP B1, Microsoft Dynamics, ou un patchwork de SaaS \u00e9parpill\u00e9s (compta + CRM + outils m\u00e9tier), ces co\u00fbts peuvent dispara\u00eetre avec un ERP int\u00e9gr\u00e9 comme Axelor. Renseignez le champ \u00ab Co\u00fbt annuel de vos syst\u00e8mes actuels \u00bb dans l'\u00e9tape 1 : il est optionnel et peut <strong>modifier significativement le ROI<\/strong> lorsqu'un ERP ou plusieurs outils existants sont effectivement remplac\u00e9s. Ce calculateur applique ces \u00e9conomies sans courbe de mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate (vous arr\u00eatez les abonnements au go-live).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">\u00c0 partir de quelle taille un ERP est-il rentable ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            \u00c0 partir d'environ <strong>10 utilisateurs<\/strong>, un ERP peut devenir rentable si les volumes de t\u00e2ches manuelles, les co\u00fbts d'erreurs ou les syst\u00e8mes remplac\u00e9s sont suffisants. La rentabilit\u00e9 d\u00e9pend moins du nombre d'utilisateurs que du <strong>p\u00e9rim\u00e8tre, du co\u00fbt projet et des gains op\u00e9rationnels r\u00e9ellement capturables<\/strong>. Sur des projets bien cadr\u00e9s en ETI, le ROI typique sur 5 ans se situe entre <strong>150 et 450 %<\/strong> en sc\u00e9nario r\u00e9aliste, mais un projet trop ambitieux pour une \u00e9quipe trop petite peut tr\u00e8s bien afficher un ROI n\u00e9gatif. C'est pr\u00e9cis\u00e9ment ce que ce calculateur permet de v\u00e9rifier avant l'engagement budg\u00e9taire.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Pourquoi un ERP open source comme Axelor ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Quatre avantages : <strong>transparence du code<\/strong> (pas de bo\u00eete noire), <strong>ma\u00eetrise du TCO<\/strong> (pas de co\u00fbts cach\u00e9s), <strong>souverainet\u00e9 des donn\u00e9es<\/strong> (cloud priv\u00e9, on-premise ou h\u00e9bergeur souverain europ\u00e9en), et <strong>personnalisation illimit\u00e9e<\/strong> gr\u00e2ce \u00e0 la plateforme No-Code Axelor.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Combien de temps prend l'impl\u00e9mentation d'un ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            La dur\u00e9e d\u00e9pend du p\u00e9rim\u00e8tre fonctionnel : <strong>2 \u00e0 4 mois<\/strong> pour un p\u00e9rim\u00e8tre limit\u00e9 (CRM ou compta seuls), <strong>4 \u00e0 8 mois<\/strong> pour 3 \u00e0 5 modules int\u00e9gr\u00e9s, <strong>8 \u00e0 18 mois<\/strong> pour un ERP int\u00e9gr\u00e9 complet. L'approche No-Code Axelor r\u00e9duit significativement ces d\u00e9lais : ce qui prendrait 6 mois en d\u00e9veloppement traditionnel se param\u00e8tre souvent en 6 semaines avec Axelor Studio.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Qu'est-ce qu'un ERP agentique, et qu'est-ce que \u00e7a change pour mon ROI ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Un ERP agentique int\u00e8gre une <strong>IA qui agit directement sur vos donn\u00e9es m\u00e9tier<\/strong>, et ne se contente pas de r\u00e9pondre \u00e0 des questions. Concr\u00e8tement, elle peut saisir des factures, d\u00e9clencher des r\u00e8gles de gestion, planifier, anticiper une rupture de stock ou un retard. Ce sont autant de t\u00e2ches qui, jusqu'ici, mobilisaient du temps humain : c'est exactement le poste de \u00ab gains de productivit\u00e9 \u00bb que ce calculateur estime. Plus ces t\u00e2ches sont automatis\u00e9es, plus le retour sur investissement est rapide.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Concr\u00e8tement, que peut faire l'IA agentique d'Axelor ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            L'IA d'Axelor couvre plusieurs usages : <strong>automatiser<\/strong> les saisies et les r\u00e8gles m\u00e9tier, <strong>optimiser<\/strong> la planification (production, tourn\u00e9es, ressources), <strong>anticiper<\/strong> les ruptures, retards et besoins de tr\u00e9sorerie, <strong>rechercher<\/strong> l'information dans vos donn\u00e9es en langage naturel, et m\u00eame <strong>cr\u00e9er des \u00e9crans, des champs ou des tableaux de bord sans \u00e9crire de code<\/strong>, simplement en d\u00e9crivant le besoin. Cette capacit\u00e9 No-Code est le vrai diff\u00e9renciateur : vous adaptez l'ERP \u00e0 vos processus, pas l'inverse.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">L'IA a-t-elle acc\u00e8s \u00e0 toutes mes donn\u00e9es ? Est-ce s\u00e9curis\u00e9 ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Oui, et c'est encadr\u00e9 par construction. Chez Axelor, chaque demande adress\u00e9e \u00e0 l'IA passe par une <strong>couche interm\u00e9diaire qui applique vos permissions<\/strong> avant d'acc\u00e9der \u00e0 la base de donn\u00e9es : l'IA ne voit et ne modifie que ce que l'utilisateur a le droit de voir et de modifier. Vos donn\u00e9es ne servent jamais \u00e0 entra\u00eener un mod\u00e8le externe, et vous gardez la ma\u00eetrise de l'h\u00e9bergement (cloud, priv\u00e9 ou sur vos serveurs). La conformit\u00e9 RGPD et le contr\u00f4le des acc\u00e8s sont donc natifs, pas ajout\u00e9s apr\u00e8s coup.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels sont les facteurs cl\u00e9s de succ\u00e8s d'un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Cinq facteurs distinguent les projets ERP r\u00e9ussis : <strong>sponsorship ex\u00e9cutif<\/strong> (un projet sans portage direction \u00e9choue dans 70 % des cas), cadrage fonctionnel pr\u00e9cis, choix d'un int\u00e9grateur exp\u00e9riment\u00e9 sur votre secteur, formation et adoption utilisateur, et gouvernance projet rigoureuse avec instances de pilotage r\u00e9guli\u00e8res.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n  <\/div><!-- \/faq-section-wrapper -->\r\n<\/div>\r\n\r\n\r\n\r\n<!-- ============ SEO STRUCTURED DATA (JSON-LD FAQPage) ============ -->\r\n<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@type\": \"FAQPage\",\r\n  \"mainEntity\": [\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment calcule-t-on le ROI d'un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le retour sur investissement d'un ERP se calcule avec la formule standard : ROI = (Gains \u2212 Co\u00fbts) \/ Co\u00fbts \u00d7 100, projet\u00e9 sur l'horizon retenu (3, 5, 7 ou 10 ans selon votre choix). C'est la m\u00e9thodologie utilis\u00e9e par les cabinets de r\u00e9f\u00e9rence (Gartner, Panorama Consulting, Forrester) pour \u00e9valuer la rentabilit\u00e9 d'un projet ERP.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Qu'est-ce que le TCO d'un ERP et que comprend-il ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le TCO (Total Cost of Ownership) repr\u00e9sente le co\u00fbt total de possession d'un ERP sur l'horizon retenu. Il inclut quatre postes : licences ou abonnements SaaS, frais d'impl\u00e9mentation, formation des utilisateurs, et maintenance annuelle (18 \u00e0 22 % du co\u00fbt licence pour les ERP on-premise, souvent incluse dans les abonnements SaaS).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment estimer le co\u00fbt d'impl\u00e9mentation d'un ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon les benchmarks Panorama Consulting, le co\u00fbt moyen d'impl\u00e9mentation d'un ERP mid-market s'\u00e9l\u00e8ve \u00e0 plusieurs centaines de milliers d'euros. En r\u00e8gle g\u00e9n\u00e9rale, les entreprises consacrent 1 \u00e0 3 % de leur chiffre d'affaires annuel \u00e0 l'impl\u00e9mentation. Ce co\u00fbt couvre le param\u00e9trage, l'int\u00e9gration, la migration des donn\u00e9es et la conduite du changement. Pour une estimation pr\u00e9cise, demandez un devis \u00e0 un int\u00e9grateur Axelor.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment estimer la part de temps pass\u00e9 en t\u00e2ches manuelles ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Estimez la proportion du temps de travail consacr\u00e9e \u00e0 des t\u00e2ches manuelles r\u00e9p\u00e9titives plut\u00f4t qu'au c\u0153ur de m\u00e9tier : ressaisie inter-outils, consolidation Excel, recherche d'informations entre fichiers, g\u00e9n\u00e9ration manuelle de reportings, validation de factures. Pour la plupart des ETI, ce pourcentage se situe entre 15 et 30 %. Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \u00ab se battre avec Excel \u00bb, vous \u00eates \u00e0 ~20 %.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"C'est quoi un co\u00fbt horaire \u00ab charg\u00e9 \u00bb et comment le calculer ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le co\u00fbt horaire charg\u00e9 repr\u00e9sente le co\u00fbt total pour l'entreprise, pas le salaire brut. Il inclut le salaire, les charges patronales, les avantages sociaux, les frais d'\u00e9quipement et les co\u00fbts indirects (bureau, IT). R\u00e8gle empirique : multiplier le salaire brut par 1,3 \u00e0 1,4. Exemple : un salari\u00e9 \u00e0 40 000 \u20ac de salaire brut annuel co\u00fbte 52 000 \u00e0 56 000 \u20ac charg\u00e9s, soit environ 32 \u00e0 35 \u20ac\/h sur une base de 1 600 h travaill\u00e9es.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Cloud SaaS ou On-Premise : quel impact sur le TCO ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon Forrester Research, les ERP cloud r\u00e9duisent le TCO de 30 \u00e0 50 % sur 5 ans par rapport au d\u00e9ploiement on-premise, principalement gr\u00e2ce \u00e0 l'\u00e9limination des co\u00fbts d'infrastructure et de maintenance hardware. \u00c0 l'inverse, l'on-premise peut s'av\u00e9rer plus \u00e9conomique sur 10 ans pour les grandes entreprises avec beaucoup d'utilisateurs et des besoins de personnalisation lourds. Axelor propose les deux mod\u00e8les.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels sont les co\u00fbts cach\u00e9s d'un projet ERP \u00e0 anticiper ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Quatre postes sont souvent sous-estim\u00e9s : temps interne (vos \u00e9quipes mobilis\u00e9es 0,5 \u00e0 1 jour\/semaine par utilisateur cl\u00e9), migration de donn\u00e9es (5 \u00e0 15 % du co\u00fbt d'impl\u00e9mentation), conduite du changement (communication, accompagnement), \u00e9volutions futures (nouveaux modules, int\u00e9grations). Selon Panorama Consulting, plus d'un quart des projets d\u00e9passent leur budget. Anticipez une marge de 15-20 % sur le co\u00fbt d'impl\u00e9mentation.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels signaux indiquent qu'il faut changer d'ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Cinq signaux indiquent qu'un ERP arrive en fin de vie : multiplication des fichiers Excel en parall\u00e8le de l'ERP, impossibilit\u00e9 d'int\u00e9grer les nouveaux outils (CRM, e-commerce, IA), temps de cl\u00f4ture comptable qui s'allonge, incapacit\u00e9 \u00e0 \u00e9voluer sans co\u00fbt de d\u00e9veloppement majeur, et support \u00e9diteur d\u00e9grad\u00e9 (fin de version, hausses tarifaires). La dur\u00e9e de vie moyenne d'un ERP est de 7 \u00e0 10 ans.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Pourquoi 18-22 % de maintenance annuelle ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"C'est le standard du march\u00e9 ERP, appliqu\u00e9 par tous les \u00e9diteurs (SAP, Sage, Microsoft Dynamics, Oracle, Axelor). Ce pourcentage couvre les mises \u00e0 jour fonctionnelles, les correctifs de s\u00e9curit\u00e9, le support technique et la mise en conformit\u00e9 r\u00e9glementaire (fiscale, comptable, RGPD).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"D'o\u00f9 viennent les taux d'automatisation utilis\u00e9s ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le taux d'automatisation varie selon le sc\u00e9nario retenu : 40 % (Conservateur), 60 % (R\u00e9aliste), 70 % (Optimiste). Ces fourchettes sont inspir\u00e9es des benchmarks McKinsey Global Institute sur l'automatisation des activit\u00e9s tertiaires et des rapports Panorama Consulting sur les d\u00e9ploiements ERP mid-market. Ils repr\u00e9sentent la part des t\u00e2ches manuelles r\u00e9p\u00e9titives (ressaisie, reporting, consolidation Excel) qu'un ERP int\u00e9gr\u00e9 permet d'\u00e9liminer ou de r\u00e9duire fortement. Le sc\u00e9nario R\u00e9aliste refl\u00e8te une adoption normale ; le Conservateur prend une marge de prudence pour d\u00e9fendre le projet devant un comit\u00e9.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"D'o\u00f9 viennent les taux de r\u00e9duction d'erreurs utilis\u00e9s ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Comme pour l'automatisation, le taux varie selon le sc\u00e9nario : 50 % (Conservateur), 70 % (R\u00e9aliste), 80 % (Optimiste). Ces ordres de grandeur s'inspirent des rapports annuels Panorama Consulting et IBM Data Quality Studies sur plusieurs centaines d'impl\u00e9mentations ERP. La r\u00e9duction provient de l'\u00e9limination de la ressaisie inter-outils, des r\u00e8gles de validation automatiques, de la tra\u00e7abilit\u00e9 compl\u00e8te et des contr\u00f4les de coh\u00e9rence en temps r\u00e9el.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quel est le d\u00e9lai de retour moyen sur un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon Panorama Consulting et Gartner, le payback se situe entre 12 et 24 mois pour un projet mid-market bien cadr\u00e9, avec une moyenne autour de 18 mois. Les projets simples bien men\u00e9s peuvent descendre \u00e0 6-12 mois ; les projets mal pr\u00e9par\u00e9s d\u00e9passent 36 mois. Note m\u00e9thodologique : ce calculateur affiche un point d'\u00e9quilibre actualis\u00e9 (flux ramen\u00e9s en valeur pr\u00e9sente au WACC), l\u00e9g\u00e8rement plus prudent que le payback nominal des benchmarks ci-dessus. L'\u00e9cart est faible sur les paybacks courts (~12-18 mois), plus visible sur les paybacks longs.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Faut-il prendre en compte le co\u00fbt de mon ERP\/CRM actuel ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Oui, absolument. C'est ce qu'on appelle le co\u00fbt de l'inaction, et c'est souvent un pilier de gain important dans un projet ERP de remplacement. Si vous payez aujourd'hui des licences Sage, Cegid, SAP B1, Microsoft Dynamics, ou un patchwork de SaaS \u00e9parpill\u00e9s (compta + CRM + outils m\u00e9tier), ces co\u00fbts peuvent dispara\u00eetre avec un ERP int\u00e9gr\u00e9 comme Axelor. Renseignez le champ \u00ab Co\u00fbt annuel de vos syst\u00e8mes actuels \u00bb dans l'\u00e9tape 1 : il est optionnel et peut modifier significativement le ROI lorsqu'un ERP ou plusieurs outils existants sont effectivement remplac\u00e9s. Ce calculateur applique ces \u00e9conomies sans courbe de mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate (vous arr\u00eatez les abonnements au go-live).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00c0 partir de quelle taille un ERP est-il rentable ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"\u00c0 partir d'environ 10 utilisateurs, un ERP peut devenir rentable si les volumes de t\u00e2ches manuelles, les co\u00fbts d'erreurs ou les syst\u00e8mes remplac\u00e9s sont suffisants. La rentabilit\u00e9 d\u00e9pend moins du nombre d'utilisateurs que du p\u00e9rim\u00e8tre, du co\u00fbt projet et des gains op\u00e9rationnels r\u00e9ellement capturables. Sur des projets bien cadr\u00e9s en ETI, le ROI typique sur 5 ans se situe entre 150 et 450 % en sc\u00e9nario r\u00e9aliste, mais un projet trop ambitieux pour une \u00e9quipe trop petite peut tr\u00e8s bien afficher un ROI n\u00e9gatif. C'est pr\u00e9cis\u00e9ment ce que ce calculateur permet de v\u00e9rifier avant l'engagement budg\u00e9taire.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Pourquoi un ERP open source comme Axelor ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Quatre avantages : transparence du code (pas de bo\u00eete noire), ma\u00eetrise du TCO (pas de co\u00fbts cach\u00e9s), souverainet\u00e9 des donn\u00e9es (cloud priv\u00e9, on-premise ou h\u00e9bergeur souverain europ\u00e9en), et personnalisation illimit\u00e9e gr\u00e2ce \u00e0 la plateforme No-Code Axelor.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Combien de temps prend l'impl\u00e9mentation d'un ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"La dur\u00e9e d\u00e9pend du p\u00e9rim\u00e8tre fonctionnel : 2 \u00e0 4 mois pour un p\u00e9rim\u00e8tre limit\u00e9 (CRM ou compta seuls), 4 \u00e0 8 mois pour 3 \u00e0 5 modules int\u00e9gr\u00e9s, 8 \u00e0 18 mois pour un ERP int\u00e9gr\u00e9 complet. L'approche No-Code Axelor r\u00e9duit significativement ces d\u00e9lais : ce qui prendrait 6 mois en d\u00e9veloppement traditionnel se param\u00e8tre souvent en 6 semaines avec Axelor Studio.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Qu'est-ce qu'un ERP agentique, et qu'est-ce que \u00e7a change pour mon ROI ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Un ERP agentique int\u00e8gre une IA qui agit directement sur vos donn\u00e9es m\u00e9tier, et ne se contente pas de r\u00e9pondre \u00e0 des questions. Concr\u00e8tement, elle peut saisir des factures, d\u00e9clencher des r\u00e8gles de gestion, planifier, anticiper une rupture de stock ou un retard. Ce sont autant de t\u00e2ches qui, jusqu'ici, mobilisaient du temps humain : c'est exactement le poste de \u00ab gains de productivit\u00e9 \u00bb que ce calculateur estime. Plus ces t\u00e2ches sont automatis\u00e9es, plus le retour sur investissement est rapide.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Concr\u00e8tement, que peut faire l'IA agentique d'Axelor ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"L'IA d'Axelor couvre plusieurs usages : automatiser les saisies et les r\u00e8gles m\u00e9tier, optimiser la planification (production, tourn\u00e9es, ressources), anticiper les ruptures, retards et besoins de tr\u00e9sorerie, rechercher l'information dans vos donn\u00e9es en langage naturel, et m\u00eame cr\u00e9er des \u00e9crans, des champs ou des tableaux de bord sans \u00e9crire de code, simplement en d\u00e9crivant le besoin. Cette capacit\u00e9 No-Code est le vrai diff\u00e9renciateur : vous adaptez l'ERP \u00e0 vos processus, pas l'inverse.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"L'IA a-t-elle acc\u00e8s \u00e0 toutes mes donn\u00e9es ? Est-ce s\u00e9curis\u00e9 ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Oui, et c'est encadr\u00e9 par construction. Chez Axelor, chaque demande adress\u00e9e \u00e0 l'IA passe par une couche interm\u00e9diaire qui applique vos permissions avant d'acc\u00e9der \u00e0 la base de donn\u00e9es : l'IA ne voit et ne modifie que ce que l'utilisateur a le droit de voir et de modifier. Vos donn\u00e9es ne servent jamais \u00e0 entra\u00eener un mod\u00e8le externe, et vous gardez la ma\u00eetrise de l'h\u00e9bergement (cloud, priv\u00e9 ou sur vos serveurs). La conformit\u00e9 RGPD et le contr\u00f4le des acc\u00e8s sont donc natifs, pas ajout\u00e9s apr\u00e8s coup.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels sont les facteurs cl\u00e9s de succ\u00e8s d'un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Cinq facteurs distinguent les projets ERP r\u00e9ussis : sponsorship ex\u00e9cutif (un projet sans portage direction \u00e9choue dans 70 % des cas), cadrage fonctionnel pr\u00e9cis, choix d'un int\u00e9grateur exp\u00e9riment\u00e9 sur votre secteur, formation et adoption utilisateur, et gouvernance projet rigoureuse avec instances de pilotage r\u00e9guli\u00e8res.\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n<\/script>\r\n\r\n<script>\r\n\/\/ =====================================================\r\n\/\/ ==== SYST\u00c8ME DE DEVISES MULTI-CURRENCY (V11) ====\r\n\/\/ =====================================================\r\n\r\nconst CURRENCIES = {\r\n  \/\/ Devises principales (mises en avant)\r\n  EUR: { name: \"Euro\", symbol: \"\u20ac\", code: \"EUR\", locale: \"fr-FR\", position: \"after\", flag: \"\u20ac\", main: true },\r\n  USD: { name: \"Dollar am\u00e9ricain\", symbol: \"$\", code: \"USD\", locale: \"en-US\", position: \"before\", flag: \"$\", main: true },\r\n  GBP: { name: \"Livre sterling\", symbol: \"\u00a3\", code: \"GBP\", locale: \"en-GB\", position: \"before\", flag: \"\u00a3\", main: true },\r\n  MAD: { name: \"Dirham marocain\", symbol: \"DH\", code: \"MAD\", locale: \"fr-MA\", position: \"after\", flag: \"\u062f.\u0645\", main: true },\r\n  CHF: { name: \"Franc suisse\", symbol: \"CHF\", code: \"CHF\", locale: \"fr-CH\", position: \"after\", flag: \"Fr\", main: true },\r\n  CAD: { name: \"Dollar canadien\", symbol: \"$ CA\", code: \"CAD\", locale: \"fr-CA\", position: \"after\", flag: \"$\" , main: true },\r\n\r\n  \/\/ Autres devises\r\n  AED: { name: \"Dirham des \u00c9mirats\", symbol: \"AED\", code: \"AED\", locale: \"ar-AE\", position: \"after\", flag: \"\u062f.\u0625\" },\r\n  AUD: { name: \"Dollar australien\", symbol: \"$ AU\", code: \"AUD\", locale: \"en-AU\", position: \"after\", flag: \"$\" },\r\n  BRL: { name: \"Real br\u00e9silien\", symbol: \"R$\", code: \"BRL\", locale: \"pt-BR\", position: \"before\", flag: \"R$\" },\r\n  CNY: { name: \"Yuan chinois\", symbol: \"\u00a5\", code: \"CNY\", locale: \"zh-CN\", position: \"before\", flag: \"\u00a5\" },\r\n  DZD: { name: \"Dinar alg\u00e9rien\", symbol: \"DA\", code: \"DZD\", locale: \"fr-DZ\", position: \"after\", flag: \"\u062f.\u062c\" },\r\n  EGP: { name: \"Livre \u00e9gyptienne\", symbol: \"E\u00a3\", code: \"EGP\", locale: \"ar-EG\", position: \"before\", flag: \"\u062c.\u0645\" },\r\n  HKD: { name: \"Dollar hongkongais\", symbol: \"HK$\", code: \"HKD\", locale: \"en-HK\", position: \"before\", flag: \"$\" },\r\n  INR: { name: \"Roupie indienne\", symbol: \"\u20b9\", code: \"INR\", locale: \"en-IN\", position: \"before\", flag: \"\u20b9\" },\r\n  JPY: { name: \"Yen japonais\", symbol: \"\u00a5\", code: \"JPY\", locale: \"ja-JP\", position: \"before\", flag: \"\u00a5\", noDecimal: true },\r\n  KRW: { name: \"Won sud-cor\u00e9en\", symbol: \"\u20a9\", code: \"KRW\", locale: \"ko-KR\", position: \"before\", flag: \"\u20a9\", noDecimal: true },\r\n  MXN: { name: \"Peso mexicain\", symbol: \"$\", code: \"MXN\", locale: \"es-MX\", position: \"before\", flag: \"$\" },\r\n  NOK: { name: \"Couronne norv\u00e9gienne\", symbol: \"kr\", code: \"NOK\", locale: \"nb-NO\", position: \"after\", flag: \"kr\" },\r\n  NZD: { name: \"Dollar n\u00e9o-z\u00e9landais\", symbol: \"$ NZ\", code: \"NZD\", locale: \"en-NZ\", position: \"after\", flag: \"$\" },\r\n  PLN: { name: \"Z\u0142oty polonais\", symbol: \"z\u0142\", code: \"PLN\", locale: \"pl-PL\", position: \"after\", flag: \"z\u0142\" },\r\n  RUB: { name: \"Rouble russe\", symbol: \"\u20bd\", code: \"RUB\", locale: \"ru-RU\", position: \"after\", flag: \"\u20bd\" },\r\n  SAR: { name: \"Riyal saoudien\", symbol: \"SR\", code: \"SAR\", locale: \"ar-SA\", position: \"after\", flag: \"\u0631.\u0633\" },\r\n  SEK: { name: \"Couronne su\u00e9doise\", symbol: \"kr\", code: \"SEK\", locale: \"sv-SE\", position: \"after\", flag: \"kr\" },\r\n  SGD: { name: \"Dollar de Singapour\", symbol: \"S$\", code: \"SGD\", locale: \"en-SG\", position: \"before\", flag: \"$\" },\r\n  TND: { name: \"Dinar tunisien\", symbol: \"DT\", code: \"TND\", locale: \"fr-TN\", position: \"after\", flag: \"\u062f.\u062a\" },\r\n  TRY: { name: \"Livre turque\", symbol: \"\u20ba\", code: \"TRY\", locale: \"tr-TR\", position: \"after\", flag: \"\u20ba\" },\r\n  XOF: { name: \"Franc CFA (BCEAO)\", symbol: \"CFA\", code: \"XOF\", locale: \"fr-FR\", position: \"after\", flag: \"Fr\", noDecimal: true },\r\n  ZAR: { name: \"Rand sud-africain\", symbol: \"R\", code: \"ZAR\", locale: \"en-ZA\", position: \"before\", flag: \"R\" },\r\n};\r\n\r\nlet currentCurrency = \"EUR\";\r\n\r\n\/\/ [FIX] Ex\u00e9cute fn imm\u00e9diatement si le DOM est d\u00e9j\u00e0 pr\u00eat, sinon au DOMContentLoaded.\r\n\/\/ En prod, WordPress\/Divi charge ce script APR\u00c8S le DOM : sans ce garde, les blocs\r\n\/\/ DOMContentLoaded (sc\u00e9nario, horizon, devise, aide, toggles) ne s'ex\u00e9cutaient JAMAIS\r\n\/\/ -> curseur conservateur\/r\u00e9aliste\/optimiste mort, info fig\u00e9e sur \"60 %\", horizon inerte.\r\nfunction ready(fn){ if (document.readyState !== 'loading') { fn(); } else { document.addEventListener('DOMContentLoaded', fn); } }\r\n\r\n\/\/ R\u00e9cup\u00e8re depuis localStorage ou d\u00e9faut\r\ntry {\r\n  const saved = localStorage.getItem('axelor_roi_currency');\r\n  if (saved && CURRENCIES[saved]) currentCurrency = saved;\r\n} catch (e) { \/* localStorage indisponible, on garde EUR *\/ }\r\n\r\nfunction getCurrency() { return CURRENCIES[currentCurrency]; }\r\n\r\nfunction updateCurrencyDisplay() {\r\n  const cur = getCurrency();\r\n  \/\/ Trigger header\r\n  document.getElementById('curFlag').textContent = cur.flag;\r\n  document.getElementById('curCode').textContent = cur.code;\r\n  document.getElementById('curName').textContent = cur.name;\r\n  \/\/ Symboles dans labels (span.currency-symbol)\r\n  document.querySelectorAll('.currency-symbol').forEach(el => el.textContent = cur.symbol);\r\n  \/\/ Symboles dans pr\u00e9fixes d'inputs : on utilise un span enfant (fiable cross-browser)\r\n  document.querySelectorAll('.currency-prefix').forEach(el => {\r\n    el.setAttribute('data-prefix', cur.symbol); \/\/ garde la compat ::before\r\n    el.classList.add('has-symbol'); \/\/ masque le ::before pour \u00e9viter doublon\r\n    let span = el.querySelector('.prefix-symbol');\r\n    if (!span) {\r\n      span = document.createElement('span');\r\n      span.className = 'prefix-symbol';\r\n      el.insertBefore(span, el.firstChild);\r\n    }\r\n    span.textContent = cur.symbol;\r\n    \/\/ Ajuste le padding-left de l'input selon la largeur du symbole\r\n    const len = cur.symbol.length;\r\n    el.classList.remove('wide-prefix', 'xwide-prefix');\r\n    if (len >= 4) el.classList.add('xwide-prefix');\r\n    else if (len >= 2) el.classList.add('wide-prefix');\r\n  });\r\n  \/\/ Marquer actif dans dropdown\r\n  document.querySelectorAll('.currency-option').forEach(el => {\r\n    el.classList.toggle('active', el.dataset.code === currentCurrency);\r\n  });\r\n}\r\n\r\nfunction renderCurrencyList() {\r\n  const mainContainer = document.getElementById('currencyMain');\r\n  const otherContainer = document.getElementById('currencyOther');\r\n  mainContainer.innerHTML = '';\r\n  otherContainer.innerHTML = '';\r\n  Object.values(CURRENCIES).forEach(cur => {\r\n    const opt = document.createElement('div');\r\n    opt.className = 'currency-option' + (cur.code === currentCurrency ? ' active' : '');\r\n    opt.dataset.code = cur.code;\r\n    opt.dataset.search = (cur.name + ' ' + cur.code + ' ' + cur.symbol).toLowerCase();\r\n    opt.innerHTML = `\r\n      <div class=\"opt-flag\">${cur.flag}<\/div>\r\n      <div class=\"opt-info\">\r\n        <div class=\"opt-name\">${cur.name}<\/div>\r\n        <div class=\"opt-code\">${cur.code} | ${cur.symbol}<\/div>\r\n      <\/div>\r\n      <svg class=\"opt-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n    `;\r\n    opt.addEventListener('click', () => selectCurrency(cur.code));\r\n    if (cur.main) mainContainer.appendChild(opt);\r\n    else otherContainer.appendChild(opt);\r\n  });\r\n}\r\n\r\nfunction selectCurrency(code) {\r\n  if (!CURRENCIES[code]) return;\r\n  currentCurrency = code;\r\n  try { localStorage.setItem('axelor_roi_currency', code); } catch (e) {}\r\n  updateCurrencyDisplay();\r\n  if (typeof calculate === 'function') calculate();\r\n  closeCurrencyDropdown();\r\n  showCurrencyToast();\r\n}\r\n\r\nfunction showCurrencyToast() {\r\n  const cur = getCurrency();\r\n  const toast = document.getElementById('currencyToast');\r\n  document.getElementById('toastText').textContent = `Devise chang\u00e9e : ${cur.name} (${cur.symbol})`;\r\n  toast.classList.add('show');\r\n  clearTimeout(window._curToastTimer);\r\n  window._curToastTimer = setTimeout(() => toast.classList.remove('show'), 2400);\r\n}\r\n\r\nfunction openCurrencyDropdown() {\r\n  const sw = document.getElementById('currencySwitcher');\r\n  sw.classList.add('open');\r\n  document.getElementById('currencyTrigger').setAttribute('aria-expanded', 'true');\r\n  setTimeout(() => document.getElementById('currencySearch').focus(), 50);\r\n}\r\nfunction closeCurrencyDropdown() {\r\n  const sw = document.getElementById('currencySwitcher');\r\n  sw.classList.remove('open');\r\n  document.getElementById('currencyTrigger').setAttribute('aria-expanded', 'false');\r\n  document.getElementById('currencySearch').value = '';\r\n  filterCurrencies('');\r\n}\r\nfunction filterCurrencies(query) {\r\n  const q = query.toLowerCase().trim();\r\n  document.querySelectorAll('.currency-option').forEach(opt => {\r\n    opt.style.display = (!q || opt.dataset.search.includes(q)) ? 'flex' : 'none';\r\n  });\r\n}\r\n\r\n\/\/ Init au DOM ready\r\nready(function() {\r\n  renderCurrencyList();\r\n  updateCurrencyDisplay();\r\n\r\n  document.getElementById('currencyTrigger').addEventListener('click', (e) => {\r\n    e.stopPropagation();\r\n    const isOpen = document.getElementById('currencySwitcher').classList.contains('open');\r\n    isOpen ? closeCurrencyDropdown() : openCurrencyDropdown();\r\n  });\r\n  document.addEventListener('click', (e) => {\r\n    if (!e.target.closest('#currencySwitcher')) closeCurrencyDropdown();\r\n  });\r\n  document.getElementById('currencySearch').addEventListener('input', (e) => {\r\n    filterCurrencies(e.target.value);\r\n  });\r\n  document.getElementById('currencySearch').addEventListener('keydown', (e) => {\r\n    if (e.key === 'Escape') closeCurrencyDropdown();\r\n  });\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FIN SYST\u00c8ME DEVISES ====\r\n\/\/ =====================================================\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== SYST\u00c8ME D'AIDE - TOOLTIPS PAR CHAMP ====\r\n\/\/ =====================================================\r\n\r\nconst HELP_CONTENT = {\r\n  users: {\r\n    title: \"Nombre d'utilisateurs ERP\",\r\n    body: `<p>Il s'agit du <strong>nombre total de personnes<\/strong> qui utiliseront l'ERP Axelor au quotidien : \u00e9quipes commerciales, comptables, RH, op\u00e9rations, direction.<\/p>\r\n      <p>Plus le nombre est \u00e9lev\u00e9, plus les co\u00fbts de licence et formation augmentent, mais les <strong>gains de productivit\u00e9 aussi<\/strong> - l'ERP devient une plateforme commune.<\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Exemple<\/div>\r\n        Une PME de 80 salari\u00e9s \u00e9quipe typiquement 25 \u00e0 35 utilisateurs ERP (hors production atelier).\r\n      <\/div>`\r\n  },\r\n  licenseCost: {\r\n    title: \"Co\u00fbt de licence par utilisateur\",\r\n    body: `<p>Co\u00fbt mensuel de la licence SaaS par utilisateur, hors impl\u00e9mentation et formation. Ce chiffre d\u00e9pend de l'\u00e9diteur et du p\u00e9rim\u00e8tre fonctionnel (modules activ\u00e9s).<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul annuel<\/div>\r\n        Co\u00fbt licence \u00d7 Utilisateurs \u00d7 12 mois\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8re march\u00e9 2026<\/div>\r\n        ERP mid-market en SaaS : entre <strong>50 et 150 \u20ac\/user\/mois<\/strong>. Axelor se positionne \u00e0 <strong>55 \u20ac\/user\/mois<\/strong> en moyenne pour le pack standard - un positionnement particuli\u00e8rement comp\u00e9titif.\r\n      <\/div>`\r\n  },\r\n  implementationCost: {\r\n    title: \"Co\u00fbt d'impl\u00e9mentation\",\r\n    body: `<p>Co\u00fbt total du projet de d\u00e9ploiement : analyse fonctionnelle, param\u00e9trage, d\u00e9veloppements sp\u00e9cifiques, migration des donn\u00e9es, recettage, conduite du changement.<\/p>\r\n      <p>C'est une <strong>d\u00e9pense ponctuelle<\/strong> (one-shot) qui couvre l'ensemble du projet jusqu'au go-live.<\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8re march\u00e9<\/div>\r\n        Pour une ETI 30-50 utilisateurs : <strong>40 000 \u00e0 120 000 \u20ac<\/strong>. Le calculateur ajoute automatiquement une <strong>marge de 15 %<\/strong> pour couvrir les co\u00fbts cach\u00e9s (changement de scope, prolongation, etc.).\r\n      <\/div>`\r\n  },\r\n  trainingCost: {\r\n    title: \"Co\u00fbt de formation (total projet)\",\r\n    body: `<p>Budget global consacr\u00e9 \u00e0 la formation de vos \u00e9quipes : prise en main de l'outil, supports p\u00e9dagogiques et accompagnement au d\u00e9marrage. C'est un <strong>forfait pour l'ensemble du projet<\/strong>, et non un co\u00fbt par utilisateur.<\/p>\r\n      <p>Le montant varie selon le nombre d'\u00e9quipes \u00e0 former, le p\u00e9rim\u00e8tre d\u00e9ploy\u00e9 et le format retenu. La valeur pr\u00e9-remplie n'est qu'une <strong>estimation de d\u00e9part<\/strong> : ajustez-la avec votre propre budget, ou \u00e9changez avec nos \u00e9quipes pour un chiffrage adapt\u00e9 \u00e0 votre organisation.<\/p>`\r\n  },\r\n  maintenancePct: {\r\n    title: \"Maintenance annuelle\",\r\n    body: `<p>Pourcentage annuel du co\u00fbt licence d\u00e9di\u00e9 \u00e0 la maintenance \u00e9volutive et corrective : mont\u00e9es de version, patchs s\u00e9curit\u00e9, support utilisateur, hotline.<\/p>\r\n      <p><strong>Chez Axelor<\/strong>, la maintenance de la plateforme standard est <strong>100 % incluse dans l'abonnement<\/strong> : laissez l'option \u00ab Maintenance d\u00e9j\u00e0 incluse \u00bb coch\u00e9e. Si votre projet comporte des <strong>d\u00e9veloppements sp\u00e9cifiques sur-mesure<\/strong>, pr\u00e9voyez une maintenance du sp\u00e9cifique d'environ <strong>15 % du co\u00fbt de ces d\u00e9veloppements<\/strong>.<\/p>\r\n      <p><strong>En mode SaaS en g\u00e9n\u00e9ral<\/strong>, la maintenance est d\u00e9j\u00e0 incluse dans l'abonnement mensuel : le calculateur n'ajoute alors aucun co\u00fbt suppl\u00e9mentaire. D\u00e9cochez l'option uniquement si votre \u00e9diteur facture la maintenance <em>en plus<\/em> (cas typique : ERP on-premise ou licences perp\u00e9tuelles).<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul (si non incluse)<\/div>\r\n        (Licences annuelles) \u00d7 (% maintenance) \u00d7 horizon s\u00e9lectionn\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Standard march\u00e9<\/div>\r\n        Entre <strong>18 et 22 %<\/strong> du co\u00fbt licence annuel pour les ERP on-premise. Au-del\u00e0 de 25 %, n\u00e9gociez.\r\n      <\/div>`\r\n  },\r\n  hostingCost: {\r\n    title: \"H\u00e9bergement annuel\",\r\n    body: `<p>Co\u00fbt annuel de l'infrastructure qui fait tourner votre ERP : serveurs, h\u00e9bergement cloud ou on-premise, sauvegardes, supervision et s\u00e9curit\u00e9.<\/p>\r\n      <p><strong>\u26a0\ufe0f En mode SaaS<\/strong>, l'h\u00e9bergement est g\u00e9n\u00e9ralement <strong>d\u00e9j\u00e0 compris dans l'abonnement mensuel<\/strong>. Si c'est votre cas, laissez coch\u00e9e l'option \u00ab H\u00e9bergement d\u00e9j\u00e0 inclus \u00bb juste sous le champ : le calculateur n'ajoutera aucun co\u00fbt.<\/p>\r\n      <p>D\u00e9cochez l'option uniquement si vous h\u00e9bergez en interne ou sur votre propre cloud (cas on-premise ou cloud priv\u00e9), o\u00f9 ces frais restent \u00e0 votre charge.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul (si non inclus)<\/div>\r\n        (H\u00e9bergement annuel) \u00d7 horizon s\u00e9lectionn\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8res march\u00e9<\/div>\r\n        <strong>PME jusqu'\u00e0 80 utilisateurs<\/strong> : souvent 2 000 \u00e0 8 000 \u20ac\/an pour un serveur d\u00e9di\u00e9 ou un cloud priv\u00e9.<br>\r\n        <strong>ETI de 81 \u00e0 300 utilisateurs<\/strong> : g\u00e9n\u00e9ralement 8 000 \u00e0 24 000 \u20ac\/an selon la redondance, les sauvegardes et le niveau de s\u00e9curit\u00e9.<br>\r\n        <strong>Grands Comptes, plus de 300 utilisateurs<\/strong> : au-del\u00e0 de 24 000 \u20ac\/an.\r\n      <\/div>`\r\n  },\r\n  existingSystemsCost: {\r\n    title: \"Co\u00fbt annuel de vos syst\u00e8mes actuels\",\r\n    body: `<p>Si vous remplacez un ou plusieurs syst\u00e8mes existants (vieil ERP, CRM s\u00e9par\u00e9, logiciel de compta, outils m\u00e9tier sp\u00e9cialis\u00e9s, abonnements SaaS \u00e9parpill\u00e9s, serveurs on-premise\u2026), renseignez <strong>uniquement les co\u00fbts qui pourront r\u00e9ellement \u00eatre supprim\u00e9s ou fortement r\u00e9duits<\/strong> apr\u00e8s la mise en place d'Axelor.<\/p>\r\n      <p style=\"margin-bottom:14px;\">C'est ce qu'on appelle le <strong>co\u00fbt de l'inaction<\/strong> : la d\u00e9pense que vous continuez \u00e0 payer chaque ann\u00e9e si vous ne changez rien. Pour beaucoup d'entreprises en projet de remplacement, c'est <em>un pilier de gain important<\/em> du ROI ERP.<\/p>\r\n      <p style=\"margin-bottom:14px;\">\u00c0 inclure (uniquement si effectivement remplac\u00e9) :<\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>Licences & abonnements<\/strong> de l'ERP\/CRM\/compta actuels (Sage, SAP, Microsoft Dynamics, Salesforce, EBP, Cegid\u2026)<\/li>\r\n        <li><strong>Maintenance annuelle<\/strong> factur\u00e9e par l'\u00e9diteur (18-22 % du licence on-premise)<\/li>\r\n        <li><strong>Infrastructure<\/strong> : serveurs, sauvegardes, s\u00e9curit\u00e9, h\u00e9bergement<\/li>\r\n        <li><strong>Outils SaaS satellites<\/strong> que l'ERP int\u00e9gr\u00e9 remplace (gestion stocks, GED, paie s\u00e9par\u00e9e, RH, ticketing\u2026)<\/li>\r\n        <li><strong>Prestataires<\/strong> de maintenance ou d'\u00e9volution externes<\/li>\r\n      <\/ul>\r\n      <p style=\"margin-bottom:14px; color: var(--wheelwright); font-size: 13.5px;\"><em>\u26a0\ufe0f N'incluez pas les outils que vous pr\u00e9voyez de garder en parall\u00e8le d'Axelor (ex : un outil de paie maintenu, une solution sectorielle conserv\u00e9e).<\/em><\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain<\/div>\r\n        Co\u00fbt annuel \u00d7 horizon s\u00e9lectionn\u00e9, actualis\u00e9 au WACC\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8res march\u00e9<\/div>\r\n        <strong>PME jusqu'\u00e0 80 utilisateurs<\/strong> : souvent 5 000 \u00e0 25 000 \u20ac\/an (Sage 100, EBP, plusieurs SaaS).<br>\r\n        <strong>ETI de 81 \u00e0 300 utilisateurs<\/strong> : g\u00e9n\u00e9ralement 20 000 \u00e0 80 000 \u20ac\/an (Cegid, ancien SAP B1, Dynamics NAV\u2026).<br>\r\n        <strong>Grands Comptes, plus de 300 utilisateurs<\/strong> : facilement au-del\u00e0 de 100 000 \u20ac\/an.\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Vous d\u00e9marrez de z\u00e9ro ?<\/div>\r\n        Si vous lancez votre premi\u00e8re solution ERP int\u00e9gr\u00e9e et ne remplacez rien (cas d'une premi\u00e8re impl\u00e9mentation), laissez ce champ vide. C'est le comportement par d\u00e9faut.\r\n      <\/div>`\r\n  },\r\n  manualHours: {\r\n    title: \"Part du temps en t\u00e2ches manuelles\",\r\n    body: `<p>Estimez la <strong>proportion du temps de travail<\/strong> que vos \u00e9quipes consacrent \u00e0 des t\u00e2ches manuelles et r\u00e9p\u00e9titives plut\u00f4t qu'\u00e0 leur c\u0153ur de m\u00e9tier.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ces t\u00e2ches sont typiquement :<\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>Ressaisie<\/strong> entre logiciels non connect\u00e9s (CRM \u2192 Excel \u2192 ERP)<\/li>\r\n        <li><strong>Consolidation<\/strong> manuelle de tableaux Excel<\/li>\r\n        <li><strong>Reporting<\/strong> hebdomadaire \/ mensuel construit \u00e0 la main<\/li>\r\n        <li><strong>Suivi de factures<\/strong>, relances, classement de documents<\/li>\r\n        <li><strong>Recherches<\/strong> dispers\u00e9es entre 4-5 outils diff\u00e9rents<\/li>\r\n      <\/ul>\r\n      <p>Le calculateur retient <strong>40 %<\/strong> de ces t\u00e2ches automatis\u00e9es en sc\u00e9nario Conservateur, <strong>60 %<\/strong> en R\u00e9aliste et <strong>70 %<\/strong> en Optimiste, selon le niveau d'hypoth\u00e8ses que vous s\u00e9lectionnez.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ces taux sont des <strong>hypoth\u00e8ses de mod\u00e9lisation Axelor<\/strong>, inspir\u00e9es des travaux publi\u00e9s sur l'automatisation des activit\u00e9s tertiaires. Ce ne sont pas des chiffres mesur\u00e9s chez un client.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain annuel<\/div>\r\n        % \u00d7 1 600 h\/an \u00d7 Utilisateurs \u00d7 Taux d'automatisation \u00d7 Co\u00fbt horaire\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Ordres de grandeur indicatifs par secteur<\/div>\r\n        <strong>Services & conseil<\/strong> : 15 \u00e0 25 %<br>\r\n        <strong>Industrie & BTP (fonctions administratives)<\/strong> : 20 \u00e0 30 %<br>\r\n        <strong>Comptabilit\u00e9 & finance<\/strong> : 30 \u00e0 40 %<br>\r\n        <strong>Distribution & logistique<\/strong> : 25 \u00e0 35 %<br>\r\n        <strong>Secteur public & associatif<\/strong> : 30 \u00e0 40 %<br><br>\r\n        <em>Fourchettes indicatives \u00e9tablies par Axelor \u00e0 partir de ses projets, et non des donn\u00e9es de march\u00e9 publi\u00e9es. \u00c0 confronter \u00e0 votre propre observation terrain.<\/em>\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Comment estimer ?<\/div>\r\n        Pensez \u00e0 une journ\u00e9e type. Sur 8 heures, combien sont consacr\u00e9es \u00e0 <em>produire de la valeur<\/em> (vente, conseil, conception, production) vs <em>traiter de l'information<\/em> (saisie, recherche, consolidation) ? Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \"se battre avec Excel\", vous \u00eates \u00e0 <strong>~20 %<\/strong>.\r\n      <\/div>`\r\n  },\r\n  hourlyRate: {\r\n    title: \"Co\u00fbt horaire charg\u00e9\",\r\n    body: `<p>Co\u00fbt horaire <strong>total pour l'entreprise<\/strong> d'un collaborateur : salaire brut + charges patronales + avantages sociaux + \u00e9quipement + co\u00fbts indirects (bureau, IT).<\/p>\r\n      <p>Ce n'est <strong>pas<\/strong> le salaire brut ni le co\u00fbt employeur strict.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">R\u00e8gle empirique<\/div>\r\n        Salaire brut \u00d7 1,3 \u00e0 1,4 = co\u00fbt charg\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Exemple concret<\/div>\r\n        Salaire brut 40 000 \u20ac\/an \u2192 co\u00fbt charg\u00e9 annuel 52 \u00e0 56 000 \u20ac \u2192 <strong>32 \u00e0 35 \u20ac\/h<\/strong> (sur base 1 600 h travaill\u00e9es).\r\n      <\/div>`\r\n  },\r\n  dataReliability: {\r\n    title: \"Fiabilit\u00e9 actuelle des donn\u00e9es\",\r\n    body: `<p>Estimez \u00e0 quel point vos donn\u00e9es et processus m\u00e9tier sont <strong>fiables et unifi\u00e9s<\/strong> aujourd'hui. C'est une perception qualitative - pas besoin de chiffre exact.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Plus vos donn\u00e9es sont fragment\u00e9es (multiples Excel, ressaisies manuelles, \u00e9carts entre syst\u00e8mes), plus l'ERP int\u00e9gr\u00e9 apporte de valeur en \u00e9liminant les erreurs.<\/p>\r\n      <p style=\"margin-bottom:14px;\"><strong>Signaux de faible fiabilit\u00e9 (\u2264 30 %)<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li>Mes \u00e9quipes ressaisissent les m\u00eames donn\u00e9es dans plusieurs outils<\/li>\r\n        <li>J'ai r\u00e9guli\u00e8rement des \u00e9carts entre la compta et l'op\u00e9rationnel<\/li>\r\n        <li>Les rapports manuels Excel sont sources d'erreurs r\u00e9currentes<\/li>\r\n        <li>Je d\u00e9couvre des doublons clients ou produits dans mon CRM<\/li>\r\n      <\/ul>\r\n      <p style=\"margin-bottom:14px;\"><strong>Signaux de bonne fiabilit\u00e9 (\u2265 70 %)<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li>J'ai d\u00e9j\u00e0 un ERP correct ou des syst\u00e8mes bien int\u00e9gr\u00e9s<\/li>\r\n        <li>Mes \u00e9quipes ont confiance dans les chiffres remont\u00e9s<\/li>\r\n        <li>Les \u00e9carts entre rapports sont rares et document\u00e9s<\/li>\r\n        <li>Les processus de validation sont automatis\u00e9s<\/li>\r\n      <\/ul>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du co\u00fbt d'erreurs<\/div>\r\n        Utilisateurs \u00d7 1 200 \u20ac \u00d7 (100 - fiabilit\u00e9)\/100 \u00d7 Taux de r\u00e9duction\r\n      <\/div>\r\n      <p style=\"margin: 12px 0 0; font-size: 12.5px; color: var(--wheelwright); font-style: italic;\">\r\n        \u2139\ufe0f Le benchmark de r\u00e9f\u00e9rence est exprim\u00e9 en euros (1 200 \u20ac\/utilisateur\/an). Pour les autres devises, ce montant est converti au taux indicatif. Conversion non contractuelle.\r\n      <\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Sources et benchmarks<\/div>\r\n        <strong>Panorama Consulting ERP Report 2024<\/strong> : les entreprises avec donn\u00e9es fragment\u00e9es perdent en moyenne <strong>1 % \u00e0 1,5 % de leur CA<\/strong> en erreurs m\u00e9tier (correction, retards, retours, p\u00e9nalit\u00e9s).<br><br>\r\n        <strong>IBM Data Quality Study<\/strong> : le co\u00fbt moyen des mauvaises donn\u00e9es est estim\u00e9 \u00e0 <strong>1 000 \u00e0 1 500 \u20ac\/utilisateur\/an<\/strong> pour les PME-ETI.\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Comment estimer ?<\/div>\r\n        Posez-vous la question : <em>\u00ab Si je demande \u00e0 3 personnes le chiffre d'affaires du mois dernier, est-ce que j'aurai 3 chiffres identiques ? \u00bb<\/em><br>\r\n        - Oui \u2192 fiabilit\u00e9 70 % et +<br>\r\n        - Probablement \u2192 50 %<br>\r\n        - Non, jamais \u2192 20-30 %\r\n      <\/div>`\r\n  },\r\n  aiUplift: {\r\n    title: \"Gain de l'IA agentique Axelor\",\r\n    body: `<p>Un ERP classique automatise des <strong>processus pr\u00e9d\u00e9finis<\/strong>. Les agents IA d'Axelor vont plus loin : ils <strong>ex\u00e9cutent des t\u00e2ches enti\u00e8res<\/strong> \u00e0 la demande, sur vos donn\u00e9es r\u00e9elles - cr\u00e9ation de documents, recherches, rapprochements, relances, reporting\u2026<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ce curseur estime la part <strong>additionnelle<\/strong> du temps manuel encore non automatis\u00e9 que les agents peuvent absorber, en plus de l'automatisation ERP standard.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain IA<\/div>\r\n        Heures manuelles restantes \u00d7 uplift IA \u00d7 co\u00fbt horaire \u00d7 taux de mon\u00e9tisation\r\n      <\/div>\r\n      <p style=\"margin:14px 0;\"><strong>Comment calibrer ?<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>5-10 % (prudent)<\/strong> - quelques t\u00e2ches r\u00e9p\u00e9titives d\u00e9l\u00e9gu\u00e9es aux agents<\/li>\r\n        <li><strong>15-25 % (mod\u00e9r\u00e9)<\/strong> - usage r\u00e9gulier des agents sur plusieurs modules<\/li>\r\n        <li><strong>30-40 % (fort)<\/strong> - les agents font partie du quotidien des \u00e9quipes<\/li>\r\n      <\/ul>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Pourquoi ce pilier est diff\u00e9renciant<\/div>\r\n        La plupart des calculateurs ROI ERP s'arr\u00eatent \u00e0 l'automatisation de processus. Axelor est l'un des rares \u00e0 int\u00e9grer une <strong>IA r\u00e9ellement agentique<\/strong> - qui agit dans l'ERP au lieu de seulement assister. Ce gain refl\u00e8te cette valeur suppl\u00e9mentaire.\r\n      <\/div>\r\n      <p style=\"margin: 12px 0 0; font-size: 12.5px; color: var(--wheelwright); font-style: italic;\">\r\n        \u2139\ufe0f Pilier optionnel et prudent par construction : il ne s'applique qu'aux heures non d\u00e9j\u00e0 automatis\u00e9es, pour \u00e9viter tout double comptage.\r\n      <\/p>`\r\n  }\r\n};\r\n\r\nfunction showHelpModal(helpId) {\r\n  const data = HELP_CONTENT[helpId];\r\n  if (!data) return;\r\n  document.getElementById('helpModalTitle').textContent = data.title;\r\n  document.getElementById('helpModalBody').innerHTML = data.body;\r\n  document.getElementById('helpModalOverlay').classList.add('show');\r\n  document.body.style.overflow = 'hidden';\r\n}\r\n\r\nfunction hideHelpModal() {\r\n  document.getElementById('helpModalOverlay').classList.remove('show');\r\n  document.body.style.overflow = '';\r\n}\r\n\r\nready(function() {\r\n  \/\/ Click ic\u00f4nes ?\r\n  document.querySelectorAll('.help-icon').forEach(icon => {\r\n    icon.addEventListener('click', (e) => {\r\n      e.stopPropagation();\r\n      showHelpModal(icon.dataset.help);\r\n    });\r\n    icon.addEventListener('keydown', (e) => {\r\n      if (e.key === 'Enter' || e.key === ' ') {\r\n        e.preventDefault();\r\n        showHelpModal(icon.dataset.help);\r\n      }\r\n    });\r\n  });\r\n  \/\/ Close handlers\r\n  document.getElementById('helpModalClose').addEventListener('click', hideHelpModal);\r\n  document.getElementById('helpModalOverlay').addEventListener('click', (e) => {\r\n    if (e.target.id === 'helpModalOverlay') hideHelpModal();\r\n  });\r\n  document.addEventListener('keydown', (e) => {\r\n    if (e.key === 'Escape') hideHelpModal();\r\n  });\r\n\r\n  \/\/ === S\u00e9lecteur d'horizon (pill buttons) ===\r\n  document.querySelectorAll('.horizon-option').forEach(opt => {\r\n    opt.addEventListener('click', () => {\r\n      document.querySelectorAll('.horizon-option').forEach(o => o.classList.remove('active'));\r\n      opt.classList.add('active');\r\n      const years = opt.dataset.years;\r\n      \/\/ Met \u00e0 jour tous les labels dynamiques (.horizon-text)\r\n      document.querySelectorAll('.horizon-text').forEach(el => el.textContent = years);\r\n      const hLabel = document.getElementById('horizonLabel');\r\n      if (hLabel) hLabel.textContent = years;\r\n      \/\/ Recalcule\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n  });\r\n\r\n  \/\/ === S\u00e9lecteur de sc\u00e9nario (Conservateur \/ R\u00e9aliste \/ Optimiste) ===\r\n  const SCENARIO_INFO = {\r\n    conservative: '<strong>Conservateur<\/strong> : 40 % d\\'automatisation, 60 % de mon\u00e9tisation des heures, 50 % de r\u00e9duction d\\'erreurs, ramp-up 35 % en ann\u00e9e 1. Vision prudente, d\u00e9fendable devant un comit\u00e9 ou un board.',\r\n    realistic:    '<strong>R\u00e9aliste<\/strong> : 60 % d\\'automatisation, 75 % de mon\u00e9tisation des heures, 70 % de r\u00e9duction d\\'erreurs, ramp-up 50 % en ann\u00e9e 1. Align\u00e9 sur les benchmarks Panorama Consulting et Gartner pour les ETI.',\r\n    optimistic:   '<strong>Optimiste<\/strong> : 70 % d\\'automatisation, 90 % de mon\u00e9tisation des heures, 80 % de r\u00e9duction d\\'erreurs, ramp-up 65 % en ann\u00e9e 1. Best case avec forte discipline d\\'adoption et alignement m\u00e9tier.'\r\n  };\r\n  document.querySelectorAll('.scenario-option').forEach(opt => {\r\n    opt.addEventListener('click', () => {\r\n      document.querySelectorAll('.scenario-option').forEach(o => o.classList.remove('active'));\r\n      opt.classList.add('active');\r\n      const sc = opt.dataset.scenario;\r\n      const infoEl = document.getElementById('scenarioInfo');\r\n      if (infoEl) infoEl.innerHTML = SCENARIO_INFO[sc];\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n  });\r\n\r\n  \/\/ Listener toggle maintenance SaaS + griser le champ si actif\r\n  const maintToggle = document.getElementById('maintIncluded');\r\n  const maintField = document.getElementById('maintenancePct')?.closest('.field');\r\n  const maintenanceInput = document.getElementById('maintenancePct');\r\n  \/\/ [FIX] Quand \"maintenance deja incluse\" est cochee, le champ AFFICHE 0 : garder un\r\n  \/\/ chiffre grise alors que le calcul compte 0 est trompeur. La valeur saisie est\r\n  \/\/ memorisee puis restituee si l'utilisateur decoche.\r\n  \/\/ memorise en portee globale : applyProfile doit pouvoir l'alimenter\r\n  if (window.__maintSaved === undefined) window.__maintSaved = null;\r\n  function syncMaintField(fromUser) {\r\n    if (!maintToggle || !maintField) return;\r\n    const disabled = maintToggle.checked;\r\n    maintField.classList.toggle('field-maint-disabled', disabled);\r\n    if (maintenanceInput) {\r\n      if (disabled) {\r\n        if (fromUser && maintenanceInput.value.trim() !== '' && maintenanceInput.value.trim() !== '0') {\r\n          window.__maintSaved = maintenanceInput.value;\r\n        }\r\n        maintenanceInput.value = '0';\r\n      } else if (fromUser) {\r\n        maintenanceInput.value = (window.__maintSaved !== null && window.__maintSaved !== '') ? window.__maintSaved : '';\r\n        window.__maintSaved = null;\r\n      }\r\n      maintenanceInput.disabled = disabled;\r\n      maintenanceInput.setAttribute('aria-disabled', String(disabled));\r\n    }\r\n  }\r\n  if (maintToggle) {\r\n    maintToggle.addEventListener('change', () => {\r\n      syncMaintField(true);\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n    syncMaintField(); \/\/ \u00e9tat initial\r\n  }\r\n\r\n  \/\/ Listener toggle h\u00e9bergement SaaS + griser le champ si actif\r\n  const hostingToggle = document.getElementById('hostingIncluded');\r\n  const hostingField = document.getElementById('hostingCost')?.closest('.field');\r\n  const hostingInput = document.getElementById('hostingCost');\r\n  \/\/ [FIX] Meme logique que la maintenance : coche => le champ affiche 0.\r\n  if (window.__hostingSaved === undefined) window.__hostingSaved = null;\r\n  function syncHostingField(fromUser) {\r\n    if (!hostingToggle || !hostingField) return;\r\n    const disabled = hostingToggle.checked;\r\n    hostingField.classList.toggle('field-maint-disabled', disabled);\r\n    if (hostingInput) {\r\n      if (disabled) {\r\n        if (fromUser && hostingInput.value.trim() !== '' && hostingInput.value.trim() !== '0') {\r\n          window.__hostingSaved = hostingInput.value;\r\n        }\r\n        hostingInput.value = '0';\r\n      } else if (fromUser) {\r\n        hostingInput.value = (window.__hostingSaved !== null && window.__hostingSaved !== '') ? window.__hostingSaved : '';\r\n        window.__hostingSaved = null;\r\n      }\r\n      hostingInput.disabled = disabled;\r\n      hostingInput.setAttribute('aria-disabled', String(disabled));\r\n    }\r\n  }\r\n  if (hostingToggle) {\r\n    hostingToggle.addEventListener('change', () => {\r\n      syncHostingField(true);\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n    syncHostingField(); \/\/ \u00e9tat initial\r\n  }\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FIN SYST\u00c8ME D'AIDE ====\r\n\/\/ =====================================================\r\n\r\n\/\/ === Charts ===\r\nlet cumulativeChart, gainsChart;\r\n\r\nfunction initCharts() {\r\n  \/\/ S\u00e9curit\u00e9 : si Chart.js (CDN) n'est pas encore charg\u00e9, on r\u00e9essaie un peu plus tard\r\n  \/\/ au lieu de planter tout le script. Le reste du calculateur fonctionne sans les graphes.\r\n  if (typeof Chart === 'undefined') { setTimeout(initCharts, 200); return; }\r\n  Chart.defaults.font.family = \"'Poppins', sans-serif\";\r\n  Chart.defaults.font.weight = 400;\r\n\r\n  const ctx1 = document.getElementById('cumulativeChart').getContext('2d');\r\n  const gradientCost = ctx1.createLinearGradient(0, 0, 0, 200);\r\n  gradientCost.addColorStop(0, 'rgba(244, 201, 93, 0.25)');\r\n  gradientCost.addColorStop(1, 'rgba(244, 201, 93, 0)');\r\n\r\n  const gradientGain = ctx1.createLinearGradient(0, 0, 0, 200);\r\n  gradientGain.addColorStop(0, 'rgba(62, 207, 142, 0.35)');\r\n  gradientGain.addColorStop(1, 'rgba(62, 207, 142, 0)');\r\n\r\n  cumulativeChart = new Chart(ctx1, {\r\n    type: 'line',\r\n    plugins: [{\r\n      id: 'breakevenLine',\r\n      afterDatasetsDraw(chart) {\r\n        const breakevenMonth = chart.options.plugins.breakevenMonth;\r\n        if (!breakevenMonth || breakevenMonth <= 0) return;\r\n        const ctx = chart.ctx;\r\n        const xScale = chart.scales.x;\r\n        const yScale = chart.scales.y;\r\n        \/\/ breakevenMonth est en mois \u2192 position sur l'axe X (qui est en ann\u00e9es)\r\n        const yearPos = breakevenMonth \/ 12;\r\n        const xPx = xScale.getPixelForValue(yearPos);\r\n        const yTop = yScale.top;\r\n        const yBottom = yScale.bottom;\r\n\r\n        \/\/ Ligne pointill\u00e9e verticale\r\n        ctx.save();\r\n        ctx.beginPath();\r\n        ctx.setLineDash([5, 4]);\r\n        ctx.strokeStyle = '#3ECF8E';\r\n        ctx.lineWidth = 1.5;\r\n        ctx.moveTo(xPx, yTop);\r\n        ctx.lineTo(xPx, yBottom);\r\n        ctx.stroke();\r\n        ctx.setLineDash([]);\r\n\r\n        \/\/ Pastille au sommet\r\n        ctx.beginPath();\r\n        ctx.arc(xPx, yTop + 14, 5, 0, 2 * Math.PI);\r\n        ctx.fillStyle = '#3ECF8E';\r\n        ctx.fill();\r\n\r\n        \/\/ Label \"Point d'\u00e9quilibre\"\r\n        const labelText = \"Point d'\u00e9quilibre\";\r\n        const subText = breakevenMonth < 6 ? '< 6 mois' : `${Math.round(breakevenMonth)} mois`;\r\n        ctx.font = \"600 11px Poppins, sans-serif\";\r\n        const textW = Math.max(ctx.measureText(labelText).width, ctx.measureText(subText).width);\r\n        const padX = 10, padY = 6;\r\n        const boxW = textW + padX * 2;\r\n        const boxH = 38;\r\n\r\n        \/\/ Position du badge : \u00e0 droite si payback < milieu, \u00e0 gauche si payback > milieu\r\n        const chartMid = (xScale.left + xScale.right) \/ 2;\r\n        const badgeX = xPx < chartMid ? xPx + 10 : xPx - boxW - 10;\r\n        const badgeY = yTop + 24;\r\n\r\n        \/\/ Fond\r\n        ctx.fillStyle = 'rgba(62, 207, 142, 0.15)';\r\n        ctx.strokeStyle = '#3ECF8E';\r\n        ctx.lineWidth = 1;\r\n        ctx.beginPath();\r\n        if (ctx.roundRect) {\r\n          ctx.roundRect(badgeX, badgeY, boxW, boxH, 6);\r\n        } else {\r\n          ctx.rect(badgeX, badgeY, boxW, boxH);\r\n        }\r\n        ctx.fill();\r\n        ctx.stroke();\r\n\r\n        \/\/ Textes\r\n        ctx.fillStyle = '#3ECF8E';\r\n        ctx.textBaseline = 'top';\r\n        ctx.font = \"600 11px Poppins, sans-serif\";\r\n        ctx.fillText(labelText, badgeX + padX, badgeY + padY);\r\n        ctx.font = \"500 10.5px Poppins, sans-serif\";\r\n        ctx.fillStyle = 'rgba(255,255,255,0.85)';\r\n        ctx.fillText(subText, badgeX + padX, badgeY + padY + 16);\r\n\r\n        ctx.restore();\r\n      }\r\n    }],\r\n    data: {\r\n      labels: ['Ann\u00e9e 0', 'Ann\u00e9e 1', 'Ann\u00e9e 2', 'Ann\u00e9e 3'],\r\n      datasets: [\r\n        {\r\n          label: 'Co\u00fbts',\r\n          data: [0, 0, 0, 0],\r\n          borderColor: '#F4C95D',\r\n          backgroundColor: gradientCost,\r\n          fill: true,\r\n          tension: 0.35,\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#F4C95D',\r\n          pointBorderColor: '#0D021E',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 4,\r\n          pointHoverRadius: 6,\r\n        },\r\n        {\r\n          label: 'Gains',\r\n          data: [0, 0, 0, 0],\r\n          borderColor: '#3ECF8E',\r\n          backgroundColor: gradientGain,\r\n          fill: true,\r\n          tension: 0.35,\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#3ECF8E',\r\n          pointBorderColor: '#0D021E',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 4,\r\n          pointHoverRadius: 6,\r\n        }\r\n      ]\r\n    },\r\n    options: {\r\n      responsive: true,\r\n      maintainAspectRatio: false,\r\n      interaction: { intersect: false, mode: 'index' },\r\n      plugins: {\r\n        legend: {\r\n          labels: {\r\n            color: 'rgba(255,255,255,0.75)',\r\n            font: { size: 11, weight: 500 },\r\n            usePointStyle: true,\r\n            pointStyle: 'circle',\r\n            padding: 16,\r\n            boxWidth: 6,\r\n            boxHeight: 6\r\n          }\r\n        },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(13, 2, 30, 0.95)',\r\n          titleColor: '#fff',\r\n          bodyColor: 'rgba(255,255,255,0.85)',\r\n          borderColor: 'rgba(255,255,255,0.1)',\r\n          borderWidth: 1,\r\n          padding: 12,\r\n          cornerRadius: 8,\r\n          titleFont: { size: 12, weight: 500 },\r\n          bodyFont: { size: 12 },\r\n          callbacks: {\r\n            label: function(ctx) {\r\n              return ctx.dataset.label + ' : ' + formatCurrency(ctx.parsed.y);\r\n            }\r\n          }\r\n        }\r\n      },\r\n      scales: {\r\n        x: {\r\n          ticks: { color: 'rgba(255,255,255,0.55)', font: { size: 11 } },\r\n          grid: { color: 'rgba(255,255,255,0.04)', drawBorder: false }\r\n        },\r\n        y: {\r\n          ticks: {\r\n            color: 'rgba(255,255,255,0.55)',\r\n            font: { size: 11 },\r\n            callback: function(value) { return formatCurrencyShort(value); }\r\n          },\r\n          grid: { color: 'rgba(255,255,255,0.04)', drawBorder: false }\r\n        }\r\n      }\r\n    }\r\n  });\r\n\r\n  const ctx2 = document.getElementById('gainsChart').getContext('2d');\r\n  gainsChart = new Chart(ctx2, {\r\n    type: 'doughnut',\r\n    data: {\r\n      labels: ['Productivit\u00e9', 'R\u00e9duction erreurs', 'IA agentique', '\u00c9conomies sur l\\'existant'],\r\n      datasets: [{\r\n        data: [0, 0, 0, 0],\r\n        backgroundColor: ['#3ECF8E', '#5FE3D0', '#34D399', '#7B9FFF'],\r\n        borderColor: '#010165',\r\n        borderWidth: 3,\r\n        hoverOffset: 8,\r\n      }]\r\n    },\r\n    options: {\r\n      responsive: true,\r\n      maintainAspectRatio: false,\r\n      cutout: '65%',\r\n      plugins: {\r\n        legend: {\r\n          position: 'right',\r\n          labels: {\r\n            color: 'rgba(255,255,255,0.75)',\r\n            font: { size: 11, weight: 400 },\r\n            padding: 12,\r\n            boxWidth: 8,\r\n            boxHeight: 8,\r\n            usePointStyle: true,\r\n            pointStyle: 'circle'\r\n          }\r\n        },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(13, 2, 30, 0.95)',\r\n          titleColor: '#fff',\r\n          bodyColor: 'rgba(255,255,255,0.85)',\r\n          borderColor: 'rgba(255,255,255,0.1)',\r\n          borderWidth: 1,\r\n          padding: 12,\r\n          cornerRadius: 8,\r\n          callbacks: {\r\n            label: function(ctx) {\r\n              return ctx.label + ' : ' + formatCurrency(ctx.parsed);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n\/\/ === Calculations ===\r\nfunction calculate() {\r\n  \/\/ Parser tol\u00e9rant : retire espaces (s\u00e9parateurs de milliers FR) et remplace virgule par point\r\n  const parseNumericInput = (val) => {\r\n    if (val === null || val === undefined || val === '') return 0;\r\n    const cleaned = String(val).replace(\/\\s\/g, '').replace(',', '.');\r\n    const n = parseFloat(cleaned);\r\n    return isNaN(n) ? 0 : n;\r\n  };\r\n\r\n  const users = parseNumericInput(document.getElementById('users').value);\r\n  const licenseCost = parseNumericInput(document.getElementById('licenseCost').value);\r\n  const implementationCost = parseNumericInput(document.getElementById('implementationCost').value);\r\n  const trainingCost = parseNumericInput(document.getElementById('trainingCost').value);\r\n  const maintenancePct = parseNumericInput(document.getElementById('maintenancePct').value);\r\n  \/\/ Co\u00fbt annuel des syst\u00e8mes actuels remplac\u00e9s (vieil ERP, licences \u00e9parpill\u00e9es, serveurs\u2026)\r\n  \/\/ Champ optionnel - vide = comportement classique (compare \u00e0 \"ne rien faire\")\r\n  const existingSystemsCost = parseNumericInput(document.getElementById('existingSystemsCost').value);\r\n\r\n  const manualHours = parseNumericInput(document.getElementById('manualHours').value);\r\n  const hourlyRate = parseNumericInput(document.getElementById('hourlyRate').value);\r\n  \/\/ dataReliability est un pourcentage 10-90 ; 100% = donn\u00e9es parfaites, 0% = chaos total\r\n  const dataReliability = parseNumericInput(document.getElementById('dataReliability').value) || 40;\r\n\r\n  \/\/ === Constantes m\u00e9thodologiques (dynamiques selon sc\u00e9nario) ===\r\n  \/\/ === Horizon dynamique (lu depuis le s\u00e9lecteur pill) ===\r\n  const horizonEl = document.querySelector('.horizon-option.active');\r\n  const horizon = horizonEl ? parseInt(horizonEl.dataset.years) : 5;\r\n  const wacc = 0.08;          \/\/ 8% Cost of capital (hypoth\u00e8se interne, KPMG mid-market)\r\n  const hiddenCostsMargin = 0.15;\r\n\r\n  \/\/ Sc\u00e9nario actif (Conservateur \/ R\u00e9aliste \/ Optimiste)\r\n  const scenarioEl = document.querySelector('.scenario-option.active');\r\n  const scenarioKey = scenarioEl ? scenarioEl.dataset.scenario : 'realistic';\r\n  const SCENARIOS = {\r\n    \/\/ automation = % du temps manuel qui peut \u00eatre automatis\u00e9\r\n    \/\/ monetization = % des heures \u00e9conomis\u00e9es qui se transforment r\u00e9ellement en valeur business\r\n    \/\/ errorReduction = % du co\u00fbt des erreurs supprim\u00e9 par l'ERP int\u00e9gr\u00e9\r\n    \/\/ rampUpY1 = % des gains captur\u00e9s la 1re ann\u00e9e (mont\u00e9e en charge)\r\n    conservative: { automation: 0.40, monetization: 0.60, errorReduction: 0.50, rampUpY1: 0.35 },\r\n    realistic:    { automation: 0.60, monetization: 0.75, errorReduction: 0.70, rampUpY1: 0.50 },\r\n    optimistic:   { automation: 0.70, monetization: 0.90, errorReduction: 0.80, rampUpY1: 0.65 }\r\n  };\r\n  const scenario = SCENARIOS[scenarioKey];\r\n  const automationRate = scenario.automation;\r\n  const monetizationRate = scenario.monetization;\r\n  const errorReductionRate = scenario.errorReduction;\r\n  const rampUpY1 = scenario.rampUpY1;\r\n\r\n  const adjustedImpl = implementationCost * (1 + hiddenCostsMargin);\r\n\r\n  \/\/ === COSTS (over horizon years) ===\r\n  const annualLicense = users * licenseCost * 12;\r\n  const costLicense = annualLicense * horizon;\r\n  const costImpl = adjustedImpl;\r\n  \/\/ Si maintenance d\u00e9j\u00e0 incluse dans l'abonnement SaaS \u2192 on n'ajoute rien\r\n  const maintIncludedEl = document.getElementById('maintIncluded');\r\n  const maintIncluded = maintIncludedEl ? maintIncludedEl.checked : true;\r\n  const effectiveMaintPct = maintIncluded ? 0 : maintenancePct;\r\n  const costMaint = annualLicense * (effectiveMaintPct \/ 100) * horizon;\r\n  const costTraining = trainingCost;\r\n\r\n  \/\/ H\u00e9bergement - montant annuel fixe, sauf si inclus dans le SaaS\r\n  const hostingCostAnnual = parseNumericInput(document.getElementById('hostingCost').value);\r\n  const hostingIncludedEl = document.getElementById('hostingIncluded');\r\n  const hostingIncluded = hostingIncludedEl ? hostingIncludedEl.checked : true;\r\n  \/\/ [FIX] Case \"H\u00e9bergement d\u00e9j\u00e0 inclus\" coch\u00e9e => co\u00fbt forc\u00e9 \u00e0 0, quoi qu'il y ait dans le champ\r\n  const effectiveHostingAnnual = hostingIncluded ? 0 : (hostingCostAnnual > 0 ? hostingCostAnnual : 0);\r\n  const costHosting = effectiveHostingAnnual * horizon;\r\n\r\n  const totalCost = costLicense + costImpl + costMaint + costTraining + costHosting;\r\n\r\n  \/\/ === GAINS (annual basis) ===\r\n  \/\/ manualHours est d\u00e9sormais un POURCENTAGE (5 \u00e0 60) du temps travaill\u00e9 annuel\r\n  \/\/ Base : 1 600 h travaill\u00e9es par utilisateur et par an (35 h\/semaine \u00d7 ~46 sem effectives)\r\n  const BASE_ANNUAL_HOURS = 1600;\r\n  const manualHoursPct = manualHours \/ 100;\r\n  const annualHoursPerUser = BASE_ANNUAL_HOURS * manualHoursPct;\r\n  const totalAnnualHours = annualHoursPerUser * users;\r\n  const annualHoursSaved = totalAnnualHours * automationRate;\r\n  \/\/ Le gain de productivit\u00e9 ne capture que la part des heures effectivement mon\u00e9tis\u00e9es\r\n  \/\/ (les heures gagn\u00e9es ne se transforment pas toutes en valeur business - effet Parkinson, r\u00e9allocation, etc.)\r\n  const gainProdAnnual = annualHoursSaved * hourlyRate * monetizationRate;\r\n\r\n  \/\/ === 4e pilier - gains li\u00e9s aux agents IA ===\r\n  \/\/ Les agents IA absorbent une part ADDITIONNELLE du temps manuel encore non automatis\u00e9.\r\n  \/\/ Calcul\u00e9 sur les heures restantes apr\u00e8s automatisation classique \u2192 pas de double comptage.\r\n  const remainingManualHours = totalAnnualHours * (1 - automationRate);\r\n  const aiHoursSaved = remainingManualHours * AXELOR_AI_UPLIFT;\r\n  const gainAiAnnual = aiHoursSaved * hourlyRate * monetizationRate;\r\n\r\n  \/\/ === Co\u00fbt annuel des erreurs : benchmark Panorama Consulting \/ IBM Data Quality 2024 ===\r\n  \/\/ Une entreprise avec donn\u00e9es fragment\u00e9es perd ~1 200 \u20ac\/utilisateur\/an en erreurs m\u00e9tier\r\n  \/\/ (correction, retards, retours, ressaisies, \u00e9carts compta\/op\u00e9ration)\r\n  \/\/ Ce co\u00fbt varie lin\u00e9airement avec le niveau de fiabilit\u00e9 actuel\r\n  \/\/ P0 - Conversion approximative selon devise active pour coh\u00e9rence multi-pays\r\n  \/\/ Taux indicatifs au 04\/06\/2026 - rafra\u00eechir ~2\u00d7\/an (sources : Bloomberg, BCE)\r\n  const FX_FROM_EUR = {\r\n    EUR: 1, USD: 1.08, GBP: 0.85, CHF: 0.95, MAD: 10.8, CAD: 1.46,\r\n    AED: 3.96, AUD: 1.62, BRL: 6.1, CNY: 7.80, DZD: 145, EGP: 53,\r\n    HKD: 8.40, INR: 90, JPY: 165, KRW: 1450, MXN: 19, NOK: 11.50,\r\n    NZD: 1.78, PLN: 4.30, RUB: 100, SAR: 4.05, SEK: 11.40, SGD: 1.45,\r\n    TND: 3.40, TRY: 53, XOF: 656, ZAR: 19.50\r\n  };\r\n  const ERROR_COST_PER_USER_EUR = 1200;\r\n  const fxRate = FX_FROM_EUR[currentCurrency] || 1;\r\n  const MAX_ERROR_COST_PER_USER = ERROR_COST_PER_USER_EUR * fxRate;\r\n  const frictionIndex = (100 - dataReliability) \/ 100;\r\n  const annualErrorCost = users * MAX_ERROR_COST_PER_USER * frictionIndex;\r\n  const gainErrorsAnnual = annualErrorCost * errorReductionRate;\r\n  \/\/ Affichage temps r\u00e9el du co\u00fbt d'erreurs estim\u00e9 sous le slider\r\n  const errorCostDisplay = document.getElementById('errorCostEstimate');\r\n  if (errorCostDisplay) errorCostDisplay.textContent = formatCurrency(annualErrorCost) + ' \/ an';\r\n\r\n  \/\/ === Pilier 3 - \u00c9conomies sur les syst\u00e8mes actuels (co\u00fbt de l'inaction) ===\r\n  \/\/ Contrairement aux gains op\u00e9rationnels, ces \u00e9conomies sont r\u00e9alis\u00e9es D\u00c8S l'ann\u00e9e 1\r\n  \/\/ (le prospect arr\u00eate de payer son ancien ERP\/licences) \u2192 pas de ramp-up applicable.\r\n  \/\/ Mais on les actualise au WACC comme le reste pour rester coh\u00e9rent NPV.\r\n  const gainExistingAnnual = existingSystemsCost;\r\n\r\n  \/\/ Gains \u00e9conomiques avanc\u00e9s (stocks \/ DSO) - d\u00e9sactiv\u00e9s dans cette version, pr\u00eats pour v18\r\n  const gainStockAnnual = 0;\r\n  const gainCashAnnual = 0;\r\n\r\n  \/\/ Gains op\u00e9rationnels (productivit\u00e9 + erreurs + IA agentique) - soumis au ramp-up Y1\r\n  const totalGainAnnualFull = gainProdAnnual + gainErrorsAnnual + gainStockAnnual + gainCashAnnual + gainAiAnnual;\r\n\r\n  \/\/ === NPV with WACC discounting ===\r\n  let totalGainNominal = 0;\r\n  let totalGainDiscounted = 0;\r\n  const yearlyGains = [];\r\n  const yearlyDiscountedGains = [];\r\n\r\n  for (let y = 1; y <= horizon; y++) {\r\n    \/\/ Gains op\u00e9rationnels (avec ramp-up Y1) + \u00e9conomies sur l'existant (sans ramp)\r\n    const opGain = (y === 1 ? rampUpY1 : 1) * totalGainAnnualFull;\r\n    const existingGain = gainExistingAnnual; \/\/ \u00e9conomies d\u00e8s Y1, pas de mont\u00e9e en charge\r\n    const yearGain = opGain + existingGain;\r\n    yearlyGains.push(yearGain);\r\n    totalGainNominal += yearGain;\r\n    const discountedGain = yearGain \/ Math.pow(1 + wacc, y);\r\n    yearlyDiscountedGains.push(discountedGain);\r\n    totalGainDiscounted += discountedGain;\r\n  }\r\n\r\n  const totalGain3Y = totalGainDiscounted;\r\n\r\n  \/\/ Facteur d'actualisation total : somme des (ramp(y) \/ (1+wacc)^y)\r\n  \/\/ Permet de d\u00e9composer totalGain3Y par poste en gardant la coh\u00e9rence\r\n  \/\/ Facteur d'actualisation pour gains OP\u00c9RATIONNELS (avec ramp-up Y1)\r\n  let discountFactor = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    const ramp = (y === 1 ? rampUpY1 : 1);\r\n    discountFactor += ramp \/ Math.pow(1 + wacc, y);\r\n  }\r\n\r\n  \/\/ Facteur d'actualisation pour les \u00e9conomies sur l'existant (sans ramp, d\u00e8s Y1)\r\n  let discountFactorExisting = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    discountFactorExisting += 1 \/ Math.pow(1 + wacc, y);\r\n  }\r\n\r\n  \/\/ D\u00e9composition par poste - VALEURS ACTUALIS\u00c9ES (somme = totalGain3Y exact)\r\n  const gainProd3Y = gainProdAnnual * discountFactor;\r\n  const gainErrors3Y = gainErrorsAnnual * discountFactor;\r\n  const gainAi3Y = gainAiAnnual * discountFactor;\r\n  const gainStock3Y = gainStockAnnual * discountFactor;\r\n  const gainCash3Y = gainCashAnnual * discountFactor;\r\n  const gainExisting3Y = gainExistingAnnual * discountFactorExisting;\r\n\r\n  const netGain = totalGain3Y - totalCost;\r\n  const roi = totalCost > 0 ? (netGain \/ totalCost) * 100 : 0;\r\n\r\n  \/\/ === ROI DE BASE (ERP classique, SANS le 4e pilier IA) - pour le comparateur ===\r\n  \/\/ On retire la contribution actualis\u00e9e du gain IA des gains totaux.\r\n  const totalGainBase3Y = totalGain3Y - gainAi3Y;\r\n  const netGainBase = totalGainBase3Y - totalCost;\r\n  const roiBase = totalCost > 0 ? (netGainBase \/ totalCost) * 100 : 0;\r\n  \/\/ L'\u00e9cart en points de ROI = l'apport sp\u00e9cifique d'Axelor IA\r\n  const roiDelta = roi - roiBase;\r\n\r\n  \/\/ === S\u00e9ries annuelles cumul\u00e9es - M\u00caMES flux que le graphique ===\r\n  \/\/ Ann\u00e9e 0 porte l'investissement initial (impl\u00e9mentation + formation) :\r\n  \/\/ la courbe Co\u00fbts d\u00e9marre AU-DESSUS de 0, ce qui est financi\u00e8rement exact.\r\n  \/\/ Ces tableaux serviront aussi \u00e0 alimenter le chart cumulatif \u2192 coh\u00e9rence garantie par construction.\r\n  const costData = [costImpl + costTraining];\r\n  const gainData = [0];\r\n  for (let y = 1; y <= horizon; y++) {\r\n    costData.push(costData[y - 1] + annualLicense + (annualLicense * (effectiveMaintPct \/ 100)) + effectiveHostingAnnual);\r\n    gainData.push(gainData[y - 1] + yearlyDiscountedGains[y - 1]);\r\n  }\r\n\r\n  \/\/ === Point d'\u00e9quilibre ACTUALIS\u00c9 - interpolation lin\u00e9aire entre les points du graphe ===\r\n  \/\/ Coh\u00e9rent par construction : le badge tombe exactement au croisement (tol\u00e9rance \u00b10,5 mois)\r\n  let paybackMonths = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    if (gainData[y] - costData[y] >= 0) {\r\n      const gapPrev = gainData[y - 1] - costData[y - 1];   \/\/ \u2264 0 par construction\r\n      const gapCurr = gainData[y] - costData[y];           \/\/ \u2265 0\r\n      const frac = (gapCurr - gapPrev) > 0 ? (-gapPrev) \/ (gapCurr - gapPrev) : 0;\r\n      paybackMonths = Math.max(1, Math.round(((y - 1) + frac) * 12));\r\n      break;\r\n    }\r\n  }\r\n  \/\/ paybackMonths = 0 \u21d4 les courbes ne se croisent pas sur l'horizon \u21d2 aucun badge dessin\u00e9.\r\n\r\n  \/\/ === Display KPIs ===\r\n  const hasMinimalData = users > 0 && (licenseCost > 0 || implementationCost > 0);\r\n  const roiEl = document.getElementById('roiPct');\r\n  const paybackEl = document.getElementById('paybackMonths');\r\n  const netGainEl = document.getElementById('netGain');\r\n  \/\/ Aper\u00e7u live (colonne droite \u00c9tape 2)\r\n  const previewRoiEl = document.getElementById('previewRoi');\r\n  const previewPaybackEl = document.getElementById('previewPayback');\r\n\r\n  if (!hasMinimalData) {\r\n    roiEl.textContent = '- %';\r\n    paybackEl.textContent = '- mois';\r\n    netGainEl.textContent = '- ' + getCurrency().symbol;\r\n    document.getElementById('hoursReclaimed').textContent = '- h';\r\n    roiEl.classList.remove('negative');\r\n    netGainEl.classList.remove('negative');\r\n    if (previewRoiEl) { previewRoiEl.textContent = '- %'; previewRoiEl.classList.remove('negative'); }\r\n    if (previewPaybackEl) previewPaybackEl.textContent = '- mois';\r\n    \/\/ Reset mini-barre\r\n    const bc = document.getElementById('previewBarCostVal'), bg = document.getElementById('previewBarGainVal');\r\n    if (bc) bc.textContent = '-';\r\n    if (bg) bg.textContent = '-';\r\n    const bcb = document.getElementById('previewBarCost'), bgb = document.getElementById('previewBarGain');\r\n    if (bcb) bcb.style.width = '30%';\r\n    if (bgb) bgb.style.width = '70%';\r\n    \/\/ Comparateur en attente\r\n    const rb = document.getElementById('roiBase'), ra = document.getElementById('roiAxelor'), rd = document.getElementById('roiDeltaBadge');\r\n    if (rb) { rb.textContent = '- %'; rb.classList.remove('negative'); }\r\n    if (ra) { ra.textContent = '- %'; ra.classList.remove('negative'); }\r\n    if (rd) rd.textContent = '+- pts';\r\n  } else {\r\n    \/\/ P1 - Plafond d'affichage : au-del\u00e0 de 400 %, on affiche \"> 400 %\".\r\n    \/\/ Un ROI \u00e0 3 ou 4 chiffres para\u00eet \"trop beau\" \u00e0 un DAF et d\u00e9cr\u00e9dibilise l'outil.\r\n    \/\/ Le calcul sous-jacent (et le comparateur, le graphe, le PDF) reste inchang\u00e9 -\r\n    \/\/ c'est un plafond purement cosm\u00e9tique, sym\u00e9trique du plancher \"< 6 mois\".\r\n    \/\/ [FIX] Plafond d'affichage supprim\u00e9 : le ROI refl\u00e8te toujours les entr\u00e9es et ne\r\n    \/\/ reste plus fig\u00e9 sur \"> 400 %\" quand on bouge le % de t\u00e2ches manuelles.\r\n    \/\/ La cr\u00e9dibilit\u00e9 reste port\u00e9e par le garde-fou \"Hypoth\u00e8ses \u00e0 valider\".\r\n    const formatRoiDisplay = (value) => Math.round(value) + ' %';\r\n    \/\/ P0 - ROI affich\u00e9 (y compris n\u00e9gatif) avec classe pour couleur\r\n    const roiText = formatRoiDisplay(roi);\r\n    \/\/ P1 - Plancher d'affichage : un payback < 6 mois sur un projet ERP n'est pas cr\u00e9dible\r\n    \/\/ en communication, on affiche \"< 6 mois\" (le calcul sous-jacent reste inchang\u00e9)\r\n    const paybackText = (paybackMonths > 0 && paybackMonths <= horizon * 12)\r\n      ? (paybackMonths < 6 ? '< 6 mois' : Math.round(paybackMonths) + ' mois')\r\n      : 'Non atteint';\r\n    roiEl.textContent = roiText;\r\n    roiEl.classList.toggle('negative', roi < 0);\r\n    paybackEl.textContent = paybackText;\r\n    netGainEl.textContent = formatCurrency(netGain);\r\n    netGainEl.classList.toggle('negative', netGain < 0);\r\n      \/\/ [FIX] Les heures affichees incluent desormais les heures absorbees par les agents IA.\r\n    \/\/ Avant, les euros du pilier IA etaient comptes dans les gains mais pas les heures\r\n    \/\/ correspondantes : le KPI \"heures gagnees\" sous-estimait le resultat.\r\n    document.getElementById('hoursReclaimed').textContent = Math.round(annualHoursSaved + aiHoursSaved).toLocaleString('fr-FR') + ' h';\r\n    \/\/ Miroir dans l'aper\u00e7u live\r\n    if (previewRoiEl) {\r\n      previewRoiEl.textContent = roiText;\r\n      previewRoiEl.classList.toggle('negative', roi < 0);\r\n    }\r\n    if (previewPaybackEl) previewPaybackEl.textContent = paybackText;\r\n\r\n    \/\/ Mini-barre de r\u00e9partition co\u00fbts \/ gains (proportionnelle)\r\n    const barCost = document.getElementById('previewBarCost');\r\n    const barGain = document.getElementById('previewBarGain');\r\n    if (barCost && barGain) {\r\n      const totalAbs = totalCost + Math.max(totalGain3Y, 0);\r\n      if (totalAbs > 0) {\r\n        const costPct = (totalCost \/ totalAbs) * 100;\r\n        barCost.style.width = costPct.toFixed(1) + '%';\r\n        barGain.style.width = (100 - costPct).toFixed(1) + '%';\r\n      }\r\n      const cv = document.getElementById('previewBarCostVal');\r\n      const gv = document.getElementById('previewBarGainVal');\r\n      if (cv) cv.textContent = formatCurrency(totalCost);\r\n      if (gv) gv.textContent = formatCurrency(totalGain3Y);\r\n    }\r\n\r\n    \/\/ === Comparateur ERP classique vs Axelor IA ===\r\n    const roiBaseEl = document.getElementById('roiBase');\r\n    const roiAxelorEl = document.getElementById('roiAxelor');\r\n    const roiDeltaEl = document.getElementById('roiDeltaBadge');\r\n    if (roiBaseEl) {\r\n      roiBaseEl.textContent = formatRoiDisplay(roiBase);\r\n      roiBaseEl.classList.toggle('negative', roiBase < 0);\r\n    }\r\n    if (roiAxelorEl) {\r\n      roiAxelorEl.textContent = formatRoiDisplay(roi);\r\n      roiAxelorEl.classList.toggle('negative', roi < 0);\r\n    }\r\n    if (roiDeltaEl) {\r\n      roiDeltaEl.textContent = '+' + Math.round(roiDelta) + ' pts';\r\n    }\r\n  }\r\n\r\n  \/\/ === Badge ROI selon performance ===\r\n  \/\/ P1 - D\u00e9tection d'hypoth\u00e8ses agressives : sur le ROI final OU directement sur les\r\n  \/\/ inputs au-dessus des standards observ\u00e9s :\r\n  \/\/ >150 utilisateurs, >45 % de temps manuel, ou >90 \u20ac\/h de co\u00fbt horaire.\r\n  \/\/ [FIX] Seuils recalibres.\r\n  \/\/ - le nombre d'utilisateurs n'est PAS une hypothese agressive : un Grand Compte a\r\n  \/\/   legitimement 500 utilisateurs. L'ancien seuil \"users > 150\" declenchait l'alerte\r\n  \/\/   sur un profil parfaitement normal. Retire.\r\n  \/\/ - \"manualHours > 45\" etait devenu inatteignable (curseur plafonne a 40). Ramene a 32.\r\n  \/\/ - le seuil de ROI passe a 450 % : c'est la borne haute annoncee dans la FAQ de la page.\r\n  \/\/   Au-dela, le resultat sort de la fourchette que le site revendique lui-meme.\r\n  const extremeInputs = hasMinimalData && (manualHours > 32 || hourlyRate > 90);\r\n  const aggressiveAssumptions = (roi >= 450) || extremeInputs;\r\n  const roiBadge = document.getElementById('roiBadge');\r\n  if (roiBadge) {\r\n    if (aggressiveAssumptions) {\r\n      \/\/ P1 - Garde-fou : hypoth\u00e8ses \u00e0 valider (ROI extr\u00eame ou inputs agressifs)\r\n      roiBadge.textContent = '\u26a0 Hypoth\u00e8ses \u00e0 valider';\r\n      roiBadge.classList.add('show', 'warning');\r\n    } else if (roi >= 300) {\r\n      roiBadge.textContent = '\u2605 Exceptionnel';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else if (roi >= 150) {\r\n      roiBadge.textContent = '\u2605 Excellent';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else if (roi >= 50) {\r\n      roiBadge.textContent = '\u2713 Solide';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else {\r\n      roiBadge.classList.remove('show', 'warning');\r\n    }\r\n  }\r\n\r\n  \/\/ P1 - Warning explicatif sous les KPIs si hypoth\u00e8ses agressives (ROI \u2265 700 % ou inputs extr\u00eames)\r\n  const roiWarning = document.getElementById('roiWarning');\r\n  if (roiWarning) {\r\n    roiWarning.classList.toggle('show', hasMinimalData && aggressiveAssumptions);\r\n\r\n    \/\/ [FIX] Message compose selon les causes REELLES du declenchement.\r\n    \/\/ Avant, le texte etait fixe : il citait la \"taille d'equipe\" (critere supprime) et\r\n    \/\/ conseillait de passer en scenario Conservateur meme quand on y etait deja.\r\n    const warnText = document.getElementById('roiWarningText');\r\n    if (warnText && hasMinimalData && aggressiveAssumptions) {\r\n      const causes = [];\r\n      if (manualHours > 32) {\r\n        causes.push('une part de temps en t\u00e2ches manuelles de <em>' + manualHours + ' %<\/em>, au-dessus des 15 \u00e0 30 % couramment observ\u00e9s');\r\n      }\r\n      if (hourlyRate > 90) {\r\n        causes.push('un co\u00fbt horaire charg\u00e9 de <em>' + formatCurrency(hourlyRate) + '<\/em>, au-dessus des rep\u00e8res habituels');\r\n      }\r\n      if (roi >= 450) {\r\n        causes.push('un ROI de <em>' + Math.round(roi) + ' %<\/em>, au-dessus de la fourchette de 150 \u00e0 450 % que nous communiquons');\r\n      }\r\n\r\n      let html = '<strong>Hypoth\u00e8ses \u00e0 valider.<\/strong> ';\r\n      if (causes.length === 1) {\r\n        html += 'Votre estimation repose sur ' + causes[0] + '. ';\r\n      } else if (causes.length > 1) {\r\n        html += 'Votre estimation repose sur ' + causes.slice(0, -1).join(', ') + ' et ' + causes[causes.length - 1] + '. ';\r\n      }\r\n      html += 'Le calcul reste honn\u00eate, mais v\u00e9rifiez ces valeurs avant de pr\u00e9senter le r\u00e9sultat \u00e0 un comit\u00e9. ';\r\n\r\n      if (scenarioKey === 'conservative') {\r\n        html += 'Vous \u00eates d\u00e9j\u00e0 en sc\u00e9nario <em>Conservateur<\/em> : ces valeurs viennent donc de vos propres saisies, pas des hypoth\u00e8ses du mod\u00e8le.';\r\n      } else if (scenarioKey === 'optimistic') {\r\n        html += 'Vous \u00eates en sc\u00e9nario <em>Optimiste<\/em> : passez en <em>R\u00e9aliste<\/em> ou en <em>Conservateur<\/em> pour une lecture plus prudente.';\r\n      } else {\r\n        html += 'Au besoin, passez en sc\u00e9nario <em>Conservateur<\/em> pour une lecture plus prudente.';\r\n      }\r\n      warnText.innerHTML = html;\r\n    }\r\n  }\r\n\r\n  \/\/ === Display breakdown ===\r\n  document.getElementById('costLicense').textContent = formatCurrency(costLicense);\r\n  document.getElementById('costImpl').textContent = formatCurrency(costImpl);\r\n  \/\/ Maintenance : afficher \"Incluse\" si comprise dans l'abonnement SaaS, sinon le montant\r\n  document.getElementById('costMaint').textContent = (maintIncluded || costMaint === 0) ? 'Incluse' : formatCurrency(costMaint);\r\n  document.getElementById('costTraining').textContent = formatCurrency(costTraining);\r\n  \/\/ Ligne H\u00e9bergement affich\u00e9e seulement si un co\u00fbt d'h\u00e9bergement est r\u00e9ellement compt\u00e9\r\n  const costHostingRow = document.getElementById('costHostingRow');\r\n  if (costHostingRow) {\r\n    if (costHosting > 0) {\r\n      costHostingRow.style.display = '';\r\n      document.getElementById('costHosting').textContent = formatCurrency(costHosting);\r\n    } else {\r\n      costHostingRow.style.display = 'none';\r\n      \/\/ [FIX] Purger la valeur : une ligne masquee conservait son ancien montant dans le\r\n      \/\/ DOM. submitForm lit ces libelles pour remplir le formulaire, donc le lead partait\r\n      \/\/ avec un cout d'hebergement qui n'etait pas compte dans le TCO.\r\n      document.getElementById('costHosting').textContent = 'Inclus';\r\n    }\r\n  }\r\n  document.getElementById('totalCost').textContent = formatCurrency(totalCost);\r\n\r\n  document.getElementById('gainProd').textContent = formatCurrency(gainProd3Y);\r\n  document.getElementById('gainErrors').textContent = formatCurrency(gainErrors3Y);\r\n  \/\/ Ligne \"IA agentique\" du d\u00e9tail - le pilier est permanent (AXELOR_AI_UPLIFT),\r\n  \/\/ la ligne s'affiche d\u00e8s que le gain est calculable (> 0)\r\n  const gainAiRow = document.getElementById('gainAiRow');\r\n  if (gainAiRow) {\r\n    if (gainAiAnnual > 0) {\r\n      gainAiRow.style.display = '';\r\n      document.getElementById('gainAi').textContent = formatCurrency(gainAi3Y);\r\n    } else {\r\n      gainAiRow.style.display = 'none';\r\n      document.getElementById('gainAi').textContent = formatCurrency(0);\r\n    }\r\n  }\r\n  \/\/ Ligne \"\u00c9conomies sur l'existant\" affich\u00e9e seulement si renseign\u00e9e\r\n  const gainExistingRow = document.getElementById('gainExistingRow');\r\n  if (gainExistingRow) {\r\n    if (gainExistingAnnual > 0) {\r\n      gainExistingRow.style.display = '';\r\n      document.getElementById('gainExisting').textContent = formatCurrency(gainExisting3Y);\r\n    } else {\r\n      gainExistingRow.style.display = 'none';\r\n      document.getElementById('gainExisting').textContent = formatCurrency(0);\r\n    }\r\n  }\r\n  document.getElementById('totalGain').textContent = formatCurrency(totalGain3Y);\r\n\r\n  \/\/ === Update charts ===\r\n  if (cumulativeChart && gainsChart) {\r\n    \/\/ Les s\u00e9ries costData[] et gainData[] ont \u00e9t\u00e9 calcul\u00e9es plus haut (bloc payback) - on les r\u00e9utilise tel quel.\r\n    \/\/ Coh\u00e9rence garantie par construction : le badge tombera exactement sur le croisement visible des courbes.\r\n    cumulativeChart.data.labels = ['Ann\u00e9e 0'];\r\n    for (let y = 1; y <= horizon; y++) cumulativeChart.data.labels.push('Ann\u00e9e ' + y);\r\n    cumulativeChart.data.datasets[0].data = costData;\r\n    cumulativeChart.data.datasets[1].data = gainData;\r\n    \/\/ Garde : le badge n'est dessin\u00e9 QUE si un croisement existe sur l'horizon\r\n    cumulativeChart.options.plugins.breakevenMonth = paybackMonths > 0 ? paybackMonths : 0;\r\n    cumulativeChart.update();\r\n\r\n    \/\/ Donut : on ne garde que les segments non nuls (IA et existant peuvent \u00eatre \u00e0 z\u00e9ro)\r\n    const donutSource = [\r\n      { label: 'Productivit\u00e9', value: Math.round(gainProdAnnual), color: '#3ECF8E' },\r\n      { label: 'R\u00e9duction erreurs', value: Math.round(gainErrorsAnnual), color: '#5FE3D0' },\r\n      { label: 'IA agentique', value: Math.round(gainAiAnnual), color: '#34D399' },\r\n      { label: '\u00c9conomies sur l\\'existant', value: Math.round(gainExistingAnnual), color: '#7B9FFF' }\r\n    ].filter(seg => seg.value > 0);\r\n    gainsChart.data.labels = donutSource.map(s => s.label);\r\n    gainsChart.data.datasets[0].data = donutSource.map(s => s.value);\r\n    gainsChart.data.datasets[0].backgroundColor = donutSource.map(s => s.color);\r\n    gainsChart.update();\r\n  }\r\n}\r\n\r\nfunction formatCurrency(value) {\r\n  const cur = getCurrency();\r\n  if (!value && value !== 0) return '- ' + cur.symbol;\r\n  const isNegative = value < 0;\r\n  const absValue = Math.abs(value);\r\n  const maxDecimals = 0; \/\/ montants toujours affiches sans decimale\r\n  try {\r\n    const formatted = new Intl.NumberFormat(cur.locale, {\r\n      style: 'currency',\r\n      currency: cur.code,\r\n      maximumFractionDigits: maxDecimals,\r\n      minimumFractionDigits: 0\r\n    }).format(absValue);\r\n    return (isNegative ? '- ' : '') + formatted;\r\n  } catch (e) {\r\n    \/\/ Fallback si la locale n'est pas support\u00e9e\r\n    const num = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 0 }).format(absValue);\r\n    const sign = isNegative ? '- ' : '';\r\n    return cur.position === 'before' ? sign + cur.symbol + ' ' + num : sign + num + ' ' + cur.symbol;\r\n  }\r\n}\r\n\r\nfunction formatCurrencyShort(value) {\r\n  const cur = getCurrency();\r\n  const sym = cur.symbol;\r\n  const sep = cur.position === 'before' ? sym + ' ' : ' ' + sym;\r\n  const sign = value < 0 ? '-' : '';\r\n  const abs = Math.abs(value);\r\n  if (abs >= 1000000) {\r\n    const v = (abs \/ 1000000).toFixed(1).replace('.0', '');\r\n    return cur.position === 'before' ? sign + sym + v + 'M' : sign + v + 'M' + sep.trim();\r\n  }\r\n  if (abs >= 1000) {\r\n    const v = (abs \/ 1000).toFixed(0);\r\n    return cur.position === 'before' ? sign + sym + v + 'k' : sign + v + 'k' + sep.trim();\r\n  }\r\n  return cur.position === 'before' ? sign + sym + abs : sign + abs + sep.trim();\r\n}\r\n\r\n\/\/ === BRANCHEMENT LEAD - via le formulaire Contact Form 7 rendu sur la page ===\r\n\/\/ (shortcode [contact-form-7 id=\"dcfe5b9\"] dans un module Texte Divi,\r\n\/\/  envelopp\u00e9 dans <div id=\"cf7RoiFormWrap\" style=\"display:none;\">)\r\n\r\n\/\/ Coefficient d'uplift IA (% du temps manuel r\u00e9siduel)\r\nconst AXELOR_AI_UPLIFT = 0.15;\r\n\r\nfunction domText(id) { const el = document.getElementById(id); return el ? el.textContent.trim() : ''; }\r\nfunction setCF7(id, value) { const el = document.getElementById(id); if (el) el.value = (value === undefined || value === null) ? '' : String(value); }\r\nfunction safeTrack(ev, data) {\r\n  try {\r\n    if (typeof track === 'function') { track(ev, data); return; }\r\n    window.dataLayer = window.dataLayer || [];\r\n    window.dataLayer.push(Object.assign({ event: ev }, data || {}));\r\n  } catch (e) {}\r\n}\r\n\r\nasync function submitForm(event) {\r\n  const firstName = document.getElementById('firstName').value.trim();\r\n  const lastName = document.getElementById('lastName').value.trim();\r\n  const email = document.getElementById('email').value.trim();\r\n  const company = document.getElementById('company').value.trim();\r\n  const consent = document.getElementById('privacyConsent');\r\n\r\n  if (!firstName || !lastName || !email || !company) { alert('Merci de remplir au moins votre pr\u00e9nom, nom, email et entreprise.'); return; }\r\n  if (!email.includes('@') || !email.includes('.')) { alert('Merci de saisir un email professionnel valide.'); return; }\r\n  if (consent && !consent.checked) { alert('Merci d\\'accepter le traitement de vos donn\u00e9es pour recevoir votre estimation.'); consent.focus(); return; }\r\n\r\n  const scenario = document.querySelector('.scenario-option.active')?.dataset.scenario || 'realistic';\r\n  const horizon = document.querySelector('.horizon-option.active')?.dataset.years || '5';\r\n  const profileEl = document.querySelector('.profile-btn.active');\r\n\r\n  safeTrack('calc_lead_submit', { roi: domText('roiPct'), payback: domText('paybackMonths'), scenario, horizon });\r\n\r\n  setCF7('cf7_first_name', firstName);\r\n  setCF7('cf7_last_name', lastName);\r\n  setCF7('cf7_email', email);\r\n  setCF7('cf7_company', company);\r\n  setCF7('cf7_role', document.getElementById('role').value);\r\n  setCF7('cf7_phone', document.getElementById('phone').value);\r\n  setCF7('cf7_profile', profileEl ? profileEl.dataset.profile : '');\r\n\r\n  setCF7('cf7_users', document.getElementById('users').value);\r\n  setCF7('cf7_license_cost', document.getElementById('licenseCost').value);\r\n  setCF7('cf7_implementation_cost', document.getElementById('implementationCost').value);\r\n  setCF7('cf7_training_cost', document.getElementById('trainingCost').value);\r\n  setCF7('cf7_maintenance_pct', document.getElementById('maintenancePct').value);\r\n  setCF7('cf7_maint_included', document.getElementById('maintIncluded')?.checked ? 'Oui' : 'Non');\r\n  setCF7('cf7_hosting_cost', document.getElementById('hostingCost').value);\r\n  setCF7('cf7_hosting_included', document.getElementById('hostingIncluded')?.checked ? 'Oui' : 'Non');\r\n  setCF7('cf7_existing_systems_cost', document.getElementById('existingSystemsCost').value);\r\n\r\n  setCF7('cf7_manual_hours', document.getElementById('manualHours').value);\r\n  setCF7('cf7_hourly_rate', document.getElementById('hourlyRate').value);\r\n  setCF7('cf7_data_reliability', document.getElementById('dataReliability').value);\r\n  setCF7('cf7_error_cost_estimate', domText('errorCostEstimate'));\r\n  setCF7('cf7_ai_uplift', (AXELOR_AI_UPLIFT * 100) + '%');\r\n\r\n  setCF7('cf7_horizon', horizon);\r\n  setCF7('cf7_scenario', scenario);\r\n  setCF7('cf7_currency', currentCurrency);\r\n\r\n  setCF7('cf7_cost_license', domText('costLicense'));\r\n  setCF7('cf7_cost_impl', domText('costImpl'));\r\n  setCF7('cf7_cost_maint', domText('costMaint'));\r\n  setCF7('cf7_cost_hosting', domText('costHosting'));\r\n  setCF7('cf7_cost_training', domText('costTraining'));\r\n  setCF7('cf7_total_cost', domText('totalCost'));\r\n\r\n  setCF7('cf7_gain_prod', domText('gainProd'));\r\n  setCF7('cf7_gain_errors', domText('gainErrors'));\r\n  setCF7('cf7_gain_ai', domText('gainAi'));\r\n  setCF7('cf7_gain_existing', domText('gainExisting'));\r\n  setCF7('cf7_total_gain', domText('totalGain'));\r\n\r\n  setCF7('cf7_roi_pct', domText('roiPct'));\r\n  setCF7('cf7_payback_months', domText('paybackMonths'));\r\n  setCF7('cf7_net_gain', domText('netGain'));\r\n  setCF7('cf7_hours_reclaimed', domText('hoursReclaimed'));\r\n\r\n  const btn = event.target.closest('.btn-submit');\r\n  const originalHTML = btn.innerHTML;\r\n  btn.disabled = true;\r\n  btn.innerHTML = '<span>Envoi en cours\u2026<\/span>';\r\n\r\n  const cf7Form = document.querySelector('#cf7RoiFormWrap form.wpcf7-form') || document.querySelector('.wpcf7-form');\r\n\r\n  if (!cf7Form) {\r\n    console.error('[ROI calculator] Formulaire CF7 introuvable. V\u00e9rifier le shortcode [contact-form-7] (module Texte Divi) et le conteneur #cf7RoiFormWrap.');\r\n    alert('Une erreur technique emp\u00eache l\\'envoi. Merci de nous contacter directement.');\r\n    safeTrack('calc_lead_error', { error: 'cf7_form_not_found' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML;\r\n    return;\r\n  }\r\n\r\n  const onMailSent = (e) => { if (e.target !== cf7Form) return;\r\n    document.getElementById('successMessage').classList.add('show');\r\n    btn.innerHTML = '<span>\u2713 Demande envoy\u00e9e<\/span>';\r\n    safeTrack('calc_lead_success', {}); cleanup(); };\r\n  const onMailFailed = (e) => { if (e.target !== cf7Form) return;\r\n    alert('Une erreur est survenue lors de l\\'envoi. Merci de r\u00e9essayer ou nous contacter directement.');\r\n    safeTrack('calc_lead_error', { error: 'wpcf7mailfailed' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML; cleanup(); };\r\n  const onInvalid = (e) => { if (e.target !== cf7Form) return;\r\n    alert('Certaines informations semblent invalides. Merci de v\u00e9rifier votre email et vos coordonn\u00e9es.');\r\n    safeTrack('calc_lead_error', { error: 'wpcf7invalid' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML; cleanup(); };\r\n  function cleanup() {\r\n    document.removeEventListener('wpcf7mailsent', onMailSent);\r\n    document.removeEventListener('wpcf7mailfailed', onMailFailed);\r\n    document.removeEventListener('wpcf7invalid', onInvalid);\r\n    document.removeEventListener('wpcf7spam', onMailFailed);\r\n  }\r\n  document.addEventListener('wpcf7mailsent', onMailSent);\r\n  document.addEventListener('wpcf7mailfailed', onMailFailed);\r\n  document.addEventListener('wpcf7invalid', onInvalid);\r\n  document.addEventListener('wpcf7spam', onMailFailed);\r\n\r\n  \/\/ Filet de s\u00e9curit\u00e9 : si aucun \u00e9v\u00e9nement CF7 n'arrive en 8 s, on d\u00e9bloque le bouton\r\n  setTimeout(() => {\r\n    if (btn.innerHTML.includes('Envoi en cours')) {\r\n      document.getElementById('successMessage').classList.add('show');\r\n      btn.innerHTML = '<span>\u2713 Demande envoy\u00e9e<\/span>';\r\n      cleanup();\r\n    }\r\n  }, 8000);\r\n\r\n  if (cf7Form.requestSubmit) cf7Form.requestSubmit(); else cf7Form.submit();\r\n}\r\n\r\n\/\/ === Slider pourcentage : affichage dynamique ===\r\nfunction updateManualHoursDisplay() {\r\n  const slider = document.getElementById('manualHours');\r\n  if (!slider) return;\r\n  const value = parseInt(slider.value);\r\n  \/\/ Affiche le nombre\r\n  const display = document.getElementById('manualHoursDisplay');\r\n  if (display) display.textContent = value;\r\n  \/\/ Calcule \u00e9quivalent heures\/semaine (sur base 35h\/semaine standard)\r\n  \/\/ [FIX] Separateur decimal francais (la virgule) et mention des jours seulement\r\n  \/\/ quand elle est lisible : \"0.8 jour \/ semaine\" n'apportait rien.\r\n  const fr = (n) => n.toFixed(1).replace('.0', '').replace('.', ',');\r\n  const hoursPerWeek = fr(35 * value \/ 100);\r\n  const daysRaw = value \/ 100 * 5;\r\n  const equiv = document.getElementById('manualHoursEquiv');\r\n  if (equiv) {\r\n    let txt = `\u2248 ${hoursPerWeek} h \/ semaine`;\r\n    if (daysRaw >= 1) {\r\n      txt += `, ${fr(daysRaw)} jour${daysRaw >= 2 ? 's' : ''} \/ semaine`;\r\n    }\r\n    equiv.textContent = txt;\r\n  }\r\n  \/\/ Remplissage visuel du slider (gradient)\r\n  const min = parseInt(slider.min);\r\n  const max = parseInt(slider.max);\r\n  const fillPct = ((value - min) \/ (max - min)) * 100;\r\n  slider.style.setProperty('--slider-fill', fillPct + '%');\r\n}\r\nconst manualHoursSlider = document.getElementById('manualHours');\r\nif (manualHoursSlider) {\r\n  manualHoursSlider.addEventListener('input', updateManualHoursDisplay);\r\n  updateManualHoursDisplay(); \/\/ Initial\r\n}\r\n\r\n\/\/ === Slider Fiabilit\u00e9 des donn\u00e9es ===\r\nfunction updateDataReliabilityDisplay() {\r\n  const slider = document.getElementById('dataReliability');\r\n  if (!slider) return;\r\n  const value = parseInt(slider.value);\r\n  \/\/ Affiche le nombre\r\n  const display = document.getElementById('dataReliabilityDisplay');\r\n  if (display) display.textContent = value;\r\n  \/\/ Label qualitatif selon le niveau\r\n  let label = '';\r\n  if (value <= 25) label = 'Donn\u00e9es tr\u00e8s fragment\u00e9es';\r\n  else if (value <= 45) label = 'Donn\u00e9es fragment\u00e9es';\r\n  else if (value <= 65) label = 'Fiabilit\u00e9 moyenne';\r\n  else if (value <= 80) label = 'Donn\u00e9es plut\u00f4t fiables';\r\n  else label = 'Donn\u00e9es tr\u00e8s fiables';\r\n  const labelEl = document.getElementById('dataReliabilityLabel');\r\n  if (labelEl) labelEl.textContent = label;\r\n  \/\/ Remplissage visuel du slider\r\n  const min = parseInt(slider.min);\r\n  const max = parseInt(slider.max);\r\n  const fillPct = ((value - min) \/ (max - min)) * 100;\r\n  slider.style.setProperty('--slider-fill', fillPct + '%');\r\n}\r\nconst dataReliabilitySlider = document.getElementById('dataReliability');\r\nif (dataReliabilitySlider) {\r\n  dataReliabilitySlider.addEventListener('input', updateDataReliabilityDisplay);\r\n  updateDataReliabilityDisplay();\r\n}\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FORMATAGE FRAN\u00c7AIS DES INPUTS NUM\u00c9RIQUES ====\r\n\/\/ Affichage : 5000 \u2192 \"5 000\" (entier) ou \"5 000,00\" (montant)\r\n\/\/ =====================================================\r\nfunction parseUserInput(val) {\r\n  if (val === null || val === undefined || val === '') return null;\r\n  const cleaned = String(val).replace(\/\\s\/g, '').replace(',', '.');\r\n  const n = parseFloat(cleaned);\r\n  return isNaN(n) ? null : n;\r\n}\r\n\r\nfunction formatForDisplay(n, format) {\r\n  if (n === null || isNaN(n)) return '';\r\n  if (format === 'currency') {\r\n    return new Intl.NumberFormat('fr-FR', {\r\n      minimumFractionDigits: 2,\r\n      maximumFractionDigits: 2\r\n    }).format(n);\r\n  }\r\n  \/\/ entier (avec espaces si grand nombre)\r\n  return new Intl.NumberFormat('fr-FR', {\r\n    maximumFractionDigits: 0\r\n  }).format(n);\r\n}\r\n\r\nfunction formatForEdit(n, format) {\r\n  \/\/ \u00c0 l'\u00e9dition : pas de s\u00e9parateurs de milliers mais virgule d\u00e9cimale pour la coh\u00e9rence FR\r\n  if (n === null || isNaN(n)) return '';\r\n  if (format === 'currency') {\r\n    \/\/ 5000.5 \u2192 \"5000,5\" ; 5000 \u2192 \"5000\"\r\n    return String(n).replace('.', ',');\r\n  }\r\n  return String(Math.round(n));\r\n}\r\n\r\ndocument.querySelectorAll('input[data-format]').forEach(input => {\r\n  const fmt = input.dataset.format;\r\n\r\n  \/\/ Au focus : passer en mode \u00e9dition (sans espaces)\r\n  input.addEventListener('focus', () => {\r\n    const n = parseUserInput(input.value);\r\n    input.value = formatForEdit(n, fmt);\r\n    \/\/ S\u00e9lectionner tout pour faciliter l'\u00e9dition\r\n    setTimeout(() => input.select(), 0);\r\n  });\r\n\r\n  \/\/ Au blur : passer en mode affichage format\u00e9\r\n  input.addEventListener('blur', () => {\r\n    const n = parseUserInput(input.value);\r\n    input.value = formatForDisplay(n, fmt);\r\n  });\r\n\r\n  \/\/ Pendant la saisie : autoriser uniquement chiffres + virgule\/point + espace\r\n  input.addEventListener('input', () => {\r\n    \/\/ On nettoie sans toucher au curseur (sinon UX cass\u00e9e)\r\n    const cleaned = input.value.replace(\/[^\\d.,\\s]\/g, '');\r\n    if (cleaned !== input.value) input.value = cleaned;\r\n  });\r\n});\r\n\r\ndocument.querySelectorAll('input, select').forEach(el => {\r\n  el.addEventListener('input', calculate);\r\n  el.addEventListener('change', calculate);\r\n});\r\n\r\n\/\/ === ANALYTICS (dataLayer \/ GTM) ===\r\nwindow.dataLayer = window.dataLayer || [];\r\nfunction track(ev, data){ try { window.dataLayer.push(Object.assign({ event: ev }, data || {})); } catch(e){} }\r\n(function(){\r\n  var started = false, resultTracked = false, resTimer = null;\r\n  function txt(id){ var e = document.getElementById(id); return e ? (e.textContent || '').trim() : ''; }\r\n  function activeData(sel, key, def){ var e = document.querySelector(sel + '.active'); return (e && e.dataset && e.dataset[key]) ? e.dataset[key] : def; }\r\n  function fireStart(){ if (started) return; started = true; track('calc_start', {}); }\r\n  function scheduleResult(){\r\n    if (resultTracked) return;\r\n    clearTimeout(resTimer);\r\n    resTimer = setTimeout(function(){\r\n      resultTracked = true;\r\n      track('calc_result', {\r\n        roi: txt('roiPct'),\r\n        payback: txt('paybackMonths'),\r\n        net_gain: txt('netGain'),\r\n        scenario: activeData('.scenario-option', 'scenario', 'realistic'),\r\n        horizon: activeData('.horizon-option', 'years', '5')\r\n      });\r\n    }, 1500);\r\n  }\r\n  function onInteract(){ fireStart(); scheduleResult(); }\r\n  document.addEventListener('input', onInteract, true);\r\n  document.addEventListener('change', onInteract, true);\r\n  document.addEventListener('click', function(e){\r\n    if (e.target.closest && e.target.closest('.profile-btn, .scenario-option, .horizon-option')) { onInteract(); }\r\n  }, true);\r\n})();\r\n\r\n\/\/ ===================== WIZARD \u00c0 ONGLETS =====================\r\n(function(){\r\n  const tabs = document.querySelectorAll('.wiz-tab');\r\n  const panels = document.querySelectorAll('.wiz-panel');\r\n  if (!tabs.length || !panels.length) return;\r\n  const max = panels.length - 1;\r\n  let cur = 0;\r\n\r\n  function go(n) {\r\n    cur = Math.max(0, Math.min(max, n));\r\n    tabs.forEach((t, i) => {\r\n      t.classList.toggle('active', i === cur);\r\n      t.classList.toggle('done', i < cur);\r\n    });\r\n    panels.forEach((p, i) => p.classList.toggle('active', i === cur));\r\n    \/\/ mettre \u00e0 jour l'\u00e9tat des boutons Pr\u00e9c\u00e9dent dans chaque panneau (d\u00e9sactiver sur la 1re \u00e9tape)\r\n    panels.forEach((p, i) => {\r\n      const prev = p.querySelector('.wiz-btn.prev');\r\n      if (prev) prev.disabled = (i === 0);\r\n    });\r\n  }\r\n\r\n  \/\/ onglets cliquables\r\n  tabs.forEach((t, i) => t.addEventListener('click', () => go(i)));\r\n\r\n  \/\/ boutons Pr\u00e9c\u00e9dent \/ Suivant dans chaque panneau\r\n  panels.forEach((panel, idx) => {\r\n    const prev = panel.querySelector('.wiz-btn.prev');\r\n    const next = panel.querySelector('.wiz-btn.next');\r\n    if (prev) prev.addEventListener('click', () => go(cur - 1));\r\n    if (next) next.addEventListener('click', () => {\r\n      if (cur < max) { go(cur + 1); }\r\n      else {\r\n        const res = document.querySelector('.results');\r\n        if (res) res.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      }\r\n    });\r\n  });\r\n\r\n  go(0);\r\n})();\r\n\r\ninitCharts();\r\ncalculate();\r\n\r\n\/\/ === FAQ Accordion ===\r\ndocument.querySelectorAll('.faq-question').forEach(q => {\r\n  q.addEventListener('click', function() {\r\n    const item = this.closest('.faq-item');\r\n    const isOpen = item.classList.contains('open');\r\n    item.classList.toggle('open', !isOpen);\r\n  });\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== PROFILS TYPES - pr\u00e9-remplissage par ordre de grandeur ====\r\n\/\/ Valeurs indicatives (march\u00e9 ERP int\u00e9gr\u00e9), \u00e0 affiner avec les \u00e9quipes.\r\n\/\/ Un clic remplit les champs ; le visiteur ajuste ensuite.\r\n\/\/ =====================================================\r\n(function() {\r\n  \/\/ Seuils valid\u00e9s : PME jusqu'\u00e0 80 utilisateurs | ETI 81 \u00e0 300 | Grands Comptes plus de 300.\r\n  \/\/ manualHours \u00e0 20 % : moyenne annonc\u00e9e dans la FAQ et dans l'aide du champ.\r\n  const PROFILES = {\r\n    pme:            { users: 50,  licenseCost: 55, implementationCost: 75000,  trainingCost: 12000, maintenancePct: 20, hostingCost: 6000,  existingSystemsCost: 12000,  manualHours: 15, hourlyRate: 45, dataReliability: 50 },\r\n    eti:            { users: 150, licenseCost: 55, implementationCost: 180000, trainingCost: 30000, maintenancePct: 20, hostingCost: 12000, existingSystemsCost: 40000,  manualHours: 15, hourlyRate: 50, dataReliability: 45 },\r\n    grands_comptes: { users: 500, licenseCost: 55, implementationCost: 400000, trainingCost: 60000, maintenancePct: 20, hostingCost: 24000, existingSystemsCost: 120000, manualHours: 15, hourlyRate: 55, dataReliability: 45 }\r\n  };\r\n\r\n  function applyProfile(key, markActive) {\r\n    const p = PROFILES[key];\r\n    if (!p) return;\r\n    \/\/ Champs texte format\u00e9s (currency \/ integer)\r\n    document.querySelectorAll('input[data-format]').forEach(input => {\r\n      if (p.hasOwnProperty(input.id)) {\r\n        const fmt = input.dataset.format;\r\n        input.value = (typeof formatForDisplay === 'function') ? formatForDisplay(p[input.id], fmt) : String(p[input.id]);\r\n      }\r\n    });\r\n    \/\/ Sliders + leur affichage\r\n    const mh = document.getElementById('manualHours');\r\n    if (mh && p.manualHours != null) { mh.value = p.manualHours; if (typeof updateManualHoursDisplay === 'function') updateManualHoursDisplay(); }\r\n    const dr = document.getElementById('dataReliability');\r\n    if (dr && p.dataReliability != null) { dr.value = p.dataReliability; if (typeof updateDataReliabilityDisplay === 'function') updateDataReliabilityDisplay(); }\r\n    \/\/ Marquer le bouton actif\r\n    if (markActive) {\r\n      document.querySelectorAll('.profile-btn').forEach(b => b.classList.toggle('active', b.dataset.profile === key));\r\n    }\r\n    \/\/ [FIX] Respecter l'etat des cases \"deja inclus\" apres un pre-remplissage :\r\n    \/\/ le profil propose un montant, mais si la case est cochee le champ doit afficher 0.\r\n    \/\/ Le montant du profil est memorise pour etre restitue si l'utilisateur decoche.\r\n    const mTog = document.getElementById('maintIncluded');\r\n    const mInp = document.getElementById('maintenancePct');\r\n    if (mTog && mInp) {\r\n      if (mTog.checked) { window.__maintSaved = mInp.value; mInp.value = '0'; }\r\n    }\r\n    const hTog = document.getElementById('hostingIncluded');\r\n    const hInp = document.getElementById('hostingCost');\r\n    if (hTog && hInp) {\r\n      if (hTog.checked) { window.__hostingSaved = hInp.value; hInp.value = '0'; }\r\n    }\r\n\r\n    \/\/ Recalculer \u2192 graphes + KPI \u00e0 jour\r\n    if (typeof calculate === 'function') calculate();\r\n  }\r\n\r\n  document.querySelectorAll('.profile-btn').forEach(btn => {\r\n    btn.addEventListener('click', () => applyProfile(btn.dataset.profile, true));\r\n  });\r\n\r\n\r\n  \/\/ Si l'utilisateur modifie un champ \u00e0 la main, on retire l'\u00e9tat \"actif\" du profil\r\n  document.querySelectorAll('input[data-format], #manualHours, #dataReliability').forEach(input => {\r\n    input.addEventListener('input', () => {\r\n      document.querySelectorAll('.profile-btn.active').forEach(b => b.classList.remove('active'));\r\n    });\r\n  });\r\n\r\n  \/\/ Au chargement : pr\u00e9-remplir avec le profil PME pour afficher les graphes imm\u00e9diatement\r\n  function initDefault() {\r\n    applyProfile('pme', true);\r\n  }\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', () => setTimeout(initDefault, 60));\r\n  } else {\r\n    setTimeout(initDefault, 60);\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<\/div><!-- \/.roi-wrap -->\r\n<\/body>\r\n<\/html>\r\n\n<p>[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\n<div class=\"wpcf7 no-js\" id=\"wpcf7-f387090-o2\" lang=\"fr-FR\" dir=\"ltr\">\n<div class=\"screen-reader-response\"><p role=\"status\" aria-live=\"polite\" aria-atomic=\"true\"><\/p> <ul><\/ul><\/div>\n<form action=\"\/fr\/wp-json\/wp\/v2\/pages\/386935#wpcf7-f387090-o2\" method=\"post\" class=\"wpcf7-form init\" aria-label=\"Formulaire de contact\" novalidate=\"novalidate\" data-status=\"init\">\n<div style=\"display: none;\">\n<input type=\"hidden\" name=\"_wpcf7\" value=\"387090\" \/>\n<input type=\"hidden\" name=\"_wpcf7_version\" value=\"5.8.7\" \/>\n<input type=\"hidden\" name=\"_wpcf7_locale\" value=\"fr_FR\" \/>\n<input type=\"hidden\" name=\"_wpcf7_unit_tag\" value=\"wpcf7-f387090-o2\" \/>\n<input type=\"hidden\" name=\"_wpcf7_container_post\" value=\"0\" \/>\n<input type=\"hidden\" name=\"_wpcf7_posted_data_hash\" value=\"\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_hidden_group_fields\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_hidden_groups\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_visible_groups\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_repeaters\" value=\"[]\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_steps\" value=\"{}\" \/>\n<input type=\"hidden\" name=\"_wpcf7cf_options\" value=\"{&quot;form_id&quot;:387090,&quot;conditions&quot;:[],&quot;settings&quot;:{&quot;animation&quot;:&quot;yes&quot;,&quot;animation_intime&quot;:200,&quot;animation_outtime&quot;:200,&quot;conditions_ui&quot;:&quot;normal&quot;,&quot;notice_dismissed&quot;:false,&quot;repeater_remove_button&quot;:&quot;bottom&quot;,&quot;notice_dismissed_update-cf7-5.8&quot;:true,&quot;notice_dismissed_update-cf7-6.0.6&quot;:true}}\" \/>\n<input type=\"hidden\" name=\"_wpcf7_recaptcha_response\" value=\"\" \/>\n<\/div>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_first_name\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_last_name\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_email\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_company\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_role\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_phone\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_users\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_license_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_implementation_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_training_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_maintenance_pct\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_maint_included\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_hosting_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_hosting_included\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_existing_systems_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_manual_hours\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_hourly_rate\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_data_reliability\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_error_cost_estimate\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_ai_uplift\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_horizon\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_scenario\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_currency\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_cost_license\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_cost_impl\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_cost_maint\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_cost_hosting\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_cost_training\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_gain_prod\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_gain_errors\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_gain_ai\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_gain_existing\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_roi_pct\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_payback_months\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_net_gain\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_hours_reclaimed\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_total_cost\" \/>\n<input class=\"wpcf7-form-control wpcf7-hidden\" value=\"\" type=\"hidden\" name=\"cf7_total_gain\" \/>\n<p><input class=\"wpcf7-form-control wpcf7-submit has-spinner\" type=\"submit\" value=\"Envoyer\" \/>\n<\/p><div class=\"wpcf7-response-output\" aria-hidden=\"true\"><\/div>\n<\/form>\n<\/div>\n <!DOCTYPE html>\r\n<html lang=\"fr\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Calculateur ROI ERP : retour sur investissement | Axelor<\/title>\r\n<meta name=\"description\" content=\"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.\">\r\n<meta name=\"robots\" content=\"index, follow\">\r\n<meta name=\"author\" content=\"Axelor\">\r\n<meta name=\"theme-color\" content=\"#010165\">\r\n<link rel=\"canonical\" href=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\">\r\n<!-- Open Graph (partage LinkedIn \/ r\u00e9seaux) -->\r\n<meta property=\"og:type\" content=\"website\">\r\n<meta property=\"og:locale\" content=\"fr_FR\">\r\n<meta property=\"og:site_name\" content=\"Axelor\">\r\n<meta property=\"og:title\" content=\"Calculateur ROI ERP : retour sur investissement | Axelor\">\r\n<meta property=\"og:description\" content=\"TCO sur 3 \u00e0 10 ans, productivit\u00e9, fiabilit\u00e9 des donn\u00e9es et IA agentique. M\u00e9thodologie NPV actualis\u00e9e, 3 sc\u00e9narios. Outil gratuit pour cadrer et d\u00e9fendre votre projet ERP.\">\r\n<meta property=\"og:url\" content=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\">\r\n<meta property=\"og:image\" content=\"https:\/\/axelor.com\/wp-content\/uploads\/2023\/06\/logo_og.jpg\">\r\n<meta name=\"twitter:card\" content=\"summary_large_image\">\r\n<meta name=\"twitter:title\" content=\"Calculateur ROI ERP | Axelor\">\r\n<meta name=\"twitter:description\" content=\"Estimez le retour sur investissement de votre projet ERP : m\u00e9thodologie NPV, 3 sc\u00e9narios, IA agentique.\">\r\n<meta name=\"twitter:image\" content=\"https:\/\/axelor.com\/wp-content\/uploads\/2023\/06\/logo_og.jpg\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\r\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Poppins:wght@300;400;500;600;700&family=Chakra+Petch:wght@400;500;600&display=swap\" rel=\"stylesheet\">\r\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.0\/dist\/chart.umd.min.js\"><\/script>\r\n<script>\r\n\/\/ === ANALYTICS (dataLayer \/ GTM) ===\r\n\/\/ [FIX] En prod ce bloc \u00e9tait \u00e9crit \u00c0 L'INT\u00c9RIEUR de la balise <script src=\"chart.js\">.\r\n\/\/ Une balise avec src ignore son contenu inline : track() n'existait pas et AUCUN\r\n\/\/ \u00e9v\u00e9nement (calc_start \/ calc_result \/ calc_lead_*) n'\u00e9tait envoy\u00e9.\r\nwindow.dataLayer = window.dataLayer || [];\r\nfunction track(ev, data){ try { window.dataLayer.push(Object.assign({ event: ev }, data || {})); } catch(e){} }\r\n(function(){\r\n  var started=false, resultTracked=false, resTimer=null;\r\n  function txt(id){ var e=document.getElementById(id); return e ? (e.textContent||'').trim() : ''; }\r\n  function activeData(sel,key,def){ var e=document.querySelector(sel+'.active'); return (e&&e.dataset&&e.dataset[key])?e.dataset[key]:def; }\r\n  function fireStart(){ if(started) return; started=true; track('calc_start',{}); }\r\n  function scheduleResult(){\r\n    if(resultTracked) return;\r\n    clearTimeout(resTimer);\r\n    resTimer=setTimeout(function(){\r\n      resultTracked=true;\r\n      track('calc_result',{ roi:txt('roiPct'), payback:txt('paybackMonths'), net_gain:txt('netGain'),\r\n        scenario:activeData('.scenario-option','scenario','realistic'), horizon:activeData('.horizon-option','years','5') });\r\n    },1500);\r\n  }\r\n  function onInteract(){ fireStart(); scheduleResult(); }\r\n  document.addEventListener('input',onInteract,true);\r\n  document.addEventListener('change',onInteract,true);\r\n  document.addEventListener('click',function(e){\r\n    if(e.target.closest && e.target.closest('.profile-btn, .scenario-option, .horizon-option')) onInteract();\r\n  },true);\r\n})();\r\n<\/script>\r\n<style>:root{\r\n    --magnolia: #F5F5FF;\r\n    --magnolia-2: #FAFAFF;\r\n    --navy: #010165;\r\n    --navy-dark: #0D021E;\r\n    --ocean: #3ECF8E;\r\n    --ocean-dark: #2BB57A;\r\n    --ocean-soft: rgba(62, 207, 142, 0.12);\r\n    --wheelwright: #5D6B90;\r\n    --white: #FFFFFF;\r\n    --border: rgba(1, 1, 101, 0.12);\r\n    --line: rgba(1, 1, 101, 0.08);\r\n    --line-strong: rgba(1, 1, 101, 0.16);\r\n    --shadow-sm: 0 1px 2px rgba(1, 1, 101, 0.04), 0 1px 3px rgba(1, 1, 101, 0.06);\r\n    --shadow-md: 0 4px 12px rgba(1, 1, 101, 0.06), 0 2px 4px rgba(1, 1, 101, 0.04);\r\n    --shadow-lg: 0 24px 60px rgba(13, 2, 30, 0.18), 0 8px 24px rgba(13, 2, 30, 0.12);\r\n    --radius: 14px;\r\n    --radius-sm: 10px;\r\n    --radius-lg: 20px;\r\n  }\/* ===== COMPARATEUR ROI : ERP classique vs Axelor IA ===== *\/\r\n  .roi-wrap .roi-compare {\r\n    display: grid; grid-template-columns: 1fr auto 1fr; align-items: stretch; gap: 0;\r\n    margin-bottom: 14px; border-radius: 16px; overflow: hidden;\r\n    border: 1px solid rgba(255,255,255,0.10);\r\n  }.roi-wrap .roi-compare__col { padding: 22px 20px; text-align: center; display: flex; flex-direction: column; justify-content: center; gap: 6px; }.roi-wrap .roi-compare__base { background: rgba(255,255,255,0.04); }.roi-wrap .roi-compare__axelor {\r\n    background: linear-gradient(160deg, rgba(62,207,142,0.16) 0%, rgba(62,207,142,0.05) 100%);\r\n    position: relative;\r\n  }.roi-wrap .roi-compare__axelor::before {\r\n    content: \"\"; position: absolute; top: 0; left: 0; width: 100%; height: 3px;\r\n    background: var(--ocean);\r\n  }.roi-wrap .roi-compare__tag {\r\n    font-size: 11px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;\r\n    color: rgba(255,255,255,0.55); display: inline-flex; align-items: center; justify-content: center; gap: 6px;\r\n  }.roi-wrap .roi-compare__axelor .roi-compare__tag { color: var(--ocean); }.roi-wrap .roi-compare__axelor .roi-compare__tag svg { width: 14px; height: 14px; }.roi-wrap .roi-compare__value { font-size: 40px; font-weight: 700; line-height: 1; letter-spacing: -0.02em; font-variant-numeric: tabular-nums; }.roi-wrap .roi-compare__base .roi-compare__value { color: rgba(255,255,255,0.85); }.roi-wrap .roi-compare__axelor .roi-compare__value { color: var(--ocean); }.roi-wrap .roi-compare__value.negative { color: #F4C95D !important; }.roi-wrap .roi-compare__sub { font-size: 11.5px; color: rgba(255,255,255,0.50); line-height: 1.4; }.roi-wrap .roi-compare__plus {\r\n    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 8px;\r\n    padding: 0 18px; background: rgba(255,255,255,0.02);\r\n    border-left: 1px solid rgba(255,255,255,0.08); border-right: 1px solid rgba(255,255,255,0.08);\r\n  }.roi-wrap .roi-compare__plus svg { width: 22px; height: 22px; stroke: var(--ocean); fill: none; }.roi-wrap .roi-compare__plus-badge {\r\n    font-size: 13px; font-weight: 700; color: var(--navy); background: var(--ocean);\r\n    padding: 4px 10px; border-radius: 100px; white-space: nowrap; font-variant-numeric: tabular-nums;\r\n    box-shadow: 0 4px 12px rgba(62,207,142,0.3);\r\n  }.roi-wrap .roi-compare__note {\r\n    display: flex; align-items: flex-start; gap: 10px; margin-bottom: 22px;\r\n    padding: 13px 16px; border-radius: 12px;\r\n    background: rgba(62,207,142,0.07); border: 1px solid rgba(62,207,142,0.20);\r\n    font-size: 12.5px; color: rgba(255,255,255,0.78); line-height: 1.55;\r\n  }.roi-wrap .roi-compare__note svg { width: 16px; height: 16px; stroke: var(--ocean); fill: none; flex-shrink: 0; margin-top: 1px; }.roi-wrap .roi-compare__note strong { color: var(--white); font-weight: 600; }@media (max-width: 600px){.roi-wrap .roi-compare { grid-template-columns: 1fr; }.roi-wrap .roi-compare__plus { flex-direction: row; padding: 12px; border-left: none; border-right: none; border-top: 1px solid rgba(255,255,255,0.08); border-bottom: 1px solid rgba(255,255,255,0.08); }.roi-wrap .roi-compare__plus svg { transform: rotate(90deg); }.roi-wrap .roi-compare__value { font-size: 34px; }\r\n  }.roi-wrap * { margin: 0; padding: 0; box-sizing: border-box; }.roi-wrap {\r\n    font-family: 'Poppins', sans-serif;\r\n    background: linear-gradient(135deg, var(--navy-dark) 0%, var(--navy) 100%);\r\n    background-attachment: fixed;\r\n    min-height: 100vh;\r\n    color: var(--wheelwright);\r\n    font-weight: 400;\r\n    line-height: 1.5;\r\n    -webkit-font-smoothing: antialiased;\r\n    -moz-osx-font-smoothing: grayscale;\r\n  }\/* === HEADER === *\/\r\n  .roi-wrap .topbar {\r\n    padding: 28px 40px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    max-width: 1340px;\r\n    margin: 0 auto;\r\n  }.roi-wrap .topbar img {\r\n    height: 36px;\r\n    width: auto;\r\n  }.roi-wrap .topbar-tag {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-size: 13px;\r\n    font-weight: 400;\r\n    letter-spacing: 0.02em;\r\n  }.roi-wrap .topbar-tag span {\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n  }\/* === HERO === *\/\r\n  .roi-wrap .hero {\r\n    text-align: center;\r\n    padding: 56px 24px 40px;\r\n    max-width: 920px;\r\n    margin: 0 auto;\r\n    color: var(--white);\r\n    position: relative;\r\n  }\/* ==== S\u00c9LECTEUR DE DEVISE (minimaliste, sans encadr\u00e9, align\u00e9 \u00e0 gauche) ==== *\/\r\n  .roi-wrap .currency-bar {\r\n    margin-bottom: 18px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: flex-end;\r\n    gap: 9px;\r\n  }.roi-wrap .currency-bar__label {\r\n    font-size: 11.5px; font-weight: 600; letter-spacing: .02em;\r\n    color: var(--wheelwright); text-transform: uppercase;\r\n  }.roi-wrap .currency-hint {\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    font-style: italic;\r\n    padding-left: 4px;\r\n  }\/* badge d'\u00e9tape en t\u00eate du bandeau profil *\/\r\n  .roi-wrap .card-step--lead { margin-bottom: 14px; }\/* ==== Profils types (pr\u00e9-remplissage) ==== *\/\r\n  .roi-wrap .profiles-bar {\r\n    background: linear-gradient(160deg, var(--magnolia-2, #FAFAFF), #fff);\r\n    border: 1px solid var(--border, rgba(1,1,101,.12));\r\n    border-radius: 16px; padding: 22px 22px; margin-bottom: 24px;\r\n    box-shadow: 0 4px 16px rgba(1,1,101,0.05);\r\n  }.roi-wrap .profiles-bar__label { display: flex; align-items: flex-start; gap: 9px; font-size: 13.5px; font-weight: 500; color: var(--navy, #010165); margin-bottom: 14px; line-height: 1.5; }.roi-wrap .profiles-bar__label svg { width: 17px; height: 17px; stroke: var(--ocean-dark, #2BB57A); flex-shrink: 0; margin-top: 1px; }.roi-wrap .profiles-bar__btns { display: flex; gap: 10px; flex-wrap: wrap; }.roi-wrap .profile-btn {\r\n    flex: 1; min-width: 120px; font-family: inherit; cursor: pointer;\r\n    background: #fff; border: 1.5px solid var(--border, rgba(1,1,101,.14)); border-radius: 12px;\r\n    padding: 13px 14px; font-size: 15px; font-weight: 600; color: var(--navy, #010165);\r\n    display: flex; flex-direction: column; align-items: center; gap: 3px; transition: all .18s;\r\n  }.roi-wrap .profile-btn span { font-size: 11.5px; font-weight: 400; color: var(--wheelwright, #5D6B90); }.roi-wrap .profile-btn:hover { border-color: var(--ocean, #3ECF8E); transform: translateY(-2px); box-shadow: 0 6px 16px rgba(62,207,142,.18); }.roi-wrap .profile-btn.active { background: var(--navy, #010165); border-color: var(--navy, #010165); color: #fff; box-shadow: 0 8px 20px rgba(1,1,101,.2); }.roi-wrap .profile-btn.active span { color: rgba(255,255,255,.7); }.roi-wrap .profiles-bar__note { font-size: 11px; color: var(--wheelwright, #5D6B90); margin-top: 12px; font-style: italic; line-height: 1.5; }@media (max-width: 600px){.roi-wrap .profile-btn { min-width: 0; } }.roi-wrap .currency-switcher {\r\n    position: relative;\r\n  }.roi-wrap .currency-trigger {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    padding: 10px 16px 10px 12px;\r\n    background: var(--white);\r\n    border: 1.5px solid var(--border);\r\n    border-radius: 10px;\r\n    color: var(--navy);\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    cursor: pointer;\r\n    transition: all 0.2s;\r\n    user-select: none;\r\n    box-shadow: 0 2px 6px rgba(13, 2, 30, 0.04);\r\n  }.roi-wrap .currency-trigger:hover {\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 4px 12px rgba(62, 207, 142, 0.15);\r\n  }.roi-wrap .currency-trigger .cur-flag {\r\n    width: 26px; height: 26px;\r\n    border-radius: 50%;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-size: 12px; font-weight: 800;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .currency-trigger .cur-code { font-weight: 700; color: var(--navy); }.roi-wrap .currency-trigger .cur-arrow {\r\n    width: 14px; height: 14px;\r\n    opacity: 0.5;\r\n    transition: transform 0.2s;\r\n    color: var(--navy);\r\n  }.roi-wrap .currency-switcher.open .cur-arrow { transform: rotate(180deg); }.roi-wrap .currency-dropdown {\r\n    position: absolute;\r\n    top: calc(100% + 8px);\r\n    right: 0;\r\n    min-width: 300px;\r\n    background: var(--white);\r\n    border: 1px solid var(--border);\r\n    border-radius: 14px;\r\n    box-shadow: 0 20px 40px rgba(13, 2, 30, 0.15);\r\n    padding: 8px;\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transform: translateY(-6px);\r\n    transition: all 0.2s;\r\n    z-index: 100;\r\n    max-height: 420px;\r\n    overflow-y: auto;\r\n  }.roi-wrap .currency-switcher.open .currency-dropdown {\r\n    opacity: 1;\r\n    pointer-events: auto;\r\n    transform: translateY(0);\r\n  }.roi-wrap .currency-search {\r\n    width: 100%;\r\n    padding: 10px 12px;\r\n    border: 1px solid var(--border);\r\n    border-radius: 8px;\r\n    font-size: 13px;\r\n    font-family: inherit;\r\n    margin-bottom: 6px;\r\n    color: var(--navy);\r\n    background: var(--magnolia-2);\r\n  }.roi-wrap .currency-search:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n  }.roi-wrap .currency-option {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding: 10px 12px;\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .currency-option:hover {\r\n    background: var(--magnolia);\r\n  }.roi-wrap .currency-option.active {\r\n    background: var(--ocean-soft);\r\n  }.roi-wrap .currency-option.active .opt-name { color: var(--ocean-dark); font-weight: 600; }.roi-wrap .currency-option .opt-flag {\r\n    width: 28px; height: 28px;\r\n    border-radius: 50%;\r\n    background: linear-gradient(135deg, var(--ocean) 0%, var(--ocean-dark) 100%);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-size: 12px; font-weight: 800;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .currency-option .opt-info { flex: 1; min-width: 0; }.roi-wrap .currency-option .opt-name {\r\n    font-size: 13.5px;\r\n    color: var(--navy);\r\n    font-weight: 500;\r\n    line-height: 1.2;\r\n  }.roi-wrap .currency-option .opt-code {\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    margin-top: 2px;\r\n  }.roi-wrap .currency-option .opt-check {\r\n    width: 18px; height: 18px;\r\n    color: var(--ocean);\r\n    opacity: 0;\r\n    transition: opacity 0.15s;\r\n  }.roi-wrap .currency-option.active .opt-check { opacity: 1; }.roi-wrap .currency-divider {\r\n    height: 1px;\r\n    background: var(--border);\r\n    margin: 6px 8px;\r\n  }.roi-wrap .currency-section-label {\r\n    padding: 8px 12px 4px;\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.06em;\r\n  }\/* Toast confirmation *\/\r\n  .roi-wrap .currency-toast {\r\n    position: fixed;\r\n    bottom: 28px;\r\n    left: 50%;\r\n    transform: translateX(-50%) translateY(20px);\r\n    background: var(--navy);\r\n    color: var(--white);\r\n    padding: 12px 22px;\r\n    border-radius: 10px;\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    box-shadow: 0 12px 28px rgba(13, 2, 30, 0.25);\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transition: all 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n    z-index: 1000;\r\n    display: flex; align-items: center; gap: 10px;\r\n  }.roi-wrap .currency-toast.show {\r\n    opacity: 1;\r\n    transform: translateX(-50%) translateY(0);\r\n  }.roi-wrap .currency-toast .toast-icon {\r\n    width: 22px; height: 22px;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    border-radius: 50%;\r\n    display: flex; align-items: center; justify-content: center;\r\n    font-weight: 800; font-size: 12px;\r\n  }@media (max-width: 700px){.roi-wrap .currency-bar { padding: 14px 16px; }.roi-wrap .currency-bar-left { width: 100%; min-width: 0; }.roi-wrap .currency-switcher { width: 100%; }.roi-wrap .currency-trigger { width: 100%; justify-content: center; }.roi-wrap .currency-dropdown { min-width: 100%; right: 0; left: 0; }\r\n  }.roi-wrap .hero-eyebrow {\r\n    display: inline-block;\r\n    color: var(--ocean);\r\n    font-size: 12px;\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 18px;\r\n    padding: 6px 14px;\r\n    background: var(--ocean-soft);\r\n    border-radius: 999px;\r\n  }.roi-wrap .hero h1 {\r\n    font-size: 52px;\r\n    line-height: 1.08;\r\n    font-weight: 600;\r\n    letter-spacing: -0.02em;\r\n    margin-bottom: 18px;\r\n    color: var(--white);\r\n  }.roi-wrap .hero h1 .accent {\r\n    color: var(--ocean);\r\n  }.roi-wrap .hero p {\r\n    font-size: 17px;\r\n    color: rgba(255, 255, 255, 0.72);\r\n    max-width: 640px;\r\n    margin: 0 auto;\r\n    font-weight: 300;\r\n    line-height: 1.6;\r\n  }.roi-wrap .hero-meta {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 24px;\r\n    padding: 12px 22px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.08);\r\n    border-radius: 999px;\r\n    backdrop-filter: blur(10px);\r\n  }.roi-wrap .hero-meta-item {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.7);\r\n    font-weight: 400;\r\n  }.roi-wrap .hero-meta-item strong {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n  }.roi-wrap .hero-meta-sep {\r\n    width: 1px;\r\n    height: 14px;\r\n    background: rgba(255, 255, 255, 0.12);\r\n  }\/* === LAYOUT === *\/\r\n  .roi-wrap .container {\r\n    max-width: 1440px;\r\n    margin: 0 auto;\r\n    padding: 0 40px 60px;\r\n  }.roi-wrap .layout {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 28px;\r\n    align-items: start;\r\n  }.roi-wrap .layout > * {\r\n    margin-bottom: 0;\r\n    min-width: 0;\r\n  }.roi-wrap .layout > *:last-child {\r\n    margin-bottom: 0;\r\n  }\/* === BLOC 2 COLONNES POUR LES 2 \u00c9TAPES === *\/\r\n  .roi-wrap .inputs-grid {\r\n    display: grid;\r\n    grid-template-columns: 1fr;\r\n    gap: 22px;\r\n    align-items: stretch;\r\n  }\/* ===== WIZARD \u00c0 ONGLETS (\u00e9pur\u00e9) ===== *\/\r\n  .roi-wrap .wiz-tabs { display: flex; gap: 10px; margin-bottom: 24px; }.roi-wrap .wiz-tab {\r\n    flex: 1; display: flex; align-items: center; justify-content: center; gap: 10px;\r\n    padding: 15px 14px; border-radius: 12px; background: rgba(255,255,255,0.04);\r\n    border: 1px solid rgba(255,255,255,0.12); color: rgba(255,255,255,0.55);\r\n    font-family: inherit; font-size: 14px; font-weight: 500; cursor: pointer; transition: all .2s;\r\n  }.roi-wrap .wiz-tab .wiz-ico {\r\n    display: flex; align-items: center; justify-content: center;\r\n    width: 34px; height: 34px; border-radius: 10px;\r\n    background: rgba(255,255,255,0.06); flex-shrink: 0; transition: all .2s;\r\n  }.roi-wrap .wiz-tab .wiz-ico svg { width: 18px; height: 18px; stroke: rgba(255,255,255,0.5); fill: none; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; transition: stroke .2s; }.roi-wrap .wiz-tab:hover .wiz-ico { background: rgba(255,255,255,0.1); }.roi-wrap .wiz-tab:hover .wiz-ico svg { stroke: #fff; }.roi-wrap .wiz-tab.active .wiz-ico { background: var(--ocean, #3ECF8E); }.roi-wrap .wiz-tab.active .wiz-ico svg { stroke: var(--navy, #010165); }.roi-wrap .wiz-tab.done .wiz-ico { background: rgba(62,207,142,0.2); }.roi-wrap .wiz-tab.done .wiz-ico svg { stroke: var(--ocean, #3ECF8E); }.roi-wrap .wiz-tab:hover { background: rgba(255,255,255,0.07); border-color: rgba(255,255,255,0.2); color: #fff; }.roi-wrap .wiz-tab.active {\r\n    background: rgba(62,207,142,0.12); border-color: var(--ocean, #3ECF8E);\r\n    color: #fff; font-weight: 600;\r\n  }.roi-wrap .wiz-tab.done { border-color: rgba(62,207,142,0.3); color: rgba(255,255,255,0.7); }.roi-wrap .wiz-tab-label { white-space: nowrap; }.roi-wrap .wiz-panel { display: none; }.roi-wrap .wiz-panel.active { display: block; animation: wizFade .35s ease; }@keyframes wizFade{ from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }.roi-wrap .wiz-nav { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-top: 24px; padding-top: 20px; border-top: 1px solid var(--border, rgba(1,1,101,.08)); }.roi-wrap .wiz-btn {\r\n    padding: 13px 26px; border-radius: 11px; font-family: inherit; font-size: 14.5px; font-weight: 600;\r\n    cursor: pointer; border: none; transition: transform .2s, box-shadow .2s, opacity .2s, background .2s; display: inline-flex; align-items: center; gap: 8px;\r\n  }.roi-wrap .wiz-btn svg { width: 16px; height: 16px; stroke: currentColor; fill: none; stroke-width: 2.4; }.roi-wrap .wiz-btn.prev { background: var(--magnolia, #F5F5FF); color: var(--navy, #010165); border: 1px solid var(--border, rgba(1,1,101,.14)); }.roi-wrap .wiz-btn.prev:hover:not(:disabled) { background: #ECECF7; border-color: rgba(1,1,101,.22); }.roi-wrap .wiz-btn.next { background: linear-gradient(135deg, var(--ocean, #3ECF8E), var(--ocean-dark, #2BB57A)); color: var(--navy, #010165); margin-left: auto; box-shadow: 0 8px 22px rgba(62,207,142,.3); }.roi-wrap .wiz-btn.next:hover { transform: translateY(-2px); box-shadow: 0 12px 28px rgba(62,207,142,.42); }.roi-wrap .wiz-btn.next svg { stroke: var(--navy, #010165); }.roi-wrap .wiz-btn:disabled { opacity: .35; cursor: not-allowed; }.roi-wrap .wiz-btn:disabled:hover { transform: none; box-shadow: none; }@media (max-width: 600px){.roi-wrap .wiz-tab-label { font-size: 12px; }.roi-wrap .wiz-tab { padding: 12px 8px; gap: 7px; }\r\n  }.roi-wrap .faq-section-wrapper {\r\n    margin-top: 48px;\r\n  }\/* Zone conversion + m\u00e9thodologie, sous le cockpit (align\u00e9e sur la largeur du contenu) *\/\r\n  .roi-wrap .post-cockpit {\r\n    max-width: 1140px;\r\n    margin: 40px auto 0;\r\n  }.roi-wrap .post-cockpit .cta { margin-top: 0; }.roi-wrap .inputs-grid > .card {\r\n    margin-bottom: 0;\r\n  }\/* === APER\u00c7U LIVE - synth\u00e8se en pied d'\u00e9tape 2 (pleine largeur) === *\/\r\n  .roi-wrap .preview-inline {\r\n    margin-top: 24px;\r\n    padding: 22px 24px;\r\n    border-radius: 14px;\r\n    background: linear-gradient(160deg, rgba(62,207,142,0.07) 0%, rgba(62,207,142,0.02) 100%);\r\n    border: 1px solid rgba(62, 207, 142, 0.20);\r\n  }.roi-wrap .preview-inline-row {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 16px;\r\n    margin-bottom: 18px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .preview-inline-eyebrow {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 7px;\r\n    padding: 4px 11px 4px 9px;\r\n    background: var(--ocean-soft);\r\n    border: 1px solid rgba(62, 207, 142, 0.35);\r\n    border-radius: 100px;\r\n    font-size: 10px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.10em;\r\n    text-transform: uppercase;\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n  }.roi-wrap .preview-inline-dot {\r\n    width: 6px;\r\n    height: 6px;\r\n    background: var(--ocean);\r\n    border-radius: 50%;\r\n    animation: previewPulseInline 1.6s ease-in-out infinite;\r\n  }@keyframes previewPulseInline{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.4; transform: scale(0.7); }\r\n  }.roi-wrap .preview-inline-kpis {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 18px;\r\n  }.roi-wrap .preview-inline-kpi {\r\n    text-align: right;\r\n  }.roi-wrap .preview-inline-value {\r\n    font-size: 30px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--ocean-dark);\r\n    letter-spacing: -0.02em;\r\n    font-variant-numeric: tabular-nums;\r\n    transition: color 0.2s;\r\n  }.roi-wrap .preview-inline-value.negative { color: #F4C95D; }.roi-wrap .preview-inline-value-sub {\r\n    font-size: 20px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--navy);\r\n    letter-spacing: -0.01em;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .preview-inline-label {\r\n    font-size: 10.5px;\r\n    color: var(--wheelwright);\r\n    margin-top: 5px;\r\n    font-weight: 500;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n  }.roi-wrap .preview-inline-divider-v {\r\n    width: 1px;\r\n    height: 36px;\r\n    background: var(--border);\r\n  }\/* Mini-barre de r\u00e9partition co\u00fbts \/ gains *\/\r\n  .roi-wrap .preview-inline-bar {\r\n    margin: 18px 0;\r\n    padding: 16px 0;\r\n    border-top: 1px solid rgba(62, 207, 142, 0.18);\r\n    border-bottom: 1px solid rgba(62, 207, 142, 0.18);\r\n  }.roi-wrap .preview-inline-bar-track {\r\n    display: flex;\r\n    height: 14px;\r\n    border-radius: 8px;\r\n    overflow: hidden;\r\n    background: var(--magnolia-2);\r\n    gap: 3px;\r\n  }.roi-wrap .preview-inline-bar-cost {\r\n    background: linear-gradient(90deg, #C7CEDD, #AEB8CC);\r\n    border-radius: 6px;\r\n    width: 30%;\r\n    transition: width 0.5s ease;\r\n  }.roi-wrap .preview-inline-bar-gain {\r\n    background: linear-gradient(90deg, var(--ocean), var(--ocean-dark));\r\n    border-radius: 6px;\r\n    width: 70%;\r\n    transition: width 0.5s ease;\r\n  }.roi-wrap .preview-inline-bar-legend {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    margin-top: 10px;\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    flex-wrap: wrap;\r\n    gap: 8px;\r\n  }.roi-wrap .preview-inline-bar-legend strong {\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .preview-inline-bar-legend .dot {\r\n    display: inline-block;\r\n    width: 8px; height: 8px;\r\n    border-radius: 2px;\r\n    margin-right: 5px;\r\n    vertical-align: middle;\r\n  }.roi-wrap .preview-inline-bar-legend .dot-cost { background: #AEB8CC; }.roi-wrap .preview-inline-bar-legend .dot-gain { background: var(--ocean); }.roi-wrap .preview-inline-trust {\r\n    list-style: none;\r\n    padding: 0;\r\n    margin: 0;\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr 1fr;\r\n    gap: 10px;\r\n  }.roi-wrap .preview-inline-trust li {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    font-size: 11.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    line-height: 1.3;\r\n  }.roi-wrap .preview-inline-trust svg {\r\n    width: 12px;\r\n    height: 12px;\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n  }\/* Sur mobile : trust en colonne, KPIs c\u00f4te \u00e0 c\u00f4te centr\u00e9s *\/\r\n  @media (max-width: 600px){.roi-wrap .preview-inline-row { justify-content: center; flex-direction: column; align-items: stretch; }.roi-wrap .preview-inline-kpis { justify-content: center; }.roi-wrap .preview-inline-trust { grid-template-columns: 1fr; }\r\n  }\/* \u00c9tapes empil\u00e9es : les champs de chaque carte se rangent en grille adaptative.\r\n     auto-fit + minmax \u2192 3-4 champs par ligne en grand \u00e9cran, se r\u00e9organise seul. *\/\r\n  .roi-wrap .inputs-grid .fields-pool {\r\n    display: grid;\r\n    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));\r\n    gap: 22px 18px;\r\n    align-items: start;\r\n  }\/* Les champs \"larges\" (toggles SaaS, syst\u00e8mes actuels) occupent toute la largeur *\/\r\n  .roi-wrap .inputs-grid .fields-pool .field-span {\r\n    grid-column: 1 \/ -1;\r\n  }@media (max-width: 600px){.roi-wrap .inputs-grid .fields-pool { grid-template-columns: 1fr; }\r\n  }\/* \u00c9tape 3 - Gains : co\u00fbt horaire pleine largeur en haut, puis 2 sliders c\u00f4te \u00e0 c\u00f4te (50\/50 sur toute la largeur) *\/\r\n  .roi-wrap .inputs-grid .fields-pool.fields-pool--gains { grid-template-columns: 1fr 1fr; }.roi-wrap .inputs-grid .fields-pool.fields-pool--gains .field-span { grid-column: 1 \/ -1; }@media (max-width: 760px){.roi-wrap .inputs-grid .fields-pool.fields-pool--gains { grid-template-columns: 1fr; }\r\n  }\/* === S\u00c9LECTEUR HORIZON (pill buttons) === *\/\r\n  .roi-wrap .horizon-picker {\r\n    margin-bottom: 14px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 12px;\r\n  }\/* === CONSENTEMENT RGPD === *\/\r\n  .roi-wrap .privacy-consent {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 10px;\r\n    margin: 16px 0;\r\n    padding: 12px 14px;\r\n    background: rgba(255, 255, 255, 0.06);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 8px;\r\n    font-size: 12px;\r\n    line-height: 1.5;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .privacy-consent:hover { background: rgba(255, 255, 255, 0.09); }.roi-wrap .privacy-consent input[type=\"checkbox\"] {\r\n    width: 16px; height: 16px;\r\n    margin-top: 2px;\r\n    accent-color: var(--ocean);\r\n    cursor: pointer;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .privacy-consent a {\r\n    color: var(--ocean);\r\n    text-decoration: underline;\r\n    text-underline-offset: 2px;\r\n  }.roi-wrap .privacy-consent a:hover { color: var(--white); }\/* === CHAMP OPTIONNEL \"Syst\u00e8mes actuels\" (pilier co\u00fbt de l'inaction) === *\/\r\n  .roi-wrap .field-optional-tag {\r\n    display: inline-block;\r\n    margin-left: 6px;\r\n    padding: 2px 7px;\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    border-radius: 100px;\r\n    font-size: 9.5px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.06em;\r\n    text-transform: uppercase;\r\n    vertical-align: middle;\r\n  }.roi-wrap .field-hint-bar {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 8px;\r\n    margin-top: 8px;\r\n    padding: 9px 12px;\r\n    background: rgba(62, 207, 142, 0.08);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 8px 8px 0;\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.45;\r\n  }.roi-wrap .field-hint-bar svg {\r\n    color: var(--ocean-dark);\r\n    flex-shrink: 0;\r\n    margin-top: 2px;\r\n  }.roi-wrap .field-hint-bar strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n  }\/* === TOGGLE MAINTENANCE SAAS === *\/\r\n  .roi-wrap .field-maint-disabled .input-suffix {\r\n    opacity: 0.45;\r\n    pointer-events: none;\r\n  }.roi-wrap .field-maint-disabled label {\r\n    color: var(--wheelwright);\r\n  }.roi-wrap .maint-saas-toggle {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 10px;\r\n    margin-top: 10px;\r\n    padding: 10px 12px;\r\n    background: var(--magnolia);\r\n    border-radius: 8px;\r\n    cursor: pointer;\r\n    transition: background 0.15s;\r\n  }.roi-wrap .maint-saas-toggle:hover { background: var(--ocean-soft); }.roi-wrap .maint-saas-toggle input[type=\"checkbox\"] {\r\n    width: 16px;\r\n    height: 16px;\r\n    margin-top: 3px;\r\n    accent-color: var(--ocean-dark);\r\n    cursor: pointer;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .maint-saas-text {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 2px;\r\n    font-size: 12.5px;\r\n    line-height: 1.4;\r\n  }.roi-wrap .maint-saas-text strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n  }.roi-wrap .maint-saas-hint {\r\n    color: var(--wheelwright);\r\n    font-size: 11.5px;\r\n  }.roi-wrap .maint-axelor-note {\r\n    display: block;\r\n    margin-top: 10px;\r\n    padding: 11px 14px;\r\n    background: var(--ocean-soft);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 8px;\r\n    font-size: 12px;\r\n    line-height: 1.5;\r\n    color: var(--navy);\r\n  }.roi-wrap .maint-axelor-note strong { font-weight: 600; }\/* === SCENARIO PICKER === *\/\r\n  .roi-wrap .scenario-picker {\r\n    margin-bottom: 24px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.10);\r\n    border-radius: 12px;\r\n  }.roi-wrap .scenario-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    margin-bottom: 10px;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .scenario-options {\r\n    display: grid;\r\n    grid-template-columns: repeat(3, 1fr);\r\n    gap: 6px;\r\n    background: rgba(0, 0, 0, 0.25);\r\n    border-radius: 10px;\r\n    padding: 4px;\r\n  }.roi-wrap .scenario-option {\r\n    padding: 9px 4px;\r\n    border-radius: 8px;\r\n    color: rgba(255, 255, 255, 0.65);\r\n    cursor: pointer;\r\n    transition: all 0.18s;\r\n    user-select: none;\r\n    text-align: center;\r\n  }.roi-wrap .scenario-option-num { font-size: 13px; font-weight: 700; line-height: 1.2; }.roi-wrap .scenario-option-hint {\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    margin-top: 2px;\r\n    opacity: 0.7;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n  }.roi-wrap .scenario-option:hover:not(.active) {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    color: var(--white);\r\n  }.roi-wrap .scenario-option.active {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.25);\r\n  }.roi-wrap .scenario-option.active .scenario-option-hint { color: var(--navy); opacity: 0.8; }.roi-wrap .scenario-option.conservative.active {\r\n    background: #5FE3D0;\r\n    box-shadow: 0 2px 8px rgba(95, 227, 208, 0.30);\r\n  }.roi-wrap .scenario-option.optimistic.active {\r\n    background: #F4C95D;\r\n    box-shadow: 0 2px 8px rgba(244, 201, 93, 0.30);\r\n  }.roi-wrap .scenario-info {\r\n    margin-top: 10px;\r\n    font-size: 11.5px;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    line-height: 1.45;\r\n  }.roi-wrap .scenario-info strong { color: rgba(255, 255, 255, 0.85); font-weight: 600; }.roi-wrap .horizon-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    margin-bottom: 10px;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .horizon-options {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, 1fr);\r\n    gap: 6px;\r\n    background: rgba(0, 0, 0, 0.25);\r\n    border-radius: 10px;\r\n    padding: 4px;\r\n  }.roi-wrap .horizon-option {\r\n    padding: 9px 4px;\r\n    border-radius: 8px;\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-size: 13px;\r\n    font-weight: 600;\r\n    text-align: center;\r\n    cursor: pointer;\r\n    transition: all 0.18s;\r\n    user-select: none;\r\n  }.roi-wrap .horizon-option-num {\r\n    font-size: 14px;\r\n    font-weight: 700;\r\n    line-height: 1.2;\r\n  }.roi-wrap .horizon-option-hint {\r\n    font-size: 10px;\r\n    font-weight: 500;\r\n    margin-top: 2px;\r\n    opacity: 0.7;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n  }.roi-wrap .horizon-option:hover:not(.active) {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    color: var(--white);\r\n  }.roi-wrap .horizon-option.active {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.25);\r\n  }.roi-wrap .horizon-option.active .horizon-option-hint {\r\n    color: var(--navy);\r\n    opacity: 0.8;\r\n  }\/* === CARDS (LEFT) === *\/\r\n  .roi-wrap .card {\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    padding: 32px;\r\n    margin-bottom: 24px;\r\n    box-shadow: var(--shadow-md);\r\n    border: 1px solid var(--line);\r\n  }.roi-wrap .card-head {\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 16px;\r\n    padding-bottom: 24px;\r\n    margin-bottom: 24px;\r\n    border-bottom: 1px solid var(--line);\r\n  }.roi-wrap .card-icon {\r\n    flex-shrink: 0;\r\n    width: 44px;\r\n    height: 44px;\r\n    border-radius: 12px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    background: var(--ocean-soft);\r\n  }.roi-wrap .card-icon svg {\r\n    width: 22px;\r\n    height: 22px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .card-step {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 10px;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    letter-spacing: 0.14em;\r\n    text-transform: uppercase;\r\n    color: var(--ocean);\r\n    margin-bottom: 8px;\r\n  }.roi-wrap .card-step .step-num {\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    padding: 4px 9px;\r\n    border-radius: 6px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.08em;\r\n  }.roi-wrap .card-step .step-name {\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n  }.roi-wrap .card-title {\r\n    font-size: 19px;\r\n    font-weight: 600;\r\n    color: var(--navy);\r\n    margin-bottom: 4px;\r\n    letter-spacing: -0.01em;\r\n  }.roi-wrap .card-subtitle {\r\n    font-size: 13px;\r\n    color: var(--wheelwright);\r\n    font-weight: 400;\r\n  }\/* === FIELDS === *\/\r\n  .roi-wrap .field-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 16px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .field-row:last-child {\r\n    margin-bottom: 0;\r\n  }\/* Field-row sp\u00e9cial : slider \u00e0 gauche sur 2 rang\u00e9es, 2 champs courts \u00e0 droite *\/\r\n  .roi-wrap .field-row-slider {\r\n    grid-template-columns: 1fr 1fr;\r\n    grid-template-rows: auto auto;\r\n    align-items: start;\r\n  }\/* Pleine largeur : 2 sliders c\u00f4te \u00e0 c\u00f4te (hauteurs proches) sur la 1re ligne,\r\n     co\u00fbt horaire compact en 2e ligne \u2192 plus de vide sous le slider de gauche. *\/\r\n  .roi-wrap .field-row-slider .field-slider-wrap { grid-column: 1; grid-row: 1; }.roi-wrap .field-row-slider > .field:nth-child(3) { grid-column: 2; grid-row: 1; }\/* slider fiabilit\u00e9 *\/\r\n  .roi-wrap .field-row-slider > .field:nth-child(2) { grid-column: 1; grid-row: 2; }\/* co\u00fbt horaire *\/\r\n  @media (max-width: 600px){.roi-wrap .field-row-slider {\r\n      grid-template-columns: 1fr;\r\n      grid-template-rows: auto auto auto;\r\n    }\/* Annule le placement explicite desktop : chaque champ reprend sa ligne naturelle *\/\r\n  .roi-wrap .field-row-slider .field-slider-wrap { grid-column: 1; grid-row: auto; }.roi-wrap .field-row-slider > .field:nth-child(2) { grid-column: 1; grid-row: auto; }.roi-wrap .field-row-slider > .field:nth-child(3) { grid-column: 1; grid-row: auto; }\r\n  }.roi-wrap .field {\r\n    display: flex;\r\n    flex-direction: column;\r\n  }.roi-wrap .field-full {\r\n    grid-column: 1 \/ -1;\r\n  }.roi-wrap label {\r\n    display: flex;\r\n    align-items: baseline;\r\n    flex-wrap: wrap;\r\n    gap: 5px;\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    margin-bottom: 9px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .label-help {\r\n    font-weight: 400;\r\n    color: #98A0BC;\r\n    font-size: 11.5px;\r\n  }.roi-wrap .input-wrap {\r\n    position: relative;\r\n  }.roi-wrap input[type=\"number\"], .roi-wrap input[type=\"text\"], .roi-wrap input[type=\"email\"], .roi-wrap input[type=\"tel\"], .roi-wrap select {\r\n    width: 100%;\r\n    padding: 13px 16px;\r\n    border: 1.5px solid var(--line-strong);\r\n    border-radius: var(--radius-sm);\r\n    font-size: 15px;\r\n    font-family: 'Poppins', sans-serif;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    background: var(--white);\r\n    transition: all 0.15s ease;\r\n  }.roi-wrap input::placeholder {\r\n    color: #B0B7CC;\r\n    font-weight: 400;\r\n  }.roi-wrap input:focus, .roi-wrap select:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n    box-shadow: 0 0 0 4px var(--ocean-soft);\r\n  }.roi-wrap input:hover:not(:focus), .roi-wrap select:hover:not(:focus) {\r\n    border-color: rgba(1, 1, 101, 0.24);\r\n  }.roi-wrap .input-prefix {\r\n    position: relative;\r\n  }\/* Pr\u00e9fixe via span enfant (fiable cross-browser, mis \u00e0 jour en JS) *\/\r\n  .roi-wrap .input-prefix .prefix-symbol {\r\n    position: absolute;\r\n    left: 14px;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    font-size: 15px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    pointer-events: none;\r\n    z-index: 2;\r\n    white-space: nowrap;\r\n  }.roi-wrap .input-prefix input {\r\n    padding-left: 34px;\r\n  }.roi-wrap .input-prefix.wide-prefix input {\r\n    padding-left: 52px;\r\n  }.roi-wrap .input-prefix.xwide-prefix input {\r\n    padding-left: 70px;\r\n  }.roi-wrap .input-suffix {\r\n    position: relative;\r\n  }.roi-wrap .input-suffix::after {\r\n    content: attr(data-suffix);\r\n    position: absolute;\r\n    right: 16px;\r\n    top: 50%;\r\n    transform: translateY(-50%);\r\n    font-size: 13px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    pointer-events: none;\r\n  }.roi-wrap .input-suffix input {\r\n    padding-right: 40px;\r\n  }\/* === SLIDER POURCENTAGE === *\/\r\n  .roi-wrap .slider-block {\r\n    background: var(--magnolia-2);\r\n    border: 1px solid var(--line);\r\n    border-radius: 12px;\r\n    padding: 14px 16px;\r\n    transition: border-color 0.2s;\r\n  }.roi-wrap .slider-block:hover { border-color: var(--line-strong); }.roi-wrap .slider-block:focus-within {\r\n    border-color: var(--ocean);\r\n    background: var(--white);\r\n    box-shadow: 0 0 0 3px rgba(62, 207, 142, 0.10);\r\n  }.roi-wrap .slider-value-row {\r\n    display: flex;\r\n    align-items: baseline;\r\n    justify-content: space-between;\r\n    gap: 10px;\r\n    margin-bottom: 12px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .slider-value {\r\n    display: inline-flex;\r\n    align-items: baseline;\r\n    gap: 4px;\r\n    color: var(--navy);\r\n  }.roi-wrap .slider-value-num {\r\n    font-size: 28px;\r\n    font-weight: 700;\r\n    line-height: 1;\r\n    color: var(--ocean-dark);\r\n    letter-spacing: -0.02em;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .slider-value-unit {\r\n    font-size: 16px;\r\n    font-weight: 600;\r\n    color: var(--ocean-dark);\r\n  }.roi-wrap .slider-equiv {\r\n    font-size: 12.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    text-align: right;\r\n    line-height: 1.4;\r\n  }\/* L'input range stylis\u00e9 *\/\r\n  .roi-wrap .slider-input {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n    width: 100%;\r\n    height: 6px;\r\n    border-radius: 100px;\r\n    background: linear-gradient(to right,\r\n      var(--ocean) 0%,\r\n      var(--ocean) var(--slider-fill, 25%),\r\n      rgba(1, 1, 101, 0.12) var(--slider-fill, 25%),\r\n      rgba(1, 1, 101, 0.12) 100%);\r\n    outline: none;\r\n    margin: 0;\r\n    cursor: pointer;\r\n  }.roi-wrap .slider-input::-webkit-slider-thumb {\r\n    -webkit-appearance: none;\r\n    appearance: none;\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 50%;\r\n    background: var(--white);\r\n    border: 3px solid var(--ocean);\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.40);\r\n    cursor: grab;\r\n    transition: transform 0.15s, box-shadow 0.15s;\r\n  }.roi-wrap .slider-input::-webkit-slider-thumb:hover {\r\n    transform: scale(1.15);\r\n    box-shadow: 0 4px 14px rgba(62, 207, 142, 0.55);\r\n  }.roi-wrap .slider-input:active::-webkit-slider-thumb { cursor: grabbing; transform: scale(1.2); }.roi-wrap .slider-input::-moz-range-thumb {\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 50%;\r\n    background: var(--white);\r\n    border: 3px solid var(--ocean);\r\n    box-shadow: 0 2px 8px rgba(62, 207, 142, 0.40);\r\n    cursor: grab;\r\n    transition: transform 0.15s;\r\n  }.roi-wrap .slider-input::-moz-range-thumb:hover { transform: scale(1.15); }\/* \u00c9chelle sous le slider *\/\r\n  .roi-wrap .slider-scale {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    margin-top: 10px;\r\n    font-size: 10.5px;\r\n    color: var(--wheelwright);\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.05em;\r\n    line-height: 1.3;\r\n  }.roi-wrap .slider-scale span { flex: 1; text-align: left; }.roi-wrap .slider-scale .slider-scale-mid { text-align: center; }.roi-wrap .slider-scale .slider-scale-right { text-align: right; }.roi-wrap .slider-scale strong {\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    font-size: 11px;\r\n    letter-spacing: 0;\r\n    text-transform: none;\r\n  }\/* Estimation affich\u00e9e sous le slider de fiabilit\u00e9 *\/\r\n  .roi-wrap .slider-estimate {\r\n    margin-top: 14px;\r\n    padding: 10px 14px;\r\n    background: var(--ocean-soft);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 8px 8px 0;\r\n    font-size: 12.5px;\r\n    color: var(--navy);\r\n    line-height: 1.4;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n  }.roi-wrap .slider-estimate strong {\r\n    color: var(--ocean-dark);\r\n    font-weight: 700;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .slider-estimate-icon {\r\n    flex-shrink: 0;\r\n    font-size: 14px;\r\n  }\/* === TOGGLE === *\/\r\n  .roi-wrap .toggle-card {\r\n    background: var(--magnolia);\r\n    border: 1px solid var(--line);\r\n    border-radius: var(--radius);\r\n    padding: 18px 20px;\r\n    margin-bottom: 20px;\r\n    cursor: pointer;\r\n    transition: all 0.2s ease;\r\n  }.roi-wrap .toggle-card:hover {\r\n    border-color: var(--line-strong);\r\n  }.roi-wrap .toggle-card.active {\r\n    background: var(--ocean-soft);\r\n    border-color: var(--ocean);\r\n  }.roi-wrap .toggle-row {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 14px;\r\n  }.roi-wrap .toggle-switch {\r\n    flex-shrink: 0;\r\n    width: 42px;\r\n    height: 24px;\r\n    background: rgba(1, 1, 101, 0.18);\r\n    border-radius: 999px;\r\n    position: relative;\r\n    transition: background 0.2s ease;\r\n  }.roi-wrap .toggle-switch::after {\r\n    content: '';\r\n    position: absolute;\r\n    top: 3px;\r\n    left: 3px;\r\n    width: 18px;\r\n    height: 18px;\r\n    background: var(--white);\r\n    border-radius: 50%;\r\n    transition: transform 0.2s ease;\r\n    box-shadow: 0 1px 3px rgba(0,0,0,0.18);\r\n  }.roi-wrap .toggle-card.active .toggle-switch {\r\n    background: var(--ocean);\r\n  }.roi-wrap .toggle-card.active .toggle-switch::after {\r\n    transform: translateX(18px);\r\n  }.roi-wrap .toggle-text {\r\n    flex: 1;\r\n  }.roi-wrap .toggle-title {\r\n    font-size: 14px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .toggle-desc {\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n  }.roi-wrap .toggle-checkbox {\r\n    display: none;\r\n  }.roi-wrap .toggle-content {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.4s ease;\r\n  }.roi-wrap .toggle-content.show {\r\n    max-height: 600px;\r\n  }.roi-wrap .toggle-content-inner {\r\n    padding-top: 8px;\r\n  }\/* === HELP TOOLTIP === *\/\r\n  .roi-wrap .field label, .roi-wrap .advanced-field label {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    flex-wrap: wrap;\r\n  }.roi-wrap .help-icon {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    width: 16px;\r\n    height: 16px;\r\n    border-radius: 50%;\r\n    background: transparent;\r\n    color: #B0B7CC;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    cursor: help;\r\n    transition: color 0.15s, background 0.15s;\r\n    border: 1px solid #DADEEC;\r\n    margin-left: 3px;\r\n    flex-shrink: 0;\r\n    user-select: none;\r\n  }.roi-wrap .help-icon:hover {\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    border-color: var(--ocean);\r\n  }\/* Modal popup d'aide *\/\r\n  .roi-wrap .help-modal-overlay {\r\n    position: fixed;\r\n    inset: 0;\r\n    background: rgba(13, 2, 30, 0.55);\r\n    backdrop-filter: blur(4px);\r\n    opacity: 0;\r\n    pointer-events: none;\r\n    transition: opacity 0.2s;\r\n    z-index: 1500;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    padding: 24px;\r\n  }.roi-wrap .help-modal-overlay.show {\r\n    opacity: 1;\r\n    pointer-events: auto;\r\n  }.roi-wrap .help-modal {\r\n    background: var(--white);\r\n    border-radius: 16px;\r\n    max-width: 560px;\r\n    width: 100%;\r\n    max-height: 85vh;\r\n    overflow-y: auto;\r\n    box-shadow: 0 24px 60px rgba(13, 2, 30, 0.30);\r\n    transform: scale(0.95);\r\n    transition: transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1);\r\n  }.roi-wrap .help-modal-overlay.show .help-modal {\r\n    transform: scale(1);\r\n  }.roi-wrap .help-modal-head {\r\n    padding: 24px 28px 16px;\r\n    border-bottom: 1px solid var(--border);\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 16px;\r\n  }.roi-wrap .help-modal-icon {\r\n    width: 44px;\r\n    height: 44px;\r\n    border-radius: 12px;\r\n    background: var(--ocean-soft);\r\n    color: var(--ocean-dark);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    font-size: 20px;\r\n    flex-shrink: 0;\r\n    font-weight: 700;\r\n  }.roi-wrap .help-modal-title-wrap { flex: 1; min-width: 0; }.roi-wrap .help-modal-eyebrow {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .help-modal-title {\r\n    font-size: 19px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    line-height: 1.3;\r\n  }.roi-wrap .help-modal-close {\r\n    width: 32px;\r\n    height: 32px;\r\n    border-radius: 50%;\r\n    background: var(--magnolia);\r\n    border: none;\r\n    cursor: pointer;\r\n    color: var(--wheelwright);\r\n    font-size: 18px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: all 0.15s;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .help-modal-close:hover {\r\n    background: var(--navy);\r\n    color: var(--white);\r\n  }.roi-wrap .help-modal-body {\r\n    padding: 20px 28px 24px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.65;\r\n    font-size: 14.5px;\r\n  }.roi-wrap .help-modal-body p { margin-bottom: 12px; }.roi-wrap .help-modal-body p:last-child { margin-bottom: 0; }.roi-wrap .help-modal-body strong { color: var(--navy); font-weight: 600; }.roi-wrap .help-modal-body .formula-box {\r\n    background: var(--magnolia);\r\n    border-left: 3px solid var(--ocean);\r\n    border-radius: 0 10px 10px 0;\r\n    padding: 14px 16px;\r\n    margin: 14px 0;\r\n    font-family: 'Chakra Petch', monospace;\r\n    font-size: 13px;\r\n    color: var(--navy);\r\n  }.roi-wrap .help-modal-body .formula-box .formula-label {\r\n    font-family: 'Poppins', sans-serif;\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .help-modal-body .example-box {\r\n    background: rgba(62, 207, 142, 0.06);\r\n    border: 1px solid rgba(62, 207, 142, 0.20);\r\n    border-radius: 10px;\r\n    padding: 14px 16px;\r\n    margin: 14px 0;\r\n    font-size: 13.5px;\r\n  }.roi-wrap .help-modal-body .example-box .example-label {\r\n    font-size: 11px;\r\n    font-weight: 600;\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.08em;\r\n    color: var(--ocean-dark);\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .results {\r\n    background: linear-gradient(135deg, var(--navy-dark) 0%, var(--navy) 100%);\r\n    border-radius: var(--radius-lg);\r\n    padding: 32px;\r\n    box-shadow: var(--shadow-lg);\r\n    color: var(--white);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n  }.roi-wrap .results-head {\r\n    margin-bottom: 28px;\r\n    padding-bottom: 22px;\r\n    border-bottom: 1px solid rgba(255, 255, 255, 0.08);\r\n  }.roi-wrap .results-eyebrow {\r\n    font-size: 11px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 8px;\r\n  }.roi-wrap .results-title {\r\n    font-size: 22px;\r\n    font-weight: 600;\r\n    color: var(--white);\r\n    letter-spacing: -0.01em;\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .results-subtitle {\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.6);\r\n    font-weight: 300;\r\n  }.roi-wrap .live-dot {\r\n    display: inline-block;\r\n    width: 6px;\r\n    height: 6px;\r\n    background: var(--ocean);\r\n    border-radius: 50%;\r\n    margin-right: 6px;\r\n    animation: pulse 2s ease-in-out infinite;\r\n  }@keyframes pulse{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.5; transform: scale(0.8); }\r\n  }\/* === KPIs === *\/\r\n  .roi-wrap .kpi-grid {\r\n    display: grid;\r\n    grid-template-columns: 1.4fr 1fr 1fr 1fr;\r\n    gap: 12px;\r\n    margin-bottom: 24px;\r\n  }\/* KPI hero (le ROI vedette) *\/\r\n  .roi-wrap .kpi.kpi-hero {\r\n    background: linear-gradient(135deg, rgba(62, 207, 142, 0.18) 0%, rgba(62, 207, 142, 0.06) 100%);\r\n    border: 1.5px solid rgba(62, 207, 142, 0.35);\r\n    position: relative;\r\n    overflow: hidden;\r\n  }.roi-wrap .kpi.kpi-hero::before {\r\n    content: \"\"; position: absolute;\r\n    top: -50%; right: -30%;\r\n    width: 200px; height: 200px;\r\n    background: radial-gradient(circle, rgba(62, 207, 142, 0.25) 0%, transparent 70%);\r\n    pointer-events: none;\r\n  }.roi-wrap .kpi.kpi-hero .kpi-label {\r\n    color: rgba(255, 255, 255, 0.85);\r\n    font-weight: 600;\r\n  }.roi-wrap .kpi.kpi-hero .kpi-value {\r\n    font-size: 36px;\r\n    color: var(--ocean);\r\n    line-height: 1;\r\n  }.roi-wrap .kpi-badge {\r\n    display: inline-flex; align-items: center; gap: 5px;\r\n    padding: 3px 9px;\r\n    background: var(--ocean);\r\n    color: var(--navy);\r\n    border-radius: 100px;\r\n    font-size: 10px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.04em;\r\n    margin-top: 8px;\r\n    opacity: 0;\r\n    transition: opacity 0.3s;\r\n    text-transform: uppercase;\r\n  }.roi-wrap .kpi-badge.show { opacity: 1; }\/* === ROW 2 COLONNES POUR CHARTS \/ BREAKDOWNS === *\/\r\n  .roi-wrap .results-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 18px;\r\n    margin-bottom: 22px;\r\n  }.roi-wrap .results-row > * { min-width: 0; }\/* Garde-fou : un canvas ne d\u00e9passe jamais son conteneur (s\u00e9curit\u00e9 si Chart.js tarde\/\u00e9choue) *\/\r\n  .roi-wrap canvas { max-width: 100%; }.roi-wrap .results-row > .chart-block, .roi-wrap .results-row > .breakdown {\r\n    margin: 0;\r\n    height: 100%;\r\n  }@media (max-width: 1100px){.roi-wrap .results-row { grid-template-columns: 1fr; gap: 16px; }\r\n  }.roi-wrap .kpi {\r\n    background: rgba(255, 255, 255, 0.04);\r\n    border: 1px solid rgba(255, 255, 255, 0.08);\r\n    border-radius: var(--radius);\r\n    padding: 18px 16px;\r\n    transition: all 0.25s ease;\r\n  }.roi-wrap .kpi:hover {\r\n    background: rgba(255, 255, 255, 0.06);\r\n    border-color: rgba(255, 255, 255, 0.14);\r\n  }.roi-wrap .kpi-label {\r\n    font-size: 11px;\r\n    color: rgba(255, 255, 255, 0.55);\r\n    text-transform: uppercase;\r\n    letter-spacing: 0.14em;\r\n    margin-bottom: 10px;\r\n    font-weight: 500;\r\n  }.roi-wrap .kpi-value {\r\n    font-size: 24px;\r\n    font-weight: 600;\r\n    color: var(--white);\r\n    line-height: 1.05;\r\n    letter-spacing: -0.02em;\r\n  }.roi-wrap .kpi-value.green { color: var(--ocean); }.roi-wrap .kpi-value.negative, .roi-wrap .kpi-value.green.negative { color: #F4C95D; }.roi-wrap .kpi.kpi-hero .kpi-value.negative { color: #F4C95D; }\/* Badge variante warning (ROI extr\u00eame) *\/\r\n  .roi-wrap .kpi-badge.warning {\r\n    background: #F4C95D;\r\n    color: #4a3a00;\r\n  }\/* Bandeau de garde-fou ROI extr\u00eame *\/\r\n  .roi-wrap .roi-warning {\r\n    display: none;\r\n    align-items: flex-start;\r\n    gap: 12px;\r\n    padding: 14px 16px;\r\n    background: rgba(244, 201, 93, 0.12);\r\n    border: 1px solid rgba(244, 201, 93, 0.35);\r\n    border-left: 4px solid #F4C95D;\r\n    border-radius: 10px;\r\n    margin-bottom: 24px;\r\n    color: rgba(255, 255, 255, 0.92);\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }.roi-wrap .roi-warning.show { display: flex; }.roi-wrap .roi-warning svg { color: #F4C95D; flex-shrink: 0; margin-top: 1px; }.roi-wrap .roi-warning strong { color: #F4C95D; font-weight: 700; }.roi-wrap .roi-warning em { color: var(--white); font-style: normal; font-weight: 500; }.roi-wrap .kpi-value.cyan { color: #5FE3D0; }.roi-wrap .kpi-value.amber { color: #F4C95D; }.roi-wrap .kpi-trend {\r\n    font-size: 12px;\r\n    color: rgba(255, 255, 255, 0.5);\r\n    margin-top: 6px;\r\n    font-weight: 400;\r\n  }\/* === CHARTS === *\/\r\n  .roi-wrap .chart-block {\r\n    background: rgba(255, 255, 255, 0.03);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n    border-radius: var(--radius);\r\n    padding: 22px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .chart-title {\r\n    font-size: 13px;\r\n    font-weight: 500;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    margin-bottom: 4px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .chart-subtitle {\r\n    font-size: 11px;\r\n    color: rgba(255, 255, 255, 0.45);\r\n    margin-bottom: 18px;\r\n    font-weight: 300;\r\n  }.roi-wrap .chart-wrap {\r\n    position: relative;\r\n    height: 200px;\r\n  }.roi-wrap .chart-wrap.donut {\r\n    height: 220px;\r\n  }\/* === BREAKDOWN === *\/\r\n  .roi-wrap .breakdown {\r\n    background: rgba(255, 255, 255, 0.03);\r\n    border: 1px solid rgba(255, 255, 255, 0.06);\r\n    border-radius: var(--radius);\r\n    padding: 22px;\r\n    margin-bottom: 16px;\r\n  }.roi-wrap .breakdown-title {\r\n    font-size: 13px;\r\n    font-weight: 500;\r\n    color: rgba(255, 255, 255, 0.85);\r\n    margin-bottom: 16px;\r\n    letter-spacing: -0.005em;\r\n  }.roi-wrap .breakdown-row {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 11px 0;\r\n    border-bottom: 1px solid rgba(255, 255, 255, 0.05);\r\n    font-size: 13px;\r\n  }.roi-wrap .breakdown-row:last-child {\r\n    border-bottom: none;\r\n  }.roi-wrap .breakdown-label {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-weight: 400;\r\n  }.roi-wrap .breakdown-value {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n    font-variant-numeric: tabular-nums;\r\n  }.roi-wrap .breakdown-row.total {\r\n    margin-top: 8px;\r\n    padding-top: 16px;\r\n    border-top: 1px solid rgba(255, 255, 255, 0.14);\r\n    border-bottom: none;\r\n  }.roi-wrap .breakdown-row.total .breakdown-label {\r\n    color: var(--white);\r\n    font-weight: 500;\r\n    font-size: 14px;\r\n  }.roi-wrap .breakdown-row.total .breakdown-value {\r\n    font-size: 17px;\r\n    font-weight: 600;\r\n  }.roi-wrap .breakdown-row.total.gain .breakdown-value {\r\n    color: var(--ocean);\r\n  }\/* === CTA === *\/\r\n  .roi-wrap .cta {\r\n    background: linear-gradient(135deg, var(--ocean) 0%, #2BB57A 100%);\r\n    border-radius: var(--radius);\r\n    padding: 28px;\r\n    margin-top: 24px;\r\n    color: var(--white);\r\n    position: relative;\r\n    overflow: hidden;\r\n  }.roi-wrap .cta::before {\r\n    content: \"\"; position: absolute;\r\n    top: -100px; right: -100px;\r\n    width: 280px; height: 280px;\r\n    background: radial-gradient(circle, rgba(255, 255, 255, 0.18) 0%, transparent 70%);\r\n    pointer-events: none;\r\n  }.roi-wrap .cta-head {\r\n    position: relative; z-index: 1;\r\n    margin-bottom: 20px;\r\n  }.roi-wrap .cta-eyebrow {\r\n    display: inline-flex; align-items: center; gap: 6px;\r\n    font-size: 10.5px;\r\n    font-weight: 700;\r\n    letter-spacing: 0.16em;\r\n    text-transform: uppercase;\r\n    color: var(--navy);\r\n    background: rgba(255, 255, 255, 0.30);\r\n    padding: 4px 10px;\r\n    border-radius: 100px;\r\n    margin-bottom: 12px;\r\n  }.roi-wrap .cta-eyebrow-dot {\r\n    width: 6px; height: 6px;\r\n    background: var(--navy);\r\n    border-radius: 50%;\r\n    animation: pulse-cta 2s infinite;\r\n  }@keyframes pulse-cta{\r\n    0%, 100% { opacity: 1; transform: scale(1); }\r\n    50% { opacity: 0.4; transform: scale(1.4); }\r\n  }.roi-wrap .cta h3 {\r\n    font-size: 20px;\r\n    font-weight: 600;\r\n    margin-bottom: 6px;\r\n    letter-spacing: -0.01em;\r\n  }.roi-wrap .cta p {\r\n    font-size: 13px;\r\n    color: rgba(255, 255, 255, 0.88);\r\n    margin-bottom: 0;\r\n    font-weight: 300;\r\n  }\/* Preuve sociale *\/\r\n  .roi-wrap .cta-social-proof {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n    padding: 12px 14px;\r\n    background: rgba(255, 255, 255, 0.14);\r\n    border-radius: 10px;\r\n    margin-bottom: 18px;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .cta-social-avatars {\r\n    display: flex;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .cta-social-icon {\r\n    width: 38px; height: 38px;\r\n    border-radius: 50%;\r\n    background: rgba(255, 255, 255, 0.25);\r\n    color: var(--navy);\r\n    display: flex; align-items: center; justify-content: center;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .cta-avatar {\r\n    width: 26px; height: 26px;\r\n    border-radius: 50%;\r\n    border: 2px solid var(--ocean);\r\n    color: var(--white);\r\n    font-size: 11px;\r\n    font-weight: 700;\r\n    display: flex; align-items: center; justify-content: center;\r\n    margin-left: -8px;\r\n  }.roi-wrap .cta-avatar:first-child { margin-left: 0; }.roi-wrap .cta-social-text {\r\n    font-size: 12.5px;\r\n    color: rgba(255, 255, 255, 0.95);\r\n    line-height: 1.4;\r\n  }.roi-wrap .cta-social-text strong { color: var(--white); font-weight: 600; }.roi-wrap .form-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 12px;\r\n    margin-bottom: 12px;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .field-required {\r\n    color: var(--navy);\r\n    font-weight: 700;\r\n    font-size: 13px;\r\n  }.roi-wrap .field-optional {\r\n    color: rgba(255, 255, 255, 0.65);\r\n    font-weight: 400;\r\n    font-size: 10.5px;\r\n    font-style: italic;\r\n  }.roi-wrap .cta label {\r\n    color: var(--white);\r\n    font-size: 12px;\r\n    font-weight: 500;\r\n    margin-bottom: 5px;\r\n  }.roi-wrap .cta input, .roi-wrap .cta select {\r\n    background: rgba(255, 255, 255, 0.96);\r\n    border: 1.5px solid transparent;\r\n    color: var(--navy);\r\n    padding: 11px 14px;\r\n    font-size: 14px;\r\n  }.roi-wrap .cta input:focus, .roi-wrap .cta select:focus {\r\n    border-color: var(--white);\r\n    box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.22);\r\n  }.roi-wrap .btn-submit {\r\n    width: 100%;\r\n    padding: 16px 24px;\r\n    background: var(--navy);\r\n    color: var(--white);\r\n    border: none;\r\n    border-radius: 12px;\r\n    font-size: 15px;\r\n    font-weight: 600;\r\n    font-family: 'Poppins', sans-serif;\r\n    cursor: pointer;\r\n    transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;\r\n    margin-top: 10px;\r\n    letter-spacing: -0.005em;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 10px;\r\n    box-shadow: 0 8px 22px rgba(1, 1, 101, 0.28);\r\n  }.roi-wrap .btn-submit:hover:not(:disabled) {\r\n    background: #0a0a7a;\r\n    transform: translateY(-2px);\r\n    box-shadow: 0 14px 32px rgba(1, 1, 101, 0.4);\r\n  }.roi-wrap .btn-submit:active:not(:disabled) {\r\n    transform: translateY(0);\r\n  }.roi-wrap .btn-submit:disabled {\r\n    background: rgba(1, 1, 101, 0.25);\r\n    cursor: not-allowed;\r\n    box-shadow: none;\r\n  }.roi-wrap .btn-arrow {\r\n    transition: transform 0.2s ease;\r\n  }.roi-wrap .btn-submit:hover .btn-arrow {\r\n    transform: translateX(3px);\r\n  }\/* Signaux de confiance sous le bouton *\/\r\n  .roi-wrap .cta-trust {\r\n    display: flex;\r\n    justify-content: center;\r\n    gap: 18px;\r\n    margin-top: 14px;\r\n    flex-wrap: wrap;\r\n    position: relative; z-index: 1;\r\n  }.roi-wrap .cta-trust-item {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 6px;\r\n    font-size: 11.5px;\r\n    color: rgba(255, 255, 255, 0.92);\r\n    font-weight: 500;\r\n  }.roi-wrap .cta-trust-item svg {\r\n    width: 14px;\r\n    height: 14px;\r\n    flex-shrink: 0;\r\n    opacity: 0.95;\r\n  }.roi-wrap .success-message {\r\n    display: none;\r\n    margin-top: 14px;\r\n    padding: 14px 16px;\r\n    background: rgba(255, 255, 255, 0.14);\r\n    border: 1px solid rgba(255, 255, 255, 0.25);\r\n    border-radius: var(--radius-sm);\r\n    color: var(--white);\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }.roi-wrap .success-message.show {\r\n    display: block;\r\n  }\/* === FOOTER === *\/\r\n  .roi-wrap .methodology {\r\n    margin-top: 24px;\r\n    padding: 22px 26px;\r\n    background: rgba(255, 255, 255, 0.02);\r\n    border: 1px solid rgba(255, 255, 255, 0.05);\r\n    border-radius: var(--radius);\r\n    font-size: 12px;\r\n    color: rgba(255, 255, 255, 0.5);\r\n    line-height: 1.65;\r\n  }.roi-wrap .methodology-title {\r\n    font-size: 12.5px;\r\n    font-weight: 700;\r\n    color: rgba(255, 255, 255, 0.78);\r\n    margin-bottom: 11px;\r\n    letter-spacing: 0.01em;\r\n  }.roi-wrap .methodology p { margin-bottom: 9px; }.roi-wrap .methodology p:last-child { margin-bottom: 0; }.roi-wrap .methodology strong {\r\n    color: rgba(255, 255, 255, 0.85);\r\n    font-weight: 500;\r\n  }.roi-wrap .methodology .sep {\r\n    margin: 0 6px;\r\n    color: rgba(255, 255, 255, 0.2);\r\n  }\/* === ADVANCED PARAMETERS (collapsible) === *\/\r\n  .roi-wrap .advanced-card {\r\n    margin-top: 24px;\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    border: 1px solid var(--line);\r\n    overflow: hidden;\r\n  }.roi-wrap .advanced-head {\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    padding: 18px 24px;\r\n    cursor: pointer;\r\n    user-select: none;\r\n    transition: background 0.15s ease;\r\n  }.roi-wrap .advanced-head:hover {\r\n    background: var(--magnolia);\r\n  }.roi-wrap .advanced-head-left {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 12px;\r\n  }.roi-wrap .advanced-head-icon {\r\n    width: 36px;\r\n    height: 36px;\r\n    border-radius: 10px;\r\n    background: var(--ocean-soft);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    flex-shrink: 0;\r\n  }.roi-wrap .advanced-head-icon svg {\r\n    width: 18px;\r\n    height: 18px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .advanced-head-text-eyebrow {\r\n    font-size: 10px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .advanced-head-text h3 {\r\n    font-size: 15px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    letter-spacing: -0.01em;\r\n    line-height: 1.3;\r\n  }.roi-wrap .advanced-toggle-icon {\r\n    width: 24px;\r\n    height: 24px;\r\n    border-radius: 6px;\r\n    background: var(--magnolia);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: transform 0.2s ease;\r\n  }.roi-wrap .advanced-card.open .advanced-toggle-icon {\r\n    transform: rotate(180deg);\r\n  }.roi-wrap .advanced-toggle-icon svg {\r\n    width: 12px;\r\n    height: 12px;\r\n    stroke: var(--navy);\r\n    fill: none;\r\n    stroke-width: 2.2;\r\n    stroke-linecap: round;\r\n  }.roi-wrap .advanced-body {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.35s ease;\r\n  }.roi-wrap .advanced-card.open .advanced-body {\r\n    max-height: 800px;\r\n  }.roi-wrap .advanced-body-inner {\r\n    padding: 0 24px 24px;\r\n    border-top: 1px solid var(--line);\r\n    padding-top: 20px;\r\n  }.roi-wrap .advanced-row {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 14px;\r\n    margin-bottom: 14px;\r\n  }.roi-wrap .advanced-field label {\r\n    display: block;\r\n    font-size: 12px;\r\n    color: var(--wheelwright);\r\n    font-weight: 500;\r\n    margin-bottom: 6px;\r\n  }.roi-wrap .advanced-field input, .roi-wrap .advanced-field select {\r\n    width: 100%;\r\n    padding: 10px 12px;\r\n    border: 1px solid var(--line);\r\n    border-radius: 8px;\r\n    font-family: 'Poppins', sans-serif;\r\n    font-size: 13px;\r\n    color: var(--navy);\r\n    background: var(--white);\r\n    transition: border-color 0.15s ease;\r\n  }.roi-wrap .advanced-field input:focus, .roi-wrap .advanced-field select:focus {\r\n    outline: none;\r\n    border-color: var(--ocean);\r\n  }.roi-wrap .advanced-hint {\r\n    font-size: 11px;\r\n    color: var(--wheelwright);\r\n    line-height: 1.5;\r\n    padding-top: 8px;\r\n    border-top: 1px dashed var(--line);\r\n    margin-top: 8px;\r\n  }\/* === FAQ COMPACTE - Int\u00e9gr\u00e9e colonne gauche === *\/\r\n  .roi-wrap .faq-inline {\r\n    margin-top: 24px;\r\n    background: var(--white);\r\n    border-radius: var(--radius-lg);\r\n    padding: 28px;\r\n    box-shadow: var(--shadow-md);\r\n    border: 1px solid var(--line);\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 0 32px;\r\n    align-content: start;\r\n  }.roi-wrap .faq-inline > .faq-head-inline {\r\n    grid-column: 1 \/ -1;\r\n  }@media (max-width: 800px){.roi-wrap .faq-inline { grid-template-columns: 1fr; gap: 0; }\r\n  }.roi-wrap .faq-head-inline {\r\n    padding-bottom: 20px;\r\n    margin-bottom: 16px;\r\n    border-bottom: 1px solid var(--line);\r\n    display: flex;\r\n    align-items: flex-start;\r\n    gap: 14px;\r\n  }.roi-wrap .faq-head-icon {\r\n    flex-shrink: 0;\r\n    width: 40px;\r\n    height: 40px;\r\n    border-radius: 11px;\r\n    background: var(--ocean-soft);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n  }.roi-wrap .faq-head-icon svg {\r\n    width: 20px;\r\n    height: 20px;\r\n    stroke: var(--ocean);\r\n    fill: none;\r\n    stroke-width: 1.8;\r\n    stroke-linecap: round;\r\n    stroke-linejoin: round;\r\n  }.roi-wrap .faq-head-text-eyebrow {\r\n    font-size: 10px;\r\n    color: var(--ocean);\r\n    font-weight: 500;\r\n    letter-spacing: 0.18em;\r\n    text-transform: uppercase;\r\n    margin-bottom: 4px;\r\n  }.roi-wrap .faq-head-text h2 {\r\n    font-size: 18px;\r\n    color: var(--navy);\r\n    font-weight: 600;\r\n    letter-spacing: -0.01em;\r\n    line-height: 1.3;\r\n    margin-bottom: 2px;\r\n  }.roi-wrap .faq-head-text p {\r\n    font-size: 12.5px;\r\n    color: var(--wheelwright);\r\n    font-weight: 300;\r\n    line-height: 1.4;\r\n  }.roi-wrap .faq-item {\r\n    border-bottom: 1px solid var(--line);\r\n    transition: all 0.18s ease;\r\n    align-self: start;\r\n  }.roi-wrap .faq-item:last-child {\r\n    border-bottom: 1px solid var(--line);\r\n  }.roi-wrap .faq-item:nth-last-child(-n+2):nth-child(odd), .roi-wrap .faq-item:nth-last-child(1) {\r\n    \/* gestion fine du dernier item dans chaque colonne *\/\r\n  }.roi-wrap .faq-question {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: center;\r\n    padding: 14px 4px;\r\n    cursor: pointer;\r\n    user-select: none;\r\n    gap: 14px;\r\n    transition: color 0.15s ease;\r\n  }.roi-wrap .faq-question:hover .faq-question-text {\r\n    color: var(--ocean);\r\n  }.roi-wrap .faq-question-text {\r\n    font-size: 13.5px;\r\n    font-weight: 500;\r\n    color: var(--navy);\r\n    letter-spacing: -0.005em;\r\n    line-height: 1.4;\r\n    flex: 1;\r\n    transition: color 0.15s ease;\r\n  }.roi-wrap .faq-icon {\r\n    flex-shrink: 0;\r\n    width: 22px;\r\n    height: 22px;\r\n    border-radius: 6px;\r\n    background: var(--magnolia);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    transition: all 0.2s ease;\r\n  }.roi-wrap .faq-item.open .faq-icon {\r\n    background: var(--ocean);\r\n    transform: rotate(45deg);\r\n  }.roi-wrap .faq-icon svg {\r\n    width: 11px;\r\n    height: 11px;\r\n    stroke: var(--navy);\r\n    fill: none;\r\n    stroke-width: 2.4;\r\n    stroke-linecap: round;\r\n    transition: stroke 0.2s ease;\r\n  }.roi-wrap .faq-item.open .faq-icon svg {\r\n    stroke: var(--white);\r\n  }.roi-wrap .faq-answer {\r\n    max-height: 0;\r\n    overflow: hidden;\r\n    transition: max-height 0.35s ease, padding 0.35s ease;\r\n  }.roi-wrap .faq-item.open .faq-answer {\r\n    max-height: 600px;\r\n    padding: 0 4px 14px;\r\n  }.roi-wrap .faq-answer-content {\r\n    color: var(--wheelwright);\r\n    font-size: 12.5px;\r\n    line-height: 1.6;\r\n  }.roi-wrap .faq-answer-content strong {\r\n    color: var(--navy);\r\n    font-weight: 500;\r\n  }\/* === RESPONSIVE === *\/\r\n  @media (max-width: 1024px){.roi-wrap .layout {\r\n      grid-template-columns: 1fr;\r\n    }.roi-wrap .results {\r\n      position: static;\r\n    }\r\n  }\/* ============================================================\r\n     ============ RESPONSIVE MOBILE (3 PALIERS) =================\r\n     ============================================================ *\/\r\n  \/* ----- TABLETTE (\u2264 1024px) ----- *\/\r\n  \/* g\u00e9r\u00e9 plus haut : .layout 1fr, .results position static, .inputs-grid 1fr *\/\r\n  \/* ----- MOBILE LARGE (\u2264 768px) ----- *\/\r\n  @media (max-width: 768px){.roi-wrap .topbar { padding: 18px 20px; }.roi-wrap .container { padding: 0 16px 32px; }.roi-wrap .hero { padding: 18px 0 32px; }.roi-wrap .hero h1 { font-size: 30px; line-height: 1.1; }.roi-wrap .hero p { font-size: 14.5px; }.roi-wrap .card { padding: 22px 20px; }.roi-wrap .results { padding: 22px 20px; }.roi-wrap .field-row { grid-template-columns: 1fr; gap: 14px; }.roi-wrap .form-row { grid-template-columns: 1fr; gap: 12px; }.roi-wrap .kpi-grid { grid-template-columns: 1fr 1fr; gap: 10px; }.roi-wrap .kpi.kpi-hero { grid-column: 1 \/ -1; }.roi-wrap .kpi.kpi-hero .kpi-value { font-size: 34px; }.roi-wrap .kpi-value { font-size: 22px; }.roi-wrap .results-row { grid-template-columns: 1fr; }\/* S\u00e9lecteur horizon : 4 pills sur 2 lignes (2x2) plut\u00f4t que 4x1 trop serr\u00e9 *\/\r\n  .roi-wrap .horizon-options { grid-template-columns: repeat(2, 1fr); gap: 8px; }.roi-wrap .horizon-option-hint { font-size: 9.5px; }\/* Scenario : labels plus compacts *\/\r\n  .roi-wrap .scenario-option-num { font-size: 12px; }.roi-wrap .scenario-option-hint { font-size: 9px; }\/* Aper\u00e7u live : KPIs centr\u00e9s au-dessus, trust en colonne *\/\r\n  .roi-wrap .preview-inline-row { flex-direction: column; align-items: stretch; gap: 12px; }.roi-wrap .preview-inline-kpis { justify-content: center; }.roi-wrap .preview-inline-trust { grid-template-columns: 1fr; }\/* CTA + breakdown *\/\r\n  .roi-wrap .cta { padding: 22px 20px; }.roi-wrap .breakdown { padding: 18px; }.roi-wrap .breakdown-row { font-size: 13px; }\/* Charts : hauteur ajust\u00e9e *\/\r\n  .roi-wrap .chart-container { height: 240px; }\/* RGPD consent et trust signals *\/\r\n  .roi-wrap .cta-trust { gap: 14px; }.roi-wrap .cta-trust-item { font-size: 11px; }\/* Tooltips help icons : taille touch-friendly *\/\r\n  .roi-wrap .help-icon { min-width: 22px; min-height: 22px; }\r\n  }\/* ----- MOBILE \u00c9TROIT (\u2264 480px) ----- *\/\r\n  @media (max-width: 480px){.roi-wrap .container { padding: 0 12px 28px; }.roi-wrap .topbar { padding: 14px 16px; }.roi-wrap .hero { padding: 12px 0 24px; }.roi-wrap .hero h1 { font-size: 26px; }.roi-wrap .hero p { font-size: 13.5px; }.roi-wrap .card, .roi-wrap .results { padding: 18px 16px; }\/* KPIs en 1 colonne compl\u00e8te *\/\r\n  .roi-wrap .kpi-grid { grid-template-columns: 1fr; }.roi-wrap .kpi.kpi-hero { grid-column: 1; }.roi-wrap .kpi { padding: 14px 16px; }\/* S\u00e9lecteur de sc\u00e9nario : encore plus compact *\/\r\n  .roi-wrap .scenario-option { padding: 7px 2px; }.roi-wrap .scenario-option-num { font-size: 11px; }.roi-wrap .scenario-option-hint { display: none; }\/* S\u00e9lecteur horizon : pareil pour gain de place *\/\r\n  .roi-wrap .horizon-option-hint { display: none; }.roi-wrap .horizon-option { padding: 8px 4px; }\/* CTA + form *\/\r\n  .roi-wrap .cta { padding: 20px 16px; }.roi-wrap .cta h3 { font-size: 18px; }.roi-wrap .cta-social-proof { padding: 10px 12px; flex-direction: column; align-items: flex-start; gap: 8px; }\/* Aper\u00e7u live : ROI vedette plus modeste *\/\r\n  .roi-wrap .preview-inline-value { font-size: 26px; }.roi-wrap .preview-inline-value-sub { font-size: 18px; }.roi-wrap .preview-inline-divider-v { display: none; }.roi-wrap .preview-inline-kpis { gap: 24px; }\/* Modal d'aide en plein \u00e9cran sur mobile *\/\r\n  .roi-wrap .help-modal-content { width: 95vw; max-height: 92vh; padding: 22px 18px; }\/* Footer m\u00e9thodologie *\/\r\n  .roi-wrap .methodology { font-size: 12px; line-height: 1.55; padding: 16px; }\/* Sliders touch-friendly garantis *\/\r\n  .roi-wrap .slider-input::-webkit-slider-thumb { width: 26px; height: 26px; }.roi-wrap .slider-input::-moz-range-thumb { width: 26px; height: 26px; }.roi-wrap .slider-block { padding: 14px; }.roi-wrap .slider-value-num { font-size: 28px; }\/* Toggles maintenance + RGPD : full largeur, plus a\u00e9r\u00e9s *\/\r\n  .roi-wrap .maint-saas-toggle { padding: 12px; }.roi-wrap .privacy-consent { padding: 12px; font-size: 11.5px; }\/* Bouton submit : taille tactile correcte *\/\r\n  .roi-wrap .btn-submit { padding: 16px 20px; font-size: 14.5px; }\/* Currency switcher : adapt\u00e9 *\/\r\n  .roi-wrap .currency-trigger { padding: 10px 14px; font-size: 13px; }\/* Champ \"syst\u00e8mes actuels\" : encart hint plus compact *\/\r\n  .roi-wrap .field-hint-bar { font-size: 11.5px; padding: 10px; }\/* Warning ROI extr\u00eame *\/\r\n  .roi-wrap .roi-warning { padding: 12px 14px; font-size: 12.5px; }.roi-wrap .roi-warning svg { width: 16px; height: 16px; }\r\n  }\/* ----- MOBILE TR\u00c8S \u00c9TROIT (\u2264 380px - iPhone SE etc.) ----- *\/\r\n  @media (max-width: 380px){.roi-wrap .container { padding: 0 10px 24px; }.roi-wrap .hero h1 { font-size: 23px; }.roi-wrap .card, .roi-wrap .results { padding: 16px 14px; }.roi-wrap .card-title { font-size: 17px; }.roi-wrap .results-title { font-size: 20px; }\/* Tout en 1 col strict *\/\r\n  .roi-wrap .horizon-options { grid-template-columns: repeat(2, 1fr); gap: 6px; }\/* Breakdown plus compact *\/\r\n  .roi-wrap .breakdown-row { font-size: 12px; padding: 8px 0; }\/* Aper\u00e7u live : KPIs empil\u00e9s verticalement si trop serr\u00e9 *\/\r\n  .roi-wrap .preview-inline-kpis { flex-direction: column; gap: 14px; }.roi-wrap .preview-inline-kpi { text-align: center; }\/* Champs : padding r\u00e9duit *\/\r\n  .roi-wrap .field input, .roi-wrap .field select { padding: 11px 12px; font-size: 14px; }.roi-wrap .input-prefix input { padding-left: 38px; }.roi-wrap .input-suffix input { padding-right: 38px; }\r\n  }\/* Accessibilit\u00e9 - respect de la pr\u00e9f\u00e9rence syst\u00e8me \"r\u00e9duire les animations\".\r\n     Coupe les boucles infinies (pulses) et neutralise les transitions\/d\u00e9filement anim\u00e9\r\n     pour les personnes sensibles au mouvement (RGAA \/ vestibular safety). *\/\r\n  @media (prefers-reduced-motion: reduce){.roi-wrap *, .roi-wrap *::before, .roi-wrap *::after {\r\n      animation-duration: 0.001ms !important;\r\n      animation-iteration-count: 1 !important;\r\n      transition-duration: 0.001ms !important;\r\n      scroll-behavior: auto !important;\r\n    }.roi-wrap { scroll-behavior: auto; }\r\n  }\r\n\r\n\r\n  \/* \u2550\u2550 FIX SPANS - neutralise les styles globaux WordPress \u2550\u2550 *\/\r\n  .roi-wrap .results span, .roi-wrap .kpi span, .roi-wrap .kpi-label span, .roi-wrap .kpi-value span,\r\n  .roi-wrap .roi-compare span, .roi-wrap .breakdown span, .roi-wrap .chart-title span,\r\n  .roi-wrap .scenario-info span, .roi-wrap .scenario-label span, .roi-wrap .horizon-label span,\r\n  .roi-wrap .horizon-option span, .roi-wrap .scenario-option span, .roi-wrap .methodology span,\r\n  .roi-wrap .roi-warning span, .roi-wrap .wiz-tab span, .roi-wrap .wiz-tab-label,\r\n  .roi-wrap .results-title span, .roi-wrap .results-subtitle span, .roi-wrap .results-eyebrow span { color: inherit; }\r\n  .roi-wrap .card span, .roi-wrap .card-title span, .roi-wrap .card-subtitle span, .roi-wrap .card-step span,\r\n  .roi-wrap .profiles-bar span, .roi-wrap .profile-btn span, .roi-wrap .field span, .roi-wrap label span,\r\n  .roi-wrap .label-help, .roi-wrap .slider-block span, .roi-wrap .slider-equiv, .roi-wrap .slider-scale span,\r\n  .roi-wrap .maint-saas-text span, .roi-wrap .field-hint-bar span, .roi-wrap .faq-question-text span,\r\n  .roi-wrap .faq-answer-content span, .roi-wrap .currency-bar__label { color: inherit; }\r\n  .roi-wrap .cta span, .roi-wrap .cta label span, .roi-wrap .cta-social-text span,\r\n  .roi-wrap .cta-trust-item span, .roi-wrap .privacy-consent span, .roi-wrap .btn-submit span { color: inherit; }\r\n  .roi-wrap .step-num { color: var(--navy) !important; background: var(--ocean) !important; }\r\n  .roi-wrap .step-name { color: var(--wheelwright) !important; }\r\n  .roi-wrap .horizon-text { color: inherit !important; }\r\n  .roi-wrap .currency-symbol { color: var(--wheelwright) !important; }\r\n  .roi-wrap .field-optional-tag { color: var(--ocean-dark) !important; background: var(--ocean-soft) !important; }\r\n  .roi-wrap .live-dot { background: var(--ocean) !important; }\r\n  .roi-wrap .cta-eyebrow-dot { background: var(--navy) !important; }\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"roi-wrap\">\r\n\r\n<!-- Toast confirmation -->\r\n<div class=\"currency-toast\" id=\"currencyToast\">\r\n  <span class=\"toast-icon\">\u2713<\/span>\r\n  <span id=\"toastText\">Devise chang\u00e9e : Euro (\u20ac)<\/span>\r\n<\/div>\r\n\r\n<!-- Modal d'aide universel pour les champs -->\r\n<div class=\"help-modal-overlay\" id=\"helpModalOverlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"helpModalTitle\">\r\n  <div class=\"help-modal\">\r\n    <div class=\"help-modal-head\">\r\n      <div class=\"help-modal-icon\" id=\"helpModalIcon\">?<\/div>\r\n      <div class=\"help-modal-title-wrap\">\r\n        <div class=\"help-modal-eyebrow\">Aide sur ce champ<\/div>\r\n        <div class=\"help-modal-title\" id=\"helpModalTitle\">Titre<\/div>\r\n      <\/div>\r\n      <button class=\"help-modal-close\" id=\"helpModalClose\" aria-label=\"Fermer\">\u2715<\/button>\r\n    <\/div>\r\n    <div class=\"help-modal-body\" id=\"helpModalBody\"><\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<div class=\"hero\">\r\n  <div class=\"hero-eyebrow\">Outil d'aide \u00e0 la d\u00e9cision<\/div>\r\n  <h1>Calculez le ROI<br>de votre projet <span class=\"accent\">ERP<\/span><\/h1>\r\n  <p>Estimez en 2 minutes le retour sur investissement d'un ERP int\u00e9gr\u00e9, selon la m\u00e9thodologie TCO appliqu\u00e9e par les cabinets de r\u00e9f\u00e9rence du secteur.<\/p>\r\n<\/div>\r\n\r\n<div class=\"container\">\r\n  <div class=\"layout\">\r\n\r\n    <!-- LEFT - INPUTS -->\r\n    <div>\r\n\r\n      <!-- ==== S\u00c9LECTEUR DE DEVISE (discret, en haut \u00e0 droite) ==== -->\r\n      <div class=\"currency-bar\">\r\n        <span class=\"currency-bar__label\">Devise<\/span>\r\n        <div class=\"currency-switcher\" id=\"currencySwitcher\">\r\n          <button class=\"currency-trigger\" type=\"button\" id=\"currencyTrigger\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n            <span class=\"cur-flag\" id=\"curFlag\">\u20ac<\/span>\r\n            <span><span class=\"cur-code\" id=\"curCode\">EUR<\/span> | <span id=\"curName\">Euro<\/span><\/span>\r\n            <svg class=\"cur-arrow\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"\/><\/svg>\r\n          <\/button>\r\n          <div class=\"currency-dropdown\" id=\"currencyDropdown\" role=\"menu\">\r\n            <input type=\"text\" class=\"currency-search\" id=\"currencySearch\" placeholder=\"Rechercher une devise...\" aria-label=\"Rechercher une devise\">\r\n            <div class=\"currency-section-label\">Devises principales<\/div>\r\n            <div id=\"currencyMain\"><\/div>\r\n            <div class=\"currency-divider\"><\/div>\r\n            <div class=\"currency-section-label\">Autres devises<\/div>\r\n            <div id=\"currencyOther\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <!-- ==== WIZARD : barre d'onglets ==== -->\r\n      <div class=\"wiz-tabs\" id=\"wizTabs\">\r\n        <button type=\"button\" class=\"wiz-tab active\" data-w=\"0\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2\"\/><circle cx=\"12\" cy=\"7\" r=\"4\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Votre profil<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"wiz-tab\" data-w=\"1\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\"\/><line x1=\"2\" y1=\"10\" x2=\"22\" y2=\"10\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Investissement<\/span>\r\n        <\/button>\r\n        <button type=\"button\" class=\"wiz-tab\" data-w=\"2\">\r\n          <span class=\"wiz-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M3 17l6-6 4 4 8-8\"\/><path d=\"M17 7h4v4\"\/><\/svg><\/span>\r\n          <span class=\"wiz-tab-label\">Gains<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <!-- ==== PANNEAU 1 - PROFIL ==== -->\r\n      <div class=\"wiz-panel active\" data-wp=\"0\">\r\n      <div class=\"profiles-bar\">\r\n        <div class=\"card-step card-step--lead\"><span class=\"step-num\">\u00c9tape 1<\/span><span class=\"step-name\">Votre profil<\/span><\/div>\r\n        <div class=\"profiles-bar__label\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n          <span>Pour d\u00e9marrer, choisissez le profil le plus proche de votre entreprise. Les champs se pr\u00e9-remplissent : vous n'avez plus qu'\u00e0 les ajuster dans les \u00e9tapes suivantes.<\/span>\r\n        <\/div>\r\n        <div class=\"profiles-bar__btns\">\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"pme\">PME <span>jusqu'\u00e0 80 utilisateurs<\/span><\/button>\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"eti\">ETI <span>81 \u00e0 300 utilisateurs<\/span><\/button>\r\n          <button type=\"button\" class=\"profile-btn\" data-profile=\"grands_comptes\">Grands Comptes <span>plus de 300 utilisateurs<\/span><\/button>\r\n        <\/div>\r\n        <div class=\"profiles-bar__note\">Estimations indicatives bas\u00e9es sur le nombre d'utilisateurs ERP. \u00c0 affiner avec nos \u00e9quipes selon votre organisation.<\/div>\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\" disabled><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Suivant<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 1 -->\r\n\r\n      <!-- ==== PANNEAUX 2 + 3 ==== -->\r\n      <div class=\"inputs-grid\">\r\n\r\n      <!-- PANNEAU 2 - INVESTISSEMENT -->\r\n      <div class=\"wiz-panel\" data-wp=\"1\">\r\n      <!-- TCO -->\r\n      <div class=\"card\">\r\n        <div class=\"card-head\">\r\n          <div class=\"card-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><path d=\"M3 7h18M3 12h18M3 17h18\"\/><\/svg>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"card-step\"><span class=\"step-num\">\u00c9tape 2<\/span><span class=\"step-name\">Investissement<\/span><\/div>\r\n            <h2 class=\"card-title\">Co\u00fbts totaux sur <span class=\"horizon-text\">5<\/span> ans<\/h2>\r\n            <div class=\"card-subtitle\">Total Cost of Ownership : toutes les d\u00e9penses du projet<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"fields-pool\">\r\n          <div class=\"field\">\r\n            <label>Nombre d'utilisateurs ERP <span class=\"help-icon\" data-help=\"users\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <input type=\"text\" inputmode=\"numeric\" id=\"users\" data-format=\"integer\" placeholder=\"ex. 30\">\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt licence <span class=\"label-help\"><span class=\"currency-symbol\">\u20ac<\/span> \/ utilisateur \/ mois<\/span> <span class=\"help-icon\" data-help=\"licenseCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"licenseCost\" data-format=\"currency\" placeholder=\"ex. 55\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt d'impl\u00e9mentation <span class=\"help-icon\" data-help=\"implementationCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"implementationCost\" data-format=\"currency\" placeholder=\"ex. 60 000\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field\">\r\n            <label>Co\u00fbt de formation <span class=\"label-help\">total projet<\/span> <span class=\"help-icon\" data-help=\"trainingCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"trainingCost\" data-format=\"currency\" placeholder=\"ex. 500\">\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span\">\r\n            <label>Maintenance annuelle <span class=\"label-help\">% du co\u00fbt licence<\/span> <span class=\"help-icon\" data-help=\"maintenancePct\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-suffix\" data-suffix=\"%\">\r\n              <input type=\"text\" inputmode=\"numeric\" id=\"maintenancePct\" data-format=\"integer\" placeholder=\"ex. 20\">\r\n            <\/div>\r\n            <label class=\"maint-saas-toggle\">\r\n              <input type=\"checkbox\" id=\"maintIncluded\" checked>\r\n              <span class=\"maint-saas-text\">\r\n                <strong>Maintenance d\u00e9j\u00e0 incluse dans l'abonnement SaaS<\/strong>\r\n                <span class=\"maint-saas-hint\">D\u00e9cochez si votre \u00e9diteur facture la maintenance en plus (cas des ERP on-premise ou licences perp\u00e9tuelles)<\/span>\r\n              <\/span>\r\n            <\/label>\r\n            <span class=\"maint-axelor-note\"><strong>Chez Axelor :<\/strong> la maintenance de la plateforme standard est 100 % incluse dans l'abonnement (laissez l'option coch\u00e9e). Pour d'\u00e9ventuels d\u00e9veloppements sp\u00e9cifiques sur-mesure, comptez une maintenance du sp\u00e9cifique d'environ 15 % du co\u00fbt de ces d\u00e9veloppements.<\/span>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span\">\r\n            <label>H\u00e9bergement annuel <span class=\"label-help\">serveurs, cloud, sauvegardes, s\u00e9curit\u00e9<\/span> <span class=\"help-icon\" data-help=\"hostingCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"hostingCost\" data-format=\"currency\" placeholder=\"ex. 6 000\">\r\n            <\/div>\r\n            <label class=\"maint-saas-toggle\">\r\n              <input type=\"checkbox\" id=\"hostingIncluded\" checked>\r\n              <span class=\"maint-saas-text\">\r\n                <strong>H\u00e9bergement d\u00e9j\u00e0 inclus dans l'abonnement SaaS<\/strong>\r\n                <span class=\"maint-saas-hint\">D\u00e9cochez si vous h\u00e9bergez en interne ou sur votre propre cloud (cas on-premise \/ cloud priv\u00e9)<\/span>\r\n              <\/span>\r\n            <\/label>\r\n          <\/div>\r\n\r\n          <div class=\"field field-span field-existing-systems\">\r\n            <label>\r\n              Co\u00fbt annuel de vos syst\u00e8mes actuels\r\n              <span class=\"field-optional-tag\">optionnel<\/span>\r\n              <span class=\"label-help\">licences, maintenance, serveurs, outils remplac\u00e9s, laissez vide si aucun<\/span>\r\n              <span class=\"help-icon\" data-help=\"existingSystemsCost\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span>\r\n            <\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"existingSystemsCost\" data-format=\"currency\" placeholder=\"ex. 12 000\">\r\n            <\/div>\r\n            <div class=\"field-hint-bar\">\r\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n              <span>Si vous remplacez un ancien ERP ou plusieurs outils \u00e9parpill\u00e9s (CRM, compta, outils m\u00e9tier), renseignez uniquement les co\u00fbts qui pourront <strong>r\u00e9ellement \u00eatre supprim\u00e9s ou r\u00e9duits<\/strong> apr\u00e8s Axelor.<\/span>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\"><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Suivant<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 2 -->\r\n\r\n      <!-- PANNEAU 3 - GAINS -->\r\n      <div class=\"wiz-panel\" data-wp=\"2\">\r\n      <!-- GAINS OP -->\r\n      <div class=\"card\">\r\n        <div class=\"card-head\">\r\n          <div class=\"card-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><path d=\"M13 2L4 14h7l-1 8 9-12h-7l1-8z\"\/><\/svg>\r\n          <\/div>\r\n          <div>\r\n            <div class=\"card-step\"><span class=\"step-num\">\u00c9tape 3<\/span><span class=\"step-name\">Gains op\u00e9rationnels<\/span><\/div>\r\n            <h2 class=\"card-title\">Productivit\u00e9 et qualit\u00e9<\/h2>\r\n            <div class=\"card-subtitle\">Temps lib\u00e9r\u00e9 par l'automatisation et r\u00e9duction des erreurs m\u00e9tier<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"fields-pool fields-pool--gains\">\r\n          <div class=\"field field-span\">\r\n            <label>Co\u00fbt horaire charg\u00e9 <span class=\"label-help\"><span class=\"currency-symbol\">\u20ac<\/span> \/ h moyen entreprise<\/span> <span class=\"help-icon\" data-help=\"hourlyRate\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"input-prefix currency-prefix\" data-prefix=\"\u20ac\">\r\n              <input type=\"text\" inputmode=\"decimal\" id=\"hourlyRate\" data-format=\"currency\" placeholder=\"ex. 45\">\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field field-slider-wrap\">\r\n            <label>Part du temps en t\u00e2ches manuelles <span class=\"label-help\">ressaisie, reporting, consolidation Excel<\/span> <span class=\"help-icon\" data-help=\"manualHours\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"slider-block\">\r\n              <div class=\"slider-value-row\">\r\n                <div class=\"slider-value\">\r\n                  <span class=\"slider-value-num\" id=\"manualHoursDisplay\">15<\/span>\r\n                  <span class=\"slider-value-unit\">%<\/span>\r\n                <\/div>\r\n                <div class=\"slider-equiv\" id=\"manualHoursEquiv\">\u2248 5,3 h \/ semaine<\/div>\r\n              <\/div>\r\n              <input type=\"range\" id=\"manualHours\" class=\"slider-input\" value=\"15\" min=\"5\" max=\"45\" step=\"1\">\r\n              <div class=\"slider-scale\">\r\n                <span>Faible<br><strong>5 %<\/strong><\/span>\r\n                <span class=\"slider-scale-mid\">Moyen<br><strong>25 %<\/strong><\/span>\r\n                <span class=\"slider-scale-right\">\u00c9lev\u00e9<br><strong>45 %<\/strong><\/span>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"field field-slider-wrap\">\r\n            <label>Fiabilit\u00e9 actuelle des donn\u00e9es <span class=\"label-help\">coh\u00e9rence, ressaisies, \u00e9carts entre rapports<\/span> <span class=\"help-icon\" data-help=\"dataReliability\" role=\"button\" tabindex=\"0\" aria-label=\"Aide\">?<\/span><\/label>\r\n            <div class=\"slider-block\">\r\n              <div class=\"slider-value-row\">\r\n                <div class=\"slider-value\">\r\n                  <span class=\"slider-value-num\" id=\"dataReliabilityDisplay\">40<\/span>\r\n                  <span class=\"slider-value-unit\">%<\/span>\r\n                <\/div>\r\n                <div class=\"slider-equiv\" id=\"dataReliabilityLabel\">Donn\u00e9es fragment\u00e9es<\/div>\r\n              <\/div>\r\n              <input type=\"range\" id=\"dataReliability\" class=\"slider-input\" value=\"40\" min=\"10\" max=\"90\" step=\"5\">\r\n              <div class=\"slider-scale\">\r\n                <span>Tr\u00e8s fragment\u00e9<br><strong>10 %<\/strong><\/span>\r\n                <span class=\"slider-scale-mid\">Moyen<br><strong>40-50 %<\/strong><\/span>\r\n                <span class=\"slider-scale-right\">Tr\u00e8s fiable<br><strong>90 %<\/strong><\/span>\r\n              <\/div>\r\n              <div class=\"slider-estimate\" id=\"dataReliabilityEstimate\">\r\n                <span class=\"slider-estimate-icon\">\u26a0\ufe0f<\/span>\r\n                <span>Co\u00fbt annuel estim\u00e9 des erreurs : <strong id=\"errorCostEstimate\">- \u20ac<\/strong><\/span>\r\n              <\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- APER\u00c7U LIVE - int\u00e9gr\u00e9 au pied de la card \u00c9tape 2 pour \u00e9quilibrer les hauteurs -->\r\n        <div class=\"wiz-nav\">\r\n          <button type=\"button\" class=\"wiz-btn prev\"><svg viewBox=\"0 0 24 24\"><path d=\"M19 12H5M12 19l-7-7 7-7\"\/><\/svg>Pr\u00e9c\u00e9dent<\/button>\r\n          <button type=\"button\" class=\"wiz-btn next\">Voir mon ROI<svg viewBox=\"0 0 24 24\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg><\/button>\r\n        <\/div>\r\n      <\/div>\r\n      <\/div><!-- \/panneau 3 -->\r\n\r\n      <\/div><!-- \/inputs-grid -->\r\n\r\n    <\/div>\r\n\r\n    <!-- RIGHT - RESULTS -->\r\n    <div>\r\n      <div class=\"results\">\r\n        <div class=\"results-head\">\r\n          <div class=\"results-eyebrow\"><span class=\"live-dot\"><\/span>Estimation en direct<\/div>\r\n          <div class=\"results-title\">Votre ROI sur <span id=\"horizonLabel\">5<\/span> ans<\/div>\r\n          <div class=\"results-subtitle\">Mise \u00e0 jour automatique selon vos donn\u00e9es<\/div>\r\n        <\/div>\r\n\r\n        <!-- S\u00c9LECTEUR D'HORIZON -->\r\n        <div class=\"horizon-picker\">\r\n          <div class=\"horizon-label\">\r\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\r\n            Horizon d'analyse\r\n          <\/div>\r\n          <div class=\"horizon-options\" id=\"horizonOptions\">\r\n            <div class=\"horizon-option\" data-years=\"3\">\r\n              <div class=\"horizon-option-num\">3 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Court terme<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option active\" data-years=\"5\">\r\n              <div class=\"horizon-option-num\">5 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Standard ERP<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option\" data-years=\"7\">\r\n              <div class=\"horizon-option-num\">7 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Long terme<\/div>\r\n            <\/div>\r\n            <div class=\"horizon-option\" data-years=\"10\">\r\n              <div class=\"horizon-option-num\">10 ans<\/div>\r\n              <div class=\"horizon-option-hint\">Vision d\u00e9cennale<\/div>\r\n            <\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- S\u00c9LECTEUR DE SC\u00c9NARIO -->\r\n        <div class=\"scenario-picker\">\r\n          <div class=\"scenario-label\">\r\n            <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 1 1 7.072 0l-.548.547A3.374 3.374 0 0 0 14 18.469V19a2 2 0 1 1-4 0v-.531c0-.895-.356-1.754-.988-2.387l-.548-.547z\"\/><\/svg>\r\n            Niveau d'hypoth\u00e8ses\r\n          <\/div>\r\n          <div class=\"scenario-options\" id=\"scenarioOptions\">\r\n            <div class=\"scenario-option conservative\" data-scenario=\"conservative\">\r\n              <div class=\"scenario-option-num\">Conservateur<\/div>\r\n              <div class=\"scenario-option-hint\">Prudent<\/div>\r\n            <\/div>\r\n            <div class=\"scenario-option realistic active\" data-scenario=\"realistic\">\r\n              <div class=\"scenario-option-num\">R\u00e9aliste<\/div>\r\n              <div class=\"scenario-option-hint\">Recommand\u00e9<\/div>\r\n            <\/div>\r\n            <div class=\"scenario-option optimistic\" data-scenario=\"optimistic\">\r\n              <div class=\"scenario-option-num\">Optimiste<\/div>\r\n              <div class=\"scenario-option-hint\">Best case<\/div>\r\n            <\/div>\r\n          <\/div>\r\n          <div class=\"scenario-info\" id=\"scenarioInfo\">\r\n            <strong>R\u00e9aliste<\/strong> : 60 % d'automatisation, 75 % de mon\u00e9tisation des heures, 70 % de r\u00e9duction d'erreurs, ramp-up 50 % en ann\u00e9e 1. Align\u00e9 sur les benchmarks Panorama Consulting et Gartner pour les ETI.\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- ===== COMPARATEUR ROI : ERP classique vs Axelor IA ===== -->\r\n        <div class=\"roi-compare\" id=\"roiCompare\">\r\n          <div class=\"roi-compare__col roi-compare__base\">\r\n            <div class=\"roi-compare__tag\">ERP classique<\/div>\r\n            <div class=\"roi-compare__value\" id=\"roiBase\">- %<\/div>\r\n            <div class=\"roi-compare__sub\">Productivit\u00e9, fiabilit\u00e9, \u00e9conomies<\/div>\r\n          <\/div>\r\n          <div class=\"roi-compare__plus\">\r\n            <div class=\"roi-compare__plus-badge\" id=\"roiDeltaBadge\" title=\"Estimation de l'apport des agents IA sur les t\u00e2ches non encore automatis\u00e9es (hypoth\u00e8se Axelor, \u00e0 affiner selon votre p\u00e9rim\u00e8tre lors d'un \u00e9change avec nos experts).\">+- pts<\/div>\r\n            <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M12 5l7 7-7 7\"\/><\/svg>\r\n          <\/div>\r\n          <div class=\"roi-compare__col roi-compare__axelor\">\r\n            <div class=\"roi-compare__tag\">\r\n              <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"m12 3-1.9 5.8a2 2 0 0 1-1.3 1.3L3 12l5.8 1.9a2 2 0 0 1 1.3 1.3L12 21l1.9-5.8a2 2 0 0 1 1.3-1.3L21 12l-5.8-1.9a2 2 0 0 1-1.3-1.3z\"\/><\/svg>\r\n              Avec l'ERP Axelor\r\n            <\/div>\r\n            <div class=\"roi-compare__value\" id=\"roiAxelor\">- %<\/div>\r\n            <div class=\"roi-compare__sub\">+ l'IA agentique qui agit dans vos modules<\/div>\r\n          <\/div>\r\n        <\/div>\r\n        <div class=\"roi-compare__note\">\r\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\/><\/svg>\r\n          <span>L\u00e0 o\u00f9 un ERP classique automatise, les <strong>agents IA d'Axelor ex\u00e9cutent<\/strong> les t\u00e2ches \u00e0 votre place. Apport estim\u00e9 sur les t\u00e2ches non encore automatis\u00e9es : hypoth\u00e8se Axelor, affin\u00e9e avec vous lors d'un \u00e9change.<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"kpi-grid\">\r\n          <div class=\"kpi kpi-hero\">\r\n            <div class=\"kpi-label\">ROI sur <span class=\"horizon-text\">5<\/span> ans <span style=\"opacity:.55;font-weight:400;\">avec l'ERP Axelor<\/span><\/div>\r\n            <div class=\"kpi-value green\" id=\"roiPct\">- %<\/div>\r\n            <span class=\"kpi-badge\" id=\"roiBadge\">\u2605 Excellent<\/span>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">Point d'\u00e9quilibre <span style=\"opacity:.55;font-weight:400;\">(actualis\u00e9)<\/span><\/div>\r\n            <div class=\"kpi-value cyan\" id=\"paybackMonths\">- mois<\/div>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">B\u00e9n\u00e9fice net <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n            <div class=\"kpi-value\" id=\"netGain\">- \u20ac<\/div>\r\n          <\/div>\r\n          <div class=\"kpi\">\r\n            <div class=\"kpi-label\">Heures gagn\u00e9es \/ an<\/div>\r\n            <div class=\"kpi-value amber\" id=\"hoursReclaimed\">- h<\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <!-- Garde-fou hypoth\u00e8ses agressives (ROI \u2265 700 % ou inputs extr\u00eames) -->\r\n        <div class=\"roi-warning\" id=\"roiWarning\">\r\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n          <div id=\"roiWarningText\">\r\n            <strong>Hypoth\u00e8ses \u00e0 valider.<\/strong>\r\n            Le r\u00e9sultat reste calcul\u00e9 honn\u00eatement, mais certaines valeurs m\u00e9ritent une v\u00e9rification avant pr\u00e9sentation.\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"results-row\">\r\n          <div class=\"chart-block\">\r\n            <div class=\"chart-title\">Co\u00fbts vs gains cumul\u00e9s<\/div>\r\n            <div class=\"chart-subtitle\">Projection sur <span class=\"horizon-text\">5<\/span> ans, point d'\u00e9quilibre visualis\u00e9<\/div>\r\n            <div class=\"chart-wrap\"><canvas id=\"cumulativeChart\"><\/canvas><\/div>\r\n          <\/div>\r\n\r\n          <div class=\"chart-block\">\r\n            <div class=\"chart-title\">R\u00e9partition des gains annuels<\/div>\r\n            <div class=\"chart-subtitle\">Par cat\u00e9gorie<\/div>\r\n            <div class=\"chart-wrap donut\"><canvas id=\"gainsChart\"><\/canvas><\/div>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"results-row\">\r\n          <div class=\"breakdown\">\r\n            <div class=\"breakdown-title\">D\u00e9tail des co\u00fbts sur <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Licences \/ SaaS<\/span>\r\n              <span class=\"breakdown-value\" id=\"costLicense\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Impl\u00e9mentation<\/span>\r\n              <span class=\"breakdown-value\" id=\"costImpl\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Maintenance \/ support<\/span>\r\n              <span class=\"breakdown-value\" id=\"costMaint\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\" id=\"costHostingRow\" style=\"display:none;\">\r\n              <span class=\"breakdown-label\">H\u00e9bergement<\/span>\r\n              <span class=\"breakdown-value\" id=\"costHosting\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row\">\r\n              <span class=\"breakdown-label\">Formation<\/span>\r\n              <span class=\"breakdown-value\" id=\"costTraining\">- \u20ac<\/span>\r\n            <\/div>\r\n            <div class=\"breakdown-row total\">\r\n              <span class=\"breakdown-label\">TCO total <span class=\"horizon-text\">5<\/span> ans<\/span>\r\n              <span class=\"breakdown-value\" id=\"totalCost\">- \u20ac<\/span>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <div class=\"breakdown\">\r\n            <div class=\"breakdown-title\">D\u00e9tail des gains sur <span class=\"horizon-text\">5<\/span> ans<\/div>\r\n          <div class=\"breakdown-row\">\r\n            <span class=\"breakdown-label\">Productivit\u00e9 (automatisation)<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainProd\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\">\r\n            <span class=\"breakdown-label\">R\u00e9duction des erreurs<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainErrors\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\" id=\"gainAiRow\" style=\"display:none;\">\r\n            <span class=\"breakdown-label\">Productivit\u00e9 (IA agentique)<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainAi\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row\" id=\"gainExistingRow\" style=\"display:none;\">\r\n            <span class=\"breakdown-label\">\u00c9conomies sur l'existant<\/span>\r\n            <span class=\"breakdown-value\" id=\"gainExisting\">- \u20ac<\/span>\r\n          <\/div>\r\n          <div class=\"breakdown-row total gain\">\r\n            <span class=\"breakdown-label\">Gains totaux <span class=\"horizon-text\">5<\/span> ans<\/span>\r\n            <span class=\"breakdown-value\" id=\"totalGain\">- \u20ac<\/span>\r\n          <\/div>\r\n        <\/div>\r\n        <\/div><!-- \/results-row breakdowns -->\r\n\r\n\r\n      <\/div>\r\n    <\/div>\r\n\r\n\r\n  <\/div><!-- \/.layout -->\r\n\r\n  <!-- ZONE DE CONVERSION + M\u00c9THODOLOGIE (pleine largeur sous le cockpit) -->\r\n  <div class=\"container\">\r\n    <div class=\"post-cockpit\">\r\n            <div class=\"cta\">\r\n              <div class=\"cta-head\">\r\n                <div class=\"cta-eyebrow\"><span class=\"cta-eyebrow-dot\"><\/span>\u00c9tape suivante<\/div>\r\n                <h3>Recevez votre analyse ROI personnalis\u00e9e<\/h3>\r\n                <p>Recevez votre analyse personnalis\u00e9e et \u00e9changez avec un expert Axelor sur vos r\u00e9sultats.<\/p>\r\n              <\/div>\r\n    \r\n              <!-- Accroche neutre (pas de chiffre marketing non prouv\u00e9) -->\r\n              <div class=\"cta-social-proof\">\r\n                <div class=\"cta-social-icon\">\r\n                  <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11H1l8-8 8 8h-3v6H9v-6z\" transform=\"rotate(45 12 12)\"\/><circle cx=\"12\" cy=\"12\" r=\"9\"\/><path d=\"M9 12l2 2 4-4\"\/><\/svg>\r\n                <\/div>\r\n                <div class=\"cta-social-text\">\r\n                  Un outil d'aide \u00e0 la d\u00e9cision pour <strong>cadrer et d\u00e9fendre votre projet ERP<\/strong> en interne.\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Pr\u00e9nom <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"firstName\" placeholder=\"Pr\u00e9nom\">\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>Nom <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"lastName\" placeholder=\"Nom\">\r\n                <\/div>\r\n              <\/div>\r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Email professionnel <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"email\" id=\"email\" placeholder=\"vous@entreprise.com\">\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>Entreprise <span class=\"field-required\">*<\/span><\/label>\r\n                  <input type=\"text\" id=\"company\" placeholder=\"Nom de l'entreprise\">\r\n                <\/div>\r\n              <\/div>\r\n              <div class=\"form-row\">\r\n                <div class=\"field\">\r\n                  <label>Fonction <span class=\"field-optional\">(optionnel)<\/span><\/label>\r\n                  <select id=\"role\">\r\n                    <option value=\"\">S\u00e9lectionner<\/option>\r\n                    <option>Directeur G\u00e9n\u00e9ral<\/option>\r\n                    <option>DAF<\/option>\r\n                    <option>DSI<\/option>\r\n                    <option>Directeur Op\u00e9rationnel<\/option>\r\n                    <option>Autre<\/option>\r\n                  <\/select>\r\n                <\/div>\r\n                <div class=\"field\">\r\n                  <label>T\u00e9l\u00e9phone <span class=\"field-optional\">(optionnel)<\/span><\/label>\r\n                  <input type=\"tel\" id=\"phone\" placeholder=\"+33 6 12 34 56 78\">\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <label class=\"privacy-consent\">\r\n                <input type=\"checkbox\" id=\"privacyConsent\">\r\n                <span>J'accepte qu'Axelor traite mes donn\u00e9es pour me recontacter au sujet de mon estimation ROI. Consultez notre <a href=\"https:\/\/axelor.com\/fr\/politique-de-confidentialite\/\" target=\"_blank\" rel=\"noopener\" style=\"color:white\">politique de confidentialit\u00e9<\/a>.<\/span>\r\n              <\/label>\r\n    \r\n              <button class=\"btn-submit\" onclick=\"submitForm(event)\">\r\n                <span>Recevoir mon analyse personnalis\u00e9e<\/span>\r\n                <svg class=\"btn-arrow\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><polyline points=\"12 5 19 12 12 19\"\/><\/svg>\r\n              <\/button>\r\n    \r\n              <!-- Signaux de confiance sous le bouton -->\r\n              <div class=\"cta-trust\">\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"\/><polyline points=\"22 4 12 14.01 9 11.01\"\/><\/svg>\r\n                  <span>Sans engagement<\/span>\r\n                <\/div>\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><polyline points=\"12 6 12 12 16 14\"\/><\/svg>\r\n                  <span>R\u00e9ponse rapide<\/span>\r\n                <\/div>\r\n                <div class=\"cta-trust-item\">\r\n                  <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"\/><path d=\"M7 11V7a5 5 0 0 1 10 0v4\"\/><\/svg>\r\n                  <span>Donn\u00e9es prot\u00e9g\u00e9es RGPD<\/span>\r\n                <\/div>\r\n              <\/div>\r\n    \r\n              <div class=\"success-message\" id=\"successMessage\">\r\n                <strong>\u2713 Demande enregistr\u00e9e.<\/strong> Un expert Axelor vous contactera prochainement pour \u00e9changer sur vos r\u00e9sultats et r\u00e9pondre \u00e0 vos questions.\r\n              <\/div>\r\n            <\/div>\r\n            <div class=\"methodology\">\r\n            <p class=\"methodology-title\">M\u00e9thodologie & hypoth\u00e8ses<\/p>\r\n            <p><strong>Formule.<\/strong> ROI = (Gains actualis\u00e9s \u2212 Co\u00fbts nominaux) \/ Co\u00fbts \u00d7 100. Les gains sont actualis\u00e9s au WACC selon la m\u00e9thode NPV (Net Present Value) ; les co\u00fbts sont conserv\u00e9s en valeur nominale, par prudence.<\/p>\r\n            <p><strong>Trois piliers de gains.<\/strong> (1) Productivit\u00e9 : heures \u00e9conomis\u00e9es \u00d7 co\u00fbt horaire \u00d7 taux de mon\u00e9tisation. (2) R\u00e9duction des erreurs m\u00e9tier, li\u00e9e \u00e0 la fiabilit\u00e9 des donn\u00e9es. (3) \u00c9conomies sur les syst\u00e8mes actuels remplac\u00e9s : vieil ERP, licences \u00e9parpill\u00e9es, serveurs. Ce troisi\u00e8me pilier est optionnel et renseign\u00e9 par l'utilisateur.<\/p>\r\n            <p><strong>Pilier optionnel IA agentique.<\/strong> Lorsqu'il est activ\u00e9, il valorise la part additionnelle de temps manuel, non d\u00e9j\u00e0 automatis\u00e9, que les agents IA d'Axelor peuvent absorber. Il est calcul\u00e9 sur les heures restantes, pour \u00e9viter tout double comptage avec la productivit\u00e9.<\/p>\r\n            <p><strong>Hypoth\u00e8ses de mod\u00e9lisation.<\/strong> Les param\u00e8tres sont ajustables via le s\u00e9lecteur Conservateur, R\u00e9aliste ou Optimiste : taux d'automatisation, taux de mon\u00e9tisation des heures gagn\u00e9es, taux de r\u00e9duction d'erreurs et mont\u00e9e en charge la premi\u00e8re ann\u00e9e. Le pilier \u00ab \u00e9conomies sur l'existant \u00bb est appliqu\u00e9 d\u00e8s la premi\u00e8re ann\u00e9e, sans mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate. Le WACC est fix\u00e9 \u00e0 8 % (m\u00e9diane indicative pour les ETI, inspir\u00e9e de la KPMG Cost of Capital Study 2025). Une marge automatique de 15 % est ajout\u00e9e sur l'impl\u00e9mentation pour les co\u00fbts cach\u00e9s (Standish Group Chaos Report).<\/p>\r\n            <p><strong>Sources de r\u00e9f\u00e9rence.<\/strong> Les ordres de grandeur d'automatisation et de r\u00e9duction d'erreurs s'appuient sur les benchmarks McKinsey Global Institute, Panorama Consulting ERP Reports et IBM Data Quality Studies. Les coefficients pr\u00e9cis sont des <em>hypoth\u00e8ses de mod\u00e9lisation internes<\/em> Axelor, calibr\u00e9es pour des ETI fran\u00e7aises, et non des chiffres exacts cit\u00e9s par ces sources.<\/p>\r\n            <p><strong>Avertissement.<\/strong> Les r\u00e9sultats sont indicatifs et d\u00e9pendent int\u00e9gralement des donn\u00e9es saisies. Ils ne constituent pas un engagement contractuel. Pour une \u00e9tude chiffr\u00e9e personnalis\u00e9e et engageante, contactez un expert Axelor.<\/p>\r\n          <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- ===== FAQ : APR\u00c8S LE RAPPORT ET LE FORMULAIRE ===== -->\r\n  <div class=\"faq-section-wrapper\">\r\n      <div class=\"faq-inline\">\r\n        <div class=\"faq-head-inline\">\r\n          <div class=\"faq-head-icon\">\r\n            <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\"\/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\/><\/svg>\r\n          <\/div>\r\n          <div class=\"faq-head-text\">\r\n            <div class=\"faq-head-text-eyebrow\">FAQ<\/div>\r\n            <h2>Questions fr\u00e9quentes<\/h2>\r\n            <p>Tout ce qu'il faut savoir avant de chiffrer son projet ERP.<\/p>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment calcule-t-on le ROI d'un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le retour sur investissement d'un ERP se calcule avec la formule standard : <strong>ROI = (Gains \u2212 Co\u00fbts) \/ Co\u00fbts \u00d7 100<\/strong>, projet\u00e9 sur l'horizon retenu (3, 5, 7 ou 10 ans selon votre choix). C'est la m\u00e9thodologie utilis\u00e9e par les cabinets de r\u00e9f\u00e9rence (Gartner, Panorama Consulting, Forrester) pour \u00e9valuer la rentabilit\u00e9 d'un projet ERP.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Qu'est-ce que le TCO d'un ERP et que comprend-il ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le <strong>TCO (Total Cost of Ownership)<\/strong> repr\u00e9sente le co\u00fbt total de possession d'un ERP sur l'horizon retenu. Il inclut quatre postes : licences ou abonnements SaaS, frais d'impl\u00e9mentation, formation des utilisateurs, et maintenance annuelle (18 \u00e0 22 % du co\u00fbt licence pour les ERP on-premise, souvent incluse dans les abonnements SaaS).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment estimer le co\u00fbt d'impl\u00e9mentation d'un ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon les benchmarks <strong>Panorama Consulting<\/strong>, le co\u00fbt moyen d'impl\u00e9mentation d'un ERP mid-market s'\u00e9l\u00e8ve \u00e0 plusieurs centaines de milliers d'euros. En r\u00e8gle g\u00e9n\u00e9rale, les entreprises consacrent <strong>1 \u00e0 3 % de leur chiffre d'affaires annuel<\/strong> \u00e0 l'impl\u00e9mentation. Ce co\u00fbt couvre le param\u00e9trage, l'int\u00e9gration, la migration des donn\u00e9es et la conduite du changement. Pour une estimation pr\u00e9cise, demandez un devis \u00e0 un int\u00e9grateur Axelor.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Comment estimer la part de temps pass\u00e9 en t\u00e2ches manuelles ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Estimez la <strong>proportion du temps de travail<\/strong> consacr\u00e9e \u00e0 des t\u00e2ches manuelles r\u00e9p\u00e9titives plut\u00f4t qu'au c\u0153ur de m\u00e9tier : ressaisie inter-outils, consolidation Excel, recherche d'informations entre fichiers, g\u00e9n\u00e9ration manuelle de reportings, validation de factures. Pour la plupart des ETI, ce pourcentage se situe entre <strong>15 et 30 %<\/strong>. Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \u00ab se battre avec Excel \u00bb, vous \u00eates \u00e0 <strong>~20 %<\/strong>.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">C'est quoi un co\u00fbt horaire \u00ab charg\u00e9 \u00bb et comment le calculer ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le co\u00fbt horaire <strong>charg\u00e9<\/strong> repr\u00e9sente le co\u00fbt total pour l'entreprise, pas le salaire brut. Il inclut le salaire, les charges patronales, les avantages sociaux, les frais d'\u00e9quipement et les co\u00fbts indirects (bureau, IT). <strong>R\u00e8gle empirique : multiplier le salaire brut par 1,3 \u00e0 1,4<\/strong>. Exemple : un salari\u00e9 \u00e0 40 000 \u20ac de salaire brut annuel co\u00fbte 52 000 \u00e0 56 000 \u20ac charg\u00e9s, soit environ 32 \u00e0 35 \u20ac\/h sur une base de 1 600 h travaill\u00e9es.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Cloud SaaS ou On-Premise : quel impact sur le TCO ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon <strong>Forrester Research<\/strong>, les ERP cloud r\u00e9duisent le TCO de <strong>30 \u00e0 50 % sur 5 ans<\/strong> par rapport au d\u00e9ploiement on-premise, principalement gr\u00e2ce \u00e0 l'\u00e9limination des co\u00fbts d'infrastructure et de maintenance hardware. \u00c0 l'inverse, l'on-premise peut s'av\u00e9rer plus \u00e9conomique sur 10 ans pour les grandes entreprises avec beaucoup d'utilisateurs et des besoins de personnalisation lourds. Axelor propose les deux mod\u00e8les.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels sont les co\u00fbts cach\u00e9s d'un projet ERP \u00e0 anticiper ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Quatre postes sont souvent sous-estim\u00e9s : <strong>temps interne<\/strong> (vos \u00e9quipes mobilis\u00e9es 0,5 \u00e0 1 jour\/semaine par utilisateur cl\u00e9), <strong>migration de donn\u00e9es<\/strong> (5 \u00e0 15 % du co\u00fbt d'impl\u00e9mentation), <strong>conduite du changement<\/strong> (communication, accompagnement), <strong>\u00e9volutions futures<\/strong> (nouveaux modules, int\u00e9grations). Selon Panorama Consulting, <strong>plus d'un quart des projets d\u00e9passent leur budget<\/strong>. Anticipez une marge de 15-20 % sur le co\u00fbt d'impl\u00e9mentation.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels signaux indiquent qu'il faut changer d'ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Cinq signaux indiquent qu'un ERP arrive en fin de vie : <strong>multiplication des fichiers Excel<\/strong> en parall\u00e8le de l'ERP, <strong>impossibilit\u00e9 d'int\u00e9grer<\/strong> les nouveaux outils (CRM, e-commerce, IA), <strong>temps de cl\u00f4ture comptable<\/strong> qui s'allonge, <strong>incapacit\u00e9 \u00e0 \u00e9voluer<\/strong> sans co\u00fbt de d\u00e9veloppement majeur, et <strong>support \u00e9diteur d\u00e9grad\u00e9<\/strong> (fin de version, hausses tarifaires). La dur\u00e9e de vie moyenne d'un ERP est de <strong>7 \u00e0 10 ans<\/strong>.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Pourquoi 18-22 % de maintenance annuelle ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            C'est le <strong>standard du march\u00e9 ERP<\/strong>, appliqu\u00e9 par tous les \u00e9diteurs (SAP, Sage, Microsoft Dynamics, Oracle, Axelor). Ce pourcentage couvre les mises \u00e0 jour fonctionnelles, les correctifs de s\u00e9curit\u00e9, le support technique et la mise en conformit\u00e9 r\u00e9glementaire (fiscale, comptable, RGPD).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">D'o\u00f9 viennent les taux d'automatisation utilis\u00e9s ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Le taux d'automatisation varie selon le sc\u00e9nario retenu : <strong>40 %<\/strong> (Conservateur), <strong>60 %<\/strong> (R\u00e9aliste), <strong>70 %<\/strong> (Optimiste). Ces fourchettes sont inspir\u00e9es des benchmarks McKinsey Global Institute sur l'automatisation des activit\u00e9s tertiaires et des rapports Panorama Consulting sur les d\u00e9ploiements ERP mid-market. Ils repr\u00e9sentent la part des t\u00e2ches manuelles r\u00e9p\u00e9titives (ressaisie, reporting, consolidation Excel) qu'un ERP int\u00e9gr\u00e9 permet d'\u00e9liminer ou de r\u00e9duire fortement. Le sc\u00e9nario R\u00e9aliste refl\u00e8te une adoption normale ; le Conservateur prend une marge de prudence pour d\u00e9fendre le projet devant un comit\u00e9.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">D'o\u00f9 viennent les taux de r\u00e9duction d'erreurs utilis\u00e9s ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Comme pour l'automatisation, le taux varie selon le sc\u00e9nario : <strong>50 %<\/strong> (Conservateur), <strong>70 %<\/strong> (R\u00e9aliste), <strong>80 %<\/strong> (Optimiste). Ces ordres de grandeur s'inspirent des rapports annuels Panorama Consulting et IBM Data Quality Studies sur plusieurs centaines d'impl\u00e9mentations ERP. La r\u00e9duction provient de l'\u00e9limination de la ressaisie inter-outils, des r\u00e8gles de validation automatiques, de la tra\u00e7abilit\u00e9 compl\u00e8te et des contr\u00f4les de coh\u00e9rence en temps r\u00e9el.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quel est le d\u00e9lai de retour moyen sur un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Selon Panorama Consulting et Gartner, le payback se situe entre <strong>12 et 24 mois<\/strong> pour un projet mid-market bien cadr\u00e9, avec une moyenne autour de 18 mois. Les projets simples bien men\u00e9s peuvent descendre \u00e0 6-12 mois ; les projets mal pr\u00e9par\u00e9s d\u00e9passent 36 mois.\r\n            <br><br>\r\n            <em>Note m\u00e9thodologique : ce calculateur affiche un <strong>point d'\u00e9quilibre actualis\u00e9<\/strong> (flux ramen\u00e9s en valeur pr\u00e9sente au WACC), l\u00e9g\u00e8rement plus prudent que le payback nominal des benchmarks ci-dessus. L'\u00e9cart est faible sur les paybacks courts (~12-18 mois), plus visible sur les paybacks longs.<\/em>\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Faut-il prendre en compte le co\u00fbt de mon ERP\/CRM actuel ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            <strong>Oui, absolument.<\/strong> C'est ce qu'on appelle le <em>co\u00fbt de l'inaction<\/em>, et c'est souvent <strong>un pilier de gain important<\/strong> dans un projet ERP de remplacement. Si vous payez aujourd'hui des licences Sage, Cegid, SAP B1, Microsoft Dynamics, ou un patchwork de SaaS \u00e9parpill\u00e9s (compta + CRM + outils m\u00e9tier), ces co\u00fbts peuvent dispara\u00eetre avec un ERP int\u00e9gr\u00e9 comme Axelor. Renseignez le champ \u00ab Co\u00fbt annuel de vos syst\u00e8mes actuels \u00bb dans l'\u00e9tape 1 : il est optionnel et peut <strong>modifier significativement le ROI<\/strong> lorsqu'un ERP ou plusieurs outils existants sont effectivement remplac\u00e9s. Ce calculateur applique ces \u00e9conomies sans courbe de mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate (vous arr\u00eatez les abonnements au go-live).\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">\u00c0 partir de quelle taille un ERP est-il rentable ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            \u00c0 partir d'environ <strong>10 utilisateurs<\/strong>, un ERP peut devenir rentable si les volumes de t\u00e2ches manuelles, les co\u00fbts d'erreurs ou les syst\u00e8mes remplac\u00e9s sont suffisants. La rentabilit\u00e9 d\u00e9pend moins du nombre d'utilisateurs que du <strong>p\u00e9rim\u00e8tre, du co\u00fbt projet et des gains op\u00e9rationnels r\u00e9ellement capturables<\/strong>. Sur des projets bien cadr\u00e9s en ETI, le ROI typique sur 5 ans se situe entre <strong>150 et 450 %<\/strong> en sc\u00e9nario r\u00e9aliste, mais un projet trop ambitieux pour une \u00e9quipe trop petite peut tr\u00e8s bien afficher un ROI n\u00e9gatif. C'est pr\u00e9cis\u00e9ment ce que ce calculateur permet de v\u00e9rifier avant l'engagement budg\u00e9taire.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Pourquoi un ERP open source comme Axelor ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Quatre avantages : <strong>transparence du code<\/strong> (pas de bo\u00eete noire), <strong>ma\u00eetrise du TCO<\/strong> (pas de co\u00fbts cach\u00e9s), <strong>souverainet\u00e9 des donn\u00e9es<\/strong> (cloud priv\u00e9, on-premise ou h\u00e9bergeur souverain europ\u00e9en), et <strong>personnalisation illimit\u00e9e<\/strong> gr\u00e2ce \u00e0 la plateforme No-Code Axelor.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Combien de temps prend l'impl\u00e9mentation d'un ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            La dur\u00e9e d\u00e9pend du p\u00e9rim\u00e8tre fonctionnel : <strong>2 \u00e0 4 mois<\/strong> pour un p\u00e9rim\u00e8tre limit\u00e9 (CRM ou compta seuls), <strong>4 \u00e0 8 mois<\/strong> pour 3 \u00e0 5 modules int\u00e9gr\u00e9s, <strong>8 \u00e0 18 mois<\/strong> pour un ERP int\u00e9gr\u00e9 complet. L'approche No-Code Axelor r\u00e9duit significativement ces d\u00e9lais : ce qui prendrait 6 mois en d\u00e9veloppement traditionnel se param\u00e8tre souvent en 6 semaines avec Axelor Studio.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Qu'est-ce qu'un ERP agentique, et qu'est-ce que \u00e7a change pour mon ROI ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Un ERP agentique int\u00e8gre une <strong>IA qui agit directement sur vos donn\u00e9es m\u00e9tier<\/strong>, et ne se contente pas de r\u00e9pondre \u00e0 des questions. Concr\u00e8tement, elle peut saisir des factures, d\u00e9clencher des r\u00e8gles de gestion, planifier, anticiper une rupture de stock ou un retard. Ce sont autant de t\u00e2ches qui, jusqu'ici, mobilisaient du temps humain : c'est exactement le poste de \u00ab gains de productivit\u00e9 \u00bb que ce calculateur estime. Plus ces t\u00e2ches sont automatis\u00e9es, plus le retour sur investissement est rapide.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Concr\u00e8tement, que peut faire l'IA agentique d'Axelor ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            L'IA d'Axelor couvre plusieurs usages : <strong>automatiser<\/strong> les saisies et les r\u00e8gles m\u00e9tier, <strong>optimiser<\/strong> la planification (production, tourn\u00e9es, ressources), <strong>anticiper<\/strong> les ruptures, retards et besoins de tr\u00e9sorerie, <strong>rechercher<\/strong> l'information dans vos donn\u00e9es en langage naturel, et m\u00eame <strong>cr\u00e9er des \u00e9crans, des champs ou des tableaux de bord sans \u00e9crire de code<\/strong>, simplement en d\u00e9crivant le besoin. Cette capacit\u00e9 No-Code est le vrai diff\u00e9renciateur : vous adaptez l'ERP \u00e0 vos processus, pas l'inverse.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">L'IA a-t-elle acc\u00e8s \u00e0 toutes mes donn\u00e9es ? Est-ce s\u00e9curis\u00e9 ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Oui, et c'est encadr\u00e9 par construction. Chez Axelor, chaque demande adress\u00e9e \u00e0 l'IA passe par une <strong>couche interm\u00e9diaire qui applique vos permissions<\/strong> avant d'acc\u00e9der \u00e0 la base de donn\u00e9es : l'IA ne voit et ne modifie que ce que l'utilisateur a le droit de voir et de modifier. Vos donn\u00e9es ne servent jamais \u00e0 entra\u00eener un mod\u00e8le externe, et vous gardez la ma\u00eetrise de l'h\u00e9bergement (cloud, priv\u00e9 ou sur vos serveurs). La conformit\u00e9 RGPD et le contr\u00f4le des acc\u00e8s sont donc natifs, pas ajout\u00e9s apr\u00e8s coup.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n        <div class=\"faq-item\">\r\n          <div class=\"faq-question\">\r\n            <div class=\"faq-question-text\">Quels sont les facteurs cl\u00e9s de succ\u00e8s d'un projet ERP ?<\/div>\r\n            <div class=\"faq-icon\"><svg viewBox=\"0 0 24 24\"><line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\"\/><line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"\/><\/svg><\/div>\r\n          <\/div>\r\n          <div class=\"faq-answer\"><div class=\"faq-answer-content\">\r\n            Cinq facteurs distinguent les projets ERP r\u00e9ussis : <strong>sponsorship ex\u00e9cutif<\/strong> (un projet sans portage direction \u00e9choue dans 70 % des cas), cadrage fonctionnel pr\u00e9cis, choix d'un int\u00e9grateur exp\u00e9riment\u00e9 sur votre secteur, formation et adoption utilisateur, et gouvernance projet rigoureuse avec instances de pilotage r\u00e9guli\u00e8res.\r\n          <\/div><\/div>\r\n        <\/div>\r\n\r\n      <\/div>\r\n  <\/div><!-- \/faq-section-wrapper -->\r\n<\/div>\r\n\r\n\r\n\r\n<!-- ============ SEO STRUCTURED DATA (JSON-LD FAQPage) ============ -->\r\n<script type=\"application\/ld+json\">\r\n{\r\n  \"@context\": \"https:\/\/schema.org\",\r\n  \"@type\": \"FAQPage\",\r\n  \"mainEntity\": [\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment calcule-t-on le ROI d'un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le retour sur investissement d'un ERP se calcule avec la formule standard : ROI = (Gains \u2212 Co\u00fbts) \/ Co\u00fbts \u00d7 100, projet\u00e9 sur l'horizon retenu (3, 5, 7 ou 10 ans selon votre choix). C'est la m\u00e9thodologie utilis\u00e9e par les cabinets de r\u00e9f\u00e9rence (Gartner, Panorama Consulting, Forrester) pour \u00e9valuer la rentabilit\u00e9 d'un projet ERP.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Qu'est-ce que le TCO d'un ERP et que comprend-il ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le TCO (Total Cost of Ownership) repr\u00e9sente le co\u00fbt total de possession d'un ERP sur l'horizon retenu. Il inclut quatre postes : licences ou abonnements SaaS, frais d'impl\u00e9mentation, formation des utilisateurs, et maintenance annuelle (18 \u00e0 22 % du co\u00fbt licence pour les ERP on-premise, souvent incluse dans les abonnements SaaS).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment estimer le co\u00fbt d'impl\u00e9mentation d'un ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon les benchmarks Panorama Consulting, le co\u00fbt moyen d'impl\u00e9mentation d'un ERP mid-market s'\u00e9l\u00e8ve \u00e0 plusieurs centaines de milliers d'euros. En r\u00e8gle g\u00e9n\u00e9rale, les entreprises consacrent 1 \u00e0 3 % de leur chiffre d'affaires annuel \u00e0 l'impl\u00e9mentation. Ce co\u00fbt couvre le param\u00e9trage, l'int\u00e9gration, la migration des donn\u00e9es et la conduite du changement. Pour une estimation pr\u00e9cise, demandez un devis \u00e0 un int\u00e9grateur Axelor.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Comment estimer la part de temps pass\u00e9 en t\u00e2ches manuelles ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Estimez la proportion du temps de travail consacr\u00e9e \u00e0 des t\u00e2ches manuelles r\u00e9p\u00e9titives plut\u00f4t qu'au c\u0153ur de m\u00e9tier : ressaisie inter-outils, consolidation Excel, recherche d'informations entre fichiers, g\u00e9n\u00e9ration manuelle de reportings, validation de factures. Pour la plupart des ETI, ce pourcentage se situe entre 15 et 30 %. Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \u00ab se battre avec Excel \u00bb, vous \u00eates \u00e0 ~20 %.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"C'est quoi un co\u00fbt horaire \u00ab charg\u00e9 \u00bb et comment le calculer ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le co\u00fbt horaire charg\u00e9 repr\u00e9sente le co\u00fbt total pour l'entreprise, pas le salaire brut. Il inclut le salaire, les charges patronales, les avantages sociaux, les frais d'\u00e9quipement et les co\u00fbts indirects (bureau, IT). R\u00e8gle empirique : multiplier le salaire brut par 1,3 \u00e0 1,4. Exemple : un salari\u00e9 \u00e0 40 000 \u20ac de salaire brut annuel co\u00fbte 52 000 \u00e0 56 000 \u20ac charg\u00e9s, soit environ 32 \u00e0 35 \u20ac\/h sur une base de 1 600 h travaill\u00e9es.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Cloud SaaS ou On-Premise : quel impact sur le TCO ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon Forrester Research, les ERP cloud r\u00e9duisent le TCO de 30 \u00e0 50 % sur 5 ans par rapport au d\u00e9ploiement on-premise, principalement gr\u00e2ce \u00e0 l'\u00e9limination des co\u00fbts d'infrastructure et de maintenance hardware. \u00c0 l'inverse, l'on-premise peut s'av\u00e9rer plus \u00e9conomique sur 10 ans pour les grandes entreprises avec beaucoup d'utilisateurs et des besoins de personnalisation lourds. Axelor propose les deux mod\u00e8les.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels sont les co\u00fbts cach\u00e9s d'un projet ERP \u00e0 anticiper ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Quatre postes sont souvent sous-estim\u00e9s : temps interne (vos \u00e9quipes mobilis\u00e9es 0,5 \u00e0 1 jour\/semaine par utilisateur cl\u00e9), migration de donn\u00e9es (5 \u00e0 15 % du co\u00fbt d'impl\u00e9mentation), conduite du changement (communication, accompagnement), \u00e9volutions futures (nouveaux modules, int\u00e9grations). Selon Panorama Consulting, plus d'un quart des projets d\u00e9passent leur budget. Anticipez une marge de 15-20 % sur le co\u00fbt d'impl\u00e9mentation.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels signaux indiquent qu'il faut changer d'ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Cinq signaux indiquent qu'un ERP arrive en fin de vie : multiplication des fichiers Excel en parall\u00e8le de l'ERP, impossibilit\u00e9 d'int\u00e9grer les nouveaux outils (CRM, e-commerce, IA), temps de cl\u00f4ture comptable qui s'allonge, incapacit\u00e9 \u00e0 \u00e9voluer sans co\u00fbt de d\u00e9veloppement majeur, et support \u00e9diteur d\u00e9grad\u00e9 (fin de version, hausses tarifaires). La dur\u00e9e de vie moyenne d'un ERP est de 7 \u00e0 10 ans.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Pourquoi 18-22 % de maintenance annuelle ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"C'est le standard du march\u00e9 ERP, appliqu\u00e9 par tous les \u00e9diteurs (SAP, Sage, Microsoft Dynamics, Oracle, Axelor). Ce pourcentage couvre les mises \u00e0 jour fonctionnelles, les correctifs de s\u00e9curit\u00e9, le support technique et la mise en conformit\u00e9 r\u00e9glementaire (fiscale, comptable, RGPD).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"D'o\u00f9 viennent les taux d'automatisation utilis\u00e9s ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Le taux d'automatisation varie selon le sc\u00e9nario retenu : 40 % (Conservateur), 60 % (R\u00e9aliste), 70 % (Optimiste). Ces fourchettes sont inspir\u00e9es des benchmarks McKinsey Global Institute sur l'automatisation des activit\u00e9s tertiaires et des rapports Panorama Consulting sur les d\u00e9ploiements ERP mid-market. Ils repr\u00e9sentent la part des t\u00e2ches manuelles r\u00e9p\u00e9titives (ressaisie, reporting, consolidation Excel) qu'un ERP int\u00e9gr\u00e9 permet d'\u00e9liminer ou de r\u00e9duire fortement. Le sc\u00e9nario R\u00e9aliste refl\u00e8te une adoption normale ; le Conservateur prend une marge de prudence pour d\u00e9fendre le projet devant un comit\u00e9.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"D'o\u00f9 viennent les taux de r\u00e9duction d'erreurs utilis\u00e9s ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Comme pour l'automatisation, le taux varie selon le sc\u00e9nario : 50 % (Conservateur), 70 % (R\u00e9aliste), 80 % (Optimiste). Ces ordres de grandeur s'inspirent des rapports annuels Panorama Consulting et IBM Data Quality Studies sur plusieurs centaines d'impl\u00e9mentations ERP. La r\u00e9duction provient de l'\u00e9limination de la ressaisie inter-outils, des r\u00e8gles de validation automatiques, de la tra\u00e7abilit\u00e9 compl\u00e8te et des contr\u00f4les de coh\u00e9rence en temps r\u00e9el.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quel est le d\u00e9lai de retour moyen sur un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Selon Panorama Consulting et Gartner, le payback se situe entre 12 et 24 mois pour un projet mid-market bien cadr\u00e9, avec une moyenne autour de 18 mois. Les projets simples bien men\u00e9s peuvent descendre \u00e0 6-12 mois ; les projets mal pr\u00e9par\u00e9s d\u00e9passent 36 mois. Note m\u00e9thodologique : ce calculateur affiche un point d'\u00e9quilibre actualis\u00e9 (flux ramen\u00e9s en valeur pr\u00e9sente au WACC), l\u00e9g\u00e8rement plus prudent que le payback nominal des benchmarks ci-dessus. L'\u00e9cart est faible sur les paybacks courts (~12-18 mois), plus visible sur les paybacks longs.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Faut-il prendre en compte le co\u00fbt de mon ERP\/CRM actuel ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Oui, absolument. C'est ce qu'on appelle le co\u00fbt de l'inaction, et c'est souvent un pilier de gain important dans un projet ERP de remplacement. Si vous payez aujourd'hui des licences Sage, Cegid, SAP B1, Microsoft Dynamics, ou un patchwork de SaaS \u00e9parpill\u00e9s (compta + CRM + outils m\u00e9tier), ces co\u00fbts peuvent dispara\u00eetre avec un ERP int\u00e9gr\u00e9 comme Axelor. Renseignez le champ \u00ab Co\u00fbt annuel de vos syst\u00e8mes actuels \u00bb dans l'\u00e9tape 1 : il est optionnel et peut modifier significativement le ROI lorsqu'un ERP ou plusieurs outils existants sont effectivement remplac\u00e9s. Ce calculateur applique ces \u00e9conomies sans courbe de mont\u00e9e en charge, car la d\u00e9pense \u00e9vit\u00e9e est imm\u00e9diate (vous arr\u00eatez les abonnements au go-live).\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"\u00c0 partir de quelle taille un ERP est-il rentable ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"\u00c0 partir d'environ 10 utilisateurs, un ERP peut devenir rentable si les volumes de t\u00e2ches manuelles, les co\u00fbts d'erreurs ou les syst\u00e8mes remplac\u00e9s sont suffisants. La rentabilit\u00e9 d\u00e9pend moins du nombre d'utilisateurs que du p\u00e9rim\u00e8tre, du co\u00fbt projet et des gains op\u00e9rationnels r\u00e9ellement capturables. Sur des projets bien cadr\u00e9s en ETI, le ROI typique sur 5 ans se situe entre 150 et 450 % en sc\u00e9nario r\u00e9aliste, mais un projet trop ambitieux pour une \u00e9quipe trop petite peut tr\u00e8s bien afficher un ROI n\u00e9gatif. C'est pr\u00e9cis\u00e9ment ce que ce calculateur permet de v\u00e9rifier avant l'engagement budg\u00e9taire.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Pourquoi un ERP open source comme Axelor ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Quatre avantages : transparence du code (pas de bo\u00eete noire), ma\u00eetrise du TCO (pas de co\u00fbts cach\u00e9s), souverainet\u00e9 des donn\u00e9es (cloud priv\u00e9, on-premise ou h\u00e9bergeur souverain europ\u00e9en), et personnalisation illimit\u00e9e gr\u00e2ce \u00e0 la plateforme No-Code Axelor.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Combien de temps prend l'impl\u00e9mentation d'un ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"La dur\u00e9e d\u00e9pend du p\u00e9rim\u00e8tre fonctionnel : 2 \u00e0 4 mois pour un p\u00e9rim\u00e8tre limit\u00e9 (CRM ou compta seuls), 4 \u00e0 8 mois pour 3 \u00e0 5 modules int\u00e9gr\u00e9s, 8 \u00e0 18 mois pour un ERP int\u00e9gr\u00e9 complet. L'approche No-Code Axelor r\u00e9duit significativement ces d\u00e9lais : ce qui prendrait 6 mois en d\u00e9veloppement traditionnel se param\u00e8tre souvent en 6 semaines avec Axelor Studio.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Qu'est-ce qu'un ERP agentique, et qu'est-ce que \u00e7a change pour mon ROI ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Un ERP agentique int\u00e8gre une IA qui agit directement sur vos donn\u00e9es m\u00e9tier, et ne se contente pas de r\u00e9pondre \u00e0 des questions. Concr\u00e8tement, elle peut saisir des factures, d\u00e9clencher des r\u00e8gles de gestion, planifier, anticiper une rupture de stock ou un retard. Ce sont autant de t\u00e2ches qui, jusqu'ici, mobilisaient du temps humain : c'est exactement le poste de \u00ab gains de productivit\u00e9 \u00bb que ce calculateur estime. Plus ces t\u00e2ches sont automatis\u00e9es, plus le retour sur investissement est rapide.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Concr\u00e8tement, que peut faire l'IA agentique d'Axelor ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"L'IA d'Axelor couvre plusieurs usages : automatiser les saisies et les r\u00e8gles m\u00e9tier, optimiser la planification (production, tourn\u00e9es, ressources), anticiper les ruptures, retards et besoins de tr\u00e9sorerie, rechercher l'information dans vos donn\u00e9es en langage naturel, et m\u00eame cr\u00e9er des \u00e9crans, des champs ou des tableaux de bord sans \u00e9crire de code, simplement en d\u00e9crivant le besoin. Cette capacit\u00e9 No-Code est le vrai diff\u00e9renciateur : vous adaptez l'ERP \u00e0 vos processus, pas l'inverse.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"L'IA a-t-elle acc\u00e8s \u00e0 toutes mes donn\u00e9es ? Est-ce s\u00e9curis\u00e9 ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Oui, et c'est encadr\u00e9 par construction. Chez Axelor, chaque demande adress\u00e9e \u00e0 l'IA passe par une couche interm\u00e9diaire qui applique vos permissions avant d'acc\u00e9der \u00e0 la base de donn\u00e9es : l'IA ne voit et ne modifie que ce que l'utilisateur a le droit de voir et de modifier. Vos donn\u00e9es ne servent jamais \u00e0 entra\u00eener un mod\u00e8le externe, et vous gardez la ma\u00eetrise de l'h\u00e9bergement (cloud, priv\u00e9 ou sur vos serveurs). La conformit\u00e9 RGPD et le contr\u00f4le des acc\u00e8s sont donc natifs, pas ajout\u00e9s apr\u00e8s coup.\"\r\n      }\r\n    },\r\n    {\r\n      \"@type\": \"Question\",\r\n      \"name\": \"Quels sont les facteurs cl\u00e9s de succ\u00e8s d'un projet ERP ?\",\r\n      \"acceptedAnswer\": {\r\n        \"@type\": \"Answer\",\r\n        \"text\": \"Cinq facteurs distinguent les projets ERP r\u00e9ussis : sponsorship ex\u00e9cutif (un projet sans portage direction \u00e9choue dans 70 % des cas), cadrage fonctionnel pr\u00e9cis, choix d'un int\u00e9grateur exp\u00e9riment\u00e9 sur votre secteur, formation et adoption utilisateur, et gouvernance projet rigoureuse avec instances de pilotage r\u00e9guli\u00e8res.\"\r\n      }\r\n    }\r\n  ]\r\n}\r\n<\/script>\r\n\r\n<script>\r\n\/\/ =====================================================\r\n\/\/ ==== SYST\u00c8ME DE DEVISES MULTI-CURRENCY (V11) ====\r\n\/\/ =====================================================\r\n\r\nconst CURRENCIES = {\r\n  \/\/ Devises principales (mises en avant)\r\n  EUR: { name: \"Euro\", symbol: \"\u20ac\", code: \"EUR\", locale: \"fr-FR\", position: \"after\", flag: \"\u20ac\", main: true },\r\n  USD: { name: \"Dollar am\u00e9ricain\", symbol: \"$\", code: \"USD\", locale: \"en-US\", position: \"before\", flag: \"$\", main: true },\r\n  GBP: { name: \"Livre sterling\", symbol: \"\u00a3\", code: \"GBP\", locale: \"en-GB\", position: \"before\", flag: \"\u00a3\", main: true },\r\n  MAD: { name: \"Dirham marocain\", symbol: \"DH\", code: \"MAD\", locale: \"fr-MA\", position: \"after\", flag: \"\u062f.\u0645\", main: true },\r\n  CHF: { name: \"Franc suisse\", symbol: \"CHF\", code: \"CHF\", locale: \"fr-CH\", position: \"after\", flag: \"Fr\", main: true },\r\n  CAD: { name: \"Dollar canadien\", symbol: \"$ CA\", code: \"CAD\", locale: \"fr-CA\", position: \"after\", flag: \"$\" , main: true },\r\n\r\n  \/\/ Autres devises\r\n  AED: { name: \"Dirham des \u00c9mirats\", symbol: \"AED\", code: \"AED\", locale: \"ar-AE\", position: \"after\", flag: \"\u062f.\u0625\" },\r\n  AUD: { name: \"Dollar australien\", symbol: \"$ AU\", code: \"AUD\", locale: \"en-AU\", position: \"after\", flag: \"$\" },\r\n  BRL: { name: \"Real br\u00e9silien\", symbol: \"R$\", code: \"BRL\", locale: \"pt-BR\", position: \"before\", flag: \"R$\" },\r\n  CNY: { name: \"Yuan chinois\", symbol: \"\u00a5\", code: \"CNY\", locale: \"zh-CN\", position: \"before\", flag: \"\u00a5\" },\r\n  DZD: { name: \"Dinar alg\u00e9rien\", symbol: \"DA\", code: \"DZD\", locale: \"fr-DZ\", position: \"after\", flag: \"\u062f.\u062c\" },\r\n  EGP: { name: \"Livre \u00e9gyptienne\", symbol: \"E\u00a3\", code: \"EGP\", locale: \"ar-EG\", position: \"before\", flag: \"\u062c.\u0645\" },\r\n  HKD: { name: \"Dollar hongkongais\", symbol: \"HK$\", code: \"HKD\", locale: \"en-HK\", position: \"before\", flag: \"$\" },\r\n  INR: { name: \"Roupie indienne\", symbol: \"\u20b9\", code: \"INR\", locale: \"en-IN\", position: \"before\", flag: \"\u20b9\" },\r\n  JPY: { name: \"Yen japonais\", symbol: \"\u00a5\", code: \"JPY\", locale: \"ja-JP\", position: \"before\", flag: \"\u00a5\", noDecimal: true },\r\n  KRW: { name: \"Won sud-cor\u00e9en\", symbol: \"\u20a9\", code: \"KRW\", locale: \"ko-KR\", position: \"before\", flag: \"\u20a9\", noDecimal: true },\r\n  MXN: { name: \"Peso mexicain\", symbol: \"$\", code: \"MXN\", locale: \"es-MX\", position: \"before\", flag: \"$\" },\r\n  NOK: { name: \"Couronne norv\u00e9gienne\", symbol: \"kr\", code: \"NOK\", locale: \"nb-NO\", position: \"after\", flag: \"kr\" },\r\n  NZD: { name: \"Dollar n\u00e9o-z\u00e9landais\", symbol: \"$ NZ\", code: \"NZD\", locale: \"en-NZ\", position: \"after\", flag: \"$\" },\r\n  PLN: { name: \"Z\u0142oty polonais\", symbol: \"z\u0142\", code: \"PLN\", locale: \"pl-PL\", position: \"after\", flag: \"z\u0142\" },\r\n  RUB: { name: \"Rouble russe\", symbol: \"\u20bd\", code: \"RUB\", locale: \"ru-RU\", position: \"after\", flag: \"\u20bd\" },\r\n  SAR: { name: \"Riyal saoudien\", symbol: \"SR\", code: \"SAR\", locale: \"ar-SA\", position: \"after\", flag: \"\u0631.\u0633\" },\r\n  SEK: { name: \"Couronne su\u00e9doise\", symbol: \"kr\", code: \"SEK\", locale: \"sv-SE\", position: \"after\", flag: \"kr\" },\r\n  SGD: { name: \"Dollar de Singapour\", symbol: \"S$\", code: \"SGD\", locale: \"en-SG\", position: \"before\", flag: \"$\" },\r\n  TND: { name: \"Dinar tunisien\", symbol: \"DT\", code: \"TND\", locale: \"fr-TN\", position: \"after\", flag: \"\u062f.\u062a\" },\r\n  TRY: { name: \"Livre turque\", symbol: \"\u20ba\", code: \"TRY\", locale: \"tr-TR\", position: \"after\", flag: \"\u20ba\" },\r\n  XOF: { name: \"Franc CFA (BCEAO)\", symbol: \"CFA\", code: \"XOF\", locale: \"fr-FR\", position: \"after\", flag: \"Fr\", noDecimal: true },\r\n  ZAR: { name: \"Rand sud-africain\", symbol: \"R\", code: \"ZAR\", locale: \"en-ZA\", position: \"before\", flag: \"R\" },\r\n};\r\n\r\nlet currentCurrency = \"EUR\";\r\n\r\n\/\/ [FIX] Ex\u00e9cute fn imm\u00e9diatement si le DOM est d\u00e9j\u00e0 pr\u00eat, sinon au DOMContentLoaded.\r\n\/\/ En prod, WordPress\/Divi charge ce script APR\u00c8S le DOM : sans ce garde, les blocs\r\n\/\/ DOMContentLoaded (sc\u00e9nario, horizon, devise, aide, toggles) ne s'ex\u00e9cutaient JAMAIS\r\n\/\/ -> curseur conservateur\/r\u00e9aliste\/optimiste mort, info fig\u00e9e sur \"60 %\", horizon inerte.\r\nfunction ready(fn){ if (document.readyState !== 'loading') { fn(); } else { document.addEventListener('DOMContentLoaded', fn); } }\r\n\r\n\/\/ R\u00e9cup\u00e8re depuis localStorage ou d\u00e9faut\r\ntry {\r\n  const saved = localStorage.getItem('axelor_roi_currency');\r\n  if (saved && CURRENCIES[saved]) currentCurrency = saved;\r\n} catch (e) { \/* localStorage indisponible, on garde EUR *\/ }\r\n\r\nfunction getCurrency() { return CURRENCIES[currentCurrency]; }\r\n\r\nfunction updateCurrencyDisplay() {\r\n  const cur = getCurrency();\r\n  \/\/ Trigger header\r\n  document.getElementById('curFlag').textContent = cur.flag;\r\n  document.getElementById('curCode').textContent = cur.code;\r\n  document.getElementById('curName').textContent = cur.name;\r\n  \/\/ Symboles dans labels (span.currency-symbol)\r\n  document.querySelectorAll('.currency-symbol').forEach(el => el.textContent = cur.symbol);\r\n  \/\/ Symboles dans pr\u00e9fixes d'inputs : on utilise un span enfant (fiable cross-browser)\r\n  document.querySelectorAll('.currency-prefix').forEach(el => {\r\n    el.setAttribute('data-prefix', cur.symbol); \/\/ garde la compat ::before\r\n    el.classList.add('has-symbol'); \/\/ masque le ::before pour \u00e9viter doublon\r\n    let span = el.querySelector('.prefix-symbol');\r\n    if (!span) {\r\n      span = document.createElement('span');\r\n      span.className = 'prefix-symbol';\r\n      el.insertBefore(span, el.firstChild);\r\n    }\r\n    span.textContent = cur.symbol;\r\n    \/\/ Ajuste le padding-left de l'input selon la largeur du symbole\r\n    const len = cur.symbol.length;\r\n    el.classList.remove('wide-prefix', 'xwide-prefix');\r\n    if (len >= 4) el.classList.add('xwide-prefix');\r\n    else if (len >= 2) el.classList.add('wide-prefix');\r\n  });\r\n  \/\/ Marquer actif dans dropdown\r\n  document.querySelectorAll('.currency-option').forEach(el => {\r\n    el.classList.toggle('active', el.dataset.code === currentCurrency);\r\n  });\r\n}\r\n\r\nfunction renderCurrencyList() {\r\n  const mainContainer = document.getElementById('currencyMain');\r\n  const otherContainer = document.getElementById('currencyOther');\r\n  mainContainer.innerHTML = '';\r\n  otherContainer.innerHTML = '';\r\n  Object.values(CURRENCIES).forEach(cur => {\r\n    const opt = document.createElement('div');\r\n    opt.className = 'currency-option' + (cur.code === currentCurrency ? ' active' : '');\r\n    opt.dataset.code = cur.code;\r\n    opt.dataset.search = (cur.name + ' ' + cur.code + ' ' + cur.symbol).toLowerCase();\r\n    opt.innerHTML = `\r\n      <div class=\"opt-flag\">${cur.flag}<\/div>\r\n      <div class=\"opt-info\">\r\n        <div class=\"opt-name\">${cur.name}<\/div>\r\n        <div class=\"opt-code\">${cur.code} | ${cur.symbol}<\/div>\r\n      <\/div>\r\n      <svg class=\"opt-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"\/><\/svg>\r\n    `;\r\n    opt.addEventListener('click', () => selectCurrency(cur.code));\r\n    if (cur.main) mainContainer.appendChild(opt);\r\n    else otherContainer.appendChild(opt);\r\n  });\r\n}\r\n\r\nfunction selectCurrency(code) {\r\n  if (!CURRENCIES[code]) return;\r\n  currentCurrency = code;\r\n  try { localStorage.setItem('axelor_roi_currency', code); } catch (e) {}\r\n  updateCurrencyDisplay();\r\n  if (typeof calculate === 'function') calculate();\r\n  closeCurrencyDropdown();\r\n  showCurrencyToast();\r\n}\r\n\r\nfunction showCurrencyToast() {\r\n  const cur = getCurrency();\r\n  const toast = document.getElementById('currencyToast');\r\n  document.getElementById('toastText').textContent = `Devise chang\u00e9e : ${cur.name} (${cur.symbol})`;\r\n  toast.classList.add('show');\r\n  clearTimeout(window._curToastTimer);\r\n  window._curToastTimer = setTimeout(() => toast.classList.remove('show'), 2400);\r\n}\r\n\r\nfunction openCurrencyDropdown() {\r\n  const sw = document.getElementById('currencySwitcher');\r\n  sw.classList.add('open');\r\n  document.getElementById('currencyTrigger').setAttribute('aria-expanded', 'true');\r\n  setTimeout(() => document.getElementById('currencySearch').focus(), 50);\r\n}\r\nfunction closeCurrencyDropdown() {\r\n  const sw = document.getElementById('currencySwitcher');\r\n  sw.classList.remove('open');\r\n  document.getElementById('currencyTrigger').setAttribute('aria-expanded', 'false');\r\n  document.getElementById('currencySearch').value = '';\r\n  filterCurrencies('');\r\n}\r\nfunction filterCurrencies(query) {\r\n  const q = query.toLowerCase().trim();\r\n  document.querySelectorAll('.currency-option').forEach(opt => {\r\n    opt.style.display = (!q || opt.dataset.search.includes(q)) ? 'flex' : 'none';\r\n  });\r\n}\r\n\r\n\/\/ Init au DOM ready\r\nready(function() {\r\n  renderCurrencyList();\r\n  updateCurrencyDisplay();\r\n\r\n  document.getElementById('currencyTrigger').addEventListener('click', (e) => {\r\n    e.stopPropagation();\r\n    const isOpen = document.getElementById('currencySwitcher').classList.contains('open');\r\n    isOpen ? closeCurrencyDropdown() : openCurrencyDropdown();\r\n  });\r\n  document.addEventListener('click', (e) => {\r\n    if (!e.target.closest('#currencySwitcher')) closeCurrencyDropdown();\r\n  });\r\n  document.getElementById('currencySearch').addEventListener('input', (e) => {\r\n    filterCurrencies(e.target.value);\r\n  });\r\n  document.getElementById('currencySearch').addEventListener('keydown', (e) => {\r\n    if (e.key === 'Escape') closeCurrencyDropdown();\r\n  });\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FIN SYST\u00c8ME DEVISES ====\r\n\/\/ =====================================================\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== SYST\u00c8ME D'AIDE - TOOLTIPS PAR CHAMP ====\r\n\/\/ =====================================================\r\n\r\nconst HELP_CONTENT = {\r\n  users: {\r\n    title: \"Nombre d'utilisateurs ERP\",\r\n    body: `<p>Il s'agit du <strong>nombre total de personnes<\/strong> qui utiliseront l'ERP Axelor au quotidien : \u00e9quipes commerciales, comptables, RH, op\u00e9rations, direction.<\/p>\r\n      <p>Plus le nombre est \u00e9lev\u00e9, plus les co\u00fbts de licence et formation augmentent, mais les <strong>gains de productivit\u00e9 aussi<\/strong> - l'ERP devient une plateforme commune.<\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Exemple<\/div>\r\n        Une PME de 80 salari\u00e9s \u00e9quipe typiquement 25 \u00e0 35 utilisateurs ERP (hors production atelier).\r\n      <\/div>`\r\n  },\r\n  licenseCost: {\r\n    title: \"Co\u00fbt de licence par utilisateur\",\r\n    body: `<p>Co\u00fbt mensuel de la licence SaaS par utilisateur, hors impl\u00e9mentation et formation. Ce chiffre d\u00e9pend de l'\u00e9diteur et du p\u00e9rim\u00e8tre fonctionnel (modules activ\u00e9s).<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul annuel<\/div>\r\n        Co\u00fbt licence \u00d7 Utilisateurs \u00d7 12 mois\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8re march\u00e9 2026<\/div>\r\n        ERP mid-market en SaaS : entre <strong>50 et 150 \u20ac\/user\/mois<\/strong>. Axelor se positionne \u00e0 <strong>55 \u20ac\/user\/mois<\/strong> en moyenne pour le pack standard - un positionnement particuli\u00e8rement comp\u00e9titif.\r\n      <\/div>`\r\n  },\r\n  implementationCost: {\r\n    title: \"Co\u00fbt d'impl\u00e9mentation\",\r\n    body: `<p>Co\u00fbt total du projet de d\u00e9ploiement : analyse fonctionnelle, param\u00e9trage, d\u00e9veloppements sp\u00e9cifiques, migration des donn\u00e9es, recettage, conduite du changement.<\/p>\r\n      <p>C'est une <strong>d\u00e9pense ponctuelle<\/strong> (one-shot) qui couvre l'ensemble du projet jusqu'au go-live.<\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8re march\u00e9<\/div>\r\n        Pour une ETI 30-50 utilisateurs : <strong>40 000 \u00e0 120 000 \u20ac<\/strong>. Le calculateur ajoute automatiquement une <strong>marge de 15 %<\/strong> pour couvrir les co\u00fbts cach\u00e9s (changement de scope, prolongation, etc.).\r\n      <\/div>`\r\n  },\r\n  trainingCost: {\r\n    title: \"Co\u00fbt de formation (total projet)\",\r\n    body: `<p>Budget global consacr\u00e9 \u00e0 la formation de vos \u00e9quipes : prise en main de l'outil, supports p\u00e9dagogiques et accompagnement au d\u00e9marrage. C'est un <strong>forfait pour l'ensemble du projet<\/strong>, et non un co\u00fbt par utilisateur.<\/p>\r\n      <p>Le montant varie selon le nombre d'\u00e9quipes \u00e0 former, le p\u00e9rim\u00e8tre d\u00e9ploy\u00e9 et le format retenu. La valeur pr\u00e9-remplie n'est qu'une <strong>estimation de d\u00e9part<\/strong> : ajustez-la avec votre propre budget, ou \u00e9changez avec nos \u00e9quipes pour un chiffrage adapt\u00e9 \u00e0 votre organisation.<\/p>`\r\n  },\r\n  maintenancePct: {\r\n    title: \"Maintenance annuelle\",\r\n    body: `<p>Pourcentage annuel du co\u00fbt licence d\u00e9di\u00e9 \u00e0 la maintenance \u00e9volutive et corrective : mont\u00e9es de version, patchs s\u00e9curit\u00e9, support utilisateur, hotline.<\/p>\r\n      <p><strong>Chez Axelor<\/strong>, la maintenance de la plateforme standard est <strong>100 % incluse dans l'abonnement<\/strong> : laissez l'option \u00ab Maintenance d\u00e9j\u00e0 incluse \u00bb coch\u00e9e. Si votre projet comporte des <strong>d\u00e9veloppements sp\u00e9cifiques sur-mesure<\/strong>, pr\u00e9voyez une maintenance du sp\u00e9cifique d'environ <strong>15 % du co\u00fbt de ces d\u00e9veloppements<\/strong>.<\/p>\r\n      <p><strong>En mode SaaS en g\u00e9n\u00e9ral<\/strong>, la maintenance est d\u00e9j\u00e0 incluse dans l'abonnement mensuel : le calculateur n'ajoute alors aucun co\u00fbt suppl\u00e9mentaire. D\u00e9cochez l'option uniquement si votre \u00e9diteur facture la maintenance <em>en plus<\/em> (cas typique : ERP on-premise ou licences perp\u00e9tuelles).<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul (si non incluse)<\/div>\r\n        (Licences annuelles) \u00d7 (% maintenance) \u00d7 horizon s\u00e9lectionn\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Standard march\u00e9<\/div>\r\n        Entre <strong>18 et 22 %<\/strong> du co\u00fbt licence annuel pour les ERP on-premise. Au-del\u00e0 de 25 %, n\u00e9gociez.\r\n      <\/div>`\r\n  },\r\n  hostingCost: {\r\n    title: \"H\u00e9bergement annuel\",\r\n    body: `<p>Co\u00fbt annuel de l'infrastructure qui fait tourner votre ERP : serveurs, h\u00e9bergement cloud ou on-premise, sauvegardes, supervision et s\u00e9curit\u00e9.<\/p>\r\n      <p><strong>\u26a0\ufe0f En mode SaaS<\/strong>, l'h\u00e9bergement est g\u00e9n\u00e9ralement <strong>d\u00e9j\u00e0 compris dans l'abonnement mensuel<\/strong>. Si c'est votre cas, laissez coch\u00e9e l'option \u00ab H\u00e9bergement d\u00e9j\u00e0 inclus \u00bb juste sous le champ : le calculateur n'ajoutera aucun co\u00fbt.<\/p>\r\n      <p>D\u00e9cochez l'option uniquement si vous h\u00e9bergez en interne ou sur votre propre cloud (cas on-premise ou cloud priv\u00e9), o\u00f9 ces frais restent \u00e0 votre charge.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul (si non inclus)<\/div>\r\n        (H\u00e9bergement annuel) \u00d7 horizon s\u00e9lectionn\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8res march\u00e9<\/div>\r\n        <strong>PME jusqu'\u00e0 80 utilisateurs<\/strong> : souvent 2 000 \u00e0 8 000 \u20ac\/an pour un serveur d\u00e9di\u00e9 ou un cloud priv\u00e9.<br>\r\n        <strong>ETI de 81 \u00e0 300 utilisateurs<\/strong> : g\u00e9n\u00e9ralement 8 000 \u00e0 24 000 \u20ac\/an selon la redondance, les sauvegardes et le niveau de s\u00e9curit\u00e9.<br>\r\n        <strong>Grands Comptes, plus de 300 utilisateurs<\/strong> : au-del\u00e0 de 24 000 \u20ac\/an.\r\n      <\/div>`\r\n  },\r\n  existingSystemsCost: {\r\n    title: \"Co\u00fbt annuel de vos syst\u00e8mes actuels\",\r\n    body: `<p>Si vous remplacez un ou plusieurs syst\u00e8mes existants (vieil ERP, CRM s\u00e9par\u00e9, logiciel de compta, outils m\u00e9tier sp\u00e9cialis\u00e9s, abonnements SaaS \u00e9parpill\u00e9s, serveurs on-premise\u2026), renseignez <strong>uniquement les co\u00fbts qui pourront r\u00e9ellement \u00eatre supprim\u00e9s ou fortement r\u00e9duits<\/strong> apr\u00e8s la mise en place d'Axelor.<\/p>\r\n      <p style=\"margin-bottom:14px;\">C'est ce qu'on appelle le <strong>co\u00fbt de l'inaction<\/strong> : la d\u00e9pense que vous continuez \u00e0 payer chaque ann\u00e9e si vous ne changez rien. Pour beaucoup d'entreprises en projet de remplacement, c'est <em>un pilier de gain important<\/em> du ROI ERP.<\/p>\r\n      <p style=\"margin-bottom:14px;\">\u00c0 inclure (uniquement si effectivement remplac\u00e9) :<\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>Licences & abonnements<\/strong> de l'ERP\/CRM\/compta actuels (Sage, SAP, Microsoft Dynamics, Salesforce, EBP, Cegid\u2026)<\/li>\r\n        <li><strong>Maintenance annuelle<\/strong> factur\u00e9e par l'\u00e9diteur (18-22 % du licence on-premise)<\/li>\r\n        <li><strong>Infrastructure<\/strong> : serveurs, sauvegardes, s\u00e9curit\u00e9, h\u00e9bergement<\/li>\r\n        <li><strong>Outils SaaS satellites<\/strong> que l'ERP int\u00e9gr\u00e9 remplace (gestion stocks, GED, paie s\u00e9par\u00e9e, RH, ticketing\u2026)<\/li>\r\n        <li><strong>Prestataires<\/strong> de maintenance ou d'\u00e9volution externes<\/li>\r\n      <\/ul>\r\n      <p style=\"margin-bottom:14px; color: var(--wheelwright); font-size: 13.5px;\"><em>\u26a0\ufe0f N'incluez pas les outils que vous pr\u00e9voyez de garder en parall\u00e8le d'Axelor (ex : un outil de paie maintenu, une solution sectorielle conserv\u00e9e).<\/em><\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain<\/div>\r\n        Co\u00fbt annuel \u00d7 horizon s\u00e9lectionn\u00e9, actualis\u00e9 au WACC\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Rep\u00e8res march\u00e9<\/div>\r\n        <strong>PME jusqu'\u00e0 80 utilisateurs<\/strong> : souvent 5 000 \u00e0 25 000 \u20ac\/an (Sage 100, EBP, plusieurs SaaS).<br>\r\n        <strong>ETI de 81 \u00e0 300 utilisateurs<\/strong> : g\u00e9n\u00e9ralement 20 000 \u00e0 80 000 \u20ac\/an (Cegid, ancien SAP B1, Dynamics NAV\u2026).<br>\r\n        <strong>Grands Comptes, plus de 300 utilisateurs<\/strong> : facilement au-del\u00e0 de 100 000 \u20ac\/an.\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Vous d\u00e9marrez de z\u00e9ro ?<\/div>\r\n        Si vous lancez votre premi\u00e8re solution ERP int\u00e9gr\u00e9e et ne remplacez rien (cas d'une premi\u00e8re impl\u00e9mentation), laissez ce champ vide. C'est le comportement par d\u00e9faut.\r\n      <\/div>`\r\n  },\r\n  manualHours: {\r\n    title: \"Part du temps en t\u00e2ches manuelles\",\r\n    body: `<p>Estimez la <strong>proportion du temps de travail<\/strong> que vos \u00e9quipes consacrent \u00e0 des t\u00e2ches manuelles et r\u00e9p\u00e9titives plut\u00f4t qu'\u00e0 leur c\u0153ur de m\u00e9tier.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ces t\u00e2ches sont typiquement :<\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>Ressaisie<\/strong> entre logiciels non connect\u00e9s (CRM \u2192 Excel \u2192 ERP)<\/li>\r\n        <li><strong>Consolidation<\/strong> manuelle de tableaux Excel<\/li>\r\n        <li><strong>Reporting<\/strong> hebdomadaire \/ mensuel construit \u00e0 la main<\/li>\r\n        <li><strong>Suivi de factures<\/strong>, relances, classement de documents<\/li>\r\n        <li><strong>Recherches<\/strong> dispers\u00e9es entre 4-5 outils diff\u00e9rents<\/li>\r\n      <\/ul>\r\n      <p>Le calculateur retient <strong>40 %<\/strong> de ces t\u00e2ches automatis\u00e9es en sc\u00e9nario Conservateur, <strong>60 %<\/strong> en R\u00e9aliste et <strong>70 %<\/strong> en Optimiste, selon le niveau d'hypoth\u00e8ses que vous s\u00e9lectionnez.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ces taux sont des <strong>hypoth\u00e8ses de mod\u00e9lisation Axelor<\/strong>, inspir\u00e9es des travaux publi\u00e9s sur l'automatisation des activit\u00e9s tertiaires. Ce ne sont pas des chiffres mesur\u00e9s chez un client.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain annuel<\/div>\r\n        % \u00d7 1 600 h\/an \u00d7 Utilisateurs \u00d7 Taux d'automatisation \u00d7 Co\u00fbt horaire\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Ordres de grandeur indicatifs par secteur<\/div>\r\n        <strong>Services & conseil<\/strong> : 15 \u00e0 25 %<br>\r\n        <strong>Industrie & BTP (fonctions administratives)<\/strong> : 20 \u00e0 30 %<br>\r\n        <strong>Comptabilit\u00e9 & finance<\/strong> : 30 \u00e0 40 %<br>\r\n        <strong>Distribution & logistique<\/strong> : 25 \u00e0 35 %<br>\r\n        <strong>Secteur public & associatif<\/strong> : 30 \u00e0 40 %<br><br>\r\n        <em>Fourchettes indicatives \u00e9tablies par Axelor \u00e0 partir de ses projets, et non des donn\u00e9es de march\u00e9 publi\u00e9es. \u00c0 confronter \u00e0 votre propre observation terrain.<\/em>\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Comment estimer ?<\/div>\r\n        Pensez \u00e0 une journ\u00e9e type. Sur 8 heures, combien sont consacr\u00e9es \u00e0 <em>produire de la valeur<\/em> (vente, conseil, conception, production) vs <em>traiter de l'information<\/em> (saisie, recherche, consolidation) ? Si vos \u00e9quipes vous disent passer ~1 jour sur 5 \u00e0 \"se battre avec Excel\", vous \u00eates \u00e0 <strong>~20 %<\/strong>.\r\n      <\/div>`\r\n  },\r\n  hourlyRate: {\r\n    title: \"Co\u00fbt horaire charg\u00e9\",\r\n    body: `<p>Co\u00fbt horaire <strong>total pour l'entreprise<\/strong> d'un collaborateur : salaire brut + charges patronales + avantages sociaux + \u00e9quipement + co\u00fbts indirects (bureau, IT).<\/p>\r\n      <p>Ce n'est <strong>pas<\/strong> le salaire brut ni le co\u00fbt employeur strict.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">R\u00e8gle empirique<\/div>\r\n        Salaire brut \u00d7 1,3 \u00e0 1,4 = co\u00fbt charg\u00e9\r\n      <\/div>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Exemple concret<\/div>\r\n        Salaire brut 40 000 \u20ac\/an \u2192 co\u00fbt charg\u00e9 annuel 52 \u00e0 56 000 \u20ac \u2192 <strong>32 \u00e0 35 \u20ac\/h<\/strong> (sur base 1 600 h travaill\u00e9es).\r\n      <\/div>`\r\n  },\r\n  dataReliability: {\r\n    title: \"Fiabilit\u00e9 actuelle des donn\u00e9es\",\r\n    body: `<p>Estimez \u00e0 quel point vos donn\u00e9es et processus m\u00e9tier sont <strong>fiables et unifi\u00e9s<\/strong> aujourd'hui. C'est une perception qualitative - pas besoin de chiffre exact.<\/p>\r\n      <p style=\"margin-bottom:14px;\">Plus vos donn\u00e9es sont fragment\u00e9es (multiples Excel, ressaisies manuelles, \u00e9carts entre syst\u00e8mes), plus l'ERP int\u00e9gr\u00e9 apporte de valeur en \u00e9liminant les erreurs.<\/p>\r\n      <p style=\"margin-bottom:14px;\"><strong>Signaux de faible fiabilit\u00e9 (\u2264 30 %)<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li>Mes \u00e9quipes ressaisissent les m\u00eames donn\u00e9es dans plusieurs outils<\/li>\r\n        <li>J'ai r\u00e9guli\u00e8rement des \u00e9carts entre la compta et l'op\u00e9rationnel<\/li>\r\n        <li>Les rapports manuels Excel sont sources d'erreurs r\u00e9currentes<\/li>\r\n        <li>Je d\u00e9couvre des doublons clients ou produits dans mon CRM<\/li>\r\n      <\/ul>\r\n      <p style=\"margin-bottom:14px;\"><strong>Signaux de bonne fiabilit\u00e9 (\u2265 70 %)<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li>J'ai d\u00e9j\u00e0 un ERP correct ou des syst\u00e8mes bien int\u00e9gr\u00e9s<\/li>\r\n        <li>Mes \u00e9quipes ont confiance dans les chiffres remont\u00e9s<\/li>\r\n        <li>Les \u00e9carts entre rapports sont rares et document\u00e9s<\/li>\r\n        <li>Les processus de validation sont automatis\u00e9s<\/li>\r\n      <\/ul>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du co\u00fbt d'erreurs<\/div>\r\n        Utilisateurs \u00d7 1 200 \u20ac \u00d7 (100 - fiabilit\u00e9)\/100 \u00d7 Taux de r\u00e9duction\r\n      <\/div>\r\n      <p style=\"margin: 12px 0 0; font-size: 12.5px; color: var(--wheelwright); font-style: italic;\">\r\n        \u2139\ufe0f Le benchmark de r\u00e9f\u00e9rence est exprim\u00e9 en euros (1 200 \u20ac\/utilisateur\/an). Pour les autres devises, ce montant est converti au taux indicatif. Conversion non contractuelle.\r\n      <\/p>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Sources et benchmarks<\/div>\r\n        <strong>Panorama Consulting ERP Report 2024<\/strong> : les entreprises avec donn\u00e9es fragment\u00e9es perdent en moyenne <strong>1 % \u00e0 1,5 % de leur CA<\/strong> en erreurs m\u00e9tier (correction, retards, retours, p\u00e9nalit\u00e9s).<br><br>\r\n        <strong>IBM Data Quality Study<\/strong> : le co\u00fbt moyen des mauvaises donn\u00e9es est estim\u00e9 \u00e0 <strong>1 000 \u00e0 1 500 \u20ac\/utilisateur\/an<\/strong> pour les PME-ETI.\r\n      <\/div>\r\n      <div class=\"example-box\" style=\"margin-top:12px;\">\r\n        <div class=\"example-label\">\ud83d\udca1 Comment estimer ?<\/div>\r\n        Posez-vous la question : <em>\u00ab Si je demande \u00e0 3 personnes le chiffre d'affaires du mois dernier, est-ce que j'aurai 3 chiffres identiques ? \u00bb<\/em><br>\r\n        - Oui \u2192 fiabilit\u00e9 70 % et +<br>\r\n        - Probablement \u2192 50 %<br>\r\n        - Non, jamais \u2192 20-30 %\r\n      <\/div>`\r\n  },\r\n  aiUplift: {\r\n    title: \"Gain de l'IA agentique Axelor\",\r\n    body: `<p>Un ERP classique automatise des <strong>processus pr\u00e9d\u00e9finis<\/strong>. Les agents IA d'Axelor vont plus loin : ils <strong>ex\u00e9cutent des t\u00e2ches enti\u00e8res<\/strong> \u00e0 la demande, sur vos donn\u00e9es r\u00e9elles - cr\u00e9ation de documents, recherches, rapprochements, relances, reporting\u2026<\/p>\r\n      <p style=\"margin-bottom:14px;\">Ce curseur estime la part <strong>additionnelle<\/strong> du temps manuel encore non automatis\u00e9 que les agents peuvent absorber, en plus de l'automatisation ERP standard.<\/p>\r\n      <div class=\"formula-box\">\r\n        <div class=\"formula-label\">Calcul du gain IA<\/div>\r\n        Heures manuelles restantes \u00d7 uplift IA \u00d7 co\u00fbt horaire \u00d7 taux de mon\u00e9tisation\r\n      <\/div>\r\n      <p style=\"margin:14px 0;\"><strong>Comment calibrer ?<\/strong><\/p>\r\n      <ul style=\"margin:0 0 14px 18px; line-height:1.65; font-size:14px; color:var(--wheelwright);\">\r\n        <li><strong>5-10 % (prudent)<\/strong> - quelques t\u00e2ches r\u00e9p\u00e9titives d\u00e9l\u00e9gu\u00e9es aux agents<\/li>\r\n        <li><strong>15-25 % (mod\u00e9r\u00e9)<\/strong> - usage r\u00e9gulier des agents sur plusieurs modules<\/li>\r\n        <li><strong>30-40 % (fort)<\/strong> - les agents font partie du quotidien des \u00e9quipes<\/li>\r\n      <\/ul>\r\n      <div class=\"example-box\">\r\n        <div class=\"example-label\">Pourquoi ce pilier est diff\u00e9renciant<\/div>\r\n        La plupart des calculateurs ROI ERP s'arr\u00eatent \u00e0 l'automatisation de processus. Axelor est l'un des rares \u00e0 int\u00e9grer une <strong>IA r\u00e9ellement agentique<\/strong> - qui agit dans l'ERP au lieu de seulement assister. Ce gain refl\u00e8te cette valeur suppl\u00e9mentaire.\r\n      <\/div>\r\n      <p style=\"margin: 12px 0 0; font-size: 12.5px; color: var(--wheelwright); font-style: italic;\">\r\n        \u2139\ufe0f Pilier optionnel et prudent par construction : il ne s'applique qu'aux heures non d\u00e9j\u00e0 automatis\u00e9es, pour \u00e9viter tout double comptage.\r\n      <\/p>`\r\n  }\r\n};\r\n\r\nfunction showHelpModal(helpId) {\r\n  const data = HELP_CONTENT[helpId];\r\n  if (!data) return;\r\n  document.getElementById('helpModalTitle').textContent = data.title;\r\n  document.getElementById('helpModalBody').innerHTML = data.body;\r\n  document.getElementById('helpModalOverlay').classList.add('show');\r\n  document.body.style.overflow = 'hidden';\r\n}\r\n\r\nfunction hideHelpModal() {\r\n  document.getElementById('helpModalOverlay').classList.remove('show');\r\n  document.body.style.overflow = '';\r\n}\r\n\r\nready(function() {\r\n  \/\/ Click ic\u00f4nes ?\r\n  document.querySelectorAll('.help-icon').forEach(icon => {\r\n    icon.addEventListener('click', (e) => {\r\n      e.stopPropagation();\r\n      showHelpModal(icon.dataset.help);\r\n    });\r\n    icon.addEventListener('keydown', (e) => {\r\n      if (e.key === 'Enter' || e.key === ' ') {\r\n        e.preventDefault();\r\n        showHelpModal(icon.dataset.help);\r\n      }\r\n    });\r\n  });\r\n  \/\/ Close handlers\r\n  document.getElementById('helpModalClose').addEventListener('click', hideHelpModal);\r\n  document.getElementById('helpModalOverlay').addEventListener('click', (e) => {\r\n    if (e.target.id === 'helpModalOverlay') hideHelpModal();\r\n  });\r\n  document.addEventListener('keydown', (e) => {\r\n    if (e.key === 'Escape') hideHelpModal();\r\n  });\r\n\r\n  \/\/ === S\u00e9lecteur d'horizon (pill buttons) ===\r\n  document.querySelectorAll('.horizon-option').forEach(opt => {\r\n    opt.addEventListener('click', () => {\r\n      document.querySelectorAll('.horizon-option').forEach(o => o.classList.remove('active'));\r\n      opt.classList.add('active');\r\n      const years = opt.dataset.years;\r\n      \/\/ Met \u00e0 jour tous les labels dynamiques (.horizon-text)\r\n      document.querySelectorAll('.horizon-text').forEach(el => el.textContent = years);\r\n      const hLabel = document.getElementById('horizonLabel');\r\n      if (hLabel) hLabel.textContent = years;\r\n      \/\/ Recalcule\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n  });\r\n\r\n  \/\/ === S\u00e9lecteur de sc\u00e9nario (Conservateur \/ R\u00e9aliste \/ Optimiste) ===\r\n  const SCENARIO_INFO = {\r\n    conservative: '<strong>Conservateur<\/strong> : 40 % d\\'automatisation, 60 % de mon\u00e9tisation des heures, 50 % de r\u00e9duction d\\'erreurs, ramp-up 35 % en ann\u00e9e 1. Vision prudente, d\u00e9fendable devant un comit\u00e9 ou un board.',\r\n    realistic:    '<strong>R\u00e9aliste<\/strong> : 60 % d\\'automatisation, 75 % de mon\u00e9tisation des heures, 70 % de r\u00e9duction d\\'erreurs, ramp-up 50 % en ann\u00e9e 1. Align\u00e9 sur les benchmarks Panorama Consulting et Gartner pour les ETI.',\r\n    optimistic:   '<strong>Optimiste<\/strong> : 70 % d\\'automatisation, 90 % de mon\u00e9tisation des heures, 80 % de r\u00e9duction d\\'erreurs, ramp-up 65 % en ann\u00e9e 1. Best case avec forte discipline d\\'adoption et alignement m\u00e9tier.'\r\n  };\r\n  document.querySelectorAll('.scenario-option').forEach(opt => {\r\n    opt.addEventListener('click', () => {\r\n      document.querySelectorAll('.scenario-option').forEach(o => o.classList.remove('active'));\r\n      opt.classList.add('active');\r\n      const sc = opt.dataset.scenario;\r\n      const infoEl = document.getElementById('scenarioInfo');\r\n      if (infoEl) infoEl.innerHTML = SCENARIO_INFO[sc];\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n  });\r\n\r\n  \/\/ Listener toggle maintenance SaaS + griser le champ si actif\r\n  const maintToggle = document.getElementById('maintIncluded');\r\n  const maintField = document.getElementById('maintenancePct')?.closest('.field');\r\n  const maintenanceInput = document.getElementById('maintenancePct');\r\n  \/\/ [FIX] Quand \"maintenance deja incluse\" est cochee, le champ AFFICHE 0 : garder un\r\n  \/\/ chiffre grise alors que le calcul compte 0 est trompeur. La valeur saisie est\r\n  \/\/ memorisee puis restituee si l'utilisateur decoche.\r\n  \/\/ memorise en portee globale : applyProfile doit pouvoir l'alimenter\r\n  if (window.__maintSaved === undefined) window.__maintSaved = null;\r\n  function syncMaintField(fromUser) {\r\n    if (!maintToggle || !maintField) return;\r\n    const disabled = maintToggle.checked;\r\n    maintField.classList.toggle('field-maint-disabled', disabled);\r\n    if (maintenanceInput) {\r\n      if (disabled) {\r\n        if (fromUser && maintenanceInput.value.trim() !== '' && maintenanceInput.value.trim() !== '0') {\r\n          window.__maintSaved = maintenanceInput.value;\r\n        }\r\n        maintenanceInput.value = '0';\r\n      } else if (fromUser) {\r\n        maintenanceInput.value = (window.__maintSaved !== null && window.__maintSaved !== '') ? window.__maintSaved : '';\r\n        window.__maintSaved = null;\r\n      }\r\n      maintenanceInput.disabled = disabled;\r\n      maintenanceInput.setAttribute('aria-disabled', String(disabled));\r\n    }\r\n  }\r\n  if (maintToggle) {\r\n    maintToggle.addEventListener('change', () => {\r\n      syncMaintField(true);\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n    syncMaintField(); \/\/ \u00e9tat initial\r\n  }\r\n\r\n  \/\/ Listener toggle h\u00e9bergement SaaS + griser le champ si actif\r\n  const hostingToggle = document.getElementById('hostingIncluded');\r\n  const hostingField = document.getElementById('hostingCost')?.closest('.field');\r\n  const hostingInput = document.getElementById('hostingCost');\r\n  \/\/ [FIX] Meme logique que la maintenance : coche => le champ affiche 0.\r\n  if (window.__hostingSaved === undefined) window.__hostingSaved = null;\r\n  function syncHostingField(fromUser) {\r\n    if (!hostingToggle || !hostingField) return;\r\n    const disabled = hostingToggle.checked;\r\n    hostingField.classList.toggle('field-maint-disabled', disabled);\r\n    if (hostingInput) {\r\n      if (disabled) {\r\n        if (fromUser && hostingInput.value.trim() !== '' && hostingInput.value.trim() !== '0') {\r\n          window.__hostingSaved = hostingInput.value;\r\n        }\r\n        hostingInput.value = '0';\r\n      } else if (fromUser) {\r\n        hostingInput.value = (window.__hostingSaved !== null && window.__hostingSaved !== '') ? window.__hostingSaved : '';\r\n        window.__hostingSaved = null;\r\n      }\r\n      hostingInput.disabled = disabled;\r\n      hostingInput.setAttribute('aria-disabled', String(disabled));\r\n    }\r\n  }\r\n  if (hostingToggle) {\r\n    hostingToggle.addEventListener('change', () => {\r\n      syncHostingField(true);\r\n      if (typeof calculate === 'function') calculate();\r\n    });\r\n    syncHostingField(); \/\/ \u00e9tat initial\r\n  }\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FIN SYST\u00c8ME D'AIDE ====\r\n\/\/ =====================================================\r\n\r\n\/\/ === Charts ===\r\nlet cumulativeChart, gainsChart;\r\n\r\nfunction initCharts() {\r\n  \/\/ S\u00e9curit\u00e9 : si Chart.js (CDN) n'est pas encore charg\u00e9, on r\u00e9essaie un peu plus tard\r\n  \/\/ au lieu de planter tout le script. Le reste du calculateur fonctionne sans les graphes.\r\n  if (typeof Chart === 'undefined') { setTimeout(initCharts, 200); return; }\r\n  Chart.defaults.font.family = \"'Poppins', sans-serif\";\r\n  Chart.defaults.font.weight = 400;\r\n\r\n  const ctx1 = document.getElementById('cumulativeChart').getContext('2d');\r\n  const gradientCost = ctx1.createLinearGradient(0, 0, 0, 200);\r\n  gradientCost.addColorStop(0, 'rgba(244, 201, 93, 0.25)');\r\n  gradientCost.addColorStop(1, 'rgba(244, 201, 93, 0)');\r\n\r\n  const gradientGain = ctx1.createLinearGradient(0, 0, 0, 200);\r\n  gradientGain.addColorStop(0, 'rgba(62, 207, 142, 0.35)');\r\n  gradientGain.addColorStop(1, 'rgba(62, 207, 142, 0)');\r\n\r\n  cumulativeChart = new Chart(ctx1, {\r\n    type: 'line',\r\n    plugins: [{\r\n      id: 'breakevenLine',\r\n      afterDatasetsDraw(chart) {\r\n        const breakevenMonth = chart.options.plugins.breakevenMonth;\r\n        if (!breakevenMonth || breakevenMonth <= 0) return;\r\n        const ctx = chart.ctx;\r\n        const xScale = chart.scales.x;\r\n        const yScale = chart.scales.y;\r\n        \/\/ breakevenMonth est en mois \u2192 position sur l'axe X (qui est en ann\u00e9es)\r\n        const yearPos = breakevenMonth \/ 12;\r\n        const xPx = xScale.getPixelForValue(yearPos);\r\n        const yTop = yScale.top;\r\n        const yBottom = yScale.bottom;\r\n\r\n        \/\/ Ligne pointill\u00e9e verticale\r\n        ctx.save();\r\n        ctx.beginPath();\r\n        ctx.setLineDash([5, 4]);\r\n        ctx.strokeStyle = '#3ECF8E';\r\n        ctx.lineWidth = 1.5;\r\n        ctx.moveTo(xPx, yTop);\r\n        ctx.lineTo(xPx, yBottom);\r\n        ctx.stroke();\r\n        ctx.setLineDash([]);\r\n\r\n        \/\/ Pastille au sommet\r\n        ctx.beginPath();\r\n        ctx.arc(xPx, yTop + 14, 5, 0, 2 * Math.PI);\r\n        ctx.fillStyle = '#3ECF8E';\r\n        ctx.fill();\r\n\r\n        \/\/ Label \"Point d'\u00e9quilibre\"\r\n        const labelText = \"Point d'\u00e9quilibre\";\r\n        const subText = breakevenMonth < 6 ? '< 6 mois' : `${Math.round(breakevenMonth)} mois`;\r\n        ctx.font = \"600 11px Poppins, sans-serif\";\r\n        const textW = Math.max(ctx.measureText(labelText).width, ctx.measureText(subText).width);\r\n        const padX = 10, padY = 6;\r\n        const boxW = textW + padX * 2;\r\n        const boxH = 38;\r\n\r\n        \/\/ Position du badge : \u00e0 droite si payback < milieu, \u00e0 gauche si payback > milieu\r\n        const chartMid = (xScale.left + xScale.right) \/ 2;\r\n        const badgeX = xPx < chartMid ? xPx + 10 : xPx - boxW - 10;\r\n        const badgeY = yTop + 24;\r\n\r\n        \/\/ Fond\r\n        ctx.fillStyle = 'rgba(62, 207, 142, 0.15)';\r\n        ctx.strokeStyle = '#3ECF8E';\r\n        ctx.lineWidth = 1;\r\n        ctx.beginPath();\r\n        if (ctx.roundRect) {\r\n          ctx.roundRect(badgeX, badgeY, boxW, boxH, 6);\r\n        } else {\r\n          ctx.rect(badgeX, badgeY, boxW, boxH);\r\n        }\r\n        ctx.fill();\r\n        ctx.stroke();\r\n\r\n        \/\/ Textes\r\n        ctx.fillStyle = '#3ECF8E';\r\n        ctx.textBaseline = 'top';\r\n        ctx.font = \"600 11px Poppins, sans-serif\";\r\n        ctx.fillText(labelText, badgeX + padX, badgeY + padY);\r\n        ctx.font = \"500 10.5px Poppins, sans-serif\";\r\n        ctx.fillStyle = 'rgba(255,255,255,0.85)';\r\n        ctx.fillText(subText, badgeX + padX, badgeY + padY + 16);\r\n\r\n        ctx.restore();\r\n      }\r\n    }],\r\n    data: {\r\n      labels: ['Ann\u00e9e 0', 'Ann\u00e9e 1', 'Ann\u00e9e 2', 'Ann\u00e9e 3'],\r\n      datasets: [\r\n        {\r\n          label: 'Co\u00fbts',\r\n          data: [0, 0, 0, 0],\r\n          borderColor: '#F4C95D',\r\n          backgroundColor: gradientCost,\r\n          fill: true,\r\n          tension: 0.35,\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#F4C95D',\r\n          pointBorderColor: '#0D021E',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 4,\r\n          pointHoverRadius: 6,\r\n        },\r\n        {\r\n          label: 'Gains',\r\n          data: [0, 0, 0, 0],\r\n          borderColor: '#3ECF8E',\r\n          backgroundColor: gradientGain,\r\n          fill: true,\r\n          tension: 0.35,\r\n          borderWidth: 2.5,\r\n          pointBackgroundColor: '#3ECF8E',\r\n          pointBorderColor: '#0D021E',\r\n          pointBorderWidth: 2,\r\n          pointRadius: 4,\r\n          pointHoverRadius: 6,\r\n        }\r\n      ]\r\n    },\r\n    options: {\r\n      responsive: true,\r\n      maintainAspectRatio: false,\r\n      interaction: { intersect: false, mode: 'index' },\r\n      plugins: {\r\n        legend: {\r\n          labels: {\r\n            color: 'rgba(255,255,255,0.75)',\r\n            font: { size: 11, weight: 500 },\r\n            usePointStyle: true,\r\n            pointStyle: 'circle',\r\n            padding: 16,\r\n            boxWidth: 6,\r\n            boxHeight: 6\r\n          }\r\n        },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(13, 2, 30, 0.95)',\r\n          titleColor: '#fff',\r\n          bodyColor: 'rgba(255,255,255,0.85)',\r\n          borderColor: 'rgba(255,255,255,0.1)',\r\n          borderWidth: 1,\r\n          padding: 12,\r\n          cornerRadius: 8,\r\n          titleFont: { size: 12, weight: 500 },\r\n          bodyFont: { size: 12 },\r\n          callbacks: {\r\n            label: function(ctx) {\r\n              return ctx.dataset.label + ' : ' + formatCurrency(ctx.parsed.y);\r\n            }\r\n          }\r\n        }\r\n      },\r\n      scales: {\r\n        x: {\r\n          ticks: { color: 'rgba(255,255,255,0.55)', font: { size: 11 } },\r\n          grid: { color: 'rgba(255,255,255,0.04)', drawBorder: false }\r\n        },\r\n        y: {\r\n          ticks: {\r\n            color: 'rgba(255,255,255,0.55)',\r\n            font: { size: 11 },\r\n            callback: function(value) { return formatCurrencyShort(value); }\r\n          },\r\n          grid: { color: 'rgba(255,255,255,0.04)', drawBorder: false }\r\n        }\r\n      }\r\n    }\r\n  });\r\n\r\n  const ctx2 = document.getElementById('gainsChart').getContext('2d');\r\n  gainsChart = new Chart(ctx2, {\r\n    type: 'doughnut',\r\n    data: {\r\n      labels: ['Productivit\u00e9', 'R\u00e9duction erreurs', 'IA agentique', '\u00c9conomies sur l\\'existant'],\r\n      datasets: [{\r\n        data: [0, 0, 0, 0],\r\n        backgroundColor: ['#3ECF8E', '#5FE3D0', '#34D399', '#7B9FFF'],\r\n        borderColor: '#010165',\r\n        borderWidth: 3,\r\n        hoverOffset: 8,\r\n      }]\r\n    },\r\n    options: {\r\n      responsive: true,\r\n      maintainAspectRatio: false,\r\n      cutout: '65%',\r\n      plugins: {\r\n        legend: {\r\n          position: 'right',\r\n          labels: {\r\n            color: 'rgba(255,255,255,0.75)',\r\n            font: { size: 11, weight: 400 },\r\n            padding: 12,\r\n            boxWidth: 8,\r\n            boxHeight: 8,\r\n            usePointStyle: true,\r\n            pointStyle: 'circle'\r\n          }\r\n        },\r\n        tooltip: {\r\n          backgroundColor: 'rgba(13, 2, 30, 0.95)',\r\n          titleColor: '#fff',\r\n          bodyColor: 'rgba(255,255,255,0.85)',\r\n          borderColor: 'rgba(255,255,255,0.1)',\r\n          borderWidth: 1,\r\n          padding: 12,\r\n          cornerRadius: 8,\r\n          callbacks: {\r\n            label: function(ctx) {\r\n              return ctx.label + ' : ' + formatCurrency(ctx.parsed);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  });\r\n}\r\n\r\n\/\/ === Calculations ===\r\nfunction calculate() {\r\n  \/\/ Parser tol\u00e9rant : retire espaces (s\u00e9parateurs de milliers FR) et remplace virgule par point\r\n  const parseNumericInput = (val) => {\r\n    if (val === null || val === undefined || val === '') return 0;\r\n    const cleaned = String(val).replace(\/\\s\/g, '').replace(',', '.');\r\n    const n = parseFloat(cleaned);\r\n    return isNaN(n) ? 0 : n;\r\n  };\r\n\r\n  const users = parseNumericInput(document.getElementById('users').value);\r\n  const licenseCost = parseNumericInput(document.getElementById('licenseCost').value);\r\n  const implementationCost = parseNumericInput(document.getElementById('implementationCost').value);\r\n  const trainingCost = parseNumericInput(document.getElementById('trainingCost').value);\r\n  const maintenancePct = parseNumericInput(document.getElementById('maintenancePct').value);\r\n  \/\/ Co\u00fbt annuel des syst\u00e8mes actuels remplac\u00e9s (vieil ERP, licences \u00e9parpill\u00e9es, serveurs\u2026)\r\n  \/\/ Champ optionnel - vide = comportement classique (compare \u00e0 \"ne rien faire\")\r\n  const existingSystemsCost = parseNumericInput(document.getElementById('existingSystemsCost').value);\r\n\r\n  const manualHours = parseNumericInput(document.getElementById('manualHours').value);\r\n  const hourlyRate = parseNumericInput(document.getElementById('hourlyRate').value);\r\n  \/\/ dataReliability est un pourcentage 10-90 ; 100% = donn\u00e9es parfaites, 0% = chaos total\r\n  const dataReliability = parseNumericInput(document.getElementById('dataReliability').value) || 40;\r\n\r\n  \/\/ === Constantes m\u00e9thodologiques (dynamiques selon sc\u00e9nario) ===\r\n  \/\/ === Horizon dynamique (lu depuis le s\u00e9lecteur pill) ===\r\n  const horizonEl = document.querySelector('.horizon-option.active');\r\n  const horizon = horizonEl ? parseInt(horizonEl.dataset.years) : 5;\r\n  const wacc = 0.08;          \/\/ 8% Cost of capital (hypoth\u00e8se interne, KPMG mid-market)\r\n  const hiddenCostsMargin = 0.15;\r\n\r\n  \/\/ Sc\u00e9nario actif (Conservateur \/ R\u00e9aliste \/ Optimiste)\r\n  const scenarioEl = document.querySelector('.scenario-option.active');\r\n  const scenarioKey = scenarioEl ? scenarioEl.dataset.scenario : 'realistic';\r\n  const SCENARIOS = {\r\n    \/\/ automation = % du temps manuel qui peut \u00eatre automatis\u00e9\r\n    \/\/ monetization = % des heures \u00e9conomis\u00e9es qui se transforment r\u00e9ellement en valeur business\r\n    \/\/ errorReduction = % du co\u00fbt des erreurs supprim\u00e9 par l'ERP int\u00e9gr\u00e9\r\n    \/\/ rampUpY1 = % des gains captur\u00e9s la 1re ann\u00e9e (mont\u00e9e en charge)\r\n    conservative: { automation: 0.40, monetization: 0.60, errorReduction: 0.50, rampUpY1: 0.35 },\r\n    realistic:    { automation: 0.60, monetization: 0.75, errorReduction: 0.70, rampUpY1: 0.50 },\r\n    optimistic:   { automation: 0.70, monetization: 0.90, errorReduction: 0.80, rampUpY1: 0.65 }\r\n  };\r\n  const scenario = SCENARIOS[scenarioKey];\r\n  const automationRate = scenario.automation;\r\n  const monetizationRate = scenario.monetization;\r\n  const errorReductionRate = scenario.errorReduction;\r\n  const rampUpY1 = scenario.rampUpY1;\r\n\r\n  const adjustedImpl = implementationCost * (1 + hiddenCostsMargin);\r\n\r\n  \/\/ === COSTS (over horizon years) ===\r\n  const annualLicense = users * licenseCost * 12;\r\n  const costLicense = annualLicense * horizon;\r\n  const costImpl = adjustedImpl;\r\n  \/\/ Si maintenance d\u00e9j\u00e0 incluse dans l'abonnement SaaS \u2192 on n'ajoute rien\r\n  const maintIncludedEl = document.getElementById('maintIncluded');\r\n  const maintIncluded = maintIncludedEl ? maintIncludedEl.checked : true;\r\n  const effectiveMaintPct = maintIncluded ? 0 : maintenancePct;\r\n  const costMaint = annualLicense * (effectiveMaintPct \/ 100) * horizon;\r\n  const costTraining = trainingCost;\r\n\r\n  \/\/ H\u00e9bergement - montant annuel fixe, sauf si inclus dans le SaaS\r\n  const hostingCostAnnual = parseNumericInput(document.getElementById('hostingCost').value);\r\n  const hostingIncludedEl = document.getElementById('hostingIncluded');\r\n  const hostingIncluded = hostingIncludedEl ? hostingIncludedEl.checked : true;\r\n  \/\/ [FIX] Case \"H\u00e9bergement d\u00e9j\u00e0 inclus\" coch\u00e9e => co\u00fbt forc\u00e9 \u00e0 0, quoi qu'il y ait dans le champ\r\n  const effectiveHostingAnnual = hostingIncluded ? 0 : (hostingCostAnnual > 0 ? hostingCostAnnual : 0);\r\n  const costHosting = effectiveHostingAnnual * horizon;\r\n\r\n  const totalCost = costLicense + costImpl + costMaint + costTraining + costHosting;\r\n\r\n  \/\/ === GAINS (annual basis) ===\r\n  \/\/ manualHours est d\u00e9sormais un POURCENTAGE (5 \u00e0 60) du temps travaill\u00e9 annuel\r\n  \/\/ Base : 1 600 h travaill\u00e9es par utilisateur et par an (35 h\/semaine \u00d7 ~46 sem effectives)\r\n  const BASE_ANNUAL_HOURS = 1600;\r\n  const manualHoursPct = manualHours \/ 100;\r\n  const annualHoursPerUser = BASE_ANNUAL_HOURS * manualHoursPct;\r\n  const totalAnnualHours = annualHoursPerUser * users;\r\n  const annualHoursSaved = totalAnnualHours * automationRate;\r\n  \/\/ Le gain de productivit\u00e9 ne capture que la part des heures effectivement mon\u00e9tis\u00e9es\r\n  \/\/ (les heures gagn\u00e9es ne se transforment pas toutes en valeur business - effet Parkinson, r\u00e9allocation, etc.)\r\n  const gainProdAnnual = annualHoursSaved * hourlyRate * monetizationRate;\r\n\r\n  \/\/ === 4e pilier - gains li\u00e9s aux agents IA ===\r\n  \/\/ Les agents IA absorbent une part ADDITIONNELLE du temps manuel encore non automatis\u00e9.\r\n  \/\/ Calcul\u00e9 sur les heures restantes apr\u00e8s automatisation classique \u2192 pas de double comptage.\r\n  const remainingManualHours = totalAnnualHours * (1 - automationRate);\r\n  const aiHoursSaved = remainingManualHours * AXELOR_AI_UPLIFT;\r\n  const gainAiAnnual = aiHoursSaved * hourlyRate * monetizationRate;\r\n\r\n  \/\/ === Co\u00fbt annuel des erreurs : benchmark Panorama Consulting \/ IBM Data Quality 2024 ===\r\n  \/\/ Une entreprise avec donn\u00e9es fragment\u00e9es perd ~1 200 \u20ac\/utilisateur\/an en erreurs m\u00e9tier\r\n  \/\/ (correction, retards, retours, ressaisies, \u00e9carts compta\/op\u00e9ration)\r\n  \/\/ Ce co\u00fbt varie lin\u00e9airement avec le niveau de fiabilit\u00e9 actuel\r\n  \/\/ P0 - Conversion approximative selon devise active pour coh\u00e9rence multi-pays\r\n  \/\/ Taux indicatifs au 04\/06\/2026 - rafra\u00eechir ~2\u00d7\/an (sources : Bloomberg, BCE)\r\n  const FX_FROM_EUR = {\r\n    EUR: 1, USD: 1.08, GBP: 0.85, CHF: 0.95, MAD: 10.8, CAD: 1.46,\r\n    AED: 3.96, AUD: 1.62, BRL: 6.1, CNY: 7.80, DZD: 145, EGP: 53,\r\n    HKD: 8.40, INR: 90, JPY: 165, KRW: 1450, MXN: 19, NOK: 11.50,\r\n    NZD: 1.78, PLN: 4.30, RUB: 100, SAR: 4.05, SEK: 11.40, SGD: 1.45,\r\n    TND: 3.40, TRY: 53, XOF: 656, ZAR: 19.50\r\n  };\r\n  const ERROR_COST_PER_USER_EUR = 1200;\r\n  const fxRate = FX_FROM_EUR[currentCurrency] || 1;\r\n  const MAX_ERROR_COST_PER_USER = ERROR_COST_PER_USER_EUR * fxRate;\r\n  const frictionIndex = (100 - dataReliability) \/ 100;\r\n  const annualErrorCost = users * MAX_ERROR_COST_PER_USER * frictionIndex;\r\n  const gainErrorsAnnual = annualErrorCost * errorReductionRate;\r\n  \/\/ Affichage temps r\u00e9el du co\u00fbt d'erreurs estim\u00e9 sous le slider\r\n  const errorCostDisplay = document.getElementById('errorCostEstimate');\r\n  if (errorCostDisplay) errorCostDisplay.textContent = formatCurrency(annualErrorCost) + ' \/ an';\r\n\r\n  \/\/ === Pilier 3 - \u00c9conomies sur les syst\u00e8mes actuels (co\u00fbt de l'inaction) ===\r\n  \/\/ Contrairement aux gains op\u00e9rationnels, ces \u00e9conomies sont r\u00e9alis\u00e9es D\u00c8S l'ann\u00e9e 1\r\n  \/\/ (le prospect arr\u00eate de payer son ancien ERP\/licences) \u2192 pas de ramp-up applicable.\r\n  \/\/ Mais on les actualise au WACC comme le reste pour rester coh\u00e9rent NPV.\r\n  const gainExistingAnnual = existingSystemsCost;\r\n\r\n  \/\/ Gains \u00e9conomiques avanc\u00e9s (stocks \/ DSO) - d\u00e9sactiv\u00e9s dans cette version, pr\u00eats pour v18\r\n  const gainStockAnnual = 0;\r\n  const gainCashAnnual = 0;\r\n\r\n  \/\/ Gains op\u00e9rationnels (productivit\u00e9 + erreurs + IA agentique) - soumis au ramp-up Y1\r\n  const totalGainAnnualFull = gainProdAnnual + gainErrorsAnnual + gainStockAnnual + gainCashAnnual + gainAiAnnual;\r\n\r\n  \/\/ === NPV with WACC discounting ===\r\n  let totalGainNominal = 0;\r\n  let totalGainDiscounted = 0;\r\n  const yearlyGains = [];\r\n  const yearlyDiscountedGains = [];\r\n\r\n  for (let y = 1; y <= horizon; y++) {\r\n    \/\/ Gains op\u00e9rationnels (avec ramp-up Y1) + \u00e9conomies sur l'existant (sans ramp)\r\n    const opGain = (y === 1 ? rampUpY1 : 1) * totalGainAnnualFull;\r\n    const existingGain = gainExistingAnnual; \/\/ \u00e9conomies d\u00e8s Y1, pas de mont\u00e9e en charge\r\n    const yearGain = opGain + existingGain;\r\n    yearlyGains.push(yearGain);\r\n    totalGainNominal += yearGain;\r\n    const discountedGain = yearGain \/ Math.pow(1 + wacc, y);\r\n    yearlyDiscountedGains.push(discountedGain);\r\n    totalGainDiscounted += discountedGain;\r\n  }\r\n\r\n  const totalGain3Y = totalGainDiscounted;\r\n\r\n  \/\/ Facteur d'actualisation total : somme des (ramp(y) \/ (1+wacc)^y)\r\n  \/\/ Permet de d\u00e9composer totalGain3Y par poste en gardant la coh\u00e9rence\r\n  \/\/ Facteur d'actualisation pour gains OP\u00c9RATIONNELS (avec ramp-up Y1)\r\n  let discountFactor = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    const ramp = (y === 1 ? rampUpY1 : 1);\r\n    discountFactor += ramp \/ Math.pow(1 + wacc, y);\r\n  }\r\n\r\n  \/\/ Facteur d'actualisation pour les \u00e9conomies sur l'existant (sans ramp, d\u00e8s Y1)\r\n  let discountFactorExisting = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    discountFactorExisting += 1 \/ Math.pow(1 + wacc, y);\r\n  }\r\n\r\n  \/\/ D\u00e9composition par poste - VALEURS ACTUALIS\u00c9ES (somme = totalGain3Y exact)\r\n  const gainProd3Y = gainProdAnnual * discountFactor;\r\n  const gainErrors3Y = gainErrorsAnnual * discountFactor;\r\n  const gainAi3Y = gainAiAnnual * discountFactor;\r\n  const gainStock3Y = gainStockAnnual * discountFactor;\r\n  const gainCash3Y = gainCashAnnual * discountFactor;\r\n  const gainExisting3Y = gainExistingAnnual * discountFactorExisting;\r\n\r\n  const netGain = totalGain3Y - totalCost;\r\n  const roi = totalCost > 0 ? (netGain \/ totalCost) * 100 : 0;\r\n\r\n  \/\/ === ROI DE BASE (ERP classique, SANS le 4e pilier IA) - pour le comparateur ===\r\n  \/\/ On retire la contribution actualis\u00e9e du gain IA des gains totaux.\r\n  const totalGainBase3Y = totalGain3Y - gainAi3Y;\r\n  const netGainBase = totalGainBase3Y - totalCost;\r\n  const roiBase = totalCost > 0 ? (netGainBase \/ totalCost) * 100 : 0;\r\n  \/\/ L'\u00e9cart en points de ROI = l'apport sp\u00e9cifique d'Axelor IA\r\n  const roiDelta = roi - roiBase;\r\n\r\n  \/\/ === S\u00e9ries annuelles cumul\u00e9es - M\u00caMES flux que le graphique ===\r\n  \/\/ Ann\u00e9e 0 porte l'investissement initial (impl\u00e9mentation + formation) :\r\n  \/\/ la courbe Co\u00fbts d\u00e9marre AU-DESSUS de 0, ce qui est financi\u00e8rement exact.\r\n  \/\/ Ces tableaux serviront aussi \u00e0 alimenter le chart cumulatif \u2192 coh\u00e9rence garantie par construction.\r\n  const costData = [costImpl + costTraining];\r\n  const gainData = [0];\r\n  for (let y = 1; y <= horizon; y++) {\r\n    costData.push(costData[y - 1] + annualLicense + (annualLicense * (effectiveMaintPct \/ 100)) + effectiveHostingAnnual);\r\n    gainData.push(gainData[y - 1] + yearlyDiscountedGains[y - 1]);\r\n  }\r\n\r\n  \/\/ === Point d'\u00e9quilibre ACTUALIS\u00c9 - interpolation lin\u00e9aire entre les points du graphe ===\r\n  \/\/ Coh\u00e9rent par construction : le badge tombe exactement au croisement (tol\u00e9rance \u00b10,5 mois)\r\n  let paybackMonths = 0;\r\n  for (let y = 1; y <= horizon; y++) {\r\n    if (gainData[y] - costData[y] >= 0) {\r\n      const gapPrev = gainData[y - 1] - costData[y - 1];   \/\/ \u2264 0 par construction\r\n      const gapCurr = gainData[y] - costData[y];           \/\/ \u2265 0\r\n      const frac = (gapCurr - gapPrev) > 0 ? (-gapPrev) \/ (gapCurr - gapPrev) : 0;\r\n      paybackMonths = Math.max(1, Math.round(((y - 1) + frac) * 12));\r\n      break;\r\n    }\r\n  }\r\n  \/\/ paybackMonths = 0 \u21d4 les courbes ne se croisent pas sur l'horizon \u21d2 aucun badge dessin\u00e9.\r\n\r\n  \/\/ === Display KPIs ===\r\n  const hasMinimalData = users > 0 && (licenseCost > 0 || implementationCost > 0);\r\n  const roiEl = document.getElementById('roiPct');\r\n  const paybackEl = document.getElementById('paybackMonths');\r\n  const netGainEl = document.getElementById('netGain');\r\n  \/\/ Aper\u00e7u live (colonne droite \u00c9tape 2)\r\n  const previewRoiEl = document.getElementById('previewRoi');\r\n  const previewPaybackEl = document.getElementById('previewPayback');\r\n\r\n  if (!hasMinimalData) {\r\n    roiEl.textContent = '- %';\r\n    paybackEl.textContent = '- mois';\r\n    netGainEl.textContent = '- ' + getCurrency().symbol;\r\n    document.getElementById('hoursReclaimed').textContent = '- h';\r\n    roiEl.classList.remove('negative');\r\n    netGainEl.classList.remove('negative');\r\n    if (previewRoiEl) { previewRoiEl.textContent = '- %'; previewRoiEl.classList.remove('negative'); }\r\n    if (previewPaybackEl) previewPaybackEl.textContent = '- mois';\r\n    \/\/ Reset mini-barre\r\n    const bc = document.getElementById('previewBarCostVal'), bg = document.getElementById('previewBarGainVal');\r\n    if (bc) bc.textContent = '-';\r\n    if (bg) bg.textContent = '-';\r\n    const bcb = document.getElementById('previewBarCost'), bgb = document.getElementById('previewBarGain');\r\n    if (bcb) bcb.style.width = '30%';\r\n    if (bgb) bgb.style.width = '70%';\r\n    \/\/ Comparateur en attente\r\n    const rb = document.getElementById('roiBase'), ra = document.getElementById('roiAxelor'), rd = document.getElementById('roiDeltaBadge');\r\n    if (rb) { rb.textContent = '- %'; rb.classList.remove('negative'); }\r\n    if (ra) { ra.textContent = '- %'; ra.classList.remove('negative'); }\r\n    if (rd) rd.textContent = '+- pts';\r\n  } else {\r\n    \/\/ P1 - Plafond d'affichage : au-del\u00e0 de 400 %, on affiche \"> 400 %\".\r\n    \/\/ Un ROI \u00e0 3 ou 4 chiffres para\u00eet \"trop beau\" \u00e0 un DAF et d\u00e9cr\u00e9dibilise l'outil.\r\n    \/\/ Le calcul sous-jacent (et le comparateur, le graphe, le PDF) reste inchang\u00e9 -\r\n    \/\/ c'est un plafond purement cosm\u00e9tique, sym\u00e9trique du plancher \"< 6 mois\".\r\n    \/\/ [FIX] Plafond d'affichage supprim\u00e9 : le ROI refl\u00e8te toujours les entr\u00e9es et ne\r\n    \/\/ reste plus fig\u00e9 sur \"> 400 %\" quand on bouge le % de t\u00e2ches manuelles.\r\n    \/\/ La cr\u00e9dibilit\u00e9 reste port\u00e9e par le garde-fou \"Hypoth\u00e8ses \u00e0 valider\".\r\n    const formatRoiDisplay = (value) => Math.round(value) + ' %';\r\n    \/\/ P0 - ROI affich\u00e9 (y compris n\u00e9gatif) avec classe pour couleur\r\n    const roiText = formatRoiDisplay(roi);\r\n    \/\/ P1 - Plancher d'affichage : un payback < 6 mois sur un projet ERP n'est pas cr\u00e9dible\r\n    \/\/ en communication, on affiche \"< 6 mois\" (le calcul sous-jacent reste inchang\u00e9)\r\n    const paybackText = (paybackMonths > 0 && paybackMonths <= horizon * 12)\r\n      ? (paybackMonths < 6 ? '< 6 mois' : Math.round(paybackMonths) + ' mois')\r\n      : 'Non atteint';\r\n    roiEl.textContent = roiText;\r\n    roiEl.classList.toggle('negative', roi < 0);\r\n    paybackEl.textContent = paybackText;\r\n    netGainEl.textContent = formatCurrency(netGain);\r\n    netGainEl.classList.toggle('negative', netGain < 0);\r\n      \/\/ [FIX] Les heures affichees incluent desormais les heures absorbees par les agents IA.\r\n    \/\/ Avant, les euros du pilier IA etaient comptes dans les gains mais pas les heures\r\n    \/\/ correspondantes : le KPI \"heures gagnees\" sous-estimait le resultat.\r\n    document.getElementById('hoursReclaimed').textContent = Math.round(annualHoursSaved + aiHoursSaved).toLocaleString('fr-FR') + ' h';\r\n    \/\/ Miroir dans l'aper\u00e7u live\r\n    if (previewRoiEl) {\r\n      previewRoiEl.textContent = roiText;\r\n      previewRoiEl.classList.toggle('negative', roi < 0);\r\n    }\r\n    if (previewPaybackEl) previewPaybackEl.textContent = paybackText;\r\n\r\n    \/\/ Mini-barre de r\u00e9partition co\u00fbts \/ gains (proportionnelle)\r\n    const barCost = document.getElementById('previewBarCost');\r\n    const barGain = document.getElementById('previewBarGain');\r\n    if (barCost && barGain) {\r\n      const totalAbs = totalCost + Math.max(totalGain3Y, 0);\r\n      if (totalAbs > 0) {\r\n        const costPct = (totalCost \/ totalAbs) * 100;\r\n        barCost.style.width = costPct.toFixed(1) + '%';\r\n        barGain.style.width = (100 - costPct).toFixed(1) + '%';\r\n      }\r\n      const cv = document.getElementById('previewBarCostVal');\r\n      const gv = document.getElementById('previewBarGainVal');\r\n      if (cv) cv.textContent = formatCurrency(totalCost);\r\n      if (gv) gv.textContent = formatCurrency(totalGain3Y);\r\n    }\r\n\r\n    \/\/ === Comparateur ERP classique vs Axelor IA ===\r\n    const roiBaseEl = document.getElementById('roiBase');\r\n    const roiAxelorEl = document.getElementById('roiAxelor');\r\n    const roiDeltaEl = document.getElementById('roiDeltaBadge');\r\n    if (roiBaseEl) {\r\n      roiBaseEl.textContent = formatRoiDisplay(roiBase);\r\n      roiBaseEl.classList.toggle('negative', roiBase < 0);\r\n    }\r\n    if (roiAxelorEl) {\r\n      roiAxelorEl.textContent = formatRoiDisplay(roi);\r\n      roiAxelorEl.classList.toggle('negative', roi < 0);\r\n    }\r\n    if (roiDeltaEl) {\r\n      roiDeltaEl.textContent = '+' + Math.round(roiDelta) + ' pts';\r\n    }\r\n  }\r\n\r\n  \/\/ === Badge ROI selon performance ===\r\n  \/\/ P1 - D\u00e9tection d'hypoth\u00e8ses agressives : sur le ROI final OU directement sur les\r\n  \/\/ inputs au-dessus des standards observ\u00e9s :\r\n  \/\/ >150 utilisateurs, >45 % de temps manuel, ou >90 \u20ac\/h de co\u00fbt horaire.\r\n  \/\/ [FIX] Seuils recalibres.\r\n  \/\/ - le nombre d'utilisateurs n'est PAS une hypothese agressive : un Grand Compte a\r\n  \/\/   legitimement 500 utilisateurs. L'ancien seuil \"users > 150\" declenchait l'alerte\r\n  \/\/   sur un profil parfaitement normal. Retire.\r\n  \/\/ - \"manualHours > 45\" etait devenu inatteignable (curseur plafonne a 40). Ramene a 32.\r\n  \/\/ - le seuil de ROI passe a 450 % : c'est la borne haute annoncee dans la FAQ de la page.\r\n  \/\/   Au-dela, le resultat sort de la fourchette que le site revendique lui-meme.\r\n  const extremeInputs = hasMinimalData && (manualHours > 32 || hourlyRate > 90);\r\n  const aggressiveAssumptions = (roi >= 450) || extremeInputs;\r\n  const roiBadge = document.getElementById('roiBadge');\r\n  if (roiBadge) {\r\n    if (aggressiveAssumptions) {\r\n      \/\/ P1 - Garde-fou : hypoth\u00e8ses \u00e0 valider (ROI extr\u00eame ou inputs agressifs)\r\n      roiBadge.textContent = '\u26a0 Hypoth\u00e8ses \u00e0 valider';\r\n      roiBadge.classList.add('show', 'warning');\r\n    } else if (roi >= 300) {\r\n      roiBadge.textContent = '\u2605 Exceptionnel';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else if (roi >= 150) {\r\n      roiBadge.textContent = '\u2605 Excellent';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else if (roi >= 50) {\r\n      roiBadge.textContent = '\u2713 Solide';\r\n      roiBadge.classList.add('show');\r\n      roiBadge.classList.remove('warning');\r\n    } else {\r\n      roiBadge.classList.remove('show', 'warning');\r\n    }\r\n  }\r\n\r\n  \/\/ P1 - Warning explicatif sous les KPIs si hypoth\u00e8ses agressives (ROI \u2265 700 % ou inputs extr\u00eames)\r\n  const roiWarning = document.getElementById('roiWarning');\r\n  if (roiWarning) {\r\n    roiWarning.classList.toggle('show', hasMinimalData && aggressiveAssumptions);\r\n\r\n    \/\/ [FIX] Message compose selon les causes REELLES du declenchement.\r\n    \/\/ Avant, le texte etait fixe : il citait la \"taille d'equipe\" (critere supprime) et\r\n    \/\/ conseillait de passer en scenario Conservateur meme quand on y etait deja.\r\n    const warnText = document.getElementById('roiWarningText');\r\n    if (warnText && hasMinimalData && aggressiveAssumptions) {\r\n      const causes = [];\r\n      if (manualHours > 32) {\r\n        causes.push('une part de temps en t\u00e2ches manuelles de <em>' + manualHours + ' %<\/em>, au-dessus des 15 \u00e0 30 % couramment observ\u00e9s');\r\n      }\r\n      if (hourlyRate > 90) {\r\n        causes.push('un co\u00fbt horaire charg\u00e9 de <em>' + formatCurrency(hourlyRate) + '<\/em>, au-dessus des rep\u00e8res habituels');\r\n      }\r\n      if (roi >= 450) {\r\n        causes.push('un ROI de <em>' + Math.round(roi) + ' %<\/em>, au-dessus de la fourchette de 150 \u00e0 450 % que nous communiquons');\r\n      }\r\n\r\n      let html = '<strong>Hypoth\u00e8ses \u00e0 valider.<\/strong> ';\r\n      if (causes.length === 1) {\r\n        html += 'Votre estimation repose sur ' + causes[0] + '. ';\r\n      } else if (causes.length > 1) {\r\n        html += 'Votre estimation repose sur ' + causes.slice(0, -1).join(', ') + ' et ' + causes[causes.length - 1] + '. ';\r\n      }\r\n      html += 'Le calcul reste honn\u00eate, mais v\u00e9rifiez ces valeurs avant de pr\u00e9senter le r\u00e9sultat \u00e0 un comit\u00e9. ';\r\n\r\n      if (scenarioKey === 'conservative') {\r\n        html += 'Vous \u00eates d\u00e9j\u00e0 en sc\u00e9nario <em>Conservateur<\/em> : ces valeurs viennent donc de vos propres saisies, pas des hypoth\u00e8ses du mod\u00e8le.';\r\n      } else if (scenarioKey === 'optimistic') {\r\n        html += 'Vous \u00eates en sc\u00e9nario <em>Optimiste<\/em> : passez en <em>R\u00e9aliste<\/em> ou en <em>Conservateur<\/em> pour une lecture plus prudente.';\r\n      } else {\r\n        html += 'Au besoin, passez en sc\u00e9nario <em>Conservateur<\/em> pour une lecture plus prudente.';\r\n      }\r\n      warnText.innerHTML = html;\r\n    }\r\n  }\r\n\r\n  \/\/ === Display breakdown ===\r\n  document.getElementById('costLicense').textContent = formatCurrency(costLicense);\r\n  document.getElementById('costImpl').textContent = formatCurrency(costImpl);\r\n  \/\/ Maintenance : afficher \"Incluse\" si comprise dans l'abonnement SaaS, sinon le montant\r\n  document.getElementById('costMaint').textContent = (maintIncluded || costMaint === 0) ? 'Incluse' : formatCurrency(costMaint);\r\n  document.getElementById('costTraining').textContent = formatCurrency(costTraining);\r\n  \/\/ Ligne H\u00e9bergement affich\u00e9e seulement si un co\u00fbt d'h\u00e9bergement est r\u00e9ellement compt\u00e9\r\n  const costHostingRow = document.getElementById('costHostingRow');\r\n  if (costHostingRow) {\r\n    if (costHosting > 0) {\r\n      costHostingRow.style.display = '';\r\n      document.getElementById('costHosting').textContent = formatCurrency(costHosting);\r\n    } else {\r\n      costHostingRow.style.display = 'none';\r\n      \/\/ [FIX] Purger la valeur : une ligne masquee conservait son ancien montant dans le\r\n      \/\/ DOM. submitForm lit ces libelles pour remplir le formulaire, donc le lead partait\r\n      \/\/ avec un cout d'hebergement qui n'etait pas compte dans le TCO.\r\n      document.getElementById('costHosting').textContent = 'Inclus';\r\n    }\r\n  }\r\n  document.getElementById('totalCost').textContent = formatCurrency(totalCost);\r\n\r\n  document.getElementById('gainProd').textContent = formatCurrency(gainProd3Y);\r\n  document.getElementById('gainErrors').textContent = formatCurrency(gainErrors3Y);\r\n  \/\/ Ligne \"IA agentique\" du d\u00e9tail - le pilier est permanent (AXELOR_AI_UPLIFT),\r\n  \/\/ la ligne s'affiche d\u00e8s que le gain est calculable (> 0)\r\n  const gainAiRow = document.getElementById('gainAiRow');\r\n  if (gainAiRow) {\r\n    if (gainAiAnnual > 0) {\r\n      gainAiRow.style.display = '';\r\n      document.getElementById('gainAi').textContent = formatCurrency(gainAi3Y);\r\n    } else {\r\n      gainAiRow.style.display = 'none';\r\n      document.getElementById('gainAi').textContent = formatCurrency(0);\r\n    }\r\n  }\r\n  \/\/ Ligne \"\u00c9conomies sur l'existant\" affich\u00e9e seulement si renseign\u00e9e\r\n  const gainExistingRow = document.getElementById('gainExistingRow');\r\n  if (gainExistingRow) {\r\n    if (gainExistingAnnual > 0) {\r\n      gainExistingRow.style.display = '';\r\n      document.getElementById('gainExisting').textContent = formatCurrency(gainExisting3Y);\r\n    } else {\r\n      gainExistingRow.style.display = 'none';\r\n      document.getElementById('gainExisting').textContent = formatCurrency(0);\r\n    }\r\n  }\r\n  document.getElementById('totalGain').textContent = formatCurrency(totalGain3Y);\r\n\r\n  \/\/ === Update charts ===\r\n  if (cumulativeChart && gainsChart) {\r\n    \/\/ Les s\u00e9ries costData[] et gainData[] ont \u00e9t\u00e9 calcul\u00e9es plus haut (bloc payback) - on les r\u00e9utilise tel quel.\r\n    \/\/ Coh\u00e9rence garantie par construction : le badge tombera exactement sur le croisement visible des courbes.\r\n    cumulativeChart.data.labels = ['Ann\u00e9e 0'];\r\n    for (let y = 1; y <= horizon; y++) cumulativeChart.data.labels.push('Ann\u00e9e ' + y);\r\n    cumulativeChart.data.datasets[0].data = costData;\r\n    cumulativeChart.data.datasets[1].data = gainData;\r\n    \/\/ Garde : le badge n'est dessin\u00e9 QUE si un croisement existe sur l'horizon\r\n    cumulativeChart.options.plugins.breakevenMonth = paybackMonths > 0 ? paybackMonths : 0;\r\n    cumulativeChart.update();\r\n\r\n    \/\/ Donut : on ne garde que les segments non nuls (IA et existant peuvent \u00eatre \u00e0 z\u00e9ro)\r\n    const donutSource = [\r\n      { label: 'Productivit\u00e9', value: Math.round(gainProdAnnual), color: '#3ECF8E' },\r\n      { label: 'R\u00e9duction erreurs', value: Math.round(gainErrorsAnnual), color: '#5FE3D0' },\r\n      { label: 'IA agentique', value: Math.round(gainAiAnnual), color: '#34D399' },\r\n      { label: '\u00c9conomies sur l\\'existant', value: Math.round(gainExistingAnnual), color: '#7B9FFF' }\r\n    ].filter(seg => seg.value > 0);\r\n    gainsChart.data.labels = donutSource.map(s => s.label);\r\n    gainsChart.data.datasets[0].data = donutSource.map(s => s.value);\r\n    gainsChart.data.datasets[0].backgroundColor = donutSource.map(s => s.color);\r\n    gainsChart.update();\r\n  }\r\n}\r\n\r\nfunction formatCurrency(value) {\r\n  const cur = getCurrency();\r\n  if (!value && value !== 0) return '- ' + cur.symbol;\r\n  const isNegative = value < 0;\r\n  const absValue = Math.abs(value);\r\n  const maxDecimals = 0; \/\/ montants toujours affiches sans decimale\r\n  try {\r\n    const formatted = new Intl.NumberFormat(cur.locale, {\r\n      style: 'currency',\r\n      currency: cur.code,\r\n      maximumFractionDigits: maxDecimals,\r\n      minimumFractionDigits: 0\r\n    }).format(absValue);\r\n    return (isNegative ? '- ' : '') + formatted;\r\n  } catch (e) {\r\n    \/\/ Fallback si la locale n'est pas support\u00e9e\r\n    const num = new Intl.NumberFormat('fr-FR', { maximumFractionDigits: 0 }).format(absValue);\r\n    const sign = isNegative ? '- ' : '';\r\n    return cur.position === 'before' ? sign + cur.symbol + ' ' + num : sign + num + ' ' + cur.symbol;\r\n  }\r\n}\r\n\r\nfunction formatCurrencyShort(value) {\r\n  const cur = getCurrency();\r\n  const sym = cur.symbol;\r\n  const sep = cur.position === 'before' ? sym + ' ' : ' ' + sym;\r\n  const sign = value < 0 ? '-' : '';\r\n  const abs = Math.abs(value);\r\n  if (abs >= 1000000) {\r\n    const v = (abs \/ 1000000).toFixed(1).replace('.0', '');\r\n    return cur.position === 'before' ? sign + sym + v + 'M' : sign + v + 'M' + sep.trim();\r\n  }\r\n  if (abs >= 1000) {\r\n    const v = (abs \/ 1000).toFixed(0);\r\n    return cur.position === 'before' ? sign + sym + v + 'k' : sign + v + 'k' + sep.trim();\r\n  }\r\n  return cur.position === 'before' ? sign + sym + abs : sign + abs + sep.trim();\r\n}\r\n\r\n\/\/ === BRANCHEMENT LEAD - via le formulaire Contact Form 7 rendu sur la page ===\r\n\/\/ (shortcode [contact-form-7 id=\"dcfe5b9\"] dans un module Texte Divi,\r\n\/\/  envelopp\u00e9 dans <div id=\"cf7RoiFormWrap\" style=\"display:none;\">)\r\n\r\n\/\/ Coefficient d'uplift IA (% du temps manuel r\u00e9siduel)\r\nconst AXELOR_AI_UPLIFT = 0.15;\r\n\r\nfunction domText(id) { const el = document.getElementById(id); return el ? el.textContent.trim() : ''; }\r\nfunction setCF7(id, value) { const el = document.getElementById(id); if (el) el.value = (value === undefined || value === null) ? '' : String(value); }\r\nfunction safeTrack(ev, data) {\r\n  try {\r\n    if (typeof track === 'function') { track(ev, data); return; }\r\n    window.dataLayer = window.dataLayer || [];\r\n    window.dataLayer.push(Object.assign({ event: ev }, data || {}));\r\n  } catch (e) {}\r\n}\r\n\r\nasync function submitForm(event) {\r\n  const firstName = document.getElementById('firstName').value.trim();\r\n  const lastName = document.getElementById('lastName').value.trim();\r\n  const email = document.getElementById('email').value.trim();\r\n  const company = document.getElementById('company').value.trim();\r\n  const consent = document.getElementById('privacyConsent');\r\n\r\n  if (!firstName || !lastName || !email || !company) { alert('Merci de remplir au moins votre pr\u00e9nom, nom, email et entreprise.'); return; }\r\n  if (!email.includes('@') || !email.includes('.')) { alert('Merci de saisir un email professionnel valide.'); return; }\r\n  if (consent && !consent.checked) { alert('Merci d\\'accepter le traitement de vos donn\u00e9es pour recevoir votre estimation.'); consent.focus(); return; }\r\n\r\n  const scenario = document.querySelector('.scenario-option.active')?.dataset.scenario || 'realistic';\r\n  const horizon = document.querySelector('.horizon-option.active')?.dataset.years || '5';\r\n  const profileEl = document.querySelector('.profile-btn.active');\r\n\r\n  safeTrack('calc_lead_submit', { roi: domText('roiPct'), payback: domText('paybackMonths'), scenario, horizon });\r\n\r\n  setCF7('cf7_first_name', firstName);\r\n  setCF7('cf7_last_name', lastName);\r\n  setCF7('cf7_email', email);\r\n  setCF7('cf7_company', company);\r\n  setCF7('cf7_role', document.getElementById('role').value);\r\n  setCF7('cf7_phone', document.getElementById('phone').value);\r\n  setCF7('cf7_profile', profileEl ? profileEl.dataset.profile : '');\r\n\r\n  setCF7('cf7_users', document.getElementById('users').value);\r\n  setCF7('cf7_license_cost', document.getElementById('licenseCost').value);\r\n  setCF7('cf7_implementation_cost', document.getElementById('implementationCost').value);\r\n  setCF7('cf7_training_cost', document.getElementById('trainingCost').value);\r\n  setCF7('cf7_maintenance_pct', document.getElementById('maintenancePct').value);\r\n  setCF7('cf7_maint_included', document.getElementById('maintIncluded')?.checked ? 'Oui' : 'Non');\r\n  setCF7('cf7_hosting_cost', document.getElementById('hostingCost').value);\r\n  setCF7('cf7_hosting_included', document.getElementById('hostingIncluded')?.checked ? 'Oui' : 'Non');\r\n  setCF7('cf7_existing_systems_cost', document.getElementById('existingSystemsCost').value);\r\n\r\n  setCF7('cf7_manual_hours', document.getElementById('manualHours').value);\r\n  setCF7('cf7_hourly_rate', document.getElementById('hourlyRate').value);\r\n  setCF7('cf7_data_reliability', document.getElementById('dataReliability').value);\r\n  setCF7('cf7_error_cost_estimate', domText('errorCostEstimate'));\r\n  setCF7('cf7_ai_uplift', (AXELOR_AI_UPLIFT * 100) + '%');\r\n\r\n  setCF7('cf7_horizon', horizon);\r\n  setCF7('cf7_scenario', scenario);\r\n  setCF7('cf7_currency', currentCurrency);\r\n\r\n  setCF7('cf7_cost_license', domText('costLicense'));\r\n  setCF7('cf7_cost_impl', domText('costImpl'));\r\n  setCF7('cf7_cost_maint', domText('costMaint'));\r\n  setCF7('cf7_cost_hosting', domText('costHosting'));\r\n  setCF7('cf7_cost_training', domText('costTraining'));\r\n  setCF7('cf7_total_cost', domText('totalCost'));\r\n\r\n  setCF7('cf7_gain_prod', domText('gainProd'));\r\n  setCF7('cf7_gain_errors', domText('gainErrors'));\r\n  setCF7('cf7_gain_ai', domText('gainAi'));\r\n  setCF7('cf7_gain_existing', domText('gainExisting'));\r\n  setCF7('cf7_total_gain', domText('totalGain'));\r\n\r\n  setCF7('cf7_roi_pct', domText('roiPct'));\r\n  setCF7('cf7_payback_months', domText('paybackMonths'));\r\n  setCF7('cf7_net_gain', domText('netGain'));\r\n  setCF7('cf7_hours_reclaimed', domText('hoursReclaimed'));\r\n\r\n  const btn = event.target.closest('.btn-submit');\r\n  const originalHTML = btn.innerHTML;\r\n  btn.disabled = true;\r\n  btn.innerHTML = '<span>Envoi en cours\u2026<\/span>';\r\n\r\n  const cf7Form = document.querySelector('#cf7RoiFormWrap form.wpcf7-form') || document.querySelector('.wpcf7-form');\r\n\r\n  if (!cf7Form) {\r\n    console.error('[ROI calculator] Formulaire CF7 introuvable. V\u00e9rifier le shortcode [contact-form-7] (module Texte Divi) et le conteneur #cf7RoiFormWrap.');\r\n    alert('Une erreur technique emp\u00eache l\\'envoi. Merci de nous contacter directement.');\r\n    safeTrack('calc_lead_error', { error: 'cf7_form_not_found' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML;\r\n    return;\r\n  }\r\n\r\n  const onMailSent = (e) => { if (e.target !== cf7Form) return;\r\n    document.getElementById('successMessage').classList.add('show');\r\n    btn.innerHTML = '<span>\u2713 Demande envoy\u00e9e<\/span>';\r\n    safeTrack('calc_lead_success', {}); cleanup(); };\r\n  const onMailFailed = (e) => { if (e.target !== cf7Form) return;\r\n    alert('Une erreur est survenue lors de l\\'envoi. Merci de r\u00e9essayer ou nous contacter directement.');\r\n    safeTrack('calc_lead_error', { error: 'wpcf7mailfailed' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML; cleanup(); };\r\n  const onInvalid = (e) => { if (e.target !== cf7Form) return;\r\n    alert('Certaines informations semblent invalides. Merci de v\u00e9rifier votre email et vos coordonn\u00e9es.');\r\n    safeTrack('calc_lead_error', { error: 'wpcf7invalid' });\r\n    btn.disabled = false; btn.innerHTML = originalHTML; cleanup(); };\r\n  function cleanup() {\r\n    document.removeEventListener('wpcf7mailsent', onMailSent);\r\n    document.removeEventListener('wpcf7mailfailed', onMailFailed);\r\n    document.removeEventListener('wpcf7invalid', onInvalid);\r\n    document.removeEventListener('wpcf7spam', onMailFailed);\r\n  }\r\n  document.addEventListener('wpcf7mailsent', onMailSent);\r\n  document.addEventListener('wpcf7mailfailed', onMailFailed);\r\n  document.addEventListener('wpcf7invalid', onInvalid);\r\n  document.addEventListener('wpcf7spam', onMailFailed);\r\n\r\n  \/\/ Filet de s\u00e9curit\u00e9 : si aucun \u00e9v\u00e9nement CF7 n'arrive en 8 s, on d\u00e9bloque le bouton\r\n  setTimeout(() => {\r\n    if (btn.innerHTML.includes('Envoi en cours')) {\r\n      document.getElementById('successMessage').classList.add('show');\r\n      btn.innerHTML = '<span>\u2713 Demande envoy\u00e9e<\/span>';\r\n      cleanup();\r\n    }\r\n  }, 8000);\r\n\r\n  if (cf7Form.requestSubmit) cf7Form.requestSubmit(); else cf7Form.submit();\r\n}\r\n\r\n\/\/ === Slider pourcentage : affichage dynamique ===\r\nfunction updateManualHoursDisplay() {\r\n  const slider = document.getElementById('manualHours');\r\n  if (!slider) return;\r\n  const value = parseInt(slider.value);\r\n  \/\/ Affiche le nombre\r\n  const display = document.getElementById('manualHoursDisplay');\r\n  if (display) display.textContent = value;\r\n  \/\/ Calcule \u00e9quivalent heures\/semaine (sur base 35h\/semaine standard)\r\n  \/\/ [FIX] Separateur decimal francais (la virgule) et mention des jours seulement\r\n  \/\/ quand elle est lisible : \"0.8 jour \/ semaine\" n'apportait rien.\r\n  const fr = (n) => n.toFixed(1).replace('.0', '').replace('.', ',');\r\n  const hoursPerWeek = fr(35 * value \/ 100);\r\n  const daysRaw = value \/ 100 * 5;\r\n  const equiv = document.getElementById('manualHoursEquiv');\r\n  if (equiv) {\r\n    let txt = `\u2248 ${hoursPerWeek} h \/ semaine`;\r\n    if (daysRaw >= 1) {\r\n      txt += `, ${fr(daysRaw)} jour${daysRaw >= 2 ? 's' : ''} \/ semaine`;\r\n    }\r\n    equiv.textContent = txt;\r\n  }\r\n  \/\/ Remplissage visuel du slider (gradient)\r\n  const min = parseInt(slider.min);\r\n  const max = parseInt(slider.max);\r\n  const fillPct = ((value - min) \/ (max - min)) * 100;\r\n  slider.style.setProperty('--slider-fill', fillPct + '%');\r\n}\r\nconst manualHoursSlider = document.getElementById('manualHours');\r\nif (manualHoursSlider) {\r\n  manualHoursSlider.addEventListener('input', updateManualHoursDisplay);\r\n  updateManualHoursDisplay(); \/\/ Initial\r\n}\r\n\r\n\/\/ === Slider Fiabilit\u00e9 des donn\u00e9es ===\r\nfunction updateDataReliabilityDisplay() {\r\n  const slider = document.getElementById('dataReliability');\r\n  if (!slider) return;\r\n  const value = parseInt(slider.value);\r\n  \/\/ Affiche le nombre\r\n  const display = document.getElementById('dataReliabilityDisplay');\r\n  if (display) display.textContent = value;\r\n  \/\/ Label qualitatif selon le niveau\r\n  let label = '';\r\n  if (value <= 25) label = 'Donn\u00e9es tr\u00e8s fragment\u00e9es';\r\n  else if (value <= 45) label = 'Donn\u00e9es fragment\u00e9es';\r\n  else if (value <= 65) label = 'Fiabilit\u00e9 moyenne';\r\n  else if (value <= 80) label = 'Donn\u00e9es plut\u00f4t fiables';\r\n  else label = 'Donn\u00e9es tr\u00e8s fiables';\r\n  const labelEl = document.getElementById('dataReliabilityLabel');\r\n  if (labelEl) labelEl.textContent = label;\r\n  \/\/ Remplissage visuel du slider\r\n  const min = parseInt(slider.min);\r\n  const max = parseInt(slider.max);\r\n  const fillPct = ((value - min) \/ (max - min)) * 100;\r\n  slider.style.setProperty('--slider-fill', fillPct + '%');\r\n}\r\nconst dataReliabilitySlider = document.getElementById('dataReliability');\r\nif (dataReliabilitySlider) {\r\n  dataReliabilitySlider.addEventListener('input', updateDataReliabilityDisplay);\r\n  updateDataReliabilityDisplay();\r\n}\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== FORMATAGE FRAN\u00c7AIS DES INPUTS NUM\u00c9RIQUES ====\r\n\/\/ Affichage : 5000 \u2192 \"5 000\" (entier) ou \"5 000,00\" (montant)\r\n\/\/ =====================================================\r\nfunction parseUserInput(val) {\r\n  if (val === null || val === undefined || val === '') return null;\r\n  const cleaned = String(val).replace(\/\\s\/g, '').replace(',', '.');\r\n  const n = parseFloat(cleaned);\r\n  return isNaN(n) ? null : n;\r\n}\r\n\r\nfunction formatForDisplay(n, format) {\r\n  if (n === null || isNaN(n)) return '';\r\n  if (format === 'currency') {\r\n    return new Intl.NumberFormat('fr-FR', {\r\n      minimumFractionDigits: 2,\r\n      maximumFractionDigits: 2\r\n    }).format(n);\r\n  }\r\n  \/\/ entier (avec espaces si grand nombre)\r\n  return new Intl.NumberFormat('fr-FR', {\r\n    maximumFractionDigits: 0\r\n  }).format(n);\r\n}\r\n\r\nfunction formatForEdit(n, format) {\r\n  \/\/ \u00c0 l'\u00e9dition : pas de s\u00e9parateurs de milliers mais virgule d\u00e9cimale pour la coh\u00e9rence FR\r\n  if (n === null || isNaN(n)) return '';\r\n  if (format === 'currency') {\r\n    \/\/ 5000.5 \u2192 \"5000,5\" ; 5000 \u2192 \"5000\"\r\n    return String(n).replace('.', ',');\r\n  }\r\n  return String(Math.round(n));\r\n}\r\n\r\ndocument.querySelectorAll('input[data-format]').forEach(input => {\r\n  const fmt = input.dataset.format;\r\n\r\n  \/\/ Au focus : passer en mode \u00e9dition (sans espaces)\r\n  input.addEventListener('focus', () => {\r\n    const n = parseUserInput(input.value);\r\n    input.value = formatForEdit(n, fmt);\r\n    \/\/ S\u00e9lectionner tout pour faciliter l'\u00e9dition\r\n    setTimeout(() => input.select(), 0);\r\n  });\r\n\r\n  \/\/ Au blur : passer en mode affichage format\u00e9\r\n  input.addEventListener('blur', () => {\r\n    const n = parseUserInput(input.value);\r\n    input.value = formatForDisplay(n, fmt);\r\n  });\r\n\r\n  \/\/ Pendant la saisie : autoriser uniquement chiffres + virgule\/point + espace\r\n  input.addEventListener('input', () => {\r\n    \/\/ On nettoie sans toucher au curseur (sinon UX cass\u00e9e)\r\n    const cleaned = input.value.replace(\/[^\\d.,\\s]\/g, '');\r\n    if (cleaned !== input.value) input.value = cleaned;\r\n  });\r\n});\r\n\r\ndocument.querySelectorAll('input, select').forEach(el => {\r\n  el.addEventListener('input', calculate);\r\n  el.addEventListener('change', calculate);\r\n});\r\n\r\n\/\/ === ANALYTICS (dataLayer \/ GTM) ===\r\nwindow.dataLayer = window.dataLayer || [];\r\nfunction track(ev, data){ try { window.dataLayer.push(Object.assign({ event: ev }, data || {})); } catch(e){} }\r\n(function(){\r\n  var started = false, resultTracked = false, resTimer = null;\r\n  function txt(id){ var e = document.getElementById(id); return e ? (e.textContent || '').trim() : ''; }\r\n  function activeData(sel, key, def){ var e = document.querySelector(sel + '.active'); return (e && e.dataset && e.dataset[key]) ? e.dataset[key] : def; }\r\n  function fireStart(){ if (started) return; started = true; track('calc_start', {}); }\r\n  function scheduleResult(){\r\n    if (resultTracked) return;\r\n    clearTimeout(resTimer);\r\n    resTimer = setTimeout(function(){\r\n      resultTracked = true;\r\n      track('calc_result', {\r\n        roi: txt('roiPct'),\r\n        payback: txt('paybackMonths'),\r\n        net_gain: txt('netGain'),\r\n        scenario: activeData('.scenario-option', 'scenario', 'realistic'),\r\n        horizon: activeData('.horizon-option', 'years', '5')\r\n      });\r\n    }, 1500);\r\n  }\r\n  function onInteract(){ fireStart(); scheduleResult(); }\r\n  document.addEventListener('input', onInteract, true);\r\n  document.addEventListener('change', onInteract, true);\r\n  document.addEventListener('click', function(e){\r\n    if (e.target.closest && e.target.closest('.profile-btn, .scenario-option, .horizon-option')) { onInteract(); }\r\n  }, true);\r\n})();\r\n\r\n\/\/ ===================== WIZARD \u00c0 ONGLETS =====================\r\n(function(){\r\n  const tabs = document.querySelectorAll('.wiz-tab');\r\n  const panels = document.querySelectorAll('.wiz-panel');\r\n  if (!tabs.length || !panels.length) return;\r\n  const max = panels.length - 1;\r\n  let cur = 0;\r\n\r\n  function go(n) {\r\n    cur = Math.max(0, Math.min(max, n));\r\n    tabs.forEach((t, i) => {\r\n      t.classList.toggle('active', i === cur);\r\n      t.classList.toggle('done', i < cur);\r\n    });\r\n    panels.forEach((p, i) => p.classList.toggle('active', i === cur));\r\n    \/\/ mettre \u00e0 jour l'\u00e9tat des boutons Pr\u00e9c\u00e9dent dans chaque panneau (d\u00e9sactiver sur la 1re \u00e9tape)\r\n    panels.forEach((p, i) => {\r\n      const prev = p.querySelector('.wiz-btn.prev');\r\n      if (prev) prev.disabled = (i === 0);\r\n    });\r\n  }\r\n\r\n  \/\/ onglets cliquables\r\n  tabs.forEach((t, i) => t.addEventListener('click', () => go(i)));\r\n\r\n  \/\/ boutons Pr\u00e9c\u00e9dent \/ Suivant dans chaque panneau\r\n  panels.forEach((panel, idx) => {\r\n    const prev = panel.querySelector('.wiz-btn.prev');\r\n    const next = panel.querySelector('.wiz-btn.next');\r\n    if (prev) prev.addEventListener('click', () => go(cur - 1));\r\n    if (next) next.addEventListener('click', () => {\r\n      if (cur < max) { go(cur + 1); }\r\n      else {\r\n        const res = document.querySelector('.results');\r\n        if (res) res.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n      }\r\n    });\r\n  });\r\n\r\n  go(0);\r\n})();\r\n\r\ninitCharts();\r\ncalculate();\r\n\r\n\/\/ === FAQ Accordion ===\r\ndocument.querySelectorAll('.faq-question').forEach(q => {\r\n  q.addEventListener('click', function() {\r\n    const item = this.closest('.faq-item');\r\n    const isOpen = item.classList.contains('open');\r\n    item.classList.toggle('open', !isOpen);\r\n  });\r\n});\r\n\r\n\/\/ =====================================================\r\n\/\/ ==== PROFILS TYPES - pr\u00e9-remplissage par ordre de grandeur ====\r\n\/\/ Valeurs indicatives (march\u00e9 ERP int\u00e9gr\u00e9), \u00e0 affiner avec les \u00e9quipes.\r\n\/\/ Un clic remplit les champs ; le visiteur ajuste ensuite.\r\n\/\/ =====================================================\r\n(function() {\r\n  \/\/ Seuils valid\u00e9s : PME jusqu'\u00e0 80 utilisateurs | ETI 81 \u00e0 300 | Grands Comptes plus de 300.\r\n  \/\/ manualHours \u00e0 20 % : moyenne annonc\u00e9e dans la FAQ et dans l'aide du champ.\r\n  const PROFILES = {\r\n    pme:            { users: 50,  licenseCost: 55, implementationCost: 75000,  trainingCost: 12000, maintenancePct: 20, hostingCost: 6000,  existingSystemsCost: 12000,  manualHours: 15, hourlyRate: 45, dataReliability: 50 },\r\n    eti:            { users: 150, licenseCost: 55, implementationCost: 180000, trainingCost: 30000, maintenancePct: 20, hostingCost: 12000, existingSystemsCost: 40000,  manualHours: 15, hourlyRate: 50, dataReliability: 45 },\r\n    grands_comptes: { users: 500, licenseCost: 55, implementationCost: 400000, trainingCost: 60000, maintenancePct: 20, hostingCost: 24000, existingSystemsCost: 120000, manualHours: 15, hourlyRate: 55, dataReliability: 45 }\r\n  };\r\n\r\n  function applyProfile(key, markActive) {\r\n    const p = PROFILES[key];\r\n    if (!p) return;\r\n    \/\/ Champs texte format\u00e9s (currency \/ integer)\r\n    document.querySelectorAll('input[data-format]').forEach(input => {\r\n      if (p.hasOwnProperty(input.id)) {\r\n        const fmt = input.dataset.format;\r\n        input.value = (typeof formatForDisplay === 'function') ? formatForDisplay(p[input.id], fmt) : String(p[input.id]);\r\n      }\r\n    });\r\n    \/\/ Sliders + leur affichage\r\n    const mh = document.getElementById('manualHours');\r\n    if (mh && p.manualHours != null) { mh.value = p.manualHours; if (typeof updateManualHoursDisplay === 'function') updateManualHoursDisplay(); }\r\n    const dr = document.getElementById('dataReliability');\r\n    if (dr && p.dataReliability != null) { dr.value = p.dataReliability; if (typeof updateDataReliabilityDisplay === 'function') updateDataReliabilityDisplay(); }\r\n    \/\/ Marquer le bouton actif\r\n    if (markActive) {\r\n      document.querySelectorAll('.profile-btn').forEach(b => b.classList.toggle('active', b.dataset.profile === key));\r\n    }\r\n    \/\/ [FIX] Respecter l'etat des cases \"deja inclus\" apres un pre-remplissage :\r\n    \/\/ le profil propose un montant, mais si la case est cochee le champ doit afficher 0.\r\n    \/\/ Le montant du profil est memorise pour etre restitue si l'utilisateur decoche.\r\n    const mTog = document.getElementById('maintIncluded');\r\n    const mInp = document.getElementById('maintenancePct');\r\n    if (mTog && mInp) {\r\n      if (mTog.checked) { window.__maintSaved = mInp.value; mInp.value = '0'; }\r\n    }\r\n    const hTog = document.getElementById('hostingIncluded');\r\n    const hInp = document.getElementById('hostingCost');\r\n    if (hTog && hInp) {\r\n      if (hTog.checked) { window.__hostingSaved = hInp.value; hInp.value = '0'; }\r\n    }\r\n\r\n    \/\/ Recalculer \u2192 graphes + KPI \u00e0 jour\r\n    if (typeof calculate === 'function') calculate();\r\n  }\r\n\r\n  document.querySelectorAll('.profile-btn').forEach(btn => {\r\n    btn.addEventListener('click', () => applyProfile(btn.dataset.profile, true));\r\n  });\r\n\r\n\r\n  \/\/ Si l'utilisateur modifie un champ \u00e0 la main, on retire l'\u00e9tat \"actif\" du profil\r\n  document.querySelectorAll('input[data-format], #manualHours, #dataReliability').forEach(input => {\r\n    input.addEventListener('input', () => {\r\n      document.querySelectorAll('.profile-btn.active').forEach(b => b.classList.remove('active'));\r\n    });\r\n  });\r\n\r\n  \/\/ Au chargement : pr\u00e9-remplir avec le profil PME pour afficher les graphes imm\u00e9diatement\r\n  function initDefault() {\r\n    applyProfile('pme', true);\r\n  }\r\n  if (document.readyState === 'loading') {\r\n    document.addEventListener('DOMContentLoaded', () => setTimeout(initDefault, 60));\r\n  } else {\r\n    setTimeout(initDefault, 60);\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<\/div><!-- \/.roi-wrap -->\r\n<\/body>\r\n<\/html>\r\n<\/p>\n","protected":false},"author":16,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_et_pb_use_builder":"on","_et_pb_old_content":"<!-- wp:html \/-->","_et_gb_content_width":"","content-type":"","inline_featured_image":false,"footnotes":""},"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Calculateur ROI ERP : retour sur investissement | Axelor<\/title>\n<meta name=\"description\" content=\"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Calculateur ROI ERP : retour sur investissement | Axelor\" \/>\n<meta property=\"og:description\" content=\"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\" \/>\n<meta property=\"og:site_name\" content=\"Axelor\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-25T14:26:12+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data1\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\",\"url\":\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\",\"name\":\"Calculateur ROI ERP : retour sur investissement | Axelor\",\"isPartOf\":{\"@id\":\"https:\/\/axelor.com\/#website\"},\"datePublished\":\"2026-05-21T10:41:42+00:00\",\"dateModified\":\"2026-08-25T14:26:12+00:00\",\"description\":\"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.\",\"breadcrumb\":{\"@id\":\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\/\/axelor.com\/fr\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Calculateur ROI ERP : retour sur investissement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/axelor.com\/#website\",\"url\":\"https:\/\/axelor.com\/\",\"name\":\"Axelor\",\"description\":\"ERP CRM BPM Open Source\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/axelor.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Calculateur ROI ERP : retour sur investissement | Axelor","description":"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/","og_locale":"fr_FR","og_type":"article","og_title":"Calculateur ROI ERP : retour sur investissement | Axelor","og_description":"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.","og_url":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/","og_site_name":"Axelor","article_modified_time":"2026-08-25T14:26:12+00:00","twitter_card":"summary_large_image","twitter_misc":{"Dur\u00e9e de lecture estim\u00e9e":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/","url":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/","name":"Calculateur ROI ERP : retour sur investissement | Axelor","isPartOf":{"@id":"https:\/\/axelor.com\/#website"},"datePublished":"2026-05-21T10:41:42+00:00","dateModified":"2026-08-25T14:26:12+00:00","description":"Calculez le ROI de votre projet ERP : TCO sur 3 \u00e0 10 ans, gains de productivit\u00e9 et IA agentique. M\u00e9thodologie NPV, 3 sc\u00e9narios. Outil gratuit.","breadcrumb":{"@id":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/axelor.com\/fr\/calculateur-roi-erp\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/axelor.com\/fr\/calculateur-roi-erp\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/axelor.com\/fr\/"},{"@type":"ListItem","position":2,"name":"Calculateur ROI ERP : retour sur investissement"}]},{"@type":"WebSite","@id":"https:\/\/axelor.com\/#website","url":"https:\/\/axelor.com\/","name":"Axelor","description":"ERP CRM BPM Open Source","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/axelor.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"}]}},"_links":{"self":[{"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/pages\/386935"}],"collection":[{"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/users\/16"}],"replies":[{"embeddable":true,"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/comments?post=386935"}],"version-history":[{"count":39,"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/pages\/386935\/revisions"}],"predecessor-version":[{"id":388340,"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/pages\/386935\/revisions\/388340"}],"wp:attachment":[{"href":"https:\/\/axelor.com\/fr\/wp-json\/wp\/v2\/media?parent=386935"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}