11import { Component } from '@angular/core' ;
22import { FormsModule } from '@angular/forms' ;
3+ import { PDFDocument , rgb , StandardFonts } from 'pdf-lib' ;
4+ import { DomSanitizer , SafeResourceUrl } from '@angular/platform-browser' ;
35
46export interface ReportConfig {
57 startDate : string ;
@@ -20,19 +22,15 @@ export interface ReportConfig {
2022 styleUrl : './configuracion.scss'
2123} )
2224export class Configuracion {
23- config : ReportConfig = {
24- startDate : '' ,
25- endDate : '' ,
26- unavailableDates : [ ] ,
27- vacationDates : [ ] ,
28- reportType : 'mensual' ,
29- department : 'general' ,
30- includeStatistics : true ,
31- } ;
25+ config : ReportConfig = config ;
3226
3327 newUnavailableDate = '' ;
3428 newVacationDate = '' ;
3529 showPreview = false ;
30+ pdfUrl : SafeResourceUrl | undefined ; // Variable para la URL del PDF
31+ formFields : string [ ] = [ ] ; // Nueva propiedad para almacenar los campos
32+
33+ constructor ( private sanitizer : DomSanitizer ) { }
3634
3735 addUnavailableDate ( ) {
3836 if ( this . newUnavailableDate && ! this . config . unavailableDates . includes ( this . newUnavailableDate ) ) {
@@ -56,8 +54,114 @@ export class Configuracion {
5654 }
5755 }
5856
59- generateReport ( ) {
60- this . showPreview = true ;
57+ async generateReport ( ) {
58+ // this.listFormFields();
59+ const url = 'assets/control-asistencia.pdf' ;
60+ const existingPdfBytes = await fetch ( url ) . then ( res => res . arrayBuffer ( ) ) ;
61+ const pdfDoc = await PDFDocument . load ( existingPdfBytes ) ;
62+ const form = pdfDoc . getForm ( ) ;
63+
64+ // Información del Prestador y el Reporte
65+ form . getTextField ( 'Correspondiente al reporte mensual de actividades No' ) . setText ( '1' ) ;
66+ // form.getTextField('UnidadAcademica').setText(this.config.unidadAcademica);
67+ // form.getTextField('Carrera').setText(this.config.carrera);
68+ // form.getTextField('Boleta').setText(this.config.boleta);
69+ // form.getTextField('NoReporteMensual').setText(this.config.noReporteMensual);
70+ // form.getTextField('PeriodoDel').setText(this.config.periodoDel);
71+ // form.getTextField('PeriodoAl').setText(this.config.periodoAl);
72+ //
73+ // // Campos de la Tabla de Asistencia (ejemplo para 5 días)
74+ // this.config.asistencia.forEach((dia, i) => {
75+ // form.getTextField(`Fecha${i+1}`).setText(dia.fecha);
76+ // form.getTextField(`HoraEntrada${i+1}`).setText(dia.horaEntrada);
77+ // form.getTextField(`HoraSalida${i+1}`).setText(dia.horaSalida);
78+ // form.getTextField(`HorasPorDia${i+1}`).setText(dia.horasPorDia);
79+ // });
80+ //
81+ // // Totales
82+ // form.getTextField('TotalHorasMes').setText(this.config.totalHorasMes);
83+ // form.getTextField('TotalHorasAcumuladas').setText(this.config.totalHorasAcumuladas);
84+
85+ const pdfBytes = await pdfDoc . save ( ) ;
86+ const blob = new Blob ( [ new Uint8Array ( pdfBytes ) ] , { type : 'application/pdf' } ) ;
87+ const urlBlob = URL . createObjectURL ( blob ) ;
88+
89+ const iframe = document . querySelector ( 'iframe' ) ;
90+ if ( iframe ) iframe . src = urlBlob ;
6191 }
6292
93+ async listFormFields ( ) {
94+ try {
95+ const url = 'assets/control-asistencia.pdf' ;
96+ const existingPdfBytes = await fetch ( url ) . then ( res => res . arrayBuffer ( ) ) ;
97+ const pdfDoc = await PDFDocument . load ( existingPdfBytes ) ;
98+ const form = pdfDoc . getForm ( ) ;
99+
100+ const fields = form . getFields ( ) ;
101+ this . formFields = fields . map ( field => field . getName ( ) ) ;
102+
103+ console . log ( 'Campos del formulario PDF:' , this . formFields ) ;
104+ } catch ( error ) {
105+ console . error ( 'Error al leer los campos del PDF:' , error ) ;
106+ }
107+ }
108+
109+ }
110+
111+
112+ export interface AsistenciaDia {
113+ fecha : string ;
114+ horaEntrada : string ;
115+ horaSalida : string ;
116+ horasPorDia : string ;
117+ }
118+
119+ export interface ReportConfig {
120+ startDate : string ;
121+ endDate : string ;
122+ unavailableDates : string [ ] ;
123+ vacationDates : string [ ] ;
124+ reportType : string ;
125+ department : string ;
126+ includeStatistics : boolean ;
127+
128+ // Nuevos campos
129+ nombrePrestador : string ;
130+ unidadAcademica : string ;
131+ carrera : string ;
132+ boleta : string ;
133+ noReporteMensual : string ;
134+ periodoDel : string ;
135+ periodoAl : string ;
136+ asistencia : AsistenciaDia [ ] ;
137+ totalHorasMes : string ;
138+ totalHorasAcumuladas : string ;
63139}
140+
141+ // Datos dummy
142+ const config : ReportConfig = {
143+ startDate : '2024-06-01' ,
144+ endDate : '2024-06-30' ,
145+ unavailableDates : [ '2024-06-10' ] ,
146+ vacationDates : [ '2024-06-15' ] ,
147+ reportType : 'mensual' ,
148+ department : 'Ingeniería' ,
149+ includeStatistics : true ,
150+
151+ nombrePrestador : 'Juan Pérez' ,
152+ unidadAcademica : 'Facultad de Ciencias' ,
153+ carrera : 'Ingeniería en Sistemas' ,
154+ boleta : '2020123456' ,
155+ noReporteMensual : '1' ,
156+ periodoDel : '2024-06-01' ,
157+ periodoAl : '2024-06-30' ,
158+ asistencia : [
159+ { fecha : '2024-06-01' , horaEntrada : '08:00' , horaSalida : '14:00' , horasPorDia : '6' } ,
160+ { fecha : '2024-06-02' , horaEntrada : '08:00' , horaSalida : '14:00' , horasPorDia : '6' } ,
161+ { fecha : '2024-06-03' , horaEntrada : '08:00' , horaSalida : '14:00' , horasPorDia : '6' } ,
162+ { fecha : '2024-06-04' , horaEntrada : '08:00' , horaSalida : '14:00' , horasPorDia : '6' } ,
163+ { fecha : '2024-06-05' , horaEntrada : '08:00' , horaSalida : '14:00' , horasPorDia : '6' } ,
164+ ] ,
165+ totalHorasMes : '30' ,
166+ totalHorasAcumuladas : '120' ,
167+ } ;
0 commit comments