From 221a7169a9f3d8e7a22756c5a7f4d4e2e94b2b8d Mon Sep 17 00:00:00 2001 From: David Date: Wed, 23 Feb 2022 19:27:58 +0100 Subject: [PATCH] Repaso a inscripciones --- helpers/controller.helper.js | 198 ++++--- helpers/mail.helper.js | 292 +++++----- helpers/qr.helper.js | 360 ++++++------ modules/events/event.controller.js | 220 ++++---- modules/events/event.routes.js | 28 +- .../events/events_inscriptions.controller.js | 209 +++---- modules/events/events_inscriptions.service.js | 57 +- .../events/events_reservations.controller.js | 363 ++++++++----- modules/events/events_reservations.model.js | 255 +++++---- modules/events/events_reservations.service.js | 512 ++++++++++-------- modules/events/mail.service.js | 53 ++ modules/events/marketing_list.service.js | 62 +++ modules/speakers/speaker.routes.js | 253 +++++---- script.sql | 4 + server.js | 106 ++-- 15 files changed, 1583 insertions(+), 1389 deletions(-) create mode 100644 modules/events/mail.service.js create mode 100644 modules/events/marketing_list.service.js diff --git a/helpers/controller.helper.js b/helpers/controller.helper.js index a78fe99..c538058 100644 --- a/helpers/controller.helper.js +++ b/helpers/controller.helper.js @@ -1,103 +1,102 @@ -'use strict'; - -const _ = require('lodash'); -const httpStatus = require('http-status'); -const Sequelize = require('sequelize'); +"use strict"; +const _ = require("lodash"); +const httpStatus = require("http-status"); +const Sequelize = require("sequelize"); //////////////////////////////////////////////////////////////////////////////// // PRIVATE FUNCTIONS //////////////////////////////////////////////////////////////////////////////// function buildErrorLog(err) { - if (err instanceof Sequelize.ValidationError) { - return { - message: err.message, - httpCode: httpStatus.UNPROCESSABLE_ENTITY, // <- datos no válidos - code: (err.parent) ? err.parent.code : '', - payload: err.fields, - } - } - return buildErrorLogOriginal(err); + if (err instanceof Sequelize.ValidationError) { + return { + message: err.message, + httpCode: httpStatus.UNPROCESSABLE_ENTITY, // <- datos no válidos + code: err.parent ? err.parent.code : "", + payload: err.fields, + }; + } + return buildErrorLogOriginal(err); } - function buildErrorLogOriginal(err) { - let errorLog; - if (_.isUndefined(err)) { - errorLog = 'Error not defined'; - } else if (!_.isUndefined(err.message)) { - errorLog = err.message; - } else if (!_.isUndefined(err.stack)) { - errorLog = err.stack; - } else { - errorLog = JSON.stringify(err); - } - return errorLog; + let errorLog; + if (_.isUndefined(err)) { + errorLog = "Error not defined"; + } else if (!_.isUndefined(err.message)) { + errorLog = err.message; + } else if (!_.isUndefined(err.stack)) { + errorLog = err.stack; + } else { + errorLog = JSON.stringify(err); + } + return errorLog; } function buildErrorResponse(nameController, nameMethod, error) { + const errorDescription = buildErrorLog(error); - const errorDescription = buildErrorLog(error); - - const jsonResultFailed = { - statusCode: errorDescription.httpCode ? errorDescription.httpCode : httpStatus.INTERNAL_SERVER_ERROR, - message: errorDescription.message ? errorDescription.message : 'Internal Server Error', - code: errorDescription.code ? errorDescription.code : 'Undefined', - description: `Internal Application Error in ${nameController}:${nameMethod}.`, - payload: errorDescription - } - return jsonResultFailed; + const jsonResultFailed = { + statusCode: errorDescription.httpCode ? errorDescription.httpCode : httpStatus.INTERNAL_SERVER_ERROR, + message: errorDescription.message ? errorDescription.message : "Internal Server Error", + code: errorDescription.code ? errorDescription.code : "Undefined", + description: `Internal Application Error in ${nameController}:${nameMethod}.`, + payload: errorDescription, + }; + return jsonResultFailed; } function getTotalCount(result) { - const toType = function (obj) { - return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase() - } + const toType = function (obj) { + return {}.toString + .call(obj) + .match(/\s([a-zA-Z]+)/)[1] + .toLowerCase(); + }; - switch (toType(result)) { - case 'boolean': - return 1; - case 'object': - return 1; - case 'array': - return result.length; - case 'null': - return 0; - default: - return 0; - } + switch (toType(result)) { + case "boolean": + return 1; + case "object": + return 1; + case "array": + return result.length; + case "null": + return 0; + default: + return 0; + } } function setPaginationInfo(totalCount, res) { - res.set({ - 'X-Total-Count': totalCount, - }); - - const params = extractParamsFromRequest(null, res); + res.set({ + "X-Total-Count": totalCount, + }); - //console.log('>>>>>>>>>>>>>>>>>>>>>>>>> params antes de setPaginationInfo'); - //console.log(params); - if (params.paginate) { - const - page = (params.paginate && params.paginate.page) ? params.paginate.page : null, - limit = (params.paginate && params.paginate.limit) ? params.paginate.limit : null, - count = (limit) ? Math.ceil(totalCount / limit) : null; - - /*if (params.paginate.hasNextPages(count)) { + const params = extractParamsFromRequest(null, res); + + //console.log('>>>>>>>>>>>>>>>>>>>>>>>>> params antes de setPaginationInfo'); + //console.log(params); + if (params.paginate) { + const page = params.paginate && params.paginate.page ? params.paginate.page : null, + limit = params.paginate && params.paginate.limit ? params.paginate.limit : null, + count = limit ? Math.ceil(totalCount / limit) : null; + + /*if (params.paginate.hasNextPages(count)) { const nextPage = params.paginate.href(); res.set('Link-Next-Page', nextPage + '; rel=next'); res.set('Pagination-Next-Page', true); } else { res.set('Pagination-Next-Page', false); }*/ - - res.set({ - 'Pagination-Count': count, - 'Pagination-Page': page, - 'Pagination-Limit': limit, - }); - } + + res.set({ + "Pagination-Count": count, + "Pagination-Page": page, + "Pagination-Limit": limit, + }); + } } //////////////////////////////////////////////////////////////////////////////// @@ -105,46 +104,45 @@ function setPaginationInfo(totalCount, res) { //////////////////////////////////////////////////////////////////////////////// function extractParamsFromRequest(req, res, extraParams = {}) { - const result = {}; + const result = {}; - result.route = (req && req.route) ? req.route.path : null; - result.params = (req && req.params) ? req.params : null; - result.query = (req && req.query) ? req.query : null; + result.route = req && req.route ? req.route.path : null; + result.params = req && req.params ? req.params : null; + result.query = req && req.query ? req.query : null; - if (res && res.locals) { - Object.keys(res.locals).forEach(key => { - result[key] = res.locals[key] - }) - } + if (res && res.locals) { + Object.keys(res.locals).forEach((key) => { + result[key] = res.locals[key]; + }); + } - return { - ...result, - ...extraParams - } + return { + ...result, + ...extraParams, + }; } - -function handleErrorResponse(controllerName, methodName, error, res) { - console.error(error); - const jsonResultFailed = buildErrorResponse(controllerName, methodName, error); - res.status(jsonResultFailed.statusCode).send(jsonResultFailed); +function handleErrorResponse(controllerName, methodName, error, res) { + console.error(error); + const jsonResultFailed = buildErrorResponse(controllerName, methodName, error); + res.status(jsonResultFailed.statusCode).send(jsonResultFailed); } function handleResultResponse(result, totalCount = null, params, res, statusCode = httpStatus.OK) { - setPaginationInfo((totalCount) ? totalCount : getTotalCount(result), res); - res.status(statusCode).send(typeof result == 'number' ? result.toString() : result); + setPaginationInfo(totalCount ? totalCount : getTotalCount(result), res); + res.status(statusCode).send(typeof result == "number" ? result.toString() : result); } - //////////////////////////////////////////////////////////////////////////////// // MODULE EXPORTS //////////////////////////////////////////////////////////////////////////////// module.exports = { - extractParamsFromRequest, - handleErrorResponse, - handleResultResponse, - // for testing - buildErrorLog, - buildErrorResponse -}; \ No newline at end of file + extractParamsFromRequest, + handleErrorResponse, + handleResultResponse, + // for testing + buildErrorLog, + buildErrorResponse, + httpStatus, +}; diff --git a/helpers/mail.helper.js b/helpers/mail.helper.js index 81ccdb1..4471e7b 100644 --- a/helpers/mail.helper.js +++ b/helpers/mail.helper.js @@ -1,3 +1,4 @@ +const moment = require("moment"); const mailjet_public = "c9cbd50d7f4afe487e56949f95cb28a0"; const mailjet_private = "f8b77ee8e7b1181d94f07905d90e18c6"; const mailjet_from_email = "info@loquedeverdadimporta.org"; @@ -10,32 +11,37 @@ const mailjet_from_name = "Fundación Lo Que De Verdad Importa"; * @param {number} data.subject - Asunto * @param {number} data.text - Cuerpo del mensaje en texto plano * @param {number} data.html - Cuerpo del mensaje en HTML - * @return {Promise} - * + * @return {Promise} + * */ function send(header, body) { - - const params = Object.assign( + const params = Object.assign( + { + From: { + Email: mailjet_from_email, + Name: mailjet_from_name, + }, + To: [ { - "From": { - "Email": mailjet_from_email, - "Name": mailjet_from_name - }, - "To": [{ - "Email": header.to, - "Name": header.name - }], - "Subject": header.subject, + Email: header.to, + Name: header.name, }, + ], + Subject: header.subject, + }, - (!header.bcc) ? {} : { - "Bcc": [{ - "Email": header.bcc, - "Name": header.bccName - }] - }, -/* + !header.bcc + ? {} + : { + Bcc: [ + { + Email: header.bcc, + Name: header.bccName, + }, + ], + }, + /* { "InlinedAttachments": [ { @@ -51,30 +57,27 @@ function send(header, body) { "HTMLPart": "

Dear passenger 1, welcome to Mailjet!


