-
-
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This reservation is part of splitted reservation.
+
-
-
-
-
-
€
-
-
-
Board Service:
-
Adults: - Children:
-
-
+
@@ -216,20 +239,20 @@
-
-
+
+
+
-
Board Service:
-
Adults: - Children:
+
Adults:
+
Children:
-
@@ -251,8 +274,8 @@
-
diff --git a/hotel_channel_connector_wubook/tests/README.rst b/hotel_channel_connector_wubook/tests/README.rst
new file mode 100644
index 000000000..b72c4c3cc
--- /dev/null
+++ b/hotel_channel_connector_wubook/tests/README.rst
@@ -0,0 +1,285 @@
+==============================
+HOTEL CHANNEL CONNECTOR WUBOOK
+==============================
+
+The following list define the test to be covered by this module.
+
+Knowledge Base
+==============
+- WuBook uses a default Restrictions Plan with ``rpid=0`` for the Online Reception restrictions.
+- WuBook uses a default Parity Rate Plan with ``pid=0`` for the Online Reception prices.
+- You can not define a Parity Restriction Plan for Online Receptions.
+- You can define a Parity Rate Plan for Online Receptions.
+- Handling Rooms: https://tdocs.wubook.net/wired/rooms.html
+- Wired: updating availability https://tdocs.wubook.net/wired/avail.html
+
+Scenario 1 (TS100)
+==================
+:Prerequisites: You have a new WuBook account ready to use **without** Rooms,
+ neither Rate plans or Restrictions plans.
+
+Test TC101
+----------
+
+:Summary: **Install** the `Hotel Channel Connector Wubook` module and
+ **create** a `Hotel Channel Backend` will bind WuBook as the hotel channel manager.
+
+:Procedure:
+ 1. Install the ``hotel_channel_connector_wubook`` module.
+ 2. Create a new Hotel Channel Backend with your WuBook Account Credentials.
+ 3. Generate a new Channel Service Security Token.
+
+:Result:
+ - You can Import OTA's Info.
+ - You can Export Availability, Restrictions and Pricelists.
+ - You can bind Rooms, Rate Plans and Restriction Plans.
+
+:Remarks: You can not Import Rooms, neither Availability, Restriction Plans and Restriction Values,
+ Pricelist Plans and Pricelist Values because it is a new WuBook Account.
+
+:Status: Test Passed.
+
+Test TC102
+----------
+
+:Summary: Bind **Room Types** to the Hotel Channel Connector Backend.
+
+:Requirement: TC101
+
+:Procedure: Add the Hotel Channel Connector Backend to the Room Type.
+
+:Result:
+ - The Room Type is created in WuBook.
+ - You can modify the following fields: ``name``, ``capacity``, ``price``, ``availability``,
+ ``scode``, ``dboard``, ``rtype``.
+
+:Remarks: Creating a Room Type in WuBook will `make available`
+ a **default WuBook Restrictions Plan** named **WuBook Restrictions** with ``rpid=0`` and
+ a **default WuBook Rate Plan** named **WuBook Parity** with ``pid=0``.
+
+:Status: Test Passed.
+
+Test TC103
+----------
+
+:Summary: Bind **Restriction Plans** to the Hotel Channel Connector Backend.
+
+:Requirement: TC101
+
+:Procedure: Add the Hotel Channel Connector Backend to the Restriction Plan.
+
+:Result:
+ - The Restriction Plan is created in WuBook.
+ - You can modify the following fields: ``name``.
+
+:Remarks: Creating a Restriction Plan in WuBook will `create`
+ a **new WuBook Restrictions Plan** with ``rpid!=0``.
+
+:Status: Test Passed.
+
+Test TC104
+----------
+
+:Summary: Add **Restrictions**
+
+:Requirement: TC101, TC102, TC103
+
+:Procedure: Add Restriction Items into the Restriction Plan.
+
+:Result: The Restriction Plan is updated in WuBook.
+
+:Remarks: For this test you need Push Restrictions in the Hotel Channel Backends Export form.
+
+:Status: Test Passed.
+
+Test TC105
+----------
+
+:Summary: Delete **Restrictions**
+
+:Requirement: TC101, TC102, TC103
+
+:Procedure: Delete a Restriction Items in Odoo.
+
+:Result: The Restriction Plan is updated in WuBook.
+
+:Remarks: For this test you need Push Restrictions in the Hotel Channel Backends Export form.
+
+:Status: Test Failed.
+
+:Reason: Restrictions remain in WuBook.
+
+Test TC106
+----------
+
+:Summary: Bind **Product Pricelist** to the Hotel Channel Connector Backend.
+
+:Requirement: TC101
+
+:Procedure: Add the Hotel Channel Connector Backend to the Product Pricelist.
+
+:Result:
+ - The Product Pricelist is created in WuBook.
+ - You can modify the following fields: ``name``.
+
+:Remarks: Creating a Product Pricelist in WuBook will `create` a
+ **new WuBook Rate Plan** with ``pid!=0``.
+
+:Status: Test Passed.
+
+Test TC107
+----------
+
+:Summary: Add Room Type **Price**
+
+:Requirement: TC101, TC102, TC105
+
+:Procedure: Add Room Type Unit Price into the Rate Plan.
+
+:Result: The Rate Plan is updated in WuBook.
+
+:Remarks: For this test use the Massive Changes Wizard.
+
+:Status: Test Passed.
+
+Test TC108
+----------
+
+:Summary: Add **Availability** to the Hotel Room Type.
+
+:Requirement: TC101, TC102, T103
+
+:Procedure: Add the availability to the Room Type using a Hotel Channel Connector Backend.
+
+:Result: The Availability is created in WuBook.
+
+:Remarks: The availability is updated in WuBook after Push Availability.
+
+:Status: Test Passed.
+
+Test TC109
+----------
+
+:Summary: Delete **Availability** from the Hotel Room Type.
+
+:Requirement: TC101, TC102, T103
+
+:Procedure: Delete Availability Items in Odoo.
+
+:Result: The Restriction Plan is updated in WuBook.
+
+:Remarks: The availability is updated in WuBook after Push Availability.
+
+:Status: Test Failed.
+
+Test TC110
+----------
+
+:Summary: Bind the **Restriction Plan** in Odoo to the Hotel Channel Connector Backend
+ using ``ID on Channel=0`` will start its **parity** with the default Restriction Plan **in WuBook**.
+
+:Requirement: TC101
+
+:Procedure: Add the Hotel Channel Connector Backend to the Restriction Plan using **``ID on Channel=0``**.
+
+:Result: The Odoo Restriction Plan will be in parity with the
+ default WuBook Restrictions Plan with ``rpid=0`` named **WuBook Restrictions**.
+
+:Status: Test Passed.
+
+Test TC111
+----------
+
+:Summary: Bind the **Product Pricelist** in Odoo to the Hotel Channel Connector Backend
+ will start its **parity** with the default Price Plan **in WuBook**.
+
+:Requirement: TC101
+
+:Procedure: Add the Hotel Channel Connector Backend to the Product Pricelis using **``ID on Channel=0``**.
+
+:Result: The Product Pricelist created in WuBook is in parity with the
+ default WuBook Restrictions Plan with ``rpid=0``.
+
+:Status: Unknown.
+
+Test TC112
+----------
+
+:Summary: Update any **binded field** in a Room Type will automatically update the corresponding field in **WuBook**.
+
+:Requirement: TC101, TC102
+
+:Procedure: Edit a Room Type and modify the ``name``.
+
+:Result: The name in WuBook is also updated.
+
+:Status: Failed.
+
+:Reason: Some fields (``name``, ``list_price``) are updated `only` if the Hotel Channel Connector Binding is updated.
+
+
+Scenario 2 (TS002)
+==================
+:Prerequisites: `Scenario 1 (TS100)`_ Tests passed.
+
+:Summary: This tests review the basic reservation management.
+
+Test TC201
+----------
+
+:Summary: **Create** a Reservation **decreases** the Room Type Availability in one in the corresponding Plan in Wubook.
+
+:Procedure: Create a reservation with a room type binded to the Hotel Channel Connector Backend.
+
+:Result: The availability is decreased by one.
+
+:Status: Test Failed.
+
+:Reason: The availability remains the same.
+
+Test TC202
+----------
+
+:Summary: **Cancel** a Reservation **increases** the Room Type Availability in one in the corresponding Plan in Wubook.
+
+:Procedure: Cancel a reservation with a room type binded to the Hotel Channel Connector Backend.
+
+:Result: The availability is increased by one.
+
+:Status: Not done yet.
+
+Test TC203
+----------
+
+:Summary: **Change** the Room Type in a Reservation **modifies** the Room Type Availability
+ in the corresponding Plan in Wubook.
+
+:Procedure: Change the Room Type in a reservation to any room type binded to the Hotel Channel Connector Backend.
+
+:Result: The availability is modified according to the change done.
+
+:Status: Not done yet.
+
+Test TC204
+----------
+
+:Summary: **Change** Checkin/Checkout dates in a Reservation **modifies** the Room Type Availability
+ in the corresponding Plan in Wubook.
+
+:Procedure: Change the Checkin/Checkout in a reservation with a room type binded to the Hotel Channel Connector Backend.
+
+:Result: The availability is modified according to the change done.
+
+:Status: Not done yet.
+
+Test TC205
+----------
+
+:Summary: **Reselling** state in a Reservation **increases** the Room Type Availability
+ in the corresponding Plan in Wubook.
+
+:Procedure: Mark a reservation as `reselling` with a room type binded to the Hotel Channel Connector Backend.
+
+:Result: The availability is increased by one.
+
+:Status: Not done yet.
\ No newline at end of file
diff --git a/hotel_channel_connector_wubook/tests/__init__.py b/hotel_channel_connector_wubook/tests/__init__.py
index c9580b6f0..4c8a86f24 100644
--- a/hotel_channel_connector_wubook/tests/__init__.py
+++ b/hotel_channel_connector_wubook/tests/__init__.py
@@ -1,2 +1,3 @@
# Copyright 2018 Alexandre Díaz
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+from . import test_channel_hotel_room_type_adapter_model
\ No newline at end of file
diff --git a/hotel_channel_connector_wubook/tests/common.py b/hotel_channel_connector_wubook/tests/common.py
index 336c2fd69..22144473d 100644
--- a/hotel_channel_connector_wubook/tests/common.py
+++ b/hotel_channel_connector_wubook/tests/common.py
@@ -22,13 +22,12 @@
##############################################################################
from datetime import timedelta
from odoo import api
-from odoo.addons.hotel import date_utils
from odoo.addons.hotel.tests.common import TestHotel
-from odoo.addons.hotel_wubook_proto.wubook import (
- DEFAULT_WUBOOK_DATE_FORMAT,
- DEFAULT_WUBOOK_TIME_FORMAT,
- WUBOOK_STATUS_CONFIRMED,
- WUBOOK_STATUS_CANCELLED)
+# from odoo.addons.hotel_wubook_proto.wubook import (
+# DEFAULT_WUBOOK_DATE_FORMAT,
+# DEFAULT_WUBOOK_TIME_FORMAT,
+# WUBOOK_STATUS_CONFIRMED,
+# WUBOOK_STATUS_CANCELLED)
from random import randint
import logging
_logger = logging.getLogger(__name__)
@@ -38,7 +37,7 @@ class TestHotelWubook(TestHotel):
@classmethod
def _init_mock_hotel(cls):
- super(TestHotelWubook, cls)._init_mock_hotel()
+ super()._init_mock_hotel()
@api.multi
def wubook_ommit(self, *args, **kwargs):
@@ -49,262 +48,275 @@ class TestHotelWubook(TestHotel):
wid=False, dfrom=False, dto=False):
_logger.info("ISSUE CREATED:\n\t- %s\n\t--- %s", section, message)
- cls.env['wubook']._patch_method('create_channel_connector_issue',
- wubook_create_channel_connector_issue)
- cls.env['wubook']._patch_method('is_valid_account', wubook_ommit)
- cls.env['wubook']._patch_method('initialize', wubook_ommit)
- cls.env['wubook']._patch_method('push_activation', wubook_ommit)
- cls.env['wubook']._patch_method('init_connection', wubook_ommit)
- cls.env['wubook']._patch_method('close_connection', wubook_ommit)
- cls.env['wubook']._patch_method('create_room', wubook_ommit)
- cls.env['wubook']._patch_method('modify_room', wubook_ommit)
- cls.env['wubook']._patch_method('delete_room', wubook_ommit)
- cls.env['wubook']._patch_method('import_rooms', wubook_ommit)
- cls.env['wubook']._patch_method('fetch_rooms_values', wubook_ommit)
- cls.env['wubook']._patch_method('update_availability', wubook_ommit)
- cls.env['wubook']._patch_method('corporate_fetch', wubook_ommit)
- cls.env['wubook']._patch_method('create_reservation', wubook_ommit)
- cls.env['wubook']._patch_method('cancel_reservation', wubook_ommit)
- cls.env['wubook']._patch_method('fetch_new_bookings', wubook_ommit)
- cls.env['wubook']._patch_method('fetch_booking', wubook_ommit)
- cls.env['wubook']._patch_method('mark_bookings', wubook_ommit)
- cls.env['wubook']._patch_method('create_plan', wubook_ommit)
- cls.env['wubook']._patch_method('delete_plan', wubook_ommit)
- cls.env['wubook']._patch_method('update_plan_name', wubook_ommit)
- cls.env['wubook']._patch_method('update_plan_prices', wubook_ommit)
- cls.env['wubook']._patch_method('update_plan_periods', wubook_ommit)
- cls.env['wubook']._patch_method('import_pricing_plans', wubook_ommit)
- cls.env['wubook']._patch_method('fetch_plan_prices', wubook_ommit)
- cls.env['wubook']._patch_method('fetch_all_plan_prices', wubook_ommit)
- cls.env['wubook']._patch_method('import_restriction_plans',
- wubook_ommit)
- cls.env['wubook']._patch_method('fetch_rplan_restrictions',
- wubook_ommit)
- cls.env['wubook']._patch_method('update_rplan_values', wubook_ommit)
- cls.env['wubook']._patch_method('create_rplan', wubook_ommit)
- cls.env['wubook']._patch_method('rename_rplan', wubook_ommit)
- cls.env['wubook']._patch_method('delete_rplan', wubook_ommit)
- cls.env['wubook']._patch_method('import_channels_info', wubook_ommit)
- cls.env['wubook']._patch_method('push_changes', wubook_ommit)
- cls.env['wubook']._patch_method('push_availability', wubook_ommit)
- cls.env['wubook']._patch_method('push_priceplans', wubook_ommit)
- cls.env['wubook']._patch_method('push_restrictions', wubook_ommit)
+ # cls.env['wubook']._patch_method('create_channel_connector_issue',
+ # wubook_create_channel_connector_issue)
+ # cls.env['wubook']._patch_method('is_valid_account', wubook_ommit)
+ # cls.env['wubook']._patch_method('initialize', wubook_ommit)
+ # cls.env['wubook']._patch_method('push_activation', wubook_ommit)
+ # cls.env['wubook']._patch_method('init_connection', wubook_ommit)
+ # cls.env['wubook']._patch_method('close_connection', wubook_ommit)
+ # cls.env['wubook']._patch_method('create_room', wubook_ommit)
+ # cls.env['wubook']._patch_method('modify_room', wubook_ommit)
+ # cls.env['wubook']._patch_method('delete_room', wubook_ommit)
+ # cls.env['wubook']._patch_method('import_rooms', wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_rooms_values', wubook_ommit)
+ # cls.env['wubook']._patch_method('update_availability', wubook_ommit)
+ # cls.env['wubook']._patch_method('corporate_fetch', wubook_ommit)
+ # cls.env['wubook']._patch_method('create_reservation', wubook_ommit)
+ # cls.env['wubook']._patch_method('cancel_reservation', wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_new_bookings', wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_booking', wubook_ommit)
+ # cls.env['wubook']._patch_method('mark_bookings', wubook_ommit)
+ # cls.env['wubook']._patch_method('create_plan', wubook_ommit)
+ # cls.env['wubook']._patch_method('delete_plan', wubook_ommit)
+ # cls.env['wubook']._patch_method('update_plan_name', wubook_ommit)
+ # cls.env['wubook']._patch_method('update_plan_prices', wubook_ommit)
+ # cls.env['wubook']._patch_method('update_plan_periods', wubook_ommit)
+ # cls.env['wubook']._patch_method('import_pricing_plans', wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_plan_prices', wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_all_plan_prices', wubook_ommit)
+ # cls.env['wubook']._patch_method('import_restriction_plans',
+ # wubook_ommit)
+ # cls.env['wubook']._patch_method('fetch_rplan_restrictions',
+ # wubook_ommit)
+ # cls.env['wubook']._patch_method('update_rplan_values', wubook_ommit)
+ # cls.env['wubook']._patch_method('create_rplan', wubook_ommit)
+ # cls.env['wubook']._patch_method('rename_rplan', wubook_ommit)
+ # cls.env['wubook']._patch_method('delete_rplan', wubook_ommit)
+ # cls.env['wubook']._patch_method('import_channels_info', wubook_ommit)
+ # cls.env['wubook']._patch_method('push_changes', wubook_ommit)
+ # cls.env['wubook']._patch_method('push_availability', wubook_ommit)
+ # cls.env['wubook']._patch_method('push_priceplans', wubook_ommit)
+ # cls.env['wubook']._patch_method('push_restrictions', wubook_ommit)
- def create_wubook_booking(self, creator, checkin, partner, rinfo,
- channel=0, notes=''):
- rcode = randint(100000, 999999)
- crcode = randint(100000, 999999)
- brate = randint(100000, 999999)
- id_woodoo = randint(100000, 999999)
+ # def create_wubook_booking(self, creator, checkin, partner, rinfo,
+ # channel=0, notes=''):
+ # rcode = randint(100000, 999999)
+ # crcode = randint(100000, 999999)
+ # brate = randint(100000, 999999)
+ # id_woodoo = randint(100000, 999999)
+ #
+ # if not partner.email or partner.email == '':
+ # self.raiseException("Partner doesn't have a mail")
+ #
+ # now_utc_dt = date_utils.now()
+ # now_dt = date_utils.dt_as_timezone(now_utc_dt, self.tz_hotel)
+ # checkin_utc_dt = date_utils.get_datetime(checkin)
+ # checkin_dt = date_utils.dt_as_timezone(checkin_utc_dt, self.tz_hotel)
+ # numdays = 0
+ # for k_room, v_room in rinfo.iteritems():
+ # numdays = max(len(v_room['dayprices']), numdays)
+ # checkout_utc_dt = checkin_utc_dt + timedelta(days=numdays)
+ # checkout_dt = date_utils.dt_as_timezone(checkout_utc_dt, self.tz_hotel)
+ # date_diff = date_utils.date_diff(checkin_utc_dt, checkout_utc_dt,
+ # hours=False)
+ #
+ # # Generate Day Prices
+ # dayprices = {}
+ # total_amount = 0.0
+ # for k_room, v_room in rinfo.iteritems():
+ # for price in v_room['dayprices']:
+ # dayprices.setdefault(k_room, []).append(price)
+ # total_amount += price
+ # # Generate Values
+ # rooms = []
+ # rooms_occu = []
+ # booked_rooms = []
+ # room_type_obj = self.env['hotel.room.type']
+ # max_persons = 0
+ # for k_room, v_room in rinfo.iteritems():
+ # room_type = room_type_obj.search([
+ # ('wrid', '=', k_room)
+ # ], limit=1)
+ # # Generate Rooms
+ # for price in range(0, len(v_room['occupancy'])):
+ # rooms.append(k_room)
+ # # Generate Rooms Occupancies
+ # for val in v_room['occupancy']:
+ # # Generate Rooms Occupancies
+ # rooms_occu.append({
+ # 'id': k_room,
+ # 'occupancy': val,
+ # })
+ # # Generate Booked Rooms
+ # roomdays = []
+ # for k_price, v_price in enumerate(v_room['dayprices']):
+ # ndate = checkin_dt + timedelta(days=k_price)
+ # roomdays.append({
+ # 'ancillary': {},
+ # 'rate_id': 3,
+ # 'price': v_price,create_channel_connector_issue
+ # 'day': ndate.strftime(DEFAULT_WUBOOK_DATE_FORMAT)
+ # })
+ # booked_rooms.append({
+ # 'ancillary': {
+ # 'channel_room_id': 1,
+ # 'channel_room_name': room_type.name,
+ # 'addons': [],
+ # 'guests': val
+ # },
+ # 'room_id': k_room,
+ # 'roomdays': roomdays
+ # })
+ # if val > max_persons:
+ # max_persons = val
+ #
+ # return {
+ # 'id_channel': channel,
+ # 'special_offer': '',
+ # 'reservation_code': rcode,
+ # 'dayprices': dayprices,
+ # 'arrival_hour': checkin_dt.strftime(DEFAULT_WUBOOK_TIME_FORMAT),
+ # 'booked_rate': brate,
+ # 'rooms': ','.join(map(str, rooms)),
+ # 'customer_mail': partner.email,
+ # 'customer_country': 'ES',
+ # 'children': 0,
+ # 'payment_gateway_fee': '',
+ # 'modified_reservations': [],
+ # 'customer_surname': ' '.join(partner.name.split(' ')[1:]),
+ # 'date_departure': checkout_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
+ # 'amount_reason': '',
+ # 'customer_city': partner.city,
+ # 'opportunities': 0,
+ # 'date_received': now_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
+ # 'rooms_occupancies': rooms_occu,
+ # 'sessionSeed': '',
+ # 'booked_rooms': booked_rooms,
+ # 'customer_name': partner.name.split(' ')[0],
+ # 'date_arrival': checkin_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
+ # 'status': WUBOOK_STATUS_CONFIRMED,
+ # 'was_modified': 0,
+ # 'channel_reservation_code': crcode,
+ # 'men': max_persons,
+ # 'orig_amount': total_amount,
+ # 'customer_phone': partner.mobile or partner.phone or '',
+ # 'customer_notes': notes,
+ # 'customer_address': partner.street,
+ # 'device': -1,
+ # 'addons_list': [],
+ # 'status_reason': '',
+ # 'roomnight': date_diff-1,
+ # 'boards': '',
+ # 'customer_language': 32,
+ # 'fount': '',
+ # 'channel_data': {},
+ # 'room_opportunities': 0,
+ # 'customer_zip': partner.zip,
+ # 'amount': total_amount,
+ # 'id_woodoo': id_woodoo,
+ # 'cc_info': 1,
+ # 'customer_language_iso': 'es'
+ # }
- if not partner.email or partner.email == '':
- self.raiseException("Partner doesn't have a mail")
+ # def create_wubook_rooms_values(self, rooms, values):
+ # json_data = {}
+ # _logger.info("=== PASA AAA")
+ # _logger.info(values)
+ # for room in rooms:
+ # for cvalue in values:
+ # json_data.setdefault(room.wrid, []).append({
+ # 'closed_arrival': cvalue['closed_arrival'],
+ # 'booked': cvalue['booked'],
+ # 'max_stay_arrival': cvalue['max_stay_arrival'],
+ # 'max_stay': cvalue['max_stay'],
+ # 'price': cvalue['price'],
+ # 'min_stay': cvalue['min_stay'],
+ # 'closed_departure': cvalue['closed_departure'],
+ # 'avail': cvalue['avail'],
+ # 'closed': cvalue['closed'],
+ # 'min_stay_arrival': cvalue['min_stay_arrival'],
+ # 'no_ota': cvalue['no_ota'],
+ # })
+ # return json_data
- now_utc_dt = date_utils.now()
- now_dt = date_utils.dt_as_timezone(now_utc_dt, self.tz_hotel)
- checkin_utc_dt = date_utils.get_datetime(checkin)
- checkin_dt = date_utils.dt_as_timezone(checkin_utc_dt, self.tz_hotel)
- numdays = 0
- for k_room, v_room in rinfo.iteritems():
- numdays = max(len(v_room['dayprices']), numdays)
- checkout_utc_dt = checkin_utc_dt + timedelta(days=numdays)
- checkout_dt = date_utils.dt_as_timezone(checkout_utc_dt, self.tz_hotel)
- date_diff = date_utils.date_diff(checkin_utc_dt, checkout_utc_dt,
- hours=False)
-
- # Generate Day Prices
- dayprices = {}
- total_amount = 0.0
- for k_room, v_room in rinfo.iteritems():
- for price in v_room['dayprices']:
- dayprices.setdefault(k_room, []).append(price)
- total_amount += price
- # Generate Values
- rooms = []
- rooms_occu = []
- booked_rooms = []
- room_type_obj = self.env['hotel.room.type']
- max_persons = 0
- for k_room, v_room in rinfo.iteritems():
- room_type = room_type_obj.search([
- ('wrid', '=', k_room)
- ], limit=1)
- # Generate Rooms
- for price in range(0, len(v_room['occupancy'])):
- rooms.append(k_room)
- # Generate Rooms Occupancies
- for val in v_room['occupancy']:
- # Generate Rooms Occupancies
- rooms_occu.append({
- 'id': k_room,
- 'occupancy': val,
- })
- # Generate Booked Rooms
- roomdays = []
- for k_price, v_price in enumerate(v_room['dayprices']):
- ndate = checkin_dt + timedelta(days=k_price)
- roomdays.append({
- 'ancillary': {},
- 'rate_id': 3,
- 'price': v_price,
- 'day': ndate.strftime(DEFAULT_WUBOOK_DATE_FORMAT)
- })
- booked_rooms.append({
- 'ancillary': {
- 'channel_room_id': 1,
- 'channel_room_name': room_type.name,
- 'addons': [],
- 'guests': val
- },
- 'room_id': k_room,
- 'roomdays': roomdays
- })
- if val > max_persons:
- max_persons = val
-
- return {
- 'id_channel': channel,
- 'special_offer': '',
- 'reservation_code': rcode,
- 'dayprices': dayprices,
- 'arrival_hour': checkin_dt.strftime(DEFAULT_WUBOOK_TIME_FORMAT),
- 'booked_rate': brate,
- 'rooms': ','.join(map(str, rooms)),
- 'customer_mail': partner.email,
- 'customer_country': 'ES',
- 'children': 0,
- 'payment_gateway_fee': '',
- 'modified_reservations': [],
- 'customer_surname': ' '.join(partner.name.split(' ')[1:]),
- 'date_departure': checkout_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
- 'amount_reason': '',
- 'customer_city': partner.city,
- 'opportunities': 0,
- 'date_received': now_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
- 'rooms_occupancies': rooms_occu,
- 'sessionSeed': '',
- 'booked_rooms': booked_rooms,
- 'customer_name': partner.name.split(' ')[0],
- 'date_arrival': checkin_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
- 'status': WUBOOK_STATUS_CONFIRMED,
- 'was_modified': 0,
- 'channel_reservation_code': crcode,
- 'men': max_persons,
- 'orig_amount': total_amount,
- 'customer_phone': partner.mobile or partner.phone or '',
- 'customer_notes': notes,
- 'customer_address': partner.street,
- 'device': -1,
- 'addons_list': [],
- 'status_reason': '',
- 'roomnight': date_diff-1,
- 'boards': '',
- 'customer_language': 32,
- 'fount': '',
- 'channel_data': {},
- 'room_opportunities': 0,
- 'customer_zip': partner.zip,
- 'amount': total_amount,
- 'id_woodoo': id_woodoo,
- 'cc_info': 1,
- 'customer_language_iso': 'es'
- }
-
- def create_wubook_rooms_values(self, rooms, values):
- json_data = {}
- _logger.info("=== PASA AAA")
- _logger.info(values)
- for room in rooms:
- for cvalue in values:
- json_data.setdefault(room.wrid, []).append({
- 'closed_arrival': cvalue['closed_arrival'],
- 'booked': cvalue['booked'],
- 'max_stay_arrival': cvalue['max_stay_arrival'],
- 'max_stay': cvalue['max_stay'],
- 'price': cvalue['price'],
- 'min_stay': cvalue['min_stay'],
- 'closed_departure': cvalue['closed_departure'],
- 'avail': cvalue['avail'],
- 'closed': cvalue['closed'],
- 'min_stay_arrival': cvalue['min_stay_arrival'],
- 'no_ota': cvalue['no_ota'],
- })
- return json_data
-
- def cancel_booking(self, wbooking):
- wbooking['status'] = WUBOOK_STATUS_CANCELLED
- return wbooking
+ # def cancel_booking(self, wbooking):
+ # wbooking['status'] = WUBOOK_STATUS_CANCELLED
+ # return wbooking
@classmethod
def setUpClass(cls):
- super(TestHotelWubook, cls).setUpClass()
+ super().setUpClass()
- # Update Test Virtual Rooms
- cls.hotel_room_type_budget.write({
- 'wcapacity': 1,
- 'wrid': 3000,
- 'wscode': 'T001',
- })
- cls.hotel_room_type_special.write({
- 'wcapacity': 2,
- 'wrid': 3001,
- 'wscode': 'T002',
+ cls.manager_hotel_demo = cls.env.ref('base.user_demo')
+ cls.manager_hotel_demo.groups_id += cls.env.ref('hotel.group_hotel_manager')
+
+ # Create a fake channel connector with WuBook
+ cls.channel_connector_wubook = cls.env['channel.backend'].create({
+ 'version': '1.1',
+ 'lcode': 123456789,
+ 'pkey': 'YourProviderKey',
+ 'server': 'https://wired.wubook.net/xrws/'
})
+ # Update Hotel Test Room Type Records
+ # cls.room_type_0.write({
+ # 'ota_capacity': 2,
+ # 'wrid': 3000,
+ # 'shortname': 'T000',
+ # # }) # formerly named hotel_room_type_budget
+ # cls.room_type_0.write({
+ # 'ota_capacity': 1,
+ # 'wrid': 3001,
+ # 'shortname': 'T001',
+ # }) # formerly named hotel_room_type_budget
+ # cls.room_type_0.write({
+ # 'ota_capacity': 2,
+ # 'wrid': 3002,
+ # 'shortname': 'T002',
+ # }) # formerly named hotel_room_type_special
+
# Update Restriction
- room_type_restr_obj = cls.env['hotel.room.type.restriction']
- default_restriction = room_type_restr_obj.search([
- ('wpid', '=', '0')
- ], limit=1)
- if default_restriction:
- cls.restriction_default_id = default_restriction.id
- else:
- cls.restriction_1.write({
- 'wpid': '0'
- })
- cls.restriction_default_id = cls.restriction_1.id
+ # room_type_restr_obj = cls.env['hotel.room.type.restriction']
+ # default_restriction = room_type_restr_obj.search([
+ # ('wpid', '=', '0')
+ # ], limit=1)
+ # if default_restriction:
+ # cls.restriction_default_id = default_restriction.id
+ # else:
+ # cls.restriction_1.write({
+ # 'wpid': '0'
+ # })
+ # cls.restriction_default_id = cls.restriction_1.id
+
+ # Create Wubook Channel Info
- # Create Some Wubook Info
- cls.wubook_channel_test = cls.env['wubook.channel.info'].create({
- 'wid': 1,
- 'name': 'Channel Test'
- })
@classmethod
def tearDownClass(cls):
# Remove mocks
- cls.env['wubook']._revert_method('create_channel_connector_issue')
- cls.env['wubook']._revert_method('is_valid_account')
- cls.env['wubook']._revert_method('initialize')
- cls.env['wubook']._revert_method('push_activation')
- cls.env['wubook']._revert_method('init_connection')
- cls.env['wubook']._revert_method('close_connection')
- cls.env['wubook']._revert_method('create_room')
- cls.env['wubook']._revert_method('modify_room')
- cls.env['wubook']._revert_method('delete_room')
- cls.env['wubook']._revert_method('import_rooms')
- cls.env['wubook']._revert_method('fetch_rooms_values')
- cls.env['wubook']._revert_method('update_availability')
- cls.env['wubook']._revert_method('corporate_fetch')
- cls.env['wubook']._revert_method('create_reservation')
- cls.env['wubook']._revert_method('cancel_reservation')
- cls.env['wubook']._revert_method('fetch_new_bookings')
- cls.env['wubook']._revert_method('fetch_booking')
- cls.env['wubook']._revert_method('mark_bookings')
- cls.env['wubook']._revert_method('create_plan')
- cls.env['wubook']._revert_method('delete_plan')
- cls.env['wubook']._revert_method('update_plan_name')
- cls.env['wubook']._revert_method('update_plan_prices')
- cls.env['wubook']._revert_method('update_plan_periods')
- cls.env['wubook']._revert_method('import_pricing_plans')
- cls.env['wubook']._revert_method('fetch_plan_prices')
- cls.env['wubook']._revert_method('fetch_all_plan_prices')
- cls.env['wubook']._revert_method('import_restriction_plans')
- cls.env['wubook']._revert_method('fetch_rplan_restrictions')
- cls.env['wubook']._revert_method('update_rplan_values')
- cls.env['wubook']._revert_method('create_rplan')
- cls.env['wubook']._revert_method('rename_rplan')
- cls.env['wubook']._revert_method('delete_rplan')
- cls.env['wubook']._revert_method('import_channels_info')
+ # cls.env['wubook']._revert_method('create_channel_connector_issue')
+ # cls.env['wubook']._revert_method('is_valid_account')
+ # cls.env['wubook']._revert_method('initialize')
+ # cls.env['wubook']._revert_method('push_activation')
+ # cls.env['wubook']._revert_method('init_connection')
+ # cls.env['wubook']._revert_method('close_connection')
+ # cls.env['wubook']._revert_method('create_room')
+ # cls.env['wubook']._revert_method('modify_room')
+ # cls.env['wubook']._revert_method('delete_room')
+ # cls.env['wubook']._revert_method('import_rooms')
+ # cls.env['wubook']._revert_method('fetch_rooms_values')
+ # cls.env['wubook']._revert_method('update_availability')
+ # cls.env['wubook']._revert_method('corporate_fetch')
+ # cls.env['wubook']._revert_method('create_reservation')
+ # cls.env['wubook']._revert_method('cancel_reservation')
+ # cls.env['wubook']._revert_method('fetch_new_bookings')
+ # cls.env['wubook']._revert_method('fetch_booking')
+ # cls.env['wubook']._revert_method('mark_bookings')
+ # cls.env['wubook']._revert_method('create_plan')
+ # cls.env['wubook']._revert_method('delete_plan')
+ # cls.env['wubook']._revert_method('update_plan_name')
+ # cls.env['wubook']._revert_method('update_plan_prices')
+ # cls.env['wubook']._revert_method('update_plan_periods')
+ # cls.env['wubook']._revert_method('import_pricing_plans')
+ # cls.env['wubook']._revert_method('fetch_plan_prices')
+ # cls.env['wubook']._revert_method('fetch_all_plan_prices')
+ # cls.env['wubook']._revert_method('import_restriction_plans')
+ # cls.env['wubook']._revert_method('fetch_rplan_restrictions')
+ # cls.env['wubook']._revert_method('update_rplan_values')
+ # cls.env['wubook']._revert_method('create_rplan')
+ # cls.env['wubook']._revert_method('rename_rplan')
+ # cls.env['wubook']._revert_method('delete_rplan')
+ # cls.env['wubook']._revert_method('import_channels_info')
- super(TestHotelWubook, cls).tearDownClass()
+ super().tearDownClass()
\ No newline at end of file
diff --git a/hotel_channel_connector_wubook/tests/test_channel_hotel_room_type_adapter_model.py b/hotel_channel_connector_wubook/tests/test_channel_hotel_room_type_adapter_model.py
new file mode 100644
index 000000000..553ae18c6
--- /dev/null
+++ b/hotel_channel_connector_wubook/tests/test_channel_hotel_room_type_adapter_model.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2017 Solucións Aloxa S.L.
+# Alexandre Díaz
+#
+#
+# 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 .
+#
+##############################################################################
+from odoo.tools import (
+ DEFAULT_SERVER_DATETIME_FORMAT,
+ DEFAULT_SERVER_DATE_FORMAT)
+from odoo.exceptions import AccessError
+from .common import TestHotelWubook
+
+
+class TestChannelRoomType(TestHotelWubook):
+
+ def test_create_room(self):
+ return True
+
+ def test_fetch_rooms(self):
+ return True
+
+ def test_modify_room(self):
+ return True
+
+ def test_delete_room(self):
+ return True
+
+ # def test_get_capacity(self):
+ # self.assertEqual(self.room_type_0.wcapacity,
+ # 1,
+ # "Invalid wcapacity")
+
+ # def test_check_wcapacity(self):
+ # with self.assertRaises(ValidationError):
+ # self.room_type_0.sudo(self.user_hotel_manager).write({
+ # 'wcapacity': 0
+ # })
+
+ # def test_check_wscode(self):
+ # with self.assertRaises(ValidationError):
+ # self.room_type_0.sudo(self.user_hotel_manager).write({
+ # 'wscode': 'abcdefg'
+ # })
+
+ # def test_get_restrictions(self):
+ # now_utc_dt = date_utils.now()
+ # rests = self.hotel_room_type_budget.sudo(
+ # self.user_hotel_manager).get_restrictions(
+ # now_utc_dt.strftime(
+ # DEFAULT_SERVER_DATE_FORMAT))
+ # self.assertTrue(any(rests), "Restrictions not found")
+
+ # def test_import_rooms(self):
+ # self.room_type_0.sudo(self.user_hotel_manager).import_rooms()
+
+ # def test_create(self):
+ # room_type_obj = self.env['hotel.room.type']
+ # room_type = room_type_obj.sudo(self.user_hotel_manager).create({
+ # 'name': 'Budget Room',
+ # 'virtual_code': '001',
+ # 'list_price': 50,
+ # 'wrid': 1234
+ # })
+ # room_type.unlink()
+
+ # def test_unlink(self):
+ # with self.assertRaises(AccessError):
+ # self.hotel_room_type_simple.sudo(self.manager_hotel_demo).unlink()
diff --git a/hotel_channel_connector_wubook/tests/test_hotel_virtual_room_model.py b/hotel_channel_connector_wubook/tests/test_hotel_virtual_room_model.py
deleted file mode 100644
index 0259f6ca1..000000000
--- a/hotel_channel_connector_wubook/tests/test_hotel_virtual_room_model.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2017 Solucións Aloxa S.L.
-# Alexandre Díaz
-#
-#
-# 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 .
-#
-##############################################################################
-from datetime import timedelta
-from openerp.tools import (
- DEFAULT_SERVER_DATETIME_FORMAT,
- DEFAULT_SERVER_DATE_FORMAT)
-from openerp.exceptions import ValidationError
-from odoo.addons.hotel import date_utils
-from .common import TestHotelWubook
-
-
-class TestHotelVirtualRoom(TestHotelWubook):
-
- def test_get_capacity(self):
- self.assertEqual(self.hotel_room_type_budget.wcapacity,
- 1,
- "Invalid wcapacity")
-
- def test_check_wcapacity(self):
- with self.assertRaises(ValidationError):
- self.hotel_room_type_budget.sudo(self.user_hotel_manager).write({
- 'wcapacity': 0
- })
-
- def test_check_wscode(self):
- with self.assertRaises(ValidationError):
- self.hotel_room_type_budget.sudo(self.user_hotel_manager).write({
- 'wscode': 'abcdefg'
- })
-
- def test_get_restrictions(self):
- now_utc_dt = date_utils.now()
- rests = self.hotel_room_type_budget.sudo(
- self.user_hotel_manager).get_restrictions(
- now_utc_dt.strftime(
- DEFAULT_SERVER_DATE_FORMAT))
- self.assertTrue(any(rests), "Restrictions not found")
-
- def test_import_rooms(self):
- self.hotel_room_type_budget.sudo(self.user_hotel_manager).import_rooms()
-
- def test_create(self):
- room_type_obj = self.env['hotel.room.type']
- room_type = room_type_obj.sudo(self.user_hotel_manager).create({
- 'name': 'Budget Room',
- 'virtual_code': '001',
- 'list_price': 50,
- 'wrid': 1234
- })
- room_type.unlink()
-
- def test_unlink(self):
- self.hotel_room_type_budget.sudo(self.user_hotel_manager).unlink()