Beispiel #1
0
    def test_one(self):
        """
        All start values valid, only one end value valid, 1/3 rooms returns
        """
        r1 = pd.DataFrame({
            "start": [datetime.datetime(2020, 7, 7)],
            "end": [datetime.datetime(2020, 7, 31)],
        })
        r2 = pd.DataFrame({
            "start": [datetime.datetime(2020, 6, 9)],
            "end": [datetime.datetime(2020, 6, 30)],
        })
        r3 = pd.DataFrame({
            "start": [datetime.datetime(2020, 8, 5)],
            "end": [datetime.datetime(2020, 8, 31)],
        })

        r1 = (r1.set_index(r1["start"]).rename(columns={
            "end": "1"
        }).drop("start", axis=1))
        r2 = (r2.set_index(r2["start"]).rename(columns={
            "end": "2"
        }).drop("start", axis=1))
        r3 = (r3.set_index(r3["start"]).rename(columns={
            "end": "3"
        }).drop("start", axis=1))

        data = pd.concat([r1, r2, r3], axis=1, sort=False)
        start = datetime.datetime(2020, 8, 22)
        end = datetime.datetime(2020, 8, 28)
        result = get_room_number_optimized(data, start, end)
        answer = pd.DataFrame({"room": ["3"], "order": [3]})

        assert_frame_equal(result.reset_index(drop=True),
                           answer.reset_index(drop=True))
Beispiel #2
0
    def test_one_value(self):
        """
        One unique value each, 2/3 rooms returns
        """
        r1 = pd.DataFrame({
            "start": [datetime.datetime(2020, 8, 7)],
            "end": [datetime.datetime(2022, 12, 31)],
        })
        r2 = pd.DataFrame({
            "start": [datetime.datetime(2020, 10, 9)],
            "end": [datetime.datetime(2022, 12, 31)],
        })
        r3 = pd.DataFrame({
            "start": [datetime.datetime(2020, 6, 5)],
            "end": [datetime.datetime(2022, 12, 31)],
        })

        r1 = (r1.set_index(r1["start"]).rename(columns={
            "end": "1"
        }).drop("start", axis=1))
        r2 = (r2.set_index(r2["start"]).rename(columns={
            "end": "2"
        }).drop("start", axis=1))
        r3 = (r3.set_index(r3["start"]).rename(columns={
            "end": "3"
        }).drop("start", axis=1))

        data = pd.concat([r1, r2, r3], axis=1, sort=False)
        start = datetime.datetime(2020, 8, 22)
        end = datetime.datetime(2020, 8, 28)
        result = get_room_number_optimized(data, start, end)
        answer = pd.DataFrame({"room": ["1", "3"], "order": [15, 78]})

        assert_frame_equal(result.reset_index(drop=True),
                           answer.reset_index(drop=True))
Beispiel #3
0
    def test_all_same_value(self):
        """
        Allow multiple same value
        """
        r1 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })
        r2 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })
        r3 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })

        r1 = (r1.set_index(r1["start"]).rename(columns={
            "end": "1"
        }).drop("start", axis=1))
        r2 = (r2.set_index(r2["start"]).rename(columns={
            "end": "2"
        }).drop("start", axis=1))
        r3 = (r3.set_index(r3["start"]).rename(columns={
            "end": "3"
        }).drop("start", axis=1))

        data = pd.concat([r1, r2, r3], axis=1, sort=False)
        start = datetime.datetime(2020, 8, 22)
        end = datetime.datetime(2020, 8, 28)
        result = get_room_number_optimized(data, start, end)
        answer = pd.DataFrame({"room": ["1", "2", "3"], "order": [2, 2, 2]})

        assert_frame_equal(result.reset_index(drop=True),
                           answer.reset_index(drop=True))
Beispiel #4
0
    def test_no_rooms(self):
        """
        No rooms found!
        """
        r1 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })
        r2 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })
        r3 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 7),
                datetime.datetime(2020, 8, 20),
            ],
            "end": [
                datetime.datetime(2020, 8, 12),
                datetime.datetime(2022, 12, 31),
            ],
        })

        r1 = (r1.set_index(r1["start"]).rename(columns={
            "end": "1"
        }).drop("start", axis=1))
        r2 = (r2.set_index(r2["start"]).rename(columns={
            "end": "2"
        }).drop("start", axis=1))
        r3 = (r3.set_index(r3["start"]).rename(columns={
            "end": "3"
        }).drop("start", axis=1))

        data = pd.concat([r1, r2, r3], axis=1, sort=False)
        start = datetime.datetime(2020, 8, 10)
        end = datetime.datetime(2020, 8, 28)
        result = get_room_number_optimized(data, start, end)

        self.assertTrue(result.empty)
