function hotelSystem(rooms) {
let reservations = [];
function reformatDateMMDD(value){ //CONVERTIRMOS A FORMATO DE FECHA QUE JAVASCRIPT PUEDA LEER (MM/DD/YYYY) ********
value.split("");
let dd = value[0]+value[1];
let mm = value[3]+value[4];
value=mm+"/"+dd+"/2023";
return value;
}
function reformatDateDDMM(value){ //CONVERTIRMOS A FORMATO DE FECHA (DD/MM) ***************************************
value.split("");
let mm = value[0]+value[1];
let dd = value[3]+value[4];
value=dd+"/"+mm;
return value;
}
function addReservation(reservation) { // FUNCIÓN PARA AGREGAR RESERVACIÓN *****************************************
if (reservation.roomNumber > rooms || reservation.roomNumber <= 0) { //VERIFICAMOS QUE EL ROOM SOLICITADO EXISTA
throw Error("El numero de cuarto no existe");
}
if (reservations.some(element => { return element.id === reservation.id})){ //VERIFICAR EL ID
throw Error("El id esta repetido");
}
if (reservations.length === 0){ //SI EL ARRAY DE RESERVACIONES ESTA VACIO SE REGISTRA SIN CONSULTAS
reservations.push(reservation);
}else{ //SI EL ARRAY TIENE RESERVACIONES VERIFICAMOS QUE LA FECHA NO CHOQUE
let checkIn = reformatDateMMDD(reservation.checkIn);
let checkOut = reformatDateMMDD(reservation.checkOut);
let roomAvailable = reservations.some(element => {
return element.roomNumber === reservation.roomNumber //VERIFICAMOS SI EL CUARTO SOLICITADO ESTA RESERVADO (EN OTRA FECHA)
});
if (roomAvailable){ //SI EL CUARTO ESTA RESERVADO VERIFICAMOS QUE LA FECHA NO CHOQUE CON LA NUEVA RESERVACION
if (available = reservations.some(element => {
let checkInReservated = reformatDateMMDD(element.checkIn);
let checkOutReservated = reformatDateMMDD(element.checkOut);
return (checkOutReservated < checkIn || checkInReservated > checkOut); //VERIFICAMOS SI CHOCA LA FECHA SOLICITADA CON OTRA
})){
reservations.push(reservation); //SI LA FECHA SOLICITADA NO CHOCA SE REGISTRA LA RESERVACION
}else{
throw new Error("La habitación no está disponible"); //SI LA HABITACION CHOCA CON OTRA RESERVACION SE LANZA UN ERROR
}
}else{
reservations.push(reservation) //SI EL CUARTO AUN NO HA SIDO RESERVADO LO REGISTRA
}
}
}
function searchReservation(id){ // FUNCIÓN PARA BUSCAR RESERVACIÓN ***************************************************
let status = reservations.findIndex(element => {
return element.id === id;
});
if (status >= 0){ return reservations[status]} else {throw Error("La reservación no fue encontrada")}
}
function getSortReservations(){ // FUNCIÓN PARA ORDERNAR RESERVACIONES DE MANERA ASC *********************************
let orderReservations = reservations.map(element => element);
orderReservations.forEach(element => element.checkIn = reformatDateMMDD(element.checkIn));
orderReservations.sort((a,b) => new Date(a.checkIn) - new Date(b.checkIn));
orderReservations.forEach(element => element.checkIn = reformatDateDDMM(element.checkIn));
return console.log(orderReservations);
}
function removeReservation(id){ // FUNCIÓN PARA ELIMINAR UNA RESERVACION *********************************************
let status = reservations.findIndex(element => {
return element.id === id;
});
let deleted = reservations[status];
if (status >= 0){reservations.splice(status)} else {throw Error("La reservación que se busca remover no existe")}
return deleted;
}
function getReservations(){ // FUNCIÓN PARA VER LAS RESERVACIONES ****************************************************
return reservations;
}
function getAvailableRooms(checkIn, checkOut){ // FUNCIÓN PARA VER LAS HABITACIONES DISPONIBLES EN UN RANGO DE FECHAS *
checkIn = reformatDateMMDD(checkIn);
checkOut = reformatDateMMDD(checkOut);
let availablesRooms=[];
for (let i = 0; i<rooms; i++){
availablesRooms[i]=i+1;
}
reservations.forEach(element => {
let checkInReservated = reformatDateMMDD(element.checkIn);
let checkOutReservated = reformatDateMMDD(element.checkOut);
if (!(checkOutReservated < checkIn || checkInReservated > checkOut)){
let status = availablesRooms.findIndex(room => {
return room === element.roomNumber;
});
console.log("Eliminar index: "+status);
if (status>=0){
availablesRooms.splice(status,1);
}
}
});
return availablesRooms;
}
return {addReservation, searchReservation, getSortReservations, removeReservation, getReservations, getAvailableRooms};
}