def test_success(service: CreateReservation, context: Context, house,
                 room_type, rate_plan, rate, cancellation_policy):
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
        is_verified=True,
    )
    service._houses_repo = Mock(get=Mock(return_value=Some(house)))
    service._roomtypes_repo = Mock(get=Mock(return_value=Some(room_type)))
    service._prices_repo = Mock(get_plan=Mock(return_value=Some(rate_plan)),
                                select_rates=Mock(return_value=[rate]))
    service._reservations_repo = Mock(
        save=Mock(
            return_value=(Some(attr.evolve(reservation, is_verified=False)),
                          True)),
        accept=Mock(return_value=Some(reservation)),
    )
    service._policies_repo = Mock(get=Mock(
        return_value=Some(cancellation_policy)))

    result = service.execute(house.id, context.request, context.user)
    assert is_successful(result), result.failure()
    assert result.unwrap() == attr.evolve(reservation, is_verified=True)
def test_success(service: CreateRoomClose, context: Context, house, room):
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=context.start_date,
        checkout=context.end_date,
        booked_at=timezone.now(),
        status=ReservationStatuses.CLOSE,
        is_verified=True,
    )
    service._houses_repo = Mock(get=Mock(return_value=Some(house)))
    service._rooms_repo = Mock(get=Mock(return_value=Some(room)))
    service._reservations_repo = Mock(
        save=Mock(
            return_value=(Some(attr.evolve(reservation, is_verified=False)),
                          True)),
        accept=Mock(return_value=Some(reservation)),
        is_room_busy=Mock(return_value=False),
    )

    result = service.execute(house.id, room.id, context.start_date,
                             context.end_date, RoomCloseReasons.MAINTENANCE,
                             context.user)
    assert is_successful(result), result.failure()
    assert result.unwrap() == attr.evolve(reservation, is_verified=True)
Ejemplo n.º 3
0
def reservation(house, room_type, rate_plan):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(id=111,
                       house_id=house.id,
                       connection_id=None,
                       source=ReservationSources.MANUAL,
                       channel=None,
                       channel_id='',
                       checkin=checkin,
                       checkout=checkout,
                       booked_at=timezone.now(),
                       status=ReservationStatuses.MODIFY,
                       price=Decimal(1120),
                       netto_price=Decimal(1120),
                       guest_name='John',
                       guest_surname='Smith',
                       rooms=[
                           ReservationRoom(id=211,
                                           reservation_id=111,
                                           channel_id='',
                                           channel_rate_id='',
                                           checkin=checkin,
                                           checkout=checkout,
                                           rate_plan_id=rate_plan.id,
                                           adults=2,
                                           children=1,
                                           price=Decimal(1120),
                                           netto_price=Decimal(1120))
                       ])
Ejemplo n.º 4
0
    def model_to_reservation(self,
                             model: ReservationModel,
                             with_deleted_rooms: bool = False) -> Reservation:
        if model.guest_contact_ids is not None and model.guest_contact_ids != '':
            contact_ids = [
                cf.get_int_or_none(x)
                for x in model.guest_contact_ids.split(',')
            ]
            contact_ids = [x for x in contact_ids if x is not None and x > 0]
        else:
            contact_ids = []
        reservation = Reservation(
            id=model.pk,
            house_id=model.house_id,  # noqa
            connection_id=model.connection.id
            if model.connection is not None else None,
            source=ReservationSources.get_by_name(model.source),
            channel=Channels.get_by_name(model.channel),
            channel_id=model.channel_id,
            status=ReservationStatuses.get_by_name(model.status),
            close_reason=RoomCloseReasons.get_by_name(model.close_reason),
            checkin=model.checkin,
            checkout=model.checkout,
            room_count=model.room_count,
            currency=model.currency,
            price=model.price,
            price_accepted=model.price_accepted,
            tax=model.tax,
            fees=model.fees,
            netto_price=model.netto_price,
            netto_price_accepted=model.netto_price_accepted,
            guest_name=model.guest_name,
            guest_surname=model.guest_surname,
            guest_email=model.guest_email,
            guest_phone=model.guest_phone,
            guest_country=model.guest_country,
            guest_nationality=model.guest_nationality,
            guest_city=model.guest_city,
            guest_address=model.guest_address,
            guest_post_code=model.guest_post_code,
            guest_comments=model.guest_comments,
            guest_contact_id=model.guest_contact_id,
            guest_contact_ids=contact_ids,
            promo=model.promo,
            creditcard_info=model.creditcard_info,
            payment_info=model.payment_info,
            booked_at=model.booked_at,
            is_verified=model.is_verified,
            opportunity_id=model.opportunity_id,
            quotation_id=model.quotation_id,
        )

        queryset = model.rooms.all(
        ) if with_deleted_rooms else model.rooms.active()  # noqa
        for room in queryset:
            reservation.rooms.append(self.model_to_reservation_room(room))
        return reservation
