app2-api/modules/events/event.model.js

495 lines
15 KiB
JavaScript
Raw Normal View History

'use strict';
2019-07-16 16:27:54 +00:00
const moment = require('moment');
const Sequelize = require('sequelize');
2019-07-22 17:03:26 +00:00
moment.locale('es');
2019-07-26 17:06:19 +00:00
const getStateCode = (event) => {
2019-09-27 10:22:09 +00:00
var currentDate = moment(),
initDate = moment(event.init_date),
endDate = moment(event.end_date),
init_availableDate = moment(event.init_available_date),
end_availableDate = moment(event.end_available_date);
2019-07-26 17:06:19 +00:00
2019-09-27 10:22:09 +00:00
if (currentDate.isBetween(initDate, endDate)) {
2019-07-26 17:06:19 +00:00
return 'current_event';
} else {
2019-09-27 10:22:09 +00:00
if (endDate.isBefore(currentDate)) {
2019-07-26 17:06:19 +00:00
return 'closed_event';
} else {
2019-09-27 10:22:09 +00:00
if (currentDate.isBefore(init_availableDate)){
2019-07-26 17:06:19 +00:00
return 'future_registrations'
} else {
2019-09-27 10:22:09 +00:00
if (currentDate.isBetween(init_availableDate, end_availableDate)) {
if (event.url_registration) {
return 'url_registrations_open';
} else {
return (event.sold_out == 1) ? 'waitinglist_open' : 'registrations_open';
}
2019-07-26 17:06:19 +00:00
}
else {
2019-09-27 10:22:09 +00:00
if (currentDate.isAfter(end_availableDate))
2019-07-26 17:06:19 +00:00
return 'closed_registrations'
else
return 'N/A';
}
}
}
};
};
2019-07-25 16:39:18 +00:00
const getStateText = (event) => {
2019-09-27 10:22:09 +00:00
var currentDate = moment(),
initDate = moment(event.init_date),
endDate = moment(event.end_date),
init_availableDate = moment(event.init_available_date),
end_availableDate = moment(event.end_available_date);
2019-07-21 18:48:19 +00:00
2019-09-27 10:22:09 +00:00
if (currentDate.isBetween(initDate, endDate)) {
2019-07-21 18:48:19 +00:00
return 'Congreso en curso';
} else {
2019-09-27 10:22:09 +00:00
if (endDate.isBefore(currentDate)) {
2019-07-21 18:48:19 +00:00
return 'Congreso finalizado';
} else {
2019-09-27 10:22:09 +00:00
if (currentDate.isBefore(init_availableDate)) {
return 'Inscripciones a partir del ' + init_availableDate.format('D [de] MMMM');
2019-07-26 17:06:19 +00:00
} else {
2019-09-27 10:22:09 +00:00
if (currentDate.isBetween(init_availableDate, end_availableDate)) {
if (event.url_registration) {
return 'Inscripciones abiertas';
} else {
return (event.sold_out == 1) ? 'Inscripciones abiertas a lista de espera' : 'Inscripciones abiertas';
}
2019-07-26 17:06:19 +00:00
}
else {
2019-09-27 10:22:09 +00:00
if (currentDate.isAfter(end_availableDate))
2019-07-26 17:06:19 +00:00
return 'Inscripciones cerradas'
else
2019-09-18 16:01:53 +00:00
return 'N/A';
2019-07-26 17:06:19 +00:00
}
2019-07-21 18:48:19 +00:00
}
}
};
};
2022-02-17 12:12:13 +00:00
const getAssistanceType = (event) => {
if (event.virtual) {
if (event.assistants > 0) {
return 'onsite, online';
} else {
return 'online';
}
} else {
return 'onsite';
}
};
const getAssistanceTypeText = (event) => {
if (event.virtual) {
if (event.assistants > 0) {
return 'evento presencial y online';
} else {
return 'evento online';
}
} else {
return 'evento presencial';
}
};
2019-07-21 18:48:19 +00:00
module.exports = function (sequelize, DataTypes) {
2019-07-21 18:48:19 +00:00
const Event = sequelize.define('Event', {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
name: {
type: DataTypes.STRING,
allowNull: false,
},
description: {
type: DataTypes.STRING,
},
2019-06-26 10:24:58 +00:00
campaign_text: {
type: DataTypes.TEXT,
allowNull: true
},
2019-07-17 14:47:27 +00:00
init_date: {
type: DataTypes.DATE,
allowNull: false,
2019-07-17 14:47:27 +00:00
},
end_date: {
type: DataTypes.DATE,
},
2019-07-10 08:42:03 +00:00
init_available_date: {
type: DataTypes.DATE,
},
2019-07-10 08:42:03 +00:00
end_available_date: {
type: DataTypes.DATE,
},
gmt: {
type: DataTypes.INTEGER,
defaultValue: 1,
},
assistants: {
type: DataTypes.INTEGER,
},
confirmed: {
type: DataTypes.INTEGER,
},
2019-07-25 16:39:18 +00:00
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,
},
allow_overflow: {
type: DataTypes.BOOLEAN,
allowNull: false,
defaultValue: false,
},
overflow_eventId: {
type: DataTypes.UUID,
foreignKey: true,
2019-07-16 16:27:54 +00:00
require: false,
},
state: {
type: DataTypes.STRING,
allowNull: false,
2019-07-17 12:07:35 +00:00
defaultValue: 'draft'
},
2019-07-26 17:06:19 +00:00
stateCode: {
type: Sequelize.VIRTUAL(Sequelize.STRING, ['init_date', 'end_date', 'init_available_date', 'end_available_date', 'sold_out']),
get: function () {
return getStateCode(this);
},
},
2019-07-21 18:48:19 +00:00
stateText: {
2019-07-25 16:39:18 +00:00
type: Sequelize.VIRTUAL(Sequelize.STRING, ['init_date', 'end_date', 'init_available_date', 'end_available_date', 'sold_out']),
2019-07-21 18:48:19 +00:00
get: function () {
return getStateText(this);
},
},
typeId: {
type: DataTypes.UUID,
foreignKey: true,
},
venueId: {
type: DataTypes.UUID,
foreignKey: true,
},
2019-08-28 09:07:38 +00:00
locationId:{
type: DataTypes.UUID,
2019-08-27 14:46:20 +00:00
foreignKey: true,
2019-08-28 09:07:38 +00:00
},
url_streaming: {
type: DataTypes.STRING,
},
url_poll: {
type: DataTypes.STRING,
},
url_registration: {
type: DataTypes.STRING,
},
2019-07-17 12:07:35 +00:00
marketing_list: {
2019-07-05 07:06:29 +00:00
type: DataTypes.STRING,
},
2019-07-11 18:05:06 +00:00
userId: {
type: DataTypes.UUID,
foreignKey: true,
},
2019-11-21 16:08:08 +00:00
featured: {
type: DataTypes.BOOLEAN,
defaultValue: false,
},
virtual: {
type: DataTypes.BOOLEAN,
defaultValue: false,
},
allow_questions: {
type: DataTypes.BOOLEAN,
defaultValue: true,
2022-02-17 12:12:13 +00:00
},
assistanceType: {
type: Sequelize.VIRTUAL(Sequelize.STRING, ['virtual', 'assistants']),
get: function () {
return getAssistanceType(this);
},
},
assistanceTypeText: {
type: Sequelize.VIRTUAL(Sequelize.STRING, ['virtual', 'assistants']),
get: function () {
return getAssistanceTypeText(this);
},
2019-11-21 16:08:08 +00:00
}
}, {
tableName: 'events',
freezeTableName: true,
timestamps: true,
2019-07-16 16:27:54 +00:00
defaultScope: {
2019-07-17 12:07:35 +00:00
where: {
2019-07-26 15:54:05 +00:00
state: 'publish',
typeId: { [Sequelize.Op.ne]: 2 },
2019-07-18 18:26:57 +00:00
},
include: [{
model: sequelize.models.EventType,
as: 'type',
attributes: ['name', 'title'],
2019-09-18 16:01:18 +00:00
},
2019-08-31 09:36:31 +00:00
{
association: 'location',
attributes: ['country', 'city'],
require:false,
2019-08-28 09:07:38 +00:00
}],
2019-07-16 16:27:54 +00:00
},
});
2019-07-17 12:07:35 +00:00
Event.associate = function (models) {
2019-08-20 15:37:53 +00:00
Event.OverflowEvent = Event.belongsTo(models.Event, {
as: 'overflowEvent',
foreignKey: 'overflow_eventId',
required: false });
2019-08-27 11:08:04 +00:00
Event.Type = Event.belongsTo(models.EventType, { foreignKey: 'typeId', as: "type" });
2019-07-14 16:44:59 +00:00
Event.UserCreate = Event.belongsTo(models.User, { foreignKey: 'userId', as: "user" });
2019-08-28 09:07:38 +00:00
Event.Venue = Event.belongsTo(models.Venue, { foreignKey: 'venueId', as: "venue", required: false});
2019-07-17 14:47:27 +00:00
Event.Details = Event.hasMany(models.EventDetail, { foreignKey: 'eventId', as: "details" });
2019-08-28 09:07:38 +00:00
Event.Location = Event.belongsTo(models.Location, { foreignKey: 'locationId', as: "location" });
2019-07-09 17:39:52 +00:00
2019-07-26 14:50:53 +00:00
//OJO antes de force comentar
2019-07-17 14:47:27 +00:00
// OJO GENERA UN FOREIGN KEY Con eventos y habrá ID de otras entidades que no exitan en la tabla eventos, porque son post o speakers
2019-07-26 14:50:53 +00:00
Event.Comments = Event.hasMany(models.Comment, {
foreignKey: 'entityId',
scope: {
entityName: 'event'
},
2019-08-14 20:50:04 +00:00
as: "comments",
required: false,
2019-07-26 14:50:53 +00:00
});
2019-08-28 09:07:38 +00:00
2019-07-18 16:13:27 +00:00
Event.Multimedias = Event.hasMany(models.Multimedia, {
foreignKey: 'entityId',
2019-08-14 20:50:04 +00:00
as: { singular: 'multimedia', plural: 'multimedias' },
required: false,
2019-07-18 16:13:27 +00:00
});
2019-08-14 20:50:04 +00:00
Event.Reservations = Event.hasMany(models.EventReservation, {
foreignKey: 'eventId', as: "reservations",
required: false,
});
Event.Inscriptions = Event.hasMany(models.EventInscription, {
foreignKey: 'eventId', as: "inscriptions",
required: false,
});
Event.Questions = Event.hasMany(models.EventQuestion, {
foreignKey: 'eventId', as: "questions" ,
required: false,
});
};
2019-07-17 12:07:35 +00:00
2019-11-21 16:08:08 +00:00
Event.addScope('featured', {
where: {
featured: true
},
});
2019-07-17 12:07:35 +00:00
Event.addScope('includeVenue', () => {
return {
include: [
{ model: sequelize.models.Venue, as: 'venue' }
]
}
});
2019-07-18 16:13:27 +00:00
Event.addScope('includeMultimedias', () => {
return {
include: [{
model: sequelize.models.Multimedia,
2019-07-25 17:21:26 +00:00
as: { singular: 'multimedia', plural: 'multimedias' },
2019-07-18 16:13:27 +00:00
required: false,
include : [{
model: sequelize.models.MultimediaFile,
2019-07-25 17:21:26 +00:00
as: "multimediaFile"
2019-07-18 16:13:27 +00:00
}]
},
]
2019-11-18 17:36:10 +00:00
}
});
Event.addScope('includeMultimediaAvatar', () => {
return {
include: [{
model: sequelize.models.Multimedia,
as: { singular: 'multimedia', plural: 'multimedias' },
where: { type: 'avatar'},
required: false,
include: [{
model: sequelize.models.MultimediaFile,
as: "multimediaFile"
}]
},
]
2019-07-18 16:13:27 +00:00
}
});
2019-07-21 17:36:25 +00:00
Event.addScope('includeInscription', (userId) => {
return {
include: [
2019-09-11 13:23:13 +00:00
{ model: sequelize.models.EventInscription, as: 'inscriptions',
required: false,
where: { userId: userId } }
2019-07-21 17:36:25 +00:00
]
}
});
2019-08-20 15:37:53 +00:00
Event.addScope('includeOverflowEvent', () => {
return {
include: [
2019-09-11 13:23:13 +00:00
{ model: sequelize.models.Event,
as: 'overflowEvent',
required: false,
2019-09-11 13:46:46 +00:00
where: { typeId: { [Sequelize.Op.ne]: null}},
2019-09-11 13:47:13 +00:00
// attributes: ['assistants', 'confirmed'],
2019-09-11 13:23:13 +00:00
}
2019-08-20 15:37:53 +00:00
]
}
});
2019-07-21 17:36:25 +00:00
2019-08-14 17:49:38 +00:00
Event.addScope('includeDetails', () => {
2019-07-17 12:07:35 +00:00
return {
include: [{
2019-07-17 14:47:27 +00:00
model: sequelize.models.EventDetail,
2019-07-17 15:13:55 +00:00
as: 'details',
2019-07-18 11:23:43 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include: [{
model: sequelize.models.Speaker,
as: 'speaker',
2019-07-18 16:13:27 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include : [{
model: sequelize.models.Multimedia,
2019-07-25 17:21:26 +00:00
as: { singular: 'multimedia', plural: 'multimedias' },
2019-07-18 16:13:27 +00:00
required: false,
2019-07-17 15:34:54 +00:00
include: [{
model: sequelize.models.MultimediaFile,
2019-07-25 17:21:26 +00:00
as: "multimediaFile"
2019-07-17 15:34:54 +00:00
}]
2019-07-26 14:50:53 +00:00
}]
2019-07-17 15:34:54 +00:00
}]
2019-07-17 12:07:35 +00:00
}]
}
2019-07-21 17:36:25 +00:00
});
2019-07-17 12:07:35 +00:00
Event.addScope('includeComments', () => {
return {
include: [{
model: sequelize.models.Comment,
as: 'comments',
required: false,
include: [{
model: sequelize.models.User,
as: 'user',
}]
}]
}
});
2019-07-17 12:07:35 +00:00
Event.addScope('next', {
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.gte]: moment().add(1, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss')
2019-07-17 12:07:35 +00:00
}
},
});
2019-07-23 11:35:20 +00:00
Event.addScope('today', {
2019-07-17 12:07:35 +00:00
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.gte]: moment().startOf('day').format('YYYY-MM-DD HH:mm:ss'),
[Sequelize.Op.lt]: moment().add(1, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
2019-07-17 12:07:35 +00:00
}
}
});
2019-07-23 11:35:20 +00:00
Event.addScope('current', {
where: {
init_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.lte]: moment().format('YYYY-MM-DD HH:mm:ss'),
2019-07-23 11:35:20 +00:00
},
end_date:{
2019-09-27 10:22:09 +00:00
[Sequelize.Op.gt]: moment().format('YYYY-MM-DD HH:mm:ss'),
2019-07-23 11:35:20 +00:00
},
}
});
2019-09-27 10:22:09 +00:00
Event.addScope('tomorrow', {
where: {
init_date: {
[Sequelize.Op.gte]: moment().add(1, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
[Sequelize.Op.lt]: moment().add(2, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
}
}
});
Event.addScope('yesterday', {
where: {
init_date: {
[Sequelize.Op.gte]: moment().add(-1, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
[Sequelize.Op.lt]: moment().add('day').startOf('day').format('YYYY-MM-DD HH:mm:ss'),
}
}
});
2019-07-17 12:07:35 +00:00
Event.addScope('past', {
where: {
2019-07-17 15:13:55 +00:00
init_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.lt]: moment().startOf('day').format('YYYY-MM-DD HH:mm:ss')
2019-07-17 12:07:35 +00:00
}
}
});
2019-07-23 11:35:20 +00:00
Event.addScope('withOpenInscriptions', {
where: {
init_available_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.lte]: moment().format('YYYY-MM-DD HH:mm:ss')
2019-07-23 11:35:20 +00:00
},
end_available_date: {
2019-09-27 10:22:09 +00:00
[Sequelize.Op.gt]: moment().format('YYYY-MM-DD HH:mm:ss')
2019-07-23 11:35:20 +00:00
}
},
});
2019-08-28 09:07:38 +00:00
Event.addScope('CitiesOfEvents', () => {
return {
include: [{
model: sequelize.models.Location, as: 'location', required: false,
include: [{
2019-08-28 10:43:41 +00:00
model: sequelize.models.Multimedia, as: { singular: 'multimedia', plural: 'multimedias' }, required: false, attributes: ['type'],
2019-08-28 09:07:38 +00:00
include: [{ model: sequelize.models.MultimediaFile, as: "multimediaFile", attributes: ['name', 'description', 'class', 'provider', 'url'] },]
}]
},
{ model: sequelize.models.EventType, as: 'type', attributes: ['name', 'title'] }],
group: ['location.country', 'location.city', 'Event.typeId',],
attributes: ['location.country', 'location.city', 'type.name', 'type.title', [sequelize.fn('COUNT', sequelize.col('Event.typeId')), 'ediciones'], [sequelize.fn('SUM', sequelize.col('Event.assistants')), 'assistants']]
}
2019-07-29 15:10:23 +00:00
});
2019-08-28 12:00:59 +00:00
Event.addScope('onlyOfLocation', (location) => {
2019-07-29 16:27:38 +00:00
return {
2019-08-28 12:00:59 +00:00
where: { locationId: { [Sequelize.Op.eq]: location } },
2019-07-29 16:27:38 +00:00
}
});
2019-07-29 15:10:23 +00:00
return Event;
};