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)
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)) ])
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, ), ], ) ], )
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, )
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, ), ], ) ], )
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, ), ], ) ], )