def reservation(house, rate_plan, room_type):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=1)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.NEW,
        is_verified=True,
        guest_name='John',
        guest_surname='Smith',
        guest_phone='+1-222-3344',
        price=Decimal(1120),
        price_accepted=Decimal(1121),
        netto_price=Decimal(1120),
        netto_price_accepted=Decimal(1121),
        quotation_id=321,
        rooms=[
            ReservationRoom(
                id=211,
                reservation_id=111,
                channel_id='',
                channel_rate_id='',
                checkin=checkin,
                checkout=checkout,
                rate_plan_id=rate_plan.id,
                adults=2,
                children=1,
                price=Decimal(1120),
                price_accepted=Decimal(1121),
                netto_price=Decimal(1120),
                netto_price_accepted=Decimal(1121),
                notes_info='XXX',
                day_prices=[
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin,
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1121),
                        currency=house.currency.code,
                    )
                ],
            )
        ],
    )
def reservation(house, rate_plan, room_type):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.NEW,
    )
def reservation(house):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(id=111,
                       house_id=house.id,
                       connection_id=None,
                       source=ReservationSources.MANUAL,
                       channel=None,
                       channel_id='',
                       checkin=checkin,
                       checkout=checkout,
                       booked_at=timezone.now(),
                       status=ReservationStatuses.HOLD,
                       is_verified=True,
                       quotation_id=123)
 def make_reservation_from_date(ctx: Context) -> ResultE[Context]:
     ctx.reservation = Reservation(
         id=None,
         house_id=ctx.house.id,
         connection_id=None,
         source=ReservationSources.MANUAL,
         channel=None,
         channel_id='',
         checkin=ctx.start_date,
         checkout=ctx.end_date,
         booked_at=timezone.now(),
         status=ReservationStatuses.CLOSE,
         close_reason=ctx.reason,
         room_count=1,
         currency=ctx.house.currency.code
         if ctx.house.currency is not None else None,
         is_verified=True,
         verified_at=timezone.now(),
     )
     ctx.reservation.rooms.append(
         ReservationRoom(
             id=None,
             reservation_id=None,
             channel_id='',
             channel_rate_id='',
             checkin=ctx.start_date,
             checkout=ctx.end_date,
             currency=ctx.house.currency.code
             if ctx.house.currency is not None else None,
             notes_info=ctx.notes,
         ))
     for day in cf.get_days_for_period(ctx.start_date,
                                       ctx.end_date,
                                       exclude=True):
         ctx.reservation.rooms[0].day_prices.append(
             ReservationDay(
                 id=None,
                 reservation_room_id=None,
                 day=day,
                 roomtype_id=ctx.room.roomtype_id,
                 room_id=ctx.room.id,
                 currency=ctx.house.currency.code
                 if ctx.house.currency is not None else None,
             ))
     return Success(ctx)
def reservation(house, room):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=2)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.CLOSE,
        is_verified=True,
        rooms=[
            ReservationRoom(
                id=222,
                reservation_id=111,
                channel_id="",
                channel_rate_id="",
                checkin=checkin,
                checkout=checkout,
                notes_info="XXX",
                day_prices=[
                    ReservationDay(id=1,
                                   reservation_room_id=222,
                                   day=checkin,
                                   roomtype_id=room.roomtype_id,
                                   room_id=room.id),
                    ReservationDay(
                        id=2,
                        reservation_room_id=222,
                        day=checkin + datetime.timedelta(days=1),
                        roomtype_id=room.roomtype_id,
                        room_id=room.id,
                    ),
                ],
            )
        ],
    )
Ejemplo n.º 10
0
def reservation(house, room_type, rate_plan):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.CANCEL,
        price=Decimal(3360),
        netto_price=Decimal(3360),
        guest_name='John',
        guest_surname='Smith',
        opportunity_id=321,
        quotation_id=123,
    )