Beispiel #5
0
    def test_standard(self):
        """
        Values used during development
        """
        r1 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 8, 10),
                datetime.datetime(2020, 9, 22),
            ],
            "end":
            [datetime.datetime(2020, 9, 3),
             datetime.datetime(2022, 12, 31)],
        })
        r2 = pd.DataFrame({
            "start": [
                datetime.datetime(2020, 7, 12),
                datetime.datetime(2020, 8, 2),
                datetime.datetime(2020, 10, 3),
            ],
            "end": [
                datetime.datetime(2020, 7, 18),
                datetime.datetime(2020, 8, 30),
                datetime.datetime(2022, 12, 31),
            ],
        })
        r3 = pd.DataFrame({
            "start": [datetime.datetime(2020, 8, 15)],
            "end": [datetime.datetime(2022, 12, 31)],
        })

        r1 = (r1.set_index(r1["start"]).rename(columns={
            "end": "1"
        }).drop("start", axis=1))
        r2 = (r2.set_index(r2["start"]).rename(columns={
            "end": "2"
        }).drop("start", axis=1))
        r3 = (r3.set_index(r3["start"]).rename(columns={
            "end": "3"
        }).drop("start", axis=1))

        data = pd.concat([r1, r2, r3], axis=1, sort=False)

        start = datetime.datetime(2020, 8, 22)
        end = datetime.datetime(2020, 8, 28)
        result = get_room_number_optimized(data, start, end)
        answer = pd.DataFrame({"room": ["2", "1", "3"], "order": [2, 6, 7]})
        # Ignore index values
        # np.array_equal(result.values,answer.values)
        assert_frame_equal(result.reset_index(drop=True),
                           answer.reset_index(drop=True))
Beispiel #6
0
def reserve_dates(config, client_id, room_type, start, end):
    """
    Find ideal rooms based on criteria given.

    Usage:\n
    hotel reserve-dates client_id room_type start_date end_date\n

    Arguments:\n
    client_id is type INT\n
    room_type is type INT\n
    start_date is format %Y-%m-%d\n
    end_date is format %Y-%m-%d\n

    Description:\n
    This commmand returns a list of rooms that match the criteria given\n
    Rooms are ordered by the minimal disruption of free intervals\n
    Creates new reservation in rooms/reservations/{best_room}.csv\n
    Splits and adds new interverl in rooms/interval/{best_rom}.csv\n
    Updates client_list.csv with new informtion, reserved state = 2

    """
    helpers.handle_session()

    if client_id in config.client_list.index:

        if config.client_list.loc[client_id, "state"] == 3:

            hotel_path = helpers.get_hotel_path()
            full_path = os.path.join(config.cwd_path, hotel_path)

            room_matching_type = helpers.get_room_of_type(
                config.hotel, room_type)
            df_intervals = config.intervals[room_matching_type].dropna(
                axis=0, how="all")

            available_rooms = helpers.get_room_number_optimized(
                df_intervals, start, end)
            delta = end - start

            if available_rooms.empty:
                click.echo("Sorry! There are no rooms available!")
            else:
                best_room = available_rooms["room"][0]

                payment = helpers.get_payment(config.hotel, best_room)
                payment_due = delta.days * payment
                paid = False

                helpers.add_reservation_client_list(
                    config.client_list,
                    client_id,
                    2,
                    start,
                    end,
                    best_room,
                    payment_due,
                    paid,
                )
                helpers.overwrite_client_list(config.client_list, full_path)

                helpers.add_reservations(config.reservations, best_room,
                                         client_id, start)
                helpers.overwrite_reservations(config.reservations,
                                               config.cwd_path, hotel_path,
                                               best_room)

                helpers.add_intervals(config.intervals, best_room, start, end,
                                      hotel_path)
                helpers.overwrite_intervals(config.intervals, config.cwd_path,
                                            hotel_path, best_room)

                click.echo("Reservation successful!")
        else:
            click.echo(
                f"The client ID {client_id} is currently unable to accept a new reservation. Please verify the current client state"
            )
    else:
        click.echo(
            f"The client ID {client_id} does not exist. Please use a valid client ID"
        )