templates/booking/index.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}{{page.translate(locale).title}}{% endblock %}
  3. {% block meta_desc %}{{page.translate(locale).introduction[:150]|striptags|raw }}...{% endblock %}
  4. {% block stylesheets %}
  5.     <link rel="stylesheet" type="text/css" href="css/bootstrap-datepicker.css" />
  6. {% endblock %}
  7. {% block body %}
  8. {% include "components/areas/page/welcome.html.twig" %}
  9. <main class="booking-main" >
  10.     <section class="page-content section-reservation-page">
  11.         <div class="container">
  12.             <div class="reservation-page">
  13.                 <div class="flex-ctn">
  14.                 
  15.                     <div class="map">
  16.                         <div style="width: 100%; height: 100%;">
  17.                             <iframe frameborder="0" scrolling="no" marginheight="0"
  18.                                 marginwidth="0"
  19.                                 class="lazy"
  20.                                 data-src="https://maps.google.com/maps?width=100%25&amp;height=300&amp;hl=en&amp;q=Le%20Grand%20Bissargues,%2004110+(Colombine)&amp;t=k&amp;z=18&amp;ie=UTF8&amp;iwloc=B&amp;output=embed">
  21.                             </iframe>
  22.                         </div>
  23.                     </div>
  24.                     <div class="sidebar">
  25.                         <div class="text">
  26.                             <h2>{{page.translate(locale).title}}</h2>
  27.                             <div>{{page.translate(locale).introduction|raw}}</div>
  28.                             <ul>
  29.                                 {% trans %}Vous pouvez aussi réserver en nous contactant via les coordonnés ci-dessous :{% endtrans %}
  30.                                 <li><i class="fas fa-map-marked-alt"></i> {{statics.about.address}}</li>
  31.                                 <li><i class="fas fa-phone-alt" aria-hidden="true"></i> {{statics.about.phone}}</li>
  32.                                 <li><i class="fas fa-envelope" aria-hidden="true"></i> {{statics.about.email}}</li>
  33.                             </ul>
  34.                         </div>
  35.                         <div id="accordion-tarif" class="accordion">
  36.                             <div class="card">
  37.                                 <div class="card-header" id="heading-tarif">
  38.                                     <h4 class="mb-0">
  39.                                         <button class="btn btn-link" data-toggle="collapse" data-target="#collapse-tarif" aria-expanded="true" aria-controls="collapse-tarif">
  40.                                             <span>{% trans %}NOS TARIFS{% endtrans %}</span>
  41.                                             <i class="fas fa-plus"></i>
  42.                                         </button>
  43.                                     </h4>
  44.                                 </div>
  45.                                 <div id="collapse-tarif" class="collapse" aria-labelledby="heading-tarif" data-parent="#accordion-tarif">
  46.                                     <div class="card-body">
  47.                                         <div class="prices-ctn">
  48.                                             {% for saison in constraint.saisons %}
  49.                                                 <div class="price-item">
  50.                                                     <i class="{{saison.icon}}"></i>
  51.                                                     <h5>{{saison.translate(locale).title}}</h5>
  52.                                                     <div>
  53.                                                         <p>{% trans %}Période(s){% endtrans %} :</p>
  54.                                                         {% for period in saison.periods %}
  55.                                                         <span>{{period.startDate|date('d/m/Y')}} - {{period.endDate|date('d/m/Y')}}</span> <br>
  56.                                                         {% endfor %}
  57.                                                     </div>
  58.                                                     <span class="price-badge">{{saison.price|format(2,',',' ')}} € / {% trans %}nuit{% endtrans %}</span>
  59.                                                 </div>
  60.                                             {% endfor %}
  61.                                         </div>
  62.                                     </div>
  63.                                 </div>
  64.                             </div>
  65.                         </div>
  66.                         <div id="accordion-details" class="accordion">
  67.                             <div class="card">
  68.                                 <div class="card-header" id="heading-details">
  69.                                     <h4 class="mb-0">
  70.                                         <button class="btn btn-link" data-toggle="collapse" data-target="#collapse-details" aria-expanded="true" aria-controls="collapse-details">
  71.                                             <span>{% trans %}A SAVOIR{% endtrans %}</span>
  72.                                             <i class="fas fa-plus"></i>
  73.                                         </button>
  74.                                     </h4>
  75.                                 </div>
  76.                                 <div id="collapse-details" class="collapse" aria-labelledby="heading-details" data-parent="#accordion-details">
  77.                                     <div class="card-body">
  78.                                         <table class="table">
  79.                                             <tbody>
  80.                                                 <tr>
  81.                                                     <th scope="row">{% trans %}Chambre{% endtrans %} :</th>
  82.                                                     <td>{% trans %}Personnes{% endtrans %} : {{constraint.maxNumber}}</td>
  83.                                                     <td>{% trans %}Surface{% endtrans %} : {{constraint.surface}} m²</td>
  84.                                                 </tr>
  85.                                                 <tr>
  86.                                                     <th scope="row">{% trans %}Arrivée & Départ{% endtrans %} :</th>
  87.                                                     <td>{% trans %}Arrivée{% endtrans %} : {{constraint.startHour|date('H:i')}}</td>
  88.                                                     <td>{% trans %}Départ{% endtrans %} : {{constraint.endHour|date('H:i')}}</td>
  89.                                                 </tr>
  90.                                                 <tr>
  91.                                                     <th scope="row">{% trans %}Conditions{% endtrans %} :</th>
  92.                                                     <td>{% trans %}Nombre de nuits min{% endtrans %} : {{constraint.minDuration}} <br> {% trans %}Nombre de nuits max{% endtrans %} : {{constraint.maxDuration}}</td>
  93.                                                     <td><a href="{{path('booking_conditions')}}" target="_blank">{% trans %}Voir nos conditions{% endtrans %} <i class="fas fa-link"></i></a></td>
  94.                                                 </tr>
  95.                                             </tbody>
  96.                                         </table>
  97.                                     </div>
  98.                                 </div>
  99.                             </div>
  100.                         </div>
  101.                         <h2>{% trans %}Formulaire de réservation{% endtrans %}</h2>
  102.                         <div class="widget widget_check_availability">  
  103.                             <ul class="nav nav-tabs">
  104.                                 <li class="step active">
  105.                                     {% trans %}Votre séjour{% endtrans %}
  106.                                 </li>
  107.                                 <li class="step">
  108.                                     {% trans %}Vos informations{% endtrans %}
  109.                                 </li>
  110.                                 <li class="step">
  111.                                     {% trans %}Détails{% endtrans %}
  112.                                 </li>
  113.                             </ul>
  114.                             <div class="check_availability">
  115.                                 {% form_theme bookingForm _self %}
  116.                                 {{form_start(bookingForm, {'attr': {'id': 'booking-ms-form'}} )}}
  117.                                 <input type="hidden" name="booking-recaptcha_response" id="booking-recaptchaResponse"/>
  118.                                 <input type="hidden" name="action" value="validate_captcha"/>
  119.                                 <div id="booking-details" class="tab fade in active">
  120.                                     <h6 class="check_availability_title">{% trans %}Détails de votre séjour{% endtrans %}</h6>
  121.                                     <div class="">
  122.                                         <div class="check_availability-field">
  123.                                             <div class="flex-label">
  124.                                                 {{form_label(bookingForm.startDate)}}
  125.                                                 {{form_label(bookingForm.endDate)}}
  126.                                             </div>
  127.                                             <div class="input-group input-daterange d-flex" id="datepicker">
  128.                                                 {{form_widget(bookingForm.startDate)}}
  129.                                                 <span class="input-group-addon"><i class="fa fa-calendar" aria-hidden="true"></i></span>
  130.                                                 {{form_widget(bookingForm.endDate)}}
  131.                                             </div>
  132.                                         </div>
  133.                                     </div>
  134.                                     <div id="long-stay" class="check_availability-field" style="display:none">
  135.                                         <p class="alert alert-success">{% trans %}Vous bénéficiez de{% endtrans %} <b><span id="discount">-{{constraint.longStayDiscount * 100}}%</span></b> {% trans %}pour séjour de 7 nuits ou plus{% endtrans %} !</p>
  136.                                     </div>
  137.                                     <div class="row">
  138.                                          <div class="check_availability-field col-md-6 col-xs-12">
  139.                                             {{form_row(bookingForm.number, {'constraint' : constraint})}}
  140.                                         </div>
  141.                                         <div class="check_availability-field col-md-6 col-xs-12">
  142.                                             {{form_row(bookingForm.children, {'constraint' : constraint})}}
  143.                                         </div>
  144.                                     </div>
  145.                                     <div id="calcul" class="check_availability-field alert alert-info" style="display:none;">
  146.                                         <p class="nigth-count">
  147.                                             <span id="nights">...</span>{% trans %}nuits{% endtrans %} {% trans %}à{% endtrans %} <b><span id="price">...</span> €</b>/{% trans %}nuit{% endtrans %}
  148.                                         </p>
  149.                                         <p id="housework-ctn" class="d-none">
  150.                                             + {% trans %}Ménage{% endtrans %} : <span id="housework">...</span> €
  151.                                         </p>
  152.                                         <p>
  153.                                             + {% trans %}Taxe de séjour{% endtrans %} : <span id="staytax">...</span> €
  154.                                         </p>
  155.                                         <p>
  156.                                             {% trans %}Prix/nuit{% endtrans %} : <span id="dayprice">...</span> € {% trans %}soit{% endtrans %}, <span id="peopleprice"></span> € {% trans %}par personne{% endtrans %}.
  157.                                         </p>
  158.                                         <p class="amount-count">
  159.                                             {% trans %}Total{% endtrans %} : <span id="amount">...</span> € 
  160.                                         </p>
  161.                                     </div>
  162.                                     <div class="form-step-action">
  163.                                         <button type="button" class="form-prev prevBtn" id="prevBtn">
  164.                                             <i class="fas fa-chevron-left"></i> {% trans %}Précédent{% endtrans %}
  165.                                         </button>
  166.                                         <button type="button" class="form-next nextBtn" id="nextBtn" data-locale="{{locale}}">
  167.                                             {% trans %}Suivant{% endtrans %} <i class="fas fa-chevron-right"></i>
  168.                                         </button>
  169.                                     </div>
  170.                                 </div>
  171.                                
  172.                                 <div id="booker-infos" class="tab fade in">
  173.                                     <h6 class="check_availability_title">{% trans %}Vos informations{% endtrans %}</h6>
  174.                                     <div class="check_availability-field">
  175.                                         {{form_row(bookingForm.gender)}}
  176.                                     </div>
  177.                                    <div class="form-group-flex">
  178.                                         <div class="check_availability-field">
  179.                                             {{form_row(bookingForm.firstName)}}
  180.                                         </div>
  181.                                         <div class="check_availability-field">
  182.                                             {{form_row(bookingForm.lastName)}}
  183.                                         </div>
  184.                                     </div>
  185.                                     <div class="form-group-flex">
  186.                                         <div class="check_availability-field">
  187.                                             {{form_row(bookingForm.email)}}
  188.                                         </div>
  189.                                         <div class="check_availability-field">
  190.                                             {{form_row(bookingForm.phone)}}
  191.                                         </div>
  192.                                     </div>
  193.                                     <div class="check_availability-field">
  194.                                         {{form_row(bookingForm.comment)}}
  195.                                     </div>
  196.                                     <div class="form-step-action">
  197.                                         <button type="button" class="form-prev prevBtn" id="prevBtn" >
  198.                                             <i class="fas fa-chevron-left"></i> {% trans %}Précédent{% endtrans %}
  199.                                         </button>
  200.                                         <button type="button" class="form-next nextBtn" id="nextBtn">
  201.                                             {% trans %}Suivant{% endtrans %} <i class="fas fa-chevron-right"></i>
  202.                                         </button>
  203.                                     </div>
  204.                                 </div>
  205.                                 <div id="payment-details" class="tab fade in">
  206.                                     <h6 class="check_availability_title">{% trans %}Détails{% endtrans %}</h6>
  207.                                     <div class="recap">
  208.                                         <p><b>{% trans %}Récapitulatif{% endtrans %} :</b></p>
  209.                                         <p> 
  210.                                             {% trans %}Location du{% endtrans %} <b><span class="recap-start"></span></b> {% trans %}au{% endtrans %} <b><span class="recap-end"></span></b>.
  211.                                             <br>
  212.                                             {% trans %}Soit{% endtrans %} <b><span class="recap-days"></span></b> {% trans %}nuit.s pour un montant de{% endtrans %} <b><span class="recap-price"></span>€</b>.
  213.                                         </p>    
  214.                                         <label><b>{% trans %}Modalités{% endtrans %} :</b></label>
  215.                                         <p>{% trans %}Un dépôt de garantie de{% endtrans %} <b>{{constraint.deposit / 100}}€</b>.</p>
  216.                                         <p>{% trans %}Un acompte de{% endtrans %} <b><span class="recap-advance"></span>€</b>.</p>
  217.                                         <p>{% trans %}La taxe de séjour incluse dans le montant total.{% endtrans %}</p>
  218.                                         <p>{% trans %}Le ménage est inclu dans le montant total.{% endtrans %}</p>
  219.                                         <p><em>{% trans %}Plus de détails dans le mail récapitulatif ou dans nos{% endtrans %} <b><a href="{{path('booking_conditions')}}" target="_blank">{% trans %}CGV{% endtrans %}</a></b></em>.</p>
  220.                                     </div>
  221.                                     <div class="check_availability-field">
  222.                                         {{form_row(bookingForm.paymentMethod)}}
  223.                                     </div>
  224.                                     <div class="check_availability-field">
  225.                                         {{form_row(bookingForm.approval)}}
  226.                                     </div>
  227.                                     <div class="check_availability-field">
  228.                                         {{form_row(bookingForm.rgpd)}}
  229.                                     </div>
  230.                                     <div class="check_availability-field">
  231.                                         {{form_row(bookingForm.amount)}}
  232.                                     </div>
  233.                                     <div class="form-actions">
  234.                                         <button type="button" class="form-prev prevBtn" id="prevBtn">
  235.                                             <i class="fas fa-chevron-left"></i> {% trans %}Précédent{% endtrans %} 
  236.                                         </button>
  237.                                         <button type="submit" name="submit" class="read-more nextBtn" id="nextBtn" />
  238.                                             {% trans %}Je réserve {% endtrans %}
  239.                                             <i class="fas fa-paper-plane"></i>
  240.                                         </button> 
  241.                                     </div>
  242.                                 </div>
  243.                                 
  244.                                 {{form_end(bookingForm)}}
  245.                             </div>
  246.                         </div>
  247.                     </div>
  248.                 </div>
  249.             </div>
  250.             </section>
  251.         </div>
  252.     </section>
  253. </main>
  254. {% endblock %}
  255. {% block javascripts %}
  256.     <script src="js/msform.js"></script>
  257.     <script src="js/ajaxForm.js"></script>
  258.     <script type="text/javascript" src="js/bootstrap-datepicker.js"></script>
  259.     <script>
  260.         $(document).ready(function(){
  261.             
  262.             {% if locale == "fr" %}
  263.                 $.fn.datepicker.dates['fr'] = {
  264.                     days: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
  265.                     daysShort: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
  266.                     daysMin: ["d", "l", "ma", "me", "j", "v", "s"],
  267.                     months: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
  268.                     monthsShort: ["janv.", "févr.", "mars", "avril", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."],
  269.                     today: "Aujourd'hui",
  270.                     monthsTitle: "Mois",
  271.                     clear: "Effacer",
  272.                 };
  273.             {% endif %}
  274.             {% if locale == "es" %}
  275.                 $.fn.datepicker.dates['es'] = {
  276.                     days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
  277.                     daysShort: ["Dom", "Lun", "Mar", "Mié", "Juv", "Vie", "Sáb"],
  278.                     daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sá"],
  279.                     months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
  280.                     monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
  281.                     today: "Hoy",
  282.                     monthsTitle: "Mes",
  283.                     clear: "Borrar",
  284.                 };
  285.             {% endif %}
  286.             
  287.             {% if locale == "de" %}
  288.                 $.fn.datepicker.dates['de'] = {
  289.                     days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
  290.                     daysShort: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
  291.                     daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
  292.                     months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
  293.                     monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
  294.                     today: "Heute",
  295.                     monthsTitle: "Monate",
  296.                     clear: "Löschen",
  297.                 };
  298.             {% endif %}
  299.             $('#datepicker').each(function(){
  300.                 $(this).datepicker({
  301.                     format:'dd/mm/yyyy',
  302.                     startDate: '+{{constraint.blockedDaysAfterNow}}d',
  303.                     language : '{{locale}}',
  304.                     datesDisabled: [
  305.                         {% for day in constraint.notAvailableDays %}
  306.                             "{{ day.format('d/m/Y') }}",
  307.                         {% endfor %}
  308.                     ],
  309.                     endDate : '{{endDate|date('d/m/Y')}}'
  310.                 });
  311.             });
  312.             // if ($('#booking_startDate').val() != "") {
  313.             //     calculateAmount();
  314.             // }
  315.             $('#booking_startDate, #booking_endDate, #booking_number, #booking_children').on('change', calculateAmount);
  316.             $('#booking_number, #booking_children').on('keyup', calculateAmount);
  317.         });
  318.         function calculateAmount(){
  319.             const endDate   = new Date( $('#booking_endDate').val().replace(/(\d+)\/(\d+)\/(\d{4})/, '$3-$2-$1') );
  320.             const startDate = new Date( $('#booking_startDate').val().replace(/(\d+)\/(\d+)\/(\d{4})/, '$3-$2-$1') );
  321.             if (startDate && endDate && $('#booking_endDate').val() != "" && $('#booking_number').val() != "") {
  322.                 if (startDate < endDate) {
  323.                     $.ajax({
  324.                         type: 'POST',
  325.                         url: "/booking/get-saison?start="+startDate.toLocaleDateString("en-US")+"&end="+endDate.toLocaleDateString("en-US")+"",
  326.                         dataType: 'json'
  327.                     })
  328.                     .done(function (data) {
  329.                         // Calculs
  330.                         const DAY_TIME = 24 * 60 * 60 * 1000;
  331.                         const interval = endDate.getTime() - startDate.getTime();
  332.                         const days = interval / DAY_TIME;
  333.                         const amount = days * parseInt(data.price);
  334.                         // Nombre de nuits
  335.                         if (days > 1) {
  336.                             $('#nights').text(days);
  337.                         }else{
  338.                             $('#nights').text(days);
  339.                         }
  340.                         // Ménage
  341.                         var housework = {{constraint.housework / 100}};
  342.                         if (housework > 0) {
  343.                             $('#housework').show();  
  344.                             $('#housework').text(housework);  
  345.                         }
  346.                         // Nombre 
  347.                         var number = $('#booking_number').val();
  348.                         // Children 
  349.                         var children = $('#booking_children').val();
  350.                         if (children == "") {
  351.                             children = 0;
  352.                         }
  353.                         // Tax de séjour
  354.                         var stayTax = Math.ceil((({{constraint.stayTax}} / 100) * (number - children) * days));
  355.                         // Prix par nuit
  356.                         var dayPrice = Math.ceil(data.price + ((stayTax + housework) / days));
  357.                         // Prix final
  358.                         var totalAmount = Math.ceil(amount + housework + stayTax);
  359.                         // Accompte
  360.                         var advance = totalAmount * {{constraint.advancePayment}};
  361.                         // Réduction
  362.                         if (days >= 7 && {{constraint.longStayDiscount}} > 0) {
  363.                             var discountAmount = Math.ceil(totalAmount / (1 + {{constraint.longStayDiscount}}));
  364.                             $('#long-stay').show(100);
  365.                             $('#amount').html(discountAmount + ' € <span style="text-decoration:line-through; margin-left:5px; font-size:12px;">'+totalAmount+'</span>');
  366.                             $('.recap-price').text(discountAmount);
  367.                         // Pas reduction Reduction
  368.                         }else{
  369.                             $('#long-stay').hide(100);
  370.                             $('#amount').text(totalAmount);
  371.                             $('.recap-price').text(totalAmount);
  372.                         }
  373.                         $('#calcul').show(100);
  374.                         $('#staytax').text(stayTax);
  375.                         $('#price').text(data.price);
  376.                         $('#dayprice').text(dayPrice);
  377.                         $('#peopleprice').text(Math.ceil(dayPrice / number));
  378.                         // $('#saison').text(data.title);
  379.                         $('.recap-start').text($('#booking_startDate').val());
  380.                         $('.recap-end').text($('#booking_endDate').val());
  381.                         $('.recap-days').text(days);
  382.                         $('.recap-advance').text(advance);
  383.                         $('.error-date').hide(100);
  384.                     });
  385.                 }else{
  386.                     $('#booking_endDate').parent().append('<div class="error-date alert alert-danger"><small>Vous ne pouvez pas partir avant d\'être arrivé</small></div>')
  387.                 }
  388.             }
  389.         }
  390.     </script>
  391. {% endblock %}
  392. {% block _booking_number_label %}
  393.     <label for="booking_number" class="required">{% trans %}Nombre de personnes{% endtrans %} ({{constraint.maxNumber}} max)</label>
  394. {% endblock %}
  395. {% block _booking_number_widget %}
  396.     <input type="number" id="booking_number" name="booking[number]" required="required" min="1" max="{{constraint.maxNumber}}" step="1" placeholder="{% trans %}Combien de personnes ?{% endtrans %}" class="form-control">
  397. {% endblock %}
  398. {% block _booking_children_label %}
  399.     <label for="booking_children" class="required">{% trans %}Dont enfant(s) (-18 ans){% endtrans %}</label>
  400. {% endblock %}
  401. {% block _booking_children_widget %}
  402.     <input type="number" id="booking_children" name="booking[children]" min="1" max="{{(constraint.maxNumber - 1)}}" step="1" placeholder="{% trans %}Combien d'enfants ?{% endtrans %}" class="form-control">
  403. {% endblock %}