templates/pro/nos-tarifs-new.html.twig line 1

Open in your IDE?
  1. {% extends "/pro/base2.html.twig" %}
  2. {% block stylesheets %}
  3.     {{ parent() }}
  4.         <link rel="stylesheet" type="text/css" href="/assets/lib/slick-1.8.1/slick.css" />
  5.         <link rel="stylesheet" type="text/css" href="/assets/lib/slick-1.8.1/slick-theme.css" />
  6.         <link rel="stylesheet" href="/assets/css/pro/tarif.css">
  7.     <style>
  8.    .anual-price{
  9.     font-size: 35px;
  10. }
  11. .last-btn {
  12.     position: absolute;
  13.     bottom: -10px;
  14.     left: 0;
  15.     right: 0;
  16. }
  17. span.red-barre {
  18.     font-size: 25px;
  19.     position: relative;
  20. }
  21. span.red-barre:before {
  22.     content: "";
  23.     width: 100%;
  24.     height: 2px;
  25.     background: #f54848ad;
  26.     position: absolute;
  27.     top: 50%;
  28. }
  29.         .card img {margin: 0 auto; }
  30.         a.btn{font-size: 20px; padding: 5px 20px; max-width: 160px; margin: 10px auto 0;}
  31.         .card {
  32.     text-align: center;
  33.     padding: 30px 0px 0;
  34.     border-radius: 10px;
  35.     height: 100%;
  36.     margin-top: 30px;
  37.     background: linear-gradient(180deg, rgb(255 255 255) 0%, rgba(208,250,241,1) 100%);
  38. }
  39.         .titre-card {font-weight: 600; font-size: 20px;}
  40.         a.underlined {font-weight: 600; font-size: 18px; padding: 0 0 10px;}
  41. .card-prix {
  42.     background: #F2FDFF;
  43.     padding: 10px;
  44.     display: flex;
  45.     flex-direction: column;
  46.     justify-content: space-between;
  47.     height: 280px;
  48.     padding: 30px;
  49.     position: relative;
  50. }
  51.         .prix{ display : block !important ; color:var(--couleur-bleu-principale);font-weight: 600;font-size:40px; line-height:1 margin:0;}
  52.         .prix sub{ font-size:20px;}
  53.         .tarif{  display: flex; align-items: center; column-gap: 20px; margin-top: 20px;  flex-wrap: wrap;}
  54.         .prixafter {font-size: 25px;  margin-top: 5px;}
  55.         .puce_tab{ font-weight:600; margin-bottom:25px}
  56.         .prixafterMini {font-size: 16px; background: #F2FDFF; margin: 0; padding:0 5px; }
  57.         .prixafterMini sub {font-size: 10px; }
  58.         .timePrx{font-size:15px;}
  59. @media only screen and (max-width: 1199px){
  60.            .pricing-list {
  61.            flex-direction: column;
  62.       }
  63.       .info-price {
  64.     grid-template-columns: 57% 45%;
  65. }
  66. span.no-engagement {
  67.     margin-left: 44px;
  68. }
  69. .prix sub {
  70.     font-size: 14px;
  71. }
  72. .info-price label {
  73.     text-align: left;
  74. }
  75. }
  76.     </style>
  77. {% endblock %}
  78. {% block javascripts %}
  79.     {{ parent() }}
  80.     <script type="text/javascript" src="/assets/lib/slick-1.8.1/slick.js"></script>
  81.     <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
  82.     <script>
  83.         document.addEventListener("DOMContentLoaded", function() {
  84.             const radioButtons = document.querySelectorAll('input[type="radio"][name="duration-1"]');
  85.             const nbAudioprothMonthInput = document.getElementById("nbAudioprothMonth");
  86.             const priceCol1 = document.getElementById("priceCol1");
  87.             const subtitlePriceCol1 = document.getElementById("subtitlePriceCol1");
  88.             const subtitleNextPriceCol1 = document.getElementById("subtitleNextPriceCol1");
  89.             const baseMonthlyPrice = 75;
  90.             const baseMonthlyPriceNoDiscount = 89;
  91.             const additionalPrice = 19.90;
  92.             let selectionData = [];
  93.             function updateCardContent(option) {
  94.                 const selectedLabel = document.querySelector(`label[for="${option}"]`);
  95.                 if (option === 'centre') {
  96.                     selectedLabel.style.borderTopRightRadius = '0px';
  97.                     selectedLabel.style.borderBottomRightRadius = '0px';
  98.                     document.getElementById("subtitlePriceCol1").textContent = "facturés une fois par an (900€/an)";
  99.                     document.getElementById("subtitleNextPriceCol1").textContent = "pendant 12 mois puis 1000€/an";
  100.                     document.getElementById("subtitlePriceColSwitch").textContent = "par centre supplémentaire, facturé une fois par an.";
  101.                     document.getElementById("nbCentreAudio").textContent = "Nombre de centre(s) en plus";
  102.                     document.getElementById("textTitleCol2").textContent = "Gérez plusieurs centres auditifs";
  103.                     document.getElementById("textContentCol2").textContent = "Si vous êtes un audioprothésiste travaillant dans plusieurs lieux, My Audio vous aide à organiser votre agenda pour chaque centre, afin de gérer facilement vos rendez-vous dans tous vos lieux d’exercice.";
  104.                 } else if (option === 'audio') {
  105.                     selectedLabel.style.borderTopLeftRadius = '0px';
  106.                     selectedLabel.style.borderBottomLeftRadius = '0px';
  107.                     selectedLabel.style.borderTopRightRadius = '50em';
  108.                     selectedLabel.style.borderBottomRightRadius = '50em';
  109.                     document.getElementById("subtitlePriceCol1").textContent = "facturés une fois par an (900€/an)";
  110.                     document.getElementById("subtitleNextPriceCol1").textContent = "pendant 12 mois puis 1000€/an";
  111.                     document.getElementById("subtitlePriceColSwitch").textContent = "par audioprothésiste supplémentaire, facturé une fois par an.";
  112.                     document.getElementById("nbCentreAudio").textContent = "Nombre d'audio en plus";
  113.                     document.getElementById("textTitleCol2").textContent = "Gérez plusieurs audio dans un centre";
  114.                     document.getElementById("textContentCol2").textContent = "Si vous dirigez un centre auditif avec plusieurs audioprothésistes, My Audios crée des agendas spécifiques pour chacun, simplifiant la gestion des rendez-vous.";
  115.                 }
  116.             }
  117.        /* const inputField = document.getElementById("nbAudioprothMonth");
  118.         const switchOption = document.querySelector(".switch-container");
  119.         switchOption.addEventListener("click", function() {
  120.         inputField.value = 0;
  121.         });*/
  122.             function handleRadioClick(option) {
  123.                 
  124.                 updateCardContent(option);
  125.                 updateSelectionData();
  126.             }
  127.             radioButtons.forEach(radio => {
  128.                 radio.addEventListener("change", function(event) {
  129.                     handleRadioClick(event.target.value);
  130.                 });
  131.             });
  132.             const selectedRadio = document.querySelector('input[type="radio"][name="duration-1"]:checked');
  133.             if (selectedRadio) {
  134.                 handleRadioClick(selectedRadio.value);
  135.             }
  136.             function updatePrices() {
  137.                 
  138.                 const nbAudioprothMonth = parseInt(nbAudioprothMonthInput.value, 10) || 0;
  139.                 let monthlyPrice = baseMonthlyPrice + (nbAudioprothMonth * additionalPrice);
  140.                 let monthlyPriceNoDiscount = baseMonthlyPriceNoDiscount + (nbAudioprothMonth * additionalPrice);
  141.                 let annualPrice = (monthlyPrice * 12).toFixed(2);
  142.                 let annualNextPrice = (monthlyPrice * 12 + 100).toFixed(2);
  143.                 priceCol1.textContent = monthlyPrice.toFixed(2);
  144.                 subtitlePriceCol1.textContent = `facturés une fois par an (${annualPrice}€/an)`;
  145.                 subtitleNextPriceCol1.textContent = `pendant 12 mois puis ${annualNextPrice}€/an`;
  146.                 updateSelectionData();
  147.             }
  148.             function updateSelectionData() {
  149.     const selectedType = document.querySelector('input[type="radio"][name="duration-1"]:checked').value;
  150.     const nbAudioprothMonth = parseInt(nbAudioprothMonthInput.value, 10) || 0;
  151.     const monthlyPrice = parseFloat(priceCol1.textContent);
  152.     const monthlyPriceNoDiscount = baseMonthlyPriceNoDiscount + (nbAudioprothMonth * additionalPrice);
  153.     const monthlyPriceNoDiscountNextYear = baseMonthlyPriceNoDiscount + (nbAudioprothMonth * additionalPrice) + 10;
  154.     const annualPrice = (monthlyPrice * 12).toFixed(2);
  155.     const annualPriceNoDiscount = (monthlyPriceNoDiscount * 12).toFixed(2);
  156.     const isAnnual = document.querySelector(".switch-option.selected").getAttribute("data-option") === "annual";
  157.     const option = document.querySelector('input[type="radio"][id="centre"]');
  158.     if (isAnnual) {
  159.         const anuelAdditional = nbAudioprothMonth * 238.8;
  160.         const annualMonthlyPrice = baseMonthlyPrice + (nbAudioprothMonth * additionalPrice);
  161.         const annualTotalPrice = (annualMonthlyPrice * 12).toFixed(2);
  162.         const annualNextTotalPrice = (annualMonthlyPrice * 12 + 100).toFixed(2);
  163.         priceCol1.textContent = annualMonthlyPrice.toFixed(2);
  164.         subtitlePriceCol1.textContent = `facturés une fois par an (${annualTotalPrice}€/an)`;
  165.         subtitleNextPriceCol1.textContent = `pendant 12 mois puis ${annualNextTotalPrice}€/an`;
  166.         if (option && option.checked) {
  167.             document.getElementById("subtitlePriceColSwitch").innerHTML = `par centre supplémentaire,<br>facturés une fois par an (${anuelAdditional.toFixed(1)}€/an)`;
  168.         } else {
  169.             document.getElementById("subtitlePriceColSwitch").innerHTML = `par audioprothésiste supplémentaire,<br>facturés une fois par an (${anuelAdditional.toFixed(1)}€/an)`;
  170.         }
  171.  
  172.                 const currentSelection = {
  173.                     type: selectedType,
  174.                     pricePerMonth: monthlyPrice.toFixed(2),
  175.                     annualPrice: annualPrice,
  176.                     quantity: nbAudioprothMonth,
  177.                     recurring: isAnnual ? "annual" : "monthly",
  178.                     isCda: false
  179.                 };
  180.                 selectionData = [currentSelection];
  181.                 console.log(selectionData);
  182.     } else {
  183.         subtitleNextPriceCol1.textContent = `pendant 12 mois puis ${monthlyPriceNoDiscountNextYear.toFixed(2)}€/mois`;
  184.         priceCol1.textContent = monthlyPriceNoDiscount.toFixed(2);
  185.         document.getElementById("subtitlePriceCol1").textContent = "facturé mensuellement, sans engagement.";
  186.         if (option && option.checked) {
  187.             document.getElementById("subtitlePriceColSwitch").innerHTML = "par centre supplémentaire,<br>facturé mensuellement, sans engagement.";
  188.         } else {
  189.             document.getElementById("subtitlePriceColSwitch").innerHTML = "par audioprothésiste supplémentaire,<br>facturé mensuellement, sans engagement.";
  190.         }
  191.          
  192.                 const currentSelection = {
  193.                     type: selectedType,
  194.                     pricePerMonth: monthlyPriceNoDiscount.toFixed(2),
  195.                     annualPrice: annualPriceNoDiscount,
  196.                     quantity: nbAudioprothMonth,
  197.                     recurring: isAnnual ? "annual" : "monthly",
  198.                     isCda: false
  199.                 };
  200.                 selectionData = [currentSelection];
  201.                 console.log(selectionData);
  202.     }
  203.                
  204.             }
  205.             document.querySelector(".button-plusMonth").addEventListener("click", function() {
  206.                 nbAudioprothMonthInput.stepUp();
  207.                 updatePrices();
  208.             });
  209.             document.querySelector(".button-minusMonth").addEventListener("click", function() {
  210.                 nbAudioprothMonthInput.stepDown();
  211.                 updatePrices();
  212.             });
  213.             nbAudioprothMonthInput.addEventListener("input", updatePrices);
  214.            // updatePrices();
  215.             function redirectToInscription() {
  216.                 console.log(selectionData);
  217.                 if (selectionData && selectionData[0].type && selectionData[0].pricePerMonth && selectionData[0].quantity >= 0) {
  218.                     const data = {
  219.                         type: selectionData[0].type,
  220.                         price: selectionData[0].pricePerMonth,
  221.                         annualPrice: Math.round(parseFloat(selectionData[0].pricePerMonth) * 12),
  222.                         quantity: selectionData[0].quantity,
  223.                         recurring: selectionData[0].recurring,
  224.                         isCda: selectionData[0].isCda
  225.                     };
  226.                     fetch('/pro/handle-inscription', {
  227.                         method: 'POST',
  228.                         headers: {
  229.                             'Content-Type': 'application/json',
  230.                             'X-Requested-With': 'XMLHttpRequest',
  231.                         },
  232.                         body: JSON.stringify(data),
  233.                     })
  234.                     .then(response => {
  235.                         if (!response.ok) {
  236.                             throw new Error('Échec de la requête : ' + response.statusText);
  237.                         }
  238.                         return response.json();
  239.                     })
  240.                     .then(data => {
  241.                         console.log('Réponse du serveur:', data);
  242.                         if (data.redirect_url) {
  243.                             window.location.href = data.redirect_url;
  244.                         } else {
  245.                             console.error('Aucune URL de redirection reçue.');
  246.                         }
  247.                     })
  248.                     .catch(error => {
  249.                         console.error('Erreur réseau ou serveur :', error);
  250.                     });
  251.                 } else {
  252.                     console.error("Les données de sélection sont invalides ou incomplètes.");
  253.                     console.log(selectionData);
  254.                 }
  255.             }
  256.             const btn = document.getElementById('btnInscription');
  257.             const btn2 = document.getElementById('btnInscription2');
  258.             if (btn || btn2) {
  259.                 btn.addEventListener("click", function() {
  260.                     console.log("Button clicked");
  261.                     redirectToInscription();
  262.                 });
  263.                 btn2.addEventListener("click", function() {
  264.                     console.log("Button clicked");
  265.                     redirectToInscription();
  266.                 });
  267.             } else {
  268.                 console.log("Button not found");
  269.             }
  270.             const switchContainer = document.querySelector(".switch-container");
  271.             const options = document.querySelectorAll(".switch-option");
  272.             const slider = document.createElement("div");
  273.             slider.classList.add("switch-slider");
  274.             switchContainer.appendChild(slider);
  275.             slider.style.width = '100%'
  276.             console.log("Slider ajouté au DOM :", slider);
  277.             const initialSelected = document.querySelector(".switch-option.selected");
  278.             const initialIndex = Array.from(options).indexOf(initialSelected);
  279.             slider.style.transform = `translateX(${initialIndex * 100}%)`;
  280.             console.log("Position initiale du slider :", slider.style.transform);
  281.             options.forEach((option, index) => {
  282.                 option.addEventListener("click", () => {
  283.                     options.forEach(opt => opt.classList.remove("selected"));
  284.                     option.classList.add("selected");
  285.                     slider.style.transform = `translateX(${index * 100}%)`;
  286.                     console.log("Position mise à jour :", slider.style.transform);
  287.                     updateSelectionData();
  288.                 });
  289.             });
  290.         });
  291.     </script>
  292. {% endblock %}
  293. {% block body %}
  294.   {{ parent() }}
  295. {% endblock %}
  296. {% block content %}
  297.   {{ parent() }}
  298. <div class="first-page-cda">
  299.     <section class="section-title">
  300.         <div class="container-parent">
  301.             <div class="container-left">
  302.                 <h3>Solution rentabilisée</h3>
  303.                 <h1>dès la 1ère vente</h1>
  304.                 <p>Générez des ventes et automatisez la croissance de vos centres</p>
  305.             </div>
  306.             <div class="container-right">
  307.                 <button class="btn btn-jaune-inverse" id="btnInscription">Je m'inscris maintenant</button>
  308.             </div>
  309.         </div>
  310.     </section>
  311.     <section class="recurring">
  312.          <div class="d-flex justify-content-center">
  313.             <div class="switch-container">
  314.                 <div class="switch-option selected" data-option="annual">
  315.                     <span>Paiement annuel</span><br>
  316.                     <span class="best-value">-15%</span>
  317.                 </div>
  318.                 <!--<div class="switch-option" data-option="monthly">
  319.                     <span>Paiement mensuel</span>
  320.                 </div>-->
  321.             </div>
  322.         </div>
  323.     </section>
  324.     <section class="section-tarif">
  325.         <div class="card-tarif">
  326.             <div class="container-header">
  327.                 <h4><b>Licence My Audio</b></h4>
  328.                 <h4>1 audio + 1 centre <b>inclu</b></h4>
  329.             </div>
  330.             <div class="container-card-content">
  331.                 <div class="container-middle">
  332.                     <div class="container-card-img">
  333.                         <img class="logo logopro" src="/assets/img/storage/pagesimages/calendar-pro.png" alt="My Audio calendar">
  334.                     </div>
  335.                     <div class="container-price-top">
  336.                         <p class="price">
  337.                             <span class="price" id="priceCol1">75</span>
  338.                             <span class="currency">EUR HT / mois</span>
  339.                         </p>
  340.                     </div>
  341.                     <div class="container-price-bottom">
  342.                         <p id="subtitlePriceCol1">facturés une fois par an (900€/an)</p>
  343.                     </div>
  344.                     <div class="container-price-bottom">
  345.                         <p id="subtitleNextPriceCol1">pendant 12 mois puis 1000€/an</p>
  346.                     </div>
  347.                 </div>
  348.                 <div class="container-price">
  349.                     <div class="container-remise-content">
  350.                         <div class="row-arg">
  351.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-calendar.png"  alt="picto d'un calendrier">
  352.                             <p>Prise de RDV en ligne</p>
  353.                         </div>
  354.                         <div class="row-arg">
  355.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-action.png"  alt="Picto d'une action avec un doigt">
  356.                             <p>Agenda en ligne</p>
  357.                         </div>
  358.                         <div class="row-arg">
  359.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-alarm.png"  alt="Picto d'une cloche">
  360.                             <p>SMS/Email de rappel rappels RDV</p>
  361.                         </div>
  362.                         <div class="row-arg">
  363.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-two.png"  alt="Picto du chiffre Deux">
  364.                             <p>Objectif 2 RDV/mois</p>
  365.                         </div>
  366.                         <div class="row-arg">
  367.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-share.png"  alt="Picto de partage de fichiers">
  368.                             <p>Partage de documents patients/audio</p>
  369.                         </div>
  370.                         <div class="row-arg">
  371.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-sync.png"  alt="Picto partage de documents">
  372.                             <p>Synchronisation Agenda</p>
  373.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-cosium.png"  style="width: 100px;" alt="Picto partage de documents">
  374.                         </div>
  375.                     </div>
  376.                 </div>
  377.             </div>
  378.         </div>
  379.         <div class="spacer-plus">
  380.             <img class="logo-picto-remise" src="/assets/img/pro/picto-plus.png"  alt="picto d'un calendrier">
  381.         </div>
  382.         <div class="card-tarif">
  383.            <div class="container-header">
  384.                 <h4>Ajoutez + d’audio ou de centre</h4>
  385.             </div>
  386.             <div class="pricing-switcher">
  387.                 <p class="fieldset">
  388.                     <input type="radio" name="duration-1" value="centre" id="centre" checked>
  389.                     <label for="centre">multi-centre</label>
  390.                     <input type="radio" name="duration-1" value="audio" id="audio">
  391.                     <label for="audio">multi-audio</label>
  392.                     <span class="switch"></span>
  393.                 </p>
  394.             </div>
  395.             <div class="container-card-content">
  396.                 <div>
  397.                     <div class="container-card-img">
  398.                         <img class="logo logopro" src="/assets/img/pro/multi-centre-audio.png" alt="My Audio calendar">
  399.                     </div>
  400.                     <div class="container-price-top">
  401.                         <p class="price">
  402.                             <span class="price" id="priceCol2">19,90</span>
  403.                             <span class="currency">EUR HT / mois</span>
  404.                         </p>
  405.                     </div>
  406.                     <div class="container-price-bottom">
  407.                         <p id="subtitlePriceColSwitch">par centre supplémentaire, facturé une fois par an.</p>
  408.                     </div>
  409.                     <div class="info-price">
  410.                         <label id="nbCentreAudio">Nombre de centre(s) </label>
  411.                         <div class="input-group">
  412.                             <input type="button" value="-" class="button-minusMonth" data-field="nbAudioprothMonth">
  413.                             <input type="number" class="quantity-fieldMonth" min="0" id="nbAudioprothMonth" name="nbAudioprothMonth"
  414.                                     value="0" />
  415.                             <input type="button" value="+" class="button-plusMonth" data-field="nbAudioprothMonth">
  416.                         </div>
  417.                     </div>
  418.                 </div>
  419.                 <div class="container-price">
  420.                     <div class="container-remise-content" style="gap: 0px;">
  421.                         <div class="row-arg">
  422.                             <p class="text-green" id="textTitleCol2">Gérez plusieurs centres auditifs</p>
  423.                         </div>
  424.                         <div class="row-arg">
  425.                             <p id="textContentCol2">Si vous êtes un audioprothésiste travaillant dans plusieurs lieux, My Audio vous aide à organiser votre agenda pour chaque centre, afin de gérer facilement vos rendez-vous dans tous vos lieux d’exercice.</p>
  426.                         </div>
  427.                     </div>
  428.                 </div>
  429.             </div>
  430.         </div>
  431.         <div class="spacer-plus">
  432.             <img class="logo-picto-remise" src="/assets/img/pro/picto-plus.png"  alt="picto d'un calendrier">
  433.         </div>
  434.         <div class="card-tarif">
  435.             <div class="container-header">
  436.                 <h4>Commission fixe par vente</h4>
  437.             </div>
  438.             <div class="container-card-content">
  439.                 <div>
  440.                     <div class="first-text">
  441.                         <p>Commission fixe, que vous vendiez un ou plusieurs appareils grâce aux rendez-vous générés par My Audio.</p>
  442.                     </div>
  443.                     <div class="container-card-img">
  444.                         <img class="logo logopro" src="/assets/img/pro/commission.png" style="width: 300px!important;" alt="My Audio calendar">
  445.                     </div>
  446.                 </div>
  447.                 <div class="container-price">
  448.                     <div class="container-price-top">
  449.                         <p class="price">
  450.                             <span class="price">300</span>
  451.                             <span class="currency">EUR HT / vente</span>
  452.                         </p>
  453.                     </div>
  454.                     <div class="container-price-bottom">
  455.                             <button class="btn btn-jaune-inverse" id="btnInscription2">Je m'inscris maintenant</button>
  456.                     </div>
  457.                     <div class="container-remise-content">
  458.                         <div class="row-arg">
  459.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-calendar.png"  alt="picto d'un calendrier">
  460.                             <p>0 EUR par rendez-vous</p>
  461.                         </div>
  462.                         <div class="row-arg">
  463.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-sync.png"  alt="Picto partage de documents">
  464.                             <p>Acquisition patients à la performance</p>
  465.                         </div>
  466.                         <div class="row-arg">
  467.                             <img class="logo-picto-remise" src="/assets/img/pro/picto-target.png"  alt="Picto partage de documents">
  468.                             <p>Efforts Marketing déployés en local</p>
  469.                         </div>
  470.                     </div>
  471.                 </div>
  472.             </div>
  473.         </div>
  474.     </section>
  475.   </div>
  476. {% endblock %}
  477. {% block modals %}
  478. {% endblock %}