{% extends 'MDS/VenuesBundle/base-reservations.html.twig' %}{% block pagetitleinterno %} <div class="page-title" style="margin-left:280px"> <h4 class="text-mint_cream"><i class="icon-list position-left text-mint_cream"></i> <span class="text-semibold text-mint_cream">{% trans %}Venues{% endtrans %}</span> - {% trans %}Reservation{% endtrans %}</h4> </div>{% endblock %}{% block breadcrumbs %} <ul class="breadcrumb"> <li><a href="/venues/list"><i class="icon-home2 position-left text-mint_cream"></i>{% trans %}Home{% endtrans %}</a></li> <li class="active"><i class="icon-plus-circle2 position-left text-mint_cream"></i>{% trans %}Edit Reservations{% endtrans %}</li> </ul>{% endblock %}{% block contentReservation %}<div class="row settings-page" id="client-client-subpage"><div class="panel panel-default"> {# === HEADER: título + acciones === #} <div class="panel-heading clearfix"> <h5 class="panel-title pull-left" style="padding-top:7px;"> <i class="icon-pencil text-vivid_sky_blue"></i> {% trans %}Editar Expediente{% endtrans %} </h5> <div class="pull-right btn-group" role="toolbar"> {# WEB Cotización #} <div class="btn-group"> <button class="btn bg-btn-lavender_gray dropdown-toggle btn-gl" type="button" id="dropdownMenuCotizacion" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> {% trans %}WEB Cotización{% endtrans %} <span class="caret"></span> </button> <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuCotizacion" role="menu"> <li> <a href="{{ urlCotizacion }}" target="_blank"> {% trans %}Ver web{% endtrans %} </a> </li> <li> <a href="#" onclick="copyProposalLink('{{ urlCotizacion }}'); return false;"> {% trans %}Copiar URL{% endtrans %} </a> </li> </ul> </div> {% if aveFile is defined %} {% if aveFile is not empty %} <a href="/avexpress/fileedit/{{ aveFile.id }}" target="_blank" class="btn bg-btn-green_av btn-gl text-white -align-left">{% trans %}Expediente AV{% endtrans %}</a> {% endif %} {% endif %} {% if htFile is defined %} {% if htFile is not empty %} <a href="/higotrigo/ht/file/{{ htFile.id }}/edit" target="_blank" class="btn bg-btn-orange_cat btn-gl">{% trans %}Expediente Catering{% endtrans %} </a> {% endif %} {% endif %} {% if viewContract %} <div class="btn-group"> <button class="btn bg-btn-lavender_gray dropdown-toggle btn-gl" type="button" id="dropdownMenuContrato" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> {% trans %}Contratos{% endtrans %} <span class="caret"></span> </button> <ul class="dropdown-menu dropdown-menu-right" aria-labelledby="dropdownMenuContrato" role="menu" style="min-width: 250px;"> {% for contract in reservationContracts %} <li class="dropdown-header" style="font-weight: bold; color: #333; background: #f9f9f9; padding: 10px;"> {{ contract.model.title|default('Contrato ' ~ loop.index) }} </li> <li> <a href="/pdf/venuescontract/{{ contract.id }}" target="_blank"> <i class="icon-file-pdf"></i> {% trans %}Versión PDF{% endtrans %} </a> </li> <li> <a href="/venues/contract/{{ contract.id }}" target="_blank"> <i class="icon-pencil"></i> {% trans %}Versión Editable{% endtrans %} </a> </li> {% if not loop.last %}<li class="divider"></li>{% endif %} {% endfor %} </ul> </div> {% endif %} {# Acciones principales #} {% if clientId != 0 %} <a href="/venues/payment/{{ id }}" class="btn bg-btn-limerick btn-gl"> {% trans %}Pagos y Proformas de Depósito{% endtrans %} <i class="icon-coin-euro position-right"></i> </a> <a href="/venues/selinvoice/{{ id }}" class="btn bg-btn-vivid_sky_blue btn-gl"> {% trans %}Facturación{% endtrans %} <i class="icon-eye8 position-right"></i> </a> {% endif %} <a href="/venues/summary/prices/{{ id }}" class="btn bg-btn-rich_black btn-gl"> {% trans %}Resumen Económico{% endtrans %} <i class="icon-balance position-right"></i> </a> <a href="#" class="btn bg-btn-vivid_sky_blue btn-gl" data-toggle="modal" data-target="#tracingsModal" style="color: white;"> <i class="icon-history position-left"></i> Seguimientos <span class="badge" style="background-color: rgba(0,0,0,0.2); color: white;">{{ tracings|length }}</span> </a> <a href="/venues/delete/{{ id }}" class="btn bg-btn-trash btn-gl" onclick="return confirm('¿Deseas CANCELAR esta reserva por completo?');"> {% trans %}Cancelar Reserva{% endtrans %} <i class="icon-cancel-circle2 position-right"></i> </a> </div> </div> {# === BODY === #} <div class="panel-body"> <div class="row settings-page" id="client-client-subpage"> {# flashbags #} {% for flashMessage in app.session.flashbag.get('mensajereservation') %} <div class="hidden alertFlashMensaje" data-mensaje="{{ flashMessage }}"></div> {% endfor %} {% for flashMessage in app.session.flashbag.get('mensajereservationerror') %} <div class="hidden alertFlashMensajeError" data-mensajeerror="{{ flashMessage }}"></div> {% endfor %} <div class="col-xs-12"> <div class="margen-15"></div> {# CONTENIDO PRINCIPAL (antes estaba en otro panel) #} <div class="panel panel-default"> <div class="panel-body"> <style> .stepper { display: flex; justify-content: space-between; align-items: center; padding: 20px; border-radius: 10px; color: white; margin-bottom: 30px; } .step { text-align: center; position: relative; flex: 1; } .step:not(:last-child)::after { content: ""; position: absolute; top: 24px; right: -50%; height: 4px; width: 100%; background: #d3d3d3; z-index: 0; transition: background-color 0.5s ease; } .step.completed:not(:last-child)::after { background: #32aaf0; } .step .icon { background: #fff; border-radius: 50%; padding: 15px; font-size: 24px; z-index: 1; position: relative; display: inline-block; font-family: 'icomoon'; color: #101230; transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275); cursor: pointer; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } .step.completed .icon, .step.active .icon { background: #32aaf0; color: #fafffd; } .step.active .icon { transform: scale(1.15); box-shadow: 0 0 15px rgba(50, 170, 240, 0.4); } .step span { display: block; margin-top: 8px; font-weight: bold; font-size: 14px; color: #d3d3d3; transition: color 0.4s ease, transform 0.4s ease; } .step.completed span { color: #101230; } .step.active span { color: #32aaf0; transform: translateY(2px); } /* Barra de totales fija y centrada */ .totales-fixed { margin: 0 6% 0 20%; position: fixed; left: 0; right: 0; bottom: 12px; z-index: 1030; border-radius: 6px; box-shadow: 0 2px 10px rgba(0,0,0,.5); } .totales-fixed .container { max-width: 860px; } @media (max-width: 768px){ .totales-fixed { bottom: 0; border-radius: 0; } .totales-fixed .container { max-width: 100%; } } </style> {% set pasos = ['Iniciado', 'Cotizado', 'Bloqueo', 'Confirmed', 'Invoiced'] %} {% set iconos = { 'Iniciado': 'icon-play', 'Cotizado': 'icon-coin-euro', 'Bloqueo': 'icon-lock', 'Confirmed': 'icon-checkmark-circle', 'Invoiced': 'icon-file-text' } %} {% set estadoActual = reserva.status %} {% set estadoIndex = -1 %} {% for i in 0..pasos|length - 1 %} {% if pasos[i] == reserva.status %} {% set estadoIndex = i %} {% endif %} {% endfor %} <div class="stepper" id="estado-stepper" data-estado-index="{{ estadoIndex }}"> {% for paso in pasos %} {% set index = loop.index0 %} {% set clase = '' %} {% if index < estadoIndex %} {% set clase = 'completed' %} {% elseif index == estadoIndex %} {% set clase = 'active' %} {% endif %} <div class="step" data-step-index="{{ index }}" data-step-type="{{ clase }}"> <div class="icon {{ iconos[paso] }}"></div> <span>{{ paso|upper }}</span> </div> {% endfor %} </div> {% trans_default_domain 'messages' %} {# Renderiza el inicio del formulario con las clases y atributos necesarios #} {{ form_start(form, { 'action': path('reservations_update', {'id': id}), 'attr': { 'class': 'form-horizontal', 'role': 'form', 'autocomplete': 'off' } }) }} {# --- BLOQUE ESTATICO (NO PARTE DEL FORM OBJECT) --- #} <div class="form-group"> <label class="col-sm-3 control-label">{% trans %}Venues ID{% endtrans %}</label> <div class="col-sm-9"> <b><p class="form-control-static"> #{{ id }} —> {% trans %}Created by Agent{% endtrans %}: {{ createdBy }} ({{ reserva.createdAt|date('d/m/Y') }}) </p></b> </div> </div> {# --- TITULO Y SUCOE --- #} <div class="form-group"> {{ form_label(form.title, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-6"> {{ form_widget(form.title, {'attr': {'class': 'form-control'}}) }} {{ form_errors(form.title) }} </div> <div class="col-sm-3"> <div class="checkbox" style="margin:0"> <label> {# Renderizamos el widget del checkbox y su texto #} {{ form_widget(form.sucoe, {'attr': {'class': 'switchery-info'}}) }} {{ form_label(form.sucoe) }} </label> </div> </div> </div> {# --- CLIENTE Y BOTÓN AÑADIR --- #} <div class="form-group"> {{ form_label(form.client, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-5"> {{ form_widget(form.client, {'attr': {'class': 'form-control select2'}}) }} {{ form_errors(form.client) }} </div> <div class="col-sm-1"> <a href="/client/add" class="btn bg-btn-vivid_sky_blue btn-gl" target="_blank"> {% trans %}Add Client{% endtrans %} <i class="icon-user-plus position-right"></i> </a> </div> </div> {# --- CONTACTO REGISTRADO --- #} <div class="form-group"> <label for="client_contact" class="col-sm-3 control-label">{% trans %}Contacto{% endtrans %}</label> <div class="col-sm-9"> <div class="InputClientContactSpinner"> {# NOTA: Como en el Type definimos 'clientContact' como HiddenType, aquí renderizamos el hidden widget para guardar el dato, y mantenemos tu SELECT HTML manual para la interfaz de usuario que alimenta ese hidden mediante JS. *Idealmente esto debería ser un EntityType Ajax.* #} {{ form_widget(form.clientContact) }} <select class="form-control select2" id="ui_client_contact_selector" onchange="document.getElementById('{{ form.clientContact.vars.id }}').value = this.value;"> <option value="" selected="selected">{% trans %}Seleccione un contacto{% endtrans %}</option> {% for contact in clientsContact %} <option value="{{ contact.id }}" {% if contact.id == form.clientContact.vars.value %}selected{% endif %}> {{ contact.name }} {{ contact.lastName }} ({{ contact.email }}) </option> {% endfor %} </select> </div> <span class="help-block">{{ form_errors(form.clientContact) }}</span> </div> </div> {# --- CONTACTO NO REGISTRADO --- #} <div class="form-group"> <label class="col-sm-3 control-label">{% trans %}Contacto No Registrado{% endtrans %}</label> <div class="col-sm-9"> <div class="row"> <div class="col-sm-4"> {{ form_widget(form.contactUnregistered, {'attr': {'class': 'form-control', 'placeholder': 'Correo electrónico'}}) }} {{ form_errors(form.contactUnregistered) }} </div> <div class="col-sm-4"> {# Asegúrate de añadir nameContactUnregistered al ReservationType #} {{ form_widget(form.nameContactUnregistered, {'attr': {'class': 'form-control', 'placeholder': 'Nombre y apellido'}}) }} {{ form_errors(form.nameContactUnregistered) }} </div> <div class="col-sm-4"> {# Asegúrate de añadir phoneContactUnregistered al ReservationType #} {{ form_widget(form.phoneContactUnregistered, {'attr': {'class': 'form-control', 'placeholder': 'Teléfono'}}) }} {{ form_errors(form.nameContactUnregistered) }} </div> </div> </div> </div> {# --- STATUS --- #} <div class="form-group"> {{ form_label(form.status, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-3"> {# NOTA: La lógica compleja de "disabled" (confirmable/cotizable) debería manejarse en el FormType mediante eventos o 'choice_attr'. Aquí renderizamos el widget estándar. #} {{ form_widget(form.status, {'attr': {'class': 'form-control select2'}}) }} {{ form_errors(form.status) }} </div> </div> {# --- DIAS BLOQUEO / FECHA LIMITE --- #} <div class="form-group"> <label class="col-sm-3 control-label"> {{ form_label(form.daysBlock) }} / {{ form_label(form.days) }} </label> <div class="col-sm-3"> {% set daysBlockAttrs = {'class': 'form-control'} %} {# Aplicar lógica visual basada en el valor del status #} {% if form.status.vars.value == 'Bloqueo' %} {% set daysBlockAttrs = daysBlockAttrs|merge({'disabled': 'disabled'}) %} {% endif %} {{ form_widget(form.daysBlock, {'attr': daysBlockAttrs}) }} {{ form_errors(form.daysBlock) }} </div> <div class="col-sm-3"> {{ form_widget(form.days, {'attr': {'class': 'form-control', 'id': 'days', 'placeholder': 'Fecha límite bloqueo'}}) }} {{ form_errors(form.days) }} </div> </div> {# --- NOTIFICACION (Solo si es Bloqueo) --- #} <div class="form-group"> {% if form.status.vars.value == 'Bloqueo' %} {{ form_label(form.dateNextMailAlert, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-3"> {{ form_widget(form.dateNextMailAlert, {'attr': {'class': 'form-control'}}) }} </div> {% else %} {# Renderiza el campo oculto para que no falte en el submit pero no se vea #} <div style="display:none;"> {{ form_widget(form.dateNextMailAlert) }} </div> {% endif %} </div> {# --- SEGUIMIENTO ELIMINADO DEL FORMULARIO PRINCIPAL --- #} {# --- CAMPOS OCULTOS AUTOMÁTICOS (Priority, Contract, CSRF Token) --- #} {{ form_widget(form.priority) }} {{ form_widget(form.contract) }} {# form_rest renderiza cualquier campo que no hayamos puesto manualmente, incluyendo el _token #} {# --- Comisión entre filiales --- #} <div class="form-group"> {{ form_label(form.comHtGp, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-1"> {{ form_widget(form.comHtGp, { 'attr': { 'class': 'form-control', 'placeholder': '14 (Por defecto)' } }) }} {{ form_errors(form.comHtGp) }} </div> </div> {# --- DESCRIPCION --- #} <div class="form-group"> {{ form_label(form.description, null, {'label_attr': {'class': 'col-sm-3 control-label'}}) }} <div class="col-sm-9"> {{ form_widget(form.description) }} {{ form_errors(form.description) }} </div> </div> {# --- BOTON GUARDAR --- #} <div class="col-md-4 margen-20" style="padding: 5px 15px;"></div> <div class="col-md-4 margen-20" style="padding: 5px 15px;"> <div class="form-group form-group-material"> <div class="text-center"> {{ form_widget(form.save, {'attr': {'class': 'btn bg-btn-limerick btn-block'}}) }} </div> </div> </div> <div class="col-md-4 margen-20" style="padding: 5px 15px;"></div> {{ form_end(form) }} </div> </div> <div class="panel panel-default"> <div class="panel-body"> <!-- ===================== RESERVA DE SALAS (HEADER) ===================== --> <div class="row"> <div class="col-xs-12 text-center"> <h3><strong>{% trans %}RESERVA DE SALAS{% endtrans %}</strong></h3> </div> <div class="col-xs-12"> <legend class="border text-vivid_sky_blue">{% trans %}Salas, Montaje y Desmontaje (Cargar día a día){% endtrans %}</legend> </div> </div> <!-- ===================== FORM: SALAS PRECARGADAS ===================== --> <form name="mds_venuesbundle_revervation_form2" method="post" action="/venues/createsimplelounge/{{ id }}" class="form-inline" role="form" autocomplete="off"> <div class="row" style="margin-bottom:10px"> <div class="col-sm-2"> <div class="form-group"> <label for="reservation_sala_salasPrecargadas" class="control-label"> {% trans %}Salas Precargadas{% endtrans %} * </label> <select id="reservation_sala_salasPrecargadas" name="reservation_sala[salaPrecargadas]" class="form-control select2" required> <option value="">{% trans %}Seleccione una sala{% endtrans %}</option> {% for loungePre in loungesPre %} <option value="{{ loungePre.id }}">{{ loungePre.name|capitalize }}</option> {% endfor %} </select> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label for="reservation_sala_date" class="control-label">{% trans %}Date{% endtrans %} *</label> <input type="date" id="reservation_sala_date" name="reservation_sala[dateStart]" class="form-control" required> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label for="reservation_sala_date" class="control-label">{% trans %}Type{% endtrans %}</label> <select id="reservation_sala_type" name="reservation_sala[type]" class="form-control" style="padding:0px;text-align-last: center;"> <option value="" selected>Día de Evento</option> <option value="Montaje">Montaje</option> <option value="Desmontaje">Desmontaje</option> </select> </div> </div> <!-- Valor base oculto 0 --> <input type="hidden" name="reservation_sala[servicePrice]" id="reservation_sala_price" value="0"> <div class="col-sm-1"> <div class="form-group"> <label for="reservation_sala_hourStart" class="control-label">{% trans %}Inicio{% endtrans %} *</label> <input type="text" class="form-control" name="reservation_sala[hourStart]" id="reservation_sala_hourStart" placeholder="00:00" required> </div> </div> <div class="col-sm-1"> <div class="form-group"> <label for="reservation_sala_hourEnd" class="control-label">{% trans %}Fin{% endtrans %} *</label> <input type="text" class="form-control" name="reservation_sala[hourEnd]" id="reservation_sala_hourEnd" placeholder="00:00" required> </div> </div> <div class="col-sm-1"> <div class="form-group"> <label for="reservation_sala_pax" class="control-label">{% trans %}Pax{% endtrans %}</label> <input type="text" class="form-control" name="reservation_sala[pax]" id="reservation_sala_pax" required> </div> </div> <div class="col-sm-1"> <div class="form-group"> <label for="reservation_sala_servicePrice" class="control-label">{% trans %}Precio{% endtrans %}</label> <input type="number" step="any"{# min="0.01"#} class="form-control" name="reservation_sala[servicePrice]" id="reservation_sala_servicePrice" required> </div> </div> <div class="col-sm-1"> <div class="form-group"> <label for="reservation_sala_idQuote" class="control-label">{% trans %}# Opción{% endtrans %}</label> <input type="number" class="form-control" name="reservation_sala[idQuote]" id="reservation_sala_idQuote"> </div> </div> <div class="col-sm-1"> <div class="form-group"> <label class="control-label" style="display:block"> </label> <div class="input-group">{# <span class="input-group-addon bg-vivid_sky_blue"><i class="icon-plus22"></i></span>#} <span class="group-btn"> <button type="submit" id="reservation_sala_save" name="reservation_sala[save]" class="btn bg-btn-limerick"> {% trans %}Add{% endtrans %} </button> </span> </div> </div> </div> </div> </form> </div> </div> {% if numeroItems > 0 %} {# === Encabezado COTIZADO + selector de idioma === #} <div class="panel panel-default"> <div class="panel-body"> <div class="row"> <div class="col-xs-12"> <strong class="text-vivid_sky_blue"> <legend class="border"> <div class="row"> <div class="col-xs-10"> <h3>{% trans %}COTIZADO{% endtrans %}</h3> </div> <div class="col-xs-2"> {% set firstLevel = arrayLoungesInFile|first %} {% set firstItem = firstLevel|first %} <label for="reservation_idWebLanguage" class="control-label">{% trans %}Idioma web{% endtrans %}</label> <select id="reservation_idWebLanguage" class="form-control" onchange="changeLanguageWeb(this.value)"> {% for language, value in languagesWeb %} <option value="{{ value }}" {% if firstItem.language is null or firstItem.language == value %}selected{% endif %}> {{ language }} </option> {% endfor %} </select> </div> </div> </legend> </strong> </div> </div> <form name="mds_venuesbundle_loungrid" method="post" action="/venues/updateloungegrid" class="form-horizontal" role="form" autocomplete="off"> <input type="hidden" name="reservationId" value="{{ id }}"> {# Mantén sincronizado el idioma seleccionado #} <input type="hidden" name="reservation_global_lounge[language]" id="reservation_global_lounge_language_hidden" value="{{ firstItem.language }}"> {% set idRankQuote = null %} {% for keyRank, itemRankQuote in arrayLoungesByDay %} <div class="row"> <div class="col-md-12"> <h4 class="m-t-10 m-b-10"> <strong style="color: #bdbf09;">{% trans %}Opción{% endtrans %} # {{ keyRank }}</strong> <a class="btn bg-btn-limerick btn-xs" href="/venues/checkquote/{{ id }}/{{ keyRank }}" onclick="return confirm('{% trans %}¿Deseas eliminar todas las otras cotizaciones?{% endtrans %}');"> <i class="icon-check"></i> </a> <a class="btn bg-btn-trash btn-xs" href="/venues/deletequote/{{ id }}/{{ keyRank }}" onclick="return confirm('{% trans %}¿Deseas eliminar la cotización?{% endtrans %}');"> <i class="icon-trash"></i> </a> </h4> </div> </div> {% for key, itemDay in itemRankQuote %} <div class="row"><div class="col-md-12"><br></div></div> <div class="row"> <div class="col-md-1"> <h4 class="text-vivid_sky_blue">{{ key|slice(6,2) }}/{{ key|slice(4,2) }}/{{ key|slice(0,4) }}</h4> </div> <div class="col-md-2"> <a href="/venues/duplicateday/{{ id }}/{{ key|slice(6,2) }}-{{ key|slice(4,2) }}-{{ key|slice(0,4) }}/{{ keyRank }}" class="btn bg-btn-vivid_sky_blue btn-gl"> {% trans %}Duplicar Día{% endtrans %} </a> </div> </div> {# Cabecera de columnas #} <div class="row no-padding" style="margin-top:10px"> <div class="col-md-2"><label class="control-label">{% trans %}Fecha{% endtrans %}</label></div> <div class="col-md-3"><label class="control-label">{% trans %}Sala{% endtrans %}</label></div> <div class="col-md-1"><label class="control-label">{% trans %}Precio{% endtrans %}</label></div> <div class="col-md-2"><label class="control-label">{% trans %}IVA{% endtrans %}</label></div> <div class="col-md-1"> <label class="control-label text-center"> {% set hasMontaje = false %} {% for item in itemDay %} {% if item.type is not null %} {% set hasMontaje = true %} {% endif %} {% endfor %} {% if hasMontaje %}{% trans %}Tipo{% endtrans %}{% else %}{% trans %}Personas{% endtrans %}{% endif %} </label> </div> <div class="col-md-1"><label class="control-label text-center">{% trans %}Inicio{% endtrans %}</label></div> <div class="col-md-1"><label class="control-label text-center">{% trans %}Fin{% endtrans %}</label></div> <div class="col-md-1"></div> </div> {# Filas de edición #} {% for item in itemDay %} {% set idRankQuote = item.rankQuote %} {% set ymd = key|slice(0,4) ~ key|slice(4,2) ~ key|slice(6,2) %} <div class="row no-padding" style="margin-bottom:8px"> <div class="col-md-2"> <input type="date" class="form-control" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][newDate]" id="newDate_{{ item.id }}" value="{{ key|slice(0,4) }}-{{ key|slice(4,2) }}-{{ key|slice(6,2) }}"> </div> <div class="col-md-3"> <input type="text" class="form-control" id="loungeName_{{ item.id }}" value="{{ item.loungeName }}" disabled> {# hidden espejo para enviar el valor #} <input type="hidden" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][name]" value="{{ item.loungeName }}"> </div> <div class="col-md-1"> <input type="number" step="any" class="form-control" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][price]" id="price_{{ item.id }}" value="{{ item.servicePrice }}"> </div> <div class="col-md-2"> {# si debe ser no editable a UX, mantenlo disabled + hidden espejo #} <select class="form-control" id="iva_{{ item.id }}" {% if true %}disabled{% endif %}> <option value="">{% trans %}Selecciona un IVA{% endtrans %}</option> {% for vat in sageVatRates %} <option value="{{ vat.id }}" {% if vat.id == item.sageIva.id %}selected{% endif %}> {{ vat.name }} ({{ vat.iva|number_format(2, '.', '') }}%) </option> {% endfor %} </select> <input type="hidden" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][iva]" value="{{ item.sageIva.id }}"> </div> <div class="col-md-1"> {% if item.type is null %} <input type="number" step="1" class="form-control" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][pax]" id="pax_{{ item.id }}" value="{{ item.pax }}"> {% else %} <input type="text" class="form-control" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][type]" id="type_{{ item.id }}" value="{{ item.type }}" readonly> {% endif %} </div> <div class="col-md-1"> <input type="text" class="form-control text-center" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][dateHourMinStart]" id="start_{{ item.id }}" value="{{ item.dateStart|date('H:i') }}"> </div> <div class="col-md-1"> <input type="text" class="form-control text-center" name="lounge[{{ item.id }}][{{ ymd }}][{{ item.loungeName }}][dateHourMinEnd]" id="end_{{ item.id }}" value="{{ item.dateEnd|date('H:i') }}"> </div> <div class="col-md-1"> {% if item.id != 0 %} <a class="btn bg-btn-trash icon-trash" onclick="return confirm('¿Deseas eliminar este elemento?');" href="/venues/deleteitemsimple/{{ item.id }}/{{ key|slice(6,2) }}-{{ key|slice(4,2) }}-{{ key|slice(0,4) }}" title="{% trans %}Eliminar este elemento{% endtrans %}"></a> {% else %} <a class="btn bg-btn-trash icon-trash" href="/venues/edit/{{ id }}" title="{% trans %}Antes debe guardar el expediente{% endtrans %}"></a> {% endif %} </div> </div> {% endfor %} {% endfor %} {# ====== Bloque de textos por lounge/opción ====== #} {% if arrayLoungesInFile[idRankQuote] is defined and arrayLoungesInFile[idRankQuote] is not empty %} {% for item in arrayLoungesInFile[idRankQuote] %} <div class="row"><div class="col-xs-12"><br></div></div> <div class="row"> <div class="col-xs-12"> <ul class="nav nav-tabs" role="tablist"> <li class="active" role="presentation"> <a href="#resumenDescriptivo-{{item.idLounge}}-{{keyRank}}" aria-controls="resumenDescriptivo-{{item.idLounge}}-{{keyRank}}" role="tab" data-toggle="tab">🌐 {% trans %}Resumen Descriptivo{% endtrans %}</a> </li> <li role="presentation"> <a href="#general-{{item.idLounge}}-{{keyRank}}" aria-controls="general-{{item.idLounge}}-{{keyRank}}" role="tab" data-toggle="tab">🌐 {% trans %}Importante (Texto General){% endtrans %}</a> </li> <li role="presentation"> <a href="#horarios-{{item.idLounge}}-{{keyRank}}" aria-controls="horarios-{{item.idLounge}}-{{keyRank}}" role="tab" data-toggle="tab">🌐 {% trans %}Importante (Horarios){% endtrans %}</a> </li> <li role="presentation"> <a href="#parking-{{item.idLounge}}-{{keyRank}}" aria-controls="parking-{{item.idLounge}}-{{keyRank}}" role="tab" data-toggle="tab">🌐 {% trans %}Importante (Parking){% endtrans %}</a> </li> </ul> <div class="tab-content"> <div role="tabpanel" class="tab-pane active" id="resumenDescriptivo-{{item.idLounge}}-{{keyRank}}"> <div class="col-md-12"> <textarea name="reservation_global_lounge[{{ item.idLounge }}][importantDescription]" class="form-control summernote resumenDescriptivo-{{ item.idLounge }}-editor" rows="3">{{ item.loungeImportantDescription }}</textarea> </div> </div> <div role="tabpanel" class="tab-pane" id="general-{{item.idLounge}}-{{keyRank}}"> <div class="col-md-12"> <textarea name="reservation_global_lounge[{{ item.idLounge }}][importantDescGeneralText]" class="form-control summernote-small general-{{ item.idLounge }}-editor">{{ item.loungeImportantDescGeneralText }}</textarea> </div> </div> <div role="tabpanel" class="tab-pane" id="horarios-{{item.idLounge}}-{{keyRank}}"> <div class="col-md-12"> <textarea name="reservation_global_lounge[{{ item.idLounge }}][importantDescSchedules]" class="form-control summernote-small horarios-{{ item.idLounge }}-editor">{{ item.loungeImportantDescSchedules }}</textarea> </div> </div> <div role="tabpanel" class="tab-pane" id="parking-{{item.idLounge}}-{{keyRank}}"> <div class="col-md-12"> <textarea name="reservation_global_lounge[{{ item.idLounge }}][importantDescParking]" class="form-control summernote-small parking-{{ item.idLounge }}-editor">{{ item.loungeImportantDescParking }}</textarea> </div> </div> </div> </div> </div> {% endfor %} {% endif %} {% if not loop.last %} <div class="row"><div class="col-md-12"><br><hr><br></div></div> {% endif %} {% endfor %} <div class="row"> <div class="col-md-4 margen-20" style="padding-top: 5px;"></div> <div class="col-md-4 margen-20" style="padding-top: 5px;"> <button type="submit" name="mds_venuesbundle_reservation[save]" class="btn bg-btn-limerick btn-block"> {% trans %}Guardar Cotizaciones{% endtrans %} </button> </div> <div class="col-md-4 margen-20" style="padding-top: 5px;"></div> </div> </form> <form name="mds_greenpatiobundle_addquote" method="post" action="/venues/duplicatequote" class="form-horizontal" role="form" autocomplete="off"> <input type="hidden" class="form-control" name="addquote[reservationId]" id="reservationId" value="{{ id }}"> <div class="col-md-12"></div> <div class="col-md-12"><br><br><br><br></div> <div class="col-md-12"> <div class="col-md-5"></div> <div class="col-md-3"> <select id="reservation_sala_salasPrecargadas" name="addquote[salaPrecargadas]" class="form-control| select2" required> <option value="">{% trans %}Seleccione una sala{% endtrans %}</option> {% for loungePre in loungesPre %} <option value="{{ loungePre.id }}">{{ loungePre.name|capitalize }} </option> {% endfor %} </select> </div> <div class="col-md-1"><input type="number" class="form-control" step="any" name="addquote[salaPrice]" id="addquote_price" placeholder="Precio"></div> <div class="col-md-1"><input type="number" class="form-control" step="any" name="addquote[idQuote]" id="addquote_idQuote" placeholder="# Opción" title="Número de opción que deseas duplicar"></div> <div class="col-md-1 ml-5"> <div class="form-group form-group-material"> <div class="input-group">{# <span class="input-group-addon bg-teal-800"><i class="icon-add"></i></span>#} <button type="submit" id="mds_greenpatiobundle_reservation_addquote" name="mds_greenpatiobundle_reservation[save]" class="btn bg-btn-vivid_sky_blue">Duplicar Opción</button> </div> </div> </div> </div> </form> <div class="col-md-12"> <div class="col-md-11"></div> <div class="col-md-1"> <a href="{{ path('reservations_log_historic', { id: reserva.id }) }}" class="btn bg-btn-limerick btn-xs" title="Historico de Cotizaciones"> <i class="fa fa-book"></i> Registro </a> </div> </div> </div> </div>{# <script>#}{# // Mantener sincronizado el hidden de idioma con el select visible#}{# (function(){#}{# var sel = document.getElementById('reservation_idWebLanguage');#}{# var hid = document.getElementById('reservation_global_lounge_language_hidden');#}{# if(sel && hid){#}{# sel.addEventListener('change', function(){ hid.value = this.value; });#}{# }#}{# })();#}{# </script>#} {% endif %} {% if estadoActual in ['Confirmed', 'Invoiced'] %} <div class="panel bg-rich_black text-mint_cream" style="margin: 0 300px 80px 300px"> <div class="panel-body text-center"> <div class="col-sm-12 "> <div class="col-sm-4"> <H4>{% trans %}Sale Client Global{% endtrans %}</H4> <H3>{{ totales_global_con_iva|number_format(2, '.', ',') }} €</H3> </div> <div class="col-sm-4"> <H4>{% trans %}IVA{% endtrans %}</H4> <H3>{{ totales_global_iva|number_format(2, '.', ',') }} €</H3> </div> <div class="col-sm-4"> <H4>{% trans %}Sale No Vat{% endtrans %}</H4> <H3>{{ totales_global_neto|number_format(2, '.', ',') }} €</H3> </div> </div> </div> </div> {% endif %} {# Con <div id="btn_srv" usamos el _fragment para el salto al insertar un servicio #} <div id="btn_srv" class="panel panel-default"> <div class="panel-body text-center"> <div class="col-sm-12 "> <div class="row"> <div class="col-xs-12 text-center"> <h3><strong>{% trans %}Add Services to Reservation{% endtrans %}</strong></h3> </div> </div> <div class="col-sm-12 no-padding"> <div class="panel panel-default" style="border: none"> <div class="panel-body"> <div class="row text-center srv-icons"> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/3/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Audiovisuales{% endtrans %}"> <img src="/assets/images/icon/audiovisuales.png" alt="{% trans %}Audiovisuales{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/17/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Personal de Seguridad{% endtrans %}"> <img src="/assets/images/icon/seguridad.png" alt="{% trans %}Personal de Seguridad{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/18/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}WiFi{% endtrans %}"> <img src="/assets/images/icon/wifi.png" alt="{% trans %}WiFi{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/15/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Project Manager{% endtrans %}"> <img src="/assets/images/icon/asistencia.png" alt="{% trans %}Project Manager{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/11/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}F&B (Catering){% endtrans %}"> <img src="/assets/images/icon/catering.png" alt="{% trans %}F&B (Catering){% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/21/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Limpieza{% endtrans %}"> <img src="/assets/images/icon/limpieza.png" alt="{% trans %}Limpieza{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/20/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Parking{% endtrans %}"> <img src="/assets/images/icon/parking.png" alt="{% trans %}Parking{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/19/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Mobiliario{% endtrans %}"> <img src="/assets/images/icon/mobiliario.png" alt="{% trans %}Mobiliario{% endtrans %}" height="80"> </button> </form> </div> <div class="col-xs-1 margen-10"> <form method="post" action="/venues/reservations/white/services/add/12/{{ id }}"> <button type="submit" class="btn-icon" title="{% trans %}Otros{% endtrans %}"> <img src="/assets/images/icon/otros.png" alt="{% trans %}Otros{% endtrans %}" height="80"> </button> </form> </div> </div> </div> </div> </div> {% if services is not empty %} <form name="mds_venuesbundle_servicegrid" method="post" action="/venues/updateservicegrid/{{ id }}" class="form-horizontal" role="form" autocomplete="off"> <div class="col-sm-12" style="padding-left: 0px; padding-right: 0px"> <div class="panel panel-default"> <div class="panel-body"> <div class="col-md-10 col-xs-10" ><strong class="text-vivid_sky_blue text-left"> <legend class="border">{% trans %}Services{% endtrans %}</legend></strong> </div> </div> {% for service in services %} {% set loopIndex = loop.index %} {% if service.currency is empty %} {% set currency = 'Euro' %} {% else %} {% set currency = service.currency %} {% endif %} {% set contcolor = service.contcolor %} {% set error_commission = '' %} {% if service.commission is empty or service.commission =='0' %} {% set error_commission = 'has-error' %} {% endif %} {% set error_over = '' %} {% if service.over is empty or service.over =='0' %} {% set error_over = 'has-error' %} {% endif %} {% set error_iva = '' %} {% if service.sageIva is empty or service.sageIva is null %} {% set error_iva = 'has-error' %} {% endif %} {% if service.opCommission is empty %} {% set option_opcommission = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% else %} {% if service.opCommission == '0' %} {% set option_opcommission = '<option value="0" selected="selected">-</option><option value="1">+</option>' %} {% elseif service.opCommission == '1' %} {% set option_opcommission = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% endif %} {% endif %} {% if service.opOver is empty %} {% set option_opover = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% else %} {% if service.opOver == '0' %} {% set option_opover = '<option value="0" selected="selected">-</option><option value="1">+</option>' %} {% elseif service.opOver == '1' %} {% set option_opover = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% endif %} {% endif %} {% if service.opIva is empty %} {% set option_opiva = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% else %} {% if service.opIva == '0' %} {% set option_opiva = '<option value="0" selected="selected">-</option><option value="1">+</option>' %} {% elseif service.opIva == '1' %} {% set option_opiva = '<option value="1" selected="selected">+</option><option value="0">-</option>' %} {% endif %} {% endif %} {% set fondo_color = 'white' %} {% if service.serviceId == '0' and service.serviceCatId != "16"%} {% set message_presentation = 'This service has no presentation because it has not been added to the supplier as a service'|trans %} {% set name_presentation = 'Service without presentation'|trans %} {% set boton_presentation = 'Save Service in Supplier'|trans %} {% set no_presentacion_tip = '<span data-popup="tooltip-custom" title="' ~ message_presentation ~'"><span class="label text-danger-800"><b>' ~ name_presentation ~':</b></span></span>' %} {% set no_presentacion = ' <div class="panel-footer"> <span class="label text-danger-800"><b>' ~ name_presentation ~':</b></span> <span class="label text-grey-800"><i class"text-grey">' ~ message_presentation ~'.</i> |</span> <a class="text-teal boton_services_supplier_proposal" href="/supplier/services/fromproposal/' ~ service.serviceCatName|lower ~ '/add/' ~ service.id ~ '">' ~ boton_presentation ~ '</a></i> </div>' %} {% else %} {% set message_presentation = '' %} {% set name_presentation = '' %} {% set no_presentacion_tip = '' %} {% set no_presentacion = '' %} {% endif %} {% if service.serviceCatId =="1" %} {% set name_days_night = "Nights" %} {% else %} {% set name_days_night = "Days" %} {% endif %} {% if service.serviceCatId =="1" %} {% set name_days_night = "Nights" %} {% else %} {% set name_days_night = "Days" %} {% endif %} {% set additional = '' %} <div id="{{ service.id }}" class="panel panel-default margin-right-20 border-left-{{ contcolor }} {{ fondo_color }} panel-collapsed" style="margin: 0 25px 25px 25px"> <div class="panel-heading"> <div class="panel-title text-left"> <div class="row"> <div class="col-xs-12 col-md-6"> <b class="text-vivid_sky_blue">{% trans %}Service{% endtrans %}: {% if not (service.serviceCatName|trans == 'Menú') %} {{ service.serviceCatName|trans }} {% else %} Catering {% endif %} {% if (service.name is not null) %} - {{ service.name }}{% endif %}</b> {% autoescape %}{{ additional|raw }}{% endautoescape %} </div> <div class="col-xs-12 col-md-5 text-right"> {% if not service.toinvoice %} <p class="m-0" style="margin-bottom: 0;"><small class="bg-trash text-white" style="padding: 5px 10px; border-radius: 3px;">{{ 'EXPENSE'|trans({}) }}</small></p> {% endif %} </div> </div> </div> <div class="heading-elements"> <ul class="icons-list"> <li><a data-action="collapse"></a></li> </ul> </div> </div> {% if not (service.serviceCatId == 15) %} <div class="panel-body"> <div class="form-group"> <div class="col-sm-11"> <div class="col-sm-12"> {% if not (service.serviceCatId == 15) %} <div class="col-sm-3" style="padding-bottom: 10px; padding-left: 0px; "> <label class="control-label" for="services_opcommission">{% trans %}Supplier{% endtrans %}:</label> <div class="form-group form-group-material"> <select name="services[{{ service.id }}][supplier]" class="form-control" style="padding:0px;text-align-last: center;"> <option value="0">{% trans %}Select a Supplier{% endtrans %}</option> {% for supplier in listSupplier %} {% if supplier.id == service.supplierId %} <option value="{{ supplier.id }}" selected="selected">{{ supplier.company }}</option> {% else %} <option value="{{ supplier.id }}">{{ supplier.company }}</option> {% endif %} {% endfor %} </select> </div> </div> {% endif %} {% if service.serviceCatId == 15 %} <div class="col-sm-2" style="padding-bottom: 10px; padding-left: 0px; "> <label class="control-label" for="services_agent">{% trans %}Agente{% endtrans %}:</label> <div class="form-group form-group-material"> <select id="services_agent" name="services[{{ service.id }}][agent]" class="form-control" style="padding:0px;text-align-last: center;"> <option value="0">{% trans %}Selecciona un agente{% endtrans %}</option> {% for user in allUsersActive %} {% if (service.assistantId is not empty) and (user.id == service.assistantId or ((user.id * (-1)) == service.assistantId)) %} {% if user.role == 'Freelance' %} <option value="{{ user.team }}" selected="selected">{{ user.name }} {{ user.lastname }}</option> {% else %} <option value="{{ user.id }}" selected="selected">{{ user.name }} {{ user.lastname }}</option> {% endif %} {% else %}{# FreeLance no registrado en el sistema #} {% if user.role == 'Freelance' %} <option value="{{ user.team }}">{{ user.name }} {{ user.lastname }}</option> {% else %} <option value="{{ user.id }}">{{ user.name }} {{ user.lastname }}</option> {% endif %} {% endif %} {% endfor %} </select> </div> </div> {% endif %} </div> <div class="col-sm-3"> <label class="control-label" for="services_name">{% trans %}Title{% endtrans %}: </label> <input type="text" id="services_name_{{ service.id }}" name="services[{{ service.id }}][name]" value="{{ service.name }}" class="form-control"> </div> <div class="col-md-2 col-xs-12"> <label class="control-label" for="services_price"> <span data-popup="tooltip-custom" title="{% trans %}Price with VAT or without VAT{% endtrans %}"> <b class="text-rich_black">{% trans %}Price{% endtrans %}</b>: </span> </label> <input type="text" id="services_price_{{ service.id }}" name="services[{{ service.id }}][price]" value="{{ service.price|number_format(2, ',', '.') }}" class="form-control bg-{{ contcolor }}-300"> </div> {% if not (service.serviceCatId == 15) %} <div class="col-md-1 col-xs-6"> <label class="control-label" for="services_units">{% trans %}Units{% endtrans %}: </label> <input type="number" id="services_units_{{ service.id }}" name="services[{{ service.id }}][units]" value="{{ service.units }}" class="form-control"> </div> <div class="col-md-1 col-xs-12"> <label class="control-label" for="services_pax">{% trans %}Pax{% endtrans %}: </label> <input type="number" id="services_pax_{{ service.id }}" name="services[{{ service.id }}][pax]" value="{{ service.pax }}" class="form-control"> </div> {% endif %} <div class="col-md-5 col-xs-12"> {% autoescape %} <div class="col-md-2 col-xs-6 no-padding-right"> <label class="control-label" for="services_opcommission" >-/+: </label> <div class="form-group form-group-material"> <select id="services_opcommission_{{ service.id }}" name="services[{{ service.id }}][opCommission]" class="form-control" style="padding:0px;text-align-last: center;"> {{ option_opcommission|raw }} </select> </div> </div> <div class="col-md-2 col-xs-6 no-padding-left"> <label class="control-label" for="services_commission">{% trans %}Commission{% endtrans %}(%) </label> <div class="form-group form-group-material {{ error_commission }}"> <input type="text" id="services_commission_{{ service.id }}" name="services[{{ service.id }}][commission]" value="{{ service.commission|number_format(2, ',', '.') }}" class="form-control"> </div> </div>{# <div class="col-md-2 col-xs-6 no-padding-right">#}{# <label class="control-label" for="services_opover">-/+: </label>#}{# <div class="form-group form-group-material">#}{# <select id="services_opover_{{ service.id }}" name="services[{{ service.id }}][opOver]" class="form-control" style="padding:0px;text-align-last: center;">#}{# {{ option_opover|raw }}#}{# </select>#}{# </div>#}{# </div>#} <div class="col-md-2 col-xs-6 no-padding-right" hidden> <label class="control-label" for="services_opover{{ service.id }}">-/+: </label> <div class="form-group form-group-material"> <select id="services_opover_{{ service.id }}" name="services[{{ service.id }}][opOver]" class="form-control" style="padding:0px;text-align-last: center;" hidden> <option value="1" selected>+</option> <option value="0">-</option> </select> </div> </div> <div class="col-md-2 col-xs-6 no-padding-left"> <label class="control-label" for="services_over">{% trans %}Over{% endtrans %}(€) </label> <div class="form-group form-group-material {{ error_over }}"> <input type="text" id="services_over_{{ service.id }}" name="services[{{ service.id }}][over]" value="{{ service.over }}" class="form-control"> </div> </div> <div class="col-md-2 col-xs-6 no-padding-right" hidden> <label class="control-label" for="services_opiva">-/+: </label> <div class="form-group form-group-material"> <select id="services_opiva_{{ service.id }}" name="services[{{ service.id }}][opIva]" class="form-control" style="padding:0px;text-align-last: center;"> {{ option_opiva|raw }} </select> </div> </div> {% if not (service.serviceCatId == 15) %} <div class="col-md-4 col-xs-6 no-padding-left"> <label class="control-label" for="services_iva">{% trans %}Iva{% endtrans %}: </label> <div class="form-group form-group-material {{ error_iva }}"> <select id="services_iva_{{ service.id|default('new') }}" name="services[{{ service.id|default('new') }}][iva]" class="form-control" style="width: 100%;"> {# Añadimos el style para asegurar el ancho #} <option value="">Selecciona un IVA</option> {% for vat in sageVatRates %} <option value="{{ vat.id }}" {% if service.sageIva is not null and vat.id == service.sageIva.id %}selected{% endif %}> {{ vat.name }} ({{ vat.iva|number_format(2, '.', '') }}%) </option> {% endfor %} </select> </div> </div> {% endif %} {% endautoescape %} </div> <div class="col-sm-9 margen-10"> <div class="col-sm-2 col-xs-6"> <label class="control-label" for="services_currency">{% trans %}Currency{% endtrans %}: </label> <input type="text" id="services_currency_{{ service.id }}" name="services[{{ service.id }}][currency]" value="{{ currency }}" class="form-control"> </div> <div class="col-sm-2 no-padding"> <label class="control-label" for="services_hour"><i class="icon-watch2"></i> {% trans %}Star{% endtrans %}: </label> <input type="time" id="services_start_{{ service.id }}" name="services[{{ service.id }}][start]" value="{{ service.dateInAt|date('H:i') }}" class="form-control"> </div> <div class="col-sm-3"> <label class="control-label" for="services_dateInAt">{% trans %}Date In{% endtrans %}: </label> <input type="date" id="services_dateInAt_{{ service.id }}" name="services[{{ service.id }}][dateInAt]" value="{{ service.dateInAt|date('d-m-Y') }}" class="form-control"> </div> <div class="col-sm-3"> <label class="control-label" for="services_dateOutAt">{% trans %}Date Out{% endtrans %}: </label> <input type="date" id="services_dateOutAt_{{ service.id }}" name="services[{{ service.id }}][dateOutAt]" value="{{ service.dateOutAt|date('d-m-Y') }}" class="form-control"> </div> <div class="col-sm-2 no-padding"> <label class="control-label" for="services_hour"><i class="icon-watch2"></i> {% trans %}End{% endtrans %}: </label> <input type="time" id="services_hour_{{ service.id }}" name="services[{{ service.id }}][end]" value="{{ service.dateOutAt|date('H:i') }}" class="form-control"> </div> </div> <div class="col-md-3" style="padding-top: 35px;"> <div class="checkbox-switchery text-left switchery-sm"> <label > {% if service.toinvoice is empty %} <input type="checkbox" id="service_toinvoice_{{ service.id }}" name="services[{{ service.id }}][toinvoice]" class="switchery-info" value="0"/> {% else %} {% if service.toinvoice %} <input type="checkbox" id="service_toinvoice_{{ service.id }}" name="services[{{ service.id }}][toinvoice]" class="switchery-info" value="1" checked/> {% else %} <input type="checkbox" id="service_toinvoice_{{ service.id }}" name="services[{{ service.id }}][toinvoice]" class="switchery-info" value="0"/> {% endif %} {% endif %} {% trans %}Aparece en factura{% endtrans %} </label> </div> </div> <div class="col-md-3" style="padding-top: 35px;"> <div class="checkbox-switchery text-left switchery-sm"> <label > {% if service.viewInfo is empty %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="0"/> {% else %} {% if service.viewInfo %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="1" checked/> {% else %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="0"/> {% endif %} {% endif %} {% trans %}Add extra information to the web quotation{% endtrans %} </label> </div> </div> </div> <div class="col-sm-1 margen-5"> <div class="col-xs-12"> </div> <div class="col-xs-12" style="padding-top: 15px; padding-left: 0px"> <div class="checkbox checkbox-switchery switchery-lg switchery-double text-center" title="Eliminar este item"> {#<input type="checkbox" class="switchery-info boolDelete" id="services_delete_{{ service.id }}" name="services_{{ service.id }}[boolDelete]" value="1">#} <a target="_self" class="btn bg-btn-trash btn-block icon-trash padding-3" onclick="return confirm('¿Deseas eliminar este elemento?');" href="/venues/deleteitemservice/{{ service.id }}/{{ id }}" title="Eliminar este elemento"></a> </div> </div> </div> </div> </div> {% else %} {# ---------------- ASISTENCIA ---------------- #} <div class="panel-body"> <div class="form-group"> {% if (service.serviceCatId == 15) %} <div class="col-sm-3" style="padding-bottom: 10px; padding-left: 0px; "> <label class="control-label" for="services_opcommission">{% trans %}Supplier{% endtrans %}:</label> <div class="form-group form-group-material"> <select name="services[{{ service.id }}][supplier]" class="form-control" style="padding:0px;text-align-last: center;"> <option value="0">{% trans %}Select a Supplier{% endtrans %}</option> {% for supplier in listSupplier %} {% if supplier.id == service.supplierId %} <option value="{{ supplier.id }}" selected="selected">{{ supplier.company }}</option> {% else %} <option value="{{ supplier.id }}">{{ supplier.company }}</option> {% endif %} {% endfor %} </select> </div> </div> {% endif %} <div class="col-sm-11"> <div class="col-sm-2" style="padding-bottom: 10px; padding-left: 0px; "> <label class="control-label" for="services_agent">{% trans %}Agente{% endtrans %}:</label> <div class="form-group form-group-material"> <select id="services_agent_{{ service.id }}" name="services[{{ service.id }}][agent]" class="form-control" style="padding:0px;text-align-last: center;"> <option value="0">{% trans %}Selecciona un agente{% endtrans %}</option> {% for user in allUsersActive %} {% if (service.assistantId is not empty) and (user.id == service.assistantId or ((user.id * (-1)) == service.assistantId)) %} {% if user.role == 'Freelance' %} <option value="{{ user.team }}" selected="selected">{{ user.name }} {{ user.lastname }}</option> {% else %} <option value="{{ user.id }}" selected="selected">{{ user.name }} {{ user.lastname }}</option> {% endif %} {% else %} {# FreeLance no registrado en el sistema #} {% if user.role == 'Freelance' %} <option value="{{ user.team }}">{{ user.name }} {{ user.lastname }}</option> {% else %} <option value="{{ user.id }}">{{ user.name }} {{ user.lastname }}</option> {% endif %} {% endif %} {% endfor %} </select> </div> </div> <div class="col-sm-2"> <label class="control-label" for="services_name">{% trans %}Title{% endtrans %}: </label> <input type="text" id="services_name_{{ service.id }}" name="services[{{ service.id }}][name]" value="{{ service.name }}" class="form-control"> </div> <div class="col-md-2 col-xs-12"> <label class="control-label" for="services_price"> <span data-popup="tooltip-custom" title="{% trans %}Price with VAT or without VAT{% endtrans %}"> <b class="text-rich_black">{% trans %}Price{% endtrans %}</b>: </span> </label> <input type="text" id="services_price_{{ service.id }}" name="services[{{ service.id }}][price]" value="{{ service.price }}" class="form-control bg-{{ contcolor }}-300"> </div> {#<input type="hidden" id="services_supplier" name="services[{{ service.id }}][supplier]" value="0" class="form-control">#} {#<input type="hidden" id="services_opiva_{{ service.id }}" name="services[{{ service.id }}][opIva]" value="1" class="form-control">#} {#<input type="hidden" id="services_iva_{{ service.id }}" name="services[{{ service.id }}][iva]" value="21" class="form-control">#} <input type="hidden" id="services_currency_{{ service.id }}" name="services[{{ service.id }}][currency]" value="{{ currency }}" class="form-control"> <input type="hidden" id="services_units_{{ service.id }}" name="services[{{ service.id }}][units]" value="{{ service.units }}" class="form-control"> <input type="hidden" id="services_pax_{{ service.id }}" name="services[{{ service.id }}][pax]" value="{{ service.pax }}" class="form-control"> <br> <div class="col-md-5 col-xs-12"> {% autoescape %} <div class="col-md-2 col-xs-6 no-padding-right"> <label class="control-label" for="services_opcommission" >-/+: </label> <div class="form-group form-group-material"> <select id="services_opcommission_{{ service.id }}" name="services[{{ service.id }}][opCommission]" class="form-control" style="padding:0px;text-align-last: center;"> {{ option_opcommission|raw }} </select> </div> </div> <div class="col-md-2 col-xs-6 no-padding-left"> <label class="control-label" for="services_commission">{% trans %}Commission{% endtrans %}: </label> <div class="form-group form-group-material {{ error_commission }}"> <input type="text" id="services_commission_{{ service.id }}" name="services[{{ service.id }}][commission]" value="{{ service.commission }}" class="form-control"> </div> </div> <div class="col-md-2 col-xs-6 no-padding-right"> <label class="control-label" for="services_opover">-/+: </label> <div class="form-group form-group-material"> <select id="services_opover_{{ service.id }}" name="services[{{ service.id }}][opOver]" class="form-control" style="padding:0px;text-align-last: center;"> {{ option_opover|raw }} </select> </div> </div> <div class="col-md-2 col-xs-6 no-padding-left"> <label class="control-label" for="services_over">{% trans %}Over{% endtrans %}: </label> <div class="form-group form-group-material {{ error_over }}"> <input type="text" id="services_over_{{ service.id }}" name="services[{{ service.id }}][over]" value="{{ service.over }}" class="form-control"> </div> </div> {% if (service.serviceCatId == 15) %} <div class="col-md-2 col-xs-6 no-padding-right"> <label class="control-label" for="services_opiva">-/+: </label> <div class="form-group form-group-material"> <select id="services_opiva_{{ service.id }}" name="services[{{ service.id }}][opIva]" class="form-control" style="padding:0px;text-align-last: center;"> {{ option_opiva|raw }} </select> </div> </div> {% endif %} {% if (service.serviceCatId == 15) %} <div class="col-md-2 col-xs-6 no-padding-left"> <label class="control-label" for="services_iva">{% trans %}Iva{% endtrans %}: </label> <div class="form-group form-group-material {{ error_iva }}"> <select id="services_iva_{{ service.id }}" name="services[{{ service.id }}][iva]" class="form-control" style="width: 100%;" required> {# Aquí quitamos el disabled #} <option value="">Selecciona un IVA</option> {% for vat in sageVatRates %} <option value="{{ vat.id }}" {% if service.sageIva is not null and vat.id == service.sageIva.id %}selected{% endif %}> {{ vat.name }} ({{ vat.iva|number_format(2, '.', '') }}%) </option> {% endfor %} </select> </div> </div> {% endif %} {% endautoescape %} </div> <div class="col-sm-8 margen-10"> <div class="col-sm-2 no-padding"> <label class="control-label" for="services_hour"><i class="icon-watch2"></i> {% trans %}Star{% endtrans %}: </label> <input type="time" id="services_start_{{ service.id }}" name="services[{{ service.id }}][start]" value="{{ service.dateInAt|date('H:i') }}" class="form-control"> </div> <div class="col-sm-4"> <label class="control-label" for="services_dateInAt">{% trans %}Date In{% endtrans %}: </label> <input type="date" id="services_dateInAt_{{ service.id }}" name="services[{{ service.id }}][dateInAt]" value="{{ service.dateInAt|date('d-m-Y') }}" class="form-control"> </div> <div class="col-sm-4"> <label class="control-label" for="services_dateOutAt">{% trans %}Date Out{% endtrans %}: </label> <input type="date" id="services_dateOutAt_{{ service.id }}" name="services[{{ service.id }}][dateOutAt]" value="{{ service.dateOutAt|date('d-m-Y') }}" class="form-control"> </div> <div class="col-sm-2 no-padding"> <label class="control-label" for="services_hour"><i class="icon-watch2"></i> {% trans %}End{% endtrans %}: </label> <input type="time" id="services_hour_{{ service.id }}" name="services[{{ service.id }}][end]" value="{{ service.dateOutAt|date('H:i') }}" class="form-control"> </div> </div> <div class="col-md-4" style="padding-top: 35px;"> <div class="checkbox-switchery text-left switchery-sm"> <label > {% if service.viewInfo is empty %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="0"/> {% else %} {% if service.viewInfo %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="1" checked/> {% else %} <input type="checkbox" id="service_viewInfo_{{ service.id }}" name="services[{{ service.id }}][viewinfo]" class="switchery-info" value="0"/> {% endif %} {% endif %} {% trans %}View Info{% endtrans %} </label> </div> </div> </div> <div class="col-sm-1 margen-5"> <div class="col-xs-12"> </div> <div class="col-xs-12" style="padding-top: 15px; padding-left: 0px"> <div class="checkbox checkbox-switchery switchery-lg switchery-double text-center" title="Eliminar este item"> <a target="_self" class="btn bg-btn-trash btn-block icon-trash padding-3" onclick="return confirm('¿Deseas eliminar este elemento?');" href="/venues/deleteitemservice/{{ service.id }}/{{ id }}" title="Eliminar este elemento"></a> </div> </div> </div> </div> </div> {% endif %} </div> {% endfor %} </div> </div> <div class="col-md-4 margen-20" style="padding-top: 5px; padding-left: 15px;padding-right: 15px"></div> <div class="col-md-4 margen-20" style="padding-top: 5px; padding-left: 15px;padding-right: 15px"> <div class="form-group form-group-material"> <div class="text-center"> <button type="submit" id="mds_venuesbundle_servicegrid_save" name="mds_venuesbundle_servicegrid[save]" class="btn bg-btn-limerick btn-block">Guardar Servicios</button> </div> </div> </div> <div class="col-md-4 margen-20" style="padding-top: 5px; padding-left: 15px;padding-right: 15px"></div> <div class="col-md-4 margen-20" style="padding-top: 5px; padding-left: 15px;padding-right: 15px"></div> </form> {% endif %} </div> </div> </div> {% if estadoActual in ['Confirmed', 'Invoiced'] %} <div class="panel bg-rich_black text-mint_cream" style="margin: 0 300px 80px 300px"> <div class="panel-body text-center"> <div class="col-sm-12 "> <div class="col-sm-4"> <H4>{% trans %}Sale Client Global{% endtrans %}</H4> <H3>{{ totales_global_servicios_con_iva|number_format(2, '.', ',') }} €</H3> </div> <div class="col-sm-4"> <H4>{% trans %}IVA{% endtrans %}</H4> <H3>{{ totales_global_servicios_iva|number_format(2, '.', ',') }} €</H3> </div> <div class="col-sm-4"> <H4>{% trans %}Sale No Vat{% endtrans %}</H4> <H3>{{ totales_global_servicios_neto|number_format(2, '.', ',') }} €</H3> </div> </div> </div> </div> {% endif %} <div class="panel panel-default"> <div class="panel-body text-center"> <div class="col-sm-12 "> <div class="col-sm-6"> <b class="text-gray-light">{% trans %}Beneficio{% endtrans %}</b> <br> <b> {{ benefit|number_format(2, '.', ',') }} €</b> </div> <div class="col-sm-6"><b class="text-gray-light">{% trans %}Beneficio (%){% endtrans %}</b><br><b> {{ percBenefit|number_format(2, '.', ',') }} %</b></div> <br><br><br> <div class="col-sm-12"><b class="text-gray-light">{% trans %}Resumen de Beneficio{% endtrans %}</b> {% for lounge in payedLounges %} <br><b>{{ lounge.loungeName }} + {{ lounge.servicePrice|number_format(2, '.', ',') }} €</b> {% endfor %} {% for service in payedServices %} <br><b>{{ service.name }} + {{ service.price|number_format(2, '.', ',') }} €</b> {% endfor %} {% for service in unPayedServices %} {#Se verifica el check de toinvoice por si el servicio se facturara a futuro#} {% if service.toinvoice %} <br><b>{{ service.name }} + {{ service.price|number_format(2, '.', ',') }} €</b> {% else %} <br><b>{{ service.name }} - {{ service.price|number_format(2, '.', ',') }} €</b> {% endif %} {% endfor %} </div> </div> </div> </div> {#--------------------------------------------------------------- AGENDA --------------------------------------------------------------- #} <div class="panel panel-default"> <div class="panel-body"> <div class="col-sm-12"> <div class="panel"> <div class="panel-body"> <div class="col-md-12 col-xs-12"> <strong class="text-info"> <legend class="border-teal-800">{% trans %}AGENDA{% endtrans %}</legend> </strong> </div> <div class="col-sm-12"> {# ====================== RENDER DEL ÁRBOL ====================== #} <style> .agenda-container { background-color: #fff; border-radius: 4px; overflow: hidden; border: 1px solid #eee; } .agenda-row { display: flex; align-items: flex-start; padding: 4px 10px; border-bottom: 1px solid #f9f9f9; transition: all 0.1s ease; min-height: 32px; } .agenda-row:hover { background-color: #f5faff; } .agenda-row:last-child { border-bottom: none; } .agenda-content { flex: 1; min-width: 0; font-family: 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; font-size: 13px; color: #444; line-height: 1.6; white-space: pre-wrap; word-wrap: break-word; } /* Estilos por tipo de línea */ .agenda-row.header .agenda-content { font-weight: 700; color: #000; text-transform: uppercase; font-size: 12px; letter-spacing: 0.5px; padding-top: 5px; } .agenda-row.header-2 .agenda-content { font-weight: 600; color: #333; padding-left: 20px; } .agenda-row.header-3 .agenda-content { font-style: italic; color: #666; padding-left: 30px; } .agenda-row.day .agenda-content { font-weight: bold; color: #d9534f; padding-left: 30px; } .agenda-row.item .agenda-content { padding-left: 50px; } .agenda-actions { flex-shrink: 0; min-width: 140px; text-align: right; padding-left: 10px; } </style> <div class="agenda-container"> {% for linea in arregloLineasAgenda %} <div class="agenda-row {{ linea.type }}"> <div class="agenda-content"> {{- linea.text -}} </div> <div class="agenda-actions"> {% if linea.id %} <div class="btn-group"> <button class="btn bg-btn-limerick btn-xs" data-toggle="modal" data-target="#modalEditar" title="Editar (Ref. {{ linea.numberLine }})" data-url="{{ path('reservation_agenda_item_edit', { id: linea.id }) }}"> <i class="fa fa-edit"></i> (Ref. {{ linea.numberLine }}) </button> <button class="btn bg-btn-vivid_sky_blue btn-xs" data-toggle="modal" data-target="#modalAgregarLinea" data-url="{{ path('reservation_agenda_item_duplicate', { id: linea.id }) }}" aria-label="Duplicar línea" title="Duplicar línea"> <i class="fa fa-copy"></i> </button> <a href="{{ path('reservation_agenda_item_delete', { id: linea.id }) }}" onclick="return confirm('¿Deseas eliminar la línea?');" class="btn bg-btn-trash btn-xs" title="Borrar"> <i class="fa fa-trash"></i> </a> </div> {% endif %} </div> </div> {% endfor %} </div> <div class="col-sm-12"><hr></div> {# ====================== FORMULARIO PARA AGREGAR ITEM ====================== #} <div class="col-sm-12 text-right margen-10"> <div class="btn-group"> <button class="btn bg-btn-limerick btn-sm" data-toggle="modal" data-target="#modalAgregarLinea" data-url="{{ path('reservation_agenda_item_add', { reservationId: id }) }}" > <i class="fa fa-plus"></i> Añadir línea </button> <a href="{{ path('reservation_agenda_print', { reservationId: id }) }}" target="_blank" class="btn bg-btn-vivid_sky_blue btn-sm"> <i class="fa fa-eye"></i> Ver Agenda </a> <a href="{{ path('reservations_agenda_pdf', { reservationId: id }) }}" target="_blank" class="btn bg-btn-limerick btn-sm"> <i class="fa fa-file-pdf-o"></i> Pdf Agenda </a> </div> </div> </div> </div> </div> </div> </div> </div> {#--------------------------------------------------------------- AGENDA --------------------------------------------------------------- #} <div class="panel panel-default"> <div class="panel-body"> <div class="col-xs-12" ><strong class="text-vivid_sky_blue"> <legend class="border-teal-800">{% trans %}FACTURACION{% endtrans %}</legend></strong> </div> <div class="col-sm-12 text-center"> <div class="col-sm-12"> <div class="col-sm-1"><b>No.</b></div> <div class="col-sm-2"><b>Fecha de Facturación</b></div> <div class="col-sm-3"><b>Cliente</b></div> <div class="col-sm-1"><b>Neto</b></div> <div class="col-sm-1"><b>Iva</b></div> <div class="col-sm-1"><b>Total</b></div> <div class="col-sm-2"><b>Balance Restante</b></div> <div class="col-sm-1"><b>Acciones</b></div> </div> <div class="col-sm-12"> <hr> </div> {% set totalBalance = 0 %} {% for factura in facturas %} {% set totalBalance = totalBalance + factura.balance %} <div class="col-sm-12 margen-10"> <div class="col-sm-1"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.number }}</p> {% else %} {{ factura.number }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.number }}</p> {% else %} {#Factura rectificativa#} <p style="color:red"> {{ factura.number }} ({{ factura.invoiceToRec.number }})</p> {% endif %} {% endif %} </div> <div class="col-sm-2"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.dateAt|date("d/m/Y") }}</p> {% else %} {{ factura.dateAt|date("d/m/Y") }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.dateAt|date("d/m/Y") }}</p> {% else %} {#Factura rectificativa#} <p style="color:red">{{ factura.dateAt|date("d/m/Y") }}</p> {% endif %} {% endif %} </div> <div class="col-sm-3"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.client.name }}</p> {% else %} {{ factura.client.name|default('') }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.client.name|default('') }}</p> {% else %} {#Factura rectificativa#} <p style="color:red"> {{ factura.client.name|default('') }}</p> {% endif %} {% endif %} </div> <div class="col-sm-1"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.totalNet|number_format(2, '.', ',') }}</p> {% else %} {{ factura.totalNet|number_format(2, '.', ',') }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.totalNet|number_format(2, '.', ',') }}</p> {% else %} {% if factura.type == 'Invoice Deposit Rec' %} {#Factura rectificativa de depósito#} <p style="color:red">{{ factura.totalNet|number_format(2, '.', ',') }}</p> {% else %} {#Factura rectificativa#} <p style="color:red">{{ factura.totalNet|number_format(2, '.', ',') }}</p> {% endif %} {% endif %} {% endif %} </div> <div class="col-sm-1"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.vat|number_format(2, '.', ',') }}</p> {% else %} {{ factura.vat|number_format(2, '.', ',') }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.vat|number_format(2, '.', ',') }}</p> {% else %} {% if factura.type == 'Invoice Deposit Rec' %} {#Factura rectificativa de depósito#} <p style="color:red">{{ factura.vat|number_format(2, '.', ',') }}</p> {% else %} {#Factura rectificativa#} <p style="color:red">{{ factura.vat|number_format(2, '.', ',') }}</p> {% endif %} {% endif %} {% endif %} </div> <div class="col-sm-1"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.total|number_format(2, '.', ',') }}</p> {% else %} {{ factura.total|number_format(2, '.', ',') }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.total|number_format(2, '.', ',') }}</p> {% else %} {% if factura.type == 'Invoice Deposit Rec' %} {#Factura rectificativa de depósito#} <p style="color:red">{{ factura.total|number_format(2, '.', ',') }}</p> {% else %} {#Factura rectificativa#} <p style="color:red">{{ factura.total|number_format(2, '.', ',') }}</p> {% endif %} {% endif %} {% endif %} </div> <div class="col-sm-2"> {% if factura.type == 'Invoice' %} {% if factura.clientType == 'Supplier' %} <p style="color:orange">{{ factura.balance|number_format(2, '.', ',') }}</p> {% else %} {{ factura.balance|number_format(2, '.', ',') }} {% endif %} {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <p style="color:green">{{ factura.balance|number_format(2, '.', ',') }}</p> {% else %} {#Factura rectificativa#} <p style="color:red">{{ factura.balance|number_format(2, '.', ',') }}</p> {% endif %} {% endif %} </div> <div class="col-sm-1"> {% if factura.type == 'Invoice' %} <a class="btn bg-btn-vivid_sky_blue btn-xs" href="/venues/reservations/invoice/viewnew/{{ factura.id }}">{% trans %}Go{% endtrans %}</a> {% else %} {% if factura.type == 'Invoice Deposit' %} {#Factura de depósito#} <a class="btn bg-btn-vivid_sky_blue btn-xs" href="/venues/reservations/newinvoicedeposit/viewinvoicedeposit/{{ factura.id }}">{% trans %}Go{% endtrans %}</a> {% else %} {% if factura.type == 'Invoice Rec' %} {#Factura rectificativa#} <a class="btn bg-btn-vivid_sky_blue btn-xs" href="/venues/reservations/invoice/viewrec/{{ factura.id }}">{% trans %}Go{% endtrans %}</a> {% else %} {% if factura.type == 'Invoice Deposit Rec' %} {#Factura de depósito rectificativa#} <a class="btn bg-btn-vivid_sky_blue btn-xs" href="/venues/reservations/newinvoicedeposit/viewinvoicedepositrec/{{ factura.id }}">{% trans %}Go{% endtrans %}</a> {% endif %} {% endif %} {% endif %} {% endif %} </div> </div> {% endfor %} {% for item in paymentNotIvoiced %} {% if item.invoiceId is empty %} {% set totalBalance = totalBalance - item.Amount %} {% else %} {% set totalBalance = totalBalance - 0 %} {% endif %} <div class="col-sm-12 margen-10"> <div class="col-sm-1"></div> <div class="col-sm-2"> <p style="color:blue">{{ item.DatePayAt|date("d/m/Y") }}</p> </div> <div class="col-sm-3"> <p style="color:blue">{{ item.WayToPay }}</p> </div> <div class="col-sm-1"></div> <div class="col-sm-1"></div> <div class="col-sm-1"></div> <div class="col-sm-2"> {% if item.invoiceId is empty %} <p style="color:blue">-{{ (item.Amount)|number_format(2, '.', ',') }}</p> {% else %} <p style="color:blue">-{{ (item.AmountTotal)|number_format(2, '.', ',') }}</p> {% endif %} </div> <div class="col-sm-1"></div> </div> {% endfor %} <div class="col-sm-12"> <hr> </div> <div class="col-sm-12"> <div class="col-sm-offset-6 col-sm-1"><b>Neto</b><br>{{ resultados.totalNeto|number_format(2, '.', ',') }}</div> <div class="col-sm-1"><b>Iva</b><br>{{ resultados.vat|number_format(2, '.', ',') }}</div> <div class="col-sm-1"><b>Total</b><br>{{ resultados.total|number_format(2, '.', ',') }}</div> <div class="col-sm-2"><b>Balance Restante</b><br>{{ totalBalance|number_format(2, '.', ',') }}</div> </div> </div> </div> </div> {# -------------------------- Proformas de Reserva -------------------------- #} <div class="panel panel-default"> <div class="panel-body"> <div class="col-xs-12" ><strong class="text-vivid_sky_blue"> <legend class="border-teal-800">{% trans %}PROFORMAS DE RESERVA{% endtrans %}</legend></strong> </div> <div class="col-sm-12 text-center"> <div class="col-sm-12"> <div class="col-sm-4"><b>{% trans %}Numero de Proforma{% endtrans %}</b></div> <div class="col-sm-4"><b>{% trans %}Fecha de Creación{% endtrans %}</b></div> <div class="col-sm-4"><b>{% trans %}Acciones{% endtrans %}</b></div> </div> <div class="col-sm-12"> <hr> </div> {% for proforma in allReservationProformas %} <div class="col-sm-12 margen-10"> <div class="col-sm-4"> <p style="color:blue">{{ proforma.prefix }}</p> </div> <div class="col-sm-4"> {{ proforma.createdAt|date("d/m/Y") }} </div> <div class="col-sm-4"> <a class="btn bg-btn-vivid_sky_blue btn-xs" href="{{ path('reservations_viewnew_proforma', {'id': proforma.id}) }}">{% trans %}Go{% endtrans %}</a> </div> </div> {% else %} <div class="col-sm-12 margen-10 text-muted"> {% trans %}Sin proformas asociadas a esta reserva.{% endtrans %} </div> {% endfor %} </div> </div> </div> {# -------------------------- Depósitos -------------------------- #} <div class="panel panel-default"> <div class="panel-body"> <div class="col-xs-12" ><strong class="text-vivid_sky_blue"> <legend class="border-teal-800">{% trans %}DEPÓSITOS PROFORMA{% endtrans %}</legend></strong> </div> <div class="col-sm-12 text-center"><br><br><br></div> <div class="col-sm-12 text-center"> <div class="col-sm-12"> <div class="col-sm-2"><b>Numero de Proforma</b></div> <div class="col-sm-2"><b>Fecha del Depósito</b></div> <div class="col-sm-3"><b>Monto</b></div> <div class="col-sm-3"><b>Pendiente</b></div> <div class="col-sm-2"><b>Acciones</b></div> </div> <div class="col-sm-12"> <hr> </div> {% for proforma in proformas %} {% set total = proforma.total|default(0) %} {% set paid = (sumsByProforma[proforma.id].paid|default(0)) %} {% set remaining = (total - paid) %} {% set number = proforma.number %} <div class="col-sm-12 margen-10"> <div class="col-sm-2"> {{ number }} </div> <div class="col-sm-2"> {{ proforma.dateAt|date('d/m/Y') }} </div> <div class="col-sm-3"> {{ total }} </div> <div class="col-sm-3"> {{ remaining }} </div> <div class="col-sm-2"> {% set anyDeposit = proforma.deposits|first %} <button class="btn bg-btn-vivid_sky_blue js-show-payments" data-deposit-id="{{ anyDeposit.id }}" data-url="{{ path('deposit_payments_modal', { id: anyDeposit.id }) }}" data-toggle="modal" data-target="#paymentsModal"> Pagos </button> </div> </div> {% endfor %} {% for depósito in depositsAll %} {% if depósito.proformaDeposit is null %} <div class="col-sm-12 margen-10"> <div class="col-sm-2">N/A</div> <div class="col-sm-2">{{ depósito.date|date('d/m/Y') }}</div> <div class="col-sm-3">{{ depósito.amount }}</div> <div class="col-sm-3">0</div> <div class="col-sm-2"> <button class="btn bg-btn-vivid_sky_blue js-show-payments" data-deposit-id="{{ depósito.id }}" data-url="{{ path('deposit_payments_modal', { id: depósito.id }) }}" data-toggle="modal" data-target="#paymentsModal"> Pagos </button> </div> </div> {% endif %} {% endfor %} <div class="col-sm-12"> <hr> </div> </div> </div> </div> {# -------------------------- Facturas de Depósitos -------------------------- #} <div class="panel panel-default"> <div class="panel-body"> <div class="col-xs-12" ><strong class="text-vivid_sky_blue"> <legend class="border-teal-800">{% trans %}Payments{% endtrans %}</legend></strong> </div> <div class="col-sm-12 text-center"> <div class="col-sm-12"> {#<div class="col-sm-1"><b>No.</b></div>#} <div class="col-sm-3"><b>Expediente</b></div> <div class="col-sm-3"><b>Fecha de Pago</b></div> <div class="col-sm-3"><b>Forma de Pago</b></div> <div class="col-sm-3"><b>Monto</b></div> </div> <div class="col-sm-12"> <hr> </div> {# Asegúrate de cerrar bien los bloques superiores #} <div class="row"> {% for payment in paymentsAll %} <div class="col-sm-12 margen-10"> <div class="row"> {# Añadimos un row interno para las sub-columnas #} <div class="col-sm-3">{{ payment.reservationId }}</div> <div class="col-sm-3">{{ payment.datePayAt|date('d/m/Y') }}</div> <div class="col-sm-3">{{ payment.wayToPay }}</div> <div class="col-sm-3">{{ payment.amount|number_format(2, '.', ',') }}</div> </div> </div> {% endfor %} </div> </div> </div> </div> </div> </div> </div> {# Panel flotante de totales #} {% if estadoActual in ['Confirmed', 'Invoiced'] %} <div class="navbar-fixed-bottom bg-vivid_sky_blue text-mint_cream" style="left: 300px; right: 20px; padding: 15px; border-top: 2px solid #fff; z-index: 9999;"> <div class="container-fluid"> <div class="row text-center p-10"> <div class="col-xs-4 border-right border-mint_cream"> <span class="text-size-small text-uppercase">{% trans %}Sale Client Global{% endtrans %}</span><br> <span class="text-bold text-size-large">{{ sumatoria_totales_global_con_iva|number_format(2, '.', ',') }} €</span> </div> <div class="col-xs-4 border-right border-mint_cream"> <span class="text-size-small text-uppercase">{% trans %}IVA{% endtrans %}</span><br> <span class="text-bold text-size-large">{{ sumatoria_totales_global_iva|number_format(2, '.', ',') }} €</span> </div> <div class="col-xs-4"> <span class="text-size-small text-uppercase">{% trans %}Sale No Vat{% endtrans %}</span><br> <span class="text-bold text-size-large">{{ sumatoria_totales_global_neto|number_format(2, '.', ',') }} €</span> </div> </div> </div> </div> {% endif %} <div class="modal fade" id="paymentsModal" tabindex="-1" role="dialog" aria-labelledby="paymentsModalLabel"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Cerrar"> <span aria-hidden="true">×</span> </button> <h4 class="modal-title" id="paymentsModalLabel">Pagos</h4> </div> <div class="modal-body"> <p class="text-muted" id="paymentsModalLoading"> Cargando… </p> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button> </div> </div> </div> </div> <div class="modal fade" id="modalEditar" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Editar línea de la agenda</h5> <button type="button" class="close" data-dismiss="modal"> <span>×</span> </button> </div> <div class="modal-body"> <div id="modalEditarContenido"> Cargando... </div> </div> </div> </div> </div> <div class="modal fade" id="modalAgregarLinea" tabindex="-1" role="dialog"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Añadir línea a la agenda</h5> <button type="button" class="close" data-dismiss="modal"> <span>×</span> </button> </div> <div class="modal-body"> <div id="modalAgregarContenido"> Cargando formulario ... </div> </div> </div> </div> </div> <!-- Modal Seguimientos --> <div id="tracingsModal" class="modal fade" role="dialog"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header bg-btn-limerick"> <button type="button" class="close" data-dismiss="modal">×</button> <h5 class="modal-title"><i class="icon-history position-left"></i> Gestión de Seguimientos</h5> </div> <div class="modal-body"> {# Formulario AJAX Nuevo Seguimiento #} <div class="panel panel-body"> <h6 class="text-semibold" style="margin-top:0;">Añadir nuevo seguimiento</h6> <form id="ajax-tracing-form" onsubmit="submitTracingAjax(event)"> <div class="row"> <div class="col-sm-4"> <div class="form-group"> <label>Fecha de aviso a futuro</label> <div class="input-group"> <span class="input-group-addon"><i class="icon-calendar22"></i></span> <input type="date" id="tracingDateAjax" class="form-control" required /> </div> </div> </div> <div class="col-sm-6"> <div class="form-group"> <label>Texto recordatorio</label> <input type="text" id="tracingTextAjax" class="form-control" placeholder="Escribe tu recordatorio..." required /> </div> </div> <div class="col-sm-2"> <div class="form-group"> <label> </label> <button type="submit" class="btn bg-btn-limerick btn-block" id="btn-save-tracing" data-loading-text="<i class='icon-spinner4 spinner'></i>"> Guardar </button> </div> </div> </div> </form> </div> <h6 class="text-semibold"><i class="icon-list3 position-left"></i> Historial de Seguimientos Planificados</h6> <div id="tracing-history-container"> {% if tracings|length > 0 %} <div class="table-responsive"> <table class="table table-bordered table-striped text-size-small"> <thead> <tr class="bg-light"> <th style="width: 15%">Fecha Aviso</th> <th style="width: 65%">Mensaje</th> <th style="width: 20%">Registro</th> </tr> </thead> <tbody> {% for tracing in tracings %} {% set todayStr = 'now'|date('Y-m-d') %} {% set tracingDateStr = tracing.dateAt|date('Y-m-d') %} {% if tracingDateStr < todayStr %} {% set labelClass = 'label-default' %} {% elseif tracingDateStr == todayStr %} {% set labelClass = 'label-warning bg-orange' %} {% else %} {% set labelClass = 'bg-vivid_sky_blue' %} {% endif %} <tr> <td> <span class="label text-vivid_sky_blue label-block"> <i class="icon-calendar3 position-left" style="font-size:10px;"></i> {{ tracing.dateAt|date('d-m-Y') }} </span> </td> <td>{{ tracing.text }}</td> <td><span class="text-muted"><i class="icon-clock3 position-left text-size-mini"></i>{{ tracing.createdAt|date('d-m-Y H:i') }}</span></td> </tr> {% endfor %} </tbody> </table> </div> {% else %} <div class="alert alert-info" style="margin-bottom:0;"> No hay seguimientos registrados para esta reserva. </div> {% endif %} </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Cerrar ventana</button> </div> </div> </div> </div>{% endblock %}{% block javascripts %} {{ parent() }} {# Carga de librerías externas #} <script type="text/javascript" src="{{ asset('assets/js/plugins/editors/summernote/summernote.min.js') }}"></script> <script type="text/javascript" src="{{ asset('assets/js/plugins/croppie/croppie.js') }}"></script> <script type="text/javascript" src="{{ asset('assets/js/plugins/forms/styling/switchery.min.js') }}"></script> <script type="text/javascript" src="{{ asset('assets/js/plugins/loaders/blockui.min.js') }}"></script> <script type="text/javascript" src="{{ asset('assets/js/plugins/forms/selects/select2.min.js') }}"></script> {# Scripts de página - Asegúrate de que existan en estas rutas #} <script type="text/javascript" src="{{ asset('assets/js/pages/venues/add-simple-reservation.js') }}"></script> <script type="text/javascript" src="{{ asset('assets/js/pages/venues/services-invoice-select-items.js') }}"></script> {# <script type="text/javascript" src="{{ asset('assets/js/pages/datetime.js') }}"></script> #} <script type="text/javascript" src="{{ asset('assets/js/pages/venues/switchery-services.js') }}"></script> <script> $(document).ready(function() { // 0. Inicialización de Select2 $('.select2').select2({ width: '100%' }); // 1. Configuración de Summernote $('.summernote-small').summernote({ height: 150, minHeight: 150, maxHeight: 150, disableResizeEditor: true, }); // 2. Selectores de Fechas y Días const $inputDias = $('#reservation_daysBlock'); const $inputFecha = $('#days'); // Tu campo de fecha en el HTML tiene id="days" const $selectStatus = $('#mds_venuesbundle_reservation_status'); // 3. Función de sincronización: Días -> Fecha (Hoy + N días) function updateFechaDesdeDias() { let n = parseInt($inputDias.val(), 10); if (isNaN(n)) return; let d = new Date(); d.setHours(0,0,0,0); d.setDate(d.getDate() + n); // Formato YYYY-MM-DD para el input de tipo date let iso = d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0'); $inputFecha.val(iso); } // 4. Función de sincronización: Fecha -> Días function updateDiasDesdeFecha() { let str = $inputFecha.val(); if (!str) return; let seleccionada = new Date(str); let hoy = new Date(); hoy.setHours(0,0,0,0); let diffTime = seleccionada - hoy; let diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); $inputDias.val(diffDays >= 0 ? diffDays : 0); } // EXPOSICIÓN GLOBAL: Evita el error "recalculateDeadline is not defined" en consola window.recalculateDeadline = updateFechaDesdeDias; // 5. Asignación de Eventos $inputDias.on('input change', updateFechaDesdeDias); $inputFecha.on('change', updateDiasDesdeFecha); // Ejecución inicial si el estado permite edición if($selectStatus.val() !== 'BLOQUEO') { updateFechaDesdeDias(); } // 6. Lógica del Stepper de Estado (Iniciado, Bloqueo, etc.) const steps = document.querySelectorAll('#estado-stepper .step'); const stepperContainer = document.querySelector('#estado-stepper'); if (stepperContainer && $selectStatus.length > 0) { const estadoIndex = parseInt(stepperContainer.dataset.estadoIndex); steps.forEach((step, index) => { // Animación progresiva de carga if (index <= estadoIndex) { setTimeout(() => { if (index < estadoIndex) { step.classList.add('completed'); } else if (index === estadoIndex) { step.classList.add('active'); } }, index * 250); // Retraso de 250ms entre pasos } // Evento para cambiar el estado al hacer clic en el icono step.addEventListener('click', () => { const newStatusLabel = $(step).find('span').text().trim().toUpperCase(); const $option = $selectStatus.find('option').filter(function() { return $(this).text().trim().toUpperCase() === newStatusLabel; }); if ($option.length && !$option.prop('disabled')) { $selectStatus.val($option.val()); $selectStatus.closest('form').submit(); } }); }); } // 7. Modales de Agenda y Pagos $('#modalEditar, #modalAgregarLinea').on('show.bs.modal', function (event) { var button = $(event.relatedTarget); var url = button.data('url'); var modal = $(this); var contentDiv = modal.find('.modal-body > div'); contentDiv.html("<p class='text-muted'>Cargando...</p>"); $.ajax({ url: url, success: function(data) { contentDiv.html(data); }, error: function() { contentDiv.html("<div class='alert alert-danger'>Error al cargar el contenido.</div>"); } }); }); // Manejo de pagos en modal $(document).on('click', '.js-show-payments', function (e) { e.preventDefault(); var $btn = $(this); var $modal = $('#paymentsModal'); $modal.find('.modal-title').text('Pagos del depósito #' + $btn.data('deposit-id')); $modal.find('.modal-body').html('<p class="text-muted">Cargando…</p>'); $.get($btn.data('url')) .done(function (html) { $modal.find('.modal-body').html(html); }) .fail(function () { $modal.find('.modal-body').html('<div class="alert alert-danger">Error al cargar pagos.</div>'); }); }); }); // 8. Cambio de Idioma Web {#function changeLanguageWeb(idLanguage) {#} {# if (confirm("¿Está seguro de que desea cambiar el idioma?")) {#} {# var url = '{{ path("reservations_venues_change_language", { "id": id, "idLanguage": "LANG_ID" }) }}'.replace('LANG_ID', idLanguage);#} {# $.getJSON(url, function(response) {#} {# if (response.status == 200) {#} {# location.reload();#} {# }#} {# });#} {# }#} {#}#} // Genera la URL con placeholders (Ruta de Venues) var changeLanguageUrlTemplate = '{{ path("reservations_venues_change_language", { "id": "ID_PLACEHOLDER", "idLanguage": "LANG_PLACEHOLDER" }) }}'; function changeLanguageWeb(idLanguage) { if (confirm("¿Está seguro de que desea cambiar el idioma? Se perderán todos los cambios del idioma actual.")) { // Reemplaza los placeholders por los valores reales var changeLanguageUrl = changeLanguageUrlTemplate .replace('ID_PLACEHOLDER', {{ id }}) .replace('LANG_PLACEHOLDER', idLanguage); $.ajax({ url: changeLanguageUrl, type: 'GET', dataType: 'json', success: function(response) { if (response.status == 200) { // Actualiza el campo oculto de Venues para que se guarde el idioma correcto $('#reservation_global_lounge_language_hidden').val(idLanguage); // Iteramos sobre las traducciones recibidas $.each(response.idiomas, function(key, data) { if (data !== null) { // Inyectamos el contenido en cada editor de Summernote según sus clases $('.resumenDescriptivo-' + key + '-editor').each(function () { $(this).summernote('code', data.importantDescription); }); $('.general-' + key + '-editor').each(function () { $(this).summernote('code', data.importantDescGeneralText); }); $('.horarios-' + key + '-editor').each(function () { $(this).summernote('code', data.importantDescSchedules); }); $('.parking-' + key + '-editor').each(function () { $(this).summernote('code', data.importantDescParking); }); } }); } else { console.error("Error al cambiar el idioma:", response.statusText); } }, error: function(xhr, status, error) { console.error("Error al cambiar el idioma:", error); } }); } else { // Si el usuario cancela, restauramos visualmente el select al idioma anterior var previousLang = $('#reservation_global_lounge_language_hidden').val(); $('#reservation_idWebLanguage').val(previousLang); return false; }} function submitTracingAjax(e) { e.preventDefault(); var dateVal = $("#tracingDateAjax").val(); var textVal = $("#tracingTextAjax").val(); if(!dateVal || !textVal) { alert("Rellena ambos campos obligatorios."); return; } var btn = $("#btn-save-tracing"); btn.button('loading'); $.ajax({ url: "/venues/tracing/add/{{ id }}", type: "POST", data: { tracingDate: dateVal, tracingText: textVal }, success: function(res) { btn.button('reset'); if(res.status === 'ok') { // Limpiar campos form $("#tracingDateAjax").val(''); $("#tracingTextAjax").val(''); // Recargar con SWAL y reload (o repintar la tabla, pero reload es fiable temporalmente) swal({ title: "¡Guardado!", text: "El seguimiento se ha guardado correctamente.", type: "success", confirmButtonColor: "#2196F3", timer: 1500 }); setTimeout(function() { location.reload(); }, 1500); } else { swal("Error", "No se pudo guardar el seguimiento.", "error"); } }, error: function() { btn.button('reset'); swal("Error", "Ocurrió un error en la conexión.", "error"); } }); }</script><script>// --- Lógica para corregir 00:00 a 23:59 en Venues ---$(document).on('blur change', 'input[name*="End"], input[id^="end_"], input[name*="hourEnd"]', function() { var $input = $(this); var valor = $input.val().trim(); // Comprobamos si el usuario ha puesto 00:00 if (valor === "00:00" || valor === "00.00" || valor === "00") { $input.val("23:59"); // Feedback visual: ponemos el borde en naranja un momento (Bootstrap 3) var $parent = $input.closest('.col-md-1, .form-group'); $parent.addClass('has-warning'); console.log("Venues: Corregida medianoche en " + $input.attr('name')); // Quitamos el aviso visual a los 2 segundos setTimeout(function() { $parent.removeClass('has-warning'); }, 2000); }});</script>{% endblock %}