templates/pro/inscription2.html.twig line 1

Open in your IDE?
  1. {% block stylesheets %}
  2.     <link rel="stylesheet" href="/assets/css/pro/inscription-page.css">
  3.     <link rel="stylesheet" href="/assets/css/pro/new-inscription.css">
  4.     <link rel="stylesheet" href="/assets/lib/bootstrap-5.0.2-dist/css/bootstrap.min.css">
  5. {% endblock %}
  6. {% block javascripts %}
  7.     {# {{ encore_entry_script_tags('app') }} #}
  8.     <!--jquery-->
  9.     <script src="/assets/lib/jquery-3.6.0.min.js"></script>
  10.     <script src="/assets/lib/jquery-migrate-3.3.2.min.js"></script>
  11.     <!--bootstrap-->
  12.     <script src="/assets/lib/bootstrap-5.0.2-dist/js/bootstrap.bundle.min.js"></script>
  13.     <!--Material-->
  14.     <script src="https://storage.googleapis.com/code.getmdl.io/1.0.0/material.min.js"></script>
  15.     <script src="/assets/lib/date.format.js"></script>
  16.     <script src="/assets/js/global.js"></script>
  17.     <script src="/assets/js/pro/payment.js?v=v14"></script>
  18.     <script src="/assets/js/pro/smsverify.js"></script>
  19.     <script src="/assets/lib/jquery.responsiveTabs.js"></script>
  20.     <script src="/assets/js/pro/inscription.js"></script>
  21.     <script src="https://js.stripe.com/v3/"></script>
  22.     <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCRmNV4VerjHHrsOoQOMmRWwpKL_ekzJrc&libraries=geometry,drawing,places&callback=initMap"></script>
  23.     <script type="text/javascript">
  24.         $(document).ready(function () {
  25.             $("#password").on("input", function (event) {
  26.                 const password = document.getElementById("password").value.trim();
  27.                     const hasUpperCase = /[A-Z]/.test(password);
  28.                     const hasNumber = /\d/.test(password); 
  29.                     const hasSpecialChar = /[!@#$%^&*()_\-+=\[\]{};:'"\\|,.<>?/`~_&^%]/.test(password);
  30.                     const hasMinLength = password.length >= 8;
  31. updateRequirement("requirement-uppercase", "bullet-uppercase", hasUpperCase);
  32. updateRequirement("requirement-special-number", "bullet-number", hasNumber);
  33. updateRequirement("requirement-special-char", "bullet-special-char", hasSpecialChar);
  34. updateRequirement("requirement-min-length", "bullet-min-length", hasMinLength);
  35.             });
  36.             $('body').on('click', '#form7 .create-account-button', function (e) {
  37.                 e.preventDefault();
  38.                 validatePayment(e, userData);
  39.             });
  40.         });
  41.     </script>
  42.    
  43.     <script>
  44.         let currentStep = 1;
  45.         let totalSteps = 21;
  46.         let userData = {};
  47.         let imagesData = {};
  48.         let convertedJson = {};
  49.         let StripToken = "";
  50.         let durationAnimation = 3000
  51.         const tarifs = {{ tarifs|json_encode|raw }};
  52.         tarifs.quantity = 1 + tarifs.quantity;
  53.         let finalPriceSub = 0;
  54.         function getUrlParameters() {
  55.             const urlParams = new URLSearchParams(window.location.search);
  56.             urlParams.forEach((value, key) => {
  57.                 userData[key] = value;
  58.             });
  59.         }
  60.         //getUrlParameters();
  61.         
  62.         function setupCardInputs() {
  63.             const cardNumber = document.getElementById('card-number');
  64.             const expiryDate = document.getElementById('expiry-date');
  65.             const cvc = document.getElementById('cvc');
  66.             cardNumber.addEventListener('input', function (e) {
  67.                 let value = this.value.replace(/\D/g, '');
  68.                 this.value = value;
  69.                 if (value.length === 16) {
  70.                     setTimeout(() => expiryDate.focus(), 10);
  71.                 }
  72.             });
  73.             expiryDate.addEventListener('input', function (e) {
  74.                 let value = this.value.replace(/\D/g, '');
  75.                 value = value.substring(0, 4);
  76.                 if (value.length > 2) {
  77.                     this.value = value.substring(0, 2) + '/' + value.substring(2, 4);
  78.                 } else {
  79.                     this.value = value;
  80.                 }
  81.                 if (this.value.length === 5) {
  82.                     setTimeout(() => cvc.focus(), 10);
  83.                 }
  84.             });
  85.             cvc.addEventListener('input', function (e) {
  86.                 let value = this.value.replace(/\D/g, '');
  87.                 this.value = value;
  88.                 if (value.length === 3) {
  89.                     const submitButton = this.closest('form').querySelector('button[type="button"]');
  90.                     if (submitButton) {
  91.                         setTimeout(() => submitButton.focus(), 10);
  92.                     }
  93.                 }
  94.             });
  95.             expiryDate.addEventListener('keydown', function (e) {
  96.                 if (e.key === 'Backspace' && this.value === '') {
  97.                     cardNumber.focus();
  98.                 }
  99.             });
  100.             cvc.addEventListener('keydown', function (e) {
  101.                 if (e.key === 'Backspace' && this.value === '') {
  102.                     expiryDate.focus();
  103.                 }
  104.             });
  105.         }
  106.            function isValidBlob(file) {
  107.                return file instanceof Blob || file instanceof File;
  108.            }
  109.            function base64ToBlob(base64, mimeType) {
  110.                const byteCharacters = atob(base64.split(',')[1]);
  111.                const byteArrays = [];
  112.                  for (let i = 0; i < byteCharacters.length; i += 512) {
  113.                    const slice = byteCharacters.slice(i, i + 512);
  114.                    const byteNumbers = new Array(slice.length);
  115.                    for (let j = 0; j < slice.length; j++) {
  116.                       byteNumbers[j] = slice.charCodeAt(j);
  117.                     }
  118.                    const byteArray = new Uint8Array(byteNumbers);
  119.                    byteArrays.push(byteArray);
  120.                   }
  121.    
  122.                return new Blob(byteArrays, { type: mimeType });
  123.             }
  124.         async function switchForm(step) {
  125.             clearError();
  126.             const progressBar = document.querySelector(".progress-steps .progress");
  127.             if (progressBar) {
  128.                 let newWidth = Math.min(step * 5, 100);
  129.                 progressBar.style.width = `${newWidth}%`;
  130.             }
  131.             for (let i = 0; i <= totalSteps; i++) {
  132.                 document.getElementById("form" + i).style.display = "none";
  133.             }
  134.             document.getElementById("form" + step).style.display = "block";
  135.             if (step === 8) {
  136.                 const img = document.createElement('img');
  137.                 img.id = "welcomeImg";
  138.                 img.src = "/assets/img/pro/fireworks.gif";
  139.                 img.style.width = "400px";
  140.                 const formTitle = document.getElementById("formTitle");
  141.                 const main = formTitle.closest('main');
  142.                 if (main && formTitle) {
  143.                     main.insertBefore(img, formTitle);
  144.                 }
  145.             } else if (step !== 8) {
  146.                 const img = document.getElementById("welcomeImg");
  147.                 if (img) {
  148.                     img.remove();
  149.                 }
  150.             }
  151.             if (step === 10) {
  152.                 const img = document.createElement('img');
  153.                 img.id = "completedImg";
  154.                 img.src = "/assets/img/pro/handshake.gif";
  155.                 img.style.width = "400px";
  156.                 const formTitle = document.getElementById("formTitle");
  157.                 const main = formTitle.closest('main');
  158.                 if (main && formTitle) {
  159.                     main.insertBefore(img, formTitle);
  160.                 }
  161.             } else if (step !== 10) {
  162.                 const img = document.getElementById("completedImg");
  163.                 if (img) {
  164.                     img.remove();
  165.                 }
  166.             }
  167.             if (step === 21) {
  168.                 const img = document.createElement('img');
  169.                 img.id = "finishImg";
  170.                 img.src = "/assets/img/pro/finish.gif";
  171.                 img.style.width = "400px";
  172.                 const formTitle = document.getElementById("formTitle");
  173.                 const main = formTitle.closest('main');
  174.                 if (main && formTitle) {
  175.                     main.insertBefore(img, formTitle);
  176.                 }
  177.             } else if (step !== 21) {
  178.                 const img = document.getElementById("finishImg");
  179.                 if (img) {
  180.                     img.remove();
  181.                 }
  182.             }
  183.             switch (step) {
  184.                 case 0:
  185.                     document.getElementById("formTitle").innerText = "Créez votre compte";
  186.                     document.getElementById("previousPage").href = "/pronew";
  187.                     break;
  188.                 case 1:
  189.                     document.getElementById("formTitle").innerText = `Audioprothésiste gérant du centre auditif`;
  190.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  191.                     break;    
  192.                 case 2:
  193.                     document.getElementById("formTitle").innerText = "Quelle est votre nom ?";
  194.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  195.                     break;
  196.                 case 3:
  197.                     document.getElementById("formTitle").innerText = "À propos de votre société";
  198.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  199.                     break;
  200.                 case 4:
  201.                     document.getElementById("formTitle").innerText = "À propos de votre société";
  202.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  203.                     break;
  204.                 case 5:
  205.                     document.getElementById("formTitle").innerText = "Quel est le nom de votre centre ?";
  206.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  207.                     break;
  208.                 case 6:
  209.                     document.getElementById("formTitle").innerText = "Quel est votre numéro de téléphone ?";
  210.                     document.getElementById("subtitle").innerText = "Ce numéro vous permettra de recevoir les notifications des rendez-vous";
  211.                     $('#subtitle').show();
  212.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  213.                     break;
  214.                 case 7:
  215.                     $('#subtitle').hide();
  216.                     document.getElementById("formTitle").innerText = "C'est presque terminé";
  217.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  218.                     const priceElement = document.getElementById('pricePayment');
  219.                     if (priceElement && tarifs.price) {
  220.                         if (tarifs.recurring == 'annual') {
  221.                             priceElement.innerText = `${parseFloat(tarifs.annualPrice).toFixed(2)}€ HT/an`;
  222.                             finalPriceSub = parseFloat(tarifs.annualPrice).toFixed(2);
  223.                         } else {
  224.                             priceElement.innerText = `${parseFloat(tarifs.price).toFixed(2)}€ HT/mois`;
  225.                             finalPriceSub = parseFloat(tarifs.price).toFixed(2);
  226.                         }
  227.                     } else {
  228.                         priceElement.innerText = "Prix non disponible";
  229.                     }
  230.                     var currentDate = new Date();
  231.                     var futureDate = new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, currentDate.getDate());
  232.                     var futureDateString = futureDate.toLocaleDateString();
  233.                     $('#resultMonth').text(futureDateString);
  234.                     break;
  235.                 case 8:
  236.                     document.getElementById("formTitle").innerText = `Félicitations !!!\nBienvenue chez My Audio.`;
  237.                     document.getElementById("formTitle").style.color = "#27977F";
  238.                     document.getElementById("formTitle").style.textAlign = "center";
  239.                     document.getElementById("formTitle").style.whiteSpace = "pre-line";
  240.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  241.                     setTimeout(() => {
  242.                         currentStep = 9;
  243.                         switchForm(currentStep);
  244.                     }, durationAnimation);
  245.                     break;
  246.                 case 9:
  247.                     document.getElementById("formTitle").innerText = `Réservez votre session\nd'onboarding `;
  248.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  249.                     break;
  250.                 case 10:
  251.                     document.getElementById("formTitle").innerText = `On a hâte de commencer !!!`;
  252.                     document.getElementById("formTitle").style.color = "#27977F";
  253.                     document.getElementById("formTitle").style.textAlign = "center";
  254.                     document.getElementById("formTitle").style.whiteSpace = "pre-line";
  255.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  256.                     setTimeout(() => {
  257.                         currentStep = 11;
  258.                         switchForm(currentStep);
  259.                     }, durationAnimation);
  260.                     break;
  261.                 case 11:
  262.                     document.getElementById("formTitle").style.color = "unset";
  263.                     document.getElementById("formTitle").innerText = `Vous avez 5 minutes ?`;
  264.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  265.                     break;
  266.                 case 12:
  267.                     document.getElementById("formTitle").innerText = `Accès au centre`;
  268.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  269.                     break;
  270.                 case 13:
  271.                     document.getElementById("formTitle").innerText = `Prestation et prises en charge`;
  272.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  273.                     break;
  274.                 /*case 14:
  275.                     document.getElementById("formTitle").innerText = `Audioprothésiste gérant du centre auditif`;
  276.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  277.                     break;
  278. */
  279.                 case 15:
  280.                     document.getElementById("formTitle").innerText = `Audioprothésiste gérant du centre auditif`;
  281.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  282.                     break;
  283.                 case 16:
  284.                     document.getElementById("formTitle").innerText = `Description de l'audioprothésiste`;
  285.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  286.                     break;
  287.                 case 17:
  288.                     document.getElementById("formTitle").innerText = `Description de votre centre auditif`;
  289.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  290.                     break;
  291.                 case 18:
  292.                     document.getElementById("formTitle").innerText = `Photos de votre centre auditif`;
  293.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  294.                     break;
  295.                 case 19:
  296.                     document.getElementById("formTitle").innerText = `Spécialité(s) Audioprothésiste gérant`;
  297.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  298.                     break;
  299.                 case 20:
  300.                     document.getElementById("formTitle").innerText = `Diplômes Audioprothésiste gérant`;
  301.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  302.                     break;
  303.                 case 21:
  304.                     let jsonFile = await convertJsonData(userData);
  305.                     console.log(jsonFile);
  306.                     document.getElementById("formTitle").innerText = `Bravo !\nOn finalisera tous lors de votre session d’onboarding.`;
  307.                     document.getElementById("formTitle").style.color = "#27977F";
  308.                     document.getElementById("formTitle").style.textAlign = "center";
  309.                     document.getElementById("formTitle").style.whiteSpace = "pre-line";
  310.                     document.getElementById("previousPage").href = "javascript:goToPreviousForm();";
  311.                     $(".finalStep").show();
  312.                     if (typeof imagesData.profileImage === 'string' && imagesData.profileImage.startsWith('data:')) {
  313.                     imagesData.profileImage = base64ToBlob(imagesData.profileImage, 'image/png');
  314.                     }
  315.                     if (typeof imagesData.diplomeImage === 'string' && imagesData.diplomeImage.startsWith('data:')) {
  316.                     imagesData.diplomeImage = base64ToBlob(imagesData.diplomeImage, 'image/jpeg');
  317.                     }
  318.                     if (typeof imagesData.facadeImage === 'string' && imagesData.facadeImage.startsWith('data:')) {
  319.                     imagesData.facadeImage = base64ToBlob(imagesData.facadeImage, 'image/png');
  320.                     }
  321.                     if (typeof imagesData.interieurImage === 'string' && imagesData.interieurImage.startsWith('data:')) {
  322.                     imagesData.interieurImage = base64ToBlob(imagesData.interieurImage, 'image/png');
  323.                     }
  324.                     const formData = new FormData();
  325.                     formData.append('audioId', userData.audioId);
  326.                     formData.append('centreId', userData.centerId);
  327.                    
  328.                     if (isValidBlob(imagesData.profileImage)) {
  329.                     formData.append('image_profil', imagesData.profileImage, 'image-profil.png');
  330. }                   else {
  331.                     console.warn('Invalid profile image, skipping...');
  332.                     }
  333.                     if (isValidBlob(imagesData.diplomeImage)) {
  334.                     formData.append('image_diplome', imagesData.diplomeImage, 'image-diplome.png');
  335. }                   else {
  336.                     console.warn('Invalid diplome image, skipping...');
  337.                     }
  338.                     if (isValidBlob(imagesData.facadeImage)) {
  339.                     formData.append('image_facade', imagesData.facadeImage, 'image-facade.png');
  340. }                   else {
  341.                     console.warn('Invalid facade image, skipping...');
  342.                     }
  343.                     if (isValidBlob(imagesData.interieurImage)) {
  344.                     formData.append('image_interieur', imagesData.interieurImage, 'image-interieur.png');
  345. }                   else {
  346.                      console.warn('Invalid interieur image, skipping...');
  347.                      }
  348.                     $.ajax({
  349.                         url: BASE_API + 'update/audio-center',
  350.                         type: "POST",
  351.                         contentType: "application/json",
  352.                         dataType: "json",
  353.                         data: JSON.stringify(jsonFile),
  354.                         async: true,
  355.                         success: function () {
  356.                             $.ajax({
  357.                                 url: BASE_API + 'centre/image/fData-newinscription',
  358.                                 type: "POST",
  359.                                 contentType: false,
  360.                                 processData: false,
  361.                                 dataType: "json",
  362.                                 data: formData,
  363.                                 async: true,
  364.                                 success: function (data) {
  365.                                      window.dataLayer.push({
  366.                                         event: "Formulaire_inscription_2",
  367.                                     });
  368.                                 },
  369.                                 error: function (xhr, status, error) {
  370.                                     handleAjaxError(xhr, "Erreur lors de l'envoi des données de l'image.");
  371.                                     $(".strButton").prop("disabled", false); // Réactiver le bouton
  372.                                 }
  373.                             });
  374.                         },
  375.                         error: function (xhr, status, error) {
  376.                         },
  377.                     });
  378.                     setTimeout(() => {
  379.                         currentStep = 21;
  380.                         //window.location.href = "https://pro.myaudio.fr/login";
  381.                     }, durationAnimation);
  382.                     break;
  383.                 default:
  384.                     break;
  385.             }
  386.         }
  387.         // Fonction pour afficher un message d'erreur
  388.         function displayError(message) {
  389.             const errorElement = document.getElementById("error-message-form");
  390.             if (errorElement) {
  391.                 errorElement.textContent = message;
  392.             }
  393.         }
  394.         function displayAllError(message) {
  395.             const errorContainer = document.getElementById("error-message-form");
  396.             errorContainer.innerHTML = message; 
  397.             errorContainer.style.display = "block"; 
  398.         }
  399.         // function for validate email adres format
  400.         function isValidEmail(email) {
  401.           const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  402.           return emailRegex.test(email);
  403.          }
  404.         // Fonction pour effacer le message d'erreur
  405.         function clearError() {
  406.             const errorElement = document.getElementById("error-message-form");
  407.             const errorElementStripe = document.querySelector(".error-message");
  408.             if (errorElementStripe) {
  409.               errorElementStripe.textContent = "";
  410.             }
  411.             if (errorElement) {
  412.                 errorElement.textContent = "";
  413.             }
  414.             $("#success-sms-validate").hide(); 
  415.         }
  416.         function validateForm(step, event) {
  417.             event.preventDefault();
  418.             let valid = true;
  419.             // Effacer les erreurs avant de valider
  420.             clearError();
  421.             let errors = [];
  422.             switch (step) {
  423.                 case 0:
  424.                     const email = document.getElementById("email").value.trim();
  425.                     const password = document.getElementById("password").value.trim();
  426.                     const hasUpperCase = /[A-Z]/.test(password);
  427.                     const hasNumber = /\d/.test(password); 
  428.                     const hasSpecialChar = /[!@#$%^&*()_\-+=\[\]{};:'"\\|,.<>?/`~_&^%]/.test(password);
  429.                     const hasMinLength = password.length >= 8;
  430. updateRequirement("requirement-uppercase", "bullet-uppercase", hasUpperCase);
  431. updateRequirement("requirement-special-number", "bullet-number", hasNumber);
  432. updateRequirement("requirement-special-char", "bullet-special-char", hasSpecialChar);
  433. updateRequirement("requirement-min-length", "bullet-min-length", hasMinLength);
  434.                     
  435.                     if (!email.trim()) {
  436.                     displayError("Veuillez saisir l'adresse e-mail.");
  437.                       } else if (!isValidEmail(email)) {
  438.                      displayError("Veuillez entrer une adresse e-mail valide.");
  439.                     }
  440.                     if (email && isValidEmail(email) && hasUpperCase && hasNumber && hasSpecialChar && hasMinLength) {
  441.                         userData.email = email;
  442.                         userData.password = password;
  443.                         currentStep = 1;
  444.                     } else {
  445.                         valid = false;
  446.                     }
  447.                     break;
  448.               case 1 :
  449.               let gerantCentre = {};
  450.                     let gerantMadame = document.getElementById("gerantMadame").checked;
  451.                     let gerantMonsieur = document.getElementById("gerantMonsieur").checked;
  452.                     if (gerantMadame) {
  453.                         gerantCentre.gerantCivility = "Madame";
  454.                     } else if (gerantMonsieur) {
  455.                         gerantCentre.gerantCivility = "Monsieur";
  456.                     } else {
  457.                         gerantCentre.gerantCivility = "Non spécifié";
  458.                     }
  459.                     if (!gerantMadame && !gerantMonsieur) {
  460.                     errors.push("Veuillez sélectionner la civilité.");
  461.                     //valid = false;
  462.                     //break;
  463.                     }
  464.                     let gerantFirstName = document.getElementById("gerant-first-name").value.trim();
  465.                     let gerantLastName = document.getElementById("gerant-last-name").value.trim();
  466.                     let gerantAdeliNumber = document.getElementById("gerant-adeli").value.trim();
  467.                     const phoneRegexGerant = /^[0-9]{10}$/;
  468.                     if (!gerantFirstName) {
  469.                     errors.push("Veuillez entrer votre prénom.");
  470.                     //valid = false;
  471.                     //break;
  472.                     } 
  473.                     if (!gerantLastName) {
  474.                     errors.push("Veuillez entrer votre nom.");
  475.                     //valid = false;
  476.                     //break;
  477.                     } 
  478.                     const adeliRegex = /^[0-9]{9,11}$/;
  479.                     if (!adeliRegex.test(gerantAdeliNumber)) {
  480.                      errors.push("Veuillez entrer un numéro Adeli / RPPS valide contenant entre 9 et 11 chiffres.");
  481.                     }
  482.                     if (errors.length > 0) {
  483.                        displayAllError(errors.join("<br>")); 
  484.                        valid = false;
  485.                         break;
  486.                     }              else{
  487.                    
  488.                     gerantCentre.gerantFirstName = gerantFirstName;
  489.                     gerantCentre.gerantLastName = gerantLastName;
  490.                     gerantCentre.gerantAdeliNumber = gerantAdeliNumber;
  491.                     userData.gerantCentre = gerantCentre;
  492.                     currentStep = 3;
  493.                     break;}
  494.               
  495.                 case 2:
  496.                     const firstName = document.getElementById("first-name").value;
  497.                     const lastName = document.getElementById("last-name").value;
  498.                     if (firstName && lastName) {
  499.                         userData.firstName = firstName;
  500.                         userData.lastName = lastName;
  501.                         currentStep = 3;
  502.                     } else {
  503.                         displayError("Veuillez remplir votre prénom et votre nom.");
  504.                         valid = false;
  505.                     }
  506.                     break;
  507.                 case 3:
  508.                     const companyName = document.getElementById("company-name").value;
  509.                     const siret = document.getElementById("company-siret").value;
  510.                     const finess = document.getElementById("company-finess").value;
  511.                     const siretValid = /^\d{14}$/.test(siret);
  512.                     const finessValid = /^\d{9}$/.test(finess);
  513.                     const codeParrain = document.getElementById("code-parrain").value;
  514.                     if (!companyName.trim()) {
  515.                     errors.push("Veuillez saisir le nom de votre société.");
  516.                     } if (!/^\d{14}$/.test(siret)) {
  517.                       errors.push("Veuillez entrer un SIRET valide (14 chiffres).");
  518.                     } if (!/^\d{9}$/.test(finess)) {
  519.                       errors.push("Veuillez entrer un numéro FINESS valide (9 chiffres).");
  520.                     } 
  521.                     
  522. if (codeParrain) {
  523.     $.ajax({
  524.         url: BASE_API + "api/check-referral-code",
  525.         type: "POST",
  526.         contentType: "application/json",
  527.         data: JSON.stringify({ code: codeParrain }),
  528.         success: function (response) {
  529.             if (!response.exists) {
  530.                 errors.push("Le code parrain est invalide.");
  531.             }
  532.             if (errors.length > 0) {
  533.                 displayAllError(errors.join("<br>")); 
  534.                 valid = false;
  535.                                     return;
  536.             }
  537.             valid = true;
  538.             currentStep = 3;
  539.                 userData.companyName = companyName;
  540.                 userData.siret = siret;
  541.                 userData.finess = finess;
  542.                 userData.codeParrain = codeParrain;
  543.                 switchForm(currentStep + 1);
  544.         },
  545.         error: function () {
  546.             errors.push("Erreur lors de la vérification du code parrain.");
  547.             displayAllError(errors);
  548.         }
  549.     });
  550.     // ⛔ Stop the normal flow — wait for AJAX result
  551.     return;
  552. }
  553.                     if (errors.length > 0) {
  554.                      displayAllError(errors.join("<br>")); 
  555.                      valid = false;
  556.      }               else {
  557.                       valid = true;
  558.                       userData.companyName = companyName;
  559.                       userData.siret = siret;
  560.                       userData.finess = finess;
  561.                       currentStep = 4;
  562.                      }
  563.                      
  564.                     break;
  565.                 case 4:
  566.                     const address = document.getElementById("company-address").value;
  567.                     const postCode = document.getElementById("company-post-code").value;
  568.                     const city = document.getElementById("company-city").value;
  569.                     if (!address.trim() || !postCode.trim() || !city.trim()) {
  570.                     displayError("Veuillez remplir tous les champs de l'adresse.");
  571.                     valid = false;
  572.                     break;
  573.                     }
  574.                     if (address && postCode && city) {
  575.                         userData.address = address;
  576.                         userData.postCode = postCode;
  577.                         userData.city = city;
  578.                         currentStep = 5;
  579.                     } 
  580.                     break;
  581.                 case 5:
  582.                     const centerName = document.getElementById("center-name").value;
  583.                     const centerWebsite = document.getElementById("center-website").value;
  584.                     if (!centerName.trim()) {
  585.                     displayError("Veuillez remplir le nom du centre");
  586.                     valid = false;
  587.                     break;
  588.                     }
  589.                     if (centerName) {
  590.                         userData.centerName = centerName;
  591.                         userData.centerWebsite = centerWebsite || "";
  592.                         currentStep = 6;
  593.                     } else {
  594.                         displayError("Veuillez remplir le nom du centre");
  595.                         valid = false;
  596.                     }
  597.                     break;
  598.                  case 6:
  599.                    const phoneRegex = /^(06|07)[0-9]{8}$/;
  600.                    const companyPhoneRegex = /^0[0-9]{9}$/;
  601.                    const companyPhone = document.getElementById("company-phone").value.trim();
  602.                    const cellphone = document.getElementById("cellphone").value.trim();
  603.                    const imageElement = document.getElementById("alert-image"); 
  604.                    
  605.                    if (!companyPhone) {
  606.                    errors.push("Veuillez saisir le numéro de téléphone du centre.");
  607.                    //valid = false;
  608.                    //break;
  609.                    }
  610.                    if (companyPhone.trim() !== "" && !companyPhoneRegex.test(companyPhone)) {
  611.                    errors.push("Le numéro de téléphone du centre doit contenir 10 chiffres et commencer par 0.");
  612.                    //valid = false;
  613.                    //break;
  614.                    }
  615.                    if (!cellphone) {
  616.                    errors.push("Veuillez saisir le numéro de téléphone portable.");
  617.                    //valid = false;
  618.                 //   break;
  619.                    }
  620.                    if (cellphone.trim() !== "" && !phoneRegex.test(cellphone)) {
  621.                    errors.push("Le numéro de téléphone portable doit contenir 10 chiffres et commencer par 06 ou 07");
  622.                    //valid = false;
  623.                   // break;
  624.                    }
  625.                    if (companyPhone && cellphone && companyPhone === cellphone) {
  626.                    errors.push("Le numéro de téléphone du centre et le numéro portable doivent être différents.");
  627.                    //valid = false;
  628.                    //break;
  629.                     }
  630.                    if (cellphone && !verifyPhone) {
  631.                    errors.push("Veuillez vérifier le numéro de téléphone portable.");
  632.                    //valid = false;
  633.                     imageElement.classList.add("image-jump");
  634.     setTimeout(() => {
  635.         imageElement.classList.remove("image-jump"); 
  636.     }, 500);
  637.                    //break;
  638.                    }
  639.                    
  640.                    if (errors.length > 0) {
  641.                      displayAllError(errors.join("<br>")); 
  642.                      valid = false;
  643.                      break;
  644.      }              else{
  645.                    
  646.                     valid = true;
  647.                     userData.companyPhone = companyPhone;
  648.                     userData.cellphone = cellphone;
  649.                     currentStep = 7;
  650.                     }
  651.                     let offerName = userData.type;
  652.                     if (offerName == "centre") {
  653.                         offerName = "Multi Centres";
  654.                     } else {
  655.                         offerName = "Multi Audios";
  656.                     }
  657.                     const requestData = {
  658.                         audio: [
  659.                             {
  660.                                 name: document.getElementById("company-name").value,
  661.                                 mail: userData.email
  662.                             }
  663.                         ],
  664.                         address: userData.address,
  665.                         quantity: tarifs?.quantity ?? 0,
  666.                         price: {
  667.                             finalPrice: tarifs.price,
  668.                             recurring: tarifs.recurring
  669.                         },
  670.                         plan: {
  671.                             planName: offerName
  672.                         }
  673.                     };
  674.                   /*price: {
  675.                  finalPrice: userData.price.finalPrice || userData.price,
  676.                  recurring: userData.price.recurring || "month"
  677.                  },*/
  678.                 function getSecretStripeToken(a) {
  679.                     $.ajax({
  680.                         url: BASE_API + 'relance/stripe',
  681.                         type: "POST",
  682.                         contentType: "application/json",
  683.                         dataType: "json",
  684.                         data: JSON.stringify(a),
  685.                         async: true,
  686.                         success: function (data) {
  687.                             //StripToken = data.stripeToken;
  688.                             initializeStripe(data.stripeToken, data.intentSecret);
  689.                             showPaymentForm(data.stripeToken, data.intentSecret);
  690.                             //sendCentre(data.stripeToken,data.intentSecret);
  691.                         }
  692.                     })
  693.                 }
  694.                     getSecretStripeToken(requestData);
  695.                     break;
  696.                 case 7:
  697.                     currentStep = 8;
  698.                     break;
  699.                 case 9:
  700.                     currentStep = 10;
  701.                     break;
  702.                 case 11:
  703.                     currentStep = 12;
  704.                     break;
  705.                 case 12:
  706.                     event.preventDefault();
  707.                     currentStep = 13;
  708.                     let metroData = [];
  709.                     let busData = [];
  710.                     let tramData = [];
  711.                     let rerData = [];
  712.                     let parkingPublicData = [];
  713.                     let parkingPriveData = [];
  714.                     let othersData = [];
  715.                     // Metro data
  716.                     let metroRows = document.querySelectorAll(".metrorow");
  717.                   
  718.            metroRows.forEach(row => {
  719.     let city = row.querySelector(".metro_text").value;
  720.     let line = row.querySelector(".lineMetro").value;
  721.     let stationSelect = row.querySelector(".nameMetro");
  722.     let stationId = null;
  723.     if (stationSelect && stationSelect.selectedIndex > 0) {
  724.         let selectedOption = stationSelect.options[stationSelect.selectedIndex];
  725.         stationId = selectedOption.getAttribute("data-id");
  726.     }
  727.     if (
  728.         city !== "Sélectionner la ville" &&
  729.         line !== "Sélectionner la ligne" &&
  730.         stationSelect.value !== "Sélectionner la station"
  731.     ) {
  732.         if (stationId) {
  733.             metroData.push(stationId);
  734.         }
  735.     }
  736. });
  737.                     // Bus data
  738.                     let busRows = document.querySelectorAll(".busrow input");
  739.                     busRows.forEach(input => {
  740.                         let busStop = input.value;
  741.                         if (busStop) {
  742.                             busData.push([busStop]);
  743.                         }
  744.                     });
  745.                     // Tram data
  746.                     let tramRows = document.querySelectorAll(".tramrow input");
  747.                     tramRows.forEach(input => {
  748.                         let tramStop = input.value;
  749.                         if (tramStop) {
  750.                             tramData.push([tramStop]);
  751.                         }
  752.                     });
  753.                     // RER data (assuming you have input fields for RER)
  754.                     let rerRows = document.querySelectorAll(".rerrow input");
  755.                     rerRows.forEach(input => {
  756.                         let rerStation = input.value;
  757.                         if (rerStation) {
  758.                             rerData.push([rerStation]);
  759.                         }
  760.                     });
  761.                     // Parking public data
  762.                     let parkingPublicRows = document.querySelectorAll(".parking_publicrow input");
  763.                     parkingPublicRows.forEach(input => {
  764.                         let parkingPublic = input.value;
  765.                         if (parkingPublic) {
  766.                             parkingPublicData.push([parkingPublic]);
  767.                         }
  768.                     });
  769.                     // Parking private data
  770.                     let parkingPriveRows = document.querySelectorAll(".parking_priverow input");
  771.                     parkingPriveRows.forEach(input => {
  772.                         let parkingPrive = input.value;
  773.                         if (parkingPrive) {
  774.                             parkingPriveData.push([parkingPrive]);
  775.                         }
  776.                     });
  777.                     // Other transport data (custom fields for any other transport types)
  778.                     let otherRows = document.querySelectorAll(".autrerow input");
  779.                     otherRows.forEach(input => {
  780.                         let otherTransport = input.value;
  781.                         if (otherTransport) {
  782.                             othersData.push([otherTransport]);
  783.                         }
  784.                     });
  785.                     let transports = {};
  786.                     // Add metro data
  787.                     if (metroData.length > 0) {
  788.                         transports.metro = metroData;
  789.                     }
  790.                     // Add bus data
  791.                     if (busData.length > 0) {
  792.                         transports.bus = busData;
  793.                     }
  794.                     // Add tram data
  795.                     if (tramData.length > 0) {
  796.                         transports.tram = tramData;
  797.                     }
  798.                     // Add RER data
  799.                     if (rerData.length > 0) {
  800.                         transports.rer = rerData;
  801.                     }
  802.                     // Add public parking data
  803.                     if (parkingPublicData.length > 0) {
  804.                         transports.parkingPublic = parkingPublicData;
  805.                     }
  806.                     // Add private parking data
  807.                     if (parkingPriveData.length > 0) {
  808.                         transports.parkingPrive = parkingPriveData;
  809.                     }
  810.                     // Add other transport data
  811.                     if (othersData.length > 0) {
  812.                         transports.other = othersData;
  813.                     }
  814.                     // Check if any transport data exists, then assign to userData
  815.                     if (Object.keys(transports).length > 0) {
  816.                         userData.transports = transports;
  817.                     } else {
  818.                         delete userData.transports;
  819.                     }
  820.                     break;
  821.                 case 13:
  822.                     currentStep = 15;
  823.                     let prestacharge = [];
  824.                     const checkboxValues = [
  825.                         "1",
  826.                         "2",
  827.                         "3",
  828.                         "4"
  829.                     ];
  830.                     for (let i = 1; i <= 4; i++) {
  831.                         let checkbox = document.getElementById(`form13Option${i}`);
  832.                         if (checkbox.checked) {
  833.                             prestacharge.push(checkboxValues[i - 1]);
  834.                         }
  835.                     }
  836.                     userData.prestacharge = prestacharge;
  837.                     break;
  838.                 case 14:
  839.                     /*let gerantCentre = {};
  840.                     let gerantMadame = document.getElementById("gerantMadame").checked;
  841.                     let gerantMonsieur = document.getElementById("gerantMonsieur").checked;
  842.                     if (gerantMadame) {
  843.                         gerantCentre.gerantCivility = "Madame";
  844.                     } else if (gerantMonsieur) {
  845.                         gerantCentre.gerantCivility = "Monsieur";
  846.                     } else {
  847.                         gerantCentre.gerantCivility = "Non spécifié";
  848.                     }
  849.                     if (!gerantMadame && !gerantMonsieur) {
  850.                     errors.push("Veuillez sélectionner la civilité.");
  851.                     //valid = false;
  852.                     //break;
  853.                     }
  854.                     let gerantFirstName = document.getElementById("gerant-first-name").value.trim();
  855.                     let gerantLastName = document.getElementById("gerant-last-name").value.trim();
  856.                     let gerantAdeliNumber = document.getElementById("gerant-adeli").value.trim();
  857.                     const phoneRegexGerant = /^[0-9]{10}$/;
  858.                     if (!gerantFirstName) {
  859.                     errors.push("Veuillez entrer votre prénom.");
  860.                     //valid = false;
  861.                     //break;
  862.                     } 
  863.                     if (!gerantLastName) {
  864.                     errors.push("Veuillez entrer votre nom.");
  865.                     //valid = false;
  866.                     //break;
  867.                     } 
  868.                     const adeliRegex = /^[0-9]{9}$/;
  869.                     if (!adeliRegex.test(gerantAdeliNumber)) {
  870.                         errors.push("Veuillez entrer un numéro Adeli valide à 9 chiffres.");
  871.                         //valid = false;
  872.                         //break;
  873.                     }
  874.                     if (errors.length > 0) {
  875.                        displayAllError(errors.join("<br>")); 
  876.                        valid = false;
  877.                         break;
  878.                     }              else{
  879.                    
  880.                     gerantCentre.gerantFirstName = gerantFirstName;
  881.                     gerantCentre.gerantLastName = gerantLastName;
  882.                     gerantCentre.gerantAdeliNumber = gerantAdeliNumber;
  883.                     userData.gerantCentre = gerantCentre;*/
  884.                     currentStep = 15;
  885.                     break;
  886.                 case 15:
  887.                     currentStep = 16;
  888.                     let profileImage = document.getElementById('gerantProfile').src;
  889.                     if (profileImage && profileImage !== '/assets/img/pro/loadImage.png') {
  890.                         imagesData.profileImage = profileImage;
  891.                     }
  892.                     let cityInput = document.getElementById("company-city").value.trim();
  893.                     let postalInput = document.getElementById("company-post-code").value.trim();
  894.                     let lastnameInput = document.getElementById("gerant-last-name").value.trim();
  895.                     let firstnameInput = document.getElementById("gerant-first-name").value.trim();
  896.                     let gerantMadameCheck = document.getElementById("gerantMadame").checked;
  897.                     let gerantMonsieurCheck = document.getElementById("gerantMonsieur").checked;
  898.                     let civiliteInput = gerantMadameCheck ? "elle" : (gerantMonsieurCheck ? "il" : ""); 
  899.                     let description = `Dans le centre auditif de ${cityInput} (${postalInput}), ${firstnameInput} excelle en tant qu'audioprothésiste, offrant une expertise inégalée dans les tests auditifs et l'adaptation d'appareils auditifs, y compris les modèles rechargeables et les solutions intra-auriculaires invisibles.\nGrâce à une approche personnalisée, ${civiliteInput} assure des diagnostics précis via des tests auditifs tonales et vocales.\nLe centre propose des appareillages auditifs sur-mesure et s'engage à guider ses patients dans le choix de leur appareil, en tenant compte de la nature de leur perte auditive, de leurs besoins spécifiques, de leur budget, ainsi que des options de prise en charge par la sécurité sociale et les mutuelles.\nPar ailleurs, depuis le 1er janvier 2021, la réforme 100% santé de l'État garantit que tous peuvent bénéficier d'un appareillage auditif sans frais, 0€ de reste à charge, offrant une correction auditive de qualité sans impact financier pour le patient.\n${firstnameInput}, audioprothésiste diplômé exerce à ${cityInput} et s'engage à naviguer avec vous à travers ces options, assurant un choix éclairé pour une expérience auditive optimale`;
  900.                      document.getElementById("about").value = description;
  901.                     userData.description = description;
  902.                     break;
  903.                 case 16:
  904.                     currentStep = 17;
  905.                     const cityInputCenter = document.getElementById("company-city").value.trim();
  906.                     const postalInputCenter = document.getElementById("company-post-code").value.trim();
  907.                     const lastnameInputCenter = document.getElementById("gerant-last-name").value.trim();
  908.                     const centerNameInput = document.getElementById("center-name").value.trim();
  909.                     let aboutCentre = `Situé à ${cityInputCenter} (${postalInputCenter}), le centre ${centerNameInput} excelle dans le domaine de l'audition, offrant une expertise d'audioprothésiste inégalée.\nNos tests auditifs de pointe permettent de diagnostiquer avec précision vos besoins auditifs, pour vous fournir des solutions sur mesure.\nNous proposons une sélection variée d'appareils auditifs modernes, conçus pour s'adapter parfaitement à votre quotidien et améliorer considérablement votre expérience auditive.\nPour le centre ${centerNameInput} à ${cityInputCenter}, la satisfaction de nos patients malentendants est notre priorité, grâce à un suivi pour votre acuité auditive d’un professionnalisme hors pair, qui assure une adaptation optimale et un confort d'écoute durable.\nNotre engagement est de vous reconnecter aux sons de la vie avec excellence et précision.\nL’audition n’est pas un luxe mais une nécessité.`;
  910.                     document.getElementById("aboutCentre").value = aboutCentre;
  911.                     userData.aboutCentre = aboutCentre;
  912.                     break;
  913.                 case 17:
  914.                     currentStep = 18;
  915.                     break;
  916.                 case 18:
  917.                     currentStep = 19;
  918.                     const facadeImage = document.getElementById('gerantProfileFacade').src;
  919.                     if (facadeImage && facadeImage !== '/assets/img/pro/facade-centre.png') {
  920.                         imagesData.facadeImage = facadeImage;
  921.                     }
  922.                     const interieurImage = document.getElementById('gerantProfileInterieur').src;
  923.                     if (interieurImage && interieurImage !== '/assets/img/pro/interieur-centre.png') {
  924.                         imagesData.interieurImage = interieurImage;
  925.                     }
  926.                     const diplomeImage = document.getElementById('gerantProfileDiplome').src;
  927.                     if (diplomeImage && diplomeImage !== '/assets/img/pro/diplome.png') {
  928.                         imagesData.diplomeImage = diplomeImage;
  929.                     }
  930.                     break;
  931.                 case 19:
  932.                     currentStep = 20;
  933.                     let selectedOptions = [];
  934.                     if (document.getElementById("form19Option1").checked) selectedOptions.push("1");
  935.                     if (document.getElementById("form19Option2").checked) selectedOptions.push("2");
  936.                     if (document.getElementById("form19Option3").checked) selectedOptions.push("3");
  937.                     if (document.getElementById("form19Option4").checked) selectedOptions.push("4");
  938.                     if (document.getElementById("form19Option5").checked) selectedOptions.push("5");
  939.                     if (document.getElementById("form19Option6").checked) selectedOptions.push("6");
  940.                     if (document.getElementById("form19Option7").checked) selectedOptions.push("7");
  941.                     if (document.getElementById("form19Option8").checked) selectedOptions.push("8");
  942.                     if (document.getElementById("form19Option9").checked) selectedOptions.push("9");
  943.                     if (document.getElementById("form19Option10").checked) selectedOptions.push("10");
  944.                     userData.specialites = selectedOptions;
  945.                     break;
  946.                 case 20:
  947.                     currentStep = 21;
  948.                     const diplomaDetails = [];
  949.                     userData.diplomaDetails = [];
  950.                 document.querySelectorAll('input[type="checkbox"][data-diploma="true"]').forEach(checkbox => {
  951.     if (checkbox.checked) {
  952.         const idMatch = checkbox.id.match(/\d+$/);
  953.         if (idMatch) {
  954.             diplomaDetails.push({ id: idMatch[0], url: "", year: "" });
  955.         }
  956.     }
  957. });
  958.                     /*const diplomaDetails = [];
  959.                     const form20Options = [
  960.                         {id: "form20Option1", label: "Diplôme d'État audioprothésiste"},
  961.                         {id: "form20Option2", label: "DU Audiophonologie"},
  962.                         {id: "form20Option3", label: "DU implant cochléaire"},
  963.                         {id: "form20Option4", label: "DU Nuisances Sonores"},
  964.                         {id: "form20Option5", label: "Autres"}
  965.                     ];
  966.                     form20Options.forEach(option => {
  967.                         const checkbox = document.getElementById(option.id);
  968.                         if (checkbox && checkbox.checked) {
  969.                             diplomaDetails.push(option.label);
  970.                         }
  971.                     });*/
  972.                     if (diplomaDetails.length === 0) {
  973.                         displayError("Veuillez sélectionner au moins un diplôme.");
  974.                         break;
  975.                     }
  976.                     userData.diplomaDetails = diplomaDetails;
  977.                     break;
  978.                 default:
  979.                     break;
  980.             }
  981.             if (valid) {
  982.                 switchForm(currentStep);
  983.             }
  984.         }
  985.         async function convertJsonData(userData) {
  986.             let adresse = userData.address + " " + userData.postCode + " " + userData.city;
  987.             coord = await getCoordonnee(adresse);
  988.             const convertedJson = {
  989.                 audioId: userData.audioId,
  990.                 centerId: userData.centerId,
  991.                 name: userData.centerName,
  992.                 imgUrl: userData.profileImage,
  993.                 isHandicap: false,
  994.                 isRdvDomicile: false,
  995.                 latitude: coord[0],
  996.                 longitude: coord[1],
  997.                 finess: userData.finess,
  998.                 codeParrain: userData.codeParrain,
  999.                 finessURL: "",
  1000.                 website: userData.centerWebsite || "",
  1001.                 siret: userData.siret,
  1002.                 companyName: userData.companyName,
  1003.                 postal: userData.postCode,
  1004.                 phone: userData.companyPhone,
  1005.                 city: userData.city,
  1006.                 address: userData.address,
  1007.                 prestation: userData.prestacharge,
  1008.                 tier: [],
  1009.                 mutuelle: [],
  1010.                 otherMutuelle: [],
  1011.                 otherSpetiality: [],
  1012.                 access: [],
  1013.             };
  1014.             if (userData.transports && typeof userData.transports === "object") {
  1015.                 Object.keys(userData.transports).forEach(key => {
  1016.                     const transportData = userData.transports[key];
  1017.                     if (Array.isArray(transportData) && transportData.length > 0) {
  1018.                         convertedJson.access.push({
  1019.                             [key]: transportData.flat()
  1020.                         });
  1021.                     }
  1022.                 });
  1023.             }
  1024.             if (tarifs.type == "centre") {
  1025.                 tarifs.plan = "Multi-Centres";
  1026.             } else {
  1027.                 tarifs.plan = "Multi-Audios";
  1028.             }
  1029.             if (tarifs.recurring == "annual") {
  1030.                 tarifs.recurring = "year";
  1031.             }
  1032.             convertedJson.audio = [
  1033.                 {
  1034.                     adeli: userData.gerantCentre?.gerantAdeliNumber || "",
  1035.                     civilite: userData.gerantCentre?.gerantCivility || "",
  1036.                     lastname: userData.gerantCentre?.gerantLastName || "",
  1037.                     name: userData.gerantCentre?.gerantFirstName || "",
  1038.                     mail: userData.email,
  1039.                     password: userData.password,
  1040.                     phone: userData.cellphone,
  1041.                     pin: 0,
  1042.                     birthdate: "12/12/2000",
  1043.                     role: "1",
  1044.                     registredAudio: "",
  1045.                     imgUrl: userData.images?.diplomeImage || "",
  1046.                     diplome: userData.diplomaDetails ? userData.diplomaDetails : [],
  1047.                     specialite: userData.specialites,
  1048.                     experiences: []
  1049.                 }
  1050.             ];
  1051.             convertedJson.descriptionAudio = userData.description;
  1052.             convertedJson.descriptionCentre = userData.aboutCentre;
  1053.             convertedJson.uploadedFiles = userData.uploadedFiles;
  1054.             convertedJson.gerant = "";
  1055.             convertedJson.isImported = "";
  1056.             convertedJson.nbaudio = 1;
  1057.             convertedJson.price = {
  1058.                 finalPrice: finalPriceSub,
  1059.                 recurring: tarifs.recurring
  1060.             };
  1061.             convertedJson.quantity = `${tarifs.quantity}`;
  1062.             convertedJson.plan = {
  1063.                 planName: tarifs.plan
  1064.             };
  1065.             convertedJson.paymentMethodId = userData.paymentMethod;
  1066.             return convertedJson;
  1067.         }
  1068.         function goToPreviousForm() {
  1069.             if (currentStep > 0 && currentStep !== 3) {
  1070.                 currentStep--;
  1071.                 switchForm(currentStep);
  1072.             } else if (currentStep === 3) {
  1073.                 currentStep = 1;
  1074.                 switchForm(currentStep);
  1075.             }
  1076.         }
  1077.         function updateRequirement(requirementId, bulletId, isValid) {
  1078.             const $requirementElement = $("#" + requirementId);
  1079.             const $bulletElement = $("#" + bulletId);
  1080.             if (isValid) {
  1081.                 $requirementElement.removeClass("invalid").find('span').addClass('circle-green').removeClass('circle-grey').removeClass('circle-red');
  1082.             } else {
  1083.                 $requirementElement.addClass("invalid").find('span').addClass('circle-red').removeClass('circle-grey').removeClass('circle-green');
  1084.             }
  1085.         }
  1086.         switchForm(currentStep);
  1087.         document.addEventListener('DOMContentLoaded', function () {
  1088.             setupCardInputs();
  1089.         });
  1090.     </script>
  1091. {% endblock %}
  1092. {% block content %}
  1093.     <header>
  1094.         <div class="progress-steps">
  1095.             <div class="progress"></div>
  1096.         </div>
  1097.         <div class="logo">
  1098.             <img src="/assets/img/pro/logo-myaudio.png" alt="Logo">
  1099.         </div>
  1100.         <div class="container-retour">
  1101.             <a id="previousPage" href="/pronew">Retour</a>
  1102.         </div>
  1103.     </header>
  1104.     <main class="inscription-page">
  1105.         <h1 id="formTitle">Créez votre compte</h1>
  1106.         <p id="subtitle" style="display: none;" class="text-grey"></p>
  1107.  <!--<form id="form16" class="signup-form" style="display: bloc;">
  1108.             <div class="d-flex flex-column">
  1109.                 <label for="about">À propos de vous</label>
  1110.                 <textarea class="about" id="about" rows="3" style="border: 2px solid #03866A; resize: none;"></textarea>
  1111.             </div>
  1112.             <button type="button"
  1113.                     class="create-account-button"
  1114.                     onclick="validateForm(16, event)">
  1115.                 Suivant >
  1116.             </button>
  1117.         </form>
  1118.      !-->   
  1119.         <!-- Formulaire 1 -->
  1120.         <form id="form0" class="signup-form" style="display: bloc;">
  1121.             <label for="email">Votre adresse email *</label>
  1122.             <input type="email" id="email" name="email" required>
  1123.             <label for="password">Mot de passe *</label>
  1124.             <input type="password" id="password" name="password" required>
  1125.             <div class="password-requirements">
  1126.                 <p>Votre mot de passe doit contenir au moins :</p>
  1127.                 <ul>
  1128.                   <li id="requirement-uppercase" class="requirement">
  1129.     <span id="bullet-uppercase" class="circle-grey">
  1130.         <svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" fill="currentColor"
  1131.              class="bi bi-circle-fill" viewBox="0 0 16 16">
  1132.             <circle cx="8" cy="8" r="8"/>
  1133.         </svg>
  1134.     </span>
  1135.     1 lettre majuscule
  1136. </li>
  1137. <li id="requirement-special-number" class="requirement">
  1138.     <span id="bullet-number" class="circle-grey">
  1139.         <svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" fill="currentColor"
  1140.              class="bi bi-circle-fill" viewBox="0 0 16 16">
  1141.             <circle cx="8" cy="8" r="8"/>
  1142.         </svg>
  1143.     </span>
  1144.     1 chiffre
  1145. </li>
  1146. <li id="requirement-special-char" class="requirement">
  1147.     <span id="bullet-special-char" class="circle-grey">
  1148.         <svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" fill="currentColor"
  1149.              class="bi bi-circle-fill" viewBox="0 0 16 16">
  1150.             <circle cx="8" cy="8" r="8"/>
  1151.         </svg>
  1152.     </span>
  1153.     1 caractère spécial (exemple : # ? ! &)
  1154. </li>
  1155. <li id="requirement-min-length" class="requirement">
  1156.     <span id="bullet-min-length" class="circle-grey">
  1157.         <svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" fill="currentColor"
  1158.              class="bi bi-circle-fill" viewBox="0 0 16 16">
  1159.             <circle cx="8" cy="8" r="8"/>
  1160.         </svg>
  1161.     </span>
  1162.     8 caractères
  1163. </li>
  1164.                 </ul>
  1165.             </div>
  1166.             <button type="button" class="create-account-button" onclick="validateForm(0, event)">Créez un compte
  1167.             </button>
  1168.             <p class="text-grey">
  1169.                 Ces identifiants vous permettront de vous connecter à la plateforme My Audio
  1170.             </p>
  1171.             <p class="terms-text">
  1172.                 En créant un compte, vous acceptez
  1173.                 <a target="_blank" href="/pro/politique-de-confidentialite" class="terms-link">les Conditions de Service
  1174.                     Client de
  1175.                     MyAudio.</a>
  1176.             </p>
  1177.         </form>
  1178.  <!-- Formulaire 14 -->
  1179.         <form id="form1" class="signup-form" style="display: none;">
  1180.             <div class="d-flex align-items-center gap-5 mb-4">
  1181.                 <div class="d-flex align-items-center gap-2">
  1182.                     <input type="checkbox" id="gerantMadame" name="gerantMadame" value="gerantMadame"
  1183.                            style="display:none" onclick="toggleCheckbox('gerantMadame', 'gerantMonsieur')">
  1184.                     <label class="fakeLabel" for="gerantMadame"></label>
  1185.                     <label for="gerantMadame">Madame</label>
  1186.                 </div>
  1187.                 <div class="d-flex align-items-center gap-2">
  1188.                     <input type="checkbox" id="gerantMonsieur" name="gerantMonsieur" value="gerantMonsieur"
  1189.                            style="display:none" onclick="toggleCheckbox('gerantMonsieur', 'gerantMadame')">
  1190.                     <label class="fakeLabel" for="gerantMonsieur"></label>
  1191.                     <label for="gerantMonsieur">Monsieur</label>
  1192.                 </div>
  1193.             </div>
  1194.             <label for="gerant-first-name">Prénom *</label>
  1195.             <input type="text" id="gerant-first-name" name="gerant-first-name" required>
  1196.             <label for="gerant-last-name">Nom *</label>
  1197.             <input type="text" id="gerant-last-name" name="gerant-last-name" required>
  1198.             <label for="gerant-adeli">Numéro Adeli / RPPS *</label>
  1199.             <input type="text" id="gerant-adeli" name="gerant-adeli" required>
  1200.             <button type="button"
  1201.                     class="create-account-button"
  1202.                     onclick="validateForm(1, event)">
  1203.                 Suivant >
  1204.             </button>
  1205.         </form>
  1206.         <!-- Formulaire 2 -->
  1207.         <form id="form2" class="signup-form" style="display: none;">
  1208.             <label for="first-name">Prénom *</label>
  1209.             <input type="text" id="first-name" name="first-name" required>
  1210.             <label for="last-name">Nom *</label>
  1211.             <input type="text" id="last-name" name="last-name" required>
  1212.             <button type="button" class="create-account-button" onclick="validateForm(2, event)">Suivant ></button>
  1213.         </form>
  1214.         <!-- Formulaire 3 -->
  1215.         <form id="form3" class="signup-form" style="display: none;">
  1216.             <label for="company-name">Nom de votre société *</label>
  1217.             <input type="text" id="company-name" name="company-name" required>
  1218.             <label for="company-siret">Numéro SIRET * (14 chiffres)</label>
  1219.             <input type="text" id="company-siret" name="company-siret" required>
  1220.             <label for="company-finess">Numéro finess * (9 chiffres)</label>
  1221.             <input type="text" id="company-finess" name="company-finess" required>
  1222.            
  1223.             <label for="code-parrain">Code parrain</label>
  1224.             <input type="text" id="code-parrain" name="code-parrain">
  1225.             <button type="button" class="create-account-button" onclick="validateForm(3, event)">Suivant ></button>
  1226.         </form>
  1227.         <!-- Formulaire 4 -->
  1228.         <form id="form4" class="signup-form" style="display: none;">
  1229.             <label for="company-address">Adresse *</label>
  1230.             <input type="text" id="company-address" name="company-address" required>
  1231.             <label for="company-post-code">Code Postal *</label>
  1232.             <input type="text" id="company-post-code" name="company-post-code" required>
  1233.             <label for="company-city">Ville *</label>
  1234.             <input class="uppercaseField" type="text" id="company-city" name="company-city" required>
  1235.             <button type="button" class="create-account-button" onclick="validateForm(4, event)">Suivant ></button>
  1236.         </form>
  1237.         <!-- Formulaire 5 -->
  1238.         <form id="form5" class="signup-form" style="display: none;">
  1239.             <label for="center-name">Nom du centre *</label>
  1240.             <input class="uppercaseField" type="text" id="center-name" name="center-name" required>
  1241.             <label for="center-website">Site internet du centre</label>
  1242.             <input type="text" id="center-website" name="center-website">
  1243.             <button type="button" class="create-account-button" onclick="validateForm(5, event)">Suivant ></button>
  1244.         </form>
  1245.         <!-- Formulaire 6 -->
  1246.         <form id="form6" class="signup-form" style="display: none;">
  1247.             <label for="company-phone">Numéro du centre *</label>
  1248.             <input type="text" id="company-phone" name="company-phone" required>
  1249.             <label for="cellphone">Numéro portable *</label>
  1250.             <div class="d-flex gap-3 align-items-center">
  1251.                 <input type="text" id="cellphone" name="cellphone" required>
  1252.                 <button type="button" id="alert-image"
  1253.                         class="verify-phone-button"
  1254.                         onclick="verifyPhoneNumber(event, 'cellphone')">
  1255.                     <img src="/assets/img/pro/checkPhone.svg" alt="check phone" style="border: none;"/>
  1256.                 </button>
  1257.             </div>
  1258.             <button type="button" class="create-account-button" onclick="validateForm(6, event)">Suivant ></button>
  1259.         </form>
  1260.         <div id="success-sms-validate" style="display:none">Votre numéro a été vérifié.</div>
  1261.         <!-- Formulaire 7  -->
  1262.         <form id="form7" class="signup-form payment-form" style="display: none;">
  1263.             <div class="payment-subtitle">Valider votre paiement</div>
  1264.            
  1265.             <div class="price" id="pricePayment"></div>
  1266.             <!-- Conteneur pour Stripe Elements -->
  1267.             <div id="card-element" class="card-input-wrapper"></div>
  1268.             <div id="card-errors" role="alert" class="error-message"></div>
  1269.             <button type="button"
  1270.                     class="create-account-button">
  1271.                 Valider >
  1272.             </button>
  1273.         </form>
  1274.         <!-- Formulaire 8  -->
  1275.         <form id="form8" class="signup-form" style="display: none;">
  1276.         </form>
  1277.         <!-- Formulaire 9  -->
  1278.         <form id="form9" class="signup-form calendar-google-rdv" style="display: none;">
  1279.             <div class="conainer-text">
  1280.                 <p>La session d'onboarding avec My Audio comprendra plusieurs étapes pour vous aider à bien démarrer
  1281.                     avec la plateforme et à optimiser son utilisation au quotidien.</p>
  1282.             </div>
  1283.             <div class="calendar-google">
  1284.                 <iframe src="https://calendar.app.google/BypwzPtYitYda6U97"
  1285.                         style="border: 0; width: 100%; height: 600px;" frameborder="0"></iframe>
  1286.             </div>
  1287.             <div class="container-button-bottom">
  1288.                 <button type="button"
  1289.                         class="create-account-button"
  1290.                         onclick="validateForm(9, event)" style="width: 15%">
  1291.                     Valider >
  1292.                 </button>
  1293.             </div>
  1294.         </form>
  1295.         <!-- Formulaire 10  -->
  1296.         <form id="form10" class="signup-form" style="display: none;">
  1297.         </form>
  1298.         <!-- Formulaire 11  -->
  1299.         <form id="form11" class="signup-form" style="display: none;">
  1300.             <div class="container-button">
  1301.                 <button type="button"
  1302.                         class="create-account-button btn-choice"
  1303.                         onclick="validateForm(11, event)">
  1304.                     Oui, je souhaite créer mon profil My Audio
  1305.                 </button>
  1306.                <button type="button"
  1307.                class="create-account-button btn-choice"
  1308.                onclick="window.open('{{ app.request.server.get('BASE_logiciel') }}login', '_blank');"
  1309.                style="font-weight: 200;">
  1310.                  Non, j'ai un patient qui m'attend !
  1311.                  </button>
  1312.             </div>
  1313.         </form>
  1314.         <!-- Formulaire 12  -->
  1315.         <form id="form12" class="signup-form" style="display: none; max-width: unset;">
  1316.             <div class="form-container">
  1317.                 <!-- Metro -->
  1318.                 <div class="form-group">
  1319.                     <div class="checkbox-wrapper">
  1320.                         <input type="checkbox" id="metro" name="metre" value="metre" style="display:none"
  1321.                                onchange="checkAccesCenter('metro', 'metro_text','lineMetro','nameMetro');">
  1322.                         <label class="fakeLabel " for="metro">
  1323.                         </label>
  1324.                         <label for="metro">Metro</label>
  1325.                     </div>
  1326.                     <div class="input-group metroappend">
  1327.                     </div>
  1328.                     <div class="container-button-transports">
  1329.                         <button type="button" class="btn btn-add metroMore" style="display:none">+</button>
  1330.                     </div>
  1331.                 </div>
  1332.                 <!-- Bus -->
  1333.                 <div class="form-group">
  1334.                     <div class="checkbox-wrapper">
  1335.                         <input type="checkbox" id="bus" name="bus" value="bus" style="display:none"
  1336.                                onchange="checkAcces('bus', 'bus_text');">
  1337.                         <label class="fakeLabel " for="bus"></label>
  1338.                         <label for="bus">Bus</label>
  1339.                     </div>
  1340.                     <div class="input-group busappend">
  1341.                     </div>
  1342.                     <div class="container-button-transports">
  1343.                         <button type="button" class="btn btn-add busMore" style="display:none">+</button>
  1344.                     </div>
  1345.                 </div>
  1346.                 <!-- Tram -->
  1347.                 <div class="form-group">
  1348.                     <div class="checkbox-wrapper">
  1349.                         <input type="checkbox" id="tram" name="tram" value="tram" style="display:none"
  1350.                                onchange="checkAcces('tram', 'tram_text');">
  1351.                         <label class="fakeLabel " for="tram"></label>
  1352.                         <label for="tram">Tram</label>
  1353.                     </div>
  1354.                     <div class="input-group tramappend">
  1355.                     </div>
  1356.                     <div class="container-button-transports">
  1357.                         <button type="button" class="btn btn-add tramMore" style="display:none">+</button>
  1358.                     </div>
  1359.                 </div>
  1360.                 <!-- RER -->
  1361.                 <div class="form-group">
  1362.                     <div class="checkbox-wrapper">
  1363.                         <input type="checkbox" id="rer" name="rer" value="rer" style="display:none"
  1364.                                onchange="checkAcces('rer', 'rer_text');">
  1365.                         <label class="fakeLabel " for="rer"></label>
  1366.                         <label for="rer">RER</label>
  1367.                     </div>
  1368.                     <div class="input-group rerappend">
  1369.                     </div>
  1370.                     <div class="container-button-transports">
  1371.                         <button type="button" class="btn btn-add rerMore" style="display:none">+</button>
  1372.                     </div>
  1373.                 </div>
  1374.                 <!-- Parking Public -->
  1375.                 <div class="form-group">
  1376.                     <div class="checkbox-wrapper">
  1377.                         <input type="checkbox" id="parking_public" name="parking_public" value="parking_public"
  1378.                                style="display:none" onchange="checkAcces('parking_public', 'pp_text');">
  1379.                         <label class="fakeLabel " for="parking_public"></label>
  1380.                         <label for="parking_public">Parking public</label>
  1381.                     </div>
  1382.                     <div class="input-group parking_publicappend">
  1383.                     </div>
  1384.                     <div class="container-button-transports">
  1385.                         <button type="button" class="btn btn-add parking_publicMore" style="display:none">+</button>
  1386.                     </div>
  1387.                 </div>
  1388.                 <!-- Parking Privé -->
  1389.                 <div class="form-group">
  1390.                     <div class="checkbox-wrapper">
  1391.                         <input type="checkbox" id="parking_prive" name="parking_prive" value="parking_prive"
  1392.                                style="display:none" onchange="checkAcces('parking_prive', 'ppr_text');">
  1393.                         <label class="fakeLabel " for="parking_prive"></label>
  1394.                         <label for="parking_prive">Parking privé</label>
  1395.                     </div>
  1396.                     <div class="input-group parking_priveappend">
  1397.                     </div>
  1398.                     <div class="container-button-transports">
  1399.                         <button type="button" class="btn btn-add parking_priveMore" style="display:none">+</button>
  1400.                     </div>
  1401.                 </div>
  1402.                 <!-- Autre -->
  1403.                 <div class="form-group">
  1404.                     <div class="checkbox-wrapper">
  1405.                         <input type="checkbox" id="autre" name="autre" value="autre" style="display:none"
  1406.                                onchange="checkAcces('autre', 'autre_text');">
  1407.                         <label class="fakeLabel" for="autre"></label>
  1408.                         <label for="autre">Autre</label>
  1409.                     </div>
  1410.                     <div class="input-group autreappend">
  1411.                     </div>
  1412.                     <div class="container-button-transports">
  1413.                         <button type="button" class="btn btn-add autreMore" style="display:none">+</button>
  1414.                     </div>
  1415.                 </div>
  1416.                 <button type="button"
  1417.                         class="create-account-button"
  1418.                         onclick="validateForm(12, event)">
  1419.                     Suivant >
  1420.                 </button>
  1421.             </div>
  1422.         </form>
  1423.         <!-- Formulaire 13  -->
  1424.         <form id="form13" class="signup-form" style="display: none;">
  1425.             <div class="container-checkbox">
  1426.                 <div>
  1427.                     <input type="checkbox" id="form13Option1" name="form13Option1" value="form13Option1"
  1428.                            style="display:none">
  1429.                     <label class="fakeLabel" for="form13Option1"></label>
  1430.                     <label for="form13Option1">Offre 100% Santé – Reste à charge 0 €</label>
  1431.                 </div>
  1432.                 <div>
  1433.                     <input type="checkbox" id="form13Option2" name="form13Option2" value="form13Option2"
  1434.                            style="display:none">
  1435.                     <label class="fakeLabel" for="form13Option2"></label>
  1436.                     <label for="form13Option2">Carte vitale acceptée</label>
  1437.                 </div>
  1438.                 <div>
  1439.                     <input type="checkbox" id="form13Option3" name="form13Option3" value="form13Option3"
  1440.                            style="display:none">
  1441.                     <label class="fakeLabel" for="form13Option3"></label>
  1442.                     <label for="form13Option3">Tiers-payant Sécurité sociale</label>
  1443.                 </div>
  1444.                 <div>
  1445.                     <input type="checkbox" id="form13Option4" name="form13Option4" value="form13Option4"
  1446.                            style="display:none">
  1447.                     <label class="fakeLabel" for="form13Option4"></label>
  1448.                     <label for="form13Option4">Tiers-payant mutuelle</label>
  1449.                 </div>
  1450.             </div>
  1451.             <button type="button"
  1452.                     class="create-account-button"
  1453.                     onclick="validateForm(13, event)">
  1454.                 Suivant >
  1455.             </button>
  1456.         </form>
  1457.         <!-- Formulaire 14 -->
  1458.         <form id="form14" class="signup-form" style="display: none;">
  1459.           
  1460.         </form>
  1461.         <!-- Formulaire 15 -->
  1462.         <form id="form15" class="signup-form" style="display: none;">
  1463.             <div class="d-flex justify-content-center">
  1464.                 <img src="/assets/img/pro/loadImage.png"
  1465.                      style="cursor: pointer; max-width: 200px; max-height: 200px; object-fit: cover;"
  1466.                      alt="Profile Image"
  1467.                      class="profile-image"
  1468.                      id="gerantProfile"
  1469.                      onclick="document.getElementById('image-input').click()">
  1470.                 <input type="file" id="image-input" accept="image/*" onchange="previewImage(event,'gerantProfile')"
  1471.                        style="display: none;">
  1472.             </div>
  1473.             <button type="button"
  1474.                     class="create-account-button"
  1475.                     onclick="validateForm(15, event)">
  1476.                 Suivant >
  1477.             </button>
  1478.         </form>
  1479.         <!-- Formulaire 16  -->
  1480.         <form id="form16" class="signup-form" style="display: none;">
  1481.             <div class="d-flex flex-column">
  1482.                 <label for="about">À propos de vous</label>
  1483.                 <textarea class="about" id="about" rows="3" style="border: 2px solid #03866A; resize: none;"></textarea>
  1484.             </div>
  1485.             <button type="button"
  1486.                     class="create-account-button"
  1487.                     onclick="validateForm(16, event)">
  1488.                 Suivant >
  1489.             </button>
  1490.         </form>
  1491.         <!-- Formulaire 17  -->
  1492.         <form id="form17" class="signup-form" style="display: none;">
  1493.             <div class="d-flex flex-column">
  1494.                 <label for="aboutCentre">À propos de votre centre</label>
  1495.                 <textarea class="aboutCentre" id="aboutCentre" rows="3"
  1496.                           style="border: 2px solid #03866A; resize: none;"></textarea>
  1497.             </div>
  1498.             <button type="button"
  1499.                     class="create-account-button"
  1500.                     onclick="validateForm(17, event)">
  1501.                 Suivant >
  1502.             </button>
  1503.         </form>
  1504.         <!-- Formulaire 18  -->
  1505.         <form id="form18" class="signup-form" style="display: none;">
  1506.             <div class="d-flex justify-content-center gap-5 mb-5 mt-5">
  1507.                 <div>
  1508.                     <img src="/assets/img/pro/facade-centre.png"
  1509.                          style="cursor: pointer; max-width: 200px; max-height: 200px; object-fit: cover;"
  1510.                          alt="Façade Image"
  1511.                          class="profile-image"
  1512.                          id="gerantProfileFacade"
  1513.                          onclick="document.getElementById('image-input-facade').click()">
  1514.                     <input type="file" id="image-input-facade" accept="image/*"
  1515.                            onchange="previewImage(event, 'gerantProfileFacade')" style="display: none;">
  1516.                 </div>
  1517.                 <div>
  1518.                     <img src="/assets/img/pro/interieur-centre.png"
  1519.                          style="cursor: pointer; max-width: 200px; max-height: 200px; object-fit: cover;"
  1520.                          alt="Intérieur Image"
  1521.                          class="profile-image"
  1522.                          id="gerantProfileInterieur"
  1523.                          onclick="document.getElementById('image-input-interieur').click()">
  1524.                     <input type="file" id="image-input-interieur" accept="image/*"
  1525.                            onchange="previewImage(event, 'gerantProfileInterieur')" style="display: none;">
  1526.                 </div>
  1527.                 <div>
  1528.                     <img src="/assets/img/pro/diplome.png"
  1529.                          style="cursor: pointer; max-width: 200px; max-height: 200px; object-fit: cover;"
  1530.                          alt="Diplôme Image"
  1531.                          class="profile-image"
  1532.                          id="gerantProfileDiplome"
  1533.                          onclick="document.getElementById('image-input-diplome').click()">
  1534.                     <input type="file" id="image-input-diplome" accept="image/*"
  1535.                            onchange="previewImage(event, 'gerantProfileDiplome')" style="display: none;">
  1536.                 </div>
  1537.             </div>
  1538.             <button type="button"
  1539.                     class="create-account-button"
  1540.                     onclick="validateForm(18, event)">
  1541.                 Suivant >
  1542.             </button>
  1543.         </form>
  1544.         <!-- Formulaire 19 -->
  1545.         <form id="form19" class="signup-form" style="display: none; max-width: 100% !important;">
  1546.             <div class="d-flex gap-5 justify-content-center mt-5 mb-5">
  1547.                 <!-- Container Left -->
  1548.                 <div class="d-flex flex-column">
  1549.                     <div>
  1550.                         <input type="checkbox" id="form19Option1" name="form19Option1" value="form19Option1"
  1551.                                style="display:none">
  1552.                         <label class="fakeLabel" for="form19Option1"></label>
  1553.                         <label for="form19Option1">Bilan auditif complet</label>
  1554.                     </div>
  1555.                     <div>
  1556.                         <input type="checkbox" id="form19Option2" name="form19Option2" value="form19Option2"
  1557.                                style="display:none">
  1558.                         <label class="fakeLabel" for="form19Option2"></label>
  1559.                         <label for="form19Option2">Acouphène</label>
  1560.                     </div>
  1561.                     <div>
  1562.                         <input type="checkbox" id="form19Option3" name="form19Option3" value="form19Option3"
  1563.                                style="display:none">
  1564.                         <label class="fakeLabel" for="form19Option3"></label>
  1565.                         <label for="form19Option3">Protections auditives sur mesure - Nuisances sonores</label>
  1566.                     </div>
  1567.                     <div>
  1568.                         <input type="checkbox" id="form19Option4" name="form19Option4" value="form19Option4"
  1569.                                style="display:none">
  1570.                         <label class="fakeLabel" for="form19Option4"></label>
  1571.                         <label for="form19Option4">Appareillage Pédiatrique - Audiophonologie de l'enfant</label>
  1572.                     </div>
  1573.                     <div>
  1574.                         <input type="checkbox" id="form19Option5" name="form19Option5" value="form19Option5"
  1575.                                style="display:none">
  1576.                         <label class="fakeLabel" for="form19Option5"></label>
  1577.                         <label for="form19Option5">Implant cochléaire et réglages</label>
  1578.                     </div>
  1579.                 </div>
  1580.                 <!-- Container Right -->
  1581.                 <div class="d-flex flex-column">
  1582.                     <div>
  1583.                         <input type="checkbox" id="form19Option6" name="form19Option6" value="form19Option6"
  1584.                                style="display:none">
  1585.                         <label class="fakeLabel" for="form19Option6"></label>
  1586.                         <label for="form19Option6">Appareil intra-auriculaire</label>
  1587.                     </div>
  1588.                     <div>
  1589.                         <input type="checkbox" id="form19Option7" name="form19Option7" value="form19Option7"
  1590.                                style="display:none">
  1591.                         <label class="fakeLabel" for="form19Option7"></label>
  1592.                         <label for="form19Option7">Perte d’équilibre – Vertige</label>
  1593.                     </div>
  1594.                     <div>
  1595.                         <input type="checkbox" id="form19Option8" name="form19Option8" value="form19Option8"
  1596.                                style="display:none">
  1597.                         <label class="fakeLabel" for="form19Option8"></label>
  1598.                         <label for="form19Option8">Langage des signes</label>
  1599.                     </div>
  1600.                     <div>
  1601.                         <input type="checkbox" id="form19Option9" name="form19Option9" value="form19Option9"
  1602.                                style="display:none">
  1603.                         <label class="fakeLabel" for="form19Option9"></label>
  1604.                         <label for="form19Option9">Lyric</label>
  1605.                     </div>
  1606.                     <div>
  1607.                         <input type="checkbox" id="form19Option10" name="form19Option10" value="form19Option10"
  1608.                                style="display:none">
  1609.                         <label class="fakeLabel" for="form19Option10"></label>
  1610.                         <label for="form19Option10">Autres</label>
  1611.                     </div>
  1612.                 </div>
  1613.             </div>
  1614.             <div class="container-button">
  1615.                 <button type="button" class="create-account-button mt-4" onclick="validateForm(19, event)"
  1616.                         style="width: 15%">
  1617.                     Suivant >
  1618.                 </button>
  1619.             </div>
  1620.         </form>
  1621.         <!-- Formulaire 20 -->
  1622.         <form id="form20" class="signup-form" style="display: none; max-width: 100% !important;">
  1623.             <div class="d-flex gap-5 justify-content-center mt-5 mb-5">
  1624.                 <div class="d-flex flex-column">
  1625.                     <div>
  1626.                         <input type="checkbox" id="form20Option1" name="form20Option1" data-diploma="true" value="form20Option1"
  1627.                                style="display:none">
  1628.                         <label class="fakeLabel" for="form20Option1"></label>
  1629.                         <label for="form20Option1">Diplôme d'État audioprothésiste</label>
  1630.                     </div>
  1631.                     <div>
  1632.                         <input type="checkbox" id="form20Option2" name="form20Option2" data-diploma="true" value="form20Option2"
  1633.                                style="display:none">
  1634.                         <label class="fakeLabel" for="form20Option2"></label>
  1635.                         <label for="form20Option2">DU Audiophonologie</label>
  1636.                     </div>
  1637.                     <div>
  1638.                         <input type="checkbox" id="form20Option3" name="form20Option3" data-diploma="true" value="form20Option3"
  1639.                                style="display:none">
  1640.                         <label class="fakeLabel" for="form20Option3"></label>
  1641.                         <label for="form20Option3">DU implant cochléaire</label>
  1642.                     </div>
  1643.                     <div>
  1644.                         <input type="checkbox" id="form20Option4" name="form20Option4" data-diploma="true" value="form20Option4"
  1645.                                style="display:none">
  1646.                         <label class="fakeLabel" for="form20Option4"></label>
  1647.                         <label for="form20Option4">DU Nuisances Sonores</label>
  1648.                     </div>
  1649.                     <div>
  1650.                         <input type="checkbox" id="form20Option5" name="form20Option5" data-diploma="true" value="form20Option5"
  1651.                                style="display:none">
  1652.                         <label class="fakeLabel" for="form20Option5"></label>
  1653.                         <label for="form20Option5">Autres</label>
  1654.                     </div>
  1655.                 </div>
  1656.             </div>
  1657.             <div class="container-button">
  1658.                 <button type="button" class="create-account-button mt-4" onclick="validateForm(20, event)"
  1659.                         style="width: 15%">
  1660.                     Suivant >
  1661.                 </button>
  1662.             </div>
  1663.         </form>
  1664.         <!-- Formulaire 21 -->
  1665.         <form id="form21" class="signup-form" style="display: none;">
  1666.         </form>
  1667.         <div id="error-message-form" class="error-message-form"></div>
  1668.             <div class="container-button-bottom finalStep" style="display:none;top:725px;">
  1669.                 <a href="https://pro.myaudio.fr/login"><button type="button" class="create-account-button" style="">
  1670.                     Accédez a votre espace pro
  1671.                 </button>
  1672.                 </a>
  1673.             </div>
  1674.     </main>
  1675.     <footer></footer>
  1676.     <script>
  1677.         function toggleCheckbox(selectedId, otherId) {
  1678.             const selectedCheckbox = document.getElementById(selectedId);
  1679.             const otherCheckbox = document.getElementById(otherId);
  1680.             if (selectedCheckbox.checked) {
  1681.                 otherCheckbox.checked = false;
  1682.             }
  1683.         }
  1684.         function previewImage(event, imageId) {
  1685.             const inputFile = event.target;
  1686.             const imageElement = document.getElementById(imageId);
  1687.             if (inputFile.files && inputFile.files[0]) {
  1688.                 const reader = new FileReader();
  1689.                 reader.onload = function (e) {
  1690.                     imageElement.src = e.target.result;
  1691.                 };
  1692.                 reader.readAsDataURL(inputFile.files[0]);
  1693.             } else {
  1694.                 imageElement.src = '';
  1695.             }
  1696.         }
  1697.     </script>
  1698.      <script>
  1699.     function capitalizeFirstChar(input) {
  1700.         input.value = input.value
  1701.             .toLowerCase() 
  1702.             .replace(/^\w/, char => char.toUpperCase()); 
  1703.     }
  1704.     document.getElementById('gerant-first-name').addEventListener('input', function() {
  1705.         capitalizeFirstChar(this);
  1706.     });
  1707.     document.getElementById('gerant-last-name').addEventListener('input', function() {
  1708.         capitalizeFirstChar(this);
  1709.     });
  1710. </script>
  1711. {% endblock %}
  1712. {% block modals %}
  1713.     <div id="SmsModal" class="modal" aria-labelledby="SmsModal" aria-hidden="true">
  1714.         <div class="form-confirm">
  1715.             <button class="close" type="button" onclick="hideOtpModal();">X</button>
  1716.             <div class="info">
  1717.                 <span class="title">Vérification OTP</span>
  1718.                 <p class="description">Veuillez entrer le code que nous vous avons envoyé par SMS.</p>
  1719.             </div>
  1720.             <div class="inputs">
  1721.                 <input class="inputNum" id="telOne" type="tel" maxlength="1" oninput="moveFocus(this, 'telTwo')">
  1722.                 <input class="inputNum" id="telTwo" type="tel" maxlength="1" oninput="moveFocus(this, 'telThree')">
  1723.                 <input class="inputNum" id="telThree" type="tel" maxlength="1" oninput="moveFocus(this, 'telFour')">
  1724.                 <input class="inputNum" id="telFour" type="tel" maxlength="1">
  1725.             </div>
  1726.             <a class="validate" href="#" onclick="validateOtpCode(event);">Vérifier</a>
  1727.             <div class="reSms"></div>
  1728.             <p class="resend">Vous ne recevez pas le code ? <a class="resend-action" href="#"
  1729.                                                                onclick="resendOtp(event);">Renvoyer</a></p>
  1730.         </div>
  1731.     </div>
  1732. {% endblock %}