Cargando inventario de servidor...

1. Filtros
2. Armado
3. Cierre
Descargar Listados
Filtros y Búsqueda de Refacciones
'; win.document.write(html); win.document.close(); } function renderizarTabla(lista) { var tbody = document.getElementById('tbodyInventario'); tbody.innerHTML = ''; if (lista.length === 0) { tbody.innerHTML = 'No se encontraron refacciones que coincidan con los filtros.'; return; } var htmlBuffer = []; lista.forEach(function(prod) { var idStr = String(prod.ID); var cantEnCarrito = carrito[idStr] ? carrito[idStr].cantidadSeleccionada : 0; var appTxt = prod.Aplicacion ? prod.Aplicacion.toString().trim() : ''; var divAplicacion = appTxt !== '' ? '
' + appTxt + '
' : ''; var controlSurtir = '
' + '' + '' + '' + '
'; htmlBuffer.push('' + // CELDA EXCLUSIVA DE MÓVIL (< 992px) '' + '
' + '
' + '' + prod.Codigo + '' + '' + prod.Marca.toUpperCase() + '' + '
' + '' + prod.Stock + ' pz dispo.' + '
' + '
' + prod.Descripcion + ' ' + '' + '
' + '
' + '
' + '' + formatoMoneda(prod.Precio_Base) + '' + '
' + '
' + controlSurtir + '
' + '
' + '' + // CELDAS EXCLUSIVAS DE ESCRITORIO (>= 992px) '' + prod.Codigo + '' + '
' + prod.Descripcion + '
' + divAplicacion + '' + '' + prod.Marca.toUpperCase() + '' + '' + (prod.Familia || 'Otros') + '' + '' + formatoMoneda(prod.Precio_Base) + '' + '' + prod.Stock + ' pz' + '' + controlSurtir + '' + ''); }); tbody.innerHTML = htmlBuffer.join(''); } function filtrarTabla() { var texto = document.getElementById('txtBuscar') ? document.getElementById('txtBuscar').value.toString().trim().toUpperCase() : ""; var marcaSel = document.getElementById('selectMarca') ? document.getElementById('selectMarca').value.toString().trim().toUpperCase() : "TODAS"; var familiaSel = document.getElementById('selectFamilia') ? document.getElementById('selectFamilia').value.toString().trim().toUpperCase() : "TODAS"; var filtrado = bdInventario.filter(function(p) { var pMarca = p.Marca ? p.Marca.toString().trim().toUpperCase() : ""; var pFamilia = p.Familia ? p.Familia.toString().trim().toUpperCase() : "OTROS"; var cod = (p.Codigo || "").toString().toUpperCase(); var desc = (p.Descripcion || "").toString().toUpperCase(); var app = (p.Aplicacion || "").toString().toUpperCase(); return coincideFiltro(pMarca, marcaSel, pFamilia, familiaSel, cod, desc, app, texto); }); renderizarTabla(filtrado); } function cargarLoteFiltrado(e) { if (e && e.preventDefault) e.preventDefault(); var marcaSel = document.getElementById('selectMarca') ? document.getElementById('selectMarca').value.toString().trim().toUpperCase() : "TODAS"; var familiaSel = document.getElementById('selectFamilia') ? document.getElementById('selectFamilia').value.toString().trim().toUpperCase() : "TODAS"; var texto = document.getElementById('txtBuscar') ? document.getElementById('txtBuscar').value.toString().trim().toUpperCase() : ""; if (marcaSel === 'TODAS' && familiaSel === 'TODAS' && texto === "") { alert("⚠️ Selecciona una Marca, una Familia o ingresa una búsqueda primero."); return; } var agregadosPz = 0; var partidas = 0; bdInventario.forEach(function(prod) { var m = prod.Marca ? prod.Marca.toString().trim().toUpperCase() : ""; var f = prod.Familia ? prod.Familia.toString().trim().toUpperCase() : "OTROS"; var cod = (prod.Codigo || "").toString().toUpperCase(); var desc = (prod.Descripcion || "").toString().toUpperCase(); var app = (prod.Aplicacion || "").toString().toUpperCase(); if (coincideFiltro(m, marcaSel, f, familiaSel, cod, desc, app, texto) && Number(prod.Stock) > 0) { var idStr = String(prod.ID); carrito[idStr] = JSON.parse(JSON.stringify(prod)); carrito[idStr].cantidadSeleccionada = Number(prod.Stock); agregadosPz += Number(prod.Stock); partidas++; } }); if (partidas === 0) { alert("⚠️ No se encontraron refacciones con stock disponible para la combinación seleccionada."); return; } filtrarTabla(); actualizarInterfazCarrito(); alert("⚡ ¡Lote cargado exitosamente!\nTotal: " + agregadosPz + " piezas en " + partidas + " partidas."); irAPantalla(2); } function limpiarBuscador() { document.getElementById('txtBuscar').value = ''; filtrarTabla(); } function cambioDirectoCantidad(id, valor) { var idStr = String(id); var cant = parseInt(valor, 10); if (isNaN(cant) || cant <= 0) { delete carrito[idStr]; actualizarInterfazCarrito(); return; } var prod = bdInventario.find(function(p) { return String(p.ID) === idStr; }); if (!prod) return; var maxStock = parseInt(prod.Stock, 10) || 0; if (cant > maxStock) { alert('Stock máximo disponible: ' + maxStock + ' pz.'); cant = maxStock; var inp = document.getElementById('cant-' + idStr); if (inp) inp.value = cant; } carrito[idStr] = JSON.parse(JSON.stringify(prod)); carrito[idStr].cantidadSeleccionada = cant; actualizarInterfazCarrito(); } function restarFila(id) { var idStr = String(id); var input = document.getElementById('cant-' + idStr); var cant = parseInt(input ? input.value : 0, 10) || 0; var nuevaCant = Math.max(0, cant - 1); if (input) input.value = nuevaCant > 0 ? nuevaCant : ''; cambioDirectoCantidad(idStr, nuevaCant); } function agregarFila(id) { var idStr = String(id); var input = document.getElementById('cant-' + idStr); var cant = parseInt(input ? input.value : 0, 10) || 0; var prod = bdInventario.find(function(p) { return String(p.ID) === idStr; }); var maxStock = prod ? (parseInt(prod.Stock, 10) || 999) : 999; var nuevaCant = cant + 1; if (nuevaCant > maxStock) { alert('Stock máximo disponible: ' + maxStock + ' pz.'); nuevaCant = maxStock; } if (input) input.value = nuevaCant; cambioDirectoCantidad(idStr, nuevaCant); } function modificarCantidadCarrito(id, cambio) { var idStr = String(id); var item = carrito[idStr]; if (!item) return; var cantActual = parseInt(item.cantidadSeleccionada, 10) || 0; var maxStock = parseInt(item.Stock, 10) || 999; var nuevaCant = cantActual + cambio; if (nuevaCant <= 0) { eliminarItem(idStr); } else { if (nuevaCant > maxStock) { alert('Stock máximo disponible: ' + maxStock + ' pz.'); nuevaCant = maxStock; } item.cantidadSeleccionada = nuevaCant; actualizarInterfazCarrito(); } } function eliminarItem(id) { var idStr = String(id); delete carrito[idStr]; var input = document.getElementById('cant-' + idStr); if(input) input.value = ''; actualizarInterfazCarrito(); } function abrirVistaViaRapida(id) { var idStr = String(id); var prod = bdInventario.find(function(p) { return String(p.ID) === idStr; }); if (!prod) return; var codigo = prod.Codigo ? prod.Codigo.toString().trim() : ""; var marca = prod.Marca ? prod.Marca.toUpperCase().trim() : ""; var urlFinalCatalogo = "#"; if (prod.URL_Manual && prod.URL_Manual.toString().trim() !== "") { urlFinalCatalogo = prod.URL_Manual.toString().trim(); } else { if (marca === "BREMBO") { var baseBrembo = PROTOCOLO + "www.bremboparts.com/europe/es/catalogue/"; if (codigo.toUpperCase().substring(0,1) === "P") { urlFinalCatalogo = baseBrembo + "pad/" + encodeURIComponent(codigo); } else if (codigo.substring(0,1) === "0") { var codigoModificado = codigo.replace(/\./g, "-"); urlFinalCatalogo = baseBrembo + "disc/" + encodeURIComponent(codigoModificado); } else { urlFinalCatalogo = baseBrembo; } } else if (marca === "FEBI") { var codigoLimpioFebi = codigo.toUpperCase().replace(/F/g, ""); urlFinalCatalogo = PROTOCOLO + "partsfinder.bilsteingroup.com/es/article/febi/" + encodeURIComponent(codigoLimpioFebi); } else if (marca === "TRUPER" || marca === "PRETUL") { urlFinalCatalogo = PROTOCOLO + "www.truper.com/CatVigente/"; } else { urlFinalCatalogo = PROTOCOLO + "www.google.com/search?q=" + encodeURIComponent(marca + " " + codigo); } } document.getElementById('lblVRTitulo').innerText = 'Validación: ' + codigo; document.getElementById('lblVRNombre').innerText = prod.Descripcion; document.getElementById('lblVRMarca').innerText = marca + ' — ' + (prod.Familia || 'Lote General'); var descBase = prod.Aplicacion ? prod.Aplicacion : "Consulte el catálogo de fábrica mediante el botón inferior."; document.getElementById('lblVRAplicacion').innerHTML = 'Precio Liquidación: ' + formatoMoneda(prod.Precio_Base) + '
' + 'Detalle Técnico: ' + descBase; var imgTarget = document.getElementById('imgVRFoto'); var driveId = prod.Imagen_ID ? prod.Imagen_ID.toString().trim() : ""; if (driveId !== "") { imgTarget.src = 'https://lh3.googleusercontent.com/d/' + driveId; } else { imgTarget.src = 'https://placehold.co/400x200?text=' + encodeURIComponent(marca + ' ' + codigo); } document.getElementById('modalFooterAcciones').innerHTML = '' + ' Validar en Catálogo Oficial' + '' + ''; var modal = new bootstrap.Modal(document.getElementById('modalVistaRapida')); modal.show(); } function cargarTodoElCatalogo(e) { if (e && e.preventDefault) e.preventDefault(); if (!confirm("¿Deseas cargar TODO EL STOCK físico disponible?")) return; var agregadosPz = 0; bdInventario.forEach(function(prod) { if (prod.Stock > 0) { var idStr = String(prod.ID); carrito[idStr] = JSON.parse(JSON.stringify(prod)); carrito[idStr].cantidadSeleccionada = prod.Stock; agregadosPz += prod.Stock; } }); filtrarTabla(); actualizarInterfazCarrito(); alert("🔥 Catálogo completo cargado (" + agregadosPz + " pz)."); irAPantalla(2); } function vaciarLoteCompleto(e) { if (e && e.preventDefault) e.preventDefault(); if (!confirm("¿Deseas vaciar el lote seleccionado?")) return; carrito = {}; filtrarTabla(); actualizarInterfazCarrito(); } function vaciarLote() { carrito = {}; filtrarTabla(); actualizarInterfazCarrito(); } function actualizarInterfazCarrito() { var listaHTML = document.getElementById('listaCarrito'); var listaMini = document.getElementById('listaDesgloseMini'); var llaves = Object.keys(carrito); bdInventario.forEach(function(p) { var idStr = String(p.ID); var input = document.getElementById('cant-' + idStr); if(input) { if(carrito[idStr]) { input.value = carrito[idStr].cantidadSeleccionada; } else { if(document.activeElement !== input) input.value = ''; } } }); var btnIrCierreTop = document.getElementById('btnIrACierreTop'); if(llaves.length === 0) { if (listaHTML) listaHTML.innerHTML = '
Tu lote está vacío.
'; if (listaMini) listaMini.innerHTML = '
Tu lote está vacío.
'; if (document.getElementById('lblPrecioLista')) document.getElementById('lblPrecioLista').innerText = "$0.00"; if (document.getElementById('lblDescEmpaque')) document.getElementById('lblDescEmpaque').innerText = "-$0.00"; if (document.getElementById('lblSubtotal')) document.getElementById('lblSubtotal').innerText = "$0.00"; if (document.getElementById('lblDescuento')) document.getElementById('lblDescuento').innerText = "-$0.00"; if (document.getElementById('lblTotalFinal')) document.getElementById('lblTotalFinal').innerText = "$0.00"; if (document.getElementById('lblPorcentajeDesc')) document.getElementById('lblPorcentajeDesc').innerText = "0"; if (document.getElementById('badgeTotalPiezas')) document.getElementById('badgeTotalPiezas').innerText = "0 pz"; if (document.getElementById('badgePiezasPantalla2')) document.getElementById('badgePiezasPantalla2').innerText = "0 pz"; if (document.getElementById('lblTotalPantalla2')) document.getElementById('lblTotalPantalla2').innerText = "$0.00 MXN"; if (btnIrCierreTop) btnIrCierreTop.disabled = true; subtotalPrecioListaGlobal = 0; montoDescuentoGlobal = 0; totalNetoGlobal = 0; actualizarBarraDescuento(0); return; } var subtotalPrecioLista = 0; var subtotalBase = 0; var totalPiezas = 0; var bufferHTML = []; var bufferMini = []; llaves.forEach(function(idStr) { var item = carrito[idStr]; var cant = parseInt(item.cantidadSeleccionada, 10) || 0; var pLista = (item.Precio_Lista && parseFloat(item.Precio_Lista) > 0) ? parseFloat(item.Precio_Lista) : (parseFloat(item.Precio_Base) / 0.85); var pBase = parseFloat(item.Precio_Base) || 0; subtotalPrecioLista += pLista * cant; subtotalBase += pBase * cant; totalPiezas += cant; var itemSubtotal = pBase * cant; bufferHTML.push( '
' + '
' + item.Descripcion + '
' + '
' + '
' + 'Cod: ' + item.Codigo + '' + '
' + '' + '' + '' + '
' + '
' + '
' + '' + formatoMoneda(itemSubtotal) + '' + '' + '
' + '
' + '
' ); bufferMini.push( '
' + '' + item.Codigo + ' - ' + item.Descripcion + '' + '' + cant + ' pz = ' + formatoMoneda(itemSubtotal) + '' + '
' ); }); if (listaHTML) listaHTML.innerHTML = bufferHTML.join(''); if (listaMini) listaMini.innerHTML = bufferMini.join(''); var descCajaMaltratada = subtotalPrecioLista - subtotalBase; var porcentajeDesc = 0; if (bdReglas && bdReglas.length > 0) { bdReglas.forEach(function(r) { var min = parseFloat(r.Monto_Minimo) || 0; if (subtotalBase >= min) { porcentajeDesc = parseFloat(r.Porcentaje_Descuento) || 0; } }); } var pctCalculado = porcentajeDesc < 1 ? porcentajeDesc : (porcentajeDesc / 100); var descuentoMonto = subtotalBase * pctCalculado; var totalFinal = subtotalBase - descuentoMonto; subtotalPrecioListaGlobal = subtotalPrecioLista; montoDescuentoGlobal = descuentoMonto + descCajaMaltratada; totalNetoGlobal = totalFinal; if (document.getElementById('lblPrecioLista')) document.getElementById('lblPrecioLista').innerText = formatoMoneda(subtotalPrecioLista); if (document.getElementById('lblDescEmpaque')) document.getElementById('lblDescEmpaque').innerText = "-" + formatoMoneda(descCajaMaltratada); if (document.getElementById('lblSubtotal')) document.getElementById('lblSubtotal').innerText = formatoMoneda(subtotalBase); if (document.getElementById('lblDescuento')) document.getElementById('lblDescuento').innerText = "-" + formatoMoneda(descuentoMonto); if (document.getElementById('lblTotalFinal')) document.getElementById('lblTotalFinal').innerText = formatoMoneda(totalFinal); if (document.getElementById('lblPorcentajeDesc')) document.getElementById('lblPorcentajeDesc').innerText = (pctCalculado * 100).toFixed(0); if (document.getElementById('badgeTotalPiezas')) document.getElementById('badgeTotalPiezas').innerText = totalPiezas + ' pz'; if (document.getElementById('badgePiezasPantalla2')) document.getElementById('badgePiezasPantalla2').innerText = totalPiezas + ' pz'; if (document.getElementById('lblTotalPantalla2')) document.getElementById('lblTotalPantalla2').innerText = formatoMoneda(totalFinal); if (btnIrCierreTop) btnIrCierreTop.disabled = (totalPiezas === 0); actualizarBarraDescuento(subtotalBase); } function actualizarBarraDescuento(subtotal) { var lblMeta = document.getElementById('lblMensajeMeta'); var barra = document.getElementById('barProgreso'); var lblMeta2 = document.getElementById('lblMensajeMeta2'); var barra2 = document.getElementById('barProgreso2'); if (subtotal <= 0) { var msgInicial = "Agrega productos para calcular el beneficio extra."; if (lblMeta) lblMeta.innerText = msgInicial; if (lblMeta2) lblMeta2.innerText = msgInicial; if (barra) barra.style.width = "0%"; if (barra2) barra2.style.width = "0%"; return; } if (!bdReglas || bdReglas.length === 0) { var msgMax = "🔥 ¡Descuento activo sobre tu orden!"; if (lblMeta) lblMeta.innerHTML = msgMax; if (lblMeta2) lblMeta2.innerHTML = msgMax; if (barra) barra.style.width = "100%"; if (barra2) barra2.style.width = "100%"; return; } var reglasOrdenadas = bdReglas.slice().sort(function(a, b) { return a.Monto_Minimo - b.Monto_Minimo; }); var reglaActual = null; var reglaSiguiente = null; for (var i = 0; i < reglasOrdenadas.length; i++) { if (subtotal >= reglasOrdenadas[i].Monto_Minimo) { reglaActual = reglasOrdenadas[i]; } else if (!reglaSiguiente) { reglaSiguiente = reglasOrdenadas[i]; } } if (!reglaSiguiente && reglaActual) { var pctMax = reglaActual.Porcentaje_Descuento < 1 ? (reglaActual.Porcentaje_Descuento * 100) : reglaActual.Porcentaje_Descuento; var txtComp = '🔥 ¡Nivel Máximo Activado! ' + pctMax.toFixed(0) + '% extra'; if (lblMeta) lblMeta.innerHTML = txtComp; if (lblMeta2) lblMeta2.innerHTML = txtComp; if (barra) barra.style.width = "100%"; if (barra2) barra2.style.width = "100%"; } else if (reglaSiguiente) { var metaDinero = reglaSiguiente.Monto_Minimo; var dineroFaltante = metaDinero - subtotal; var pctBarra = Math.min(100, Math.max(5, (subtotal / metaDinero) * 100)); var pctSig = reglaSiguiente.Porcentaje_Descuento < 1 ? (reglaSiguiente.Porcentaje_Descuento * 100) : reglaSiguiente.Porcentaje_Descuento; var txtProgreso = 'Faltan ' + formatoMoneda(dineroFaltante) + ' para el ' + pctSig.toFixed(0) + '% extra'; if (lblMeta) lblMeta.innerHTML = txtProgreso; if (lblMeta2) lblMeta2.innerHTML = txtProgreso; if (barra) barra.style.width = pctBarra + "%"; if (barra2) barra2.style.width = pctBarra + "%"; } } function obtenerPartidasLote() { var partidas = []; if (carrito && typeof carrito === 'object') { Object.keys(carrito).forEach(function(key) { var item = carrito[key]; var cant = parseInt(item.cantidadSeleccionada, 10) || 0; if (cant > 0) { var pLista = (item.Precio_Lista && parseFloat(item.Precio_Lista) > 0) ? parseFloat(item.Precio_Lista) : (parseFloat(item.Precio_Base) / 0.85); partidas.push({ codigo: item.Codigo || item.codigo || "REF", descripcion: item.Descripcion || item.descripcion || "Refacción", cantidad: cant, precioUnitario: pLista, precioBase: parseFloat(item.Precio_Base) || 0 }); } }); } return partidas; } // REGISTRO DE PEDIDO VÍA PETICIÓN HTTP POST A API.PHP function confirmarYEnviar() { var nombreCliente = document.getElementById("txtRazonSocial") ? document.getElementById("txtRazonSocial").value.trim() : ""; var telefono = document.getElementById("txtTelefono") ? document.getElementById("txtTelefono").value.trim() : ""; var email = document.getElementById("txtEmail") ? document.getElementById("txtEmail").value.trim() : ""; var rfc = document.getElementById("txtRFC") ? document.getElementById("txtRFC").value.trim().toUpperCase() : ""; var requiereFactura = document.getElementById("chkFactura") ? document.getElementById("chkFactura").checked : false; if (!nombreCliente) { alert("⚠️ Por favor ingresa tu Nombre Completo o Nombre del Negocio."); return; } if (!email || email.indexOf("@") === -1 || email.indexOf(".") === -1) { alert("⚠️ Por favor ingresa un Correo Electrónico válido."); return; } if (!telefono || telefono.length < 10) { alert("⚠️ Por favor ingresa un número de teléfono válido (10 dígitos)."); return; } if (requiereFactura && (!rfc || rfc === "XAXX010101000")) { alert("⚠️ Para solicitar Factura CFDI es obligatorio ingresar un RFC válido."); return; } var listaItems = obtenerPartidasLote(); if (listaItems.length === 0) { alert("⚠️ El lote está vacío. Selecciona al menos un producto."); return; } var btn = document.getElementById("btnProcederLote"); if (btn) { btn.disabled = true; btn.innerHTML = ' Registrando...'; } var datosCliente = { razonSocial: nombreCliente, nombreCliente: nombreCliente, rfc: rfc || "XAXX010101000", telefono: telefono, email: email, direccionEnvio: "Recolección o envío por acordar", subtotal: subtotalPrecioListaGlobal, descuentoAplicado: montoDescuentoGlobal, totalFinal: totalNetoGlobal, requiereFactura: requiereFactura, requiereEnvio: false, items: listaItems }; fetch('api.php?action=procesar_pedido', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(datosCliente) }) .then(function(res) { return res.json(); }) .then(function(respuesta) { if (respuesta && respuesta.exito) { var folio = respuesta.idPedido; vaciarLote(); alert("✅ ¡Pedido " + folio + " registrado con éxito!\n\nHemos enviado el comprobante a: " + email); if (btn) { btn.disabled = false; btn.innerHTML = ' Confirmar Pedido'; } irAPantalla(1); } else { alert("❌ Error: " + (respuesta ? (respuesta.mensajeError || respuesta.error) : "Respuesta no válida del servidor.")); if (btn) { btn.disabled = false; btn.innerHTML = ' Confirmar Pedido'; } } }) .catch(function(err) { alert("❌ Error de comunicación: " + err.message); if (btn) { btn.disabled = false; btn.innerHTML = ' Confirmar Pedido'; } }); }