This commit is contained in:
David Arranz 2019-08-19 19:54:39 +02:00
parent 907fa90d24
commit 30d231af37
8 changed files with 153 additions and 15 deletions

View File

@ -41,7 +41,6 @@ const localEmailOptions = {
passport.use('local-email', new LocalStrategy(localEmailOptions, async (email, password, done) => { passport.use('local-email', new LocalStrategy(localEmailOptions, async (email, password, done) => {
try { try {
let user = await authService.extraMethods.findUser({ email }); let user = await authService.extraMethods.findUser({ email });
if (_.isNull(user)) { if (_.isNull(user)) {
return done(null, false, { message: 'User not found' }) return done(null, false, { message: 'User not found' })
} else { } else {

View File

@ -9,10 +9,11 @@ const assetsUrl = config.cdn.hostname;
const CDN_PATHS = { const CDN_PATHS = {
BLOG: "blog/", BLOG: "blog/",
CITIES: "cities/", CITIES: "cities/",
EVENT: "events/", EVENT: "events/",
PROFILE: "profile/", PROFILE: "profile/",
SPEAKERS: "speakers/", SPEAKERS: "speakers/",
WALLPAPERS: "wallpapers/" WALLPAPERS: "wallpapers/",
XLSX: "xlsx/",
}; };
const sanitizeFilename = (filename) => safename(sanitize(filename, { replacement: "_" })); const sanitizeFilename = (filename) => safename(sanitize(filename, { replacement: "_" }));
@ -50,7 +51,11 @@ const getCDNPath = (type = '') => {
case 'post': case 'post':
cdnPath = CDN_PATHS.BLOG; cdnPath = CDN_PATHS.BLOG;
break; break;
case 'xlsx':
cdnPath = CDN_PATHS.XLSX;
break;
default: default:
var _date = new Date(); var _date = new Date();
cdnPath = _date.getFullYear() + '/' + (_date.getMonth() + 1) + '/'; cdnPath = _date.getFullYear() + '/' + (_date.getMonth() + 1) + '/';

View File

@ -3,6 +3,7 @@ const httpStatus = require('http-status');
const generateControllers = require('../../core/controllers'); const generateControllers = require('../../core/controllers');
const QRHelper = require('../../helpers/qr.helper'); const QRHelper = require('../../helpers/qr.helper');
const emailHelper = require('../../helpers/mail.helper'); const emailHelper = require('../../helpers/mail.helper');
const path = require("path");
const messages = require('../../helpers/messages.json'); const messages = require('../../helpers/messages.json');
const eventService = require('./event.service'); const eventService = require('./event.service');
const eventReservationService = require('./events_reservations.service'); const eventReservationService = require('./events_reservations.service');
@ -117,11 +118,8 @@ const extraControllers = {
const params = extractParamsFromRequest(req, res, {}); const params = extractParamsFromRequest(req, res, {});
try { try {
const result = await eventReservationService._getPartners(params.params.id); const result = await eventReservationService._getPartners(params.params.id);
console.log('xxxxxx2');
console.log(result)
return handleResultResponse(result, result.count, params, res, httpStatus.OK); return handleResultResponse(result, result.count, params, res, httpStatus.OK);
} catch (error) { } catch (error) {
console.log('xxxxxxxx3');
return handleErrorResponse(MODULE_NAME, 'findPartners', error, res) return handleErrorResponse(MODULE_NAME, 'findPartners', error, res)
} }
}, },
@ -461,7 +459,26 @@ console.log(mailOptions);
} }
}, },
getReservationsExcel: async (req, res, next) => {
console.log('exxxxxxxxxxxxxxxcel');
const params = extractParamsFromRequest(req, res, {});
const inscriptionId = params.params.id;
const userId = req.user.id;
const inscription = await eventReservationService._getReservationsExcel(req.user, params.params.id, null, function(result, status){
if (result.messenger.code == "S99001") {
console.log(result);
res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
res.setHeader('Content-Disposition', 'attachment; filename=' + result.data.name);
res.attachment(result.data.name);
res.download(path.resolve(result.data.path), result.data.name);
} else {
res.status(status).json(result);
}
})
}
}; };

View File

@ -317,25 +317,30 @@ routes.get('/admin/events/:id',
); );
routes.get('/admin/events/:id/partners', routes.get('/admin/events/:id/partners',
// isAdministratorUser, isAdministratorUser,
eventController.findPartners, eventController.findPartners,
); );
routes.get('/admin/events/:id/reservations/excel',
isAdministratorUser,
eventController.getReservationsExcel,
);
routes.get('/admin/events/:eventId/partners/:entityId/reservations', routes.get('/admin/events/:eventId/partners/:entityId/reservations',
// isAdministratorUser, isAdministratorUser,
eventReservationController.find(), eventReservationController.find(),
); );
routes.post('/admin/reservations', routes.post('/admin/reservations',
// isAdministratorUser, isAdministratorUser,
//SchemaValidator(eventValidation.ReservationInputType, true), //SchemaValidator(eventValidation.ReservationInputType, true),
eventReservationController.create(), eventReservationController.create(),
); );
routes.get('/admin/reservations/:id', routes.get('/admin/reservations/:id',
// isAdministratorUser, isAdministratorUser,
//SchemaValidator(eventValidation.ReservationInputType, true), //SchemaValidator(eventValidation.ReservationInputType, true),
(req, res, next) => { (req, res, next) => {
return eventReservationController.findOne({ return eventReservationController.findOne({
@ -346,19 +351,19 @@ routes.get('/admin/reservations/:id',
); );
routes.put('/admin/reservations/:id', routes.put('/admin/reservations/:id',
// isAdministratorUser, isAdministratorUser,
//SchemaValidator(eventValidation.ReservationInputType, true), //SchemaValidator(eventValidation.ReservationInputType, true),
eventReservationController.update(), eventReservationController.update(),
); );
// Borrar reserva // Borrar reserva
routes.delete('/admin/reservations/:id', routes.delete('/admin/reservations/:id',
// isAdministratorUser, isAdministratorUser,
eventReservationController.delete() eventReservationController.delete()
); );
routes.get('/inscriptions', routes.get('/inscriptions',
// isAdministratorUser, isAdministratorUser,
//SchemaValidator(eventValidation.ReservationInputType, true), //SchemaValidator(eventValidation.ReservationInputType, true),
(req, res, next) => { (req, res, next) => {
return eventInscriptionController.find({ return eventInscriptionController.find({

View File

@ -192,6 +192,7 @@ const extraMethods = {
} }
}); });
}, },
}; };

View File

@ -121,5 +121,6 @@ module.exports = function (sequelize, DataTypes) {
}] }]
} }
}); });
return EventReservation; return EventReservation;
}; };

