sacg-cronogramas/src/app/pages/ajuste-pd/ajuste-pd.component.ts

214 lines
6.8 KiB
TypeScript

import { Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { TableModule ,Table} from 'primeng/table';
import { InputTextModule } from 'primeng/inputtext';
import { SelectModule } from 'primeng/select';
import { TooltipModule } from 'primeng/tooltip';
import { ButtonModule } from 'primeng/button';
import * as FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
@Component({
selector: 'app-ajuste-pd',
imports: [
FormsModule,
TableModule,
InputTextModule,
SelectModule,
TooltipModule,
ButtonModule
],
templateUrl: './ajuste-pd.component.html',
styleUrl: './ajuste-pd.component.scss'
})
export class AjustePdComponent {
selectedCity: any = '';
empresas: any[] = [{name: 'Empresa A'}, {name: 'Empresa B'}, {name: 'Empresa C'}];
select1: any = '';
estadoAprobacion: any[] = [{name:'Rechazado'}, {name:'Aprobado'}];
products: any[] = [
{
empresa: 'Empresa A',
codigoCronograma: '123',
codigoCronogramaAjuste: '456',
tipoCarga: 'Inicial',
estadoRevision: 'Ingresado',
analista: 'No asignado',
fechaIngreso: '2025-04-29',
semaforo: 'green',
dato9: 'Ingresado',
dato10: 'No asignado',
dato15: 'green',
dato16: 'green',
dato17: 'green',
dato18: 'green',
dato13: 'Rechazado',
dato14: 'green',
},
{
empresa: 'Empresa A',
codigoCronograma: '123',
codigoCronogramaAjuste: '456',
tipoCarga: 'Inicial',
estadoRevision: 'En revisión',
analista: 'Gabriel Torres',
fechaIngreso: '2025-04-29',
semaforo: 'yellow',
dato9: 'Ingresado',
dato10: 'No asignado',
dato15: 'green',
dato16: 'green',
dato17: 'green',
dato18: 'green',
dato13: 'Rechazado',
dato14: 'green',
},
{
empresa: 'Empresa A',
codigoCronograma: '123',
codigoCronogramaAjuste: '456',
tipoCarga: 'Inicial',
estadoRevision: 'Rechazado',
analista: 'Jorge Muñoz',
fechaIngreso: '2025-04-29',
semaforo: 'red',
dato9: 'Ingresado',
dato10: 'No asignado',
dato15: 'green',
dato16: 'green',
dato17: 'green',
dato18: 'green',
dato13: 'Rechazado',
dato14: 'green',
},
{
empresa: 'Empresa A',
codigoCronograma: '123',
codigoCronogramaAjuste: '456',
tipoCarga: 'Inicial',
estadoRevision: 'Aprobado',
analista: 'Jarolt Matamoros',
fechaIngreso: '2025-04-29',
semaforo: 'green',
dato9: 'Ingresado',
dato10: 'No asignado',
dato15: 'green',
dato16: 'green',
dato17: 'green',
dato18: 'green',
dato13: 'Rechazado',
dato14: 'green',
},
];
/**
* Exporta los datos de la tabla a un archivo Excel
* @param table Referencia a la tabla PrimeNG
*/
exportExcel(table: Table) {
try {
// Obtenemos los datos a exportar (usamos los datos filtrados si existen)
const dataToExport = this.prepareDataForExport(table);
// Creamos el libro de Excel
const worksheet = XLSX.utils.json_to_sheet(dataToExport);
const workbook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] };
// Aplicamos estilos a las celdas
this.applyExcelStyles(worksheet);
// Opciones de exportación
const excelBuffer: any = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
// Guardamos el archivo
this.saveAsExcelFile(excelBuffer, 'ajuste_pd');
console.log('Exportación a Excel completada con éxito');
} catch (error) {
console.error('Error al exportar a Excel:', error);
}
}
/**
* Prepara los datos para la exportación, traduciendo los nombres de columnas
* @param table Referencia a la tabla PrimeNG
* @returns Array de objetos con los datos formateados para exportar
*/
private prepareDataForExport(table: Table): any[] {
// Si hay filtros aplicados, usamos los datos filtrados, de lo contrario todos los datos
const data = table.filteredValue || table.value;
// Mapeamos los datos para tener nombres de columnas en español y legibles
return data.map(item => {
return {
'Empresa': item.empresa,
'Código de cronograma': item.codigoCronograma,
'Etapa del Servicio': item.codigoCronogramaAjuste,
'Nombre sistema': item.tipoCarga,
'Tipo de inversión': item.estadoRevision,
'Código de glosa PD': item.analista,
'Descripción glosa': item.fechaIngreso,
'Año de Inicio': item.dato9,
'Año de Término': item.dato10,
'Estado aprobación': item.dato13
};
});
}
/**
* Aplica estilos al worksheet de Excel para mejorar la presentación
* @param worksheet Hoja de Excel a la que aplicar estilos
*/
private applyExcelStyles(worksheet: XLSX.WorkSheet) {
// Definimos estilos para los encabezados
const headerStyle = {
font: { bold: true, color: { rgb: 'FFFFFF' } },
fill: { fgColor: { rgb: '007ACC' } }, // Color azul para los encabezados
alignment: { horizontal: 'center', vertical: 'center' }
};
// Aplicamos estilos a los encabezados (primera fila)
const range = XLSX.utils.decode_range(worksheet['!ref'] || 'A1');
for (let col = range.s.c; col <= range.e.c; col++) {
const cellRef = XLSX.utils.encode_cell({ r: 0, c: col });
if (!worksheet[cellRef]) worksheet[cellRef] = { t: 's', v: '' };
// Asignamos el estilo al encabezado
worksheet[cellRef].s = headerStyle;
}
// Ajustamos el ancho de las columnas automáticamente
const colWidths = [];
for (let col = range.s.c; col <= range.e.c; col++) {
colWidths.push({ wch: 15 }); // Ancho predeterminado
}
worksheet['!cols'] = colWidths;
}
/**
* Guarda el buffer como un archivo Excel
* @param buffer Datos del archivo Excel
* @param fileName Nombre base del archivo
*/
private saveAsExcelFile(buffer: any, fileName: string): void {
// Definimos el tipo MIME para archivos Excel
const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
const EXCEL_EXTENSION = '.xlsx';
// Creamos un Blob con los datos
const data: Blob = new Blob([buffer], { type: EXCEL_TYPE });
// Generamos un nombre de archivo con timestamp para evitar duplicados
const today = new Date();
const formattedDate =
today.getFullYear().toString() +
(today.getMonth() + 1).toString().padStart(2, '0') +
today.getDate().toString().padStart(2, '0') +
'_' +
today.getHours().toString().padStart(2, '0') +
today.getMinutes().toString().padStart(2, '0');
// Guardamos el archivo
FileSaver.saveAs(data, `${fileName}_${formattedDate}${EXCEL_EXTENSION}`);
}
}