app2-api/modules/events/events_inscriptions.service.js
2019-08-20 17:37:53 +02:00

207 lines
6.3 KiB
JavaScript

/* global Venue */
'use strict';
const _ = require('lodash');
const moment = require('moment');
const { generateService, parseParamsToFindOptions } = require('../../helpers/service.helper');
const models = require('../../core/models');
const marketing = require('../../helpers/mailchimp.helper')
const Sequelize = require('sequelize');
moment.locale('es');
function generateNewCodeTicket() {
let longitud = 8;
let timestamp = +new Date;
var _getRandomInt = function (min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
var ts = timestamp.toString();
var parts = ts.split("").reverse();
var id = "";
for (var i = 0; i < longitud; ++i) {
var index = _getRandomInt(0, longitud - 1);
id += parts[index];
}
return id;
}
const extraMethods = {
_getInscriptionById: (id) => {
return models.EventInscription.scope('includeEventAndVenue').findOne({
where: {
id: id,
},
})
},
_getInscriptionByEventAndUser: (eventId, userId) => {
return models.EventInscription.scope('includeEventAndVenue').findOne({
where: {
eventId: eventId,
userId: userId
},
})
},
_getInscriptionByEvent: (eventId) => {
return models.EventInscription.scope('defaultScope').findAll({
where: {
eventId: eventId,
},
})
},
_getInscriptionsUser: (userId) => {
return models.EventInscription.scope('includeEventAndVenue').findAll({
attributes: {
exclude: ['marketing_memberId', 'overflowEventId', 'createdAt', 'updatedAt', 'userId', 'eventId', 'validateUserId']
},
where: {
userId: userId
},
})
},
_getInscriptionsOfNextEventsUser: (userId) => {
return models.EventInscription.count({
include: [{ model: models.Event,
as: 'event',
where: {
end_date: {[Sequelize.Op.gte]: moment().utc()},
}
}],
where: { userId: userId },
});
},
//Nos devuelve el número de inscripciones confirmadas para ese evento sin tener en cuenta reservas
_getCountInscriptionsWithoutReservationAndOverflow: (eventId) => {
return models.EventInscription.count({
where: {
eventId: eventId,
reservationId: null,
overflowEventId: null
},
})
},
//Nos devuelve el número de inscripciones realizadas con esa reserva
_getCountInscriptionsWithReservation: (reservationId) => {
return models.EventInscription.count({
where: {
reservationId: reservationId,
},
})
},
//Nos devuelve el número de inscripciones realizadas con esa reserva
_getCountInscriptionsWithOverflowEventId: (overflowEventId) => {
return models.EventInscription.count({
where: {
overflowEventId: overflowEventId,
},
})
},
_updateReservationOfInscription: (id, reservationId) => {
return models.EventInscription.update ({
reservationId: reservationId,
},
{
where: { id: id }
});
},
_updateMarketingMemberOfInscription: (id, marketingMemberId) => {
return models.EventInscription.update({
marketing_memberId: marketingMemberId,
},
{
where: { id: id }
});
},
_createInscription: (eventId, userId, type, validated, source, reservationId, overflowEventId) => {
console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<valores de la inscripcion');
console.log(eventId, userId, type, validated, source, reservationId, overflowEventId);
return new Promise(function (resolve, reject) {
models.EventInscription.create({
eventId: eventId,
date: moment().utc(),
userId: userId,
type: type,
code_ticket: ('ENT-' + generateNewCodeTicket()),
source: source,
validated: validated,
reservationId: reservationId,
overflowEventId: overflowEventId,
})
.then(function (result) {
resolve(result);
})
.catch(function (error) {
reject(error)
});
});
},
_deleteInscription: (id) => {
//habria que poner el idusuario para asegurar que otro usuario no borra una inscripcion de otro
return models.EventInscription.destroy({
where: {
id: id,
}
});
},
_addMember: (marketingListId, user, inscription, reservation) => {
console.log('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasddddddmemberrrrr1');
console.log(user, reservation);
var member = {
marketing_memberId: null,
email: user.email,
name: user.name,
surname: user.surname,
source: inscription.source,
reservation_code: (reservation) ? reservation.reservation_code : null,
code_ticket: inscription.code_ticket,
validated: inscription.validated,
color: (reservation) ? reservation.color : 'white',
description: (reservation) ? reservation.description : 'entrada libre',
entity: (reservation) ? reservation.Entity.name : user.entityId,
userId: user.id
}
return new Promise(function (resolve, reject) {
if (!marketingListId) { // || !member.validated) {
resolve(member)
} else {
marketing.addMember(marketingListId, member)
.then(function (result) {
member.marketing_memberId = result.ID;
resolve(member);
})
.catch(function (error) {
reject(error)
});
}
});
},
};
module.exports = generateService(models.EventInscription, extraMethods);