templates/front/reserver.html.twig line 1

Open in your IDE?
  1. {% extends "layout.html.twig" %}
  2. {% block contentBody %}
  3.     {% set title = content.title %}
  4.     {% if step != "annulation" %}
  5.         <div class="bg-white kl-block-nav">
  6.             <div class="kl-top-nav">
  7.                 {% if step != "confirmation" %}
  8.                     <a href="{{ step == "choice" or step == "" ? '/' : (referer is defined and referer is not empty ? referer : '/')}}" class="kl-step-return"><i>&larr; Retour à l'étape précédente</i></a>
  9.                 {% endif %}
  10.                 <ul class="kl-step-menu mb-0">
  11.                     <li class="{{ step == "choice" or step == "" ? 'active' : ''}}"><a href="{{ step == 'recap' ? '?step=choice' : '#choice'}}" {{ step == "confirmation" ? 'onclick="return false"' : ''}}>Choix de la formule</a></li>
  12.                     <li class="{{ step == "recap" and datas.commandes is defined ? 'active' : ''}}"><a href="{{ step == "choice" ? '?step=recap' : '#recap'}}" {{ step == "choice" or step == "confirmation" ? 'onclick="return false"' : ''}}>Récapitulatif</a></li>
  13.                     <li class=""><a href="#paiement" onclick="return false">Paiement</a></li>
  14.                     <li class="{{ step == "confirmation" ? 'active' : ''}}"><a href="#confirmation" onclick="return false">Confirmation</a></li>
  15.                 </ul>
  16.             </div>
  17.         </div>
  18.     {% endif %}
  19.     <div class=" max-container-3 block-texte mx-auto px-0 pb-lg-4">
  20.         <div class="row titre-details mt-4">
  21.             {% if step != "confirmation" and step != "annulation" %}
  22.                 <div class="col-md-12"><h2 class="mb-3">{{ title }} : </h2></div>
  23.             {% endif %}
  24.             {% if datas.commandes is defined and datas.commandes is not empty and datas.paymentForm is defined %}
  25.                 <div class="col-md-12">
  26.                     <div class="card">
  27.                         <div class="card-body">
  28.                             <div class="row">
  29.                                 <div class="col-md-12" id="id_liste">
  30.                                     <table class="table table-striped table-hover">
  31.                                         <thead class="thead-dark">
  32.                                         <tr>
  33.                                             <th>Désignation</th>
  34.                                             <th>Qté</th>
  35.                                             <th class="text-right">PU</th>
  36.                                             <th class="text-right">Montant</th>
  37.                                             <th></th>
  38.                                         </tr>
  39.                                         </thead>
  40.                                         <tbody>
  41.                                         {% set total = 0 %}
  42.                                         {% for commandeItem in datas.commandes %}
  43.                                             {% set montant = commandeItem.qte * tarifs[commandeItem.tarif_id].pu %}
  44.                                             {% set total = total + montant %}
  45.                                             <tr data-id="{{commandeItem.getId()}}">
  46.                                                 <td>{{ tarifs[commandeItem.tarif_id].description }}</td>
  47.                                                 <td>{{commandeItem.qte}}{{tarifs[commandeItem.tarif_id].titre == 'SDR' ? 'h' : ''}}</td>
  48.                                                 <td class="text-right">{{tarifs[commandeItem.tarif_id].pu}} €</td>
  49.                                                 <td class="text-right"><span class="kl_montant">{{montant}}</span> €</td>
  50.                                                 <td>
  51.                                                     <a href="#" class="kl-delete-cmd text-danger" title="Supprimer ce commande">
  52.                                                         <i class="fa fa-trash"></i>
  53.                                                     </a>
  54.                                                 </td>
  55.                                             </tr>
  56.                                         {% endfor %}
  57.                                         <tr class="bg-white">
  58.                                             <th class="text-right" colspan=3>Total HT</th>
  59.                                             <th class="text-right"><span id="idTotalHt">{{total}}</span> €</th>
  60.                                             <th></th>
  61.                                         </tr>
  62.                                         <tr class="bg-white">
  63.                                             <th class="text-right" colspan=3>TVA</th>
  64.                                             <th class="text-right"><span id="idTva">{{total * 0.2}}</span> €</th>
  65.                                             <th></th>
  66.                                         </tr>
  67.                                         <tr class="bg-white">
  68.                                             <th class="text-right" colspan=3>TTC</th>
  69.                                             <th class="text-right"><span id="idTotalTtc">{{total + total * 0.2}}</span> €</th>
  70.                                             <th></th>
  71.                                         </tr>
  72.                                         </tbody>
  73.                                     </table>
  74.                                     <div class="text-center">
  75.                                         {{ datas.paymentForm|raw }}
  76.                                     </div>
  77.                                 </div>
  78.                             </div>
  79.                         </div>
  80.                     </div>
  81.                 </div>
  82.             {% else %}
  83.                 <div class="col-md-7">
  84.                     <form method="POST" id="idFormCmd" action="{{ path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) }}">
  85.                         {% for item in tarifs %}
  86.                             <div class="card mb-3 kl-tarif" data-id="{{ item.id }}">
  87.                                 <div class="card-body d-flex">
  88.                                     <figcaption class="kl-img-illustration">
  89.                                         <img src="{{ item.logo }}" alt="{{ item.titre }}">
  90.                                     </figcaption>
  91.                                     <article class="mt-a mb-a">
  92.                                         <h5 class="card-title">{{ item.description }}</h5>
  93.                                         <p class="mb-0">Quantité :
  94.                                             <input type="number"
  95.                                                    inputmode="numeric"
  96.                                                    pattern="[0-9]*"
  97.                                                    name="data[{{ item.id }}]"
  98.                                                    data-tp="{{ item.titre == 'SDR' ? 'h' : ''}}"
  99.                                                    data-id="{{ item.id }}"
  100.                                                    data-price="{{ item.pu }}"
  101.                                                    min="0"
  102.                                                    value=""
  103.                                                    placeholder="0"
  104.                                                    class="kl-formInput form-control kl-inputReserve">
  105.                                             <span class="ml-3">Tarif :
  106.                                                 <strong>
  107.                                                     <span class="kl-price hide">0</span>
  108.                                                     <span class="kl-prices">{{ item.pu }}</span> €
  109.                                                 </strong>
  110.                                             </span>
  111.                                         </p>
  112.                                         {% if item.id == '4' %}
  113.                                             <p class="mb-2">
  114.                                                 <a href="#" data-bs-toggle="modal" data-bs-target="#calendarModal" class="kl-step-return">
  115.                                                     <i>Voir les disponibilités</i>
  116.                                                 </a>
  117.                                             </p>
  118.                                         {% endif %}
  119.                                     </article>
  120.                                 </div>
  121.                             </div>
  122.                         {% endfor %}
  123.                     </form>
  124.                 </div>
  125.                 <div class="col-md-5">
  126.                     <div class="card">
  127.                         <div class="card-body">
  128.                             <h5 class="text-center">Résumé</h5>
  129.                             {% for item in tarifs %}
  130.                                 <p class="mb-0 txt-gris hide" id="idResume{{ item.id }}"><em><span class="kl_cmd"></span> {{item.description}} </em></p>
  131.                             {% endfor %}
  132.                             <hr class="mb-10 mt-10">
  133.                             <p class="mb-0 clearfix">Total HT : <strong class="float-right txt-green font-size-16"><span id="totalHt">0</span> €</strong></p>
  134.                             <hr class="mb-10 mt-10">
  135.                             <p class="clearfix">Total TTC : <strong class="float-right"><span id="totalTtc">0</span> €</strong></p>
  136.                             <p><em class="text-muted">En commandant j'accepte les conditions générales de vente</em></p>
  137.                             <button type="button" class="btn btn-link transition-bgcolor bg-green-s minw-sm btn-block disabled" id="idButtonCmd">COMMANDER</button>
  138.                             <p class="text-muted text-center mt-3 mb-0">Paiement sécurisé</p>
  139.                         </div>
  140.                     </div>
  141.                     <div class="card mt-3 bg-green-avocate">
  142.                         <div class="card-body">
  143.                             <h5 class="txt-white">Vous souhaitez<br/> un abonnement personnalisé ?</h5>
  144.                             <div class="row">
  145.                                 <div class="col-md-6">
  146.                                     <h4 class="txt-green mb-0">04 51 58 08 05</h4>
  147.                                     <small class="fs-12 txt-white">Du lundi au vendredi de 9h à 18h</small>
  148.                                 </div>
  149.                                 <div class="col-md-6 text-right m-a">
  150.                                     <a class="btn btn-small-link" href="/contact">Contact</a>
  151.                                 </div>
  152.                             </div>
  153.                         </div>
  154.                     </div>
  155.                 </div>
  156.             {% endif %}
  157.         </div>
  158.     </div>
  159.     <div class="modal fade" id="calendarModal" tabindex="-1" aria-labelledby="calendarModalLabel" aria-hidden="true">
  160.         <div class="modal-dialog modal-xl modal-dialog-scrollable">
  161.             <div class="modal-content">
  162.                 <div class="modal-header">
  163.                     <h5 class="modal-title" id="calendarModalLabel">Créneaux disponibles</h5>
  164.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Fermer"></button>
  165.                 </div>
  166.                 <div class="modal-body" id="calendar-content">
  167.                     {% include 'front/disponibilites_fragment.html.twig' %}
  168.                 </div>
  169.             </div>
  170.         </div>
  171.     </div>
  172.     <script src="https://code.jquery.com/jquery-3.6.4.min.js"></script>
  173.     <script src="{{ asset('/assets/js/custom.js?v1') }}"></script>
  174.     <script src="{{ asset('/assets/js/client/commande.js?v9') }}"></script>
  175.     <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
  176.     {% block javascripts %}
  177.         {{ parent() }}
  178.         <script>
  179.             const days = {{ dates|json_encode|raw }};
  180.             const reservations = {{ reservations|json_encode|raw }};
  181.             function generateCalendar(reservations, days) {
  182.                 const calendarBody = document.getElementById('calendar-body');
  183.                 if (!calendarBody) return;
  184.                 const hours = ["08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00"];
  185.                 const now = new Date();
  186.                 const isMobile = window.innerWidth <= 768;
  187.                 calendarBody.innerHTML = "";
  188.                 hours.forEach(hour => {
  189.                     const row = document.createElement('tr');
  190.                     row.innerHTML = `<td>${hour}</td>`;
  191.                     days.forEach(day => {
  192.                         const reservationForDay = reservations[day] || [];
  193.                         const reservation = reservationForDay.find(res => res.time === hour);
  194.                         const td = document.createElement('td');
  195.                         const reservationDateTime = new Date(`${day}T${hour}:00`);
  196.                         let text = "";
  197.                         if (reservationDateTime <= now) {
  198.                             if (reservation) {
  199.                                 td.className = "past-reserved";
  200.                                 text = "Réservé";
  201.                             } else {
  202.                                 td.className = "past";
  203.                                 text = "Indisponible";
  204.                             }
  205.                             td.style.pointerEvents = "none";
  206.                         } else if (reservation) {
  207.                             td.className = "reserved alias";
  208.                             text = "Réservé";
  209.                         } else {
  210.                             td.className = "available";
  211.                             text = "Disponible";
  212.                         }
  213.                         if (!isMobile) {
  214.                             td.textContent = text;
  215.                         }
  216.                         row.appendChild(td);
  217.                     });
  218.                     calendarBody.appendChild(row);
  219.                 });
  220.             }
  221.             // Appel initial
  222.             document.addEventListener("DOMContentLoaded", function () {
  223.                 generateCalendar(reservations, days);
  224.             });
  225.             // Pagination calendrier (changer de semaine)
  226.             document.addEventListener("click", function (e) {
  227.                 const target = e.target.closest(".change-week");
  228.                 if (target) {
  229.                     e.preventDefault();
  230.                     const date = target.dataset.date;
  231.                     fetch(`/reservation?d=${date}&modal=1`)
  232.                         .then(res => res.text())
  233.                         .then(html => {
  234.                             document.getElementById("calendar-content").innerHTML = html;
  235.                             const parser = new DOMParser();
  236.                             const doc = parser.parseFromString(html, "text/html");
  237.                             const newScript = doc.querySelector("script[data-calendar-json]");
  238.                             if (newScript) {
  239.                                 const data = JSON.parse(newScript.textContent);
  240.                                 generateCalendar(data.reservations, data.dates);
  241.                             }
  242.                         });
  243.                 }
  244.             });
  245.         </script>
  246.     {% endblock %}
  247. {% endblock %}