mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
290 lines
13 KiB
Python
290 lines
13 KiB
Python
# -*- coding: utf-8 -*-
|
|
##############################################################################
|
|
#
|
|
# OpenERP, Open Source Management Solution
|
|
# Copyright (C) 2017 Solucións Aloxa S.L. <info@aloxa.eu>
|
|
# Alexandre Díaz <dev@redneboa.es>
|
|
#
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
##############################################################################
|
|
import datetime
|
|
from datetime import timedelta
|
|
from odoo import fields
|
|
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
|
from openerp.exceptions import ValidationError
|
|
from .common import TestHotelCalendar
|
|
from odoo.addons.hotel import date_utils
|
|
import pytz
|
|
|
|
|
|
class TestReservationsCalendar(TestHotelCalendar):
|
|
|
|
def test_calendar_pricelist(self):
|
|
now_utc_dt = date_utils.now()
|
|
real_start_utc_dt = (now_utc_dt - timedelta(days=1))
|
|
adv_utc_dt = now_utc_dt + timedelta(days=15)
|
|
|
|
hotel_reserv_obj = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager)
|
|
|
|
hcal_data = hotel_reserv_obj.get_hcalendar_all_data(
|
|
now_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
adv_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
|
|
|
# Check Pricelist Integrity
|
|
for k_pr, v_pr in hcal_data['pricelist'].iteritems():
|
|
for room_type_pr in v_pr:
|
|
# Only Check Test Cases
|
|
if room_type_pr['room'] in self.prices_tmp.keys():
|
|
sorted_dates = sorted(
|
|
room_type_pr['days'].keys(),
|
|
key=lambda x: datetime.datetime.strptime(x, '%d/%m/%Y')
|
|
)
|
|
init_date_dt = datetime.datetime.strptime(
|
|
sorted_dates[0],
|
|
'%d/%m/%Y').replace(tzinfo=pytz.utc)
|
|
end_date_dt = datetime.datetime.strptime(
|
|
sorted_dates[-1],
|
|
'%d/%m/%Y').replace(tzinfo=pytz.utc)
|
|
|
|
self.assertEqual(real_start_utc_dt, init_date_dt,
|
|
"Hotel Calendar don't start in \
|
|
the correct date!")
|
|
self.assertEqual(adv_utc_dt, end_date_dt,
|
|
"Hotel Calendar don't end in \
|
|
the correct date!")
|
|
|
|
room_type_prices = self.prices_tmp[room_type_pr['room']]
|
|
for k_price, v_price in enumerate(room_type_prices):
|
|
self.assertEqual(
|
|
v_price,
|
|
room_type_pr['days'][sorted_dates[k_price+1]],
|
|
"Hotel Calendar Pricelist doesn't match!")
|
|
|
|
# Check Pricelist Integrity after unlink
|
|
pricelist_item_obj = self.env['product.pricelist.item'].sudo(
|
|
self.user_hotel_manager)
|
|
pr_ids = pricelist_item_obj.search([
|
|
('pricelist_id', '=', self.default_pricelist_id),
|
|
('product_tmpl_id', 'in', (
|
|
self.hotel_room_type_budget.product_id.product_tmpl_id.id,
|
|
self.hotel_room_type_special.product_id.product_tmpl_id.id)),
|
|
])
|
|
pr_ids.sudo(self.user_hotel_manager).unlink()
|
|
reserv_obj = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager)
|
|
hcal_data = reserv_obj.get_hcalendar_all_data(
|
|
now_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
adv_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
|
room_types = (self.hotel_room_type_budget, self.hotel_room_type_special)
|
|
for room_type in room_types:
|
|
for k_pr, v_pr in hcal_data['pricelist'].iteritems():
|
|
for room_type_pr in v_pr:
|
|
if room_type_pr['room'] == room_type.id: # Only Check Test Cases
|
|
self.assertEqual(
|
|
room_type.list_price,
|
|
room_type_pr['days'][sorted_dates[k_price+1]],
|
|
"Hotel Calendar Pricelist doesn't \
|
|
match after remove!")
|
|
|
|
def test_calendar_reservations(self):
|
|
now_utc_dt = date_utils.now()
|
|
adv_utc_dt = now_utc_dt + timedelta(days=15)
|
|
|
|
hotel_reserv_obj = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager)
|
|
|
|
def is_reservation_listed(reservation_id):
|
|
hcal_data = hotel_reserv_obj.get_hcalendar_all_data(
|
|
now_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
adv_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
|
# TODO: Perhaps not the best way to do this test... :/
|
|
hasReservationTest = False
|
|
for reserv in hcal_data['reservations']:
|
|
if reserv[1] == reservation_id:
|
|
hasReservationTest = True
|
|
break
|
|
return hasReservationTest
|
|
|
|
# CREATE COMPLETE RESERVATION (3 Nigths)
|
|
reserv_start_utc_dt = now_utc_dt + timedelta(days=3)
|
|
reserv_end_utc_dt = reserv_start_utc_dt + timedelta(days=3)
|
|
folio = self.create_folio(self.user_hotel_manager, self.partner_2)
|
|
reservation = self.create_reservation(
|
|
self.user_hotel_manager,
|
|
folio,
|
|
reserv_start_utc_dt,
|
|
reserv_end_utc_dt,
|
|
self.hotel_room_double_200,
|
|
"Reservation Test #1")
|
|
|
|
# CHECK SUCCESSFULL CREATION
|
|
self.assertTrue(is_reservation_listed(reservation.id),
|
|
"Hotel Calendar can't found test reservation!")
|
|
|
|
# CONFIRM FOLIO
|
|
folio.sudo(self.user_hotel_manager).action_confirm()
|
|
self.assertTrue(is_reservation_listed(reservation.id),
|
|
"Hotel Calendar can't found test reservation!")
|
|
|
|
# CALENDAR LIMITS
|
|
now_utc_dt_tmp = now_utc_dt
|
|
adv_utc_dt_tmp = adv_utc_dt
|
|
# Start after reservation end
|
|
now_utc_dt = reserv_end_utc_dt + timedelta(days=2)
|
|
adv_utc_dt = now_utc_dt + timedelta(days=15)
|
|
self.assertFalse(
|
|
is_reservation_listed(reservation.id),
|
|
"Hotel Calendar found test reservation but expected not found it!")
|
|
|
|
# Ends before reservation start
|
|
adv_utc_dt = reserv_start_utc_dt - timedelta(days=1)
|
|
now_utc_dt = adv_utc_dt - timedelta(days=15)
|
|
self.assertFalse(
|
|
is_reservation_listed(reservation.id),
|
|
"Hotel Calendar found test reservation but expected not found it!")
|
|
now_utc_dt = now_utc_dt_tmp
|
|
adv_utc_dt = adv_utc_dt_tmp
|
|
|
|
# Start in the middle of the reservation days
|
|
now_utc_dt = reserv_end_utc_dt - timedelta(days=1)
|
|
adv_utc_dt = now_utc_dt + timedelta(days=15)
|
|
self.assertTrue(
|
|
is_reservation_listed(reservation.id),
|
|
"Hotel Calendar can't found test reservation!")
|
|
now_utc_dt = now_utc_dt_tmp
|
|
adv_utc_dt = adv_utc_dt_tmp
|
|
|
|
# CANCEL FOLIO
|
|
folio.sudo(self.user_hotel_manager).action_cancel()
|
|
self.assertFalse(
|
|
is_reservation_listed(reservation.id),
|
|
"Hotel Calendar can't found test reservation!")
|
|
|
|
# REMOVE FOLIO
|
|
folio.sudo().unlink() # FIXME: Can't use: self.user_hotel_manager
|
|
self.assertFalse(
|
|
is_reservation_listed(reservation.id),
|
|
"Hotel Calendar can't found test reservation!")
|
|
|
|
def test_invalid_input_calendar_data(self):
|
|
now_utc_dt = date_utils.now()
|
|
adv_utc_dt = now_utc_dt + timedelta(days=15)
|
|
|
|
hotel_reserv_obj = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager)
|
|
|
|
with self.assertRaises(ValidationError):
|
|
hcal_data = hotel_reserv_obj.get_hcalendar_all_data(
|
|
False,
|
|
adv_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT))
|
|
with self.assertRaises(ValidationError):
|
|
hcal_data = hotel_reserv_obj.get_hcalendar_all_data(
|
|
now_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
|
False)
|
|
with self.assertRaises(ValidationError):
|
|
hcal_data = hotel_reserv_obj.get_hcalendar_all_data(
|
|
False,
|
|
False)
|
|
|
|
def test_calendar_settings(self):
|
|
hcal_options = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager).get_hcalendar_settings()
|
|
|
|
self.assertEqual(hcal_options['divide_rooms_by_capacity'],
|
|
self.user_hotel_manager.pms_divide_rooms_by_capacity,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['eday_week'],
|
|
self.user_hotel_manager.pms_end_day_week,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['days'],
|
|
self.user_hotel_manager.pms_default_num_days,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(
|
|
hcal_options['allow_invalid_actions'],
|
|
self.user_hotel_manager.pms_type_move == 'allow_invalid',
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(
|
|
hcal_options['assisted_movement'],
|
|
self.user_hotel_manager.pms_type_move == 'assisted',
|
|
"Hotel Calendar Invalid Options!")
|
|
default_arrival_hour = self.env['ir.default'].sudo().get(
|
|
'res.config.settings', 'default_arrival_hour')
|
|
self.assertEqual(hcal_options['default_arrival_hour'],
|
|
default_arrival_hour,
|
|
"Hotel Calendar Invalid Options!")
|
|
default_departure_hour = self.env['ir.default'].sudo().get(
|
|
'res.config.settings', 'default_departure_hour')
|
|
self.assertEqual(hcal_options['default_departure_hour'],
|
|
default_departure_hour,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['show_notifications'],
|
|
self.user_hotel_manager.pms_show_notifications,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['show_num_rooms'],
|
|
self.user_hotel_manager.pms_show_num_rooms,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['show_pricelist'],
|
|
self.user_hotel_manager.pms_show_pricelist,
|
|
"Hotel Calendar Invalid Options!")
|
|
self.assertEqual(hcal_options['show_availability'],
|
|
self.user_hotel_manager.pms_show_availability,
|
|
"Hotel Calendar Invalid Options!")
|
|
|
|
def test_swap_reservation(self):
|
|
hcal_reserv_obj = self.env['hotel.reservation'].sudo(
|
|
self.user_hotel_manager)
|
|
now_utc_dt = date_utils.now()
|
|
|
|
# CREATE RESERVATIONS
|
|
reserv_start_utc_dt = now_utc_dt + timedelta(days=3)
|
|
reserv_end_utc_dt = reserv_start_utc_dt + timedelta(days=3)
|
|
folio_a = self.create_folio(self.user_hotel_manager, self.partner_2)
|
|
reservation_a = self.create_reservation(
|
|
self.user_hotel_manager,
|
|
folio_a,
|
|
reserv_start_utc_dt,
|
|
reserv_end_utc_dt,
|
|
self.hotel_room_double_200,
|
|
"Reservation Test #1")
|
|
self.assertTrue(reservation_a,
|
|
"Hotel Calendar create test reservation!")
|
|
folio_a.sudo(self.user_hotel_manager).action_confirm()
|
|
|
|
folio_b = self.create_folio(self.user_hotel_manager, self.partner_2)
|
|
reservation_b = self.create_reservation(
|
|
self.user_hotel_manager,
|
|
folio_b,
|
|
reserv_start_utc_dt,
|
|
reserv_end_utc_dt,
|
|
self.hotel_room_simple_101,
|
|
"Reservation Test #2")
|
|
self.assertTrue(reservation_b,
|
|
"Hotel Calendar can't create test reservation!")
|
|
folio_b.sudo(self.user_hotel_manager).action_confirm()
|
|
|
|
self.assertTrue(
|
|
hcal_reserv_obj.swap_reservations(reservation_a.ids,
|
|
reservation_b.ids),
|
|
"Hotel Calendar invalid swap operation"
|
|
)
|
|
self.assertEqual(reservation_a.product_id.id,
|
|
self.hotel_room_simple_101.product_id.id,
|
|
"Hotel Calendar wrong swap operation")
|
|
self.assertEqual(reservation_b.product_id.id,
|
|
self.hotel_room_double_200.product_id.id,
|
|
"Hotel Calendar wrong swap operation")
|