Ejemplo n.º 11
0
def reservation(house, room_type):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.MODIFY,
        price=Decimal(1120),
        netto_price=Decimal(1120),
        guest_name='TEST',
        guest_surname='Some',
        guest_email='*****@*****.**',
        guest_phone='12345',
        guest_contact_id=11,
    )
def test_accept_reservation_fail(service: CreateRoomClose, context: Context,
                                 house, room):
    service._reservations_repo = Mock(accept=Mock(return_value=Nothing))
    context.house = house
    context.room = room
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=context.start_date,
        checkout=context.end_date,
        booked_at=timezone.now(),
        status=ReservationStatuses.CLOSE,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.save
    assert result.failure().error.startswith("Error accept new Reservation")
def test_accept_reservation_fail(service: CreateReservation, context: Context,
                                 house, room_type):
    service._reservations_repo = Mock(accept=Mock(return_value=Nothing))
    context.house = house
    context.room_type = room_type
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.save
    assert result.failure().error.startswith('Error accept new Reservation')
def test_accept_reservation_error(service: CreateReservation, context: Context,
                                  house, room_type):
    service._reservations_repo = Mock(accept=Mock(
        side_effect=RuntimeError('ERR')))
    context.house = house
    context.room_type = room_type
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == 'ERR'
def test_accept_reservation_error(service: CreateRoomClose, context: Context,
                                  house, room):
    service._reservations_repo = Mock(accept=Mock(
        side_effect=RuntimeError("ERR")))
    context.house = house
    context.room = room
    context.reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=context.start_date,
        checkout=context.end_date,
        booked_at=timezone.now(),
        status=ReservationStatuses.CLOSE,
    )

    result = service.accept_reservation(context)
    assert not is_successful(result)
    assert result.failure().failure == ReservationErrors.error
    assert str(result.failure().exc) == "ERR"
def test_save_reservation_ok(service: CreateRoomClose, context: Context, house,
                             room):
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id="",
        checkin=context.start_date,
        checkout=context.end_date,
        booked_at=timezone.now(),
        status=ReservationStatuses.CLOSE,
    )
    service._reservations_repo = Mock(save=Mock(
        return_value=(Some(reservation), True)))
    context.house = house
    context.room = room
    context.reservation = attr.evolve(reservation, id=None)

    result = service.save_reservation(context)
    assert is_successful(result)
    assert result.unwrap().reservation == reservation
def test_accept_reservation_ok(service: CreateReservation, context: Context,
                               house, room_type):
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=context.request.checkin,
        checkout=context.request.checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.HOLD,
        is_verified=True,
    )
    service._reservations_repo = Mock(accept=Mock(
        return_value=Some(reservation)))
    context.house = house
    context.room_type = room_type
    context.reservation = attr.evolve(reservation, is_verified=False)

    result = service.accept_reservation(context)
    assert is_successful(result)
    assert result.unwrap().reservation == reservation
    def make_reservation_from_date(ctx: Context) -> ResultE[Context]:
        netto_price = sum(
            ctx.request.prices.values()) if ctx.request.prices else Decimal(0)
        taxes = netto_price * ctx.house.tax / Decimal(
            100) if ctx.house.tax > Decimal(0) else Decimal(0)
        price = netto_price + taxes

        ctx.reservation = Reservation(
            id=None,
            house_id=ctx.house.id,
            connection_id=None,
            source=ReservationSources.MANUAL,
            channel=None,
            channel_id='',
            checkin=ctx.request.checkin,
            checkout=ctx.request.checkout,
            booked_at=timezone.now(),
            status=ReservationStatuses.HOLD,
            room_count=1,
            currency=ctx.house.currency.code
            if ctx.house.currency is not None else None,
            price=price,
            netto_price=netto_price,
            tax=taxes,
            guest_name=ctx.request.guest_name,
            guest_surname=ctx.request.guest_surname,
            guest_email=ctx.request.guest_email,
            guest_phone=ctx.request.guest_phone,
            is_verified=True,
            verified_at=timezone.now(),
        )
        ctx.reservation.rooms.append(
            ReservationRoom(
                id=None,
                reservation_id=None,
                channel_id='',
                channel_rate_id='',
                checkin=ctx.request.checkin,
                checkout=ctx.request.checkout,
                rate_plan_id=ctx.rate_plan.id,
                rate_id=ctx.rate.id if ctx.rate is not None else None,
                guest_name=' '.join(
                    [ctx.request.guest_name,
                     ctx.request.guest_surname]).strip(),
                guest_count=ctx.request.guests,
                adults=ctx.request.guests,
                currency=ctx.house.currency.code
                if ctx.house.currency is not None else None,
                price=ctx.reservation.price,
                netto_price=ctx.reservation.netto_price,
                tax=ctx.reservation.tax,
                notes_info=ctx.request.notes,
                policy=ctx.rate_plan.policy.dump()
                if ctx.rate_plan.policy is not None else {},
            ))
        for day in cf.get_days_for_period(ctx.request.checkin,
                                          ctx.request.checkout,
                                          exclude=True):
            day_price = ctx.request.prices.get(day) or Decimal(0)
            taxes = day_price * ctx.house.tax / Decimal(
                100) if ctx.house.tax > Decimal(0) else Decimal(0)
            ctx.reservation.rooms[0].day_prices.append(
                ReservationDay(
                    id=None,
                    reservation_room_id=None,
                    day=day,
                    roomtype_id=ctx.room_type.id,
                    price_changed=day_price,
                    price_original=day_price,
                    price_accepted=day_price,
                    tax=taxes,
                    currency=ctx.house.currency.code
                    if ctx.house.currency is not None else None,
                ))
        return Success(ctx)
