SISTEMA RESERVACIONES DE HOTEL

 avatar
unknown
javascript
2 years ago
5.2 kB
4
Indexable
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};
}