May the delivery force be with you!" }, - */ - body, - ); + */ + body + ); -//console.log('PARAAAAAAAAAAAAAAAAAAAAMSSS MAILLL>', params); - const mailjet = require('node-mailjet') - .connect(mailjet_public, mailjet_private) - const request = mailjet - .post("send", { 'version': 'v3.1' }) - .request({ - "Messages": [params] - }) - request - .then((result) => { - console.log('Envio correo >>>>'); - console.log(result.body); - return result; - }) - .catch((error) => { - console.log(error.statusCode); - console.log(error); - return error; - }) -}; + //console.log('PARAAAAAAAAAAAAAAAAAAAAMSSS MAILLL>', params); + const mailjet = require("node-mailjet").connect(mailjet_public, mailjet_private); + const request = mailjet.post("send", { version: "v3.1" }).request({ + Messages: [params], + }); + request + .then((result) => { + console.log("Envio correo >>>>"); + console.log(result.body); + return result; + }) + .catch((error) => { + console.log(error.statusCode); + console.log(error); + return error; + }); +} /** * Enviar un email con entrada @@ -83,36 +86,36 @@ function send(header, body) { * @param {number} data.name - Nombre del contacto destino * @param {number} data.subject - Asunto * @values - * @param {number} data.tipoEntrada - * @param {number} data.qrCode + * @param {number} data.tipoEntrada + * @param {number} data.qrCode * @return {Promise} * */ - function sendTicket(header, values) { - const body = { - "TemplateID": 1112274, //980158, - "TemplateLanguage": true, - "TemplateErrorDeliver": true, - "TemplateErrorReporting": { - "Email": "info@rodax-software.com", - "Name": "Air traffic control" - }, - "Variables": { - "tipoEntrada": values.tipoEntrada, - "descriptionEntrada": values.descriptionEntrada, - "qrCode": values.qrCode, - "qrCodeUrl": values.qrCodeUrl, - //"IDqrCode": "cid:id1", - "codeTicket": values.codeTicket, - "eventName": values.eventName, - "dateEvent": values.dateEvent, - "dateInscription": values.dateInscription, - "color": (values.color)? values.color : 'gray', - "nameInscription": header.name, - }, +function sendTicket(header, values) { + const body = { + TemplateID: 1112274, //980158, + TemplateLanguage: true, + TemplateErrorDeliver: true, + TemplateErrorReporting: { + Email: "info@rodax-software.com", + Name: "Air traffic control", + }, + Variables: { + tipoEntrada: values.tipoEntrada, + descriptionEntrada: values.descriptionEntrada, + qrCode: values.qrCode, + qrCodeUrl: values.qrCodeUrl, + //"IDqrCode": "cid:id1", + codeTicket: values.codeTicket, + eventName: values.eventName, + dateEvent: values.dateEvent, + dateInscription: values.dateInscription, + color: values.color ? values.color : "gray", + nameInscription: header.name, + }, - /*"InlinedAttachments": [ + /*"InlinedAttachments": [ { "ContentType": "image/png", "Filename": "qr.png", @@ -121,83 +124,77 @@ function send(header, body) { "Base64Content": values.qrCode.substr(22) //Quitamos la cabecera para quedarnos solo con la imagen }, ],*/ + }; - }; + console.log(body.Variables); - console.log(body.Variables); - - return send(header, body); -}; + return send(header, body); +} function sendListaEspera(header, values) { + const body = { + TemplateID: 980163, + TemplateLanguage: true, + TemplateErrorDeliver: true, + TemplateErrorReporting: { + Email: "info@rodax-software.com", + Name: "Air traffic control", + }, + Variables: { + tipoEntrada: values.tipoEntrada, + eventName: values.eventName, + dateEvent: values.dateEvent, + dateInscription: values.dateInscription, + color: values.color ? values.color : "gray", + nameInscription: header.name, + }, + }; - const body = { - "TemplateID": 980163, - "TemplateLanguage": true, - "TemplateErrorDeliver": true, - "TemplateErrorReporting": { - "Email": "info@rodax-software.com", - "Name": "Air traffic control" - }, - "Variables": { - "tipoEntrada": values.tipoEntrada, - "eventName": values.eventName, - "dateEvent": values.dateEvent, - "dateInscription": values.dateInscription, - "color": (values.color) ? values.color : 'gray', - "nameInscription": header.name, - } - }; - - return send(header, body); -}; + return send(header, body); +} function sendReservationCode(header, values) { + const body = { + TemplateID: 1041673, + TemplateLanguage: true, + TemplateErrorDeliver: true, + TemplateErrorReporting: { + Email: "info@rodax-software.com", + Name: "Air traffic control", + }, + Variables: { + entityName: values.entityName, + eventName: values.eventName, + dateEvent: values.dateEvent, + reservationCode: values.reservationCode, + reservationDescription: values.reservationDescription ? values.reservationDescription : "-", + }, + }; - const body = { - "TemplateID": 1041673, - "TemplateLanguage": true, - "TemplateErrorDeliver": true, - "TemplateErrorReporting": { - "Email": "info@rodax-software.com", - "Name": "Air traffic control" - }, - "Variables": { - "entityName": values.entityName, - "eventName": values.eventName, - "dateEvent": values.dateEvent, - "reservationCode": values.reservationCode, - "reservationDescription": (values.reservationDescription) ? values.reservationDescription : '-', - } - }; - - return send(header, body); -}; + return send(header, body); +} function sendCancelacion(header, values) { + const body = { + TemplateID: 978886, + TemplateLanguage: true, + TemplateErrorDeliver: true, + TemplateErrorReporting: { + Email: "info@rodax-software.com", + Name: "Air traffic control", + }, + Variables: { + tipoEntrada: values.tipoEntrada, + eventName: values.eventName, + dateEvent: values.dateEvent, + dateInscription: values.dateInscription, + color: values.color ? values.color : "gray", + nameInscription: header.name, + }, + }; - const body = { - "TemplateID": 978886, - "TemplateLanguage": true, - "TemplateErrorDeliver": true, - "TemplateErrorReporting": { - "Email": "info@rodax-software.com", - "Name": "Air traffic control" - }, - "Variables": { - "tipoEntrada": values.tipoEntrada, - "eventName": values.eventName, - "dateEvent": values.dateEvent, - "dateInscription": values.dateInscription, - "color": (values.color) ? values.color : 'gray', - "nameInscription": header.name, - } - }; - - return send(header, body); -}; - - + return send(header, body); +} /** * Enviar un email @@ -212,21 +209,18 @@ function sendCancelacion(header, values) { * */ function sendMail(header, values) { + const body = { + TextPart: values.text, + HTMLPart: values.html, + }; - const body = { - "TextPart": values.text, - "HTMLPart": values.html, - }; - - return send(header, body); -}; - + return send(header, body); +} module.exports = { - sendMail, - sendTicket, - sendListaEspera, - sendCancelacion, - sendReservationCode, - -}; \ No newline at end of file + sendMail, + sendTicket, + sendListaEspera, + sendCancelacion, + sendReservationCode, +}; diff --git a/helpers/qr.helper.js b/helpers/qr.helper.js index 664b01a..7473b6e 100644 --- a/helpers/qr.helper.js +++ b/helpers/qr.helper.js @@ -1,12 +1,12 @@ -var _ = require('lodash'); -var QRCode = require('qrcode'); -const moment = require('moment'); +var _ = require("lodash"); +var QRCode = require("qrcode"); +const moment = require("moment"); -const config = require('../config'); +const config = require("../config"); module.exports.getInscriptionQRCodeUrl = function (inscriptionId) { - return encodeURI(`${config.server.public_url}/inscriptions/${inscriptionId}/qrimage`); -} + return encodeURI(`${config.server.public_url}/inscriptions/${inscriptionId}/qrimage`); +}; /* params = { code: 'xxxx', @@ -18,182 +18,200 @@ module.exports.getInscriptionQRCodeUrl = function (inscriptionId) { } */ module.exports.getInscriptionQRCode = function (params) { - return new Promise(function (resolve, reject) { - var texto = _.padStart(params.code, 4, '0') + '\n' + moment(params.date).format('DD/MM/YY HH:mm ') + params.name + ' ' + params.surname; - var options = { - errorCorrectionLevel: 'M', - } + return new Promise(function (resolve, reject) { + var texto = + _.padStart(params.code, 4, "0") + + "\n" + + moment(params.date).format("DD/MM/YY HH:mm ") + + params.name + + " " + + params.surname; + var options = { + errorCorrectionLevel: "M", + }; - if (params.color) { - options = _.assign(options, { - color: { - light: (params.color) ? colourNameToHex(params.color) : "#000000", - dark: "#ffffff" - } - }) - }; + if (params.color) { + options = _.assign(options, { + color: { + light: params.color ? colourNameToHex(params.color) : "#000000", + dark: "#ffffff", + }, + }); + } - QRCode.toDataURL(texto, options, function (err, qrcode) { - if (err) resolve(''); -// console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' + qrcode); - resolve(qrcode); - }); -/* + QRCode.toDataURL(texto, options, function (err, qrcode) { + if (err) resolve(""); + // console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' + qrcode); + resolve(qrcode); + }); + /* QRCode.toString(texto, options, function (err, qrcode) { if (err) resolve(''); console.log('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' + qrcode); resolve(qrcode); }); */ - }) + }); }; +module.exports.generateQRConfig = function (params) { + let qrConfig = null; + if (params) { + qrConfig = { + name: params.name, + surname: params.surname, + date: params.date_inscription, + code: params.code_ticket, + color: params.color, + }; + } + return qrConfig; +}; function colourNameToHex(colour) { - var colours = { - "aliceblue": "#f0f8ff", - "antiquewhite": "#faebd7", - "aqua": "#00ffff", - "aquamarine": "#7fffd4", - "azure": "#f0ffff", - "beige": "#f5f5dc", - "bisque": "#ffe4c4", - "blanchedalmond": "#ffebcd", - "blue": "#0000ff", - "blueviolet": "#8a2be2", - "brown": "#a52a2a", - "burlywood": "#deb887", - "cadetblue": "#5f9ea0", - "chartreuse": "#7fff00", - "chocolate": "#d2691e", - "coral": "#ff7f50", - "cornflowerblue": "#6495ed", - "cornsilk": "#fff8dc", - "crimson": "#dc143c", - "cyan": "#00ffff", - "darkblue": "#00008b", - "darkcyan": "#008b8b", - "darkgoldenrod": "#b8860b", - "darkgray": "#a9a9a9", - "darkgreen": "#006400", - "darkkhaki": "#bdb76b", - "darkmagenta": "#8b008b", - "darkolivegreen": "#556b2f", - "darkorange": "#ff8c00", - "darkorchid": "#9932cc", - "darkred": "#8b0000", - "darksalmon": "#e9967a", - "darkseagreen": "#8fbc8f", - "darkslateblue": "#483d8b", - "darkslategray": "#2f4f4f", - "darkturquoise": "#00ced1", - "darkviolet": "#9400d3", - "deeppink": "#ff1493", - "deepskyblue": "#00bfff", - "dimgray": "#696969", - "dodgerblue": "#1e90ff", - "firebrick": "#b22222", - "floralwhite": "#fffaf0", - "forestgreen": "#228b22", - "fuchsia": "#ff00ff", - "gainsboro": "#dcdcdc", - "ghostwhite": "#f8f8ff", - "gold": "#ffd700", - "goldenrod": "#daa520", - "gray": "#808080", - "green": "#008000", - "greenyellow": "#adff2f", - "honeydew": "#f0fff0", - "hotpink": "#ff69b4", - "indianred ": "#cd5c5c", - "indigo": "#4b0082", - "ivory": "#fffff0", - "khaki": "#f0e68c", - "lavender": "#e6e6fa", - "lavenderblush": "#fff0f5", - "lawngreen": "#7cfc00", - "lemonchiffon": "#fffacd", - "lightblue": "#add8e6", - "lightcoral": "#f08080", - "lightcyan": "#e0ffff", - "lightgoldenrodyellow": "#fafad2", - "lightgrey": "#d3d3d3", - "lightgreen": "#90ee90", - "lightpink": "#ffb6c1", - "lightsalmon": "#ffa07a", - "lightseagreen": "#20b2aa", - "lightskyblue": "#87cefa", - "lightslategray": "#778899", - "lightsteelblue": "#b0c4de", - "lightyellow": "#ffffe0", - "lime": "#00ff00", - "limegreen": "#32cd32", - "linen": "#faf0e6", - "magenta": "#ff00ff", - "maroon": "#800000", - "mediumaquamarine": "#66cdaa", - "mediumblue": "#0000cd", - "mediumorchid": "#ba55d3", - "mediumpurple": "#9370d8", - "mediumseagreen": "#3cb371", - "mediumslateblue": "#7b68ee", - "mediumspringgreen": "#00fa9a", - "mediumturquoise": "#48d1cc", - "mediumvioletred": "#c71585", - "midnightblue": "#191970", - "mintcream": "#f5fffa", - "mistyrose": "#ffe4e1", - "moccasin": "#ffe4b5", - "navajowhite": "#ffdead", - "navy": "#000080", - "oldlace": "#fdf5e6", - "olive": "#808000", - "olivedrab": "#6b8e23", - "orange": "#ffa500", - "orangered": "#ff4500", - "orchid": "#da70d6", - "palegoldenrod": "#eee8aa", - "palegreen": "#98fb98", - "paleturquoise": "#afeeee", - "palevioletred": "#d87093", - "papayawhip": "#ffefd5", - "peachpuff": "#ffdab9", - "peru": "#cd853f", - "pink": "#ffc0cb", - "plum": "#dda0dd", - "powderblue": "#b0e0e6", - "purple": "#800080", - "rebeccapurple": "#663399", - "red": "#ff0000", - "rosybrown": "#bc8f8f", - "royalblue": "#4169e1", - "saddlebrown": "#8b4513", - "salmon": "#fa8072", - "sandybrown": "#f4a460", - "seagreen": "#2e8b57", - "seashell": "#fff5ee", - "sienna": "#a0522d", - "silver": "#c0c0c0", - "skyblue": "#87ceeb", - "slateblue": "#6a5acd", - "slategray": "#708090", - "snow": "#fffafa", - "springgreen": "#00ff7f", - "steelblue": "#4682b4", - "tan": "#d2b48c", - "teal": "#008080", - "thistle": "#d8bfd8", - "tomato": "#ff6347", - "turquoise": "#40e0d0", - "violet": "#ee82ee", - "wheat": "#f5deb3", - "whitesmoke": "#f5f5f5", - "yellow": "#ffff00", - "yellowgreen": "#9acd32" - }; + var colours = { + aliceblue: "#f0f8ff", + antiquewhite: "#faebd7", + aqua: "#00ffff", + aquamarine: "#7fffd4", + azure: "#f0ffff", + beige: "#f5f5dc", + bisque: "#ffe4c4", + blanchedalmond: "#ffebcd", + blue: "#0000ff", + blueviolet: "#8a2be2", + brown: "#a52a2a", + burlywood: "#deb887", + cadetblue: "#5f9ea0", + chartreuse: "#7fff00", + chocolate: "#d2691e", + coral: "#ff7f50", + cornflowerblue: "#6495ed", + cornsilk: "#fff8dc", + crimson: "#dc143c", + cyan: "#00ffff", + darkblue: "#00008b", + darkcyan: "#008b8b", + darkgoldenrod: "#b8860b", + darkgray: "#a9a9a9", + darkgreen: "#006400", + darkkhaki: "#bdb76b", + darkmagenta: "#8b008b", + darkolivegreen: "#556b2f", + darkorange: "#ff8c00", + darkorchid: "#9932cc", + darkred: "#8b0000", + darksalmon: "#e9967a", + darkseagreen: "#8fbc8f", + darkslateblue: "#483d8b", + darkslategray: "#2f4f4f", + darkturquoise: "#00ced1", + darkviolet: "#9400d3", + deeppink: "#ff1493", + deepskyblue: "#00bfff", + dimgray: "#696969", + dodgerblue: "#1e90ff", + firebrick: "#b22222", + floralwhite: "#fffaf0", + forestgreen: "#228b22", + fuchsia: "#ff00ff", + gainsboro: "#dcdcdc", + ghostwhite: "#f8f8ff", + gold: "#ffd700", + goldenrod: "#daa520", + gray: "#808080", + green: "#008000", + greenyellow: "#adff2f", + honeydew: "#f0fff0", + hotpink: "#ff69b4", + "indianred ": "#cd5c5c", + indigo: "#4b0082", + ivory: "#fffff0", + khaki: "#f0e68c", + lavender: "#e6e6fa", + lavenderblush: "#fff0f5", + lawngreen: "#7cfc00", + lemonchiffon: "#fffacd", + lightblue: "#add8e6", + lightcoral: "#f08080", + lightcyan: "#e0ffff", + lightgoldenrodyellow: "#fafad2", + lightgrey: "#d3d3d3", + lightgreen: "#90ee90", + lightpink: "#ffb6c1", + lightsalmon: "#ffa07a", + lightseagreen: "#20b2aa", + lightskyblue: "#87cefa", + lightslategray: "#778899", + lightsteelblue: "#b0c4de", + lightyellow: "#ffffe0", + lime: "#00ff00", + limegreen: "#32cd32", + linen: "#faf0e6", + magenta: "#ff00ff", + maroon: "#800000", + mediumaquamarine: "#66cdaa", + mediumblue: "#0000cd", + mediumorchid: "#ba55d3", + mediumpurple: "#9370d8", + mediumseagreen: "#3cb371", + mediumslateblue: "#7b68ee", + mediumspringgreen: "#00fa9a", + mediumturquoise: "#48d1cc", + mediumvioletred: "#c71585", + midnightblue: "#191970", + mintcream: "#f5fffa", + mistyrose: "#ffe4e1", + moccasin: "#ffe4b5", + navajowhite: "#ffdead", + navy: "#000080", + oldlace: "#fdf5e6", + olive: "#808000", + olivedrab: "#6b8e23", + orange: "#ffa500", + orangered: "#ff4500", + orchid: "#da70d6", + palegoldenrod: "#eee8aa", + palegreen: "#98fb98", + paleturquoise: "#afeeee", + palevioletred: "#d87093", + papayawhip: "#ffefd5", + peachpuff: "#ffdab9", + peru: "#cd853f", + pink: "#ffc0cb", + plum: "#dda0dd", + powderblue: "#b0e0e6", + purple: "#800080", + rebeccapurple: "#663399", + red: "#ff0000", + rosybrown: "#bc8f8f", + royalblue: "#4169e1", + saddlebrown: "#8b4513", + salmon: "#fa8072", + sandybrown: "#f4a460", + seagreen: "#2e8b57", + seashell: "#fff5ee", + sienna: "#a0522d", + silver: "#c0c0c0", + skyblue: "#87ceeb", + slateblue: "#6a5acd", + slategray: "#708090", + snow: "#fffafa", + springgreen: "#00ff7f", + steelblue: "#4682b4", + tan: "#d2b48c", + teal: "#008080", + thistle: "#d8bfd8", + tomato: "#ff6347", + turquoise: "#40e0d0", + violet: "#ee82ee", + wheat: "#f5deb3", + whitesmoke: "#f5f5f5", + yellow: "#ffff00", + yellowgreen: "#9acd32", + }; - if (typeof colours[colour.toLowerCase()] != 'undefined') - return colours[colour.toLowerCase()]; + if (typeof colours[colour.toLowerCase()] != "undefined") return colours[colour.toLowerCase()]; - return "#000000"; -} \ No newline at end of file + return "#000000"; +} diff --git a/modules/events/event.controller.js b/modules/events/event.controller.js index eb9dfb5..5e51f8e 100644 --- a/modules/events/event.controller.js +++ b/modules/events/event.controller.js @@ -55,21 +55,6 @@ function generateMemberInscription(user, inscription, reservation) { return memberInscription; } -function generateQRConfig(member) { - let qrConfig = null; - if (member) { - qrConfig = { - name: member.name, - surname: member.surname, - date: member.date_inscription, - code: member.code_ticket, - color: member.color, - }; - } - - return qrConfig; -} - function generateHeaderMail(member) { let headerMail = null; if (member) { @@ -133,7 +118,7 @@ const extraControllers = { EventOverflow = await eventService._getEvent(Event.overflow_eventId); result = Object.assign({}, result, { - allow: Event.assistants - Event.confirmed > result.group_size, // false + allow: Event.assistants - Event.confirmed >= result.group_size, // false assistants: Event.assistants, confirmed: Event.confirmed, sold_out: Event.sold_out, @@ -141,7 +126,7 @@ const extraControllers = { confirmed_overflow: EventOverflow ? EventOverflow.confirmed : 0, sold_out_overflow: EventOverflow ? EventOverflow.sold_out : 1, allow_overflow: EventOverflow - ? EventOverflow.assistants - EventOverflow.confirmed > result.group_size + ? EventOverflow.assistants - EventOverflow.confirmed >= result.group_size : false, }); } @@ -152,29 +137,6 @@ const extraControllers = { } }, - checkReservationCode: async (req, res, next) => { - const params = extractParamsFromRequest(req, res, {}); - const appVersion = req && req.headers && req.headers["accept-version"] ? req.headers["accept-version"] : null; - console.log("checkReservationCode - appVersion: ", appVersion); - console.log("checkReservationCode - PARAMS ", params); - - const eventId = params.params.id; - const encodedInvitationCode = params.params.encodedInvitationCode; - - const registrationCode = Buffer.from(req.params.encodedInvitationCode, "base64").toString("ascii"); - - try { - const result = await eventReservationService._getReservaByCode(eventId, registrationCode); - if (appVersion) { - if (appVersion == "1.0.0" || appVersion == "1.0.1" || appVersion == "1.0.2") - return handleResultResponse(!!result, null, params, res, httpStatus.OK); - else return handleResultResponse(result, null, params, res, httpStatus.OK); - } else return handleResultResponse(!!result, null, params, res, httpStatus.OK); - } catch (error) { - return handleErrorResponse(MODULE_NAME, "checkReservationCode", error, res); - } - }, - //Funcion que devuelve: //1. Todas las inscripciones de un evento, cuando el usuario es administrador //2. Todas las inscripciones de un usuario, cuando no nos llega ningun param con id @@ -233,7 +195,7 @@ const extraControllers = { console.log("inscripcion encontrada>>>>>>>>>>>>>>>>>>>>>>>>>>>", inscription); inscription = await inscription.toJSON(); var member = generateMemberInscription(inscription.user, inscription, inscription.reservation); - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); inscription.code_ticket_qr = await QRHelper.getInscriptionQRCode(member.qrConfig); console.log(">>>>>>>voy a dar inscription"); return handleResultResponse(inscription, null, params, res, httpStatus.OK); @@ -386,55 +348,62 @@ const extraControllers = { //Borramos inscripcion y descontamos asistentes if ((await eventInscriptionService._deleteInscription(inscription.id)) > 0) { console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", inscription.reservationId); - NewConfirmed = await eventInscriptionService._getCountInscriptionsWithReservation(EventOrReservationChangeId); - marketingListId = (await eventReservationService._getReservaById(EventOrReservationChangeId)).marketing_list; - } else if (inscription.overflowEventId != null) { - console.log("Tengo overflow>>>>>>>>>>>>>>>>>>", inscription.overflowEventId); - NewConfirmed = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( - EventOrReservationChangeId - ); - marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; - } else if (inscription.eventId != null) { - NewConfirmed = await eventInscriptionService._getCountInscriptionsWithoutReservationAndOverflow( - EventOrReservationChangeId - ); - marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; + if (inscription.reservationId != null) { + console.log("Tengo reservation>>>>>>>>>>>>>>>>>>", inscription.reservationId); + NewConfirmed = await eventInscriptionService._getCountInscriptionsWithReservation( + EventOrReservationChangeId + ); + marketingListId = (await eventReservationService._getReservaById(EventOrReservationChangeId)) + .marketing_list; + } else if (inscription.overflowEventId != null) { + console.log("Tengo overflow>>>>>>>>>>>>>>>>>>", inscription.overflowEventId); + NewConfirmed = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( + EventOrReservationChangeId + ); + marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; + } else if (inscription.eventId != null) { + NewConfirmed = await eventInscriptionService._getCountInscriptionsWithoutReservationAndOverflow( + EventOrReservationChangeId + ); + marketingListId = (await eventService._getEvent(EventOrReservationChangeId)).marketing_list; + } + + //Actualizamos aforo del evento o de la reserva + if (inscription.reservationId != null) { + console.log(">>>>>>>>>>>>>>Voy a actualizar aforo reserva", EventOrReservationChangeId); + console.log(">>>>>>>>>>>>>> ", NewConfirmed); + if (!(await eventReservationService._updateConfirmedReservation(EventOrReservationChangeId, NewConfirmed))) + return handleResultResponse( + "Error al eliminar inscripción, no puedo cambiar confirmados a la reserva asociada", + null, + params, + res, + httpStatus.NOT_FOUND + ); + } else { + console.log(">>>>>>>>>>>>>>Voy a actualizar aforo evento", EventOrReservationChangeId); + console.log(">>>>>>>>>>>>>> ", NewConfirmed); + if (!(await eventService._updateConfirmedEvent(EventOrReservationChangeId, NewConfirmed))) + return handleResultResponse( + "Error al eliminar inscripción, no puedo cambiar confirmados a la inscripcion", + null, + params, + res, + httpStatus.NOT_FOUND + ); + } } - //Actualizamos aforo del evento o de la reserva - if (inscription.reservationId != null) { - console.log(">>>>>>>>>>>>>>Voy a actualizar aforo reserva", EventOrReservationChangeId); - console.log(">>>>>>>>>>>>>> ", NewConfirmed); - if (!(await eventReservationService._updateConfirmedReservation(EventOrReservationChangeId, NewConfirmed))) - return handleResultResponse( - "Error al eliminar inscripción, no puedo cambiar confirmados a la reserva asociada", - null, - params, - res, - httpStatus.NOT_FOUND - ); - } else { - console.log(">>>>>>>>>>>>>>Voy a actualizar aforo evento", EventOrReservationChangeId); - console.log(">>>>>>>>>>>>>> ", NewConfirmed); - if (!(await eventService._updateConfirmedEvent(EventOrReservationChangeId, NewConfirmed))) - return handleResultResponse( - "Error al eliminar inscripción, no puedo cambiar confirmados a la inscripcion", - null, - params, - res, - httpStatus.NOT_FOUND - ); - } try { //Desinscribimos de mailchimp y mandamos correo de confirmacion de desinscripcion await eventInscriptionService._deleteMember(marketingListId, inscription.user.email); //inscription.marketing_memberId); @@ -443,7 +412,7 @@ const extraControllers = { } var member = generateMemberInscription(inscription.user, inscription, inscription.reservation); - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(inscription.id); let headerMail = generateHeaderMail(member); @@ -500,16 +469,18 @@ const extraControllers = { console.log("CREATE INSCRIPTION********************************************>>>< ", req.body.type); //Si la inscripcion en online o grupal saltamos la incripcion antigua y lo hacemos del nuevo modo if (req.body.group_size && req.body.group_size > 1) { + console.log(">>>voy por la otra rama group_size: ", req.body.group_size); next(); return; } if (req.body.type && req.body.type === "online") { + console.log(">>>voy por la otra rama: ", req.body.type); next(); return; } const params = extractParamsFromRequest(req, res, {}); - console.log("CREATE INSCRIPTION>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< ", req.body.code); + console.log("CREATE INSCRIPTION>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< ANTIGUA "); //Iniciamos entidades relacionadas con la inscripción. let dataUser = { id: req.user ? req.user.id : null, @@ -796,7 +767,7 @@ const extraControllers = { dataInscription.event.overflow_eventId ); //recuperamos la cantidad de apuntados al evento overflow a lista de espera - const ConfirmedWaitList = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( + let ConfirmedWaitList = await eventInscriptionService._getCountInscriptionsWithOverflowEventId( dataInscription.event.overflow_eventId ); console.log( @@ -808,7 +779,9 @@ const extraControllers = { ConfirmedWaitList ); - if (await eventService._updateConfirmedEvent(dataInscription.event.overflow_eventId, ConfirmedWaitList)) { + if ( + await eventService._updateConfirmedEvent(dataInscription.event.overflow_eventId, ++ConfirmedWaitList) + ) { //console.log('voy a crearrrrrr la inscripcion'); dataInscription.inscription = await eventInscriptionService._createInscription( dataInscription.event.id, @@ -874,7 +847,7 @@ const extraControllers = { console.log("No se ha podido añadir email a mailchimp"); } - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(dataInscription.inscription.id); @@ -891,11 +864,19 @@ const extraControllers = { return handleResultResponse(await dataInscription.inscription.toJSON(), null, params, res, httpStatus.CREATED); }, - descontarAforo: async (req, res, next) => { + addConfirmedfromReservation: async (req, res, next) => { //_updateConfirmedEvent - console.log(">>>>>>>>>>>>>>>>>>>> descontarAforo"); + console.log(">>>>>>>>>>>>>>>>>>>> addConfirmedfromReservation"); const params = extractParamsFromRequest(req, res, {}); let dataInscription = res.locals.dataInscription; + + //En caso de ser online no descontamos ningun aforo ya que no se controla de momento + if (dataInscription.type === "online" || dataInscription.type === "online group") { + console.log(">> No se aplica descuento"); + next(); + return; + } + if (!dataInscription || !dataInscription.reservation || !dataInscription.event) return handleResultResponse( "Error createReservationToEntity, prepareInscription, recuperateEvent, ActiveReservationToEntity requerida", @@ -905,30 +886,31 @@ const extraControllers = { httpStatus.NOT_FOUND ); - const newConfirmed = dataInscription.event.confirmed + dataInscription.reservation.assistants; - if (dataInscription.event.assistants < newConfirmed) - return handleResultResponse( - { message: "El aforo solicitado es superior a las plazas disponibles" }, - null, - params, - res, - httpStatus.OK - ); + if (res.locals.dataUser.entityLevel === "aliado") { + const newConfirmed = dataInscription.event.confirmed + dataInscription.reservation.assistants; + if (dataInscription.event.assistants < newConfirmed) + return handleResultResponse( + { message: "El aforo solicitado es superior a las plazas disponibles" }, + null, + params, + res, + httpStatus.OK + ); - //SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DE LA RESERVA - if (!(await eventService._updateConfirmedEvent(dataInscription.event.id, newConfirmed))) - return handleResultResponse( - "No se ha podido actualizar el aforo del evento", - null, - params, - res, - httpStatus.NOT_FOUND - ); - - //Si se ha llenado ponemos el evento en SOLD_OUT - if (dataInscription.event.assistants == newConfirmed) - await eventService._updateSoldOutEvent(dataInscription.event.id, true); + //SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DE LA RESERVA + if (!(await eventService._updateConfirmedEvent(dataInscription.event.id, newConfirmed))) + return handleResultResponse( + "No se ha podido actualizar el aforo del evento", + null, + params, + res, + httpStatus.NOT_FOUND + ); + //Si se ha llenado ponemos el evento en SOLD_OUT + if (dataInscription.event.assistants == newConfirmed) + await eventService._updateSoldOutEvent(dataInscription.event.id, true); + } next(); }, @@ -947,7 +929,7 @@ const extraControllers = { //Creamos objeto member para facilitar inserción en mailchimp y envio de correo var member = generateMemberInscription(req.user, inscription.inscription, inscription.reservation); - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(inscription.id); @@ -992,7 +974,7 @@ const extraControllers = { //Creamos objeto member para facilitar inserción en mailchimp y envio de correo var member = generateMemberInscription(userInscription, inscription, inscription.reservation); - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); member.qrCodeUrl = QRHelper.getInscriptionQRCodeUrl(inscription.id); @@ -1047,7 +1029,7 @@ const extraControllers = { //Creamos objeto member para facilitar inserción en mailchimp y envio de correo let member = generateMemberInscription(inscription.user, inscription, inscription.reservation); - member.qrConfig = generateQRConfig(member); + member.qrConfig = QRHelper.generateQRConfig(member); member.qrCode = await QRHelper.getInscriptionQRCode(member.qrConfig); let buffer = new Buffer.from(member.qrCode.split(",")[1], "base64"); diff --git a/modules/events/event.routes.js b/modules/events/event.routes.js index ffc188f..8a0d4d0 100644 --- a/modules/events/event.routes.js +++ b/modules/events/event.routes.js @@ -291,12 +291,23 @@ routes.post( //Recupera a registra el usuario que se va a inscribir authController.getOrCreateUser, //Comprobamos que no tenga ya hecha una incripción, en tal caso la devolvemos - // eventInscriptionController.checkInscription, + eventInscriptionController.checkInscription, //Si es un usuario tutor y solicita un group_size se crea la reserva eventReservationController.createReservationToEntity, - eventController.descontarAforo, - eventReservationController.activeReservationToEntity - //eventInscriptionController.createInscription + eventController.addConfirmedfromReservation, + eventReservationController.activeReservationToEntity, + + (req, res, next) => { + if (res.locals.dataInscription.reservation) { + console.log(">>>>>>>Incripcion con reserva"); + eventReservationController.createInscriptionReservation(req, res, next); + } else { + console.log(">>>>>>>Incripcion sin reserva"); + eventInscriptionController.createInscription(req, res, next); + } + //next(); + } + // eventInscriptionController.createInscriptionMarketingList ); // Hacer una pregunta @@ -322,7 +333,7 @@ routes.get( "/events/:id/reservations/:encodedInvitationCode", isLoggedUser, //eventController.findComments - eventController.checkReservationCode + eventReservationController.checkReservationCode ); //WEB @@ -513,6 +524,13 @@ routes.put( eventReservationController.update() ); +routes.put( + "/admin/reservations/:id/activate", + // isAdministratorUser, + //SchemaValidator(eventValidation.ReservationInputType, true), + eventReservationController.activarReservation +); + //Valida una inscripción routes.put( "/admin/inscriptions/:id", diff --git a/modules/events/events_inscriptions.controller.js b/modules/events/events_inscriptions.controller.js index 3fe4f13..1a4bb13 100644 --- a/modules/events/events_inscriptions.controller.js +++ b/modules/events/events_inscriptions.controller.js @@ -1,19 +1,17 @@ "use strict"; +const httpStatus = require("http-status"); const generateControllers = require("../../core/controllers"); const eventInscriptionService = require("./events_inscriptions.service"); -const eventService = require("./event.service"); +const mailService = require("./mail.service"); +const marketingListService = require("./marketing_list.service"); -const { - extractParamsFromRequest, - handleResultResponse, - httpStatus, -} = require("../../helpers/controller.helper"); +const { extractParamsFromRequest, handleResultResponse } = require("../../helpers/controller.helper"); // Module Name const MODULE_NAME = "[eventInscription.controller]"; - const controllerOptions = { MODULE_NAME }; + const extraControllers = { /////////////////////////////////////////////////////////////////// //Prepara la estructura de datos para el registro de inscripciones @@ -22,26 +20,28 @@ const extraControllers = { console.log(">>>>>>>>>>>>>>>>>>>> prepareInscription"); const params = extractParamsFromRequest(req, res, {}); - let typeInscription = "presencial"; + let typeInscription = "onsite"; //online if (req.body.type === "online") { - if (req.body.code) typeInscription = "reservation online"; - else if (req.body.group_size > 1) typeInscription = "reservation online"; + // reservation online + if (req.body.code) typeInscription = "online group"; + //reservation online + else if (req.body.group_size > 1) typeInscription = "online group"; else typeInscription = "online"; } //onsite else { - if (req.body.code) typeInscription = "reservation presencial"; - else if (req.body.group_size > 1) - typeInscription = "reservation presencial"; + // reservation presencial + if (req.body.code) typeInscription = "onsite group"; + // reservation presencial + else if (req.body.group_size > 1) typeInscription = "onsite group"; } let dataInscription = { eventId: params.params.id, - reservationCode: req.user - ? req.body.code - : Buffer.from(req.body.code, "base64").toString("ascii"), + reservationCode: req.user ? req.body.code : Buffer.from(req.body.code, "base64").toString("ascii"), type: typeInscription, + groupSize: req.body.group_size ? req.body.group_size : 1, source: req.user ? "app" : "web", //En el caso de tener ya usuario viene por APP sino viene por web validated: null, //si no esta validado la inscripción es a la lista de espera inscriptionsWithoutReservationAndOverflowCount: null, //nº total de inscritos sin reserva y sin overflow asignada @@ -58,9 +58,7 @@ const extraControllers = { //Esta función comprueba si el usuario ya tiene una inscripción para el evento /////////////////////////////////////////////////////////////////// checkInscription: async (req, res, next) => { - console.log( - ">>>>>>>>>>>>>>>>>>>> checkInscription (event_inscriptions.controller)" - ); + console.log(">>>>>>>>>>>>>>>>>>>> checkInscription (event_inscriptions.controller)"); const params = extractParamsFromRequest(req, res, {}); let dataInscription = res.locals.dataInscription; if (!dataInscription || !dataInscription.event) @@ -82,43 +80,37 @@ const extraControllers = { ); //Comprobamos que el usuario no tenga ya inscripcion para ese evento - dataInscription.inscription = - await eventInscriptionService._getInscriptionByEventAndUser( - dataInscription.event.id, - dataUser.userResult.user.id - ); + dataInscription.inscription = await eventInscriptionService._getInscriptionByEventAndUser( + dataInscription.event.id, + dataUser.userResult.user.id + ); if (dataInscription.inscription) { - console.log("esta es la inscripcion que ya tengo>>>>>>>>>>>>>>>>>>>>><"); + console.log( + "esta es la inscripcion que ya tengo>>>>>>>>>>>>>>>>>>>>><", + dataInscription.inscription.reservationId + ); console.log(dataInscription.inscription); //Devuelvo la reserva que ya tiene hecha el usuario - if ( - !dataInscription.inscription.reservationId || - dataInscription.inscription.reservationId == - dataInscription.reservation.id - ) - return handleResultResponse( - dataInscription.inscription, - null, - params, - res, - httpStatus.OK - ); + // if ( + // !dataInscription.inscription.reservationId || + // dataInscription.inscription.reservationId == dataInscription.reservation.id + // ) + return handleResultResponse(dataInscription.inscription, null, params, res, httpStatus.OK); } next(); }, /////////////////////////////////////////////////////////////////// - //Esta función se puede llamar desde APP - //SIN CODIGO DE RESERVA SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DEL EVENTO + //Esta función se llama solo desde APP + //Inscripción sin CODIGO DE RESERVA, SE MODIFICA EL CONFIRMED DEL EVENTO, YA QUE SE DESCONTARA DEL AFORO DEL EVENTO + // en caso de online no afectará a los aforos /////////////////////////////////////////////////////////////////// createInscription: async (req, res, next) => { - console.log( - ">>>>>>>>>>>>>>>>>>>> createInscription (event_inscriptions.controller)" - ); + console.log(">>>>>>>>>>>>>>>>>>>> createInscription (event_inscriptions.controller)"); const params = extractParamsFromRequest(req, res, {}); let dataInscription = res.locals.dataInscription; if (!dataInscription || !dataInscription.event) return handleResultResponse( - "Error createReservationToEntity, prepareInscription, recuperateEvent requerida", + "Error prepareInscription, recuperateEvent requerida", null, params, res, @@ -126,126 +118,47 @@ const extraControllers = { ); let dataUser = res.locals.dataUser; if (!dataUser) + return handleResultResponse("Error getOrCreateUser requerida", null, params, res, httpStatus.NOT_FOUND); + + if (dataInscription.reservation) return handleResultResponse( - "Error createReservationToEntity, prepareInscription, recuperateEvent, getOrCreateUser requerida", + "Error existe una reserva por lo que debe llamar a createInscriptionReservation", null, params, res, httpStatus.NOT_FOUND ); - dataInscription.inscriptionsWithoutReservationAndOverflowCount = - await eventInscriptionService._getCountInscriptionsWithoutReservationAndOverflow( - dataInscription.event.id - ); - ++dataInscription.inscriptionsWithoutReservationAndOverflowCount; - - //COMPROBAMOS SI ES VALIDO O HAY QUE APUNTARLE A LA LISTA DE ESPERA DEL EVENTO - if ( - dataInscription.event.sold_out == 0 && - dataInscription.event.assistants >= - dataInscription.inscriptionsWithoutReservationAndOverflowCount - ) { - dataInscription.validated = true; - //Actualizamos aforo del evento y creamos inscripcion - if ( - await eventService._updateConfirmedEvent( + //Si es una inscripcion online no se validan aforos se crea inscripción y ya esta + if (dataInscription.type === "online" || dataInscription.type === "online group") { + try { + //creamos inscripcion + dataInscription.inscription = await eventInscriptionService._createInscription( dataInscription.event.id, - dataInscription.inscriptionsWithoutReservationAndOverflowCount - ) - ) - dataInscription.inscription = - await eventInscriptionService._createInscription( - dataInscription.event.id, - dataUser.userResult.user.id, - dataInscription.type, - dataInscription.validated, - dataInscription.source, - null, - null - ); - else - return handleResultResponse( - "No se ha podido actualizar el aforo del evento", + dataUser.userResult.user.id, + dataInscription.type, + true, //validated, + dataInscription.source, null, - params, - res, - httpStatus.NOT_FOUND + null ); + console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ENTRADA ONLINE", dataInscription.inscription); - //Ponemos el evento en SOLD_OUT - if ( - dataInscription.event.assistants == - dataInscription.inscriptionsWithoutReservationAndOverflowCount - ) - await eventService._updateSoldOutEvent(dataInscription.event.id, true); - } + let member = marketingListService.addMarketingList(dataUser, dataInscription); - // APUNTARSE A la lista de espera si se puede - else { - if (dataInscription.event.allow_overflow === true) { - dataInscription.validated = false; + console.log("SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS", member); + // member = mailService._sendInscriptionEmail(dataInscription, member); - //Actualizamos aforo de la lista de espera del evento y creamos inscripcion - console.log( - "evento de lista de espera que debo actulizar sus confirmados>>>>>>>>>>>>>>>>>>>>>", - dataInscription.event.overflow_eventId - ); - //recuperamos la cantidad de apuntados al evento overflow a lista de espera - const ConfirmedWaitList = - await eventInscriptionService._getCountInscriptionsWithOverflowEventId( - dataInscription.event.overflow_eventId - ); - console.log( - "cantidad apuntados al evento padre>>>>>>>>>>>>>>>>>>>>>", - dataInscription.inscriptionsWithoutReservationAndOverflowCount - ); - console.log( - "cantidad apuntados al evento de lista de espera asociado>>>>>>>>>>>>>>>>>>>>>", - ConfirmedWaitList - ); + //************************************************************************************************************************************************ + //EN UN FUTURO SE METERÄ AQUI LAS INSCRIPCIONES NORMALES************************************ + //************************************************************************************************************************************************ - if ( - await eventService._updateConfirmedEvent( - dataInscription.event.overflow_eventId, - ConfirmedWaitList - ) - ) { - //console.log('voy a crearrrrrr la inscripcion'); - dataInscription.inscription = - await eventInscriptionService._createInscription( - dataInscription.event.id, - dataUser.userResult.user.id, - dataInscription.type, - dataInscription.validated, - dataInscription.source, - null, - dataInscription.event.overflow_eventId - ); - } else { - console.log("No se ha podido actualizar el aforo del evento"); - return handleResultResponse( - "No se ha podido actualizar el aforo del evento", - null, - params, - res, - httpStatus.NOT_FOUND - ); - } - } else - return handleResultResponse( - "Aforo completo y no hay lista de espera", - null, - params, - res, - httpStatus.NOT_FOUND - ); + return handleResultResponse(await dataInscription.inscription.toJSON(), null, params, res, httpStatus.CREATED); + } catch (Error) { + return handleResultResponse("Error al crear la incripción online", null, params, res, httpStatus.NOT_FOUND); + } } }, }; -module.exports = generateControllers( - eventInscriptionService, - extraControllers, - controllerOptions -); +module.exports = generateControllers(eventInscriptionService, extraControllers, controllerOptions); diff --git a/modules/events/events_inscriptions.service.js b/modules/events/events_inscriptions.service.js index 1a68b64..0a19c49 100644 --- a/modules/events/events_inscriptions.service.js +++ b/modules/events/events_inscriptions.service.js @@ -3,10 +3,7 @@ const _ = require("lodash"); const moment = require("moment"); -const { - generateService, - parseParamsToFindOptions, -} = require("../../helpers/service.helper"); +const { generateService, parseParamsToFindOptions } = require("../../helpers/service.helper"); const models = require("../../core/models"); const marketing = require("../../helpers/sendinblue.helper"); const Sequelize = require("sequelize"); @@ -38,11 +35,7 @@ function generateNewCodeTicket() { const extraMethods = { _getInscriptionById: (id) => { - return models.EventInscription.scope([ - "includeEventAndVenue", - "includeReservation", - "defaultScope", - ]).findOne({ + return models.EventInscription.scope(["includeEventAndVenue", "includeReservation", "defaultScope"]).findOne({ where: { id: id, }, @@ -85,10 +78,7 @@ const extraMethods = { }, _getInscriptionsUser: (userId) => { - return models.EventInscription.scope( - "includeEventAndVenue", - "includeReservation" - ).findAll({ + return models.EventInscription.scope("includeEventAndVenue", "includeReservation").findAll({ attributes: { exclude: [ "marketing_memberId", @@ -172,25 +162,9 @@ const extraMethods = { ); }, - _createInscription: ( - eventId, - userId, - type, - validated, - source, - reservationId, - overflowEventId - ) => { + _createInscription: (eventId, userId, type, validated, source, reservationId, overflowEventId) => { console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< { + const params = extractParamsFromRequest(req, res, {}); + const appVersion = req && req.headers && req.headers["accept-version"] ? req.headers["accept-version"] : null; + console.log("checkReservationCode - appVersion: ", appVersion); + console.log("checkReservationCode - PARAMS ", params); + + const eventId = params.params.id; + const encodedInvitationCode = params.params.encodedInvitationCode; + + const registrationCode = Buffer.from(req.params.encodedInvitationCode, "base64").toString("ascii"); + + try { + const result = await eventReservationService._getReservaByCode(eventId, registrationCode); + if (appVersion) { + if (appVersion == "1.0.0" || appVersion == "1.0.1" || appVersion == "1.0.2") + return handleResultResponse(!!result, null, params, res, httpStatus.OK); + else return handleResultResponse(result, null, params, res, httpStatus.OK); + } else return handleResultResponse(!!result, null, params, res, httpStatus.OK); + } catch (error) { + return handleErrorResponse(MODULE_NAME, "checkReservationCode", error, res); + } + }, + getReservationsExcel: async (req, res, next) => { const params = extractParamsFromRequest(req, res, {}); const eventId = params.params.id; @@ -63,14 +115,8 @@ const extraControllers = { 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.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 { @@ -85,41 +131,20 @@ const extraControllers = { const reservationId = params.params.id; const user = req.user; try { - const reservation = - await eventReservationService._getReservaByIdWithEntityAndEvent( - reservationId - ); - if (!reservation) - return handleResultResponse( - "Reserva no encontrada", - null, - params, - res, - httpStatus.NOT_FOUND - ); + const reservation = await eventReservationService._getReservaByIdWithEntityAndEvent(reservationId); + if (!reservation) return handleResultResponse("Reserva no encontrada", null, params, res, httpStatus.NOT_FOUND); try { if (reservation.Entity.contact_email) - emailHelper.sendReservationCode( - generateHeaderMail(reservation), - generateBodyMail(reservation) - ); + emailHelper.sendReservationCode(generateHeaderMail(reservation), generateBodyMail(reservation)); } catch (error) { // console.log(error); - console.log( - "No se ha podido mandar email con los códigos de invitación" - ); + console.log("No se ha podido mandar email con los códigos de invitación"); } return handleResultResponse(null, null, params, res, httpStatus.OK); } catch (error) { - return handleResultResponse( - "Error al buscar la reserva", - null, - params, - res, - httpStatus.NOT_FOUND - ); + return handleResultResponse("Error al buscar la reserva", null, params, res, httpStatus.NOT_FOUND); } }, @@ -133,39 +158,18 @@ const extraControllers = { let result = ""; try { - if (!entityId) - reservations = await eventReservationService._getReservasByEventAndType( - eventId, - type - ); - else - reservations = - await eventReservationService._getReservasByEventAndEntity( - eventId, - entityId - ); + if (!entityId) reservations = await eventReservationService._getReservasByEventAndType(eventId, type); + else reservations = await eventReservationService._getReservasByEventAndEntity(eventId, entityId); if (!reservations) - return handleResultResponse( - "Reservas no encontradas", - null, - params, - res, - httpStatus.NOT_FOUND - ); + return handleResultResponse("Reservas no encontradas", null, params, res, httpStatus.NOT_FOUND); try { reservations.forEach(function (reservation) { console.log("mando correo: ", reservation.Entity.name); - if ( - reservation.Entity.contact_email && - reservation.Entity.contact_email.length !== 0 - ) { + if (reservation.Entity.contact_email && reservation.Entity.contact_email.length !== 0) { console.log("correo: ", reservation.Entity.contact_email); - emailHelper.sendReservationCode( - generateHeaderMail(reservation), - generateBodyMail(reservation) - ); + emailHelper.sendReservationCode(generateHeaderMail(reservation), generateBodyMail(reservation)); result = result + "Invitación con código " + @@ -179,20 +183,12 @@ const extraControllers = { }); } catch (error) { // console.log(error); - console.log( - "No se ha podido mandar email con los códigos de invitación" - ); + console.log("No se ha podido mandar email con los códigos de invitación"); } return handleResultResponse(result, null, params, res, httpStatus.OK); } catch (error) { - return handleResultResponse( - "Error al buscar las reservas", - null, - params, - res, - httpStatus.NOT_FOUND - ); + return handleResultResponse("Error al buscar las reservas", null, params, res, httpStatus.NOT_FOUND); } }, @@ -212,40 +208,27 @@ const extraControllers = { //SI VIENE CODIGO DE RESERVA, RECUPERAMOS LA RESERVA Y EL EVENTO if (dataInscription.reservationCode) { try { - dataInscription.reservation = - await eventReservationService._getReservaByCode( - dataInscription.eventId, - dataInscription.reservationCode - ); + dataInscription.reservation = await eventReservationService._getReservaByCode( + dataInscription.eventId, + dataInscription.reservationCode + ); if (dataInscription.reservation) { - dataInscription.reservation = - await dataInscription.reservation.toJSON(); + dataInscription.reservation = await dataInscription.reservation.toJSON(); dataInscription.event = dataInscription.reservation.Event; } else { // No se ha encontrado - return handleResultResponse( - "Código de reserva no encontrado", - null, - params, - res, - httpStatus.NOT_FOUND - ); + return handleResultResponse("Código de reserva no encontrado", null, params, res, httpStatus.NOT_FOUND); } + res.locals.dataInscription = dataInscription; } catch (error) { - return handleErrorResponse( - MODULE_NAME, - "recuperateEventAndReservation", - error, - res - ); + return handleErrorResponse(MODULE_NAME, "recuperateEventAndReservation", error, res); } } - res.locals.dataInscription = dataInscription; next(); }, createReservationToEntity: async (req, res, next) => { - console.log(">>>>>>>>>>>>>>>>>>>> getOrCreateUser"); + console.log(">>>>>>>>>>>>>>>>>>>> createReservationToEntity"); const params = extractParamsFromRequest(req, res, {}); let dataInscription = res.locals.dataInscription; if (!dataInscription || !dataInscription.event) @@ -267,22 +250,21 @@ const extraControllers = { ); //Si viene group_size crearemos un código de reserva - if (req.body.group_size > 1) { + if (dataInscription.groupSize > 1) { const reservationData = { - reservation_code: eventReservationService._generateReservatioCode( - dataInscription.event, - dataUser.entityName - ), - state: "draft", //borrador no estaría activa, publish es cuando se descuenta del aforo del evento + reservation_code: eventReservationService._generateReservatioCode(dataInscription.event, dataUser.entityName), + state: "draft", //sin confirmar, publish es cuando se descuenta del aforo del evento color: "gray", - description: "Reserva", + description: dataInscription.type, init_available_date: dataInscription.event.init_available_date, end_available_date: dataInscription.event.end_available_date, entityId: dataUser.entityId, eventId: dataInscription.event.id, gmt: dataInscription.event.gmt, - assistants: req.body.group_size, - confirmed: "0", + assistants: dataInscription.groupSize, + virtual: dataInscription.type === "online" || dataInscription.type === "online group", + userId: dataUser.id, + allow_overflow: false, }; ///Aqui podríamos validar si ya hay reserva y dar error ya que no pueden meter codigo de reserva y darnos un group_size superior a 1. @@ -292,9 +274,8 @@ const extraControllers = { ); dataInscription.reservation = dataInscription.reservation.toJSON(); res.locals.dataInscription = dataInscription; - } - req.body.group_size = 1; - req.body.code = dataInscription.reservation.reservation_code; + console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>RESERVATION CREADA", dataInscription.reservation); + } else console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>no hago nada"); next(); }, @@ -302,7 +283,7 @@ const extraControllers = { console.log(">>>>>>>>>>>>>>>>>>>> ActiveReservationToEntity"); const params = extractParamsFromRequest(req, res, {}); let dataInscription = res.locals.dataInscription; - if (!dataInscription || !dataInscription.reservation) + if (!dataInscription) return handleResultResponse( "Error activeReservationToEntity, prepareInscription, recuperateEvent requerida", null, @@ -311,28 +292,162 @@ const extraControllers = { httpStatus.NOT_FOUND ); - ///Aqui podríamos validar si ya hay reserva y dar error ya que no pueden meter codigo de reserva y darnos un group_size superior a 1. - if ( - !(await eventReservationService._updatePublishReservation( - dataInscription.reservation.id - )) - ) + if (dataInscription.reservation) { + if (res.locals.dataUser.entityLevel === "aliado") { + ///Aqui podríamos validar si ya hay reserva y dar error ya que no pueden meter codigo de reserva y darnos un group_size superior a 1. + if (!(await eventReservationService._updatePublishReservation(dataInscription.reservation.id))) + return handleResultResponse( + "No se ha podido publicar la reserva del evento", + null, + params, + res, + httpStatus.NOT_FOUND + ); + dataInscription.reservation.state = "publish"; + } + } + next(); + }, + + activarReservation: async (req, res, next) => { + const params = extractParamsFromRequest(req, res, {}); + const idResevation = params.params.id; + if (!idResevation) + return handleResultResponse("Error id de reservation necesario", null, params, res, httpStatus.NOT_FOUND); + + try { + let result = await activeReservationById(idResevation); + return handleResultResponse(result, null, params, res, httpStatus.OK); + } catch (error) { + return handleResultResponse("Error al buscar las reservas", null, params, res, httpStatus.NOT_FOUND); + } + }, + + /////////////////////////////////////////////////////////////////// + //Esta función se llama desde APP y desde WEB + //Inscripción con CODIGO DE RESERVA, SE MODIFICA EL CONFIRMED DE LA RESERVA, YA QUE SE DESCONTARA DEL AFORO DE LA RESERVA + // en caso de online, funciona igual ya que descontará la inscripción de la persona del aforo quedando la inscripción online asociada a la reserva + /////////////////////////////////////////////////////////////////// + createInscriptionReservation: async (req, res, next) => { + console.log(">>>>>>>>>>>>>>>>>>>> createInscriptionReservation (event_reservations.controller)"); + const params = extractParamsFromRequest(req, res, {}); + let dataInscription = res.locals.dataInscription; + if (!dataInscription || !dataInscription.event || !dataInscription.reservation) return handleResultResponse( - "No se ha podido publicar la reserva del evento", + "Error prepareInscription, recuperateEvent, recuperateReservationByCode o createReservationToEntity requerida", null, params, res, httpStatus.NOT_FOUND ); + let dataUser = res.locals.dataUser; + if (!dataUser) + return handleResultResponse("Error getOrCreateUser requerida", null, params, res, httpStatus.NOT_FOUND); - next(); + try { + //CON CODIGO DE RESERVA SE MODIFICA EL CONFIRMED DE LA RESERVA, YA QUE SE DESCONTARA DEL AFORO DE LA RESERVA + dataInscription.inscriptionsWithReservationCount = + await eventInscriptionService._getCountInscriptionsWithReservation(dataInscription.reservation.id); + ++dataInscription.inscriptionsWithReservationCount; + + console.log( + "me inscribo por reserva>>>>>>>>>>>>>>>>>>>>>>>>>>><< con asistentes: ", + dataInscription.reservation.assistants + ); + console.log(dataInscription.reservation.sold_out); + console.log(dataInscription.inscriptionsWithReservationCount); + + //COMPROBAMOS SI ES VALIDO O HAY QUE APUNTARLE A LA LISTA DE ESPERA DE LA RESERVA + if ( + dataInscription.reservation.sold_out == 0 && + dataInscription.reservation.assistants >= dataInscription.inscriptionsWithReservationCount + ) { + dataInscription.validated = true; + console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>", dataInscription.type); + //Actualizamos aforo de la lista de espera de la reserva y creamos inscripcion en la lista de espera de la reserva + if ( + await eventReservationService._updateConfirmedReservation( + dataInscription.reservation.id, + dataInscription.inscriptionsWithReservationCount + ) + ) + dataInscription.inscription = await eventInscriptionService._createInscription( + dataInscription.event.id, + dataUser.userResult.user.id, + dataInscription.type, + dataInscription.validated, + dataInscription.source, + dataInscription.reservation.id, + null + ); + else + return handleResultResponse( + "No se ha podido actualizar el aforo de la reserva", + null, + params, + res, + httpStatus.NOT_FOUND + ); + + //Ponemos la reserva en SOLD_OUT para que no se pueda apuntar nadie más + if (dataInscription.reservation.assistants == dataInscription.inscriptionsWithReservationCount) + await eventReservationService._updateSoldOutReservation(dataInscription.reservation.id, true); + } + // APUNTARSE A LISTA DE ESPERA SI SE PUEDE + else { + if (dataInscription.reservation.allow_overflow === true) { + dataInscription.validated = false; + dataInscription.inscriptionsWithReservationCount = + await eventInscriptionService._getCountInscriptionsWithReservation( + dataInscription.reservation.overflow_reservationId + ); + ++dataInscription.inscriptionsWithReservationCount; + + // if (dataInscription.reservation.assistants >= dataInscription.inscriptionsWithReservationCount) { + //Actualizamos aforo de la reserva y creamos inscripcion + if ( + await eventReservationService._updateConfirmedReservation( + dataInscription.reservation.overflow_reservationId, + dataInscription.inscriptionsWithReservationCount + ) + ) + dataInscription.inscription = await eventInscriptionService._createInscription( + dataInscription.event.id, + dataUser.userResult.user.id, + dataInscription.type, + dataInscription.validated, + dataInscription.source, + dataInscription.reservation.overflow_reservationId, + null + ); + else + return handleResultResponse( + "No se ha podido actualizar el aforo de la reserva", + null, + params, + res, + httpStatus.NOT_FOUND + ); + } else + return handleResultResponse( + "Aforo completo de la reserva y no hay lista de espera", + null, + params, + res, + httpStatus.NOT_FOUND + ); + } + let Result = await dataInscription.inscription.toJSON(); + Result = { + reservation: dataInscription.reservation, + ...Result, + }; + + return handleResultResponse(Result, null, params, res, httpStatus.CREATED); + } catch (error) { + return handleResultResponse("Error al crear la incripción online", null, params, res, httpStatus.NOT_FOUND); + } }, - //Esta función se puede llamar desde APP y desde WEB - createInscription: async (req, res, next) => {}, }; -module.exports = generateControllers( - eventReservationService, - extraControllers, - controllerOptions -); +module.exports = generateControllers(eventReservationService, extraControllers, controllerOptions); diff --git a/modules/events/events_reservations.model.js b/modules/events/events_reservations.model.js index 18e8088..a2dc7c3 100644 --- a/modules/events/events_reservations.model.js +++ b/modules/events/events_reservations.model.js @@ -1,126 +1,159 @@ -'use strict'; -const moment = require('moment'); -const Sequelize = require('sequelize'); -moment.locale('es'); +"use strict"; +const moment = require("moment"); +const Sequelize = require("sequelize"); +moment.locale("es"); const getStateText = (reservation) => { + var currentDate = moment().utc(), + init_availableDate = moment.utc(reservation.init_available_date), + end_availableDate = moment.utc(reservation.end_available_date); - var currentDate = moment().utc(), - init_availableDate = moment.utc(reservation.init_available_date), - end_availableDate = moment.utc(reservation.end_available_date); - - if (moment(currentDate).isBetween(init_availableDate, end_availableDate)) { - return (reservation.sold_out == 1) ? 'Inscripciones abiertas a lista de espera de la reserva' : 'Inscripciones abiertas a la reserva'; - } else { - return 'Inscripciones a la reserva a partir del ' + moment(init_availableDate).format('D [de] MMMM'); - }; + if (moment(currentDate).isBetween(init_availableDate, end_availableDate)) { + return reservation.sold_out == 1 + ? "Inscripciones abiertas a lista de espera de la reserva" + : "Inscripciones abiertas a la reserva"; + } else { + return "Inscripciones a la reserva a partir del " + moment(init_availableDate).format("D [de] MMMM"); + } }; +const getAssistanceType = (reservation) => (reservation.virtual ? "online" : "onsite"); +const getAssistanceTypeText = (reservation) => (reservation.virtual ? "asistencia online" : "asistencia presencial"); module.exports = function (sequelize, DataTypes) { - const EventReservation = sequelize.define('EventReservation', { - id: { - type: DataTypes.UUID, - defaultValue: DataTypes.UUIDV4, - primaryKey: true, + const EventReservation = sequelize.define( + "EventReservation", + { + id: { + type: DataTypes.UUID, + defaultValue: DataTypes.UUIDV4, + primaryKey: true, + }, + init_available_date: { + type: DataTypes.DATE, + }, + end_available_date: { + type: DataTypes.DATE, + }, + //LO DA EL VENUE DEL EVENTO, Y LO COPIAMOS PARA NO ESTAR CONSULTANDOLO + gmt: { + type: DataTypes.INTEGER, + defaultValue: 1, + }, + state: { + type: DataTypes.STRING, + allowNull: false, + defaultValue: "draft", + }, + assistants: { + type: DataTypes.INTEGER, + }, + confirmed: { + type: DataTypes.INTEGER, + }, + sold_out: { + //Se han vendido todas y se ha abierto lista de espera si hay asignada + type: DataTypes.BOOLEAN, + defaultValue: false, + }, + allow_multiple: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + multiple_limit: { + type: DataTypes.INTEGER, + defaultValue: 0, + }, + description: { + type: DataTypes.STRING, + }, + reservation_code: { + type: DataTypes.STRING, + allowNull: false, + }, + color: { + type: DataTypes.STRING, + allowNull: false, + }, + allow_overflow: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + overflow_reservationId: { + type: DataTypes.UUID, + foreignKey: true, + }, + marketing_list: { + type: DataTypes.STRING, + }, + virtual: { + type: DataTypes.BOOLEAN, + allowNull: false, + defaultValue: false, + }, + assistanceType: { + type: Sequelize.VIRTUAL(Sequelize.STRING, ["virtual"]), + get: function () { + return getAssistanceType(this); }, - init_available_date: { - type: DataTypes.DATE, - }, - end_available_date: { - type: DataTypes.DATE, - }, -//LO DA EL VENUE DEL EVENTO, Y LO COPIAMOS PARA NO ESTAR CONSULTANDOLO - gmt: { - type: DataTypes.INTEGER, - defaultValue: 1, - }, - state: { - type: DataTypes.STRING, - allowNull: false, - defaultValue: 'draft' - }, - assistants: { - type: DataTypes.INTEGER, - }, - confirmed: { - type: DataTypes.INTEGER, - }, - sold_out: { //Se han vendido todas y se ha abierto lista de espera si hay asignada - type: DataTypes.BOOLEAN, - defaultValue: false, - }, - allow_multiple: { - type: DataTypes.BOOLEAN, - allowNull: false, - defaultValue: false, - }, - multiple_limit: { - type: DataTypes.INTEGER, - defaultValue: 0, - }, - description: { - type: DataTypes.STRING, - }, - reservation_code: { - type: DataTypes.STRING, - allowNull: false, - }, - color: { - type: DataTypes.STRING, - allowNull: false, - }, - allow_overflow: { - type: DataTypes.BOOLEAN, - allowNull: false, - defaultValue: false, - }, - overflow_reservationId: { - type: DataTypes.UUID, - foreignKey: true, - }, - marketing_list: { - type: DataTypes.STRING, - }, - stateText: { - type: Sequelize.VIRTUAL(Sequelize.STRING, ['init_available_date', 'end_available_date', 'sold_out']), - get: function () { - return getStateText(this); - }, + }, + assistanceTypeText: { + type: Sequelize.VIRTUAL(Sequelize.STRING, ["virtual"]), + get: function () { + return getAssistanceTypeText(this); }, + }, - }, { - tableName: 'events_reservations', - freezeTableName: true, - timestamps: true, + stateText: { + type: Sequelize.VIRTUAL(Sequelize.STRING, ["init_available_date", "end_available_date", "sold_out"]), + get: function () { + return getStateText(this); + }, + }, + }, + { + tableName: "events_reservations", + freezeTableName: true, + timestamps: true, + } + ); + + EventReservation.associate = function (models) { + EventReservation.OverflowEventReservation = EventReservation.belongsTo(models.EventReservation, { + as: "EventToEvent", + foreignKey: "overflow_reservationId", }); + EventReservation.Entity = EventReservation.belongsTo(models.Entity, { foreignKey: "entityId" }); + EventReservation.Event = EventReservation.belongsTo(models.Event, { foreignKey: "eventId" }); + EventReservation.Inscriptions = EventReservation.hasMany(models.EventInscription, { + foreignKey: "reservationId", + as: "inscriptions", + }); + EventReservation.UserCreate = EventReservation.belongsTo(models.User, { foreignKey: "userId" }); + }; - EventReservation.associate = function (models) { - EventReservation.OverflowEventReservation = EventReservation.belongsTo(models.EventReservation, { - as: 'EventToEvent', - foreignKey: 'overflow_reservationId' }); - EventReservation.Entity = EventReservation.belongsTo(models.Entity, { foreignKey: 'entityId' }); - EventReservation.Event = EventReservation.belongsTo(models.Event, { foreignKey: 'eventId' }); - EventReservation.Inscriptions = EventReservation.hasMany(models.EventInscription, { foreignKey: 'reservationId', as: 'inscriptions' }); - EventReservation.UserCreate = EventReservation.belongsTo(models.User, { foreignKey: 'userId' }); + EventReservation.addScope("includeEvent", () => { + return { + include: [ + { + model: sequelize.models.Event, + }, + ], }; + }); - EventReservation.addScope('includeEvent', () => { - return { - include: [{ - model: sequelize.models.Event - }] - } - }); + EventReservation.addScope("includeInscriptions", () => { + return { + include: [ + { + model: sequelize.models.EventInscription, + as: "inscriptions", + }, + ], + }; + }); - EventReservation.addScope('includeInscriptions', () => { - return { - include: [{ - model: sequelize.models.EventInscription, - as: 'inscriptions' - }] - } - }); - - return EventReservation; -}; \ No newline at end of file + return EventReservation; +}; diff --git a/modules/events/events_reservations.service.js b/modules/events/events_reservations.service.js index ab2e140..1b526a9 100644 --- a/modules/events/events_reservations.service.js +++ b/modules/events/events_reservations.service.js @@ -1,266 +1,314 @@ /* global Events Reservations */ -'use strict'; +"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 _ = 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 cdnHelper = require("../../helpers/cdn.helper"); function getWhereTypeEntity(type) { - var whereType = {}; - if (type == 'partners') - whereType = { alias: 'partner' } - else if (type == 'colleges') - whereType = { alias: 'college' }; - return whereType; + var whereType = {}; + if (type == "partners") whereType = { alias: "partner" }; + else if (type == "colleges") whereType = { alias: "college" }; + return whereType; } - const extraMethods = { + _getReservaById: (Id) => { + return models.EventReservation.findOne({ + where: { id: Id }, + }); + }, - _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 }], + }); + }, - _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 }], + }); + }, - _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"]], + }); + }, - _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 }, + ], + }); + }, - _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"], + ], + }); + }, - _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 }, + include: [ + { + model: models.Entity, + include: [{ model: models.EntityType, as: "types", where: { alias: "college" } }], + }, + ], + order: [ + [{ model: models.Entity }, "name", "asc"], + ["description", "desc"], + ], + }); + }, - _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'], ['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); }) - }, - - _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) - }); + .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) - }); + _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) - }); + _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; - + _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}`; + 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(); - }, + return result.toUpperCase(); + }, - _getReservationsExcel: (user, eventId, partnerId, type, callback) => { - console.log('>>>>>>>>>>>>>>>>>>>> { + console.log(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"); + //console.log(headerMail, bodyMail); + + try { + if (member.validated) emailHelper.sendTicket(generateHeaderMail(member), generateBodyMail(member)); + else emailHelper.sendListaEspera(generateHeaderMail(member), generateBodyMail(member)); + } catch (error) { + console.log("No se ha podido mandar email con entrada"); + } +} diff --git a/modules/events/marketing_list.service.js b/modules/events/marketing_list.service.js new file mode 100644 index 0000000..4986a03 --- /dev/null +++ b/modules/events/marketing_list.service.js @@ -0,0 +1,62 @@ +"use strict"; + +const eventInscriptionService = require("./events_inscriptions.service"); + +function generateMemberInscription2(user, datainscription) { + let memberInscription = null; + if (user && datainscription.inscription) { + memberInscription = { + marketing_memberId: null, + email: user.email, + name: user.name, + surname: user.surname, + source: datainscription.inscription.source, + event_name: datainscription.inscription.event ? datainscription.inscription.event.name : "N/A", + event_date: datainscription.inscription.event ? datainscription.inscription.event.init_date : "N/A", + reservation_code: datainscription.reservation ? datainscription.reservation.reservation_code : null, + date_inscription: datainscription.inscription.date, + code_ticket: datainscription.inscription.code_ticket, + validated: datainscription.inscription.validated, + color: datainscription.reservation ? datainscription.reservation.color : null, + description: (datainscription.reservation ? datainscription.reservation.description : "Entrada").toUpperCase(), + entity: datainscription.reservation ? datainscription.reservation.Entity.name : user.entityId, + userId: user.id, + qrConfig: null, + qrCode: null, + }; + } + return memberInscription; +} + +async function _addMarketingList(dataUser, dataInscription) { + /*AHORA SE ALMACENA TODO EN UNA ÚNICA LISTA DE MAILCHIMP, QUE ES LA DEL EVENTO +(si en un futuro se quiere tener listas independientes, bastaría con tratarlo aqui los campos de marketinglist de la reserva ...) + if (dataInscription.inscription.reservationId) + marketingListOfInscription = dataInscription.reservation.marketingList + else if (dataInscription.inscription.overflowEventId) + marketingListOfInscription = (await _getEvent(dataInscription.inscription.overflowEventId)).marketingList; + else + marketingListOfInscription = dataInscription.event.marketingList; +*/ + //Creamos objeto member para facilitar inserción en mailchimp y envio de correo + let member = generateMemberInscription2(dataUser.userResult.user, dataInscription); + //Meter esto en el servicio + //En este caso al ser una inscripcion recien creada hay que asignar los datos del evento desde el evento + //member.event_name = dataInscription.event.name; + //member.event_date = dataInscription.event.init_date; + + try { + member.marketing_memberId = await eventInscriptionService._addMember(dataInscription.event.marketing_list, member); + eventInscriptionService._updateMarketingMemberOfInscription( + dataInscription.inscription.id, + member.marketing_memberId + ); + return member; + } catch (error) { + console.log("No se ha podido añadir email a mailchimp"); + } +} + +module.exports = { + addMarketingList: _addMarketingList, +}; diff --git a/modules/speakers/speaker.routes.js b/modules/speakers/speaker.routes.js index 2da16a5..527dfe5 100644 --- a/modules/speakers/speaker.routes.js +++ b/modules/speakers/speaker.routes.js @@ -1,181 +1,172 @@ -const routes = require('express').Router(); +const routes = require("express").Router(); -const { isAdministratorUser, isLoggedUser, isOptionalUser } = require('../../middlewares/accessValidator'); -const { cacheSuccesses } = require('../../middlewares/cache'); +const { isAdministratorUser, isLoggedUser, isOptionalUser } = require("../../middlewares/accessValidator"); +const { cacheSuccesses } = require("../../middlewares/cache"); -const PaginateMiddleware = require('../../middlewares/paginate'); -const FieldMiddleware = require('../../middlewares/fields'); -const SortMiddleware = require('../../middlewares/sort'); +const PaginateMiddleware = require("../../middlewares/paginate"); +const FieldMiddleware = require("../../middlewares/fields"); +const SortMiddleware = require("../../middlewares/sort"); //const entityValidation = require('./entity.validations'); -const speakerController = require('./speaker.controller'); +const speakerController = require("./speaker.controller"); -const generalInvalidFields = [ - 'userId', 'createdAt', 'state', -]; +const generalInvalidFields = ["userId", "createdAt", "state"]; // Todos los ponentes -routes.get('/speakers', - isOptionalUser, - cacheSuccesses('24 hours'), - FieldMiddleware.middleware({ - invalidFields: generalInvalidFields - }), - PaginateMiddleware.middleware(), - SortMiddleware.middleware({ default: "name" }), - speakerController.find({ - scopes: ['defaultScope', 'onlyPublished', 'includeValues', 'includeMultimedias'], - }) +routes.get( + "/speakers", + isOptionalUser, + cacheSuccesses("1 minute"), + FieldMiddleware.middleware({ + invalidFields: generalInvalidFields, + }), + PaginateMiddleware.middleware(), + SortMiddleware.middleware({ default: "name" }), + speakerController.find({ + scopes: ["defaultScope", "onlyPublished", "includeValues", "includeMultimedias"], + }) ); // Ponentes destacados -routes.get('/speakers/featured', - isOptionalUser, - cacheSuccesses('1 minute'), - FieldMiddleware.middleware({ - invalidFields: generalInvalidFields - }), - PaginateMiddleware.middleware(), - //SortMiddleware.middleware({ default: "name" }), - speakerController.find({ - scopes: ['defaultScope', 'onlyPublished', 'includeValues', 'featured', 'includeMultimedias'], - }) +routes.get( + "/speakers/featured", + isOptionalUser, + cacheSuccesses("1 minute"), + FieldMiddleware.middleware({ + invalidFields: generalInvalidFields, + }), + PaginateMiddleware.middleware(), + //SortMiddleware.middleware({ default: "name" }), + speakerController.find({ + scopes: ["defaultScope", "onlyPublished", "includeValues", "featured", "includeMultimedias"], + }) ); // Ponentes más recientes -routes.get('/speakers/last', - isOptionalUser, - cacheSuccesses('1 minute'), - FieldMiddleware.middleware({ - invalidFields: ['userId'] - }), - PaginateMiddleware.middleware(), - SortMiddleware.middleware({ default: "-createdAt" }), - speakerController.find({ - scopes: ['defaultScope', 'onlyPublished', 'last', 'includeMultimedias'], - }) +routes.get( + "/speakers/last", + isOptionalUser, + cacheSuccesses("1 minute"), + FieldMiddleware.middleware({ + invalidFields: ["userId"], + }), + PaginateMiddleware.middleware(), + SortMiddleware.middleware({ default: "-createdAt" }), + speakerController.find({ + scopes: ["defaultScope", "onlyPublished", "last", "includeMultimedias"], + }) ); // Un ponente -routes.get('/speakers/:id', - isOptionalUser, - cacheSuccesses('24 hours'), - FieldMiddleware.middleware({ - invalidFields: generalInvalidFields - }), - speakerController.findOne({ - scopes: ['defaultScope', 'onlyPublished', 'includeValues', 'includeMultimedias', 'includeComments'], - }) +routes.get( + "/speakers/:id", + isOptionalUser, + cacheSuccesses("24 hours"), + FieldMiddleware.middleware({ + invalidFields: generalInvalidFields, + }), + speakerController.findOne({ + scopes: ["defaultScope", "onlyPublished", "includeValues", "includeMultimedias", "includeComments"], + }) ); - // Dar ponentes similares a uno dado -routes.get('/speakers/:id/similar', - isOptionalUser, - cacheSuccesses('24 hours'), - /*FieldMiddleware.middleware({ +routes.get( + "/speakers/:id/similar", + isOptionalUser, + cacheSuccesses("24 hours"), + /*FieldMiddleware.middleware({ invalidFields: ['createdAt'] }),*/ - PaginateMiddleware.middleware(), - SortMiddleware.middleware({ default: "name" }), - speakerController.findSimilar() + PaginateMiddleware.middleware(), + SortMiddleware.middleware({ default: "name" }), + speakerController.findSimilar() ); // Listar las preguntas hechas a un ponente -routes.get('/speakers/:id/:association', - isLoggedUser, - /*FieldMiddleware.middleware({ +routes.get( + "/speakers/:id/:association", + isLoggedUser, + /*FieldMiddleware.middleware({ invalidFields: ['createdAt'] }),*/ - PaginateMiddleware.middleware(), - SortMiddleware.middleware({ default: "-createdAt" }), - speakerController.find() + PaginateMiddleware.middleware(), + SortMiddleware.middleware({ default: "-createdAt" }), + speakerController.find() ); - - /******************************************************************************************************** - * ADMINISTRACIÓN - ********************************************************************************************************* + * ADMINISTRACIÓN + ********************************************************************************************************* */ // Todos los ponentes -routes.get('/admin/speakers', - isAdministratorUser, - SortMiddleware.middleware({ default: "name" }), - speakerController.find({ - scopes: ['defaultScope', 'includeValues', 'includeMultimedias'], - }) -); +routes.get( + "/admin/speakers", + isAdministratorUser, + SortMiddleware.middleware({ default: "name" }), + speakerController.find({ + scopes: ["defaultScope", "includeValues", "includeMultimedias"], + }) +); // Un ponente -routes.get('/admin/speakers/:id', - isAdministratorUser, - speakerController.findOne({ - scopes: ['defaultScope', 'includeValues', 'includeMultimedias'] - }) +routes.get( + "/admin/speakers/:id", + isAdministratorUser, + speakerController.findOne({ + scopes: ["defaultScope", "includeValues", "includeMultimedias"], + }) ); // Comentarios de un ponente -routes.get('/admin/speakers/:id/comments', - isAdministratorUser, - (req, res, next) => { - req.params.association = 'comments'; - next(); - }, - speakerController.find() +routes.get( + "/admin/speakers/:id/comments", + isAdministratorUser, + (req, res, next) => { + req.params.association = "comments"; + next(); + }, + speakerController.find() ); -routes.get('/admin/speakers/:id/values', - isAdministratorUser, - (req, res, next) => { - req.params.association = 'values'; - next(); - }, - speakerController.find() +routes.get( + "/admin/speakers/:id/values", + isAdministratorUser, + (req, res, next) => { + req.params.association = "values"; + next(); + }, + speakerController.find() ); -routes.get('/admin/speakers/:id/questions', - isAdministratorUser, - (req, res, next) => { - req.params.association = 'questions'; - next(); - }, - speakerController.find() +routes.get( + "/admin/speakers/:id/questions", + isAdministratorUser, + (req, res, next) => { + req.params.association = "questions"; + next(); + }, + speakerController.find() ); -routes.get('/admin/speakers/:id/multimedias', - isAdministratorUser, - (req, res, next) => { - req.params.association = 'multimedias'; - next(); - }, - speakerController.find() +routes.get( + "/admin/speakers/:id/multimedias", + isAdministratorUser, + (req, res, next) => { + req.params.association = "multimedias"; + next(); + }, + speakerController.find() ); // Nuevo ponente -routes.post('/admin/speakers/', - isAdministratorUser, - speakerController.create() -); +routes.post("/admin/speakers/", isAdministratorUser, speakerController.create()); - // Modificar ponente -routes.put('/admin/speakers/:id', - isAdministratorUser, - speakerController.update() -); +// Modificar ponente +routes.put("/admin/speakers/:id", isAdministratorUser, speakerController.update()); // Borrar ponente -routes.delete('/admin/speakers/:id', - isAdministratorUser, - speakerController.delete() -); +routes.delete("/admin/speakers/:id", isAdministratorUser, speakerController.delete()); - - - - - - - -module.exports = routes; \ No newline at end of file +module.exports = routes; diff --git a/script.sql b/script.sql index bc70b47..1e89036 100644 --- a/script.sql +++ b/script.sql @@ -3,3 +3,7 @@ ADD COLUMN `level` VARCHAR(45) NULL DEFAULT NULL AFTER `updatedAt`; ALTER TABLE `lqdvi_v2`.`users` ADD COLUMN `profile` VARCHAR(45) NULL DEFAULT NULL; + +ALTER TABLE `lqdvi_v2`.`events_reservations` +ADD COLUMN `virtual` TINYINT(1) NOT NULL DEFAULT '0' AFTER `updatedAt`; + diff --git a/server.js b/server.js index f6df082..9f44331 100644 --- a/server.js +++ b/server.js @@ -1,76 +1,80 @@ #!/usr/bin/env node -'use strict'; +"use strict"; -const http = require('http'); -const { assign, toLower } = require('lodash'); +const http = require("http"); +const moment = require("moment"); +const { assign, toLower } = require("lodash"); -const config = require('./config'); -const { express, logger, models } = require('./core'); +const config = require("./config"); +const { express, logger, models } = require("./core"); -const currentState = assign({ +const currentState = assign( + { launchedAt: Date.now(), appPath: process.cwd(), //host: process.env.HOST || process.env.HOSTNAME || 'localhost', //port: process.env.PORT || 18888, - environment: toLower(process.env.NODE_ENV) || 'development', - connections: {} -}, config); + environment: toLower(process.env.NODE_ENV) || "development", + connections: {}, + }, + config +); function stop(server) { - // Destroy server and available connections. - if (server) { - server.close(); - } + // Destroy server and available connections. + if (server) { + server.close(); + } - process.send('stop'); - // Kill process. - process.exit(1); + process.send("stop"); + // Kill process. + process.exit(1); } +moment.locale("es"); const server = http.createServer(express); -server.on('connection', conn => { - const key = conn.remoteAddress + ':' + conn.remotePort; - currentState.connections[key] = conn; +server.on("connection", (conn) => { + const key = conn.remoteAddress + ":" + conn.remotePort; + currentState.connections[key] = conn; - conn.on('close', () => { - delete currentState.connections[key]; - }); + conn.on("close", () => { + delete currentState.connections[key]; + }); }); -server.on('error', err => { - if (err.code === 'EADDRINUSE') { - logger.debug(`⛔️ Server wasn't able to start properly.`); - logger.error(`The port ${err.port} is already used by another application.`); - stop(server); - return; - } +server.on("error", (err) => { + if (err.code === "EADDRINUSE") { + logger.debug(`⛔️ Server wasn't able to start properly.`); + logger.error(`The port ${err.port} is already used by another application.`); + stop(server); + return; + } - console.error(err); + console.error(err); }); try { - models.sequelize.sync({ force: false }).then(() => { - // Launch server. - server.listen(currentState.server.port, (err) => { - if (err) { - logger.debug(`⚠️ Server wasn't able to start properly.`); - logger.error(err); - return stop(server); - } + models.sequelize.sync({ force: false }).then(() => { + // Launch server. + server.listen(currentState.server.port, (err) => { + if (err) { + logger.debug(`⚠️ Server wasn't able to start properly.`); + logger.error(err); + return stop(server); + } - logger.info('Time: ' + new Date()); - logger.info('Launched in: ' + (Date.now() - currentState.launchedAt) + ' ms'); - logger.info('Environment: ' + currentState.environment); - logger.info('Process PID: ' + process.pid); - //logger.info(`Version: ${this.config.info.strapi} (node v${this.config.info.node})`); - logger.info('To shut down your server, press + C at any time'); - logger.info(`⚡️ Server: http://${currentState.server.hostname}:${currentState.server.port}`); - - }); + logger.info("Time: " + moment().toISOString()); + logger.info("Launched in: " + (moment() - currentState.launchedAt) + " ms"); + logger.info("Environment: " + currentState.environment); + logger.info("Process PID: " + process.pid); + //logger.info(`Version: ${this.config.info.strapi} (node v${this.config.info.node})`); + logger.info("To shut down your server, press + C at any time"); + logger.info(`⚡️ Server: http://${currentState.server.hostname}:${currentState.server.port}`); }); + }); } catch (err) { - logger.debug(`⛔️ Server wasn't able to start properly.`); - logger.error(err); - console.error(err); - stop(server); + logger.debug(`⛔️ Server wasn't able to start properly.`); + logger.error(err); + console.error(err); + stop(server); }