def reservation(house, room_type):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.MODIFY,
        price=Decimal(1120),
        netto_price=Decimal(1120),
        rooms=[
            ReservationRoom(
                id=211,
                reservation_id=111,
                channel_id='',
                channel_rate_id='',
                checkin=checkin,
                checkout=checkout,
                rate_plan_id=499,
                rate_plan_id_original=499,
                adults=2,
                children=1,
                price=Decimal(1120),
                price_accepted=Decimal(1120),
                netto_price=Decimal(1120),
                netto_price_accepted=Decimal(1120),
                day_prices=[
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin,
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=312,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=1),
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=313,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=2),
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                ],
            )
        ],
    )
Ejemplo n.º 20
0
def reservation(house, room_type, rate_plan):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.MODIFY,
        price=Decimal(3360),
        price_accepted=Decimal(3360),
        netto_price=Decimal(3360),
        netto_price_accepted=Decimal(3360),
        guest_name='John',
        guest_surname='Smith',
        guest_email='*****@*****.**',
        guest_phone='+1-234-567890',
        opportunity_id=123,
        quotation_id=321,
        rooms=[
            ReservationRoom(
                id=211,
                reservation_id=111,
                channel_id='',
                channel_rate_id='',
                checkin=checkin,
                checkout=checkout,
                rate_plan_id=rate_plan.id,
                adults=2,
                children=1,
                price=Decimal(3360),
                netto_price=Decimal(3360),
                day_prices=[
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin,
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=312,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=1),
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=313,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=2),
                        roomtype_id=room_type.id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        currency=house.currency.code,
                    ),
                ],
            )
        ],
    )
