Cambio para controlar aforo y no se descuadre

This commit is contained in:
David Arranz 2023-02-28 17:41:33 +01:00
parent ea432ac720
commit 3ee5562f8f
3 changed files with 105 additions and 3 deletions

View File

@ -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

View File

@ -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(

View File

@ -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