mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP][MIG][11.0] hotel_connector
This commit is contained in:
@@ -7,9 +7,9 @@ class HotelCalendarManagement(models.TransientModel):
|
|||||||
_inherit = 'hotel.calendar.management'
|
_inherit = 'hotel.calendar.management'
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _get_availability_values(self, avail, vroom):
|
def _get_availability_values(self, avail, room_type):
|
||||||
vals = super(HotelCalendarManagement, self)._get_availability_values(
|
vals = super(HotelCalendarManagement, self)._get_availability_values(
|
||||||
avail, vroom)
|
avail, room_type)
|
||||||
vals.update({'wmax_avail': vals['avail']})
|
vals.update({'wmax_avail': vals['avail']})
|
||||||
return vals
|
return vals
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,8 @@
|
|||||||
'summary': "Hotel Channel Connector Base",
|
'summary': "Hotel Channel Connector Base",
|
||||||
'description': "Hotel Channel Connector Base",
|
'description': "Hotel Channel Connector Base",
|
||||||
'depends': [
|
'depends': [
|
||||||
'hotel',
|
|
||||||
'connector',
|
'connector',
|
||||||
|
'hotel',
|
||||||
],
|
],
|
||||||
'external_dependencies': {
|
'external_dependencies': {
|
||||||
'python': ['xmlrpc']
|
'python': ['xmlrpc']
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ class HotelConnectorModelBinder(Component):
|
|||||||
_inherit = ['base.binder', 'base.hotel.channel.connector']
|
_inherit = ['base.binder', 'base.hotel.channel.connector']
|
||||||
_apply_on = [
|
_apply_on = [
|
||||||
'channel.hotel.reservation',
|
'channel.hotel.reservation',
|
||||||
'channel.hotel.virtual.room',
|
'channel.hotel.room.type',
|
||||||
'channel.hotel.room.type.availability',
|
'channel.hotel.room.type.availability',
|
||||||
'channel.hotel.room.type.restriction',
|
'channel.hotel.room.type.restriction',
|
||||||
'channel.product.pricelist',
|
'channel.product.pricelist',
|
||||||
|
|||||||
@@ -23,34 +23,34 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def push_availability(self):
|
def push_availability(self):
|
||||||
vroom_avail_ids = self.env['hotel.room.type.availability'].search([
|
room_type_avail_ids = self.env['hotel.room.type.availability'].search([
|
||||||
('wpushed', '=', False),
|
('wpushed', '=', False),
|
||||||
('date', '>=', date_utils.now(hours=False).strftime(
|
('date', '>=', date_utils.now(hours=False).strftime(
|
||||||
DEFAULT_SERVER_DATE_FORMAT))
|
DEFAULT_SERVER_DATE_FORMAT))
|
||||||
])
|
])
|
||||||
|
|
||||||
vrooms = vroom_avail_ids.mapped('room_type_id')
|
room_types = room_type_avail_ids.mapped('room_type_id')
|
||||||
avails = []
|
avails = []
|
||||||
for vroom in vrooms:
|
for room_type in room_types:
|
||||||
vroom_avails = vroom_avail_ids.filtered(
|
room_type_avails = room_type_avail_ids.filtered(
|
||||||
lambda x: x.room_type_id.id == vroom.id)
|
lambda x: x.room_type_id.id == room_type.id)
|
||||||
days = []
|
days = []
|
||||||
for vroom_avail in vroom_avails:
|
for room_type_avail in room_type_avails:
|
||||||
vroom_avail.with_context({
|
room_type_avail.with_context({
|
||||||
'wubook_action': False}).write({'wpushed': True})
|
'wubook_action': False}).write({'wpushed': True})
|
||||||
wavail = vroom_avail.avail
|
wavail = room_type_avail.avail
|
||||||
if wavail > vroom_avail.wmax_avail:
|
if wavail > room_type_avail.wmax_avail:
|
||||||
wavail = vroom_avail.wmax_avail
|
wavail = room_type_avail.wmax_avail
|
||||||
date_dt = date_utils.get_datetime(
|
date_dt = date_utils.get_datetime(
|
||||||
vroom_avail.date,
|
room_type_avail.date,
|
||||||
dtformat=DEFAULT_SERVER_DATE_FORMAT)
|
dtformat=DEFAULT_SERVER_DATE_FORMAT)
|
||||||
days.append({
|
days.append({
|
||||||
'date': date_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
'date': date_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
||||||
'avail': wavail,
|
'avail': wavail,
|
||||||
'no_ota': vroom_avail.no_ota and 1 or 0,
|
'no_ota': room_type_avail.no_ota and 1 or 0,
|
||||||
# 'booked': vroom_avail.booked and 1 or 0,
|
# 'booked': room_type_avail.booked and 1 or 0,
|
||||||
})
|
})
|
||||||
avails.append({'id': vroom.wrid, 'days': days})
|
avails.append({'id': room_type.wrid, 'days': days})
|
||||||
_logger.info("UPDATING AVAILABILITY IN WUBOOK...")
|
_logger.info("UPDATING AVAILABILITY IN WUBOOK...")
|
||||||
_logger.info(avails)
|
_logger.info(avails)
|
||||||
if any(avails):
|
if any(avails):
|
||||||
@@ -84,19 +84,19 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
[('wpushed', '=', False), ('pricelist_id', '=', pr.id)])
|
[('wpushed', '=', False), ('pricelist_id', '=', pr.id)])
|
||||||
product_tmpl_ids = unpushed_pl.mapped('product_tmpl_id')
|
product_tmpl_ids = unpushed_pl.mapped('product_tmpl_id')
|
||||||
for pt_id in product_tmpl_ids:
|
for pt_id in product_tmpl_ids:
|
||||||
vroom = self.env['hotel.room.type'].search([
|
room_type = self.env['hotel.room.type'].search([
|
||||||
('product_id.product_tmpl_id', '=', pt_id.id)
|
('product_id.product_tmpl_id', '=', pt_id.id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if vroom:
|
if room_type:
|
||||||
prices[pr.wpid].update({vroom.wrid: []})
|
prices[pr.wpid].update({room_type.wrid: []})
|
||||||
for i in range(0, days_diff):
|
for i in range(0, days_diff):
|
||||||
prod = vroom.product_id.with_context({
|
prod = room_type.product_id.with_context({
|
||||||
'quantity': 1,
|
'quantity': 1,
|
||||||
'pricelist': pr.id,
|
'pricelist': pr.id,
|
||||||
'date': (date_start + timedelta(days=i)).
|
'date': (date_start + timedelta(days=i)).
|
||||||
strftime(DEFAULT_SERVER_DATE_FORMAT),
|
strftime(DEFAULT_SERVER_DATE_FORMAT),
|
||||||
})
|
})
|
||||||
prices[pr.wpid][vroom.wrid].append(prod.price)
|
prices[pr.wpid][room_type.wrid].append(prod.price)
|
||||||
_logger.info("UPDATING PRICES IN WUBOOK...")
|
_logger.info("UPDATING PRICES IN WUBOOK...")
|
||||||
_logger.info(prices)
|
_logger.info(prices)
|
||||||
for k_pk, v_pk in prices.iteritems():
|
for k_pk, v_pk in prices.iteritems():
|
||||||
@@ -110,7 +110,7 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def push_restrictions(self):
|
def push_restrictions(self):
|
||||||
vroom_rest_obj = self.env['hotel.room.type.restriction']
|
room_type_rest_obj = self.env['hotel.room.type.restriction']
|
||||||
rest_item_obj = self.env['hotel.room.type.restriction.item']
|
rest_item_obj = self.env['hotel.room.type.restriction.item']
|
||||||
unpushed = rest_item_obj.search([
|
unpushed = rest_item_obj.search([
|
||||||
('wpushed', '=', False),
|
('wpushed', '=', False),
|
||||||
@@ -129,7 +129,7 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
date_end,
|
date_end,
|
||||||
hours=False) + 1
|
hours=False) + 1
|
||||||
restrictions = {}
|
restrictions = {}
|
||||||
restriction_plan_ids = vroom_rest_obj.search([
|
restriction_plan_ids = room_type_rest_obj.search([
|
||||||
('wpid', '!=', False),
|
('wpid', '!=', False),
|
||||||
('active', '=', True)
|
('active', '=', True)
|
||||||
])
|
])
|
||||||
@@ -140,14 +140,14 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
('restriction_id', '=', rp.id)
|
('restriction_id', '=', rp.id)
|
||||||
])
|
])
|
||||||
room_type_ids = unpushed_rp.mapped('room_type_id')
|
room_type_ids = unpushed_rp.mapped('room_type_id')
|
||||||
for vroom in room_type_ids:
|
for room_type in room_type_ids:
|
||||||
restrictions[rp.wpid].update({vroom.wrid: []})
|
restrictions[rp.wpid].update({room_type.wrid: []})
|
||||||
for i in range(0, days_diff):
|
for i in range(0, days_diff):
|
||||||
ndate_dt = date_start + timedelta(days=i)
|
ndate_dt = date_start + timedelta(days=i)
|
||||||
restr = vroom.get_restrictions(
|
restr = room_type.get_restrictions(
|
||||||
ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT))
|
ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT))
|
||||||
if restr:
|
if restr:
|
||||||
restrictions[rp.wpid][vroom.wrid].append({
|
restrictions[rp.wpid][room_type.wrid].append({
|
||||||
'min_stay': restr.min_stay or 0,
|
'min_stay': restr.min_stay or 0,
|
||||||
'min_stay_arrival': restr.min_stay_arrival or 0,
|
'min_stay_arrival': restr.min_stay_arrival or 0,
|
||||||
'max_stay': restr.max_stay or 0,
|
'max_stay': restr.max_stay or 0,
|
||||||
@@ -157,7 +157,7 @@ class HotelChannelConnectorExporter(AbstractComponent):
|
|||||||
'closed_departure': restr.closed_departure and 1 or 0,
|
'closed_departure': restr.closed_departure and 1 or 0,
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
restrictions[rp.wpid][vroom.wrid].append({})
|
restrictions[rp.wpid][room_type.wrid].append({})
|
||||||
_logger.info("UPDATING RESTRICTIONS IN WUBOOK...")
|
_logger.info("UPDATING RESTRICTIONS IN WUBOOK...")
|
||||||
_logger.info(restrictions)
|
_logger.info(restrictions)
|
||||||
for k_res, v_res in restrictions.iteritems():
|
for k_res, v_res in restrictions.iteritems():
|
||||||
|
|||||||
@@ -16,10 +16,10 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
_usage = 'channel.importer'
|
_usage = 'channel.importer'
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _get_room_values_availability(self, vroom_id, date_str, day_vals, set_max_avail):
|
def _get_room_values_availability(self, room_type_id, date_str, day_vals, set_max_avail):
|
||||||
room_type_avail_obj = self.env['hotel.room.type.availability']
|
room_type_avail_obj = self.env['hotel.room.type.availability']
|
||||||
vroom_avail = room_type_avail_obj.search([
|
room_type_avail = room_type_avail_obj.search([
|
||||||
('room_type_id', '=', vroom_id),
|
('room_type_id', '=', room_type_id),
|
||||||
('date', '=', date_str)
|
('date', '=', date_str)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
vals = {
|
vals = {
|
||||||
@@ -30,13 +30,13 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
}
|
}
|
||||||
if set_wmax_avail:
|
if set_wmax_avail:
|
||||||
vals.update({'wmax_avail': day_vals.get('avail', 0)})
|
vals.update({'wmax_avail': day_vals.get('avail', 0)})
|
||||||
if vroom_avail:
|
if room_type_avail:
|
||||||
vroom_avail.with_context({
|
room_type_avail.with_context({
|
||||||
'wubook_action': False,
|
'wubook_action': False,
|
||||||
}).write(vals)
|
}).write(vals)
|
||||||
else:
|
else:
|
||||||
vals.update({
|
vals.update({
|
||||||
'room_type_id': vroom_id,
|
'room_type_id': room_type_id,
|
||||||
'date': date_str,
|
'date': date_str,
|
||||||
})
|
})
|
||||||
room_type_avail_obj.with_context({
|
room_type_avail_obj.with_context({
|
||||||
@@ -45,10 +45,10 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
}).create(vals)
|
}).create(vals)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _get_room_values_restrictions(self, restriction_plan_id, vroom_id, date_str, day_vals):
|
def _get_room_values_restrictions(self, restriction_plan_id, room_type_id, date_str, day_vals):
|
||||||
vroom_restr_item_obj = self.env['hotel.room.type.restriction.item']
|
room_type_restr_item_obj = self.env['hotel.room.type.restriction.item']
|
||||||
vroom_restr = vroom_restr_item_obj.search([
|
room_type_restr = room_type_restr_item_obj.search([
|
||||||
('room_type_id', '=', vroom_id),
|
('room_type_id', '=', room_type_id),
|
||||||
('applied_on', '=', '0_room_type'),
|
('applied_on', '=', '0_room_type'),
|
||||||
('date_start', '=', date_str),
|
('date_start', '=', date_str),
|
||||||
('date_end', '=', date_str),
|
('date_end', '=', date_str),
|
||||||
@@ -72,19 +72,19 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
False)),
|
False)),
|
||||||
'wpushed': True,
|
'wpushed': True,
|
||||||
}
|
}
|
||||||
if vroom_restr:
|
if room_type_restr:
|
||||||
vroom_restr.with_context({
|
room_type_restr.with_context({
|
||||||
'wubook_action': False,
|
'wubook_action': False,
|
||||||
}).write(vals)
|
}).write(vals)
|
||||||
else:
|
else:
|
||||||
vals.update({
|
vals.update({
|
||||||
'restriction_id': restriction_plan_id,
|
'restriction_id': restriction_plan_id,
|
||||||
'room_type_id': vroom_id,
|
'room_type_id': room_type_id,
|
||||||
'date_start': date_str,
|
'date_start': date_str,
|
||||||
'date_end': date_str,
|
'date_end': date_str,
|
||||||
'applied_on': '0_room_type',
|
'applied_on': '0_room_type',
|
||||||
})
|
})
|
||||||
vroom_restr_item_obj.with_context({
|
room_type_restr_item_obj.with_context({
|
||||||
'wubook_action': False,
|
'wubook_action': False,
|
||||||
}).create(vals)
|
}).create(vals)
|
||||||
|
|
||||||
@@ -96,24 +96,24 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
_logger.info("==== ROOM VALUES (%s -- %s)", dfrom, dto)
|
_logger.info("==== ROOM VALUES (%s -- %s)", dfrom, dto)
|
||||||
_logger.info(values)
|
_logger.info(values)
|
||||||
for k_rid, v_rid in values.iteritems():
|
for k_rid, v_rid in values.iteritems():
|
||||||
vroom = hotel_room_type_obj.search([
|
room_type = hotel_room_type_obj.search([
|
||||||
('wrid', '=', k_rid)
|
('wrid', '=', k_rid)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if vroom:
|
if room_type:
|
||||||
date_dt = date_utils.get_datetime(
|
date_dt = date_utils.get_datetime(
|
||||||
dfrom,
|
dfrom,
|
||||||
dtformat=DEFAULT_WUBOOK_DATE_FORMAT)
|
dtformat=DEFAULT_WUBOOK_DATE_FORMAT)
|
||||||
for day_vals in v_rid:
|
for day_vals in v_rid:
|
||||||
date_str = date_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
date_str = date_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||||
self._get_room_values_availability(
|
self._get_room_values_availability(
|
||||||
vroom.id,
|
room_type.id,
|
||||||
date_str,
|
date_str,
|
||||||
day_vals,
|
day_vals,
|
||||||
set_max_avail)
|
set_max_avail)
|
||||||
if def_restr_plan:
|
if def_restr_plan:
|
||||||
self._get_room_values_restrictions(
|
self._get_room_values_restrictions(
|
||||||
def_restr_plan.id,
|
def_restr_plan.id,
|
||||||
vroom.id,
|
room_type.id,
|
||||||
date_str,
|
date_str,
|
||||||
day_vals)
|
day_vals)
|
||||||
date_dt = date_dt + timedelta(days=1)
|
date_dt = date_dt + timedelta(days=1)
|
||||||
@@ -122,7 +122,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
@api.model
|
@api.model
|
||||||
def _generate_booking_vals(self, broom, checkin_str, checkout_str,
|
def _generate_booking_vals(self, broom, checkin_str, checkout_str,
|
||||||
is_cancellation, wchannel_info, wstatus, crcode,
|
is_cancellation, wchannel_info, wstatus, crcode,
|
||||||
rcode, vroom, split_booking, dates_checkin,
|
rcode, room_type, split_booking, dates_checkin,
|
||||||
dates_checkout, book):
|
dates_checkout, book):
|
||||||
# Generate Reservation Day Lines
|
# Generate Reservation Day Lines
|
||||||
reservation_line_ids = []
|
reservation_line_ids = []
|
||||||
@@ -142,7 +142,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
'price': brday['price']
|
'price': brday['price']
|
||||||
}))
|
}))
|
||||||
tprice += brday['price']
|
tprice += brday['price']
|
||||||
persons = vroom.wcapacity
|
persons = room_type.wcapacity
|
||||||
if 'ancillary' in broom and 'guests' in broom['ancillary']:
|
if 'ancillary' in broom and 'guests' in broom['ancillary']:
|
||||||
persons = broom['ancillary']['guests']
|
persons = broom['ancillary']['guests']
|
||||||
vals = {
|
vals = {
|
||||||
@@ -159,7 +159,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
'wstatus': wstatus,
|
'wstatus': wstatus,
|
||||||
'to_read': True,
|
'to_read': True,
|
||||||
'state': is_cancellation and 'cancelled' or 'draft',
|
'state': is_cancellation and 'cancelled' or 'draft',
|
||||||
'room_type_id': vroom.id,
|
'room_type_id': room_type.id,
|
||||||
'splitted': split_booking,
|
'splitted': split_booking,
|
||||||
'wbook_json': json.dumps(book),
|
'wbook_json': json.dumps(book),
|
||||||
'wmodified': book['was_modified']
|
'wmodified': book['was_modified']
|
||||||
@@ -203,7 +203,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
res_partner_obj = self.env['res.partner']
|
res_partner_obj = self.env['res.partner']
|
||||||
hotel_reserv_obj = self.env['hotel.reservation']
|
hotel_reserv_obj = self.env['hotel.reservation']
|
||||||
hotel_folio_obj = self.env['hotel.folio']
|
hotel_folio_obj = self.env['hotel.folio']
|
||||||
hotel_vroom_obj = self.env['hotel.room.type']
|
hotel_room_type_obj = self.env['hotel.room.type']
|
||||||
# Space for store some data for construct folios
|
# Space for store some data for construct folios
|
||||||
processed_rids = []
|
processed_rids = []
|
||||||
failed_reservations = []
|
failed_reservations = []
|
||||||
@@ -319,13 +319,13 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
used_rooms = []
|
used_rooms = []
|
||||||
# Iterate booked rooms
|
# Iterate booked rooms
|
||||||
for broom in book['booked_rooms']:
|
for broom in book['booked_rooms']:
|
||||||
vroom = hotel_vroom_obj.search([
|
room_type = hotel_room_type_obj.search([
|
||||||
('wrid', '=', broom['room_id'])
|
('wrid', '=', broom['room_id'])
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if not vroom:
|
if not room_type:
|
||||||
self.create_channel_connector_issue(
|
self.create_channel_connector_issue(
|
||||||
'reservation',
|
'reservation',
|
||||||
"Can't found any virtual room associated to '%s' \
|
"Can't found any room type associated to '%s' \
|
||||||
in this hotel" % book['rooms'],
|
in this hotel" % book['rooms'],
|
||||||
'', wid=book['reservation_code'])
|
'', wid=book['reservation_code'])
|
||||||
failed_reservations.append(crcode)
|
failed_reservations.append(crcode)
|
||||||
@@ -350,7 +350,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
bstatus,
|
bstatus,
|
||||||
crcode,
|
crcode,
|
||||||
rcode,
|
rcode,
|
||||||
vroom,
|
room_type,
|
||||||
split_booking,
|
split_booking,
|
||||||
dates_checkin,
|
dates_checkin,
|
||||||
dates_checkout,
|
dates_checkout,
|
||||||
@@ -362,10 +362,10 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
"Invalid reservation total price! %.2f != %.2f" % (vals['price_unit'], book['amount']),
|
"Invalid reservation total price! %.2f != %.2f" % (vals['price_unit'], book['amount']),
|
||||||
'', wid=book['reservation_code'])
|
'', wid=book['reservation_code'])
|
||||||
|
|
||||||
free_rooms = hotel_vroom_obj.check_availability_room(
|
free_rooms = hotel_room_type_obj.check_availability_room(
|
||||||
checkin_str,
|
checkin_str,
|
||||||
checkout_str,
|
checkout_str,
|
||||||
room_type_id=vroom.id,
|
room_type_id=room_type.id,
|
||||||
notthis=used_rooms)
|
notthis=used_rooms)
|
||||||
if any(free_rooms):
|
if any(free_rooms):
|
||||||
vals.update({
|
vals.update({
|
||||||
@@ -407,7 +407,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
bstatus,
|
bstatus,
|
||||||
crcode,
|
crcode,
|
||||||
rcode,
|
rcode,
|
||||||
vroom,
|
room_type,
|
||||||
False,
|
False,
|
||||||
(checkin_utc_dt, False),
|
(checkin_utc_dt, False),
|
||||||
(checkout_utc_dt, False),
|
(checkout_utc_dt, False),
|
||||||
@@ -415,8 +415,8 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
)
|
)
|
||||||
vals.update({
|
vals.update({
|
||||||
'product_id':
|
'product_id':
|
||||||
vroom.room_ids[0].product_id.id,
|
room_type.room_ids[0].product_id.id,
|
||||||
'name': vroom.name,
|
'name': room_type.name,
|
||||||
'overbooking': True,
|
'overbooking': True,
|
||||||
})
|
})
|
||||||
reservations.append((0, False, vals))
|
reservations.append((0, False, vals))
|
||||||
@@ -497,7 +497,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
|
|
||||||
vals = {
|
vals = {
|
||||||
'name': plan['name'],
|
'name': plan['name'],
|
||||||
'wdaily': plan['daily'] == 1,
|
'is_daily_plan': plan['daily'] == 1,
|
||||||
}
|
}
|
||||||
plan_id = product_listprice_obj.search([
|
plan_id = product_listprice_obj.search([
|
||||||
('wpid', '=', str(plan['id']))
|
('wpid', '=', str(plan['id']))
|
||||||
@@ -527,10 +527,10 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
for i in range(0, days_diff):
|
for i in range(0, days_diff):
|
||||||
ndate_dt = dfrom_dt + timedelta(days=i)
|
ndate_dt = dfrom_dt + timedelta(days=i)
|
||||||
for k_rid, v_rid in plan_prices.iteritems():
|
for k_rid, v_rid in plan_prices.iteritems():
|
||||||
vroom = hotel_room_type_obj.search([
|
room_type = hotel_room_type_obj.search([
|
||||||
('wrid', '=', k_rid)
|
('wrid', '=', k_rid)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if vroom:
|
if room_type:
|
||||||
pricelist_item = pricelist_item_obj.search([
|
pricelist_item = pricelist_item_obj.search([
|
||||||
('pricelist_id', '=', pricelist.id),
|
('pricelist_id', '=', pricelist.id),
|
||||||
('date_start', '=', ndate_dt.strftime(
|
('date_start', '=', ndate_dt.strftime(
|
||||||
@@ -539,7 +539,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
DEFAULT_SERVER_DATE_FORMAT)),
|
DEFAULT_SERVER_DATE_FORMAT)),
|
||||||
('compute_price', '=', 'fixed'),
|
('compute_price', '=', 'fixed'),
|
||||||
('applied_on', '=', '1_product'),
|
('applied_on', '=', '1_product'),
|
||||||
('product_tmpl_id', '=', vroom.product_id.product_tmpl_id.id)
|
('product_tmpl_id', '=', room_type.product_id.product_tmpl_id.id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
vals = {
|
vals = {
|
||||||
'fixed_price': plan_prices[k_rid][i],
|
'fixed_price': plan_prices[k_rid][i],
|
||||||
@@ -557,7 +557,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
DEFAULT_SERVER_DATE_FORMAT),
|
DEFAULT_SERVER_DATE_FORMAT),
|
||||||
'compute_price': 'fixed',
|
'compute_price': 'fixed',
|
||||||
'applied_on': '1_product',
|
'applied_on': '1_product',
|
||||||
'product_tmpl_id': vroom.product_id.product_tmpl_id.id
|
'product_tmpl_id': room_type.product_id.product_tmpl_id.id
|
||||||
})
|
})
|
||||||
pricelist_item_obj.with_context({
|
pricelist_item_obj.with_context({
|
||||||
'wubook_action': False}).create(vals)
|
'wubook_action': False}).create(vals)
|
||||||
@@ -600,10 +600,10 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
], limit=1)
|
], limit=1)
|
||||||
if restriction_id:
|
if restriction_id:
|
||||||
for k_rid, v_rid in v_rpid.iteritems():
|
for k_rid, v_rid in v_rpid.iteritems():
|
||||||
vroom = hotel_room_type_obj.search([
|
room_type = hotel_room_type_obj.search([
|
||||||
('wrid', '=', k_rid)
|
('wrid', '=', k_rid)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if vroom:
|
if room_type:
|
||||||
for item in v_rid:
|
for item in v_rid:
|
||||||
date_dt = date_utils.get_datetime(
|
date_dt = date_utils.get_datetime(
|
||||||
item['date'],
|
item['date'],
|
||||||
@@ -615,7 +615,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
('date_end', '=', date_dt.strftime(
|
('date_end', '=', date_dt.strftime(
|
||||||
DEFAULT_SERVER_DATE_FORMAT)),
|
DEFAULT_SERVER_DATE_FORMAT)),
|
||||||
('applied_on', '=', '0_room_type'),
|
('applied_on', '=', '0_room_type'),
|
||||||
('room_type_id', '=', vroom.id)
|
('room_type_id', '=', room_type.id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
vals = {
|
vals = {
|
||||||
'closed_arrival': item['closed_arrival'],
|
'closed_arrival': item['closed_arrival'],
|
||||||
@@ -638,7 +638,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
'date_end': date_dt.strftime(
|
'date_end': date_dt.strftime(
|
||||||
DEFAULT_SERVER_DATE_FORMAT),
|
DEFAULT_SERVER_DATE_FORMAT),
|
||||||
'applied_on': '0_room_type',
|
'applied_on': '0_room_type',
|
||||||
'room_type_id': vroom.id
|
'room_type_id': room_type.id
|
||||||
})
|
})
|
||||||
restriction_item_obj.with_context({
|
restriction_item_obj.with_context({
|
||||||
'wubook_action': False}).create(vals)
|
'wubook_action': False}).create(vals)
|
||||||
@@ -673,7 +673,7 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
try:
|
try:
|
||||||
results = self.backend_adapter.fetch_rooms()
|
results = self.backend_adapter.fetch_rooms()
|
||||||
|
|
||||||
vroom_obj = self.env['hotel.room.type']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
count = len(results)
|
count = len(results)
|
||||||
for room in results:
|
for room in results:
|
||||||
vals = {
|
vals = {
|
||||||
@@ -684,11 +684,11 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
|||||||
'wcapacity': room['occupancy'],
|
'wcapacity': room['occupancy'],
|
||||||
# 'max_real_rooms': room['availability'],
|
# 'max_real_rooms': room['availability'],
|
||||||
}
|
}
|
||||||
vroom = vroom_obj.search([('wrid', '=', room['id'])], limit=1)
|
room_type = room_type_obj.search([('wrid', '=', room['id'])], limit=1)
|
||||||
if vroom:
|
if room_type:
|
||||||
vroom.with_context({'wubook_action': False}).write(vals)
|
room_type.with_context({'wubook_action': False}).write(vals)
|
||||||
else:
|
else:
|
||||||
vroom_obj.with_context({'wubook_action': False}).create(vals)
|
room_type_obj.with_context({'wubook_action': False}).create(vals)
|
||||||
except ValidationError:
|
except ValidationError:
|
||||||
self.create_issue('room', _("Can't import rooms from WuBook"), results)
|
self.create_issue('room', _("Can't import rooms from WuBook"), results)
|
||||||
|
|
||||||
|
|||||||
@@ -84,8 +84,8 @@ class website_wubook(http.Controller):
|
|||||||
parity_restr_id = request.env['ir.default'].sudo().get(
|
parity_restr_id = request.env['ir.default'].sudo().get(
|
||||||
'res.config.settings', 'parity_restrictions_id')
|
'res.config.settings', 'parity_restrictions_id')
|
||||||
if parity_restr_id:
|
if parity_restr_id:
|
||||||
vroom_restr_obj = request.env['hotel.room.type.restriction']
|
room_type_restr_obj = request.env['hotel.room.type.restriction']
|
||||||
restr_id = vroom_restr_obj.sudo().browse(int(parity_restr_id))
|
restr_id = room_type_restr_obj.sudo().browse(int(parity_restr_id))
|
||||||
if restr_id and restr_id.wpid and restr_id.wpid != '0':
|
if restr_id and restr_id.wpid and restr_id.wpid != '0':
|
||||||
wubook_obj.fetch_rplan_restrictions(dfrom, dto,
|
wubook_obj.fetch_rplan_restrictions(dfrom, dto,
|
||||||
rpid=restr_id.wpid)
|
rpid=restr_id.wpid)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields, _
|
||||||
|
from odoo.exceptions import ValidationError, UserError
|
||||||
from odoo.addons.queue_job.job import job, related_action
|
from odoo.addons.queue_job.job import job, related_action
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
from odoo.addons.component_event import skip_if
|
from odoo.addons.component_event import skip_if
|
||||||
@@ -45,10 +46,14 @@ class ChannelHotelReservation(models.Model):
|
|||||||
default='0',
|
default='0',
|
||||||
readonly=True)
|
readonly=True)
|
||||||
wstatus_reason = fields.Char("WuBook Status Reason", readonly=True)
|
wstatus_reason = fields.Char("WuBook Status Reason", readonly=True)
|
||||||
customer_notes = fields.Text(related='folio_id.customer_notes',
|
|
||||||
old_name='wcustomer_notes')
|
|
||||||
wmodified = fields.Boolean("WuBook Modified", readonly=True, default=False)
|
wmodified = fields.Boolean("WuBook Modified", readonly=True, default=False)
|
||||||
|
|
||||||
|
@api.depends('channel_reservation_id', 'ota_id')
|
||||||
|
def _is_from_ota(self):
|
||||||
|
for record in self:
|
||||||
|
record.odoo_id.is_from_ota = (record.channel_reservation_id and \
|
||||||
|
record.ota_id)
|
||||||
|
|
||||||
@job(default_channel='root.channel')
|
@job(default_channel='root.channel')
|
||||||
@related_action(action='related_action_unwrap_binding')
|
@related_action(action='related_action_unwrap_binding')
|
||||||
@api.multi
|
@api.multi
|
||||||
@@ -77,26 +82,21 @@ class ChannelHotelReservation(models.Model):
|
|||||||
class HotelReservation(models.Model):
|
class HotelReservation(models.Model):
|
||||||
_inherit = 'hotel.reservation'
|
_inherit = 'hotel.reservation'
|
||||||
|
|
||||||
@api.depends('channel_bind_ids.channel_reservation_id', 'channel_bind_ids.ota_id')
|
|
||||||
def _is_from_ota(self):
|
|
||||||
for record in self:
|
|
||||||
record.is_from_ota = (record.channel_bind_ids.channel_reservation_id and \
|
|
||||||
record.channel_bind_ids.ota_id)
|
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def _set_access_for_wubook_fields(self):
|
def _set_access_for_wubook_fields(self):
|
||||||
for rec in self:
|
for record in self:
|
||||||
user = self.env['res.users'].browse(self.env.uid)
|
user = self.env['res.users'].browse(self.env.uid)
|
||||||
rec.able_to_modify_channel = user.has_group('base.group_system')
|
record.able_to_modify_channel = user.has_group('base.group_system')
|
||||||
|
|
||||||
is_from_ota = fields.Boolean('Is From OTA',
|
is_from_ota = fields.Boolean('Is From OTA',
|
||||||
compute=_is_from_ota, store=False,
|
|
||||||
readonly=True,
|
readonly=True,
|
||||||
old_name='wis_from_channel')
|
old_name='wis_from_channel')
|
||||||
able_to_modify_channel = fields.Boolean(compute=_set_access_for_wubook_fields,
|
able_to_modify_channel = fields.Boolean(compute=_set_access_for_wubook_fields,
|
||||||
string='Is user able to modify wubook fields?',
|
string='Is user able to modify wubook fields?',
|
||||||
old_name='able_to_modify_wubook')
|
old_name='able_to_modify_wubook')
|
||||||
to_read = fields.Boolean('To Read', default=False)
|
to_read = fields.Boolean('To Read', default=False)
|
||||||
|
customer_notes = fields.Text(related='folio_id.customer_notes',
|
||||||
|
old_name='wcustomer_notes')
|
||||||
|
|
||||||
@api.depends('channel_type', 'ota_id')
|
@api.depends('channel_type', 'ota_id')
|
||||||
def _get_origin_sale(self):
|
def _get_origin_sale(self):
|
||||||
@@ -133,7 +133,6 @@ class HotelReservation(models.Model):
|
|||||||
@api.multi
|
@api.multi
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
if self._context.get('wubook_action', True) and \
|
if self._context.get('wubook_action', True) and \
|
||||||
self.env['wubook'].is_valid_account() and \
|
|
||||||
(vals.get('checkin') or vals.get('checkout') or
|
(vals.get('checkin') or vals.get('checkout') or
|
||||||
vals.get('product_id') or vals.get('state')):
|
vals.get('product_id') or vals.get('state')):
|
||||||
older_vals = []
|
older_vals = []
|
||||||
@@ -155,13 +154,13 @@ class HotelReservation(models.Model):
|
|||||||
|
|
||||||
res = super(HotelReservation, self).write(vals)
|
res = super(HotelReservation, self).write(vals)
|
||||||
|
|
||||||
vroom_avail_obj = self.env['hotel.room.type.availability']
|
room_type_avail_obj = self.env['hotel.room.type.availability']
|
||||||
for i in range(0, len(older_vals)):
|
for i in range(0, len(older_vals)):
|
||||||
vroom_avail_obj.refresh_availability(
|
room_type_avail_obj.refresh_availability(
|
||||||
older_vals[i]['checkin'],
|
older_vals[i]['checkin'],
|
||||||
older_vals[i]['checkout'],
|
older_vals[i]['checkout'],
|
||||||
older_vals[i]['product_id'])
|
older_vals[i]['product_id'])
|
||||||
vroom_avail_obj.refresh_availability(
|
room_type_avail_obj.refresh_availability(
|
||||||
new_vals[i]['checkin'],
|
new_vals[i]['checkin'],
|
||||||
new_vals[i]['checkout'],
|
new_vals[i]['checkout'],
|
||||||
new_vals[i]['product_id'])
|
new_vals[i]['product_id'])
|
||||||
@@ -181,11 +180,10 @@ class HotelReservation(models.Model):
|
|||||||
'product_id': record.product_id.id,
|
'product_id': record.product_id.id,
|
||||||
})
|
})
|
||||||
res = super(HotelReservation, self).unlink()
|
res = super(HotelReservation, self).unlink()
|
||||||
if self._context.get('wubook_action', True) and \
|
if self._context.get('wubook_action', True):
|
||||||
self.env['wubook'].is_valid_account():
|
room_type_avail_obj = self.env['hotel.room.type.availability']
|
||||||
vroom_avail_obj = self.env['hotel.room.type.availability']
|
|
||||||
for record in vals:
|
for record in vals:
|
||||||
vroom_avail_obj.refresh_availability(
|
room_type_avail_obj.refresh_availability(
|
||||||
record['checkin'],
|
record['checkin'],
|
||||||
record['checkout'],
|
record['checkout'],
|
||||||
record['product_id'])
|
record['product_id'])
|
||||||
@@ -204,7 +202,7 @@ class HotelReservation(models.Model):
|
|||||||
self.write({'to_read': True, 'to_assign': True})
|
self.write({'to_read': True, 'to_assign': True})
|
||||||
|
|
||||||
res = super(HotelReservation, self).action_cancel()
|
res = super(HotelReservation, self).action_cancel()
|
||||||
if waction and self.env['wubook'].is_valid_account():
|
if waction:
|
||||||
partner_id = self.env['res.users'].browse(self.env.uid).partner_id
|
partner_id = self.env['res.users'].browse(self.env.uid).partner_id
|
||||||
for record in self:
|
for record in self:
|
||||||
# Only can cancel reservations created directly in wubook
|
# Only can cancel reservations created directly in wubook
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields, _
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.addons.queue_job.job import job, related_action
|
from odoo.addons.queue_job.job import job, related_action
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
from odoo.addons.component_event import skip_if
|
from odoo.addons.component_event import skip_if
|
||||||
@@ -12,12 +13,6 @@ class ChannelHotelRoomType(models.Model):
|
|||||||
_inherits = {'hotel.room.type': 'odoo_id'}
|
_inherits = {'hotel.room.type': 'odoo_id'}
|
||||||
_description = 'Channel Hotel Room'
|
_description = 'Channel Hotel Room'
|
||||||
|
|
||||||
@api.depends('ota_capacity')
|
|
||||||
@api.onchange('room_ids', 'room_type_ids')
|
|
||||||
def _get_capacity(self):
|
|
||||||
for rec in self:
|
|
||||||
rec.ota_capacity = rec.get_capacity()
|
|
||||||
|
|
||||||
odoo_id = fields.Many2one(comodel_names='hotel.room.type',
|
odoo_id = fields.Many2one(comodel_names='hotel.room.type',
|
||||||
string='Room Type',
|
string='Room Type',
|
||||||
required=True,
|
required=True,
|
||||||
@@ -55,7 +50,7 @@ class ChannelHotelRoomType(models.Model):
|
|||||||
self.name,
|
self.name,
|
||||||
self.ota_capacity,
|
self.ota_capacity,
|
||||||
self.list_price,
|
self.list_price,
|
||||||
self.max_real_rooms)
|
self.total_rooms_count)
|
||||||
if channel_room_id:
|
if channel_room_id:
|
||||||
self.write({
|
self.write({
|
||||||
'channel_room_id': channel_room_id,
|
'channel_room_id': channel_room_id,
|
||||||
@@ -78,7 +73,7 @@ class ChannelHotelRoomType(models.Model):
|
|||||||
self.name,
|
self.name,
|
||||||
self.ota_capacity,
|
self.ota_capacity,
|
||||||
self.list_price,
|
self.list_price,
|
||||||
self.max_real_rooms,
|
self.total_rooms_count,
|
||||||
self.channel_short_code)
|
self.channel_short_code)
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
self.create_issue('room', "Can't modify room on channel", "sss")
|
self.create_issue('room', "Can't modify room on channel", "sss")
|
||||||
@@ -112,6 +107,10 @@ class HotelRoomType(models.Model):
|
|||||||
inverse_name='odoo_id',
|
inverse_name='odoo_id',
|
||||||
string='Hotel Channel Connector Bindings')
|
string='Hotel Channel Connector Bindings')
|
||||||
|
|
||||||
|
@api.onchange('room_ids')
|
||||||
|
def _get_capacity(self):
|
||||||
|
for rec in self:
|
||||||
|
rec.channel_bind_ids.ota_capacity = rec.get_capacity()
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def get_restrictions(self, date):
|
def get_restrictions(self, date):
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
|
from datetime import timedelta
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields
|
||||||
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.addons.queue_job.job import job, related_action
|
from odoo.addons.queue_job.job import job, related_action
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
from odoo.addons.component_event import skip_if
|
from odoo.addons.component_event import skip_if
|
||||||
|
from odoo.addons.hotel_channel_connector.components.backend_adapter import (
|
||||||
|
DEFAULT_WUBOOK_DATE_FORMAT)
|
||||||
|
|
||||||
class ChannelHotelRoomTypeAvailability(models.Model):
|
class ChannelHotelRoomTypeAvailability(models.Model):
|
||||||
_name = 'channel.hotel.room.type.availability'
|
_name = 'channel.hotel.room.type.availability'
|
||||||
@@ -14,8 +19,8 @@ class ChannelHotelRoomTypeAvailability(models.Model):
|
|||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _default_channel_max_avail(self):
|
def _default_channel_max_avail(self):
|
||||||
if self.room_type_id:
|
if self.odoo_id.room_type_id:
|
||||||
return self.room_type_id.max_real_rooms
|
return self.odoo_id.room_type_id.total_rooms_count
|
||||||
return -1
|
return -1
|
||||||
|
|
||||||
odoo_id = fields.Many2one(comodel_names='product.pricelist',
|
odoo_id = fields.Many2one(comodel_names='product.pricelist',
|
||||||
@@ -31,10 +36,10 @@ class ChannelHotelRoomTypeAvailability(models.Model):
|
|||||||
@api.constrains('channel_max_avail')
|
@api.constrains('channel_max_avail')
|
||||||
def _check_wmax_avail(self):
|
def _check_wmax_avail(self):
|
||||||
for record in self:
|
for record in self:
|
||||||
if record.channel_max_avail > record.room_type_id.total_rooms_count:
|
if record.channel_max_avail > record.odoo_id.room_type_id.total_rooms_count:
|
||||||
raise ValidationError(_("max avail for channel can't be high \
|
raise ValidationError(_("max avail for channel can't be high \
|
||||||
than toal rooms \
|
than toal rooms \
|
||||||
count: %d") % record.room_type_id.total_rooms_count)
|
count: %d") % record.odoo_id.room_type_id.total_rooms_count)
|
||||||
|
|
||||||
@job(default_channel='root.channel')
|
@job(default_channel='root.channel')
|
||||||
@related_action(action='related_action_unwrap_binding')
|
@related_action(action='related_action_unwrap_binding')
|
||||||
@@ -44,12 +49,12 @@ class ChannelHotelRoomTypeAvailability(models.Model):
|
|||||||
if self._context.get('channel_action', True):
|
if self._context.get('channel_action', True):
|
||||||
with self.backend_id.work_on(self._name) as work:
|
with self.backend_id.work_on(self._name) as work:
|
||||||
adapter = work.component(usage='backend.adapter')
|
adapter = work.component(usage='backend.adapter')
|
||||||
date_dt = date_utils.get_datetime(self.date)
|
date_dt = fields.Date.from_string(self.date)
|
||||||
adapter.update_availability([{
|
adapter.update_availability([{
|
||||||
'id': self.room_type_id.channel_room_id,
|
'id': self.odoo_id.room_type_id.channel_room_id,
|
||||||
'days': [{
|
'days': [{
|
||||||
'date': date_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
'date': date_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
||||||
'avail': self.avail,
|
'avail': self.odoo_id.avail,
|
||||||
}],
|
}],
|
||||||
}])
|
}])
|
||||||
|
|
||||||
@@ -63,10 +68,10 @@ class HotelRoomTypeAvailability(models.Model):
|
|||||||
|
|
||||||
@api.constrains('avail')
|
@api.constrains('avail')
|
||||||
def _check_avail(self):
|
def _check_avail(self):
|
||||||
vroom_obj = self.env['hotel.virtual.room']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
issue_obj = self.env['hotel.channel.connector.issue']
|
issue_obj = self.env['hotel.channel.connector.issue']
|
||||||
for record in self:
|
for record in self:
|
||||||
cavail = len(vroom_obj.check_availability_room(
|
cavail = len(room_type_obj.check_availability_room(
|
||||||
record.date,
|
record.date,
|
||||||
record.date,
|
record.date,
|
||||||
room_type_id=record.room_type_id.id))
|
room_type_id=record.room_type_id.id))
|
||||||
@@ -79,60 +84,61 @@ class HotelRoomTypeAvailability(models.Model):
|
|||||||
\n[%s]\nInput: %d\Limit: %d") % (record.room_type_id.name,
|
\n[%s]\nInput: %d\Limit: %d") % (record.room_type_id.name,
|
||||||
record.avail,
|
record.avail,
|
||||||
record),
|
record),
|
||||||
'wid': record.room_type_id.wrid,
|
'channel_id': record.room_type_id.channel_bind_ids[0].channel_plan_id,
|
||||||
'date_start': record.date,
|
'date_start': record.date,
|
||||||
'date_end': record.date,
|
'date_end': record.date,
|
||||||
})
|
})
|
||||||
# Auto-Fix wubook availability
|
# Auto-Fix wubook availability
|
||||||
self._event('on_fix_channel_availability').notify(record)
|
self._event('on_fix_channel_availability').notify(record)
|
||||||
return super(HotelVirtualRoomAvailability, self)._check_avail()
|
return super(HotelRoomTypeAvailability, self)._check_avail()
|
||||||
|
|
||||||
@api.onchange('room_type_id')
|
@api.onchange('room_type_id')
|
||||||
def onchange_room_type_id(self):
|
def onchange_room_type_id(self):
|
||||||
if self.room_type_id:
|
if self.room_type_id:
|
||||||
self.channel_max_avail = self.room_type_id.max_real_rooms
|
self.channel_max_avail = self.room_type_id.total_rooms_count
|
||||||
|
|
||||||
@api.multi
|
@api.multi
|
||||||
def write(self, vals):
|
def write(self, vals):
|
||||||
if self._context.get('channel_action', True):
|
if self._context.get('channel_action', True):
|
||||||
vals.update({'channel_pushed': False})
|
vals.update({'channel_pushed': False})
|
||||||
return super(HotelVirtualRoomAvailability, self).write(vals)
|
return super(HotelRoomTypeAvailability, self).write(vals)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def refresh_availability(self, checkin, checkout, product_id):
|
def refresh_availability(self, checkin, checkout, product_id):
|
||||||
date_start = date_utils.get_datetime(checkin)
|
date_start = fields.Date.from_string(checkin)
|
||||||
|
date_end = fields.Date.from_string(checkout)
|
||||||
# Not count end day of the reservation
|
# Not count end day of the reservation
|
||||||
date_diff = date_utils.date_diff(checkin, checkout, hours=False)
|
date_diff = (date_end - date_start).days
|
||||||
|
|
||||||
vroom_obj = self.env['hotel.virtual.room']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
room_type_avail_obj = self.env['hotel.room.type.availability']
|
room_type_avail_obj = self.env['hotel.room.type.availability']
|
||||||
|
|
||||||
vrooms = vroom_obj.search([
|
room_types = room_type_obj.search([
|
||||||
('room_ids.product_id', '=', product_id)
|
('room_ids.product_id', '=', product_id)
|
||||||
])
|
])
|
||||||
for vroom in vrooms:
|
for room_type in room_types:
|
||||||
if vroom.channel_room_id:
|
if room_type.channel_room_id:
|
||||||
for i in range(0, date_diff):
|
for i in range(0, date_diff):
|
||||||
ndate_dt = date_start + timedelta(days=i)
|
ndate_dt = date_start + timedelta(days=i)
|
||||||
ndate_str = ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
ndate_str = ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||||
avail = len(vroom_obj.check_availability_room(
|
avail = len(room_type_obj.check_availability_room(
|
||||||
ndate_str,
|
ndate_str,
|
||||||
ndate_str,
|
ndate_str,
|
||||||
room_type_id=vroom.id))
|
room_type_id=room_type.id))
|
||||||
max_avail = vroom.max_real_rooms
|
max_avail = room_type.total_rooms_count
|
||||||
vroom_avail_id = room_type_avail_obj.search([
|
room_type_avail_id = room_type_avail_obj.search([
|
||||||
('room_type_id', '=', vroom.id),
|
('room_type_id', '=', room_type.id),
|
||||||
('date', '=', ndate_str)], limit=1)
|
('date', '=', ndate_str)], limit=1)
|
||||||
if vroom_avail_id and vroom_avail_id.channel_max_avail >= 0:
|
if room_type_avail_id and room_type_avail_id.channel_max_avail >= 0:
|
||||||
max_avail = vroom_avail_id.channel_max_avail
|
max_avail = room_type_avail_id.channel_max_avail
|
||||||
avail = max(
|
avail = max(
|
||||||
min(avail, vroom.total_rooms_count, max_avail), 0)
|
min(avail, room_type.total_rooms_count, max_avail), 0)
|
||||||
|
|
||||||
if vroom_avail_id:
|
if room_type_avail_id:
|
||||||
vroom_avail_id.write({'avail': avail})
|
room_type_avail_id.write({'avail': avail})
|
||||||
else:
|
else:
|
||||||
room_type_avail_obj.create({
|
room_type_avail_obj.create({
|
||||||
'room_type_id': vroom.id,
|
'room_type_id': room_type.id,
|
||||||
'date': ndate_str,
|
'date': ndate_str,
|
||||||
'avail': avail,
|
'avail': avail,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.addons.queue_job.job import job, related_action
|
from odoo.addons.queue_job.job import job, related_action
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
from odoo.addons.component_event import skip_if
|
from odoo.addons.component_event import skip_if
|
||||||
@@ -43,9 +44,7 @@ class ChannelHotelRoomTypeRestriction(models.Model):
|
|||||||
with self.backend_id.work_on(self._name) as work:
|
with self.backend_id.work_on(self._name) as work:
|
||||||
adapter = work.component(usage='backend.adapter')
|
adapter = work.component(usage='backend.adapter')
|
||||||
try:
|
try:
|
||||||
adapter.rename_rplan(
|
adapter.rename_rplan(self.channel_plan_id, self.name)
|
||||||
self.channel_plan_id,
|
|
||||||
self.name)
|
|
||||||
except ValidationError as e:
|
except ValidationError as e:
|
||||||
self.create_issue('room', "Can't update restriction plan name on channel", "sss")
|
self.create_issue('room', "Can't update restriction plan name on channel", "sss")
|
||||||
|
|
||||||
@@ -81,12 +80,12 @@ class HotelRoomTypeRestriction(models.Model):
|
|||||||
@api.multi
|
@api.multi
|
||||||
@api.depends('name')
|
@api.depends('name')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
vroom_restriction_obj = self.env['hotel.room.type.restriction']
|
room_type_restriction_obj = self.env['hotel.room.type.restriction']
|
||||||
org_names = super(HotelVirtualRoomRestriction, self).name_get()
|
org_names = super(HotelRoomTypeRestriction, self).name_get()
|
||||||
names = []
|
names = []
|
||||||
for name in org_names:
|
for name in org_names:
|
||||||
restriction_id = vroom_restriction_obj.browse(name[0])
|
restriction_id = room_type_restriction_obj.browse(name[0])
|
||||||
if restriction_id.wpid:
|
if restriction_id.channel_bind_ids.channel_plan_id:
|
||||||
names.append((name[0], '%s (WuBook)' % name[1]))
|
names.append((name[0], '%s (WuBook)' % name[1]))
|
||||||
else:
|
else:
|
||||||
names.append((name[0], name[1]))
|
names.append((name[0], name[1]))
|
||||||
@@ -98,7 +97,7 @@ class ChannelBindingHotelRoomTypeRestrictionListener(Component):
|
|||||||
_apply_on = ['channel.hotel.room.type.restriction']
|
_apply_on = ['channel.hotel.room.type.restriction']
|
||||||
|
|
||||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||||
def on_record_write(self, record, fields=None):
|
def on_record_create(self, record, fields=None):
|
||||||
record.with_delay(priority=20).create_plan()
|
record.with_delay(priority=20).create_plan()
|
||||||
|
|
||||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
# Copyright 2018 Alexandre Díaz <dev@redneboa.es>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from openerp import models, fields, api
|
from openerp import models, fields, api, _
|
||||||
from openerp.exceptions import ValidationError
|
from openerp.exceptions import ValidationError
|
||||||
|
|
||||||
|
|
||||||
@@ -10,17 +10,17 @@ class ProductPricelistItem(models.Model):
|
|||||||
|
|
||||||
is_channel_pushed = fields.Boolean("WuBook Pushed", default=True, readonly=True,
|
is_channel_pushed = fields.Boolean("WuBook Pushed", default=True, readonly=True,
|
||||||
old_name='wpushed')
|
old_name='wpushed')
|
||||||
is_daily_plan = fields.Boolean(related='pricelist_id.wdaily', readonly=True,
|
is_daily_plan = fields.Boolean(related='pricelist_id.channel_bind_ids.is_daily_plan', readonly=True,
|
||||||
old_name='wdaily')
|
old_name='wdaily')
|
||||||
|
|
||||||
@api.constrains('fixed_price')
|
@api.constrains('fixed_price')
|
||||||
def _check_fixed_price(self):
|
def _check_fixed_price(self):
|
||||||
vroom_obj = self.env['hotel.virtual.room']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
for record in self:
|
for record in self:
|
||||||
vroom = vroom_obj.search([
|
room_type = room_type_obj.search([
|
||||||
('product_id.product_tmpl_id', '=', record.product_tmpl_id.id)
|
('product_id.product_tmpl_id', '=', record.product_tmpl_id.id)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if vroom and vroom.channel_room_id and record.compute_price == 'fixed' \
|
if room_type and room_type.channel_room_id and record.compute_price == 'fixed' \
|
||||||
and record.fixed_price <= 0.0:
|
and record.fixed_price <= 0.0:
|
||||||
raise ValidationError(_("Price need be greater than zero"))
|
raise ValidationError(_("Price need be greater than zero"))
|
||||||
|
|
||||||
@@ -29,12 +29,12 @@ class ProductPricelistItem(models.Model):
|
|||||||
if self._context.get('channel_action', True):
|
if self._context.get('channel_action', True):
|
||||||
pricelist_id = self.env['product.pricelist'].browse(
|
pricelist_id = self.env['product.pricelist'].browse(
|
||||||
vals.get('pricelist_id'))
|
vals.get('pricelist_id'))
|
||||||
vroom = self.env['hotel.virtual.room'].search([
|
room_type = self.env['hotel.room.type'].search([
|
||||||
('product_id.product_tmpl_id', '=',
|
('product_id.product_tmpl_id', '=',
|
||||||
vals.get('product_tmpl_id')),
|
vals.get('product_tmpl_id')),
|
||||||
('channel_room_id', '!=', False)
|
('channel_room_id', '!=', False)
|
||||||
])
|
])
|
||||||
if vroom and pricelist_id.channel_plan_id:
|
if room_type and pricelist_id.channel_plan_id:
|
||||||
vals.update({'is_channel_pushed': False})
|
vals.update({'is_channel_pushed': False})
|
||||||
return super(ProductPricelistItem, self).create(vals)
|
return super(ProductPricelistItem, self).create(vals)
|
||||||
|
|
||||||
@@ -47,10 +47,10 @@ class ProductPricelistItem(models.Model):
|
|||||||
vals.get('pricelist_id') else record.pricelist_id
|
vals.get('pricelist_id') else record.pricelist_id
|
||||||
product_tmpl_id = vals.get('product_tmpl_id') or \
|
product_tmpl_id = vals.get('product_tmpl_id') or \
|
||||||
record.product_tmpl_id.id
|
record.product_tmpl_id.id
|
||||||
vroom = self.env['hotel.virtual.room'].search([
|
room_type = self.env['hotel.room.type'].search([
|
||||||
('product_id.product_tmpl_id', '=', product_tmpl_id),
|
('product_id.product_tmpl_id', '=', product_tmpl_id),
|
||||||
('channel_room_id', '!=', False),
|
('channel_room_id', '!=', False),
|
||||||
])
|
])
|
||||||
if vroom and pricelist_id.channel_plan_id:
|
if room_type and pricelist_id.channel_plan_id:
|
||||||
vals.update({'is_channel_pushed': False})
|
vals.update({'is_channel_pushed': False})
|
||||||
return super(ProductPricelistItem, self).write(vals)
|
return super(ProductPricelistItem, self).write(vals)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from openerp import models, fields, api
|
|||||||
class ReservationRestrictionItem(models.Model):
|
class ReservationRestrictionItem(models.Model):
|
||||||
_inherit = 'hotel.room.type.restriction.item'
|
_inherit = 'hotel.room.type.restriction.item'
|
||||||
|
|
||||||
channel_pushed = fields.Boolean("WuBook Pushed", default=False, readonly=True,
|
channel_pushed = fields.Boolean("Channel Pushed", default=False, readonly=True,
|
||||||
old_name='wpushed')
|
old_name='wpushed')
|
||||||
|
|
||||||
@api.onchange('date_start')
|
@api.onchange('date_start')
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
from odoo import api, models, fields
|
from odoo import api, models, fields
|
||||||
|
from odoo.exceptions import ValidationError
|
||||||
from odoo.addons.queue_job.job import job, related_action
|
from odoo.addons.queue_job.job import job, related_action
|
||||||
from odoo.addons.component.core import Component
|
from odoo.addons.component.core import Component
|
||||||
from odoo.addons.component_event import skip_if
|
from odoo.addons.component_event import skip_if
|
||||||
@@ -82,13 +83,15 @@ class ProductPricelist(models.Model):
|
|||||||
@api.multi
|
@api.multi
|
||||||
@api.depends('name')
|
@api.depends('name')
|
||||||
def name_get(self):
|
def name_get(self):
|
||||||
|
self.ensure_one()
|
||||||
pricelist_obj = self.env['product.pricelist']
|
pricelist_obj = self.env['product.pricelist']
|
||||||
org_names = super(ProductPricelist, self).name_get()
|
org_names = super(ProductPricelist, self).name_get()
|
||||||
names = []
|
names = []
|
||||||
for name in org_names:
|
for name in org_names:
|
||||||
priclist_id = pricelist_obj.browse(name[0])
|
priclist_id = pricelist_obj.browse(name[0])
|
||||||
if priclist_id.wpid:
|
if any(priclist_id.channel_bind_ids) and \
|
||||||
names.append((name[0], '%s (WuBook)' % name[1]))
|
priclist_id.channel_bind_ids[0].channel_plan_id:
|
||||||
|
names.append((name[0], '%s (Channel)' % name[1]))
|
||||||
else:
|
else:
|
||||||
names.append((name[0], name[1]))
|
names.append((name[0], name[1]))
|
||||||
return names
|
return names
|
||||||
@@ -99,7 +102,7 @@ class ChannelBindingProductPricelistListener(Component):
|
|||||||
_apply_on = ['channel.product.pricelist']
|
_apply_on = ['channel.product.pricelist']
|
||||||
|
|
||||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||||
def on_record_write(self, record, fields=None):
|
def on_record_create(self, record, fields=None):
|
||||||
record.with_delay(priority=20).create_plan()
|
record.with_delay(priority=20).create_plan()
|
||||||
|
|
||||||
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
@skip_if(lambda self, record, **kwargs: self.no_connector_export(record))
|
||||||
|
|||||||
@@ -5,9 +5,8 @@ import os
|
|||||||
import binascii
|
import binascii
|
||||||
import logging
|
import logging
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from openerp import models, fields, api, _
|
from odoo import models, fields, api, _
|
||||||
from openerp.tools import DEFAULT_SERVER_DATE_FORMAT
|
from odoo.tools import DEFAULT_SERVER_DATE_FORMAT
|
||||||
from odoo.addons.hotel import date_utils
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -41,7 +40,7 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
|||||||
def resync(self):
|
def resync(self):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
|
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = fields.Date.now()
|
||||||
now_utc_str = now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
now_utc_str = now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||||
|
|
||||||
# Reset Issues
|
# Reset Issues
|
||||||
@@ -56,29 +55,29 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
|||||||
})
|
})
|
||||||
if wubook_obj.init_connection():
|
if wubook_obj.init_connection():
|
||||||
ir_seq_obj = self.env['ir.sequence']
|
ir_seq_obj = self.env['ir.sequence']
|
||||||
vrooms = self.env['hotel.room.type'].search([])
|
room_types = self.env['hotel.room.type'].search([])
|
||||||
for vroom in vrooms:
|
for room_type in room_types:
|
||||||
shortcode = ir_seq_obj.next_by_code('hotel.room.type')[:4]
|
shortcode = ir_seq_obj.next_by_code('hotel.room.type')[:4]
|
||||||
channel_room_id = wubook_obj.create_room(
|
channel_room_id = wubook_obj.create_room(
|
||||||
shortcode,
|
shortcode,
|
||||||
vroom.name,
|
room_type.name,
|
||||||
vroom.wcapacity,
|
room_type.wcapacity,
|
||||||
vroom.list_price,
|
room_type.list_price,
|
||||||
vroom.max_real_rooms
|
room_type.total_rooms_count
|
||||||
)
|
)
|
||||||
if channel_room_id:
|
if channel_room_id:
|
||||||
vroom.with_context(wubook_action=False).write({
|
room_type.with_context(wubook_action=False).write({
|
||||||
'channel_room_id': channel_room_id,
|
'channel_room_id': channel_room_id,
|
||||||
'wscode': shortcode,
|
'wscode': shortcode,
|
||||||
})
|
})
|
||||||
else:
|
else:
|
||||||
vroom.with_context(wubook_action=False).write({
|
room_type.with_context(wubook_action=False).write({
|
||||||
'channel_room_id': '',
|
'channel_room_id': '',
|
||||||
'wscode': '',
|
'wscode': '',
|
||||||
})
|
})
|
||||||
# Create Restrictions
|
# Create Restrictions
|
||||||
vroom_rest_obj = self.env['hotel.room.type.restriction']
|
room_type_rest_obj = self.env['hotel.room.type.restriction']
|
||||||
restriction_ids = vroom_rest_obj.search([])
|
restriction_ids = room_type_rest_obj.search([])
|
||||||
for restriction in restriction_ids:
|
for restriction in restriction_ids:
|
||||||
if restriction.wpid != '0':
|
if restriction.wpid != '0':
|
||||||
channel_plan_id = wubook_obj.create_rplan(restriction.name)
|
channel_plan_id = wubook_obj.create_rplan(restriction.name)
|
||||||
@@ -88,7 +87,7 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
|||||||
# Create Pricelist
|
# Create Pricelist
|
||||||
pricelist_ids = self.env['product.pricelist'].search([])
|
pricelist_ids = self.env['product.pricelist'].search([])
|
||||||
for pricelist in pricelist_ids:
|
for pricelist in pricelist_ids:
|
||||||
channel_plan_id = wubook_obj.create_plan(pricelist.name, pricelist.wdaily)
|
channel_plan_id = wubook_obj.create_plan(pricelist.name, pricelist.is_daily_plan)
|
||||||
pricelist.write({
|
pricelist.write({
|
||||||
'channel_plan_id': channel_plan_id or ''
|
'channel_plan_id': channel_plan_id or ''
|
||||||
})
|
})
|
||||||
@@ -115,13 +114,13 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
|||||||
|
|
||||||
# Get Parity Models
|
# Get Parity Models
|
||||||
pricelist_id = int(self.env['ir.default'].sudo().get(
|
pricelist_id = int(self.env['ir.default'].sudo().get(
|
||||||
'res.config.settings', 'parity_pricelist_id'))
|
'res.config.settings', 'parity_pricelist_id'))
|
||||||
restriction_id = int(self.env['ir.default'].sudo().get(
|
restriction_id = int(self.env['ir.default'].sudo().get(
|
||||||
'res.config.settings', 'parity_restrictions_id'))
|
'res.config.settings', 'parity_restrictions_id'))
|
||||||
|
|
||||||
vroom_restr_it_obj = self.env['hotel.room.type.restriction.item']
|
room_type_restr_it_obj = self.env['hotel.room.type.restriction.item']
|
||||||
# Secure Wubook Input
|
# Secure Wubook Input
|
||||||
restriction_item_ids = vroom_restr_it_obj.search([
|
restriction_item_ids = room_type_restr_it_obj.search([
|
||||||
('applied_on', '=', '0_room_type'),
|
('applied_on', '=', '0_room_type'),
|
||||||
('date_start', '<', now_utc_str),
|
('date_start', '<', now_utc_str),
|
||||||
])
|
])
|
||||||
@@ -130,7 +129,7 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
|||||||
'wpushed': True
|
'wpushed': True
|
||||||
})
|
})
|
||||||
# Put to push restrictions
|
# Put to push restrictions
|
||||||
restriction_item_ids = vroom_restr_it_obj.search([
|
restriction_item_ids = room_type_restr_it_obj.search([
|
||||||
('restriction_id', '=', restriction_id),
|
('restriction_id', '=', restriction_id),
|
||||||
('applied_on', '=', '0_room_type'),
|
('applied_on', '=', '0_room_type'),
|
||||||
('wpushed', '=', True),
|
('wpushed', '=', True),
|
||||||
|
|||||||
@@ -123,10 +123,10 @@ class TestHotelWubook(TestHotel):
|
|||||||
rooms = []
|
rooms = []
|
||||||
rooms_occu = []
|
rooms_occu = []
|
||||||
booked_rooms = []
|
booked_rooms = []
|
||||||
vroom_obj = self.env['hotel.room.type']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
max_persons = 0
|
max_persons = 0
|
||||||
for k_room, v_room in rinfo.iteritems():
|
for k_room, v_room in rinfo.iteritems():
|
||||||
vroom = vroom_obj.search([
|
room_type = room_type_obj.search([
|
||||||
('wrid', '=', k_room)
|
('wrid', '=', k_room)
|
||||||
], limit=1)
|
], limit=1)
|
||||||
# Generate Rooms
|
# Generate Rooms
|
||||||
@@ -152,7 +152,7 @@ class TestHotelWubook(TestHotel):
|
|||||||
booked_rooms.append({
|
booked_rooms.append({
|
||||||
'ancillary': {
|
'ancillary': {
|
||||||
'channel_room_id': 1,
|
'channel_room_id': 1,
|
||||||
'channel_room_name': vroom.name,
|
'channel_room_name': room_type.name,
|
||||||
'addons': [],
|
'addons': [],
|
||||||
'guests': val
|
'guests': val
|
||||||
},
|
},
|
||||||
@@ -240,20 +240,20 @@ class TestHotelWubook(TestHotel):
|
|||||||
super(TestHotelWubook, cls).setUpClass()
|
super(TestHotelWubook, cls).setUpClass()
|
||||||
|
|
||||||
# Update Test Virtual Rooms
|
# Update Test Virtual Rooms
|
||||||
cls.hotel_vroom_budget.write({
|
cls.hotel_room_type_budget.write({
|
||||||
'wcapacity': 1,
|
'wcapacity': 1,
|
||||||
'wrid': 3000,
|
'wrid': 3000,
|
||||||
'wscode': 'T001',
|
'wscode': 'T001',
|
||||||
})
|
})
|
||||||
cls.hotel_vroom_special.write({
|
cls.hotel_room_type_special.write({
|
||||||
'wcapacity': 2,
|
'wcapacity': 2,
|
||||||
'wrid': 3001,
|
'wrid': 3001,
|
||||||
'wscode': 'T002',
|
'wscode': 'T002',
|
||||||
})
|
})
|
||||||
|
|
||||||
# Update Restriction
|
# Update Restriction
|
||||||
vroom_restr_obj = cls.env['hotel.room.type.restriction']
|
room_type_restr_obj = cls.env['hotel.room.type.restriction']
|
||||||
default_restriction = vroom_restr_obj.search([
|
default_restriction = room_type_restr_obj.search([
|
||||||
('wpid', '=', '0')
|
('wpid', '=', '0')
|
||||||
], limit=1)
|
], limit=1)
|
||||||
if default_restriction:
|
if default_restriction:
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
def test_save_changes(self):
|
def test_save_changes(self):
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = date_utils.now()
|
||||||
adv_utc_dt = now_utc_dt + timedelta(days=3)
|
adv_utc_dt = now_utc_dt + timedelta(days=3)
|
||||||
vrooms = (self.hotel_vroom_budget,)
|
room_types = (self.hotel_room_type_budget,)
|
||||||
|
|
||||||
hotel_cal_mngt_obj = self.env['hotel.calendar.management'].sudo(
|
hotel_cal_mngt_obj = self.env['hotel.calendar.management'].sudo(
|
||||||
self.user_hotel_manager)
|
self.user_hotel_manager)
|
||||||
@@ -43,7 +43,7 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
cprices = {}
|
cprices = {}
|
||||||
for k_item, v_item in enumerate(prices):
|
for k_item, v_item in enumerate(prices):
|
||||||
ndate_utc_dt = now_utc_dt + timedelta(days=k_item)
|
ndate_utc_dt = now_utc_dt + timedelta(days=k_item)
|
||||||
cprices.setdefault(self.hotel_vroom_budget.id, []).append({
|
cprices.setdefault(self.hotel_room_type_budget.id, []).append({
|
||||||
'date': ndate_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
'date': ndate_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
'price': v_item
|
'price': v_item
|
||||||
})
|
})
|
||||||
@@ -61,7 +61,7 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
crestrictions = {}
|
crestrictions = {}
|
||||||
for i in range(0, 4):
|
for i in range(0, 4):
|
||||||
ndate_utc_dt = now_utc_dt + timedelta(days=i)
|
ndate_utc_dt = now_utc_dt + timedelta(days=i)
|
||||||
crestrictions.setdefault(self.hotel_vroom_budget.id, []).append({
|
crestrictions.setdefault(self.hotel_room_type_budget.id, []).append({
|
||||||
'date': ndate_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
'date': ndate_utc_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
'closed_arrival': restrictions['closed_arrival'][i],
|
'closed_arrival': restrictions['closed_arrival'][i],
|
||||||
'max_stay': restrictions['max_stay'][i],
|
'max_stay': restrictions['max_stay'][i],
|
||||||
@@ -78,7 +78,7 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
for k_item, v_item in enumerate(avails):
|
for k_item, v_item in enumerate(avails):
|
||||||
ndate_utc_dt = now_utc_dt + timedelta(days=k_item)
|
ndate_utc_dt = now_utc_dt + timedelta(days=k_item)
|
||||||
ndate_dt = date_utils.dt_as_timezone(ndate_utc_dt, self.tz_hotel)
|
ndate_dt = date_utils.dt_as_timezone(ndate_utc_dt, self.tz_hotel)
|
||||||
cavails.setdefault(self.hotel_vroom_budget.id, []).append({
|
cavails.setdefault(self.hotel_room_type_budget.id, []).append({
|
||||||
'date': ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
'date': ndate_dt.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
||||||
'avail': v_item,
|
'avail': v_item,
|
||||||
'no_ota': False,
|
'no_ota': False,
|
||||||
@@ -100,16 +100,16 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
self.parity_restrictions_id,
|
self.parity_restrictions_id,
|
||||||
True)
|
True)
|
||||||
|
|
||||||
for vroom in vrooms:
|
for room_type in room_types:
|
||||||
for k_pr, v_pr in hcal_data['availability'].iteritems():
|
for k_pr, v_pr in hcal_data['availability'].iteritems():
|
||||||
if k_pr == vroom.id: # Only Check Test Cases
|
if k_pr == room_type.id: # Only Check Test Cases
|
||||||
for k_info, v_info in enumerate(v_pr):
|
for k_info, v_info in enumerate(v_pr):
|
||||||
self.assertEqual(v_info['avail'],
|
self.assertEqual(v_info['avail'],
|
||||||
avails[k_info],
|
avails[k_info],
|
||||||
"Hotel Calendar Management \
|
"Hotel Calendar Management \
|
||||||
Availability doesn't match!")
|
Availability doesn't match!")
|
||||||
for k_pr, v_pr in hcal_data['restrictions'].iteritems():
|
for k_pr, v_pr in hcal_data['restrictions'].iteritems():
|
||||||
if k_pr == vroom.id: # Only Check Test Cases
|
if k_pr == room_type.id: # Only Check Test Cases
|
||||||
for k_info, v_info in enumerate(v_pr):
|
for k_info, v_info in enumerate(v_pr):
|
||||||
self.assertEqual(v_info['min_stay'],
|
self.assertEqual(v_info['min_stay'],
|
||||||
restrictions['min_stay'][k_info],
|
restrictions['min_stay'][k_info],
|
||||||
@@ -145,7 +145,7 @@ class TestHotelCalendarManagement(TestHotelWubook):
|
|||||||
"Hotel Calendar Management Restrictions \
|
"Hotel Calendar Management Restrictions \
|
||||||
doesn't match!")
|
doesn't match!")
|
||||||
for k_pr, v_pr in hcal_data['prices'].iteritems():
|
for k_pr, v_pr in hcal_data['prices'].iteritems():
|
||||||
if k_pr == vroom.id: # Only Check Test Cases
|
if k_pr == room_type.id: # Only Check Test Cases
|
||||||
for k_info, v_info in enumerate(v_pr):
|
for k_info, v_info in enumerate(v_pr):
|
||||||
self.assertEqual(v_info['price'],
|
self.assertEqual(v_info['price'],
|
||||||
prices[k_info], "Hotel Calendar \
|
prices[k_info], "Hotel Calendar \
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ class TestHotelFolio(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -75,7 +75,7 @@ class TestHotelFolio(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ class TestHotelFolio(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class TestHotelReservation(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1], # 1 Reservation Line
|
'occupancy': [1], # 1 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ class TestHotelReservation(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1], # 1 Reservation Line
|
'occupancy': [1], # 1 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ class TestHotelReservation(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1], # 1 Reservation Line
|
'occupancy': [1], # 1 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -158,7 +158,7 @@ class TestHotelReservation(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1], # 1 Reservation Line
|
'occupancy': [1], # 1 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,42 +32,42 @@ from .common import TestHotelWubook
|
|||||||
class TestHotelVirtualRoom(TestHotelWubook):
|
class TestHotelVirtualRoom(TestHotelWubook):
|
||||||
|
|
||||||
def test_get_capacity(self):
|
def test_get_capacity(self):
|
||||||
self.assertEqual(self.hotel_vroom_budget.wcapacity,
|
self.assertEqual(self.hotel_room_type_budget.wcapacity,
|
||||||
1,
|
1,
|
||||||
"Invalid wcapacity")
|
"Invalid wcapacity")
|
||||||
|
|
||||||
def test_check_wcapacity(self):
|
def test_check_wcapacity(self):
|
||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
self.hotel_vroom_budget.sudo(self.user_hotel_manager).write({
|
self.hotel_room_type_budget.sudo(self.user_hotel_manager).write({
|
||||||
'wcapacity': 0
|
'wcapacity': 0
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_check_wscode(self):
|
def test_check_wscode(self):
|
||||||
with self.assertRaises(ValidationError):
|
with self.assertRaises(ValidationError):
|
||||||
self.hotel_vroom_budget.sudo(self.user_hotel_manager).write({
|
self.hotel_room_type_budget.sudo(self.user_hotel_manager).write({
|
||||||
'wscode': 'abcdefg'
|
'wscode': 'abcdefg'
|
||||||
})
|
})
|
||||||
|
|
||||||
def test_get_restrictions(self):
|
def test_get_restrictions(self):
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = date_utils.now()
|
||||||
rests = self.hotel_vroom_budget.sudo(
|
rests = self.hotel_room_type_budget.sudo(
|
||||||
self.user_hotel_manager).get_restrictions(
|
self.user_hotel_manager).get_restrictions(
|
||||||
now_utc_dt.strftime(
|
now_utc_dt.strftime(
|
||||||
DEFAULT_SERVER_DATE_FORMAT))
|
DEFAULT_SERVER_DATE_FORMAT))
|
||||||
self.assertTrue(any(rests), "Restrictions not found")
|
self.assertTrue(any(rests), "Restrictions not found")
|
||||||
|
|
||||||
def test_import_rooms(self):
|
def test_import_rooms(self):
|
||||||
self.hotel_vroom_budget.sudo(self.user_hotel_manager).import_rooms()
|
self.hotel_room_type_budget.sudo(self.user_hotel_manager).import_rooms()
|
||||||
|
|
||||||
def test_create(self):
|
def test_create(self):
|
||||||
vroom_obj = self.env['hotel.room.type']
|
room_type_obj = self.env['hotel.room.type']
|
||||||
vroom = vroom_obj.sudo(self.user_hotel_manager).create({
|
room_type = room_type_obj.sudo(self.user_hotel_manager).create({
|
||||||
'name': 'Budget Room',
|
'name': 'Budget Room',
|
||||||
'virtual_code': '001',
|
'virtual_code': '001',
|
||||||
'list_price': 50,
|
'list_price': 50,
|
||||||
'wrid': 1234
|
'wrid': 1234
|
||||||
})
|
})
|
||||||
vroom.unlink()
|
room_type.unlink()
|
||||||
|
|
||||||
def test_unlink(self):
|
def test_unlink(self):
|
||||||
self.hotel_vroom_budget.sudo(self.user_hotel_manager).unlink()
|
self.hotel_room_type_budget.sudo(self.user_hotel_manager).unlink()
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class TestProductPricelistItem(TestHotelWubook):
|
|||||||
def test_create(self):
|
def test_create(self):
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = date_utils.now()
|
||||||
day_utc_dt = now_utc_dt + timedelta(days=20)
|
day_utc_dt = now_utc_dt + timedelta(days=20)
|
||||||
budget_product_id = self.hotel_vroom_budget.product_id
|
budget_product_id = self.hotel_room_type_budget.product_id
|
||||||
pr_item_obj = self.env['product.pricelist.item']
|
pr_item_obj = self.env['product.pricelist.item']
|
||||||
|
|
||||||
parity_pricelist = self.env['product.pricelist'].browse([
|
parity_pricelist = self.env['product.pricelist'].browse([
|
||||||
@@ -54,7 +54,7 @@ class TestProductPricelistItem(TestHotelWubook):
|
|||||||
def test_write(self):
|
def test_write(self):
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = date_utils.now()
|
||||||
day_utc_dt = now_utc_dt + timedelta(days=20)
|
day_utc_dt = now_utc_dt + timedelta(days=20)
|
||||||
budget_product_id = self.hotel_vroom_budget.product_id
|
budget_product_id = self.hotel_room_type_budget.product_id
|
||||||
pr_item_obj = self.env['product.pricelist.item']
|
pr_item_obj = self.env['product.pricelist.item']
|
||||||
|
|
||||||
parity_pricelist = self.env['product.pricelist'].browse([
|
parity_pricelist = self.env['product.pricelist'].browse([
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class TestResPartner(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ class TestResPartner(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_1,
|
self.partner_1,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,9 @@ class TestVirtualRoomAvailability(TestHotelWubook):
|
|||||||
def test_write(self):
|
def test_write(self):
|
||||||
now_utc_dt = date_utils.now()
|
now_utc_dt = date_utils.now()
|
||||||
day_utc_dt = now_utc_dt + timedelta(days=1)
|
day_utc_dt = now_utc_dt + timedelta(days=1)
|
||||||
vroom_avail_obj = self.env['hotel.room.type.availability']
|
room_type_avail_obj = self.env['hotel.room.type.availability']
|
||||||
avail = vroom_avail_obj.search([
|
avail = room_type_avail_obj.search([
|
||||||
('room_type_id', '=', self.hotel_vroom_budget.id),
|
('room_type_id', '=', self.hotel_room_type_budget.id),
|
||||||
('date', '=', now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT))
|
('date', '=', now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT))
|
||||||
], limit=1)
|
], limit=1)
|
||||||
avail.write({
|
avail.write({
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1], # 1 Reservation Line
|
'occupancy': [1], # 1 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -105,7 +105,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1, 1], # 2 Reservation Line
|
'occupancy': [1, 1], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -162,7 +162,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -174,7 +174,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
DEFAULT_SERVER_DATETIME_FORMAT),
|
DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -186,7 +186,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
DEFAULT_SERVER_DATETIME_FORMAT),
|
DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -222,7 +222,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -280,7 +280,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -292,7 +292,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
DEFAULT_SERVER_DATETIME_FORMAT),
|
DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -320,7 +320,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0, 20.0, 17.0]
|
'dayprices': [15.0, 15.0, 20.0, 17.0]
|
||||||
}
|
}
|
||||||
@@ -377,7 +377,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [3],
|
'occupancy': [3],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -394,7 +394,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2, 1],
|
'occupancy': [2, 1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -422,7 +422,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -434,7 +434,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
DEFAULT_SERVER_DATETIME_FORMAT),
|
DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -446,7 +446,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
DEFAULT_SERVER_DATETIME_FORMAT),
|
DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -477,7 +477,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_special.wrid: {
|
self.hotel_room_type_special.wrid: {
|
||||||
'occupancy': [2], # 2 Reservation Line
|
'occupancy': [2], # 2 Reservation Line
|
||||||
'dayprices': [15.0, 15.0] # 2 Days
|
'dayprices': [15.0, 15.0] # 2 Days
|
||||||
}
|
}
|
||||||
@@ -502,7 +502,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -513,7 +513,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -524,7 +524,7 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
checkin_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT),
|
||||||
self.partner_2,
|
self.partner_2,
|
||||||
{
|
{
|
||||||
self.hotel_vroom_budget.wrid: {
|
self.hotel_room_type_budget.wrid: {
|
||||||
'occupancy': [1],
|
'occupancy': [1],
|
||||||
'dayprices': [15.0, 15.0]
|
'dayprices': [15.0, 15.0]
|
||||||
}
|
}
|
||||||
@@ -552,11 +552,11 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkout_utc_dt = checkin_utc_dt + timedelta(days=1)
|
checkout_utc_dt = checkin_utc_dt + timedelta(days=1)
|
||||||
checkout_dt = date_utils.dt_as_timezone(checkout_utc_dt,
|
checkout_dt = date_utils.dt_as_timezone(checkout_utc_dt,
|
||||||
self.tz_hotel)
|
self.tz_hotel)
|
||||||
vroom_restr_item_obj = self.env['hotel.room.type.restriction.item']
|
room_type_restr_item_obj = self.env['hotel.room.type.restriction.item']
|
||||||
|
|
||||||
vrooms = [self.hotel_vroom_budget, self.hotel_vroom_special]
|
room_types = [self.hotel_room_type_budget, self.hotel_room_type_special]
|
||||||
values = self.create_wubook_rooms_values(
|
values = self.create_wubook_rooms_values(
|
||||||
vrooms,
|
room_types,
|
||||||
[{
|
[{
|
||||||
'closed_arrival': 0,
|
'closed_arrival': 0,
|
||||||
'booked': 0,
|
'booked': 0,
|
||||||
@@ -587,9 +587,9 @@ class TestWubook(TestHotelWubook):
|
|||||||
checkout_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
checkout_dt.strftime(DEFAULT_WUBOOK_DATE_FORMAT),
|
||||||
values)
|
values)
|
||||||
|
|
||||||
for vroom in vrooms:
|
for room_type in room_types:
|
||||||
items = vroom_restr_item_obj.search([
|
items = room_type_restr_item_obj.search([
|
||||||
('room_type_id', '=', vroom.id),
|
('room_type_id', '=', room_type.id),
|
||||||
('date_start',
|
('date_start',
|
||||||
'>=', checkin_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
'>=', checkin_dt.strftime(DEFAULT_SERVER_DATE_FORMAT)),
|
||||||
('date_end',
|
('date_end',
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ class MassiveChangesWizard(models.TransientModel):
|
|||||||
_inherit = 'hotel.wizard.massive.changes'
|
_inherit = 'hotel.wizard.massive.changes'
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _get_availability_values(self, ndate, vroom, record):
|
def _get_availability_values(self, ndate, room_type, record):
|
||||||
vals = super(MassiveChangesWizard, self)._get_availability_values(
|
vals = super(MassiveChangesWizard, self)._get_availability_values(
|
||||||
ndate, vroom, record)
|
ndate, room_type, record)
|
||||||
vals.update({
|
vals.update({
|
||||||
'wmax_avail': vals['avail']
|
'wmax_avail': vals['avail']
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user