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');
  });