const navText = [ '', '' ]; const datepickerES = { clearText: 'Borrar', clearStatus: '', closeText: 'Cerrar', closeStatus: 'Cerrar sin modificar', prevText: '<Ant', prevStatus: 'Ver el mes anterior', nextText: 'Sig>', nextStatus: 'Ver el mes siguiente', currentText: 'Hoy', currentStatus: 'Ver el mes actual', monthNames: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'], monthNamesShort: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'], monthStatus: 'Ver otro mes', yearStatus: 'Ver otro año', weekHeader: 'Sm', weekStatus: '', dayNames: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'], dayNamesShort: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'], dayNamesMin: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'], dayStatus: 'Usar DD como primer día de la semana', dateStatus: 'Seleccionar DD, MM de', dateFormat: 'dd/mm/yy', firstDay: 1, initStatus: 'Seleccionar fecha', isRTL: false }; class Web { static inputImporteClass = ".input-importe:not(.input-importe-carrito-crm):not(.input-importe-ticket-devolucion)"; static init() { $(document).ready(function (e) { Web.markUIReady(); Web.initPasswordToggles(); Web.initImporteInputs(); Web.initBotonesToggle(); $.datepicker.setDefaults(datepickerES); $(".tooltipStandardHTML").not(".tooltipstered").tooltipster({animation: 'grow',interactive:true, position:'bottom', contentAsHTML: true}); $('.bootstrap-select').on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) { if (isSelected === null) return; $(this).find("select").removeClass("error"); }); $("body").on("click", ".inp-button-editable + button", function (e) { $(this).parent().find("input, select").prop("disabled", false).prop("readonly", false).focus(); }); $("body").on("click", ".btn-abre-menu, #btn-cerrar-menu-web", function (e) { $("#wrapper > aside").toggleClass("open"); }); }); } static markUIReady() { const enableTransitions = function () { $("body").addClass("ui-ready"); }; if (window.requestAnimationFrame) { window.requestAnimationFrame(function () { window.requestAnimationFrame(enableTransitions); }); return; } setTimeout(enableTransitions, 30); } static notify(msg, error = false) { const type = error ? "danger" : "success"; $.notify({ message: msg, }, { type: type, placement: { from: "bottom", align: "right" }, delay: 2000 }); } static initPedidosNuevosWeb(url, urlTicketsWeb) { if (Web.pedidosNuevosWebInicializado) { return; } Web.pedidosNuevosWebInicializado = true; $(document).ready(function () { const aviso = $("#aviso-pedidos-nuevos-web"); const contadorMenu = $("#num-pedidos-nuevos-web-menu"); const textoAviso = $("#aviso-pedidos-nuevos-web-texto"); const texto = aviso.data("texto") || ""; const pintar = function (numPedidos) { const num = parseInt(numPedidos, 10) || 0; contadorMenu.text(num).toggleClass("d-none", num === 0); textoAviso.text(texto + ": " + num); aviso.toggleClass("d-none", num === 0); }; const consultar = function () { if (Web.pedidosNuevosWebConsultando) { return; } Web.pedidosNuevosWebConsultando = true; $.ajax({ url: url, type: "GET", dataType: "json", data: {accion: "consultar", CSRF: CSRF} }).done(function (response) { if (response && response.error_number >= 0) { pintar(response.numPedidos); } }).always(function () { Web.pedidosNuevosWebConsultando = false; }); }; $("body").on("click", ".nav-item-tickets, #aviso-pedidos-nuevos-web", function (event) { if (contadorMenu.hasClass("d-none")) { return; } event.preventDefault(); if (Web.pedidosNuevosWebMarcando) { return; } Web.pedidosNuevosWebMarcando = true; $.ajax({ url: url, type: "POST", dataType: "json", data: {accion: "marcarVistos", CSRF: CSRF} }).done(function (response) { if (response && response.error_number >= 0) { pintar(0); window.location.href = urlTicketsWeb; } }).always(function () { Web.pedidosNuevosWebMarcando = false; }); }); consultar(); window.setInterval(consultar, 30000); }); } static limpiarImporte(valor) { let valorLimpio = (valor || "").replace(/€/g, "").replace(/\s+/g, ""); valorLimpio = valorLimpio.replace(/[^0-9,]/g, ""); const partes = valorLimpio.split(","); if (partes.length > 1) { const parteEntera = partes.shift(); const parteDecimal = partes.join("").substring(0, 2); valorLimpio = parteEntera + "," + parteDecimal; } return valorLimpio; } static formatearImporte(valor) { const valorLimpio = Web.limpiarImporte(valor); return valorLimpio ? valorLimpio + "€" : ""; } static limpiarComaFinalImporte(valor) { const valorLimpio = Web.limpiarImporte(valor); return valorLimpio.endsWith(",") ? valorLimpio.slice(0, -1) : valorLimpio; } static formatearImporteConEspacio(valor) { const valorFormateado = Web.formatearImporte(valor); if (!valorFormateado) { return ""; } return valorFormateado.replace(/(\S)(€)$/, "$1 $2"); } static formatearImporteConEspacioSinComaFinal(valor) { const valorLimpio = Web.limpiarComaFinalImporte(valor); return Web.formatearImporteConEspacio(valorLimpio); } static posicionarCursorImporte(input) { if (!input || typeof input.setSelectionRange !== "function") { return; } const posicionCursor = Web.limpiarImporte(input.value).length; input.setSelectionRange(posicionCursor, posicionCursor); } static corregirCursorImporte(input) { if (!input || typeof input.setSelectionRange !== "function") { return; } const posicionMaxima = Web.limpiarImporte(input.value).length; const posicionActual = input.selectionStart ?? posicionMaxima; if (posicionActual > posicionMaxima) { input.setSelectionRange(posicionMaxima, posicionMaxima); } } static initImporteInputs() { if (Web.importeInputsEventsBound) { return; } Web.importeInputsEventsBound = true; $("body").on("keydown", Web.inputImporteClass, function (event) { const teclasPermitidas = [ "Backspace", "Delete", "Tab", "Enter", "Escape", "ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End" ]; if (event.ctrlKey || event.metaKey) { return; } if (teclasPermitidas.includes(event.key)) { return; } if (/^[0-9]$/.test(event.key)) { return; } if (event.key === ",") { const valorLimpio = Web.limpiarImporte($(this).val()); if (!valorLimpio.includes(",")) { return; } } event.preventDefault(); }); $("body").on("input", Web.inputImporteClass, function () { $(this).val(Web.formatearImporteConEspacio($(this).val())); Web.posicionarCursorImporte(this); }); $("body").on("focus", Web.inputImporteClass, function () { $(this).val(Web.formatearImporteConEspacio($(this).val())); Web.posicionarCursorImporte(this); }); $("body").on("click", Web.inputImporteClass, function () { Web.corregirCursorImporte(this); }); $("body").on("blur", Web.inputImporteClass, function () { $(this).val(Web.formatearImporteConEspacioSinComaFinal($(this).val())); }); } static initBotonesToggle() { if (Web.botonesToggleEventsBound) return; Web.botonesToggleEventsBound = true; $("body").on("click", ".btn-toggle-active", function () { const boton = $(this); const activo = !boton.hasClass("active"); boton.toggleClass("active", activo).attr("aria-pressed", activo ? "true" : "false"); const idInput = boton.attr("data-input"); if (idInput) $(idInput.charAt(0) === "#" ? idInput : "#" + idInput).val(activo ? "1" : "0"); }); } static initPasswordToggles(scope) { const showLabel = "Mostrar contrase\u00f1a"; const hideLabel = "Ocultar contrase\u00f1a"; const $scope = scope ? $(scope) : $(document); $scope.find("input.password-toggle").each(function (index, element) { const $input = $(element); if (!$input.is('[type="password"], [type="text"]')) { return; } if (!$input.attr("id")) { $input.attr("id", "password-toggle-" + index + "-" + Date.now()); } if (!$input.parent().hasClass("password-toggle-wrap")) { $input.wrap('
'); } let $button = $input.siblings(".password-toggle-button"); if (!$button.length) { $button = $(''); $input.after($button); } const isVisible = $input.attr("type") === "text"; $button .toggleClass("is-visible", isVisible) .attr("aria-controls", $input.attr("id")) .attr("aria-label", isVisible ? hideLabel : showLabel) .attr("aria-pressed", isVisible ? "true" : "false") .attr("title", isVisible ? hideLabel : showLabel); }); if (!Web.passwordToggleEventsBound) { Web.passwordToggleEventsBound = true; $(document).on("click", ".password-toggle-button", function (event) { event.preventDefault(); const $button = $(this); const $input = $button.siblings("input.password-toggle").first(); if (!$input.length) { return; } const isVisible = $input.attr("type") === "text"; const nextType = isVisible ? "password" : "text"; const nextLabel = isVisible ? showLabel : hideLabel; $input.attr("type", nextType).trigger("focus"); $button .toggleClass("is-visible", !isVisible) .attr("aria-label", nextLabel) .attr("aria-pressed", !isVisible ? "true" : "false") .attr("title", nextLabel); }); if (window.MutationObserver) { Web.passwordToggleObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { $(mutation.addedNodes).each(function () { if (this.nodeType === 1) { Web.initPasswordToggles(this); } }); }); }); Web.passwordToggleObserver.observe(document.body, { childList: true, subtree: true }); } } } static refrescaTabla(idTabla) { $(".tooltipStandard").not(".tooltipstered").tooltipster({ animation: 'grow', interactive: true, position: 'bottom', contentAsHTML: true }); $(".inputIconLupa, .inputMostrar, #filtros").removeClass("d-none"); $(".form-control").removeClass().addClass("form-control-b"); const elementFiltros = $("#filtros-tabla.d-none"); if (elementFiltros.length > 0) { $(".table-header-btns").append(elementFiltros).removeClass("d-none"); elementFiltros.removeClass("d-none"); } else { if ($(".table-header-btns #filtros-tabla").length == 0) $(".table-header-btns").addClass("d-none"); } const elementTabs = $("#tabs-tabla.d-none"); if (elementTabs.length) { const columns = $("#" + idTabla + " thead tr th").length; $("#" + idTabla + " thead") .removeClass("d-none") .prepend( $("").append( $("", { colspan: columns, class: "th-tabs-tabla" }).append( elementTabs.removeClass("d-none") ) ) ); } var numItems = 0; let tabla = eval("tabla" + idTabla); if (typeof tabla != "undefined") { numItems = tabla.page.info().recordsDisplay; } else if ($.fn.dataTable.isDataTable('#' + idTabla)) { tabla = $('#' + idTabla).DataTable(); numItems = tabla.page.info().recordsDisplay; } let itemsMostrando = $("#" + idTabla + "_length select").length > 0 ? $("#" + idTabla + "_length select").val() : 10; if (numItems > itemsMostrando) { $("#" + idTabla + "_wrapper .pagination-footer").removeClass("opacity-0"); } else { $("#" + idTabla + "_wrapper .pagination-footer").addClass("opacity-0"); } $("#"+idTabla+" tbody [data-parent-class]:not([data-parent-class=''])").each(function () { $(this).closest("tr").addClass($(this).data("parent-class")); }); Web.aplicaTablaCustomResponsive(idTabla); //Formato movil const numColumnaMv = 1; const numColumnas = tabla.columns()[0].length; if ($("#" + idTabla).hasClass("tablaMovil")) { const w = $(window).outerWidth(); if (w <= 767) //Ocultar { for (let i = 0; i < numColumnas; i++) { tabla.column(i).visible((numColumnaMv == i ? true : false)); } } else //Mostrar { for (let i = 0; i < numColumnas; i++) { let txt = $(tabla.columns(i).header()).text(); tabla.column(i).visible((txt == "oculto" || numColumnaMv == i ? false : true)); } } } } static aplicaTablaCustomResponsive(idTabla) { const tabla = $("#" + idTabla + ".tabla-custom-responsive"); if (!tabla.length) { return; } const etiquetas = tabla.find("thead tr").last().children("th").map(function () { return $.trim($(this).text()); }).get(); tabla.find("tbody tr:not(.child)").each(function () { $(this).children("td").each(function (indice) { const celda = $(this); celda.attr("data-label", etiquetas[indice] || ""); if (!celda.children(".tabla-custom-responsive-valor").length) { celda.contents().wrapAll("
"); } }); }); tabla.find("tbody tr.child").remove(); } static initTabs(elementId, callback) { const element = $("#"+elementId); element.find("button").on("click", function () { element.find("button.active").removeClass("active"); $(this).addClass("active"); if (callback) { callback($(this).attr("data-id")); } }); } } function findPos(obj) { var curtop = 0; if (obj.offsetParent) { do { curtop += obj.offsetTop; } while (obj = obj.offsetParent); return [curtop]; } } function isEmail(email) { var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/; return regex.test(email); } $(document).ready(function () { if ($.fn.dataTable != undefined) { $.fn.dataTable.ext.errMode = function (settings, helpPage, message) { $.notify( { title: "Error: ", message: "Se ha producido un error inesperado", }, { type: 'danger', placement: { from: "top", align: "center" }, delay: 10000 }); }; $.extend($.fn.dataTable.defaults, { "language": { "colvis": "", "sProcessing": "Procesando...", "sLengthMenu": "Filas por página: _MENU_", "sZeroRecords": "No se han encontrado resultados", "sEmptyTable": "Sin datos todavía", "sInfo": "Mostrando de la entrada _START_ a la _END_ de un total de _TOTAL_ entradas", "sInfoEmpty": "Todavía no hay datos", "sInfoFiltered": "()", "sSearchPlaceholder": "Buscar", "sInfoPostFix": "", "sSearch": "", "sUrl": "", "oPaginate": { //"sFirst": " ", "sPrevious": '', "sNext": '', //"sLast": " " } } }); } }); function preparaLugar(pais, provincia, poblacion, idInputPais, idInputProvincia, idInputLocalidad) { if (pais > 0) { actualizaProvincias(idInputLocalidad, idInputProvincia, idInputPais, provincia, pais, provincia, poblacion, undefined); } $('#' + idInputPais).on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) { //console.log(e, clickedIndex, isSelected, previousValue, $(this).val(), $('#frmServicioProvincia').val(), $('#frmServicioProvincia').selectpicker("val")); actualizaProvincias(idInputLocalidad, idInputProvincia, idInputPais, provincia, undefined, undefined, undefined, undefined, undefined, undefined, true); }); /*$("body").on("change", "#"+idInputPais, function() { actualizaProvincias(idInputLocalidad,idInputProvincia, idInputPais, provincia); });*/ if (provincia > 0) { actualizaCiudades(idInputLocalidad, idInputProvincia, idInputPais, poblacion, pais, provincia, poblacion, $("#" + idInputProvincia).val() * 1); } $('#' + idInputProvincia).on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) { //console.log(e, clickedIndex, isSelected, previousValue, $(this).val(), $('#frmServicioProvincia').val(), $('#frmServicioProvincia').selectpicker("val")); if (isSelected === null) return; $('#' + idInputProvincia).removeClass("error"); actualizaCiudades(idInputLocalidad, idInputProvincia, idInputPais, undefined, $("#" + idInputPais).val() * 1, $("#" + idInputProvincia).val() * 1); }); $('#' + idInputLocalidad).on('changed.bs.select', function (e, clickedIndex, isSelected, previousValue) { if (isSelected === null) return; $('#' + idInputLocalidad).removeClass("error"); }); } function actualizaProvincias(idCampoLocalidad, idCampoRegion, idCampoPais, idRegionPreEstablecida, forceIdPais, forceIdRegion, forceIdLocalidad, onFinish, textoSelect, textoLoading, actualizarLocalidad) { if (forceIdPais == undefined) { forceIdPais = $("#" + idCampoPais).val(); } if (forceIdRegion == undefined) { forceIdRegion = $("#" + idCampoRegion).val(); } if (forceIdLocalidad == undefined) { forceIdLocalidad = $("#" + idCampoLocalidad).val(); } if (textoSelect == undefined) { //textoSelect = ""; textoSelect = ""; } //var textoSelectLoc = "Localidad"; var textoSelectLoc = ""; if (textoLoading == undefined) { textoLoading = ""; } var data = {idPais: forceIdPais}; $("#" + idCampoRegion).empty(); $("#" + idCampoRegion).append(""); $("#" + idCampoRegion).selectpicker("refresh"); $("#" + idCampoRegion).selectpicker('val', 0); if (actualizarLocalidad) { $("#" + idCampoLocalidad).empty(); $("#" + idCampoLocalidad).append(""); $("#" + idCampoLocalidad).selectpicker("refresh"); $("#" + idCampoLocalidad).selectpicker('val', 0); } var returned = $.ajax( { url: "https://gestion.elositodeclaudia.com/ajax/ubicacion/Ubicacion.listadoRegiones.php?CSRF=" + CSRF, type: "POST", dataType: "json", data: data, error: function (XMLHttpRequest, textStatus, errorThrown) { //ClassBlockUI.abrirBlockUIEstandarMensaje(XMLHttpRequest.responseText, true); }, success: function (data) { $("#" + idCampoRegion).empty(); $("#" + idCampoRegion).append(""); for (var index in data) { $("#" + idCampoRegion).append(""); } $("#" + idCampoRegion).selectpicker("refresh"); if (idRegionPreEstablecida != undefined && idRegionPreEstablecida != "") { $("#" + idCampoRegion).val(idRegionPreEstablecida); } else { $("#" + idCampoRegion).val(0); } $("#" + idCampoRegion).selectpicker("refresh"); if (actualizarLocalidad) { $("#" + idCampoLocalidad).empty(); $("#" + idCampoLocalidad).append(""); $("#" + idCampoLocalidad).val(0); $("#" + idCampoLocalidad).selectpicker("refresh"); } if (onFinish != undefined && typeof (onFinish) == "function") { onFinish(); } } }); } function actualizaCiudades(idCampoLocalidad, idCampoRegion, idCampoPais, idLocalidadPreEstablecida, forceIdPais, forceIdRegion, forceIdLocalidad, onFinish, textoSelect, textoLoading) { if (forceIdPais == undefined) { forceIdPais = $("#" + idCampoPais).val(); } if (forceIdRegion == undefined) { forceIdRegion = $("#" + idCampoRegion).val(); } if (forceIdLocalidad == undefined) { forceIdLocalidad = $("#" + idCampoLocalidad).val(); } if (textoSelect == undefined) { //textoSelect = ""; textoSelect = ""; } if (textoLoading == undefined) { textoLoading = ""; } var data = { idPais: forceIdPais, idRegion: forceIdRegion }; $("#" + idCampoLocalidad).empty(); $("#" + idCampoLocalidad).append(""); $("#" + idCampoLocalidad).selectpicker("refresh"); $("#" + idCampoLocalidad).selectpicker('val', 0); var returned = $.ajax( { url: "https://gestion.elositodeclaudia.com/ajax/ubicacion/Ubicacion.listadoCiudades.php?CSRF=" + CSRF, type: "POST", dataType: "json", data: data, error: function (XMLHttpRequest, textStatus, errorThrown) { //ClassBlockUI.abrirBlockUIEstandarMensaje(XMLHttpRequest.responseText, true); }, success: function (data) { $("#" + idCampoLocalidad).empty(); $("#" + idCampoLocalidad).append(""); for (var index in data) { $("#" + idCampoLocalidad).append(""); } $("#" + idCampoLocalidad).selectpicker("refresh"); if (idLocalidadPreEstablecida != undefined) { $("#" + idCampoLocalidad).val(idLocalidadPreEstablecida); } else { $("#" + idCampoLocalidad).val(0); } $("#" + idCampoLocalidad).selectpicker("refresh"); if (onFinish != undefined && typeof (onFinish) == "function") { onFinish(); } } }); } /* ClassBlockUI.abrirBlockUIEstandar(contenedorIDAMostrar[, accionCerrar, headerText, extraClass, restaurarElemento]); ClassBlockUI.abrirBlockUIEstandarMensaje(mensaje[, isAlertOrButtons, onClose]); ClassBlockUI.abrirBlockUIConfirm(mensaje, textoBotonAceptar, accionBotonAceptar, textoBotonCancelar[, accionBotonCancelar]); //accionBotonCancelar="close" ClassBlockUI.abrirBlockUIEsperePorFavor:([mensaje]); */ var ClassBlockUI = { restaurarElemento: function(data) { var body = $("body"); var history = body.data('blockUIEstandar.history'); data = data || history; if (!data || data.restaurado) return; data.restaurado = true; data.el.style.display = data.display; data.el.style.position = data.position; if (data.parent) data.parent.appendChild(data.el); if (history === data) { var previous = data.previous; while (previous && previous.restaurado) previous = previous.previous; if (previous) body.data('blockUIEstandar.history', previous); else body.removeData('blockUIEstandar.history'); } $("#"+data.generatedId).remove(); }, abrirBlockUIEstandar: function(contenedorIDAMostrar, accionCerrar, headerText, extraClass, restaurarElemento) { if(restaurarElemento || restaurarElemento == undefined) { while ($("body").data('blockUIEstandar.history')) ClassBlockUI.restaurarElemento(); } $(".modalAutoHide").modal("hide"); if($(".modal").length>0){$("body").addClass("modal-open")} if(contenedorIDAMostrar == undefined || $("#"+contenedorIDAMostrar).length == 0){return;} var blockUIId="blockUI_"+contenedorIDAMostrar; if ($("#"+blockUIId).length) { ClassBlockUI.blockUIEstandarCounter = (ClassBlockUI.blockUIEstandarCounter || 0) + 1; blockUIId += "_" + ClassBlockUI.blockUIEstandarCounter; } extraClass = extraClass == undefined ? "" : extraClass; //modal-lg var object = $("#"+contenedorIDAMostrar); var node = object[0]; var data = {}; data.previous = $("body").data('blockUIEstandar.history'); $("body").data('blockUIEstandar.history', data); data.el = node; data.parent = node.parentNode; data.display = node.style.display; data.position = node.style.position; data.generatedId = blockUIId; data.object = object; if (data.parent) data.parent.removeChild(node); var header = headerText != undefined ? headerText : ""; var message = ''+ ''; $("body").append(message); var modal = $("#"+blockUIId); modal.find(".modal-body").append(node); modal.find(".modal-dialog").addClass("fadeIn"); modal.on('hidden.bs.modal', function () { ClassBlockUI.restaurarElemento(data); }) var myModal = new bootstrap.Modal($(modal)[0], { keyboard: false }) myModal.show(); if(accionCerrar==undefined) //boton cerrar tiene accion por defecto { $("#"+blockUIId+" .btnCerrarModalEquis").click(function(){ myModal.hide(); if($(".modal").length>0){$("body").addClass("modal-open")} }); } else if(accionCerrar==false) //oculta el boton cerrar { $("#"+blockUIId+" .btnCerrarModalEquis").hide(); } else //boton cerrar con accion especial { $("#"+blockUIId+" .btnCerrarModalEquis").click(accionCerrar); } return modal; }, abrirBlockUIEstandarMensaje: function(mensaje, isAlertOrButtons, onClose, extraClass, title) { $(".modalAutoHide").modal("hide"); if($(".modal").length>0){$("body").addClass("modal-open")} var blockUIId="blockUI_"+new Date().getTime(); extraClass = extraClass == null || extraClass == undefined ? "" : extraClass; //modal-lg title = title == null || title == undefined ? "Aviso" : title; if(isAlertOrButtons==undefined) isAlertOrButtons=false; if(onClose==undefined) onClose=false; var botonera = ""; var botoneraEspecial = false; if(isAlertOrButtons === false) { botonera = ""; } else if (isAlertOrButtons === true) { let textoBoton = "Aceptar"; botonera = `
`; } else { botoneraEspecial = true; botonera = "
"; for(var index in isAlertOrButtons) { botonera += " "+isAlertOrButtons[index]["text"]+" "; } botonera += "
"; } var message = ''; message += ''; $("body").append(message); var modal = $("#"+blockUIId); modal.find(".modal-dialog").css("animation-duration", "500ms").addClass("zoomIn"); modal.on('hidden.bs.modal', function () { modal.remove(); }) var myModal = new bootstrap.Modal($(modal)[0], { keyboard: false }); myModal.show(); //Acciones de los botones especiales if(botoneraEspecial) { for(var index in isAlertOrButtons) { if(isAlertOrButtons[index]["action"] == "close") { isAlertOrButtons[index]["action"] = function(){ myModal.hide(); if($(".modal").length>0){$("body").addClass("modal-open")} }; } $("#"+blockUIId+" ."+index).unbind("click").click(isAlertOrButtons[index]["action"]); } } var fnOnClose; if(onClose==false) { fnOnClose = function(){ myModal.hide(); if($(".modal").length>0){$("body").addClass("modal-open")} }; } else if (typeof onClose === "function") { fnOnClose = function(){onClose()}; } else if (onClose == "location") { fnOnClose = function(){window.location.reload()}; } else if (onClose == "back") { fnOnClose = function(){history.go(-1);}; } else { fnOnClose = function(){window.location = onClose}; } $("#"+blockUIId+" .btnCerrarBlockUIAlert, #"+blockUIId+" .btnCerrarModalEquis").unbind("click").click(fnOnClose); return modal; }, abrirBlockUIConfirm: function(mensaje, textoAceptar, accionAceptar, textoCancelar, accionCancelar, extraClass, title) { accionCancelar = accionCancelar == undefined ? "close" : accionCancelar; extraClass = extraClass == null || extraClass == undefined ? "" : extraClass; var buttons = { "btnAceptarBUI_CONFIRM": { "text": textoAceptar, "action": accionAceptar }, "btnCancelarBUI_CONFIRM": { "text": textoCancelar, "action": accionCancelar } }; return ClassBlockUI.abrirBlockUIEstandarMensaje(mensaje, buttons, false, extraClass, title); }, abrirBlockUIEsperePorFavor: function(mensaje) { if(mensaje == undefined){ mensaje = "
Espere por favor...
"; }; return ClassBlockUI.abrirBlockUIEstandarMensaje(mensaje, undefined, false, "modalEspere"); } }; class ClassUsuarios { static initLogin() { $(document).ready(function() { $("#login-contrasena, #login-usuario").pressEnter(doLogin); $("#btn-acceder").click(doLogin); }); function doLogin() { Utils.sendStandardAjax("frm-login", "https://gestion.elositodeclaudia.com/ajax/Usuarios.login.php?CSRF="+CSRF, {successCallback: "data-location"}); } } static initEstadisticas() { $(document).ready(function() { const duracion = 1000; const tiempoPorPaso = 16; const numeroPasos = Math.max(1, Math.ceil(duracion / tiempoPorPaso)); function parsearObjetivo(valorOriginal) { const texto = String(valorOriginal || "").trim(); const tieneEuro = texto.includes("\u20AC"); const textoLimpio = texto.replace(/[^\d,.-]/g, ""); const tieneComaDecimal = textoLimpio.includes(","); const textoNormalizado = tieneComaDecimal ? textoLimpio.replace(/\./g, "").replace(",", ".") : textoLimpio.replace(/^(-?\d{1,3}(?:\.\d{3})+)$/, function(match) { return match.replace(/\./g, ""); }); const valor = parseFloat(textoNormalizado); const decimales = tieneComaDecimal ? textoLimpio.split(",").pop().length : textoNormalizado.includes(".") ? textoNormalizado.split(".").pop().length : 0; return { valor: Number.isFinite(valor) ? valor : 0, decimales, tieneEuro }; } function formatearNumeroEs(valor, decimales) { const numeroFijo = valor.toFixed(decimales); const partes = numeroFijo.split("."); const parteEntera = partes[0].replace(/\B(?=(\d{3})+(?!\d))/g, "."); const parteDecimal = partes[1] ? "," + partes[1] : ""; return parteEntera + parteDecimal; } function formatearValor(valor, decimales, tieneEuro) { const numeroFormateado = formatearNumeroEs(valor, decimales); return tieneEuro ? `${numeroFormateado} \u20AC` : numeroFormateado; } $(".item-estadistica-valor[data-objetivo]").each(function () { const contador = this; const {valor: objetivo, decimales, tieneEuro} = parsearObjetivo(contador.getAttribute("data-objetivo")); const inicio = performance.now(); const incremento = objetivo / numeroPasos; if (objetivo <= 0) { contador.textContent = formatearValor(0, decimales, tieneEuro); return; } function animar(ahora) { const tiempoTranscurrido = ahora - inicio; const pasoActual = Math.floor(tiempoTranscurrido / tiempoPorPaso); const valorActual = Math.min(objetivo, pasoActual * incremento); contador.textContent = formatearValor(valorActual, decimales, tieneEuro); if (tiempoTranscurrido < duracion) { requestAnimationFrame(animar); } else { contador.textContent = formatearValor(objetivo, decimales, tieneEuro); } } requestAnimationFrame(animar); }); }); } } window.ClassUsuarios = ClassUsuarios; class ClassEstadisticas { static chartVentas = null; static chartReservas = null; static chartRankingClientes = null; static tipoVentas = "mes"; static filtrosVentas = { idCategoria: 0, idMarca: 0, tallas: [] }; static initVentas() { $(document).ready(function () { const canvas = document.getElementById("ventas-grafico"); if (!canvas || ClassEstadisticas.chartVentas) { return; } if (window.ChartDataLabels) { Chart.register(ChartDataLabels); } ClassEstadisticas.chartVentas = new Chart(canvas, { type: "bar", data: { labels: [], datasets: [] }, options: { responsive: true, maintainAspectRatio: false, interaction: {mode: "index", intersect: false}, scales: { x: { grid: {display: false, drawBorder: false}, border: {display: false}, ticks: { color: "#666", font: {family: "Inter, serif", size: 12, weight: "500"} } }, y: { grid: {color: "#E6E6E6", drawBorder: false}, border: {display: false}, ticks: { color: "#666", callback: function (valor) { return new Intl.NumberFormat("es-ES", { maximumFractionDigits: 0 }).format(valor) + " €"; } } } }, animations: { y: { easing: 'easeOutCubic', from: (ctx) => { if (ctx.type === 'data') { if (ctx.mode === 'default' && !ctx.dropped) { ctx.dropped = true; return ctx.chart.scales.y.getPixelForValue(0); } } } } }, plugins: { legend: { display: false }, tooltip: { callbacks: { label: function (contexto) { return contexto.dataset.label + ": " + new Intl.NumberFormat("es-ES", { style: "currency", currency: "EUR" }).format(contexto.parsed.y || 0); } } }, datalabels: { display: false } } } }); $("#btn-abre-filtros-estadisticas, .bloque-derecha-cerrar").on("click", function () { $("#filtros-estadisticas").toggleClass("open"); }); const formularioFiltros = $("#filtros-estadisticas"); const selectCategoria = $("#frm-estadistica-categoria"); const selectMarca = $("#frm-estadistica-firma"); const selectTallas = $("#frm-estadistica-tallas"); function actualizarGraficoConFiltros() { ClassEstadisticas.actualizarFiltrosVentas({ idCategoria: selectCategoria.val(), idMarca: selectMarca.val(), tallas: selectTallas.val() }); } selectCategoria.add(selectMarca).add(selectTallas).on("change", actualizarGraficoConFiltros); formularioFiltros.on("reset", function () { window.setTimeout(function () { selectCategoria.val("").selectpicker("refresh"); selectMarca.val("").selectpicker("refresh"); selectTallas.val([]).selectpicker("refresh"); ClassEstadisticas.actualizarFiltrosVentas(); }); }); $(".custom-tabs button[data-tipo]").on("click", function () { const boton = $(this); ClassEstadisticas.tipoVentas = boton.data("tipo"); boton.closest(".custom-tabs").find("button").removeClass("active"); boton.addClass("active"); ClassEstadisticas.cargarVentas(); }); ClassEstadisticas.cargarVentas(); }); } static initRankingClientes() { $(document).ready(function () { const canvas = document.getElementById("ranking-grafico"); if (!canvas || ClassEstadisticas.chartRankingClientes) { return; } const pluginRanking = { id: "pluginRankingClientes", beforeDatasetsDraw: function (chart) { const {ctx, chartArea} = chart; const barras = chart.getDatasetMeta(0).data; ctx.save(); ctx.fillStyle = "#f8dcea"; barras.forEach(function (barra) { const alto = barra.height; ctx.beginPath(); ctx.roundRect(chartArea.left, barra.y - alto / 2, chartArea.right - chartArea.left, alto, alto / 2); ctx.fill(); }); ctx.restore(); }, afterDatasetsDraw: function (chart) { const {ctx, chartArea} = chart; const barras = chart.getDatasetMeta(0).data; const nombres = chart.data.labels || []; const valores = chart.data.datasets[0].data || []; ctx.save(); ctx.textBaseline = "bottom"; barras.forEach(function (barra, index) { const yTexto = barra.y - barra.height / 2 - 6; ctx.font = "14px Inter, serif"; ctx.textAlign = "right"; ctx.fillStyle = index < 3 ? "#d66a00" : "#98a2b3"; ctx.fillText(String(index + 1), chartArea.left - 20, yTexto); ctx.textAlign = "left"; ctx.fillStyle = "#444"; ctx.fillText(nombres[index], chartArea.left, yTexto); ctx.font = "bold 14px Inter, serif"; ctx.textAlign = "right"; ctx.fillText(ClassEstadisticas.formatearEuros(valores[index]), chartArea.right, yTexto); }); ctx.restore(); } }; ClassEstadisticas.chartRankingClientes = new Chart(canvas, { type: "bar", data: {labels: [], datasets: [{data: [], backgroundColor: [], borderRadius: 10, borderSkipped: false, barThickness: 7}]}, options: { indexAxis: "y", responsive: true, maintainAspectRatio: false, resizeDelay: 100, layout: {padding: {top: 25, right: 5, bottom: 5, left: 48}}, scales: { x: {beginAtZero: true, display: false, grid: {display: false}, border: {display: false}}, y: {display: false, offset: true, grid: {display: false}, border: {display: false}} }, plugins: { legend: {display: false}, datalabels: {display: false}, tooltip: { callbacks: { title: function (items) { return items[0].chart.data.labels[items[0].dataIndex]; }, label: function (contexto) { return ClassEstadisticas.formatearEuros(contexto.raw); } } } } }, plugins: [pluginRanking] }); const fechasRanking = $("#fecha-desde, #fecha-hasta"); fechasRanking.datepicker({maxDate: new Date(), inline: true}).mask("99/99/9999"); fechasRanking.on("keyup change", function () { const longitud = $(this).val().length; if (longitud === 0 || longitud === 10) { ClassEstadisticas.cargarRankingClientes(); } }); fechasRanking.on("change", function () { if ($(this).val().length !== 10) { $(this).val(""); } }); ClassEstadisticas.cargarRankingClientes(); }); } static initReservas() { $(document).ready(function () { const canvas = document.getElementById("canvas-reservas"); if (!canvas || ClassEstadisticas.chartReservas) { return; } ClassEstadisticas.chartReservas = new Chart(canvas, { type: "doughnut", data: { labels: [], datasets: [{ data: [], backgroundColor: [], borderColor: "#FFFFFF", borderWidth: 5, hoverOffset: 0 }] }, options: { responsive: true, maintainAspectRatio: false, cutout: "62%", plugins: { legend: {display: false}, tooltip: {enabled: false}, datalabels: {display: false} } } }); $("#frm-estadistica-reserva-temporada").on("change", function () { ClassEstadisticas.cargarReservas(); }); ClassEstadisticas.cargarReservas(); }); } static cargarReservas() { if (!ClassEstadisticas.chartReservas) { return; } const temporadaSeleccionada = $("#frm-estadistica-reserva-temporada option:selected"); const fechaInicio = Number(temporadaSeleccionada.data("inicio")) || 0; const fechaFin = Number(temporadaSeleccionada.data("fin")) || 0; $.getJSON("https://gestion.elositodeclaudia.com/ajax/estadisticas/Estadisticas.reservas.php", { CSRF: CSRF, fechaInicio: fechaInicio, fechaFin: fechaFin }).done(function (respuesta) { if (!respuesta || respuesta.error_number < 0) { return; } ClassEstadisticas.actualizarGraficoReservas(respuesta); }); } static actualizarGraficoReservas(respuesta) { const completadas = Number(respuesta.completadas) || 0; const pendientes = Number(respuesta.pendientes) || 0; const total = Number(respuesta.total) || 0; const dataset = ClassEstadisticas.chartReservas.data.datasets[0]; if (total > 0) { ClassEstadisticas.chartReservas.data.labels = ["Completadas", "Pendientes"]; dataset.data = [completadas, pendientes]; dataset.backgroundColor = ["#059669", "#E8168C"]; dataset.borderWidth = 5; } else { ClassEstadisticas.chartReservas.data.labels = []; dataset.data = [1]; dataset.backgroundColor = ["#E6E6E6"]; dataset.borderWidth = 0; } $("#estadistica-reservas-completadas").text(completadas); $("#estadistica-reservas-pendientes").text(pendientes); $("#estadistica-reservas-total").text(total); ClassEstadisticas.chartReservas.update(); } static formatearEuros(valor) { return new Intl.NumberFormat("es-ES", {style: "currency", currency: "EUR"}).format(Number(valor) || 0); } static cargarRankingClientes() { if (!ClassEstadisticas.chartRankingClientes) { return; } $.getJSON("https://gestion.elositodeclaudia.com/ajax/estadisticas/Estadisticas.rankingClientes.php", { CSRF: CSRF, fechaDesde: $("#fecha-desde").val(), fechaHasta: $("#fecha-hasta").val() }).done(function (respuesta) { if (!respuesta || respuesta.error_number < 0) { return; } const datos = respuesta.data || []; ClassEstadisticas.chartRankingClientes.data.labels = respuesta.labels || []; ClassEstadisticas.chartRankingClientes.data.datasets[0].data = datos; ClassEstadisticas.chartRankingClientes.data.datasets[0].backgroundColor = datos.map(function (_, index) { return index === 0 ? "#E8168C" : index === 1 ? "#F472B6" : "#FCA5A5"; }); ClassEstadisticas.chartRankingClientes.update(); }); } static cargarVentas() { if (!ClassEstadisticas.chartVentas) { return; } $.getJSON("https://gestion.elositodeclaudia.com/ajax/estadisticas/Estadisticas.ventas.php", { CSRF: CSRF, tipo: ClassEstadisticas.tipoVentas, idCategoria: ClassEstadisticas.filtrosVentas.idCategoria, idMarca: ClassEstadisticas.filtrosVentas.idMarca, tallas: ClassEstadisticas.filtrosVentas.tallas }).done(function (respuesta) { if (!respuesta || respuesta.error_number < 0) { return; } ClassEstadisticas.chartVentas.data.labels = respuesta.labels || []; ClassEstadisticas.chartVentas.data.datasets = respuesta.datasets || []; ClassEstadisticas.chartVentas.update(); }); } static actualizarFiltrosVentas(filtros = {}) { ClassEstadisticas.filtrosVentas = { idCategoria: Number(filtros.idCategoria) || 0, idMarca: Number(filtros.idMarca) || 0, tallas: Array.isArray(filtros.tallas) ? filtros.tallas : [] }; ClassEstadisticas.cargarVentas(); } } window.ClassEstadisticas = ClassEstadisticas; class ClassClientes { static initListado() { $(document).ready(function () { ClassClientes.initModal(function (data) { $(".modal").modal("hide"); tablatablaClientes.ajax.reload(); Web.notify(data["error_message"]); }); $("body").on("click", ".btn-baja-cliente", function () { const id = $(this).attr("data-id"); const nombre = $(this).attr("data-nombre"); ClassBlockUI.abrirBlockUIConfirm("Va a dar de baja al cliente %1%, ¿Desea continuar?".replace("%1%", nombre), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/clientes/Cliente.baja.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaClientes.ajax.reload(); } }); }, "Cancelar"); }); }); } static initModal(callbackOnSuccessSave = null) { if (callbackOnSuccessSave) ClassClientes.callbackListado = callbackOnSuccessSave; if (ClassClientes.modalInicializado) return; ClassClientes.modalInicializado = true; preparaLugar(28, 652, 62833, undefined, ClassClientes.formId + "-provincia", ClassClientes.formId + "-localidad"); $("body").off("click.classClientes", "#btn-guardar-cliente").on("click.classClientes", "#btn-guardar-cliente", function () { ClassClientes.guardarCliente(); }); $("body").off("click.classClientes", ".btn-editar-cliente").on("click.classClientes", ".btn-editar-cliente", function () { const id = $(this).attr("data-id"); ClassClientes.callbackOnSuccessSave = ClassClientes.callbackListado; document.getElementById(ClassClientes.formId).reset(); const codigoElement = $("#" + ClassClientes.formId + "-codigo-fidelizacion"); const saldoElement = $("#" + ClassClientes.formId + "-saldo-fidelizacion"); const containerEnlaceComprasElement = $(".container-enlace-compras"); if (id > 0) { ClassClientes.cargarCliente(id, function (data) { if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } const datos = data["datos"]; $("#" + ClassClientes.formId + "-id").val(id); codigoElement.val(datos["codigoFidelizacion"]); codigoElement.prop("readonly", true); saldoElement.val(datos["saldoDisponible"]); saldoElement.prop("readonly", true); saldoElement.trigger("input"); $("#" + ClassClientes.formId + "-nombre").val(datos["nombre"]); $("#" + ClassClientes.formId + "-email").val(datos["email"]); $("#" + ClassClientes.formId + "-nif").val(datos["nif"]); $("#" + ClassClientes.formId + "-telefono").val(datos["telefono"]); $("#" + ClassClientes.formId + "-direccion").val(datos["direccion"]); $("#" + ClassClientes.formId + "-cp").val(datos["codigoPostal"]); $("#" + ClassClientes.formId + "-provincia").val(datos["idProvincia"]); $("#" + ClassClientes.formId + "-provincia").selectpicker("refresh"); //$("#frm-cliente-localidad").val(datos["idLocalidad"]); actualizaCiudades(ClassClientes.formId + "-localidad", ClassClientes.formId + "-provincia", undefined, datos["idLocalidad"], 28, datos["idProvincia"], datos["idLocalidad"]); containerEnlaceComprasElement.removeClass("d-none"); containerEnlaceComprasElement.find("a").attr("href", "https://gestion.elositodeclaudia.com/compras-realizadas/?cliente="+id); ClassClientes.abreModal("Editar cliente"); }); } else { ClassClientes.prepararNuevoCliente(); ClassClientes.abreModal("Nuevo Cliente"); } }); } static prepararNuevoCliente(nombre = "") { document.getElementById(ClassClientes.formId).reset(); $("#" + ClassClientes.formId + "-id").val(-1); $(".container-enlace-compras").addClass("d-none"); $("#" + ClassClientes.formId + "-codigo-fidelizacion").prop("readonly", false); $("#" + ClassClientes.formId + "-saldo-fidelizacion").prop("readonly", false); $("#" + ClassClientes.formId + "-nombre").val(nombre); } static abrirNuevoCliente(nombre = "", callbackOnSuccess = null, callbackOnCancel = null) { ClassClientes.initModal(); ClassClientes.prepararNuevoCliente(nombre); let guardado = false; ClassClientes.callbackOnSuccessSave = function (data) { guardado = true; ClassClientes.cerrarModal(function () { ClassClientes.callbackOnSuccessSave = ClassClientes.callbackListado; if (callbackOnSuccess) callbackOnSuccess(data["datos"], data); }); }; const modal = ClassClientes.abreModal("Nuevo Cliente"); modal.one("hidden.bs.modal.classClientes", function () { if (guardado) return; ClassClientes.callbackOnSuccessSave = ClassClientes.callbackListado; if (callbackOnCancel) callbackOnCancel(); }); } static cerrarModal(callback) { const modal = $(".modal[id^='blockUI_modal-cliente']").last(); if (!modal.length) { if (callback) callback(); return; } modal.one("hidden.bs.modal.classClientesCerrar", callback); const instancia = bootstrap.Modal.getInstance(modal.get(0)); if (instancia) instancia.hide(); else modal.modal("hide"); } static preparaAutocompleteCliente(idInput, urlBuscarClientes, callbackOnSelect, variableId, callbackOnCreated = null, callbackOnCancel = null) { ClassClientes.initModal(); const input = $("#" + idInput); const agregarOpcionCrear = function (clientes, textoBusqueda) { clientes = Array.isArray(clientes) ? clientes : []; clientes.push({ id: ClassClientes.idCrearCliente, label: ClassClientes.textoCrearCliente, value: ClassClientes.textoCrearCliente, esCrearCliente: true, nombreInicial: textoBusqueda }); return clientes; }; const source = function (request, response) { $.ajax({ url: urlBuscarClientes, dataType: "json", data: {term: request.term} }).done(function (clientes) { response(agregarOpcionCrear(clientes, request.term)); }).fail(function () { response(agregarOpcionCrear([], request.term)); }); }; const autocomplete = Utils.preparaAutoCompleteBuscar( undefined, idInput, undefined, function (item) { if (item && item.esCrearCliente) { ClassClientes.abrirNuevoCliente(item.nombreInicial || input.val(), function (cliente) { if (callbackOnCreated) callbackOnCreated(cliente); else if (callbackOnSelect) callbackOnSelect(cliente); }, callbackOnCancel); return; } if (callbackOnSelect) callbackOnSelect(item); }, undefined, variableId, source, {mainIdItem: "id", showNoResults: false, minLength: 0, autoDisableInput: false} ); input.autocomplete("instance").menu.element.addClass("ui-autocomplete-clientes"); return autocomplete; } static guardarCliente() { ClassClientes.esperePorFavor = Utils.sendStandardAjax(ClassClientes.formId, "https://gestion.elositodeclaudia.com/ajax/clientes/Cliente.guardar.php", { successCallback: function (data) { ClassClientes.esperePorFavor.modal("hide"); if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } if (ClassClientes.callbackOnSuccessSave) ClassClientes.callbackOnSuccessSave(data); } }); } static cargarCliente(id, callback) { ClassClientes.esperePorFavor = Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/clientes/Cliente.get.php?id=" + id, { successCallback: function (data) { ClassClientes.esperePorFavor.modal("hide"); callback(data) }, }); } static abreModal(title) { return ClassBlockUI.abrirBlockUIEstandar("modal-cliente", undefined, title, "modal681"); } } ClassClientes.formId = "frm-cliente"; ClassClientes.esperePorFavor = null; ClassClientes.modalInicializado = false; ClassClientes.callbackListado = null; ClassClientes.callbackOnSuccessSave = null; ClassClientes.idCrearCliente = -999999; ClassClientes.textoCrearCliente = "Crear cliente"; window.ClassClientes = ClassClientes; class ClassArticulos { static initListado(urlDatatable) { $(document).ready(function() { Web.initTabs("tabs-tabla", function (id) { tablatablaArticulos.ajax.url(urlDatatable.replace("%tab%", id)).load(); }); $("body").on("click", ".btn-eliminar-producto", function () { const id = $(this).attr("data-id"); const nombre = $(this).attr("data-nombre"); ClassBlockUI.abrirBlockUIConfirm("Va eliminar el artículo %1%, ¿Desea continuar?".replace("%1%", nombre), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/articulos/Articulo.eliminar.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaArticulos.ajax.reload(); } }); }, "Cancelar"); }); $("body").on("click", ".btn-toggle-visible-web-articulo", function () { const id = $(this).attr("data-id"); const esperePorFavor = Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/articulos/Articulo.toggleVisibleEnWeb.php?id=" + id, { successCallback: function (data) { esperePorFavor.modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaArticulos.ajax.reload(null, false); } }); }); }); } static initNuevoEditar() { $(document).ready(function () { initCkeditor(); const elementPorcentajeIVA = $("#frm-articulo-porcentaje-iva"); const elementPVP = $("#frm-articulo-pvp"); const elementBaseIVA = $("#frm-articulo-base"); elementPVP.data("pvpAnterior", ClassArticulos.parseImporte(elementPVP.val())); $(elementPorcentajeIVA).add(elementPVP).on("keyup change", function () { const porcentajeIVA = parseFloat(elementPorcentajeIVA.val()) || 21; const pvp = parseFloat(elementPVP.val().replace(/\./g, "").replace(",", ".").replace(/[^0-9.-]/g, "")) || 0; const base = pvp / (1 + (porcentajeIVA / 100)); const iva = pvp - base; const format = { numberOfDecimals: 2, decimalSeparator: ',', thousandSeparator: '.', symbol: String.fromCharCode(32, 8364) } elementBaseIVA.val(Utils.number_format(base, format)+" / "+Utils.number_format(iva, format)); ClassArticulos.actualizaTallaUnicaDesdeProducto(); $("#tabla-tallas-articulo tbody tr").each(function () { ClassArticulos.actualizaBaseIVAFilaTalla($(this)); }); }); elementPVP.on("change", function () { const pvpAnterior = parseFloat(elementPVP.data("pvpAnterior")) || 0; ClassArticulos.actualizaPreciosTallasDesdeProducto(pvpAnterior); elementPVP.data("pvpAnterior", ClassArticulos.parseImporte(elementPVP.val())); }); $("body").on("click", "#btn-abre-tallas", function () { ClassArticulos.sincronizaModalGrupoTallasArticulo(); ClassBlockUI.abrirBlockUIEstandar("modal-grupo-tallas-articulo", undefined, "Grupo de Tallas", "modal500"); }); $("body").on("change", ".check-talla-unica-articulo", function () { if ($(this).is(":checked")) { $(".check-valor-talla-articulo").prop("checked", false); } ClassArticulos.actualizaEstadosGruposTallasArticulo(); }); $("body").on("change", ".check-grupo-tallas-articulo", function () { const checked = $(this).is(":checked"); const grupo = $(this).closest(".item-grupo-tallas-articulo"); grupo.find(".check-valor-talla-articulo").prop("checked", checked); if (checked) { $(".check-talla-unica-articulo").prop("checked", false); } ClassArticulos.actualizaEstadosGruposTallasArticulo(); }); $("body").on("click", ".btn-toggle-grupo-tallas-articulo", function () { const grupo = $(this).closest(".item-grupo-tallas-articulo"); const abierto = !grupo.hasClass("grupo-tallas-articulo-abierto"); grupo.toggleClass("grupo-tallas-articulo-abierto", abierto); $(this).attr("aria-expanded", abierto ? "true" : "false"); }); $("body").on("change", ".check-valor-talla-articulo", function () { if ($(this).is(":checked")) { $(".check-talla-unica-articulo").prop("checked", false); } ClassArticulos.actualizaEstadosGruposTallasArticulo(); }); $("body").on("click", "#btn-confirmar-grupo-tallas-articulo", function () { ClassArticulos.confirmarGrupoTallasArticulo(); }); $("body").on("keyup change", ".input-pvp-talla-articulo", function () { ClassArticulos.actualizaBaseIVAFilaTalla($(this).closest("tr")); }); $("body").on("keydown", ".input-codigo-barras-articulo", function (event) { ClassArticulos.registraTeclaCodigoBarras($(this), event); if (event.key === "Enter" || event.key === "Tab") { event.preventDefault(); ClassArticulos.focusSiguienteCodigoBarrasVacio($(this)); } }); $("body").on("input", ".input-codigo-barras-articulo", function () { ClassArticulos.detectaFinPistolaCodigoBarras($(this)); }); $("body").on("click", "#btn-guardar-articulo", function () { ClassArticulos.guardarArticulo(); }); $("body").on("click", ".btn-eliminar-talla-articulo", function () { $(this).closest("tr").remove(); }); }); function initCkeditor() { try { //Configuraciones propias del CKEditor para este cliente CKEDITOR.editorConfig = function( config ) { config.filebrowserImageUploadUrl = 'sections/textos/uploadImagen.php?a=1&'; config.toolbar = 'complete'; config.contentsCss = 'https://gestion.elositodeclaudia.com/css/styles.css' ; config.format_tags = "encabezado_h1;encabezado_h2;encabezado_h3;encabezado_h4;encabezado_h5;p;div;rojo"; config.format_rojo = { name: "Texto rojo", element: 'div', attributes: { 'class': 'rojo' } }; config.format_encabezado_h1 = { name: "H1", element: 'h1'}; config.format_encabezado_h2 = { name: "H2", element: 'h2'}; config.format_encabezado_h3 = { name: "H3", element: 'h3'}; config.format_encabezado_h4 = { name: "H4", element: 'h4'}; config.format_encabezado_h5 = { name: "H5", element: 'h5'}; }; //Activar el ckeditor en los textarea marcados como class=ckeditor $('textarea.ckeditor').each(function() { CKEDITOR.replace($(this)); }); } catch(Exception) { } } } static sincronizaModalGrupoTallasArticulo() { const keysSeleccionadas = []; const clavesSeleccionadas = []; $("#tabla-tallas-articulo tbody tr").each(function () { const key = $(this).attr("data-talla-key") || ""; const clave = ClassArticulos.getClaveTalla($(this).attr("data-tipo-talla"), $(this).attr("data-id-atr-valor")); if (key !== "") keysSeleccionadas.push(key); if (clave !== "") clavesSeleccionadas.push(clave); }); $(".check-talla-unica-articulo").prop("checked", keysSeleccionadas.includes("unica")); $(".check-valor-talla-articulo").prop("checked", false); $(".check-valor-talla-articulo").each(function () { const key = $(this).attr("data-key"); $(this).prop("checked", keysSeleccionadas.includes(key)); }); $(".check-valor-talla-articulo").each(function () { const check = $(this); const clave = check.attr("data-clave-talla") || ClassArticulos.getClaveTalla(check.attr("data-tipo"), check.val()); if (!check.is(":checked") && clavesSeleccionadas.includes(clave) && $(".check-valor-talla-articulo:checked").filter(function () { const checkMarcado = $(this); const claveMarcada = checkMarcado.attr("data-clave-talla") || ClassArticulos.getClaveTalla(checkMarcado.attr("data-tipo"), checkMarcado.val()); return claveMarcada === clave; }).length === 0) { check.prop("checked", true); } }); if ($(".check-talla-unica-articulo").is(":checked")) { $(".check-valor-talla-articulo").prop("checked", false); } ClassArticulos.actualizaEstadosGruposTallasArticulo(); $(".item-grupo-tallas-articulo").each(function () { const tieneSeleccion = $(this).find(".check-valor-talla-articulo:checked").length > 0; $(this).toggleClass("grupo-tallas-articulo-abierto", tieneSeleccion); $(this).find(".btn-toggle-grupo-tallas-articulo").attr("aria-expanded", tieneSeleccion ? "true" : "false"); }); } static actualizaEstadosGruposTallasArticulo() { $(".check-grupo-tallas-articulo").each(function () { const grupo = $(this).closest(".item-grupo-tallas-articulo"); const valores = grupo.find(".check-valor-talla-articulo"); const seleccionadas = valores.filter(":checked").length; this.indeterminate = seleccionadas > 0 && seleccionadas < valores.length; $(this).prop("checked", valores.length > 0 && seleccionadas === valores.length); }); } static confirmarGrupoTallasArticulo() { const tabla = $("#tabla-tallas-articulo tbody"); if ($(".check-talla-unica-articulo").is(":checked")) { tabla.find("tr").not("[data-talla-key='unica']").remove(); ClassArticulos.addFilaTallaArticulo({ key: "unica", tipo: "unica", idGrupoTalla: "-1", idAtrValor: "", label: $(".check-talla-unica-articulo").attr("data-label") || "Talla única" }); } else { const selectedKeys = []; const selectedClaves = []; $(".check-valor-talla-articulo:checked").each(function () { const clave = $(this).attr("data-clave-talla") || ClassArticulos.getClaveTalla($(this).attr("data-tipo"), $(this).val()); if (!selectedClaves.includes(clave)) { selectedKeys.push($(this).attr("data-key")); selectedClaves.push(clave); } }); tabla.find("tr").each(function () { const key = $(this).attr("data-talla-key") || ""; const clave = ClassArticulos.getClaveTalla($(this).attr("data-tipo-talla"), $(this).attr("data-id-atr-valor")); if (key === "unica") { $(this).remove(); } else if (key !== "" && !selectedKeys.includes(key) && !selectedClaves.includes(clave)) { $(this).remove(); } }); $(".check-valor-talla-articulo:checked").each(function () { const clave = $(this).attr("data-clave-talla") || ClassArticulos.getClaveTalla($(this).attr("data-tipo"), $(this).val()); if ($("#tabla-tallas-articulo tbody tr").filter(function () { return ClassArticulos.getClaveTalla($(this).attr("data-tipo-talla"), $(this).attr("data-id-atr-valor")) === clave; }).length > 0) return; ClassArticulos.addFilaTallaArticulo({ key: $(this).attr("data-key"), tipo: $(this).attr("data-tipo"), idGrupoTalla: $(this).attr("data-id-grupo-talla"), idAtrValor: $(this).val(), label: $(this).attr("data-label") }); }); } ClassArticulos.cierraModalGrupoTallasArticulo(); } static addFilaTallaArticulo(datosTalla) { if (!datosTalla.key || $("#tabla-tallas-articulo tbody tr[data-talla-key='" + datosTalla.key + "']").length > 0) return; if (datosTalla.key !== "unica" && ClassArticulos.existeTallaArticulo(datosTalla.tipo, datosTalla.idAtrValor)) return; const importes = ClassArticulos.getImportesTallaArticulo(); const inputName = datosTalla.key.replace(/[^a-zA-Z0-9_-]/g, ""); const label = ClassArticulos.escapeHtml(datosTalla.label || ""); const key = ClassArticulos.escapeHtml(datosTalla.key); const idAtrValor = ClassArticulos.escapeHtml(datosTalla.idAtrValor || ""); const tipo = ClassArticulos.escapeHtml(datosTalla.tipo || ""); const idGrupoTalla = ClassArticulos.escapeHtml(datosTalla.idGrupoTalla || "-1"); const deleteIcon = "https://gestion.elositodeclaudia.com/img/iconos/eliminar-circle.svg"; const esTallaUnicaInput = datosTalla.key === "unica" ? '' : ""; const esTallaUnica = datosTalla.key === "unica"; const nameCodigoBarras = esTallaUnica ? "codigoBarrasProducto" : `tallas[${inputName}][codigoBarras]`; const readonlyPVP = esTallaUnica ? "readonly" : ""; $("#tabla-tallas-articulo tbody").append(` ${esTallaUnicaInput} `); ClassArticulos.actualizaTallaUnicaDesdeProducto(); } static existeTallaArticulo(tipo, idAtrValor) { const clave = ClassArticulos.getClaveTalla(tipo, idAtrValor); if (clave === "") return false; return $("#tabla-tallas-articulo tbody tr").filter(function () { return ClassArticulos.getClaveTalla($(this).attr("data-tipo-talla"), $(this).attr("data-id-atr-valor")) === clave; }).length > 0; } static getClaveTalla(tipo, idAtrValor) { tipo = String(tipo || ""); idAtrValor = String(idAtrValor || ""); if (tipo === "" || idAtrValor === "" || tipo === "unica") return ""; return tipo + "-" + idAtrValor; } static getImportesTallaArticulo() { const porcentajeIVA = parseFloat($("#frm-articulo-porcentaje-iva").val()) || 21; const pvp = parseFloat(($("#frm-articulo-pvp").val() || "").replace(/\./g, "").replace(",", ".").replace(/[^0-9.-]/g, "")) || 0; const iva = pvp * porcentajeIVA / 100; const base = pvp - iva; const format = { numberOfDecimals: 2, decimalSeparator: ',', thousandSeparator: '', symbol: String.fromCharCode(32, 8364) }; if (pvp <= 0) { return {pvp: "", baseIVA: ""}; } return { pvp: Utils.number_format(pvp, Object.assign({}, format, {symbol: String.fromCharCode(32, 8364)})), baseIVA: Utils.number_format(base, format) + " / " + Utils.number_format(iva, format) }; } static cierraModalGrupoTallasArticulo() { const modal = document.getElementById("blockUI_modal-grupo-tallas-articulo"); const modalInstance = modal ? bootstrap.Modal.getInstance(modal) : null; if (modalInstance) { modalInstance.hide(); } else { $(".modal").modal("hide"); } } static actualizaBaseIVAFilaTalla(fila) { const porcentajeIVA = parseFloat($("#frm-articulo-porcentaje-iva").val()) || 21; const pvp = ClassArticulos.parseImporte(fila.find(".input-pvp-talla-articulo").val()); const iva = pvp * porcentajeIVA / 100; const base = pvp - iva; const format = { numberOfDecimals: 2, decimalSeparator: ',', thousandSeparator: '', symbol: String.fromCharCode(32, 8364) }; fila.find("td:nth-child(4) input").val(Utils.number_format(base, format) + " / " + Utils.number_format(iva, format)); } static actualizaTallaUnicaDesdeProducto() { const fila = $("#tabla-tallas-articulo tbody tr[data-talla-key='unica']"); if (!fila.length) return; const importes = ClassArticulos.getImportesTallaArticulo(); fila.find(".input-pvp-talla-articulo").val(importes.pvp); fila.find("td:nth-child(4) input").val(importes.baseIVA); } static actualizaPreciosTallasDesdeProducto(pvpAnterior) { const pvpNuevo = ClassArticulos.parseImporte($("#frm-articulo-pvp").val()); if (Math.abs(pvpAnterior - pvpNuevo) < 0.005) return; const importes = ClassArticulos.getImportesTallaArticulo(); $("#tabla-tallas-articulo tbody tr").not("[data-talla-key='unica']").each(function () { const fila = $(this); const inputPVP = fila.find(".input-pvp-talla-articulo"); if (Math.abs(ClassArticulos.parseImporte(inputPVP.val()) - pvpAnterior) < 0.005) { inputPVP.val(importes.pvp); ClassArticulos.actualizaBaseIVAFilaTalla(fila); } }); } static registraTeclaCodigoBarras(input, event) { if (event.key === "Enter" || event.key === "Tab" || event.key.length !== 1) return; const ahora = Date.now(); const anterior = parseInt(input.data("barcodeLastKeyTime") || 0); const contador = parseInt(input.data("barcodeKeyCount") || 0); const acumulado = parseInt(input.data("barcodeKeyTotalTime") || 0); const delta = anterior > 0 ? ahora - anterior : 0; input.data("barcodeLastKeyTime", ahora); input.data("barcodeKeyCount", contador + 1); if (delta > 0 && delta < 150) { input.data("barcodeKeyTotalTime", acumulado + delta); } else if (delta >= 150) { input.data("barcodeKeyCount", 1); input.data("barcodeKeyTotalTime", 0); } } static detectaFinPistolaCodigoBarras(input) { const timer = input.data("barcodeFinishTimer"); if (timer) clearTimeout(timer); input.data("barcodeFinishTimer", setTimeout(function () { const valor = String(input.val() || "").trim(); const contador = parseInt(input.data("barcodeKeyCount") || 0); const acumulado = parseInt(input.data("barcodeKeyTotalTime") || 0); const media = contador > 1 ? acumulado / (contador - 1) : 999; if (valor.length >= 6 && contador >= 6 && media <= 45) { ClassArticulos.focusSiguienteCodigoBarrasVacio(input); } }, 90)); } static focusSiguienteCodigoBarrasVacio(inputActual) { const inputs = $(".input-codigo-barras-articulo:visible:enabled").toArray(); const posicionActual = inputs.indexOf(inputActual.get(0)); const siguientes = inputs.slice(posicionActual + 1).concat(inputs.slice(0, Math.max(posicionActual, 0))); const siguiente = siguientes.find(function (input) { return $.trim($(input).val()) === ""; }); if (siguiente) { $(siguiente).focus().select(); } inputActual.removeData("barcodeLastKeyTime barcodeKeyCount barcodeKeyTotalTime barcodeFinishTimer"); } static guardarArticulo() { if ($("#tabla-tallas-articulo tbody tr").length === 0) { ClassBlockUI.abrirBlockUIEstandarMensaje("Debe a\u00f1adir al menos una talla al art\u00edculo", true); return; } if (typeof CKEDITOR !== "undefined") { for (const instanceName in CKEDITOR.instances) { CKEDITOR.instances[instanceName].updateElement(); } } Utils.sendStandardAjax("frm-articulo", "https://gestion.elositodeclaudia.com/ajax/articulos/Articulo.guardar.php", { successCallback: "data-location" }); } static parseImporte(value) { return parseFloat(String(value || "").replace(/\./g, "").replace(",", ".").replace(/[^0-9.-]/g, "")) || 0; } static escapeHtml(value) { return String(value) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } } window.ClassArticulos = ClassArticulos; class ClassReservas { static initListado(urlDatatable, urlGetReserva, urlBuscarClientes, urlBuscarArticulos, urlCobrarReserva, urlCompletarReserva, urlTicket) { ClassReservas.urlGetReserva = urlGetReserva; ClassReservas.urlBuscarClientes = urlBuscarClientes; ClassReservas.urlBuscarArticulos = urlBuscarArticulos; ClassReservas.urlCobrarReserva = urlCobrarReserva; ClassReservas.urlCompletarReserva = urlCompletarReserva; ClassReservas.urlTicket = urlTicket; $(document).ready(function () { Web.initTabs("tabs-tabla", function (id) { tablatablaReservas.ajax.url(urlDatatable.replace("%tab%", id)).load(); }); $("body") .off("click.classReservas", ".btn-editar-reserva") .on("click.classReservas", ".btn-editar-reserva", function () { ClassReservas.abrirReserva(parseInt($(this).attr("data-id"), 10) || -1); }); $("body") .off("click.classReservas", ".btn-ver-reserva") .on("click.classReservas", ".btn-ver-reserva", function () { ClassReservas.cargarDetalleReserva(parseInt($(this).attr("data-id"), 10) || 0); }); $("body") .off("click.classReservas", "#btn-anadir-articulo-reserva") .on("click.classReservas", "#btn-anadir-articulo-reserva", function () { ClassReservas.anadirArticulo(); }); $("body") .off("click.classReservas", ".btn-eliminar-articulo-reserva") .on("click.classReservas", ".btn-eliminar-articulo-reserva", function () { $(this).closest(".fila-articulo-reserva").remove(); }); $("body") .off("keydown.classReservas", ".input-articulo-reserva") .on("keydown.classReservas", ".input-articulo-reserva", function (event) { if (event.key !== "Enter") return; event.preventDefault(); const input = $(this); input.autocomplete("search", input.val()); }); $("body") .off("click.classReservas", "#btn-validar-reserva") .on("click.classReservas", "#btn-validar-reserva", function () { if (!ClassReservas.validarFormulario()) return; if (ClassReservas.reservaTienePagos) ClassReservas.guardarEdicionConPagos(); else ClassReservas.abrirPagoReserva(); }); $("body").off("click.classReservas", ".btn-completar-reserva").on("click.classReservas", ".btn-completar-reserva", function () { const idReserva = parseInt($(this).attr("data-id"), 10) || 0; ClassBlockUI.abrirBlockUIConfirm("Se cobrar\u00e1 el importe pendiente y se completar\u00e1 la reserva. \u00bfDesea continuar?", "Continuar", function () { ClassReservas.completarReserva(idReserva); }, "Cancelar"); }); $("body").off("click.classReservas", "#btn-anadir-pago-reserva").on("click.classReservas", "#btn-anadir-pago-reserva", function () { ClassReservas.anadirPago(); }); $("body").off("click.classReservas", ".btn-eliminar-pago-reserva").on("click.classReservas", ".btn-eliminar-pago-reserva", function () { ClassReservas.eliminarPago($(this).data("indice")); }); $("body").off("click.classReservas", "#btn-cobrar-reserva").on("click.classReservas", "#btn-cobrar-reserva", function () { ClassReservas.cobrarReserva(); }); $("body").off("click.classReservas", "#btn-imprimir-ticket-reserva").on("click.classReservas", "#btn-imprimir-ticket-reserva", function () { ClassReservas.abrirTicket(parseInt($(this).data("id"), 10) || 0, false); }); $("body").off("click.classReservas", "#btn-ticket-regalo-reserva").on("click.classReservas", "#btn-ticket-regalo-reserva", function () { ClassReservas.abrirTicket(parseInt($(this).data("id"), 10) || 0, true); }); ClassReservas.preparaAutocompleteCliente(); }); } static abrirReserva(idReserva) { if (ClassReservas.cerrarModales(function () { ClassReservas.abrirReserva(idReserva); })) { return; } const form = $("#" + ClassReservas.formId); form.get(0).reset(); $("#frm-reserva-id").val(idReserva > 0 ? idReserva : -1); $("#frm-reserva-id-cliente").val(-1); $("#articulos-reserva").empty(); ClassReservas.idCliente = -1; ClassReservas.reservaTienePagos = false; $("#btn-validar-reserva").text("Pagar Reserva"); if (idReserva > 0) { const espere = Utils.sendStandardAjax(null, ClassReservas.urlGetReserva + "?CSRF=" + CSRF + "&id=" + idReserva, { successCallback: function (data) { espere.modal("hide"); if (!data || data["error_number"] < 0 || !data["datos"]) { ClassBlockUI.abrirBlockUIEstandarMensaje(data && data["error_message"] ? data["error_message"] : "Se ha producido un error inesperado", true); return; } ClassReservas.rellenarReserva(data["datos"]); ClassReservas.abreModal("Editar Reserva"); }, }); return; } $("#frm-reserva-fecha-reserva").val(ClassReservas.fechaHoy()); $("#frm-reserva-fecha-prueba").val(ClassReservas.fechaHoy(11)); ClassReservas.anadirArticulo(); ClassReservas.abreModal("Nueva Reserva"); } static cerrarModales(callback) { const modalesAbiertos = $(".modal.show"); if (!modalesAbiertos.length) return false; let modalesPendientes = modalesAbiertos.length; modalesAbiertos.one("hidden.bs.modal.classReservas", function () { modalesPendientes--; if (modalesPendientes === 0) callback(); }); modalesAbiertos.modal("hide"); return true; } static cargarDetalleReserva(idReserva) { if (!idReserva) return; const espere = ClassBlockUI.abrirBlockUIEsperePorFavor(); $.ajax({ url: ClassReservas.urlGetReserva, type: "GET", dataType: "json", data: {id: idReserva, CSRF: CSRF} }).done(function (data) { if (espere) espere.modal("hide"); if (!data || data["error_number"] < 0 || !data["datos"]) { ClassBlockUI.abrirBlockUIEstandarMensaje(data && data["error_message"] ? data["error_message"] : "Se ha producido un error inesperado", true); return; } const datos = data["datos"]; const completada = parseInt(datos["completada"], 10) === 1; const codigo = "R-" + String(datos["id"] || 0).padStart(3, "0"); const tituloEditar = "Editar"; const iconoEditar = "https:\/\/gestion.elositodeclaudia.com\/img\/iconos\/editar.svg"; const botonEditar = completada ? "" : ""; ClassReservas.pintarDetalleReserva(datos); ClassBlockUI.abrirBlockUIEstandar( "modal-detalle-reserva", undefined, "" + botonEditar + "RESERVA" + " " + codigo + "", "modal681 modal-reserva-detalle" ); }).fail(function () { if (espere) espere.modal("hide"); ClassBlockUI.abrirBlockUIEstandarMensaje("Se ha producido un error inesperado", true); }); } static pintarDetalleReserva(datos) { const idReserva = parseInt(datos["id"], 10) || 0; const idPedido = parseInt(datos["idUltimoPedido"], 10) || 0; const completada = parseInt(datos["completada"], 10) === 1; const notas = String(datos["notas"] || "").trim(); $("#detalle-reserva-cliente").text(datos["cliente"] || "-"); $("#detalle-reserva-telefono").text(datos["telefono"] || ""); $("#detalle-reserva-fecha-reserva").text(datos["fechaReserva"] || "-"); $("#detalle-reserva-fecha-prueba").text(datos["fechaPrueba"] || "-"); $("#detalle-reserva-total").text(ClassReservas.formateaImporte(datos["total"])); $("#detalle-reserva-pagado").text(ClassReservas.formateaImporte(datos["totalPagado"])); $("#detalle-reserva-pendiente").text(ClassReservas.formateaImporte(datos["totalPendiente"])); $("#detalle-reserva-notas-texto").text(notas); $("#detalle-reserva-notas").toggleClass("d-none", !notas); const tbody = $("#detalle-reserva-articulos").empty(); (datos["articulos"] || []).forEach(function (articulo) { const cantidad = parseInt(articulo["cantidad"], 10) || 1; const precio = parseFloat(articulo["importe"]) || 0; const celdaArticulo = $("").append($("").text(articulo["nombre"] || "")); if (articulo["referencia"]) celdaArticulo.append($("", {class: "d-block"}).text(articulo["referencia"])); tbody.append( $("").append( celdaArticulo, $("", {class: "text-end nowrap"}).append($("").text(ClassReservas.formateaImporte(precio * cantidad))) ) ); }); $("#btn-imprimir-ticket-reserva, #btn-ticket-regalo-reserva").data("id", idPedido); $("#detalle-reserva-imprimir-container, #detalle-reserva-ticket-regalo-container").toggleClass("d-none", !idPedido); $("#btn-finalizar-reserva").attr("data-id", idReserva); $("#detalle-reserva-finalizar-container").toggleClass("d-none", completada); } static rellenarReserva(datos) { ClassReservas.idCliente = parseInt(datos["idCliente"], 10) || -1; ClassReservas.reservaTienePagos = parseFloat(datos["totalPagado"]) > 0; $("#btn-validar-reserva").text(ClassReservas.reservaTienePagos ? "Editar Reserva" : "Pagar Reserva"); $("#frm-reserva-id").val(datos["id"] || -1); $("#frm-reserva-id-cliente").val(ClassReservas.idCliente); $("#frm-reserva-cliente").val(datos["cliente"] || ""); $("#frm-reserva-telefono").val(datos["telefono"] || ""); $("#frm-reserva-fecha-reserva").val(datos["fechaReserva"] || ""); $("#frm-reserva-fecha-prueba").val(datos["fechaPrueba"] || ""); $("#frm-reserva-notas").val(datos["notas"] || ""); (datos["articulos"] || []).forEach(function (articulo) { ClassReservas.anadirArticulo(articulo); }); if (!$(".fila-articulo-reserva").length) ClassReservas.anadirArticulo(); } static abreModal(titulo) { ClassReservas.tituloModalActivo = titulo; ClassBlockUI.abrirBlockUIEstandar("modal-reserva", undefined, titulo, "modal681"); const fechas = $("#frm-reserva-fecha-reserva, #frm-reserva-fecha-prueba"); const fechasSinInicializar = fechas.filter(function () { return !$(this).data("reservaFechaInicializada"); }); if (!fechasSinInicializar.length) return; fechasSinInicializar.datepicker({ inline: true, beforeShow: function (input) { const hora = ($(input).val().match(/\b\d{2}:\d{2}$/) || ["00:00"])[0]; $(input).data("hora-reserva", hora); }, onSelect: function (fecha) { const hora = $(this).data("hora-reserva") || "00:00"; $(this).val(fecha + " " + hora); } }); fechasSinInicializar.mask("99/99/9999 99:99"); fechasSinInicializar.data("reservaFechaInicializada", true); } static anadirArticulo(datos = {}) { const indice = ClassReservas.indiceArticulo++; const fila = $( `
` ); $("#articulos-reserva").append(fila); ClassReservas.preparaAutocompleteArticulo(fila); } static preparaAutocompleteCliente() { const input = $("#frm-reserva-cliente"); if (input.data("reservaAutocomplete")) return; input.data("reservaAutocomplete", true); input.on("input.classReservas", function () { ClassReservas.idCliente = -1; $("#frm-reserva-id-cliente").val(-1); }); const seleccionarClienteReserva = function (item) { if (!item) return; ClassReservas.idCliente = parseInt(item.id, 10) || -1; $("#frm-reserva-id-cliente").val(ClassReservas.idCliente); $("#frm-reserva-cliente").val(item.nombre || item.value || ""); $("#frm-reserva-telefono").val(item.telefono || ""); }; ClassReservas.clienteAC = ClassClientes.preparaAutocompleteCliente( "frm-reserva-cliente", ClassReservas.urlBuscarClientes, seleccionarClienteReserva, "ClassReservas.idCliente", function (cliente) { ClassReservas.abreModal(ClassReservas.tituloModalActivo); seleccionarClienteReserva(cliente); }, function () { ClassReservas.abreModal(ClassReservas.tituloModalActivo); } ); ClassReservas.activaSeleccionAutomatica(input); } static preparaAutocompleteArticulo(fila) { const input = fila.find(".input-articulo-reserva"); const idInput = input.attr("id") || "input-articulo-reserva-" + fila.data("indice"); input.attr("id", idInput); input.on("input.classReservas", function () { fila.find(".input-id-producto-reserva").val(""); fila.find(".input-id-atributo-producto-reserva").val(0); }); Utils.preparaAutoCompleteBuscar( undefined, idInput, undefined, function (item) { if (!item) return; ClassReservas.seleccionaArticulo(fila, item); }, undefined, "ClassReservas.idArticuloAutocomplete", ClassReservas.urlBuscarArticulos, {mainIdItem: "id", showNoResults: false, minLength: 0, autoDisableInput: false} ); ClassReservas.activaSeleccionAutomatica(input); } static activaSeleccionAutomatica(input) { input.off("autocompleteresponse.classReservas").on("autocompleteresponse.classReservas", function (event, ui) { const resultados = (ui && ui.content) || []; if (resultados.length !== 1 || parseInt(resultados[0].id, 10) <= 0) return; const item = resultados[0]; window.setTimeout(function () { const instancia = input.autocomplete("instance"); if (!instancia || input.val() !== item.value) input.val(item.value); instancia._trigger("select", event, {item: item}); input.autocomplete("close"); }, 0); }); } static seleccionaArticulo(fila, item) { fila.find(".input-id-producto-reserva").val(item.idProducto || item.id || ""); fila.find(".input-id-atributo-producto-reserva").val(item.idAtributoProducto || 0); fila.find(".input-iva-articulo-reserva").val(item.porcentajeIVA || 0); fila.find(".input-articulo-reserva").val(item.value || item.label || ""); fila.find(".input-importe-articulo-reserva").val(ClassReservas.formateaImporte(item.importe)); } static validarFormulario() { const clienteValido = ClassReservas.idCliente > 0; const fechaReserva = $("#frm-reserva-fecha-reserva").val(); const fechaPrueba = $("#frm-reserva-fecha-prueba").val(); const fechasValidas = ClassReservas.esFechaValida(fechaReserva) && ClassReservas.esFechaValida(fechaPrueba); const articulosValidos = $(".fila-articulo-reserva").length > 0 && $(".fila-articulo-reserva").toArray().every(function (fila) { return parseInt($(fila).find(".input-id-producto-reserva").val(), 10) > 0 && ClassReservas.parseImporte($(fila).find(".input-importe-articulo-reserva").val()) > 0; }); if (!clienteValido) { ClassBlockUI.abrirBlockUIEstandarMensaje("Debe seleccionar un cliente v\u00e1lido", true); return false; } if (!fechasValidas) { ClassBlockUI.abrirBlockUIEstandarMensaje("Debe indicar las fechas de reserva y prueba", true); return false; } if (!articulosValidos) { ClassBlockUI.abrirBlockUIEstandarMensaje("Debe seleccionar al menos un art\u00edculo v\u00e1lido", true); return false; } return true; } static abrirPagoReserva() { ClassReservas.pagos = []; ClassReservas.datosBorrador = ClassReservas.getDatosFormulario(); $("#pago-reserva-importe").val("150"); $(".input-forma-pago-reserva[value='efectivo']").prop("checked", true); $(".reserva-pago-regalo").removeClass("active").attr("aria-pressed", "false"); $("#frm-pago-reserva-regalo").val("0"); ClassReservas.actualizaModalPago(); ClassBlockUI.abrirBlockUIEstandar("modal-pago-reserva", undefined, "PAGAR RESERVA", "modal681", false); } static guardarEdicionConPagos() { const datos = ClassReservas.getDatosFormulario(); $("#frm-pago-reserva-datos").val(JSON.stringify({reserva: datos, pagos: []})); const espere = Utils.sendStandardAjax("frm-pago-reserva", ClassReservas.urlCobrarReserva, { successCallback: function (data) { espere.modal("hide"); if (data.error_number < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data.error_message, true); return; } $(".modal").modal("hide"); tablatablaReservas.ajax.reload(null, false); Web.notify(data.error_message || "Reserva guardada correctamente"); } }); } static getDatosFormulario() { const articulos = $(".fila-articulo-reserva").map(function () { const fila = $(this); return { idProducto: parseInt(fila.find(".input-id-producto-reserva").val(), 10), idAtributoProducto: parseInt(fila.find(".input-id-atributo-producto-reserva").val(), 10) || 0, porcentajeIVA: parseFloat(fila.find(".input-iva-articulo-reserva").val()) || 0, nombre: fila.find(".input-articulo-reserva").val(), importe: ClassReservas.parseImporte(fila.find(".input-importe-articulo-reserva").val()) }; }).get(); return { id: parseInt($("#frm-reserva-id").val(), 10) || -1, idCliente: ClassReservas.idCliente, cliente: $("#frm-reserva-cliente").val(), telefono: $("#frm-reserva-telefono").val(), fechaReserva: $("#frm-reserva-fecha-reserva").val(), fechaPrueba: $("#frm-reserva-fecha-prueba").val(), notas: $("#frm-reserva-notas").val(), articulos: articulos }; } static anadirPago() { const importe = ClassReservas.parseImporte($("#pago-reserva-importe").val()); const pendiente = ClassReservas.getTotalReserva() - ClassReservas.getTotalPagado(); if (importe <= 0 || importe - pendiente > 0.009) { ClassBlockUI.abrirBlockUIEstandarMensaje("Indique un importe v\u00e1lido que no supere el pendiente", true); return; } const forma = $(".input-forma-pago-reserva:checked").val(); const pagoExistente = ClassReservas.pagos.find(function (pago) { return pago.forma === forma; }); if (pagoExistente) pagoExistente.importe = Math.round((pagoExistente.importe + importe) * 100) / 100; else ClassReservas.pagos.push({forma: forma, importe: importe}); $("#pago-reserva-importe").val(""); ClassReservas.actualizaModalPago(); } static eliminarPago(indice) { ClassReservas.pagos.splice(indice, 1); ClassReservas.actualizaModalPago(); } static actualizaModalPago() { const datos = ClassReservas.datosBorrador; const total = ClassReservas.getTotalReserva(); const base = datos.articulos.reduce((acum, articulo) => acum + articulo.importe / (1 + articulo.porcentajeIVA / 100), 0); const pagado = ClassReservas.getTotalPagado(); $("#pago-reserva-cliente").text(datos.cliente || ""); if (datos.id > 0) { $("#pago-reserva-codigo").removeClass("d-none").text("R-" + String(datos.id).padStart(3, "0")); } else { $("#pago-reserva-codigo").addClass("d-none").text(""); } $("#pago-reserva-telefono").text(datos.telefono || ""); $("#pago-reserva-total").text(ClassReservas.formateaImporte(total)); $("#pago-reserva-base").text(ClassReservas.formateaImporte(base)); $("#pago-reserva-iva").text(ClassReservas.formateaImporte(total - base)); $("#pago-reserva-num-articulos").text(datos.articulos.length); $("#pago-reserva-pagado").text(ClassReservas.formateaImporte(pagado)); $("#pago-reserva-pendiente").text("Pendiente" + ": " + ClassReservas.formateaImporte(total - pagado)); const formasPago = { efectivo: { nombre: "Efectivo", icono: "https:\/\/gestion.elositodeclaudia.com\/img\/iconos\/efectivo.svg" }, tarjeta: { nombre: "Tarjeta", icono: "https:\/\/gestion.elositodeclaudia.com\/img\/iconos\/tarjeta.svg" } }; const iconoEliminar = "https:\/\/gestion.elositodeclaudia.com\/img\/iconos\/eliminar-circle-rosa.svg"; $("#pago-reserva-lineas").html(ClassReservas.pagos.map(function (pago, indice) { const forma = formasPago[pago.forma]; return `
${forma.nombre}${ClassReservas.formateaImporte(pago.importe)}
`; }).join("")); $("#frm-pago-reserva-datos").val(JSON.stringify({reserva: datos, pagos: ClassReservas.pagos})); } static getTotalReserva() { return ClassReservas.datosBorrador.articulos.reduce((acum, articulo) => acum + articulo.importe, 0); } static getTotalPagado() { return ClassReservas.pagos.reduce((acum, pago) => acum + pago.importe, 0); } static cobrarReserva() { const generarTicketRegalo = $("#frm-pago-reserva-regalo").val() === "1"; const ventanaTicket = window.open("about:blank", "_blank"); const espere = Utils.sendStandardAjax("frm-pago-reserva", ClassReservas.urlCobrarReserva, { successCallback: function (data) { espere.modal("hide"); if (data.error_number < 0) { if (ventanaTicket) ventanaTicket.close(); ClassBlockUI.abrirBlockUIEstandarMensaje(data.error_message, true); return; } $(".modal").modal("hide"); tablatablaReservas.ajax.reload(null, false); if (data.idPedido > 0) { const urlTicket = ClassReservas.getUrlTicket(data.idPedido, generarTicketRegalo); if (ventanaTicket) ventanaTicket.location.href = urlTicket; else window.open(urlTicket, "_blank"); } else if (ventanaTicket) { ventanaTicket.close(); } Web.notify(data.error_message || "Reserva guardada correctamente"); } }); } static completarReserva(idReserva) { Utils.sendStandardAjax(null, ClassReservas.urlCompletarReserva + "?id=" + idReserva + "&CSRF=" + CSRF, { successCallback: function (data) { $(".modal").modal("hide"); if (data.error_number < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data.error_message, true); return; } tablatablaReservas.ajax.reload(null, false); Web.notify(data.error_message); } }); } static abrirTicket(idPedido, regalo) { window.open(ClassReservas.getUrlTicket(idPedido, regalo), "_blank"); } static getUrlTicket(idPedido, regalo) { return ClassReservas.urlTicket + "?idPedido=" + idPedido + "&CSRF=" + CSRF + "&imprimir=1" + (regalo ? "®alo=1" : ""); } static fechaHoy(hora = null) { const fecha = new Date(); return String(fecha.getDate()).padStart(2, "0") + "/" + String(fecha.getMonth() + 1).padStart(2, "0") + "/" + fecha.getFullYear() + " " + String(hora === null ? fecha.getHours() : hora).padStart(2, "0") + ":" + String(hora === null ? fecha.getMinutes() : 0).padStart(2, "0"); } static esFechaValida(valor) { const partes = String(valor || "").match(/^(\d{2})\/(\d{2})\/(\d{4})\s(\d{2}):(\d{2})$/); if (!partes) return false; const fecha = new Date(partes[3], parseInt(partes[2], 10) - 1, partes[1], partes[4], partes[5]); return fecha.getFullYear() === parseInt(partes[3], 10) && fecha.getMonth() === parseInt(partes[2], 10) - 1 && fecha.getDate() === parseInt(partes[1], 10) && fecha.getHours() === parseInt(partes[4], 10) && fecha.getMinutes() === parseInt(partes[5], 10); } static formateaImporte(importe) { const numero = parseFloat(importe); if (Number.isNaN(numero)) return ""; return Utils.number_format(numero, { numberOfDecimals: 2, decimalSeparator: ",", thousandSeparator: ".", symbol: " €" }); } static parseImporte(valor) { return parseFloat(String(valor || "").replace(/\./g, "").replace(",", ".").replace(/[^0-9.-]/g, "")) || 0; } static escapeHtml(valor) { return String(valor) .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'"); } } ClassReservas.formId = "frm-reserva"; ClassReservas.idCliente = -1; ClassReservas.idArticuloAutocomplete = -1; ClassReservas.indiceArticulo = 0; ClassReservas.clienteAC = null; ClassReservas.pagos = []; ClassReservas.datosBorrador = null; ClassReservas.reservaTienePagos = false; ClassReservas.tituloModalActivo = "Nueva Reserva"; window.ClassReservas = ClassReservas; class ClassTickets { static initListado(urlDatatable, urlGetTicket, urlPDFTicket) { $(document).ready(function() { Web.initTabs("tabs-tabla", buscarDatatable); const elementFechaDesde = $("#fecha-desde"); const elementFechaHasta = $("#fecha-hasta"); elementFechaDesde.datepicker({ maxDate: new Date(), inline: true }); elementFechaHasta.datepicker({ maxDate: new Date(), inline: true }); $("#btn-filtrar").on("click", buscarDatatable); $(elementFechaDesde).add(elementFechaHasta).mask("99/99/9999"); $(elementFechaDesde).add(elementFechaHasta).on("keyup change", function () { const length = $(this).val().length; if (length !== 0 && length !== 10) return; buscarDatatable() }); $(elementFechaDesde).add(elementFechaHasta).on("change", function () { const length = $(this).val().length; if (length !== 10) $(this).val(""); }); $("body") .off("click.classTickets", ".btn-ver-pedido") .on("click.classTickets", ".btn-ver-pedido", function () { ClassTickets.cargarDetallePedido($(this).data("id"), urlGetTicket); }); $("body") .off("click.classTickets", ".btn-imprimir-ticket") .on("click.classTickets", ".btn-imprimir-ticket", function () { ClassTickets.abrirTicketPDF($(this).data("id"), false, urlPDFTicket); }); $("body") .off("click.classTickets", "#btn-imprimir-ticket-modal") .on("click.classTickets", "#btn-imprimir-ticket-modal", function () { ClassTickets.abrirTicketPDF($(this).data("id"), false, urlPDFTicket); }); $("body") .off("click.classTickets", "#btn-ticket-regalo") .on("click.classTickets", "#btn-ticket-regalo", function () { ClassTickets.abrirTicketPDF($(this).data("id"), true, urlPDFTicket); }); }); function buscarDatatable() { const tab = $("#tabs-tabla button.active").data("id"); const fechaDesde = $("#fecha-desde").val(); const fechaHasta = $("#fecha-hasta").val(); tablatablaTickets.ajax.url(urlDatatable.replace("%tab%", tab)+"&fDesde="+fechaDesde+"&fHasta="+fechaHasta).load(); } } static cargarDetallePedido(idPedido, urlGetTicket) { idPedido = parseInt(idPedido, 10); if (!idPedido) { return; } const espere = ClassBlockUI.abrirBlockUIEsperePorFavor(); $.ajax({ url: urlGetTicket, type: "GET", dataType: "json", data: {id: idPedido}, }).done(function (response) { if (espere) { espere.modal("hide"); } if (!response || response["error_number"] < 0 || !response["datos"]) { const mensaje = response && response["error_message"] ? response["error_message"] : "Se ha producido un error inesperado"; ClassBlockUI.abrirBlockUIEstandarMensaje(mensaje, true); return; } const datos = response["datos"]; ClassTickets.pintarDetallePedido(datos); ClassBlockUI.abrirBlockUIEstandar( "modal-detalle-ticket", undefined, "TICKET" + " " + datos["codigo"], "modal681 modal-ticket-detalle" ); }).fail(function () { if (espere) { espere.modal("hide"); } ClassBlockUI.abrirBlockUIEstandarMensaje( "Se ha producido un error inesperado", true ); }); } static pintarDetallePedido(datos) { const cliente = datos["cliente"] || ""; $("#detalle-ticket-cliente").html(cliente); $("#detalle-ticket-cliente-container").toggleClass("d-none", !cliente); $("#detalle-ticket-fecha").html(datos["fecha"] || "-"); const containerPagos = $("#detalle-ticket-pagos").empty(); const metodosPago = datos["metodosPago"] || []; metodosPago.forEach(function (metodo) { const item = $("", {class: "detalle-ticket-pago"}); if (metodo["icono"]) { item.append($("", { src: metodo["icono"], alt: "", width: 20, height: 20, })); } item.append($("").html(metodo["titulo"] + " - " + metodo["importe"])); containerPagos.append(item); }); $(".detalle-ticket-pagos-dato").toggleClass("d-none", metodosPago.length === 0); const tbody = $("#detalle-ticket-articulos").empty(); (datos["articulos"] || []).forEach(function (articulo) { const nombre = $("").html(articulo["nombre"] || ""); const celdaArticulo = $("").append(nombre); if (articulo["detalle"]) { celdaArticulo.append($("", {class: "d-block"}).html(articulo["detalle"])); } tbody.append( $("").append( celdaArticulo, $("", {class: "text-center"}).html(articulo["unidades"]), $("", {class: "text-end nowrap"}).html(articulo["precio"]), $("", {class: "text-end nowrap"}).html(articulo["total"]) ) ); }); const containerTotales = $("#detalle-ticket-totales").empty(); const totales = datos["totales"] || []; totales.forEach(function (total, index) { containerTotales.append( $("
", { class: "detalle-ticket-total" + (index === totales.length - 1 ? " detalle-ticket-total-final" : "") }).append( $("").html(total["concepto"]), $("").html(total["importe"]) ) ); }); $("#btn-imprimir-ticket-modal, #btn-ticket-regalo").data("id", datos["idPedido"]); } static abrirTicketPDF(idPedido, regalo, urlPDFTicket) { idPedido = parseInt(idPedido, 10); if (!idPedido) { return; } const separador = urlPDFTicket.indexOf("?") === -1 ? "?" : "&"; let url = urlPDFTicket + separador + "idPedido=" + encodeURIComponent(idPedido) + "&CSRF=" + encodeURIComponent(CSRF) + "&imprimir=1"; if (regalo) { url += "®alo=1"; } const ventana = window.open(url, "_blank"); if (ventana) { ventana.opener = null; } } } window.ClassTickets = ClassTickets; class ClassVenta { static init(idCarrito, textosResumen) { $(document).ready(function() { const urlActualizarProducto = "https://gestion.elositodeclaudia.com/ajax/ventas/Venta.actualizarProducto.php"; const urlActualizarTicketDevolucion = "https://gestion.elositodeclaudia.com/ajax/ventas/Venta.actualizarTicketDevolucion.php"; const urlAnadirProducto = "https://gestion.elositodeclaudia.com/ajax/ventas/Venta.anadirProducto.php"; const urlBuscarArticulos = "https://gestion.elositodeclaudia.com/ajax/articulos/Articulos.buscar.php"; const inputArticulo = $("#frm-articulo-inp"); let anadiendoArticulo = false; let peticionActualizarCobro = null; let procesandoVenta = false; let ultimosTotalesVenta = null; function establecerTipoDescuento($input, tipoDescuento) { const $button = $input.siblings(".btn-tipo-descuento-dinamico"); $button.data("tipo-descuento", tipoDescuento).attr("data-tipo-descuento", tipoDescuento); $button.html(tipoDescuento === 2 ? "€" : "%"); $input.data("tipo-descuento", tipoDescuento).attr("data-tipo-descuento", tipoDescuento); } function obtenerImporte(valor) { const texto = String(valor).replace(/[^\d,.-]/g, ""); const normalizado = texto.includes(",") ? texto.replace(/\./g, "").replace(",", ".") : texto; const importe = parseFloat(normalizado); return Number.isFinite(importe) ? importe : 0; } function formatearImporteCarrito(valor) { const texto = String(valor); const esNegativo = /^\s*-/.test(texto); let importe = texto.replace(/[^\d,]/g, ""); const partes = importe.split(","); if (partes.length > 1) importe = partes.shift() + "," + partes.join("").substring(0, 2); if (!importe) return esNegativo ? "-" : ""; return (esNegativo ? "-" : "") + importe + " " + String.fromCharCode(8364); } function formatearImporteTicketDevolucion(valor) { let importe = String(valor).replace(/[^\d,.]/g, ""); const posicionSeparador = importe.search(/[,.]/); if (posicionSeparador >= 0) { const parteEntera = importe.substring(0, posicionSeparador).replace(/\D/g, ""); const parteDecimal = importe.substring(posicionSeparador + 1).replace(/\D/g, "").substring(0, 2); importe = parteEntera + "," + parteDecimal; } else { importe = importe.replace(/\D/g, ""); } return importe ? "-" + importe + " " + String.fromCharCode(8364) : ""; } function formatearImporteTicketDevolucionGuardado(valor) { const importe = Math.abs(Number(valor) || 0); if (importe === 0) return "0,00 " + String.fromCharCode(8364); return "-" + importe.toFixed(2).replace(".", ",") + " " + String.fromCharCode(8364); } function formatearImporteResumen(valor) { return new Intl.NumberFormat("es-ES", {style: "currency", currency: "EUR"}).format(Number(valor) || 0); } function esDescuentoGlobal($input) { return $input.is("#frm-cobro-venta-descuento-global"); } function obtenerPagosVenta() { return { efectivo: Number($("#frm-cobro-venta-total-efectivo").val()) || 0, tarjeta: Number($("#frm-cobro-venta-total-tarjeta").val()) || 0 }; } function esDevolucionVenta(totales) { return Number(totales && totales.total) < -0.005; } function abrirModalCobro() { const esDevolucion = esDevolucionVenta(ultimosTotalesVenta); const modal = ClassBlockUI.abrirBlockUIEstandar( "modal-cobrar-venta", undefined, esDevolucion ? textosResumen.tituloDevolucion : textosResumen.tituloCobrar, "modal681 modal-cobrar-venta", false ); if (modal) { modal.one("shown.bs.modal.ventaCobro", function() { const inputCliente = $("#frm-cobro-venta-cliente"); if (inputCliente.is(":visible")) requestAnimationFrame(function() { inputCliente.trigger("focus"); }); }); } return modal; } function obtenerDatosCobro() { const pagos = obtenerPagosVenta(); return { idCarrito: idCarrito, idCliente: parseInt($("#frm-cobro-venta-id-cliente").val(), 10) || 0, tipoDescuentoGlobal: parseInt($("#frm-cobro-venta-descuento-global").data("tipo-descuento"), 10) || 2, cantidadDescuentoGlobal: obtenerImporte($("#frm-cobro-venta-descuento-global").val()), totalEfectivo: pagos.efectivo, totalTarjeta: pagos.tarjeta, generarTicketRegalo: parseInt($("#frm-cobro-venta-ticket-regalo").val(), 10) || 0, usarSaldoFidelizacion: $("#frm-cobro-venta-usar-saldo").is(":checked") ? 1 : 0, CSRF: CSRF }; } function pintarClienteCobro(cliente) { const hayCliente = !!(cliente && parseInt(cliente.id, 10) > 0); $("#venta-cobro-cliente-buscador").toggleClass("d-none", hayCliente); $("#venta-cobro-cliente-seleccionado, #venta-cobro-saldo-container").toggleClass("d-none", !hayCliente); if (!hayCliente) { $("#frm-cobro-venta-id-cliente").val(0); $("#frm-cobro-venta-cliente").val(""); $("#frm-cobro-venta-usar-saldo").prop("checked", false); return; } $("#frm-cobro-venta-id-cliente").val(cliente.id); $("#venta-cobro-cliente-nombre").text(cliente.nombre || ""); $("#venta-cobro-cliente-nif").text(cliente.nif || ""); $("#venta-cobro-cliente-nif-container").toggleClass("d-none", !cliente.nif); $("#venta-cobro-cliente-telefono").text(cliente.telefono || ""); $("#venta-cobro-cliente-telefono-container").toggleClass("d-none", !cliente.telefono); $("#venta-cobro-saldo-disponible").text(formatearImporteResumen(cliente.saldoDisponible)); } function pintarPagosVenta(totales) { const pagos = obtenerPagosVenta(); const total = Number(totales.total) || 0; const esDevolucion = esDevolucionVenta(totales); const importeObjetivo = Math.abs(total); const importeGestionado = Math.round(Math.abs(pagos.efectivo + pagos.tarjeta) * 100) / 100; const pendiente = Math.round((importeObjetivo - importeGestionado) * 100) / 100; const pagoNecesario = importeObjetivo > 0.005; const formasPago = { efectivo: {nombre: textosResumen.efectivo, icono: textosResumen.iconoEfectivo}, tarjeta: {nombre: textosResumen.tarjeta, icono: textosResumen.iconoTarjeta} }; const lineas = []; Object.keys(formasPago).forEach(function(forma) { if (Math.abs(pagos[forma]) < 0.005) return; lineas.push(`
${formasPago[forma].nombre}${formatearImporteResumen(Math.abs(pagos[forma]))}
`); }); $("#pago-venta-lineas").html(lineas.join("")); $("#pago-venta-pagado").text(formatearImporteResumen(importeGestionado)); $("#pago-venta-pendiente").text((esDevolucion ? textosResumen.pendienteDeDevolver : textosResumen.pendiente) + ": " + formatearImporteResumen(pendiente)); $("#pago-venta-pendiente").toggleClass("venta-cobro-pago-correcto", pagoNecesario && Math.abs(pendiente) <= 0.01); $(".venta-cobro-formas-pago input, #pago-venta-importe, #btn-anadir-pago-venta").prop("disabled", !pagoNecesario); $("#venta-cobro-forma-pago-label").text(esDevolucion ? textosResumen.seleccionarFormaDevolucion : textosResumen.seleccionarFormaPago); $("#pago-venta-pagado-titulo").text(esDevolucion ? textosResumen.devuelto : textosResumen.pagado); const puedeCobrar = Number(totales.numArticulos) > 0 && (!pagoNecesario || Math.abs(pendiente) <= 0.01); $("#btn-cobrar-venta").prop("disabled", !puedeCobrar || procesandoVenta); } function pintarTotalesVenta(totales, datosCobro) { ultimosTotalesVenta = totales; const descuentoArticulos = Number(totales.descuentoArticulos) || 0; const ticketDevolucion = Number(totales.ticketDevolucion) || 0; const ticketDevolucionAplicado = Number(totales.ticketDevolucionAplicado) || 0; const descuentoGlobal = Number(totales.descuentoGlobal) || 0; const saldoAplicado = Number(totales.saldoFidelizacionAplicado) || 0; const saldoAcumulado = Number(totales.saldoFidelizacionAcumulado) || 0; const total = Number(totales.total) || 0; const esDevolucion = esDevolucionVenta(totales); const ticketDevolucionAplicadoParcialmente = Math.abs(ticketDevolucion - ticketDevolucionAplicado) >= 0.005; const tieneDescuentosPrevios = Math.abs(descuentoArticulos) >= 0.005 || Math.abs(ticketDevolucionAplicado) >= 0.005; $("#resumen-venta-subtotal-titulo").text(textosResumen.subtotal + " (" + totales.numArticulos + " " + textosResumen.articulos + ")"); $("#resumen-venta-subtotal-valor, #venta-cobro-subtotal-articulos-valor").text(formatearImporteResumen(totales.subtotalArticulos)); $("#resumen-venta-descuento-articulos, #venta-cobro-descuento-articulos").toggleClass("d-none", Math.abs(descuentoArticulos) < 0.005); $("#resumen-venta-descuento-articulos-valor, #venta-cobro-descuento-articulos-valor").text("-" + formatearImporteResumen(Math.abs(descuentoArticulos))); $("#resumen-venta-ticket-devolucion, #venta-cobro-ticket-devolucion").toggleClass("d-none", Math.abs(ticketDevolucion) < 0.005); $("#resumen-venta-ticket-devolucion-titulo").text(textosResumen.ticketDevolucion + (ticketDevolucionAplicadoParcialmente ? " (" + formatearImporteResumen(ticketDevolucion) + ")" : "")); $("#resumen-venta-ticket-devolucion-valor, #venta-cobro-ticket-devolucion-valor").text(formatearImporteResumen(ticketDevolucionAplicadoParcialmente ? ticketDevolucionAplicado : ticketDevolucion)); $("#venta-cobro-total-con-descuentos").toggleClass("d-none", !tieneDescuentosPrevios); $("#venta-cobro-total-con-descuentos-valor").text(formatearImporteResumen(totales.totalTrasTicket)); $("#venta-cobro-descuento-global-resumen").toggleClass("d-none", descuentoGlobal < 0.005); $("#venta-cobro-descuento-global-titulo").text(textosResumen.descuentoGlobal + " " + (Number(totales.tipoDescuentoGlobal) === 1 ? formatearNumero(totales.cantidadDescuentoGlobal) + "%" : formatearImporteResumen(totales.cantidadDescuentoGlobal))); $("#venta-cobro-descuento-global-valor").text("-" + formatearImporteResumen(descuentoGlobal)); $("#venta-cobro-total-tras-descuento-global").toggleClass("d-none", descuentoGlobal < 0.005); $("#venta-cobro-total-tras-descuento-global-valor").text(formatearImporteResumen(totales.totalTrasDescuentoGlobal)); $("#venta-cobro-saldo-aplicado").toggleClass("d-none", saldoAplicado < 0.005); $("#venta-cobro-saldo-aplicado-valor").text("-" + formatearImporteResumen(saldoAplicado)); $("#venta-cobro-saldo-acumulado-valor").text(formatearImporteResumen(saldoAcumulado)); $("#venta-cobro-total-valor").text(formatearImporteResumen(total)); $("#resumen-venta-total-valor").text(formatearImporteResumen(totales.totalTrasTicket)); $("#venta-cobro-base-imponible-valor").text(formatearImporteResumen(totales.baseImponible)); $("#venta-cobro-iva-valor").text(formatearImporteResumen(totales.iva)); $("#venta-cobro-num-articulos-valor").text(totales.numArticulos); $("#btn-abrir-cobrar").text((esDevolucion ? textosResumen.devolver : textosResumen.cobrar) + " - " + formatearImporteResumen(total)); $("#btn-cobrar-venta").text(esDevolucion ? textosResumen.devolver : textosResumen.cobrar); if (datosCobro) { const inputDescuentoGlobal = $("#frm-cobro-venta-descuento-global"); establecerTipoDescuento(inputDescuentoGlobal, Number(datosCobro.tipoDescuentoGlobal) === 1 ? 1 : 2); inputDescuentoGlobal.val(formatearNumero(datosCobro.cantidadDescuentoGlobal)); $("#frm-cobro-venta-total-efectivo").val(Number(datosCobro.totalEfectivo) || 0); $("#frm-cobro-venta-total-tarjeta").val(Number(datosCobro.totalTarjeta) || 0); $("#frm-cobro-venta-ticket-regalo").val(Number(datosCobro.generarTicketRegalo) || 0); $(".venta-cobro-regalo").toggleClass("active", !!Number(datosCobro.generarTicketRegalo)).attr("aria-pressed", Number(datosCobro.generarTicketRegalo) ? "true" : "false"); $("#frm-cobro-venta-usar-saldo").prop("checked", !!Number(datosCobro.usarSaldoFidelizacion)); pintarClienteCobro(datosCobro.cliente); } pintarPagosVenta(totales); } function formatearNumero(valor) { return new Intl.NumberFormat("es-ES", {maximumFractionDigits: 2}).format(Number(valor) || 0); } function actualizarResumenVenta() { return $.ajax({ url: textosResumen.urlTotales, type: "GET", dataType: "json", data: {idCarrito: idCarrito, CSRF: CSRF} }).done(function(data) { if (!data || data.error_number < 0 || !data.totales) return; pintarTotalesVenta(data.totales, data.carrito || null); }); } function guardarDatosCobro(alGuardar) { if (peticionActualizarCobro) peticionActualizarCobro.abort(); const peticion = $.ajax({ url: textosResumen.urlActualizarCobro, type: "POST", dataType: "json", data: obtenerDatosCobro() }).done(function(data) { if (!data || data.error_number < 0 || !data.totales) { mostrarError(data || {error_message: textosResumen.errorInesperado}); return; } pintarTotalesVenta(data.totales, data.carrito || null); if (alGuardar) alGuardar(data); }).fail(function(xhr, estado) { if (estado !== "abort") mostrarError({error_message: textosResumen.errorInesperado}); }).always(function() { if (peticionActualizarCobro === peticion) peticionActualizarCobro = null; }); peticionActualizarCobro = peticion; return peticionActualizarCobro; } function recargarTablaVenta() { const tabla = $("#tablaVenta").DataTable(); if (tabla) tabla.ajax.reload(null, false); actualizarResumenVenta(); } function mostrarError(data) { if (data && data.error_message) Web.notify(data.error_message, true); } function anadirArticulo(item) { if (!item || anadiendoArticulo) return; anadiendoArticulo = true; $.ajax({ url: urlAnadirProducto, type: "POST", dataType: "json", data: { idCarrito: idCarrito, idProducto: item.idProducto || item.id, idAtributoProducto: item.idAtributoProducto || 0, devolucion: $("#frm-articulo-devolucion").is(":checked") ? 1 : 0, CSRF: CSRF } }).done(function(data) { if (!data || data.error_number < 0) { mostrarError(data); return; } inputArticulo.val(""); recargarTablaVenta(); }).fail(function() { recargarTablaVenta(); }).always(function() { anadiendoArticulo = false; inputArticulo.focus(); }); } const sourceArticulos = function(request, response) { $.ajax({ url: urlBuscarArticulos, dataType: "json", data: { term: request.term, conStock: $("#frm-articulo-devolucion").is(":checked") ? 0 : 1, CSRF: CSRF } }).done(response).fail(function() { response([]); }); }; Utils.preparaAutoCompleteBuscar( undefined, "frm-articulo-inp", undefined, anadirArticulo, undefined, "ClassVenta.idArticuloAutocomplete", sourceArticulos, {mainIdItem: "id", showNoResults: false, minLength: 0, autoDisableInput: false} ); const seleccionarClienteCobro = function(item) { if (!item || parseInt(item.id, 10) <= 0) return; pintarClienteCobro(item); $("#frm-cobro-venta-cliente").val(""); guardarDatosCobro(); }; ClassClientes.preparaAutocompleteCliente( "frm-cobro-venta-cliente", textosResumen.urlBuscarClientes, seleccionarClienteCobro, "ClassVenta.idClienteAutocomplete", function (cliente) { abrirModalCobro(); seleccionarClienteCobro(cliente); }, function () { abrirModalCobro(); } ); inputArticulo.off("autocompleteresponse.venta").on("autocompleteresponse.venta", function(event, ui) { const resultados = (ui && ui.content) || []; if (resultados.length !== 1 || parseInt(resultados[0].id, 10) <= 0 || anadiendoArticulo) return; const item = resultados[0]; window.setTimeout(function() { const instancia = inputArticulo.autocomplete("instance"); if (!instancia || anadiendoArticulo) return; if (inputArticulo.val() !== item.value) inputArticulo.val(item.value); instancia._trigger("select", event, {item: item}); inputArticulo.autocomplete("close"); }, 0); }); function guardarProducto(id, accion, valor, tipoDescuento) { const datos = {id: id, accion: accion, valor: valor, CSRF: CSRF}; if (tipoDescuento) datos.tipoDescuento = tipoDescuento; $.ajax({ url: urlActualizarProducto, type: "POST", dataType: "json", data: datos }).done(function(data) { if (!data || data.error_number < 0) { mostrarError(data); recargarTablaVenta(); return; } recargarTablaVenta(); }).fail(function() { recargarTablaVenta(); }); } function guardarTicketDevolucion(accion, valor, alGuardar) { const datos = {idCarrito: idCarrito, accion: accion, CSRF: CSRF}; if (valor !== undefined) datos.valor = valor; $.ajax({ url: urlActualizarTicketDevolucion, type: "POST", dataType: "json", data: datos }).done(function(data) { if (!data || data.error_number < 0) { mostrarError(data); return; } if (alGuardar) alGuardar(data); }); } $("#frm-articulo-devolucion").change(function() { const isChecked = $(this).is(':checked'); $("#form-buscar").toggleClass('devolucion', isChecked); inputArticulo.autocomplete("close").val("").focus(); }); $(document).on("click", "#btn-ver-aparcados", function() { ClassBlockUI.abrirBlockUIEstandar("modal-aparcados", undefined, "Tickets aparcados", "modal681"); }); $(document).on("click", ".btn-eliminar-apartado", function() { const id = $(this).data("id"); const parent = $(this).parents(".item-aparcado").parent(); const espere = ClassBlockUI.abrirBlockUIConfirm("Va a eliminar un ticket aparcado, ¿Desea continuar?", "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/ventas/Venta.eliminar.php?id=" + id, { successCallback: function (data) { espere.modal("hide"); if (data["error_number"] < 0) { Web.notify(data["error_message"], true); } else { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true, "location"); } } }); }, "Cancelar"); }); $(document).off("click.venta", ".btn-tipo-descuento-dinamico").on("click.venta", ".btn-tipo-descuento-dinamico", function() { const $button = $(this); const $input = $button.siblings(".inp-descuento-dinamico"); const tipoDescuento = parseInt($button.data("tipo-descuento"), 10) === 2 ? 1 : 2; establecerTipoDescuento($input, tipoDescuento); if (esDescuentoGlobal($input)) guardarDatosCobro(); else guardarProducto($input.data("id"), "descuento", obtenerImporte($input.val()), tipoDescuento); }); $(document).off("keydown.venta", ".inp-descuento-dinamico").on("keydown.venta", ".inp-descuento-dinamico", function(event) { const $input = $(this); if (event.key === "%" || event.key === "€") { event.preventDefault(); const tipoDescuento = event.key === "€" ? 2 : 1; establecerTipoDescuento($input, tipoDescuento); if (esDescuentoGlobal($input)) guardarDatosCobro(); else guardarProducto($input.data("id"), "descuento", obtenerImporte($input.val()), tipoDescuento); return; } if (event.key === "Enter") { event.preventDefault(); if (esDescuentoGlobal($input)) guardarDatosCobro(); else guardarProducto($input.data("id"), "descuento", obtenerImporte($input.val()), parseInt($input.data("tipo-descuento"), 10)); return; } const teclasPermitidas = ["Backspace", "Delete", "Tab", "Enter", "Escape", "ArrowLeft", "ArrowRight", "Home", "End"]; const esAtajo = (event.ctrlKey || event.metaKey) && ["a", "c", "v", "x"].includes(event.key.toLowerCase()); const permiteMenos = parseInt($input.data("tipo-descuento"), 10) === 2 && event.key === "-"; if (!/^\d$/.test(event.key) && event.key !== "," && !permiteMenos && !teclasPermitidas.includes(event.key) && !esAtajo) event.preventDefault(); }); $(document).off("input.venta", ".inp-descuento-dinamico").on("input.venta", ".inp-descuento-dinamico", function() { const permiteMenos = parseInt($(this).data("tipo-descuento"), 10) === 2; this.value = this.value.replace(permiteMenos ? /[^\d,-]/g : /[^\d,]/g, ""); if (permiteMenos) this.value = this.value.replace(/(?!^)-/g, ""); }); $(document).off("change.venta", ".inp-descuento-dinamico").on("change.venta", ".inp-descuento-dinamico", function() { const $input = $(this); if (esDescuentoGlobal($input)) guardarDatosCobro(); else guardarProducto($input.data("id"), "descuento", obtenerImporte(this.value), parseInt($input.data("tipo-descuento"), 10)); }); $(document).off("click.venta", ".btn-cantidad-carrito-crm-decrementar, .btn-cantidad-carrito-crm-incrementar").on("click.venta", ".btn-cantidad-carrito-crm-decrementar, .btn-cantidad-carrito-crm-incrementar", function() { const $input = $(this).siblings(".input-cantidad-carrito-crm"); const cantidadActual = parseInt($input.val(), 10) || 0; const minimo = parseInt($input.attr("min"), 10) || 0; const maximo = parseInt($input.attr("max"), 10); const incremento = $(this).hasClass("btn-cantidad-carrito-crm-incrementar") ? 1 : -1; const cantidadNueva = Number.isFinite(maximo) ? Math.min(maximo, Math.max(minimo, cantidadActual + incremento)) : Math.max(minimo, cantidadActual + incremento); if (cantidadNueva === cantidadActual) return; $input.val(cantidadNueva); guardarProducto($input.data("id"), "cantidad", cantidadNueva); }); $(document).off("change.venta", ".input-cantidad-carrito-crm").on("change.venta", ".input-cantidad-carrito-crm", function() { const $input = $(this); const minimo = parseInt($input.attr("min"), 10) || 0; const maximo = parseInt($input.attr("max"), 10); const cantidad = parseInt($input.val(), 10); const cantidadNueva = Number.isFinite(cantidad) ? (Number.isFinite(maximo) ? Math.min(maximo, Math.max(minimo, cantidad)) : Math.max(minimo, cantidad)) : minimo; $input.val(cantidadNueva); guardarProducto($input.data("id"), "cantidad", cantidadNueva); }); $(document).off("keydown.venta", ".input-cantidad-carrito-crm").on("keydown.venta", ".input-cantidad-carrito-crm", function(event) { if (event.key !== "Enter") return; event.preventDefault(); $(this).trigger("change"); }); $(document).off("click.venta", ".btn-eliminar-producto-carrito").on("click.venta", ".btn-eliminar-producto-carrito", function() { guardarProducto($(this).data("id"), "cantidad", 0); }); $(document).off("click.venta", ".btn-anadir-ticket-devolucion").on("click.venta", ".btn-anadir-ticket-devolucion", function() { guardarTicketDevolucion("anadir", undefined, function() { window.location.reload(); }); }); $(document).off("click.venta", ".btn-eliminar-ticket-devolucion").on("click.venta", ".btn-eliminar-ticket-devolucion", function() { guardarTicketDevolucion("eliminar", undefined, function() { window.location.reload(); }); }); $(document).off("click.venta", ".btn-editar-importe").on("click.venta", ".btn-editar-importe", function() { const $container = $(this).closest(".container-precio-articulo-dinamico"); const $input = $container.find(".input-importe"); if ($input.hasClass("input-importe-ticket-devolucion")) { const importe = obtenerImporte($input.val()); $input.val(formatearImporteTicketDevolucion(importe === 0 ? "" : -Math.abs(importe))); $input.prop("readonly", false).focus().select(); return; } const $descuento = $container.closest("tr").find(".inp-descuento-dinamico"); establecerTipoDescuento($descuento, 2); $input.prop("readonly", false).focus().select(); }); $(document).off("keydown.venta", ".input-importe:not(.input-importe-ticket-devolucion)").on("keydown.venta", ".input-importe:not(.input-importe-ticket-devolucion)", function(event) { if (event.key !== "Enter") return; event.preventDefault(); const $input = $(this); guardarProducto($input.data("id"), "total", obtenerImporte($input.val())); }); $(document).off("input.venta", ".input-importe-carrito-crm").on("input.venta", ".input-importe-carrito-crm", function() { const valorFormateado = formatearImporteCarrito(this.value); this.value = valorFormateado; const posicionCursor = valorFormateado === "-" ? 1 : Math.max(0, valorFormateado.length - 2); this.setSelectionRange(posicionCursor, posicionCursor); }); $(document).off("change.venta", ".input-importe-carrito-crm").on("change.venta", ".input-importe-carrito-crm", function() { const $input = $(this); guardarProducto($input.data("id"), "total", obtenerImporte(this.value)); }); $(document).off("keydown.venta", ".input-importe-ticket-devolucion").on("keydown.venta", ".input-importe-ticket-devolucion", function(event) { if (event.key !== "Enter") return; event.preventDefault(); $(this).trigger("change"); }); $(document).off("input.venta", ".input-importe-ticket-devolucion").on("input.venta", ".input-importe-ticket-devolucion", function() { const textoAntesCursor = this.value.substring(0, this.selectionStart); const valorFormateado = formatearImporteTicketDevolucion(this.value); this.value = valorFormateado; const valorAntesCursor = formatearImporteTicketDevolucion(textoAntesCursor); const posicionCursor = valorAntesCursor ? Math.max(1, valorAntesCursor.length - 2) : 0; this.setSelectionRange(posicionCursor, posicionCursor); }); $(document).off("change.venta", ".input-importe-ticket-devolucion").on("change.venta", ".input-importe-ticket-devolucion", function() { const $input = $(this); guardarTicketDevolucion("total", obtenerImporte(this.value), function(data) { const total = data && data.total !== undefined ? data.total : 0; $input.val(formatearImporteTicketDevolucionGuardado(total)); actualizarResumenVenta(); }); }); $(document).off("click.ventaCobro", "#btn-abrir-cobrar").on("click.ventaCobro", "#btn-abrir-cobrar", function() { actualizarResumenVenta(); abrirModalCobro(); }); $(document).off("click.ventaCobro", "#btn-eliminar-cliente-cobro").on("click.ventaCobro", "#btn-eliminar-cliente-cobro", function() { pintarClienteCobro(null); guardarDatosCobro(); }); $(document).off("change.ventaCobro", "#frm-cobro-venta-usar-saldo").on("change.ventaCobro", "#frm-cobro-venta-usar-saldo", function() { guardarDatosCobro(); }); $(document).off("click.ventaCobro", ".venta-cobro-regalo").on("click.ventaCobro", ".venta-cobro-regalo", function() { window.setTimeout(guardarDatosCobro, 0); }); $(document).off("click.ventaCobro", "#btn-anadir-pago-venta").on("click.ventaCobro", "#btn-anadir-pago-venta", function() { if (!ultimosTotalesVenta || Math.abs(Number(ultimosTotalesVenta.total) || 0) < 0.005) return; const importe = obtenerImporte($("#pago-venta-importe").val()); const pagos = obtenerPagosVenta(); const pendiente = Math.round((Math.abs(Number(ultimosTotalesVenta.total)) - Math.abs(pagos.efectivo + pagos.tarjeta)) * 100) / 100; if (importe <= 0 || importe - pendiente > 0.009) { mostrarError({error_message: textosResumen.importePagoNoValido}); return; } const forma = $(".input-forma-pago-venta:checked").val(); const idInput = forma === "tarjeta" ? "#frm-cobro-venta-total-tarjeta" : "#frm-cobro-venta-total-efectivo"; const signo = esDevolucionVenta(ultimosTotalesVenta) ? -1 : 1; $(idInput).val(Math.round(((Number($(idInput).val()) || 0) + signo * importe) * 100) / 100); $("#pago-venta-importe").val(""); guardarDatosCobro(); }); $(document).off("keydown.ventaCobro", "#pago-venta-importe").on("keydown.ventaCobro", "#pago-venta-importe", function(event) { if (event.key === "Enter") { event.preventDefault(); $("#btn-anadir-pago-venta").trigger("click"); } }); $(document).off("click.ventaCobro", "#pago-venta-pendiente").on("click.ventaCobro", "#pago-venta-pendiente", function() { if (!ultimosTotalesVenta || Math.abs(Number(ultimosTotalesVenta.total) || 0) < 0.005) return; const pagos = obtenerPagosVenta(); const pendiente = Math.round((Math.abs(Number(ultimosTotalesVenta.total)) - Math.abs(pagos.efectivo + pagos.tarjeta)) * 100) / 100; if (pendiente <= 0) return; $("#pago-venta-importe").val(formatearNumero(pendiente)).focus().select(); }); $(document).off("click.ventaCobro", ".btn-eliminar-pago-venta").on("click.ventaCobro", ".btn-eliminar-pago-venta", function() { const idInput = $(this).data("forma") === "tarjeta" ? "#frm-cobro-venta-total-tarjeta" : "#frm-cobro-venta-total-efectivo"; $(idInput).val(0); guardarDatosCobro(); }); function ejecutarAccionVenta(url, esCobro) { if (procesandoVenta) return; procesandoVenta = true; $("#btn-cobrar-venta, .btn-aparcar-venta").prop("disabled", true); const generarTicketRegalo = esCobro && Number($("#frm-cobro-venta-ticket-regalo").val()) === 1; const ventanaTicket = esCobro ? window.open("about:blank", "_blank") : null; const espere = ClassBlockUI.abrirBlockUIEsperePorFavor(); let completado = false; $.ajax({ url: url, type: "POST", dataType: "json", data: {idCarrito: idCarrito, CSRF: CSRF} }).done(function(data) { if (espere) espere.modal("hide"); if (!data || data.error_number < 0) { mostrarError(data || {error_message: textosResumen.errorInesperado}); return; } completado = true; if (esCobro && data.idPedido > 0 && data.urlTicket) { const separador = data.urlTicket.indexOf("?") === -1 ? "?" : "&"; const urlTicket = data.urlTicket + separador + "idPedido=" + encodeURIComponent(data.idPedido) + "&CSRF=" + encodeURIComponent(CSRF) + "&imprimir=1" + (generarTicketRegalo ? "®alo=1" : ""); if (ventanaTicket) ventanaTicket.location.href = urlTicket; else window.open(urlTicket, "_blank"); } else if (ventanaTicket) { ventanaTicket.close(); } window.location.href = data.redirect; }).fail(function() { if (espere) espere.modal("hide"); if (ventanaTicket) ventanaTicket.close(); mostrarError({error_message: textosResumen.errorInesperado}); }).always(function() { if (!completado) { if (ventanaTicket) ventanaTicket.close(); procesandoVenta = false; $(".btn-aparcar-venta").prop("disabled", false); if (ultimosTotalesVenta) pintarPagosVenta(ultimosTotalesVenta); } }); } $(document).off("click.ventaCobro", ".btn-aparcar-venta").on("click.ventaCobro", ".btn-aparcar-venta", function() { if (!ultimosTotalesVenta || Number(ultimosTotalesVenta.numArticulos) <= 0) { mostrarError({error_message: textosResumen.ventaSinArticulosAparcar}); return; } guardarDatosCobro(function() { ejecutarAccionVenta(textosResumen.urlAparcar, false); }); }); $(document).off("click.ventaCobro", "#btn-cobrar-venta").on("click.ventaCobro", "#btn-cobrar-venta", function() { if (!ultimosTotalesVenta) return; const pagos = obtenerPagosVenta(); const total = Number(ultimosTotalesVenta.total) || 0; if (Math.abs(total) > 0.005 && Math.abs((pagos.efectivo + pagos.tarjeta) - total) >= 0.01) { mostrarError({error_message: esDevolucionVenta(ultimosTotalesVenta) ? textosResumen.devolucionesNoCoinciden : textosResumen.pagosNoCoinciden}); return; } guardarDatosCobro(function() { ejecutarAccionVenta(textosResumen.urlCobrar, true); }); }); actualizarResumenVenta(); }); } } window.ClassVenta = ClassVenta; ClassVenta.idArticuloAutocomplete = -1; ClassVenta.idClienteAutocomplete = -1; class ClassConfiguracion { static initCategorias(idPadre) { $(document).ready(function () { $("body").on("click", "#btn-guardar-categoria", function () { ClassConfiguracion.guardarCategoria(); }); $("body").on("click", ".btn-editar-categoria", function () { const id = $(this).attr("data-id") || -1; const nombre = $(this).attr("data-nombre") || ""; const visible = $(this).attr("data-visible"); const idPadreCategoria = $(this).attr("data-id-padre") || idPadre; document.getElementById(ClassConfiguracion.formCategoriaId).reset(); $("#" + ClassConfiguracion.formCategoriaId + "-id").val(id); $("#" + ClassConfiguracion.formCategoriaId + "-id-padre").val(idPadreCategoria); $("#" + ClassConfiguracion.formCategoriaId + "-titulo").val(nombre); $("#" + ClassConfiguracion.formCategoriaId + "-visible-web").prop("checked", visible === undefined || visible === "1"); ClassConfiguracion.abreModalCategoria(id > 0 ? "Editar categoría" : "Nueva categoría"); }); $("body").on("click", ".btn-eliminar-categoria", function () { const id = $(this).attr("data-id"); const nombre = $(this).attr("data-nombre"); ClassBlockUI.abrirBlockUIConfirm("Va eliminar la categoría %1%, ¿Desea continuar?".replace("%1%", nombre), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/categorias/Categoria.eliminar.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaCategorias.ajax.reload(); } }); }, "Cancelar"); }); $("body").on("click", ".btn-toggle-visible-web-categoria", function () { const id = $(this).attr("data-id"); const esperePorFavor = Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/categorias/Categoria.toggleVisibleEnWeb.php?id=" + id, { successCallback: function (data) { esperePorFavor.modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaCategorias.ajax.reload(null, false); } }); }); }); } static guardarCategoria() { ClassConfiguracion.esperePorFavor = Utils.sendStandardAjax(ClassConfiguracion.formCategoriaId, "https://gestion.elositodeclaudia.com/ajax/categorias/Categoria.guardar.php", { successCallback: function (data) { ClassConfiguracion.esperePorFavor.modal("hide"); if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } $(".modal").modal("hide"); Web.notify(data["error_message"]); tablatablaCategorias.ajax.reload(); } }); } static abreModalCategoria(title) { ClassBlockUI.abrirBlockUIEstandar("modal-categoria", undefined, title, "modal500"); } static initMarcas() { $(document).ready(function () { $("body").on("click", "#btn-guardar-marca", function () { ClassConfiguracion.guardarMarca(); }); $("body").on("click", ".btn-editar-marca", function () { const id = $(this).attr("data-id") || -1; const nombre = $(this).attr("data-nombre") || ""; const visible = $(this).attr("data-visible"); document.getElementById(ClassConfiguracion.formMarcaId).reset(); $("#" + ClassConfiguracion.formMarcaId + "-id").val(id); $("#" + ClassConfiguracion.formMarcaId + "-nombre").val(nombre); $("#" + ClassConfiguracion.formMarcaId + "-visible-web").prop("checked", visible === undefined || visible === "1"); ClassConfiguracion.abreModalMarca(id > 0 ? "Editar marca" : "Nueva marca"); }); $("body").on("click", ".btn-eliminar-marca", function () { const id = $(this).attr("data-id"); const nombre = $(this).attr("data-nombre"); ClassBlockUI.abrirBlockUIConfirm("Va eliminar la marca %1%, ¿Desea continuar?".replace("%1%", nombre), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/marcas/Marca.eliminar.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaMarcas.ajax.reload(); } }); }, "Cancelar"); }); $("body").on("click", ".btn-toggle-visible-web-marca", function () { const id = $(this).attr("data-id"); const esperePorFavor = Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/marcas/Marca.toggleVisibleEnWeb.php?id=" + id, { successCallback: function (data) { esperePorFavor.modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaMarcas.ajax.reload(null, false); } }); }); }); } static guardarMarca() { ClassConfiguracion.esperePorFavor = Utils.sendStandardAjax(ClassConfiguracion.formMarcaId, "https://gestion.elositodeclaudia.com/ajax/marcas/Marca.guardar.php", { successCallback: function (data) { ClassConfiguracion.esperePorFavor.modal("hide"); if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } $(".modal").modal("hide"); Web.notify(data["error_message"]); tablatablaMarcas.ajax.reload(); } }); } static abreModalMarca(title) { ClassBlockUI.abrirBlockUIEstandar("modal-marca", undefined, title, "modal500"); } static initTallas() { $(document).ready(function () { $("body").on("click", "#btn-guardar-talla", function () { ClassConfiguracion.guardarTalla(); }); $("body").on("click", ".btn-editar-talla", function () { const id = $(this).attr("data-id") || -1; const titulo = $(this).attr("data-titulo") || ""; document.getElementById(ClassConfiguracion.formTallaId).reset(); $("#" + ClassConfiguracion.formTallaId + "-id").val(id); $("#" + ClassConfiguracion.formTallaId + "-titulo").val(titulo); ClassConfiguracion.abreModalTalla(id > 0 ? "Editar talla" : "Nueva talla"); }); $("body").on("click", ".btn-eliminar-talla", function () { const id = $(this).attr("data-id"); const titulo = $(this).attr("data-titulo"); ClassBlockUI.abrirBlockUIConfirm("Va eliminar la talla %1%, ¿Desea continuar?".replace("%1%", titulo), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/tallas/Talla.eliminar.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaTallas.ajax.reload(); } }); }, "Cancelar"); }); }); } static guardarTalla() { ClassConfiguracion.esperePorFavor = Utils.sendStandardAjax(ClassConfiguracion.formTallaId, "https://gestion.elositodeclaudia.com/ajax/tallas/Talla.guardar.php", { successCallback: function (data) { ClassConfiguracion.esperePorFavor.modal("hide"); if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } $(".modal").modal("hide"); Web.notify(data["error_message"]); tablatablaTallas.ajax.reload(); } }); } static abreModalTalla(title) { ClassBlockUI.abrirBlockUIEstandar("modal-talla", undefined, title, "modal500"); } static initGrupoTallas() { $(document).ready(function () { $("body").on("click", "#btn-guardar-grupo-tallas", function () { ClassConfiguracion.guardarGrupoTallas(); }); $("body").on("click", ".btn-editar-grupo-tallas", function () { const id = $(this).attr("data-id") || -1; const nombre = $(this).attr("data-nombre") || ""; let valores = []; try { valores = JSON.parse($(this).attr("data-valores") || "[]"); } catch (e) { valores = []; } document.getElementById(ClassConfiguracion.formGrupoTallasId).reset(); $("#" + ClassConfiguracion.formGrupoTallasId + "-id").val(id); $("#" + ClassConfiguracion.formGrupoTallasId + "-nombre").val(nombre); $("#" + ClassConfiguracion.formGrupoTallasId + " input[type='checkbox']").prop("checked", false); valores.forEach(function (valor) { $("#" + ClassConfiguracion.formGrupoTallasId + " input[name='valores[" + valor.tipo + "][]'][value='" + valor.id + "']").prop("checked", true); }); ClassConfiguracion.actualizaSeleccionadasGrupoTallas(); $("#btn-guardar-grupo-tallas-text").text(id > 0 ? "Guardar Cambios" : "Crear Grupo"); ClassConfiguracion.abreModalGrupoTallas(id > 0 ? "Editar grupo de tallas" : "Nuevo grupo de tallas"); }); $("body").on("click", ".btn-eliminar-grupo-tallas", function () { const id = $(this).attr("data-id"); const nombre = $(this).attr("data-nombre"); ClassBlockUI.abrirBlockUIConfirm("Va eliminar el grupo de tallas %1%, ¿Desea continuar?".replace("%1%", nombre), "Continuar", function () { Utils.sendStandardAjax(null, "https://gestion.elositodeclaudia.com/ajax/grupoTallas/GrupoTallas.eliminar.php?id=" + id, { successCallback: function (data) { $(".modal").modal("hide"); Web.notify(data["error_message"], data["error_number"] < 0); if (data["error_number"] >= 0) tablatablaGrupoTallas.ajax.reload(); } }); }, "Cancelar"); }); $("body").on("change", "#" + ClassConfiguracion.formGrupoTallasId + " input[type='checkbox']", function () { ClassConfiguracion.actualizaSeleccionadasGrupoTallas(); }); }); } static guardarGrupoTallas() { ClassConfiguracion.esperePorFavor = Utils.sendStandardAjax(ClassConfiguracion.formGrupoTallasId, "https://gestion.elositodeclaudia.com/ajax/grupoTallas/GrupoTallas.guardar.php", { successCallback: function (data) { ClassConfiguracion.esperePorFavor.modal("hide"); if (data["error_number"] < 0) { ClassBlockUI.abrirBlockUIEstandarMensaje(data["error_message"], true); return; } $(".modal").modal("hide"); Web.notify(data["error_message"]); tablatablaGrupoTallas.ajax.reload(); } }); } static actualizaSeleccionadasGrupoTallas() { const total = $("#" + ClassConfiguracion.formGrupoTallasId + " input[type='checkbox']:checked").length; $("#frm-grupo-tallas-num-seleccionadas").text(total); } static abreModalGrupoTallas(title) { ClassBlockUI.abrirBlockUIEstandar("modal-grupo-tallas", undefined, title, "modal900"); } } ClassConfiguracion.formCategoriaId = "frm-categoria"; ClassConfiguracion.formMarcaId = "frm-marca"; ClassConfiguracion.formTallaId = "frm-talla"; ClassConfiguracion.formGrupoTallasId = "frm-grupo-tallas"; ClassConfiguracion.esperePorFavor = null; window.ClassConfiguracion = ClassConfiguracion;