app2-api/modules/events/events_reservations.service.js
2019-08-30 12:03:56 +02:00

203 lines
7.0 KiB
JavaScript

/* global Events Reservations */
'use strict';
const _ = require('lodash');
const moment = require('moment');
const Sequelize = require('sequelize');
const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper');
const models = require('../../core/models');
const xlsx = require("node-xlsx");
const fs = require("fs");
const cdnHelper = require('../../helpers/cdn.helper');
const extraMethods = {
_getReservaById: (Id) => {
return models.EventReservation.findOne({
where: { id: Id },
})
},
_getReservaByCode: (eventId, code) => {
return models.EventReservation.findOne({
where: { reservation_code: code, eventId: eventId },
include: [{
model: models.Event,
}, {model: models.Entity}],
})
},
_getPartners: (eventId) => {
return models.EventReservation.findAll({
where: { eventId: eventId },
include: [{ model: models.Entity,
include: [{ model: models.EntityType, as:'types', where:{alias: 'partner'}}],
}],
order: [[{ model: models.Entity }, 'name', 'asc']],
})
},
_getColleges: (eventId) => {
return models.EventReservation.findAll({
where: { eventId: eventId },
include: [{
model: models.Entity,
include: [{ model: models.EntityType, as: 'types', where: { alias: 'college' } }],
}],
order: [[{ model: models.Entity }, 'name', 'asc']],
})
},
_updateConfirmedReservation: (id, confirmed) => {
return new Promise(function (resolve, reject) {
models.EventReservation.update(
{
confirmed: confirmed,
},
{
where: { id: id }
})
.then(function (result) {
resolve((result[0] === 1));
})
.catch(function (error) {
reject(error)
});
});
},
_updateSoldOutReservation: (id, sold_out) => {
return new Promise(function (resolve, reject) {
models.EventReservation.update(
{
sold_out: sold_out,
},
{
where: { id: id }
})
.then(function (result) {
resolve((result[0] === 1));
})
.catch(function (error) {
reject(error)
});
});
},
_getReservationsExcel: (user, eventId, partnerId, type, callback) => {
console.log('>>>>>>>>>>>>>>>>>>>><consulta con type:', type);
var whereType = {};
if (type == 'partners')
whereType = { alias: 'partner'}
else if (type == 'colleges')
whereType = { alias: 'college' };
models.EventReservation.findAll({
where: {
eventId: eventId,
},
include: [{
model: models.Event,
attributes: ['id', 'name'],
}, {
model: models.Entity,
include: [{ model: models.EntityType, as: 'types', where: whereType }]
},
{
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);