File "js.js"
Full Path: C:/wamp64/www/RegistroEquipos2/frontend/computers/js.js
File size: 13.44 KB
MIME-type: text/plain
Charset: utf-8
$('#btnDescargarPDF').on('click', function () {
if (!tabla || tabla.rows().count() === 0) {
alert('Selecciona un registro en la tabla para generar el PDF.');
return;
}
const { jsPDF } = window.jspdf;
const doc = new jsPDF('p'); // Vertical
const pageWidth = doc.internal.pageSize.getWidth();
let currentY = 0;
// Función para saltar de página y dibujar el encabezado
function agregarEncabezado(doc, yStart) {
// BORDE GENERAL DE TODA LA PÁGINA
const margenGeneral = 5;
const pageHeight = doc.internal.pageSize.getHeight();
doc.setDrawColor(0);
doc.setLineWidth(0.8);
doc.rect(margenGeneral, margenGeneral, pageWidth - (margenGeneral * 2), pageHeight - (margenGeneral * 2));
doc.addImage('../img/avicampo.PNG', 'PNG', 14, 15, 60, 20);
doc.setDrawColor(0);
doc.setLineWidth(0.5);
doc.rect(10, 8, pageWidth - 20, 30);
// Título principal CENTRADO CON SALTO DE LÍNEA
const tituloPrincipal = 'ENTREGA DE EQUIPOS Y HERRAMIENTAS\nDE TRABAJO A USUARIOS';
doc.setFont('helvetica', 'bold');
doc.setFontSize(9);
const xTitulo = 80; // Después del logo
const yTitulo = 20; // Ajustado para 2 líneas
const lineasTitulo = tituloPrincipal.split('\n');
lineasTitulo.forEach((linea, index) => {
const anchoLinea = doc.getTextWidth(linea);
const xCentrado = xTitulo + ((pageWidth - 80 - 50) / 2) - (anchoLinea / 2); // Centrado en el espacio disponible
doc.text(linea, xCentrado, yTitulo + (index * 4));
});
doc.setFontSize(8);
doc.setFont('helvetica', 'normal');
doc.text('Código: TL-FT-010', pageWidth - 50, 14);
doc.text('Versión: 03', pageWidth - 50, 20);
doc.text('Fecha: Julio 2025', pageWidth - 50, 26);
return yStart || 45; // Inicia el contenido después del encabezado
}
currentY = agregarEncabezado(doc, currentY);
const fila = tabla.row('.selected').data();
// -------------------------------------------------------------------------------------------------
// RECUADRO 1: INFORMACIÓN PRINCIPAL (Fecha, Usuario, Regional, Contraseña)
// -------------------------------------------------------------------------------------------------
doc.setDrawColor(0);
doc.setLineWidth(0.5);
doc.rect(10, 40, pageWidth - 20, 15);
doc.setFont('helvetica', 'bold');
doc.setFontSize(10);
doc.text('Fecha:', 12, currentY);
doc.text('Usuario:', pageWidth / 2, currentY);
currentY += 5;
doc.text('Regional:', 12, currentY);
doc.text('Contraseña:', pageWidth / 2, currentY);
currentY += 5;
// -------------------------------------------------------------------------------------------------
// RECUADRO 2: LICENCIAS
// -------------------------------------------------------------------------------------------------
doc.rect(10, 58, pageWidth - 20, 20);
currentY = 63;
doc.text('LICENCIA DE WINDOWS:', 12, currentY);
currentY += 5;
doc.text('ID. DEL PRODUCTO:', 12, currentY);
currentY += 5;
doc.text('LICENCIA DE OFFICE:', 12, currentY);
currentY += 5;
// -------------------------------------------------------------------------------------------------
// Título "SOFTWARE INSTALADO" (naranja) - REDUCIDO A 15mm de alto
// -------------------------------------------------------------------------------------------------
currentY += 3;
doc.setFillColor(255, 165, 0);
doc.rect(10, currentY, pageWidth - 20, 5, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(10);
const tituloSoftware = 'SOFTWARE INSTALADO';
const xSoftware = (pageWidth - doc.getTextWidth(tituloSoftware)) / 2;
doc.text(tituloSoftware, xSoftware, currentY + 4);
currentY += 6;
// Área de texto para software (REDUCIDA)
const ySoftwareStart = currentY;
currentY += 15; // Solo 15mm de alto
// -------------------------------------------------------------------------------------------------
// Título "UNIDADES DE RED" (naranja) - REDUCIDO A 15mm de alto
// -------------------------------------------------------------------------------------------------
doc.setFillColor(255, 165, 0);
doc.rect(10, currentY, pageWidth - 20, 5, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(10);
const tituloRed = 'UNIDADES DE RED';
const xRed = (pageWidth - doc.getTextWidth(tituloRed)) / 2;
doc.text(tituloRed, xRed, currentY + 4);
currentY += 6;
// Área de texto para red (REDUCIDA)
const yRedStart = currentY;
currentY += 15; // Solo 15mm de alto
// -------------------------------------------------------------------------------------------------
// TABLA DE HARDWARE CON CELDAS DIVIDIDAS
// -------------------------------------------------------------------------------------------------
currentY += 3;
const tablaCellHeight = 7;
const colWidth = (pageWidth - 20) / 2;
const yTablaInicio = currentY; // Guardamos la posición inicial de la tabla
// FILA 1: MARCA | TIPO
doc.setFont('helvetica', 'bold');
doc.setFontSize(9);
doc.rect(10, currentY, colWidth, tablaCellHeight);
doc.rect(10 + colWidth, currentY, colWidth, tablaCellHeight);
doc.text('MARCA:', 12, currentY + 5);
doc.text(fila.marca || 'N/A', 40, currentY + 5);
doc.text('TIPO:', 12 + colWidth, currentY + 5);
doc.text(fila.tipo || 'N/A', 40 + colWidth, currentY + 5);
currentY += tablaCellHeight;
// FILA 2: PROCESADOR | MODELO
doc.rect(10, currentY, colWidth, tablaCellHeight);
doc.rect(10 + colWidth, currentY, colWidth, tablaCellHeight);
doc.text('PROCESADOR:', 12, currentY + 5);
doc.text(fila.procesador || 'N/A', 40, currentY + 5);
doc.text('MODELO:', 12 + colWidth, currentY + 5);
doc.text(fila.referencia || 'N/A', 40 + colWidth, currentY + 5);
currentY += tablaCellHeight;
// FILA 3: MEMORIA RAM | SERIAL
doc.rect(10, currentY, colWidth, tablaCellHeight);
doc.rect(10 + colWidth, currentY, colWidth, tablaCellHeight);
doc.text('MEMORIA RAM:', 12, currentY + 5);
doc.text(fila.ram || 'N/A', 40, currentY + 5);
doc.text('SERIAL:', 12 + colWidth, currentY + 5);
doc.text(fila.serial || 'N/A', 40 + colWidth, currentY + 5);
currentY += tablaCellHeight;
// FILA 4: ETIQUETA ACTIVO No (SPAN COMPLETO)
doc.rect(10, currentY, pageWidth - 20, tablaCellHeight);
doc.text('ETIQUETA ACTIVO No:', 12, currentY + 5);
doc.text(String(fila.activo || 'N/A'), 70, currentY + 5);
currentY += tablaCellHeight;
// FILA 5: OTROS (SPAN COMPLETO)
doc.rect(10, currentY, pageWidth - 20, tablaCellHeight);
doc.text('OTROS:', 12, currentY + 5);
doc.text(fila.tipoDD || 'N/A', 40, currentY + 5);
currentY += tablaCellHeight;
// -------------------------------------------------------------------------------------------------
// BLOQUE DE TEXTO LEGAL Y FIRMAS
// -------------------------------------------------------------------------------------------------
currentY += 3;
// Título "Tratamiento de datos y seguridad de la información"
doc.setFillColor(255, 165, 0);
doc.rect(10, currentY, pageWidth - 20, 5, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(9);
const tituloDatos = 'Tratamiento de datos y seguridad de la información';
const xDatos = (pageWidth - doc.getTextWidth(tituloDatos)) / 2;
doc.text(tituloDatos, xDatos, currentY + 4);
currentY += 6;
// Textos legales
const texto2 = 'Se informa y recuerda a todos los colaboradores que, en cumplimiento con la Política Interna de Seguridad de la Información de la empresa y en estricto apego a la Ley 1581 de 2012 y el Decreto 1377 de 2013 sobre Protección de Datos Personales en Colombia, así como las demás normativas aplicables en materia de tratamiento de información confidencial, queda estrictamente prohibido el acceso y uso de correos electrónicos personales desde los equipos y la red de la compañía.';
const texto3 = 'Asimismo, se informa que los equipos corporativos cuentan con una cuenta empresarial de OneDrive, la cual realiza copias de respaldo automáticas de las carpetas Imágenes, Documentos y Escritorio. En caso de pérdida de información o daño del equipo, únicamente se garantiza el respaldo de los archivos contenidos en dichas carpetas. Por lo tanto, se recomienda a todos los colaboradores almacenar la información laboral dentro de estas ubicaciones para asegurar su correcta preservación y recuperación.';
const texto4 = 'Esta medida busca salvaguardar la integridad, confidencialidad y disponibilidad de la información empresarial, minimizando así el riesgo de fugas de datos y asegurando el adecuado manejo de la información personal de clientes, empleados y terceros. El incumplimiento de esta disposición será considerado una falta grave y podrá acarrear las sanciones disciplinarias correspondientes, de acuerdo con el Reglamento Interno de Trabajo y la legislación vigente.';
doc.setFont('helvetica', 'normal');
doc.setFontSize(7);
let lineasTexto2 = doc.splitTextToSize(texto2, pageWidth - 24);
doc.text(lineasTexto2, 12, currentY + 2);
currentY += (lineasTexto2.length * 3);
let lineasTexto3 = doc.splitTextToSize(texto3, pageWidth - 24);
doc.text(lineasTexto3, 12, currentY + 3);
currentY += (lineasTexto3.length * 3);
let lineasTexto4 = doc.splitTextToSize(texto4, pageWidth - 24);
doc.text(lineasTexto4, 12, currentY + 4);
currentY += (lineasTexto4.length * 3) + 4;
// -------------------------------------------------------------------------------------------------
// Bloque de Firmas (SOLO QUIEN RECIBE)
// -------------------------------------------------------------------------------------------------
doc.setFillColor(255, 165, 0);
doc.rect(10, currentY, pageWidth - 20, 5, 'F');
doc.setFont('helvetica', 'bold');
doc.setFontSize(10);
const tituloFirmas = 'FIRMAS';
const xFirmas = (pageWidth - doc.getTextWidth(tituloFirmas)) / 2;
doc.text(tituloFirmas, xFirmas, currentY + 4);
currentY += 10;
// Solo título de firma de quien recibe (centrado)
doc.setFont('helvetica', 'bold');
doc.setFontSize(9);
const textoFirmaRecibe = 'FIRMA (RECIBE)';
const xFirmaRecibe = (pageWidth - doc.getTextWidth(textoFirmaRecibe)) / 2;
doc.text(textoFirmaRecibe, xFirmaRecibe, currentY);
currentY += 2;
// Guardar posición para la firma digital
const yInicioFirma = currentY;
// Línea de firma centrada
const margenFirma = 40; // Márgenes laterales para la línea
doc.line(margenFirma, currentY + 35, pageWidth - margenFirma, currentY + 35);
// Datos de la persona que recibe (alineados a la izquierda)
currentY += 40;
doc.setFont('helvetica', 'normal');
doc.setFontSize(9);
// Alineados más a la izquierda
const xEtiqueta = 40;
const xValor = 75;
doc.text('NOMBRE:', xEtiqueta, currentY);
doc.text('CÉDULA:', xEtiqueta, currentY + 5);
doc.text('CARGO:', xEtiqueta, currentY + 10);
doc.text('TELÉFONO:', xEtiqueta, currentY + 15);
// =========================================================================================================
// PINTAR DATOS EN EL FORMULARIO
// =========================================================================================================
doc.setFont('helvetica', 'normal');
doc.setFontSize(9);
// 1. Datos principales
const yStartData = 45;
doc.text(fila.fecha || 'N/A', 40, yStartData);
doc.text(fila.usuario1 || 'N/A', pageWidth / 2 + 30, yStartData);
doc.text(fila.regional || 'N/A', 40, yStartData + 5);
doc.text(fila.contrasena || 'N/A', pageWidth / 2 + 30, yStartData + 5);
// 2. Licencias
const yLicenciaData = 63;
doc.text(fila.windows || 'N/A', 65, yLicenciaData);
doc.text(fila.idproducto || 'N/A', 65, yLicenciaData + 5);
doc.text(fila.office || 'N/A', 65, yLicenciaData + 10);
// 3. Software Instalado (texto reducido)
doc.setFontSize(9);
const lineasSoftware = doc.splitTextToSize(fila.software || 'N/A', pageWidth - 24);
doc.text(lineasSoftware.slice(0, 3), 12, ySoftwareStart + 2); // Bajado 2mm más
// 4. Unidades de Red (texto reducido)
const lineasRed = doc.splitTextToSize(fila.red || 'N/A', pageWidth - 24);
doc.text(lineasRed.slice(0, 3), 12, yRedStart + 2); // Bajado 2mm más
// 7. Datos de quien recibe (alineados a la izquierda)
doc.setFontSize(8);
const yRecibeData = currentY;
doc.text(fila.nombreRecibe || 'N/A', xValor, yRecibeData);
doc.text(String(fila.cedula || 'N/A'), xValor, yRecibeData + 5);
doc.text(fila.cargo || 'N/A', xValor, yRecibeData + 10);
doc.text(String(fila.telefono || 'N/A'), xValor, yRecibeData + 15);
// Dibujar la firma de quien recibe (centrada y más abajo)
if (fila.firma) {
const anchoFirma = 60; // Ancho de la firma
const xFirmaCentrada = (pageWidth - anchoFirma) / 2; // Centrada
doc.addImage(
fila.firma,
'PNG',
xFirmaCentrada,
yInicioFirma + 5, // Bajada más para verse mejor
anchoFirma,
30
);
}
doc.save('Acta_Entrega_Computador_' + (fila.nombreRecibe || 'sin_nombre') + '.pdf');
});