Repaso para control de aforo al modificar reservas

This commit is contained in:
David Arranz 2023-03-08 18:49:18 +01:00
parent 3ee5562f8f
commit 3143242210
3 changed files with 54 additions and 90 deletions

View File

@ -102,6 +102,38 @@ const extraMethods = {
});
});
},
_updateAforoOfEventReservation: async (reservation, cantidad) => {
//Cogemos el evento del que tenemos que aumentar o disminuir aforo, en funcion de la cantidad si es negativa o positiva
const eventToUpdateAssistants = reservation.overflow_reservationId
? await extraMethods._getEvent(reservation.overflow_reservationId)
: await extraMethods._getEvent(reservation.eventId);
console.log('_updateAforoOfEventReservation Evento >>>>>>>>>>>>>>>', eventToUpdateAssistants.name);
console.log('_updateAforoOfEventReservation Asistentes >>>>>>>>>>>>>>>', eventToUpdateAssistants.assistants);
console.log('_updateAforoOfEventReservation Aumento en >>>>>>>>>>>>>>>', cantidad);
const plazasDisponibles = eventToUpdateAssistants.assistants - eventToUpdateAssistants.confirmed;
console.log('_updateAforoOfEventReservation Plazas disponibles >>>>>>>>>>>>>>>', plazasDisponibles);
if (plazasDisponibles < cantidad) {
console.log ('_updateAforoOfEventReservation >>>> Aforo lleno no es posible efectuar la invitacion');
throw new Error ('Aforo lleno no es posible efectuar la invitacion');
};
//Modificamos los asistentes de evento (AFORO)
const newAforo = eventToUpdateAssistants.assistants - cantidad;
if (!(await extraMethods._updateAssistantsEvent(eventToUpdateAssistants.id, newAforo))) {
console.log("_updateAforoOfEventReservation >>>> No se ha podido actualizar el aforo del evento");
throw new Error ('No se ha podido actualizar el aforo del evento');
};
//Si se ha llenado ponemos el evento en SOLD_OUT
if (eventToUpdateAssistants.confirmed >= newAforo)
await extraMethods._updateSoldOutEvent(eventToUpdateAssistants.id, true);
reservation.event = eventToUpdateAssistants;
},
};
module.exports = generateService(models.Event, extraMethods);

View File

