From 3ee5562f8f27357596dc6943c9edeea5011a57af Mon Sep 17 00:00:00 2001 From: David Arranz Date: Tue, 28 Feb 2023 17:41:33 +0100 Subject: [PATCH] Cambio para controlar aforo y no se descuadre --- modules/events/event.routes.js | 5 +- modules/events/events_inscriptions.service.js | 10 ++ .../events/events_reservations.controller.js | 93 ++++++++++++++++++- 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/modules/events/event.routes.js b/modules/events/event.routes.js index 33aef3d..c896501 100644 --- a/modules/events/event.routes.js +++ b/modules/events/event.routes.js @@ -535,7 +535,8 @@ routes.put( "/admin/reservations/:id", isAdministratorUser, //SchemaValidator(eventValidation.ReservationInputType, true), - eventReservationController.update() + eventReservationController.checkAssitantsUpdate, + eventReservationController.update() ); routes.put( @@ -554,7 +555,7 @@ routes.put( ); // Borrar reserva -routes.delete("/admin/reservations/:id", isAdministratorUser, eventReservationController.delete()); +routes.delete("/admin/reservations/:id", isAdministratorUser, eventReservationController.deleteReservationById); /******************************************************************************************************** * LIVE diff --git a/modules/events/events_inscriptions.service.js b/modules/events/events_inscriptions.service.js index 6f9b4ee..7c068ef 100644 --- a/modules/events/events_inscriptions.service.js +++ b/modules/events/events_inscriptions.service.js @@ -237,6 +237,16 @@ const extraMethods = { }); }, + //Elimina todas las inscripciones de una determinada reserva/invitacion + _deleteInscriptionsByReservation: (reservationId) => { + + return models.EventInscription.destroy({ + where: { + reservationId: reservationId, + }, + }); + }, + //Validamos la inscripcion la quitamos de las lista de espera y asignamos el usuario que la ha validado _validateInscription: (inscriptionId, userId) => { return models.EventInscription.update( diff --git a/modules/events/events_reservations.controller.js b/modules/events/events_reservations.controller.js index b4d7fdc..ea48677 100644 --- a/modules/events/events_reservations.controller.js +++ b/modules/events/events_reservations.controller.js @@ -17,7 +17,7 @@ const { } = require("../../helpers/controller.helper"); const emailHelper = require("../../helpers/mail.helper"); const path = require("path"); -const responseTime = require("response-time"); +const responseTime = require("response-time"); // Module Name const MODULE_NAME = "[eventReservation.controller]"; @@ -44,6 +44,33 @@ async function _addConfirmedToEvent(confirmed, event) { } */ +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 */ @@ -424,6 +451,70 @@ const extraControllers = { } }, + deleteReservationById: 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); + + const eventReservation = await eventReservationService._getReservaByIdWithEntityAndEvent(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); + } + } + + + let result = eventReservationService._deleteReservation(eventReservation.id); + return handleResultResponse(result, null, params, res, httpStatus.OK); + + } catch (error) { + return handleResultResponse("Error al eliminar la reserva", null, params, res, httpStatus.NOT_FOUND); + } + }, + +/**** Modifica una reserva, si está publicada, actualiza la diferenecia de los asistentes, en el caso de ser modificado, en el aforo del evento (assitants). + */ + checkAssitantsUpdate: async (req, res, next) => { + const params = extractParamsFromRequest(req, res, {}); + const idResevation = params.params.id; + const NewReservarionAssistants = req.body.assistants; + + if (!idResevation) + return handleResultResponse("Error id de reservation necesario", null, params, res, httpStatus.NOT_FOUND); + + const eventReservation = await eventReservationService._getReservaByIdWithEntityAndEvent(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) + 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'); + + next(); + + } catch (error) { + return handleResultResponse("Error al checkAssitantsUpdate de la reserva", 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