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 += '';
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;
| | | |