Skip to content

Commit 77922f6

Browse files
committed
feat: Enhance configuracion component with PDF generation and preview functionality
1 parent a3f4fcb commit 77922f6

File tree

4 files changed

+118
-11
lines changed

4 files changed

+118
-11
lines changed

angular.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
],
2626
"tsConfig": "tsconfig.app.json",
2727
"assets": [
28+
"src/assets",
2829
{
2930
"glob": "**/*",
3031
"input": "public"
@@ -85,6 +86,7 @@
8586
],
8687
"tsConfig": "tsconfig.spec.json",
8788
"assets": [
89+
"src/assets",
8890
{
8991
"glob": "**/*",
9092
"input": "public"

src/app/pages/configuracion/configuracion.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ <h1 class="text-2xl font-bold text-gray-900 mb-6 flex items-center">
131131
<!-- PDF Preview -->
132132
<div>
133133
<h3 class="text-lg font-semibold text-gray-900 mb-4">Vista Previa del Reporte</h3>
134+
<iframe src="assets/control-asistencia.pdf" class="w-full h-full"></iframe>
134135
</div>
135136
</div>
136137
</div>

src/app/pages/configuracion/configuracion.ts

Lines changed: 115 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import {Component} from '@angular/core';
22
import {FormsModule} from '@angular/forms';
3+
import {PDFDocument, rgb, StandardFonts} from 'pdf-lib';
4+
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
35

46
export interface ReportConfig {
57
startDate: string;
@@ -20,19 +22,15 @@ export interface ReportConfig {
2022
styleUrl: './configuracion.scss'
2123
})
2224
export 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

Comments
 (0)