mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
Merge branch 'pr_test_connector_wubook' of https://github.com/hootel/hootel into pr_popover_and_cleanup
This commit is contained in:
285
hotel_channel_connector_wubook/tests/README.rst
Normal file
285
hotel_channel_connector_wubook/tests/README.rst
Normal file
@@ -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.
|
||||
@@ -1,2 +1,3 @@
|
||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from . import test_channel_hotel_room_type_adapter_model
|
||||
@@ -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()
|
||||
@@ -0,0 +1,84 @@
|
||||
# -*- 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/>.
|
||||
#
|
||||
##############################################################################
|
||||
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()
|
||||
@@ -1,73 +0,0 @@
|
||||
# -*- 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/>.
|
||||
#
|
||||
##############################################################################
|
||||
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()
|
||||
Reference in New Issue
Block a user