View File

@ -2,9 +2,14 @@
'use strict'; 'use strict';
const _ = require('lodash'); const _ = require('lodash');
const moment = require('moment');
const Sequelize = require('sequelize'); const Sequelize = require('sequelize');
const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper'); const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper');
const models = require('../../core/models'); const models = require('../../core/models');
const xlsx = require("node-xlsx");
const fs = require("fs");
const cdnHelper = require('../../helpers/cdn.helper');
const extraMethods = { const extraMethods = {
@ -65,6 +70,110 @@ const extraMethods = {
}); });
}, },
_getReservationsExcel: (user, eventId, partnerId, callback) => {
models.EventReservation.findAll({
where: {
eventId: eventId,
},
include: [{
model: models.Event,
attributes: ['id', 'name'],
}, {
model: models.Entity,
},
{
model: models.EventInscription,
as: 'inscriptions',
required: false,
}],
order: [
[{ model: models.Entity}, 'name', 'ASC'],
['reservation_code', 'ASC'],
[{ model: models.EventInscription, as: 'inscriptions'}, 'date', 'ASC']
]
}).then(function (reservations) {
if (reservations.length) {
var data = [];
data.push(["Congreso: " + reservations[0].Event.name]);
data.push(["Fecha del listado: " + moment().toString()]);
data.push([]);
data.push(["Nombre", "Apellidos", "Email", "Válido", "Vía", "N. entrada"]);
var currentReservation = '';
var currentPartner = '';
reservations.forEach(function(reserva) {
if (currentPartner != reserva.Entity.name) {
currentPartner = reserva.Entity.name;
data.push([]);
data.push([]);
};
if (currentReservation != reserva.reservation_code) {
currentReservation = reserva.reservation_code;
data.push([]);
data.push(["Partner: " + reserva.Entity.name + " CÓDIGO: " + reserva.reservation_code, "Tipo: " + reserva.description, "Reservadas: " + reserva.confirmed, "Aforo: " + reserva.assistants]);
data.push(["Nombre", "Apellidos", "Email", "Válido", "Vía", "N. entrada"]);
};
reserva.inscriptions.forEach(function (inscription) {
data.push([inscription.user.name, inscription.user.surname, inscription.user.email, inscription.validated ? "Confirmado" : "En lista de espera", inscription.source, inscription.code_ticket]);
});
});
var buffer = xlsx.build([{
name: reservations[0].Event.name,
data: data,
}], {
'!cols': [{ wch: 15 }, { wch: 25 }, { wch: 30 }, { wch: 10 }, { wch: 20 }, { wch: 20 }, { wch: 5 }]
});
var fileName = cdnHelper.sanitizeFilename(reservations[0].Event.name + "-invitaciones.xlsx");
var xlsxPath = cdnHelper.getCDNPath('xlsx') + fileName;
var wstream = fs.createWriteStream(xlsxPath);
wstream.write(buffer);
wstream.end();
wstream.on("close", function () {
return callback({
messenger: {
success: true,
message: 'Ok',
code: 'S99001'
},
data: {
path: xlsxPath,
name: fileName
}
}, 200);
});
} else {
return callback({
messenger: {
success: true,
message: 'Ok',
code: 'S99002'
}
}, 200);
}
}).catch(function (error) {
console.log(error);
return callback({
messenger: {
success: false,
message: 'Database error getting invitations.',
code: 'E01004'
}
}, 500);
});
},
}; };
module.exports = generateService(models.EventReservation, extraMethods); module.exports = generateService(models.EventReservation, extraMethods);

View File

@ -50,6 +50,7 @@
"mysql2": "^1.6.5", "mysql2": "^1.6.5",
"node-fetch": "^2.3.0", "node-fetch": "^2.3.0",
"node-mailjet": "^3.3.1", "node-mailjet": "^3.3.1",
"node-xlsx": "^0.15.0",
"os": "^0.1.1", "os": "^0.1.1",
"passport": "^0.4.0", "passport": "^0.4.0",
"passport-custom": "^1.0.5", "passport-custom": "^1.0.5",