def test_make_cached_reservations_split(service: UpdateReservationCache, house,
                                        rate_plan, room_type):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=2)
    room_type_2 = attr.evolve(room_type, id=101)
    reservation = Reservation(
        id=111,
        house_id=house.id,
        connection_id=None,
        source=ReservationSources.MANUAL,
        channel=None,
        channel_id='',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.NEW,
        is_verified=True,
        guest_name='John',
        guest_surname='Smith',
        guest_phone='+1-222-3344',
        price=Decimal(1120),
        price_accepted=Decimal(1121),
        netto_price=Decimal(1120),
        netto_price_accepted=Decimal(1121),
        quotation_id=321,
        rooms=[
            ReservationRoom(
                id=211,
                reservation_id=111,
                channel_id='',
                channel_rate_id='',
                checkin=checkin,
                checkout=checkout,
                rate_plan_id=rate_plan.id,
                adults=2,
                children=1,
                price=Decimal(1120),
                price_accepted=Decimal(1121),
                netto_price=Decimal(1120),
                netto_price_accepted=Decimal(1121),
                day_prices=[
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin,
                        roomtype_id=room_type.id,
                        price_original=Decimal(560),
                        price_accepted=Decimal(561),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=1),
                        roomtype_id=room_type_2.id,
                        price_original=Decimal(560),
                        price_accepted=Decimal(561),
                        currency=house.currency.code,
                    ),
                ],
            )
        ],
    )

    result = service.make_cached_reservations(reservation, house,
                                              {rate_plan.id: rate_plan},
                                              {321: Decimal(30)})

    assert len(result) == 2
    assert all([isinstance(x, CachedReservation) for x in result])

    assert result[0].pk == '111-211-1'
    assert result[0].reservation_id == 111
    assert result[0].grid == 'roomtype'
    assert result[0].grid_id == room_type.id
    assert result[0].checkin == datetime.datetime.combine(
        checkin, datetime.time(14))
    assert result[0].checkout == datetime.datetime.combine(
        checkin + datetime.timedelta(days=1), datetime.time(11))
    assert result[0].source is None
    assert result[0].source_code == ReservationSources.MANUAL.name
    assert result[0].status is None
    assert result[0].adults == 2
    assert result[0].children == 1
    assert result[0].meal == Foods.RO.value
    assert result[0].name == 'John Smith'
    assert result[0].phone == '+1-222-3344'
    assert result[0].money_room == '$1121.00'
    assert result[0].money_extra == '$0.00'
    assert result[0].total == '$1121.00'
    assert result[0].payed == '$30.00'
    assert result[0].balance == '$1091.00'
    assert result[0].has_balance

    assert result[1].pk == '111-211-2'
    assert result[1].reservation_id == 111
    assert result[1].grid == 'roomtype'
    assert result[1].grid_id == room_type_2.id
    assert result[1].checkin == datetime.datetime.combine(
        checkin + datetime.timedelta(days=1), datetime.time(14))
    assert result[1].checkout == datetime.datetime.combine(
        checkout, datetime.time(11))
    assert result[1].source is None
    assert result[1].source_code == ReservationSources.MANUAL.name
    assert result[0].status is None
    assert result[1].adults == 2
    assert result[1].children == 1
    assert result[1].meal == Foods.RO.value
    assert result[1].name == 'John Smith'
    assert result[1].phone == '+1-222-3344'
    assert result[1].money_room == '$1121.00'
    assert result[1].money_extra == '$0.00'
    assert result[1].total == '$1121.00'
    assert result[1].payed == '$30.00'
    assert result[1].balance == '$1091.00'
    assert result[1].has_balance
def reservation(house, connection, room_connection, rate_plan_mapping):
    checkin = datetime.date.today()
    checkout = checkin + datetime.timedelta(days=3)
    return Reservation(
        id=111,
        house_id=house.id,
        connection_id=connection.id,
        source=ReservationSources.EXPEDIA,
        channel=Channels.EXPEDIA,
        channel_id='1697441495',
        checkin=checkin,
        checkout=checkout,
        booked_at=timezone.now(),
        status=ReservationStatuses.MODIFY,
        is_verified=False,
        guest_name='John',
        guest_surname='Smith',
        guest_phone='+1-222-3344',
        price=Decimal(1120),
        netto_price=Decimal(1120),
        rooms=[
            ReservationRoom(
                id=211,
                reservation_id=111,
                channel_id=room_connection.channel_id,
                channel_rate_id='',
                checkin=checkin,
                checkout=checkout,
                rate_plan_id=rate_plan_mapping.rate_plan_id,
                rate_plan_id_original=rate_plan_mapping.rate_plan_id,
                policy={'name': 'NEW POLICY'},
                policy_original={'name': 'OLD POLICY'},
                adults=2,
                children=1,
                price=Decimal(1120),
                netto_price=Decimal(1120),
                day_prices=[
                    ReservationDay(
                        id=311,
                        reservation_room_id=211,
                        day=checkin,
                        roomtype_id=room_connection.roomtype_id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        price_changed=Decimal(1220),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=312,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=1),
                        roomtype_id=room_connection.roomtype_id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        price_changed=Decimal(1220),
                        currency=house.currency.code,
                    ),
                    ReservationDay(
                        id=313,
                        reservation_room_id=211,
                        day=checkin + datetime.timedelta(days=2),
                        roomtype_id=room_connection.roomtype_id,
                        price_original=Decimal(1120),
                        price_accepted=Decimal(1120),
                        price_changed=Decimal(1220),
                        currency=house.currency.code,
                    ),
                ],
            )
        ],
    )