@ -24,87 +24,18 @@ const MODULE_NAME = "[eventReservation.controller]";
const controllerOptions = { MODULE_NAME };
/*BORRAR TRAS COMPROBAR TODO
async function _addConfirmedToEvent(confirmed, event) {
const newConfirmed = event.confirmed + confirmed;
if (event.assistants < newConfirmed) {
console.log("El aforo solicitado es superior a las plazas disponibles");
return false;
}
if (!(await eventService._updateConfirmedEvent(event.id, newConfirmed))) {
console.log("No se ha podido actualizar el aforo del evento");
return false;
}
//Si se ha llenado ponemos el evento en SOLD_OUT
if (event.assistants == newConfirmed) await eventService._updateSoldOutEvent(event.id, true);
return true;
}
*/
async function updateAsisstantsOfEventReservation(reservation, cantidad) {
try {
//Cogemos el evento del que tenemos que aumentar o disminuir aforo, en funcion de la cantidad si es negativa o positiva
const eventToUpdateAssistants = reservation.overflow_reservationId
? await eventService._getEvent(reservation.overflow_reservationId)
: (reservation.Event ? reservation.Event : reservation.event);
console.log('actualizarAforoOf Evento >>>>>>>>>>>>>>>', eventToUpdateAssistants.name);
console.log('actualizarAforoOf Asistentes >>>>>>>>>>>>>>>', eventToUpdateAssistants.assistants);
console.log('actualizarAforoOf Aumento en >>>>>>>>>>>>>>>', cantidad);
//Modificamos los asistentes de evento (AFORO)
const newAforo = eventToUpdateAssistants.assistants + cantidad;
if (!(await eventService._updateAssistantsEvent(eventToUpdateAssistants.id, newAforo))) {
console.log("actualizarAforoOf >>>> No se ha podido actualizar el aforo del evento, antes de eliminar la reserva");
return false;
}
console.log('actualizarAforoOf Número de asistentes actualizado >>>>>>>>>>>>>>>', newAforo);
return true;
} catch (error) {
console.log('actualizarAforoOf Error >>>>>>>>>>>>>>>', error);
return false
}
}
/**** Activa una reserva que está en borrador (Draft), descontando asistentes del aforo total del evento
* Devuelve la reserva pasada por parametro publicada (publish) o null en el caso de error
*/
async function activeReservation(reservation) {
if (!reservation)
throw new Error("activeReservation: reservation should be an object");
const eventToDiscountAssistants = reservation.overflow_reservationId
? await eventService._getEvent(reservation.overflow_reservationId)
: (reservation.Event ? reservation.Event : reservation.event);
console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>0', reservation.overflowEventId);
console.log('>>>>>>>>>>>>>>>>>>>>>>>>>>1', reservation.Event);
console.log(' >>>>>>>>>>>>>>>>>>>>>>>>>>2', reservation.event);
//En el caso de ya estar publicada no hacemos nada se devuelve tal cual
//En el caso de ya estar publicada no hacemos nada se devuelve tal cual
if (reservation.state === 'publish')
return reservation;
const plazasDisponibles = eventToDiscountAssistants.assistants - eventToDiscountAssistants.confirmed;
if (plazasDisponibles < reservation.assistants) {
console.log("Aforo lleno no es posible efectuar la reserva");
return null;
}
const newAforo = eventToDiscountAssistants.assistants - reservation.assistants;
//Modificamos los asistentes de evento (AFORO) para quitar los de la reserva
if (!(await eventService._updateAssistantsEvent(eventToDiscountAssistants.id, newAforo))) {
console.log("No se ha podido actualizar el aforo del evento, para reservar las plazas solicitadas");
return null;
}
//Si se ha llenado ponemos el evento en SOLD_OUT
if (eventToDiscountAssistants.confirmed >= newAforo)
await eventService._updateSoldOutEvent(eventToDiscountAssistants.id, true);
eventService._updateAforoOfEventReservation(reservation, reservation.assistants);
//REvisar confirmados en lista de espera
//Finalmente publicamos la reserva solo si no está asociada a la lista de espera
@ -126,7 +57,6 @@ async function activeReservation(reservation) {
const user = await userService._getUserById(reservation.userId);
reservation.contact_email = user.email;
reservation.contact_name = user.name;
reservation.event = eventToDiscountAssistants;
console.log('reservation.userId>>>>>> ', user.email);
console.log('reservation.userId>>>>>> ', user.email);
@ -457,20 +387,17 @@ const extraControllers = {
if (!idResevation)
return handleResultResponse("Error id de reservation necesario", null, params, res, httpStatus.NOT_FOUND);
const eventReservation = await eventReservationService._getReservaByIdWithEntityAndEvent(idResevation);
const eventReservation = await eventReservationService._getReservaById(idResevation);
if (!eventReservation)
return handleResultResponse("Error reserva no existente", null, params, res, httpStatus.NOT_FOUND);
try {
//Antes de borrar una reserva debemos borrar todas las inscripciones asociadas.
eventInscriptionService._deleteInscriptionsByReservation(eventReservation.id);
if (eventReservation.state === 'publish'){
if (!updateAsisstantsOfEventReservation(eventReservation, eventReservation.assistants)) {
return handleResultResponse("Error actualizando aforo del evento en deleteReservationById", null, params, res, httpStatus.NOT_FOUND);
}
const cantidad = -1 * eventReservation.assistants;
eventService._updateAforoOfEventReservation(eventReservation, cantidad);
}
let result = eventReservationService._deleteReservation(eventReservation.id);
return handleResultResponse(result, null, params, res, httpStatus.OK);
@ -490,23 +417,19 @@ const extraControllers = {
if (!idResevation)
return handleResultResponse("Error id de reservation necesario", null, params, res, httpStatus.NOT_FOUND);
const eventReservation = await eventReservationService._getReservaByIdWithEntityAndEvent(idResevation);
const eventReservation = await eventReservationService._getReservaById(idResevation); //
if (!eventReservation)
return handleResultResponse("Error reserva no existente", null, params, res, httpStatus.NOT_FOUND);
try {
if (eventReservation.state === 'publish' && eventReservation.assistants != NewReservarionAssistants)
if (NewReservarionAssistants < eventReservation.confirmed)
if (eventReservation.state === 'publish' && eventReservation.assistants != NewReservarionAssistants) {
if (NewReservarionAssistants < eventReservation.confirmed) {
return handleResultResponse("Error el número de asistentes no puede ser menor que el de confirmados", null, params, res, httpStatus.NOT_FOUND);
else {
const value = -1 * (NewReservarionAssistants - eventReservation.assistants);
if (!updateAsisstantsOfEventReservation(eventReservation, value)){
return handleResultResponse("Error el número de asistentes no puede ser menor que el de confirmados", null, params, res, httpStatus.NOT_FOUND);
}
console.log('checkAssitantsUpdate>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> CAMBIO DE ASISTENTES DEL EVENTO Y HAGO CAMBIO');
}
else
console.log('checkAssitantsUpdate>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> SE QUEDA TAL CUAL');
};
const cantidad = (NewReservarionAssistants - eventReservation.assistants);
eventService._updateAforoOfEventReservation(eventReservation, cantidad);
}
next();

View File

@ -9,6 +9,7 @@ const models = require("../../core/models");
const xlsx = require("node-xlsx");
const fs = require("fs");
const cdnHelper = require("../../helpers/cdn.helper");
const eventService = require("./event.service");
function getWhereTypeEntity(entityType) {
var whereType = {};
@ -18,6 +19,14 @@ function getWhereTypeEntity(entityType) {
}
const extraMethods = {
beforeCreate(values, context){
//En el caso de ser una reserva publicada debe descontar del aforo del evento asociado
if (values.state === 'publish') {
eventService._updateAforoOfEventReservation(values, values.assistants);
};
return values;
},
_getReservaById: (Id) => {
return models.EventReservation.findOne({
where: { id: Id },