").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" },
bizum: {
nombre: "Bizum",
icono: "https:\/\/gestion.elositodeclaudia.com\/img\/iconos\/bizum.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 urlAnadirProductoTemporal = textosResumen.urlAnadirProductoTemporal;
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,
bizum: Number($("#frm-cobro-venta-total-bizum").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,
totalBizum: pagos.bizum,
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 + pagos.bizum) * 100) / 100;
const importeEfectivo = Math.abs(pagos.efectivo);
const importeTarjeta = Math.abs(pagos.tarjeta);
const importeBizum = Math.abs(pagos.bizum);
const importeNoEfectivo = Math.round((importeTarjeta + importeBizum) * 100) / 100;
const pendienteTrasPagoNoEfectivo = Math.max(0, Math.round((importeObjetivo - importeNoEfectivo) * 100) / 100);
const cambio = esDevolucion ? 0 : Math.max(0, Math.round((importeEfectivo - pendienteTrasPagoNoEfectivo) * 100) / 100);
const pendiente = esDevolucion
? Math.round((importeObjetivo - importeGestionado) * 100) / 100
: Math.max(0, Math.round((pendienteTrasPagoNoEfectivo - importeEfectivo) * 100) / 100);
const pagoNecesario = importeObjetivo > 0.005;
const formasPago = {
efectivo: {nombre: textosResumen.efectivo, icono: textosResumen.iconoEfectivo},
tarjeta: {nombre: textosResumen.tarjeta, icono: textosResumen.iconoTarjeta},
bizum: {nombre: textosResumen.bizum, icono: textosResumen.iconoBizum}
};
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));
const tieneCambio = cambio > 0.005;
$("#pago-venta-pendiente").text((tieneCambio ? textosResumen.aDevolver : (esDevolucion ? textosResumen.pendienteDeDevolver : textosResumen.pendiente)) + ": " + formatearImporteResumen(tieneCambio ? cambio : pendiente));
const pagoCompleto = esDevolucion ? Math.abs(pendiente) <= 0.01 : pendiente <= 0.01;
$("#pago-venta-pendiente")
.toggleClass("venta-cobro-pago-correcto", pagoNecesario && pagoCompleto && !tieneCambio)
.toggleClass("venta-cobro-a-devolver", tieneCambio);
$(".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 pagoNoEfectivoValido = esDevolucion || importeNoEfectivo - importeObjetivo <= 0.001;
const puedeCobrar = Number(totales.numArticulos) > 0 && pagoNoEfectivoValido && (!pagoNecesario || pagoCompleto);
$("#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));
if (datosCobro.totalEfectivoIntroducido !== undefined)
$("#frm-cobro-venta-total-efectivo").val(Number(datosCobro.totalEfectivoIntroducido) || 0);
$("#frm-cobro-venta-total-tarjeta").val(Number(datosCobro.totalTarjeta) || 0);
$("#frm-cobro-venta-total-bizum").val(Number(datosCobro.totalBizum) || 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 actualizarTipoTallaProductoTemporal() {
const tieneTalla = parseInt($("#frm-producto-temporal-talla").val(), 10) > 0;
$("#container-producto-temporal-tipo-talla").toggleClass("d-none", !tieneTalla);
}
function cerrarModalProductoTemporal() {
const modal = $(".modal[id^='blockUI_modal-producto-temporal']").last();
const instancia = modal.length ? bootstrap.Modal.getInstance(modal.get(0)) : null;
if (instancia)
instancia.hide();
else if (modal.length)
modal.modal("hide");
}
function abrirModalProductoTemporal(nombreInicial) {
const formulario = $("#frm-producto-temporal");
formulario.get(0).reset();
$("#frm-producto-temporal-nombre").val(nombreInicial || "");
actualizarTipoTallaProductoTemporal();
inputArticulo.val("");
const modal = ClassBlockUI.abrirBlockUIEstandar(
"modal-producto-temporal",
undefined,
textosResumen.anadirProductoTemporal,
"modal500"
);
if (modal) {
modal.one("shown.bs.modal.productoTemporal", function() {
$("#frm-producto-temporal-nombre").trigger("focus");
});
}
}
function guardarProductoTemporal() {
const nombre = $.trim($("#frm-producto-temporal-nombre").val());
const idAtributoValor = parseInt($("#frm-producto-temporal-talla").val(), 10) || 0;
const pvp = obtenerImporte($("#frm-producto-temporal-pvp").val());
if (nombre.length < 2) {
mostrarError({error_message: textosResumen.validaNombreProductoTemporal});
return;
}
if (pvp <= 0) {
mostrarError({error_message: textosResumen.validaPrecioProductoTemporal});
return;
}
if (anadiendoArticulo)
return;
anadiendoArticulo = true;
$.ajax({
url: urlAnadirProductoTemporal,
type: "POST",
dataType: "json",
data: {
idCarrito: idCarrito,
nombre: nombre,
pvp: pvp,
idAtributoValor: idAtributoValor,
tipoTalla: idAtributoValor > 0 ? $("#frm-producto-temporal-tipo-talla").val() : 0,
devolucion: $("#frm-articulo-devolucion").is(":checked") ? 1 : 0,
CSRF: CSRF
}
}).done(function(data) {
if (!data || data.error_number < 0) {
mostrarError(data);
return;
}
cerrarModalProductoTemporal();
recargarTablaVenta();
}).always(function() {
anadiendoArticulo = false;
});
}
function anadirArticulo(item) {
if (!item)
return;
if (item.esProductoTemporal) {
abrirModalProductoTemporal(item.nombreInicial || "");
return;
}
if (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) {
const anadirOpcionProductoTemporal = function(productos) {
productos = Array.isArray(productos) ? productos : [];
return [{
id: -1,
label: textosResumen.anadirProductoTemporal,
value: textosResumen.anadirProductoTemporal,
esProductoTemporal: true,
nombreInicial: request.term
}].concat(productos);
};
$.ajax({
url: urlBuscarArticulos,
dataType: "json",
data: {
term: request.term,
conStock: $("#frm-articulo-devolucion").is(":checked") ? 0 : 1,
CSRF: CSRF
}
}).done(function(productos) {
response(anadirOpcionProductoTemporal(productos));
}).fail(function() {
response(anadirOpcionProductoTemporal([]));
});
};
Utils.preparaAutoCompleteBuscar(
undefined,
"frm-articulo-inp",
undefined,
anadirArticulo,
undefined,
"ClassVenta.idArticuloAutocomplete",
sourceArticulos,
{mainIdItem: "id", showNoResults: false, minLength: 0, autoDisableInput: false}
);
inputArticulo.autocomplete("instance").menu.element.addClass("ui-autocomplete-venta");
$(document).off("change.venta", "#frm-producto-temporal-talla").on("change.venta", "#frm-producto-temporal-talla", actualizarTipoTallaProductoTemporal);
$(document).off("click.venta", "#btn-guardar-producto-temporal").on("click.venta", "#btn-guardar-producto-temporal", guardarProductoTemporal);
$(document).off("submit.venta", "#frm-producto-temporal").on("submit.venta", "#frm-producto-temporal", function(event) {
event.preventDefault();
guardarProductoTemporal();
});
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) || [];
const productos = resultados.filter(function(resultado) {
return !resultado.esProductoTemporal && parseInt(resultado.id, 10) > 0;
});
if (productos.length !== 1 || anadiendoArticulo)
return;
const item = productos[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 + pagos.bizum)) * 100) / 100;
const forma = $(".input-forma-pago-venta:checked").val();
const esDevolucion = esDevolucionVenta(ultimosTotalesVenta);
if (importe <= 0 || pendiente <= 0.009 || ((forma === "tarjeta" || forma === "bizum" || esDevolucion) && importe - pendiente > 0.009)) {
mostrarError({error_message: textosResumen.importePagoNoValido});
return;
}
const idInput = "#frm-cobro-venta-total-" + forma;
const signo = esDevolucion ? -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 + pagos.bizum)) * 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 = "#frm-cobro-venta-total-" + $(this).data("forma");
$(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;
const pagoNoValido = esDevolucionVenta(ultimosTotalesVenta)
? Math.abs((pagos.efectivo + pagos.tarjeta + pagos.bizum) - total) >= 0.01
: pagos.tarjeta + pagos.bizum - total > 0.001 || pagos.efectivo + pagos.tarjeta + pagos.bizum - total < -0.009;
if (Math.abs(total) > 0.005 && pagoNoValido) {
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;
| | |