Descarga de participantes
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Get,
|
||||
HttpException,
|
||||
HttpStatus,
|
||||
Param,
|
||||
@@ -20,7 +21,7 @@ import { AuthGuard } from '@nestjs/passport';
|
||||
|
||||
@Controller('email')
|
||||
export class EmailController {
|
||||
constructor(private readonly emailService: EmailService) {}
|
||||
constructor(private readonly emailService: EmailService) { }
|
||||
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@Post('/evento/:id')
|
||||
@@ -48,4 +49,16 @@ export class EmailController {
|
||||
}
|
||||
return this.emailService.sendConstancias(file, id, res);
|
||||
}
|
||||
|
||||
@UseGuards(AuthGuard('jwt'))
|
||||
@Get(':id/participantes/xlsx')
|
||||
async descargarExcel(
|
||||
@Param('id') idEvento: number,
|
||||
@Res() res: Response,
|
||||
) {
|
||||
return this.emailService.getParticipantesExcel(idEvento, res);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import * as path from 'path';
|
||||
import { PDFDocument, StandardFonts, rgb } from 'pdf-lib';
|
||||
import { Response } from 'express';
|
||||
import { format } from 'date-fns';
|
||||
import * as ExcelJS from 'exceljs';
|
||||
|
||||
@Injectable()
|
||||
export class EmailService {
|
||||
@@ -67,6 +68,60 @@ export class EmailService {
|
||||
return participantes;
|
||||
}
|
||||
|
||||
async getParticipantesExcel(idEvento: number, res: Response) {
|
||||
const participantes = await this.participanteRepository
|
||||
.createQueryBuilder('participante')
|
||||
.innerJoin('participante.eventosParticipante', 'eventoParticipante')
|
||||
.innerJoin('eventoParticipante.evento', 'evento')
|
||||
.where('evento.id_evento = :idEvento', { idEvento })
|
||||
.select(['participante'])
|
||||
.getMany();
|
||||
|
||||
// 1. Crear workbook y worksheet
|
||||
const workbook = new ExcelJS.Workbook();
|
||||
const worksheet = workbook.addWorksheet('Participantes');
|
||||
|
||||
// 2. Definir encabezados
|
||||
worksheet.columns = [
|
||||
{ header: 'ID', key: 'id', width: 10 },
|
||||
{ header: 'Nombre', key: 'nombre', width: 30 },
|
||||
{ header: 'Correo', key: 'correo', width: 30 },
|
||||
{ header: 'Teléfono', key: 'telefono', width: 20 },
|
||||
{ header: 'Carrera', key: 'carrera', width: 20 },
|
||||
{ header: 'Institución', key: 'institucion_procedencia', width: 30 },
|
||||
{ header: 'Apellido Paterno', key: 'apellido_paterno', width: 20 },
|
||||
{ header: 'Apellido Materno', key: 'apellido_materno', width: 20 },
|
||||
];
|
||||
|
||||
// 3. Insertar datos
|
||||
participantes.forEach((p) => {
|
||||
worksheet.addRow({
|
||||
nombre: p.nombre,
|
||||
apellido_paterno: p.apellido_paterno,
|
||||
apellido_materno: p.apellido_materno,
|
||||
carrera: p.carrera,
|
||||
institucion_procedencia: p.institucion_procedencia,
|
||||
correo: p.email,
|
||||
telefono: p.telefono,
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
// 4. Preparar la respuesta HTTP para enviar el Excel
|
||||
res.setHeader(
|
||||
'Content-Type',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
);
|
||||
res.setHeader(
|
||||
'Content-Disposition',
|
||||
'attachment; filename=participantes.xlsx',
|
||||
);
|
||||
|
||||
await workbook.xlsx.write(res);
|
||||
res.end();
|
||||
}
|
||||
|
||||
|
||||
async sendConstancias(file, id_evento, res: Response) {
|
||||
//traemos la info del evento
|
||||
const evento = await this.eventoService.getEventosPorId(id_evento);
|
||||
@@ -81,8 +136,8 @@ export class EmailService {
|
||||
for (let i = 0; i < data.length; i++) {
|
||||
const row = data[i] as Row;
|
||||
|
||||
if(row.Email == undefined){
|
||||
return res.status(400).json({ message: `El correo del renglon ${ i + 2} puede estar vacio o ser undefined`, solucion: `Seleccione el renglon donde ocurre el problema y borre todo lo de este renglon, Aunque parezca que el renglon esta vacio puede que haya un espacio en algun campo y esto genera que el sistema haga la lectura de este renglon`});
|
||||
if (row.Email == undefined) {
|
||||
return res.status(400).json({ message: `El correo del renglon ${i + 2} puede estar vacio o ser undefined`, solucion: `Seleccione el renglon donde ocurre el problema y borre todo lo de este renglon, Aunque parezca que el renglon esta vacio puede que haya un espacio en algun campo y esto genera que el sistema haga la lectura de este renglon` });
|
||||
}
|
||||
|
||||
// Carga el PDF pre-diseñado en un documento PDF editable
|
||||
@@ -139,7 +194,7 @@ export class EmailService {
|
||||
const fechaCursoWidth = font.widthOfTextAtSize(fechaCurso, 20);
|
||||
|
||||
const centerXFechaCurso = (width - fechaCursoWidth) / 2;
|
||||
const centerYFechaCurso = (height - 20) / 2;
|
||||
const centerYFechaCurso = (height - 20) sheet_to_json/ 2;
|
||||
|
||||
primeraPagina.drawText(fechaCurso, {
|
||||
x: centerXFechaCurso,
|
||||
|
||||
Reference in New Issue
Block a user