/* 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 eventService = require("./event.service"); function getWhereTypeEntity(entityType) { var whereType = {}; if (entityType == "partners") whereType = { alias: "partner" }; else if (entityType == "colleges") whereType = { alias: "college" }; return whereType; } const extraMethods = { async beforeCreate(values, context){ //En el caso de ser una reserva publicada debe descontar del aforo del evento asociado if (values.state === 'publish') { await eventService._updateAforoOfEventReservation(values, values.assistants); }; return values; }, _getReservaById: (Id) => { return models.EventReservation.findOne({ where: { id: Id }, }); }, _getReservaByIdWithEntityAndEvent: (Id) => { return models.EventReservation.findOne({ where: { id: Id }, include: [{ model: models.Event }, { model: models.Entity }], }); }, _getReservasByEventAndEntity: (eventId, entityId) => { return models.EventReservation.findAll({ where: { eventId: eventId, entityId: entityId }, include: [{ model: models.Event }, { model: models.Entity }], }); }, _getReservasByEventAndType: (eventId, type) => { return models.EventReservation.findAll({ where: { eventId: eventId }, include: [ { model: models.Event, }, { model: models.Entity, include: [{ model: models.EntityType, as: "types", where: getWhereTypeEntity(type) }], }, ], order: [["entityId", "asc"]], }); }, _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"], ["description", "desc"], ], }); }, _getColleges: (eventId) => { return models.EventReservation.findAll({ where: { eventId: eventId, virtual: 0 }, include: [ { model: models.Entity, include: [{ model: models.EntityType, as: "types", where: { alias: "college" } }], }, ], order: [ [{ model: models.Entity }, "name", "asc"], ["description", "desc"], ], }); }, _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); }); }); }, _updatePublishReservation: (id) => { return new Promise(function (resolve, reject) { models.EventReservation.update( { state: "publish", }, { where: { id: id }, } ) .then(function (result) { resolve(result[0] === 1); }) .catch(function (error) { reject(error); }); }); }, _generateReservatioCode: (event, entityName) => { let result = "default"; let entity = entityName ? entityName : "DEFAULT"; if (!event) return result; let xxx = event.location.city.replace(/\s+/g, "").substr(0, 3); let yyy = moment(event.init_date).format("YY"); let zzz = entity.replace(/\s+/g, "").substr(0, 3); let www = Math.floor(Math.random() * 999 + 1) .toString() .padStart(3, "0"); result = `${xxx}${yyy}-${zzz}${www}`; return result.toUpperCase(); }, _deleteReservation: (id) => { //habria que poner el idusuario para asegurar que otro usuario no borra una inscripcion de otro return models.EventReservation.destroy({ where: { id: id, }, }); }, _getReservationsExcel: (user, eventId, entityId, entityType, callback) => { console.log("DESCARGA EXCEL>>>>>>>> "); console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>