From 31432422109381348dc52af9507e9619197d39f7 Mon Sep 17 00:00:00 2001 From: David Arranz Date: Wed, 8 Mar 2023 18:49:18 +0100 Subject: [PATCH] Repaso para control de aforo al modificar reservas --- modules/events/event.service.js | 32 ++++++ .../events/events_reservations.controller.js | 103 +++--------------- modules/events/events_reservations.service.js | 9 ++ 3 files changed, 54 insertions(+), 90 deletions(-) diff --git a/modules/events/event.service.js b/modules/events/event.service.js index 02ea50f..5abae40 100644 --- a/modules/events/event.service.js +++ b/modules/events/event.service.js @@ -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); diff --git a/modules/events/events_reservations.controller.js b/modules/events/events_reservations.controller.js index ea48677..d47983a 100644 --- a/modules/events/events_reservations.controller.js +++ b/modules/events/events_reservations.controller.js @@ -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(); diff --git a/modules/events/events_reservations.service.js b/modules/events/events_reservations.service.js index 6466f21..74dac16 100644 --- a/modules/events/events_reservations.service.js +++ b/modules/events/events_reservations.service.js @@ -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 },