// Insertar estilos CSS dinámicamente en el head del HTML const style = document.createElement('style'); style.innerHTML = ` .success-message { background-color:rgb(134, 243, 160); color:rgb(0, 0, 0); border: 1px solid rgb(0, 0, 0); padding: 10px; border-radius: 5px; margin-top: 10px; font-size: 30px; text-align:center; } .error-message { background-color: #f8d7da; color: #721c24; , border: 1px solid #f5c6cb; padding: 10px; border-radius: 5px; margin-top: 10px; } `; document.head.appendChild(style); // Esta funcion procesa el archivo plano que pueden ser dos formatos diferentes .PJJ y .PVY y segun se determinara como se dividira. function processFile() { const fileInput = document.getElementById('fileInput'); const lineCount = document.getElementById('lineCount').value; const splitWord = document.getElementById('splitWord').value; if (!fileInput.files[0]) { alert("Por favor, selecciona un archivo."); return; } const file = fileInput.files[0]; const reader = new FileReader(); reader.onload = function (event) { const content = event.target.result; let result = ""; if (lineCount) { result = splitByLines(content, lineCount); } else if (content.includes("\f")) { // Archivo contable .pjj con saltos de página result = content.split("\f").filter(sec => sec.trim() !== ""); console.log("Dividido por \\f, total secciones:", result.length); } else if (splitWord) { result = splitByWord(content, splitWord); } else { alert('Por favor ingresa un número o palabra para dividir el archivo'); return; } if (content.includes("CERTIFICADO DE RETENCION")) { generatedRetencionesPDFs(result); } else { generatedSeparatedPDFs(result); } }; reader.readAsText(file); } function splitByLines(content, lineCount) { const lines = content.split('\n').filter(line => line.trim() !== ""); let chunks = []; let chunk = []; lines.forEach(line => { chunk.push(line); if (chunk.length === parseInt(lineCount)) { chunks.push(chunk.join('\n')); chunk = []; } }); if (chunk.length > 0) chunks.push(chunk.join('\n')); return chunks.filter(chunk => chunk.trim() !== ""); } function splitByWord(content, splitWord) { const regex = new RegExp(`(${splitWord})`, `g`); const sections = content.split(regex).filter(sec => sec.trim() !== ""); let chunks = []; let currentChunk = ""; sections.forEach(part => { if (part.match(regex)) { if (currentChunk) chunks.push(currentChunk); currentChunk = part; } else { currentChunk += part; } }); if (currentChunk.trim() !== "") chunks.push(currentChunk); return chunks; } // funcion para archivo plano comprobantes de egreso .PVY function generatedSeparatedPDFs(sections) { const { jsPDF } = window.jspdf; if (!sections || sections.length === 0) { console.error("Error: No hay contenido para procesar en generatedSeparatedPDFs"); return; } const groupedSections = {}; sections.filter(sec => sec.trim() !== "").forEach(section => { const numberMatch = section.match(/Numero\s*:\s*([\w-]+)/); const fileName = numberMatch ? numberMatch[1] : "unidentified"; if (!groupedSections[fileName]) groupedSections[fileName] = []; groupedSections[fileName].push(section); }); Object.keys(groupedSections).forEach(fileName => { const doc = new jsPDF(); doc.setFont("courier"); doc.setFontSize(9); groupedSections[fileName].forEach((section, index) => { if (index > 0) doc.addPage(); doc.text(section, 9, 10); }); const pdfBlob = doc.output("blob"); const firstSection = groupedSections[fileName][0]; const nitMatch = firstSection.match(/NIT:\s*(\d+)/); const bancoMatch = firstSection.match(/\d{2}\s+\d{2}\s+([\p{L}\s\/]+?)\s+\d+/u); const valorMatch = firstSection.match(/Valor:\s*\$([\d,.]+)/); const fechaCMatch = firstSection.match(/Fecha\s*:\s*([\d]{4}-[A-Z]{3}-\d{2})/); const cuentaMatch = firstSection.match(/\s+(\d{6,})/); let NITproveedor = nitMatch ? nitMatch[1] : "desconocido"; let banco = bancoMatch ? bancoMatch[1].trim() : "desconocido"; let valor = valorMatch ? valorMatch[1] : "0"; let cuenta = cuentaMatch ? cuentaMatch[1] : "desconocida"; let fechaCertificado = fechaCMatch ? fechaCMatch[1] : "Desconocida"; sendToServer(fileName, NITproveedor, banco, valor, fechaCertificado, cuenta, pdfBlob); }); } // Funcion para archivos planos certificados de retención .PJJ async function generatedRetencionesPDFs(sections) { const { jsPDF } = window.jspdf; if (!sections || sections.length === 0) { console.error("Error: No hay contenido para procesar"); return; } const groupedSections = {}; sections.filter(sec => sec.trim() !== "").forEach(section => { const nitMatch = section.match(/[NC]\s*\.\s*NIT\s*:\s*(\d[\d-]*\d|\d+)/); const fileName = nitMatch ? nitMatch[1].trim().replace(/-\d+$/, "").concat("_1") : "unidentified"; if (!groupedSections[fileName]) groupedSections[fileName] = []; groupedSections[fileName].push(section); }); const keys = Object.keys(groupedSections); console.log(`Total PDFs a generar: ${keys.length}`); for (let i = 0; i < keys.length; i++) { const fileName = keys[i]; console.log(`Procesando ${i + 1}/${keys.length}: ${fileName}`); const doc = new jsPDF(); doc.setFont("courier"); doc.setFontSize(9); groupedSections[fileName].forEach((section, index) => { if (index > 0) doc.addPage(); doc.text(section, 9, 10); }); const pdfBlob = doc.output("blob"); const firstSection = groupedSections[fileName][0]; const nitMatch = firstSection.match(/[NC]\s*\.\s*NIT\s*:\s*(\d[\d-]*\d|\d+)/); const retenidoMatch = firstSection.match(/RETENIDO\s*:\s*(.+)/); const fechaMatch = firstSection.match(/Fecha Expedicion:\s*(.+)/); const valorMatch = firstSection.match(/\*\* TOTAL\s+([\d,]+\.\d{2})\s+([\d,]+\.\d{2})/); let NITretenido = nitMatch ? nitMatch[1].trim().replace(/-\d+$/, "").concat("_1") : "desconocido"; let nombreRetenido = retenidoMatch ? retenidoMatch[1].trim() : "desconocido"; let fechaExpedicion = fechaMatch ? fechaMatch[1].trim().replace(/\s+/g, ' ') : "desconocida"; let valorRetenido = valorMatch ? valorMatch[2] : "0"; // Espera a que termine antes de enviar el siguiente await sendToServer(fileName, NITretenido, nombreRetenido, valorRetenido, fechaExpedicion, "", pdfBlob); } console.log("✅ Todos los PDFs procesados"); } // Funcion para mostrar mensaje de exito o error. function showMessage(message, isSuccess) { const messageBox = document.getElementById('messageBox'); if (isSuccess) { messageBox.className = 'success-message'; // Estilo para mensaje de éxito } else { messageBox.className = 'error-message'; // Estilo para mensaje de error } // Limpiamos el contenido previo messageBox.innerHTML = ''; // Creamos el elemento de texto para el mensaje const textNode = document.createElement('p'); textNode.innerText = message; messageBox.appendChild(textNode); // Si es un mensaje de éxito, añadimos el botón if (isSuccess) { const button = document.createElement('button'); button.textContent = 'Enviar Correos...'; button.className = 'email'; button.onclick = function () { alert('Enviando Correos...'); window.open('http://192.200.100.40:8002/INTERPRETE2/Correo.php', '_blank'); }; messageBox.appendChild(button); } // Mostramos el contenedor del mensaje messageBox.style.display = 'block'; } function sendToServer(fileName, NITproveedor, banco, valor, fechaC, cuenta, pdfBlob) { const formData = new FormData(); formData.append("pdf", pdfBlob, `${fileName}.pdf`); formData.append("nombre", fileName); formData.append("NITproveedor", NITproveedor); formData.append("banco", banco); formData.append("valor", valor); formData.append("fechaCertificado", fechaC); formData.append("cuenta", cuenta); // console.log("Enviando datos:", Object.fromEntries(formData)); showMessage("Enviando el archivo...", true); return fetch("http://192.200.100.40:8002/INTERPRETE2/backend/server.php", { method: "POST", body: formData, }) .then(response => { if (!response.ok) { throw new Error(`Error en la solicitud: ${response.statusText}`); } return response.text(); }) .then(text => { console.log(text); // Para depuración try { const data = JSON.parse(text); if (data.status === 'success') { console.log('Éxito: Los datos se han guardado exitosamente.'); // Mensaje visible en la página showMessage('✅¡Los datos se han guardado exitosamente!', true); // Éxito } else { console.log('Error: Hubo un problema al guardar los datos.'); // Mensaje visible en la página showMessage('Hubo un problema al guardar el dato.', false); // Error } } catch (e) { console.error('Error al procesar la respuesta del servidor:', e); // Si ocurre un error al procesar la respuesta showMessage('Hubo un error al procesar la respuesta del servidor.', false); } }) .catch(error => { console.log('Error en el envío del archivo: ', error); // En caso de error en la solicitud showMessage('Error en el envío del archivo a la base de datos.', false); }); } function showToast(mensaje, tipo = "exito") { const toast = $('#toast2'); toast.removeClass(); // Limpiar clases previas toast.addClass('toast2 show'); toast.css('background-color', tipo === 'exito' ? '#28a745' : '#dc3545'); toast.text(mensaje); setTimeout(() => { toast.removeClass('show'); }, 3000); } function processData() { const nit = document.getElementById("NIT").value; const razonSocial = document.getElementById("razonSocial").value; const email = document.getElementById("email").value; if (!nit || !razonSocial || !email) { showToast("⚠️ Por favor, complete todos los campos.", "error"); return; } const formData = new FormData(); formData.append("NIT", nit); formData.append("razonSocial", razonSocial); formData.append("email", email); fetch("http://192.200.100.40:8002/INTERPRETE2/backend/server2.php", { method: "POST", body: formData, }) .then(response => response.json()) .then(data => { if (data.status === "success") { showToast("✅ Datos registrados correctamente.", "exito"); limpiarCampos(); } else { showToast("❌ Error: " + data.message, "error"); } }) .catch(error => { console.error("Error al enviar datos:", error); showToast("❌ Error de red al enviar datos.", "error"); }); } function limpiarCampos() { const container = document.querySelector('.container2'); if (container) { const inputs = container.querySelectorAll('input'); inputs.forEach(input => { input.value = ''; }); } } //--------------------------------------------------------------------------//-----------------------------------------------------------------//----- // Funcion para obtener los datos de la base de datos y almacenarlos en un select para el reeenvio de correos let mapaCorreos = {}; // clave: razon social, valor: correo document.addEventListener("DOMContentLoaded", function () { fetch('http://192.200.100.40:8002/INTERPRETE2/backend/server3.php') .then(response => response.json()) .then(data => { const select = document.getElementById("selectCorreo"); if (!select) return; select.innerHTML = '<option value="">Seleccione un cliente</option>'; data.forEach(cliente => { const razon = cliente.RAZON_SOCIAL; const correo = cliente.EMAIL; // Guardamos la relación mapaCorreos[razon] = correo; const option = document.createElement("option"); option.value = razon; option.textContent = razon; select.appendChild(option); }); $('#selectCorreo').select2({ width: '100%', placeholder: "Seleccione un cliente" }); }); }); //------------------------------------------------------------------------//---------------- //funcion para enviar los pdf con el correo en reeenvio de correo document.addEventListener("DOMContentLoaded", function () { const botonReenviar = document.getElementById("resend"); const mensajeEnvio = document.getElementById("mensajeEnvio"); if (botonReenviar) { botonReenviar.addEventListener("click", function () { const razon = document.getElementById("selectCorreo").value; const correo = mapaCorreos[razon]; const archivo = document.getElementById("archivoReenvio").files[0]; console.log("RAZÓN:", razon); console.log("CORREO:", correo); console.log("ARCHIVO:", archivo); if (!razon || !correo || !archivo) { alert("Seleccione proveedor y archivo ."); return; } // Mostrar el loader y mensaje de envío mensajeEnvio.style.display = "block"; mensajeEnvio.innerHTML = `<span class="spinner"></span> <span style ="font-size:30px">Enviando correo...</span>`; const formData = new FormData(); formData.append("archivo", archivo); formData.append("EMAIL", correo); formData.append("RAZON_SOCIAL", razon); fetch("http://192.200.100.40:8002/INTERPRETE2/backend/reenviar_manual.php", { method: "POST", body: formData }) .then(res => res.text()) .then(resp => { console.log("Respuesta del servidor:", resp); if (resp.includes("Correo enviado")) { mensajeEnvio.innerHTML = `<span class="success">✅ Correo enviado exitosamente.</span>`; } else { mensajeEnvio.innerHTML = `<span class="error">❌ Error al enviar: ${resp}</span>`; } // Limpiar campos $('#selectCorreo').val('').trigger('change.select2'); // reset Select2 document.getElementById("archivoReenvio").value = ""; // limpiar input file // Ocultar mensaje después de 6 segundos setTimeout(() => { mensajeEnvio.style.display = "none"; }, 3000); }) .catch(err => { console.error("Error al enviar:", err); mensajeEnvio.innerHTML = `<span class="error">❌ Error al enviar: ${err}</span>`; setTimeout(() => { mensajeEnvio.style.display = "none"; }, 6000); }); }); } else { console.error("Botón con ID 'resend' no encontrado."); } }); //--//------------------------------------------------------------------------------//---------------------------------- //-----------Buscar y actualizar datos de proveedores ----------------------------------------///---- $(document).ready(function () { // Realizar búsqueda del proveedor $('#buscarForm').submit(function (event) { event.preventDefault(); // Evitar el envío tradicional del formulario var nit = $('#nit').val(); // Obtener el NIT ingresado // Realizar la petición AJAX $.get("../backend/server4.php", { nit: nit }, function (data) { // Convertir la respuesta en objeto JSON const response = JSON.parse(data); if (response.exito) { // Llenar los campos del formulario con los datos del proveedor $('[name="NIT"]').val(response.cliente.NIT); $('[name="RAZON_SOCIAL"]').val(response.cliente.RAZON_SOCIAL); $('[name="EMAIL"]').val(response.cliente.EMAIL); // Poner el NIT original para actualizar $('[name="nit_original"]').val(response.cliente.NIT); } else { alert(response.mensaje); // Mostrar mensaje si no se encontró el proveedor } }); }); // Realizar actualización del proveedor $('#editarForm').submit(function (event) { event.preventDefault(); // Evitar el envío tradicional del formulario var formData = $(this).serialize(); // Obtener todos los datos del formulario // Enviar los datos de la actualización mediante AJAX $.ajax({ url: '../backend/server4.php', type: 'POST', data: formData, success: function (response) { const res = JSON.parse(response); // Parsear la respuesta JSON // Mostrar el mensaje de éxito o error if (res.exito) { mostrarToast(res.mensaje, "exito"); $('#editarForm')[0].reset(); // limpiar campos } else { mostrarToast(res.mensaje, "error"); } }, error: function () { $('#mensaje').html('<p><strong>Error al actualizar el proveedor.</strong></p>'); $('#mensaje').css('color', 'red'); $('#mensaje').show(); // Asegurarnos de que el mensaje se muestre } }); }); }); function mostrarToast(mensaje, tipo = "exito") { const toast = $('#toast'); toast.removeClass(); // Limpiar clases previas toast.addClass('toast show'); toast.css('background-color', tipo === 'exito' ? '#28a745' : '#dc3545'); // verde o rojo toast.text(mensaje); setTimeout(() => { toast.removeClass('show'); }, 3000); } //---------------------------------------------------------------------------------------