mirror of
https://github.com/OCA/pms.git
synced 2025-01-29 00:17:45 +02:00
[WIP][MIG][11.0] Hotel Calendar
This commit is contained in:
@@ -203,7 +203,7 @@ class HotelReservation(models.Model):
|
||||
parent_reservation = fields.Many2one('hotel.reservation',
|
||||
'Parent Reservation')
|
||||
overbooking = fields.Boolean('Is Overbooking', default=False)
|
||||
|
||||
|
||||
nights = fields.Integer('Nights', compute='_computed_nights', store=True)
|
||||
channel_type = fields.Selection([
|
||||
('door', 'Door'),
|
||||
@@ -286,7 +286,11 @@ class HotelReservation(models.Model):
|
||||
#~ 'reserve_color_text': colors[1],
|
||||
})
|
||||
if self.compute_price_out_vals(vals):
|
||||
vals.update(self.env['hotel.reservation'].prepare_reservation_lines(vals))
|
||||
days_diff = (fields.Date.from_string(vals['checkout']) - fields.Date.from_string(vals['checkin'])).days
|
||||
vals.update(record.prepare_reservation_lines(
|
||||
vals['checkin'],
|
||||
days_diff,
|
||||
vals = vals)) #REVISAR el unlink
|
||||
record = super(HotelReservation, self).create(vals)
|
||||
#~ if (record.state == 'draft' and record.folio_id.state == 'sale') or \
|
||||
#~ record.preconfirm:
|
||||
@@ -303,7 +307,7 @@ class HotelReservation(models.Model):
|
||||
if record.compute_price_out_vals(vals):
|
||||
days_diff = (fields.Date.from_string(record.checkout) - fields.Date.from_string(record.checkin)).days
|
||||
record.update(record.prepare_reservation_lines(
|
||||
record.checkin,
|
||||
vals['checkin'],
|
||||
days_diff,
|
||||
vals = vals)) #REVISAR el unlink
|
||||
if ('checkin' in vals and record.checkin != vals['checkin']) or \
|
||||
@@ -337,7 +341,7 @@ class HotelReservation(models.Model):
|
||||
'to_assign' in vals:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@api.multi
|
||||
def overbooking_button(self):
|
||||
self.ensure_one()
|
||||
@@ -411,7 +415,7 @@ class HotelReservation(models.Model):
|
||||
#TODO: Change parity pricelist by default pricelist
|
||||
values = {
|
||||
'pricelist_id': self.partner_id.property_product_pricelist and self.partner_id.property_product_pricelist.id or \
|
||||
self.env['ir.default'].sudo().get('hotel.config.settings', 'parity_pricelist_id'),
|
||||
self.env['ir.default'].sudo().get('res.config.settings', 'parity_pricelist_id'),
|
||||
}
|
||||
self.update(values)
|
||||
|
||||
@@ -442,8 +446,8 @@ class HotelReservation(models.Model):
|
||||
self.checkin,
|
||||
days_diff,
|
||||
update_old_prices = False))
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@api.onchange('checkin', 'checkout', 'room_type_id')
|
||||
def onchange_compute_reservation_description(self):
|
||||
@@ -686,7 +690,7 @@ class HotelReservation(models.Model):
|
||||
'room_type_id' in vals or 'pricelist_id' in vals)):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
@api.depends('reservation_line_ids', 'reservation_line_ids.discount', 'tax_id')
|
||||
def _compute_amount_reservation(self):
|
||||
"""
|
||||
@@ -707,10 +711,9 @@ class HotelReservation(models.Model):
|
||||
})
|
||||
|
||||
@api.multi
|
||||
def prepare_reservation_lines(self, dfrom, days, vals=False,
|
||||
update_old_prices=False):
|
||||
def prepare_reservation_lines(self, dfrom, days, vals=False, update_old_prices=False):
|
||||
total_price = 0.0
|
||||
cmds = []
|
||||
cmds = [(5, 0, 0)]
|
||||
if not vals:
|
||||
vals = {}
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
@@ -723,7 +726,8 @@ class HotelReservation(models.Model):
|
||||
for i in range(0, days):
|
||||
idate = (fields.Date.from_string(dfrom) + timedelta(days=i)).strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||
old_line = self.reservation_line_ids.filtered(lambda r: r.date == idate)
|
||||
if update_old_prices or (idate not in old_lines_days):
|
||||
if update_old_prices or (idate not in old_lines_days):
|
||||
_logger.info("PASA 3")
|
||||
product = product.with_context(
|
||||
lang=partner.lang,
|
||||
partner=partner.id,
|
||||
@@ -807,7 +811,7 @@ class HotelReservation(models.Model):
|
||||
with the reservations dates between dfrom and dto
|
||||
reservations_dates
|
||||
{'2018-07-30': [hotel.reservation(29,), hotel.reservation(30,),
|
||||
hotel.reservation(31,)],
|
||||
hotel.reservation(31,)],
|
||||
'2018-07-31': [hotel.reservation(22,), hotel.reservation(35,),
|
||||
hotel.reservation(36,)],
|
||||
}
|
||||
@@ -871,7 +875,7 @@ class HotelReservation(models.Model):
|
||||
recs = self.search([]).filtered(lambda x: x.cardex_pending is True)
|
||||
if recs:
|
||||
return [('id', 'in', [x.id for x in recs])]
|
||||
|
||||
|
||||
@api.multi
|
||||
def action_reservation_checkout(self):
|
||||
for record in self:
|
||||
@@ -1078,4 +1082,3 @@ class HotelReservation(models.Model):
|
||||
@api.multi
|
||||
def send_cancel_mail(self):
|
||||
return self.folio_id.send_cancel_mail()
|
||||
|
||||
|
||||
@@ -98,12 +98,12 @@ class TestHotel(TestMail):
|
||||
cls.tz_hotel = 'Europe/Madrid'
|
||||
cls.parity_pricelist_id = cls.pricelist_1.id
|
||||
cls.parity_restrictions_id = cls.restriction_1.id
|
||||
cls.env['ir.values'].sudo().set_default('hotel.config.settings',
|
||||
cls.env['ir.values'].sudo().set_default('res.config.settings',
|
||||
'tz_hotel', cls.tz_hotel)
|
||||
cls.env['ir.values'].sudo().set_default('hotel.config.settings',
|
||||
cls.env['ir.values'].sudo().set_default('res.config.settings',
|
||||
'parity_pricelist_id',
|
||||
cls.parity_pricelist_id)
|
||||
cls.env['ir.values'].sudo().set_default('hotel.config.settings',
|
||||
cls.env['ir.values'].sudo().set_default('res.config.settings',
|
||||
'parity_restrictions_id',
|
||||
cls.parity_restrictions_id)
|
||||
|
||||
|
||||
@@ -39,7 +39,7 @@ class BusHotelCalendar(models.TransientModel):
|
||||
'username': user_id.partner_id.name,
|
||||
'userid': user_id.id,
|
||||
'reservation': {
|
||||
'product_id': vals['product_id'],
|
||||
'id': vals['id'],
|
||||
'reserv_id': vals['reserv_id'],
|
||||
'partner_name': vals['partner_name'],
|
||||
'adults': vals['adults'],
|
||||
|
||||
@@ -270,10 +270,10 @@ class HotelCalendarManagement(models.TransientModel):
|
||||
vals = {}
|
||||
if not pricelist_id:
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if not restriction_id:
|
||||
restriction_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
|
||||
pricelist_id = int(pricelist_id)
|
||||
vals.update({'pricelist_id': pricelist_id})
|
||||
|
||||
@@ -20,7 +20,7 @@ class HotelReservation(models.Model):
|
||||
json_reservation_tooltips = {}
|
||||
for reserv in reservations:
|
||||
json_reservations.append([
|
||||
reserv.product_id.id,
|
||||
reserv.room_id.id,
|
||||
reserv.id,
|
||||
reserv.folio_id.partner_id.name,
|
||||
reserv.adults,
|
||||
@@ -60,33 +60,24 @@ class HotelReservation(models.Model):
|
||||
@api.model
|
||||
def _hcalendar_room_data(self, rooms):
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if pricelist_id:
|
||||
pricelist_id = int(pricelist_id)
|
||||
json_rooms = []
|
||||
room_type_obj = self.env['hotel.room.type']
|
||||
vroom_obj = self.env['hotel.room.type']
|
||||
for room in rooms:
|
||||
room_type = room_type_obj.search([
|
||||
('cat_id', '=', room.categ_id.id)
|
||||
], limit=1)
|
||||
vrooms = vroom_obj.search([
|
||||
'|', ('room_ids', 'in', room.id),
|
||||
('room_type_ids.id', '=', room.categ_id.id)],
|
||||
order='hcal_sequence ASC')
|
||||
json_rooms.append((
|
||||
room.product_id.id,
|
||||
room.id,
|
||||
room.name,
|
||||
room.capacity,
|
||||
room.categ_id.id,
|
||||
room_type.code_type,
|
||||
'', # Reserved for type code
|
||||
room.shared_room,
|
||||
room.sale_price_type == 'vroom'
|
||||
and ['pricelist', room.price_virtual_room.id, pricelist_id,
|
||||
room.price_virtual_room.name]
|
||||
or ['fixed', room.list_price],
|
||||
vrooms.mapped('name'),
|
||||
vrooms.ids,
|
||||
room.room_type_id
|
||||
and ['pricelist', room.room_type_id.id, pricelist_id,
|
||||
room.room_type_id.name]
|
||||
or 0,
|
||||
room.room_type_id.name,
|
||||
room.room_type_id.id,
|
||||
room.floor_id.id,
|
||||
room.room_amenities.ids))
|
||||
return json_rooms
|
||||
@@ -129,7 +120,7 @@ class HotelReservation(models.Model):
|
||||
@api.model
|
||||
def get_hcalendar_pricelist_data(self, dfrom, dto):
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if pricelist_id:
|
||||
pricelist_id = int(pricelist_id)
|
||||
date_start = date_utils.get_datetime(dfrom, hours=False) \
|
||||
@@ -137,39 +128,39 @@ class HotelReservation(models.Model):
|
||||
date_diff = date_utils.date_diff(date_start, dto, hours=False) + 1
|
||||
# Get Prices
|
||||
json_rooms_prices = {pricelist_id: []}
|
||||
vrooms = self.env['hotel.room.type'].search(
|
||||
room_typed_ids = self.env['hotel.room.type'].search(
|
||||
[],
|
||||
order='hcal_sequence ASC')
|
||||
vroom_pr_cached_obj = self.env['room.pricelist.cached']
|
||||
room_pr_cached_obj = self.env['room.pricelist.cached']
|
||||
|
||||
for vroom in vrooms:
|
||||
for room_type_id in room_typed_ids:
|
||||
days = {}
|
||||
for i in range(0, date_diff):
|
||||
ndate = date_start + timedelta(days=i)
|
||||
ndate_str = ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||
prod_price_id = vroom_pr_cached_obj.search([
|
||||
('virtual_room_id', '=', vroom.id),
|
||||
prod_price_id = room_pr_cached_obj.search([
|
||||
('room_id', '=', room_type_id.id),
|
||||
('date', '=', ndate_str)
|
||||
], limit=1)
|
||||
days.update({
|
||||
ndate.strftime("%d/%m/%Y"): prod_price_id and
|
||||
prod_price_id.price or
|
||||
vroom.product_id.with_context(
|
||||
room_type_id.product_id.with_context(
|
||||
quantity=1,
|
||||
date=ndate_str,
|
||||
pricelist=pricelist_id).price
|
||||
})
|
||||
json_rooms_prices[pricelist_id].append({
|
||||
'room': vroom.id,
|
||||
'room': room_type_id.id,
|
||||
'days': days,
|
||||
'title': vroom.name,
|
||||
'title': room_type_id.name,
|
||||
})
|
||||
return json_rooms_prices
|
||||
|
||||
@api.model
|
||||
def get_hcalendar_restrictions_data(self, dfrom, dto):
|
||||
restriction_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
if restriction_id:
|
||||
restriction_id = int(restriction_id)
|
||||
date_start = date_utils.get_datetime(dfrom, hours=False) \
|
||||
@@ -177,17 +168,17 @@ class HotelReservation(models.Model):
|
||||
date_diff = date_utils.date_diff(dfrom, dto, hours=False) + 1
|
||||
# Get Prices
|
||||
json_rooms_rests = {}
|
||||
vrooms = self.env['hotel.room.type'].search(
|
||||
room_type_ids = self.env['hotel.room.type'].search(
|
||||
[],
|
||||
order='hcal_sequence ASC')
|
||||
vroom_rest_obj = self.env['hotel.virtual.room.restriction.item']
|
||||
for vroom in vrooms:
|
||||
for room_type_id in room_type_ids:
|
||||
days = {}
|
||||
for i in range(0, date_diff):
|
||||
ndate = date_start + timedelta(days=i)
|
||||
ndate_str = ndate.strftime(DEFAULT_SERVER_DATE_FORMAT)
|
||||
rest_id = vroom_rest_obj.search([
|
||||
('virtual_room_id', '=', vroom.id),
|
||||
('room_type_id', '=', room_type_id.id),
|
||||
('date_start', '>=', ndate_str),
|
||||
('date_end', '<=', ndate_str),
|
||||
('applied_on', '=', '0_virtual_room'),
|
||||
@@ -207,7 +198,7 @@ class HotelReservation(models.Model):
|
||||
rest_id.closed_arrival,
|
||||
rest_id.closed_departure)
|
||||
})
|
||||
json_rooms_rests.update({vroom.id: days})
|
||||
json_rooms_rests.update({room_type_id.id: days})
|
||||
return json_rooms_rests
|
||||
|
||||
@api.model
|
||||
@@ -246,9 +237,9 @@ class HotelReservation(models.Model):
|
||||
'allow_invalid_actions': type_move == 'allow_invalid',
|
||||
'assisted_movement': type_move == 'assisted',
|
||||
'default_arrival_hour': self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_arrival_hour'),
|
||||
'res.config.settings', 'default_arrival_hour'),
|
||||
'default_departure_hour': self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour'),
|
||||
'res.config.settings', 'default_departure_hour'),
|
||||
'show_notifications': user_id.pms_show_notifications,
|
||||
'show_pricelist': user_id.pms_show_pricelist,
|
||||
'show_availability': user_id.pms_show_availability,
|
||||
@@ -283,7 +274,7 @@ class HotelReservation(models.Model):
|
||||
'action': naction,
|
||||
'type': ntype,
|
||||
'title': ntitle,
|
||||
'product_id': record.product_id.id,
|
||||
'id': record.room_id.id,
|
||||
'reserv_id': record.id,
|
||||
'partner_name': record.partner_id.name,
|
||||
'adults': record.adults,
|
||||
@@ -296,7 +287,7 @@ class HotelReservation(models.Model):
|
||||
'splitted': record.splitted,
|
||||
'parent_reservation': record.parent_reservation and
|
||||
record.parent_reservation.id or 0,
|
||||
'room_name': record.product_id.name,
|
||||
'room_name': record.name,
|
||||
'partner_phone': record.partner_id.mobile
|
||||
or record.partner_id.phone or _('Undefined'),
|
||||
'state': record.state,
|
||||
@@ -310,7 +301,7 @@ class HotelReservation(models.Model):
|
||||
from_reservs = self.env['hotel.reservation'].browse(fromReservsIds)
|
||||
to_reservs = self.env['hotel.reservation'].browse(toReservsIds)
|
||||
|
||||
if not any(from_reservs) or not any(toReservs):
|
||||
if not any(from_reservs) or not any(to_reservs):
|
||||
raise ValidationError(_("Invalid swap parameters"))
|
||||
|
||||
max_from_persons = max(
|
||||
@@ -318,29 +309,23 @@ class HotelReservation(models.Model):
|
||||
max_to_persons = max(
|
||||
to_reservs.mapped(lambda x: x.adults + x.children))
|
||||
|
||||
from_room_product = from_reservs[0].product_id
|
||||
to_room_product = to_reservs[0].product_id
|
||||
from_room = from_reservs[0].room_id
|
||||
to_room = to_reservs[0].room_id
|
||||
from_overbooking = from_reservs[0].overbooking
|
||||
to_overbooking = to_reservs[0].overbooking
|
||||
|
||||
hotel_room_obj = self.env['hotel.room']
|
||||
from_room = hotel_room_obj.search([
|
||||
('product_id', '=', from_room_product.id)])
|
||||
to_room = hotel_room_obj.search([
|
||||
('product_id', '=', from_room_product.id)])
|
||||
|
||||
if max_from_persons > to_room.capacity or \
|
||||
max_to_persons > from_room.capacity:
|
||||
raise ValidationError("Invalid swap operation: wrong capacity")
|
||||
|
||||
for record in from_reservs:
|
||||
record.with_context({'ignore_avail_restrictions': True}).write({
|
||||
'product_id': to_room_product.id,
|
||||
'room_id': to_room.id,
|
||||
'overbooking': to_overbooking,
|
||||
})
|
||||
for record in to_reservs:
|
||||
record.with_context({'ignore_avail_restrictions': True}).write({
|
||||
'product_id': from_room_product.id,
|
||||
'room_id': from_room.id,
|
||||
'overbooking': from_overbooking,
|
||||
})
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ class HotelVirtualRoomResrtrictionItem(models.Model):
|
||||
def create(self, vals):
|
||||
res = super(HotelVirtualRoomResrtrictionItem, self).create(vals)
|
||||
restrictions_parity_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
if restrictions_parity_id:
|
||||
restrictions_parity_id = int(restrictions_parity_id)
|
||||
restriction_id = res.restriction_id.id
|
||||
@@ -36,7 +36,7 @@ class HotelVirtualRoomResrtrictionItem(models.Model):
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
restrictions_parity_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
if restrictions_parity_id:
|
||||
restrictions_parity_id = int(restrictions_parity_id)
|
||||
ret_vals = super(HotelVirtualRoomResrtrictionItem, self).write(vals)
|
||||
@@ -64,7 +64,7 @@ class HotelVirtualRoomResrtrictionItem(models.Model):
|
||||
@api.multi
|
||||
def unlink(self):
|
||||
restrictions_parity_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
if restrictions_parity_id:
|
||||
restrictions_parity_id = int(restrictions_parity_id)
|
||||
# Construct dictionary with relevant info of removed records
|
||||
|
||||
@@ -18,6 +18,8 @@ var PMSCalendarController = AbstractController.extend({
|
||||
onLoadViewFilters: '_onLoadViewFilters',
|
||||
onUpdateButtonsCounter: '_onUpdateButtonsCounter',
|
||||
onReloadCalendar: '_onReloadCalendar',
|
||||
onUpdateReservations: '_onUpdateReservations',
|
||||
onSwapReservations: '_onSwapReservations'
|
||||
}),
|
||||
|
||||
init: function (parent, model, renderer, params) {
|
||||
@@ -45,6 +47,37 @@ var PMSCalendarController = AbstractController.extend({
|
||||
//--------------------------------------------------------------------------
|
||||
// Handlers
|
||||
//--------------------------------------------------------------------------
|
||||
_onUpdateReservations: function (ev) {
|
||||
var self = this;
|
||||
return this.model.update_records(ev.data.ids, ev.data.values).then(function(result){
|
||||
// Remove OB Room Row?
|
||||
if (ev.data.oldReservation.room.overbooking) {
|
||||
self.renderer._hcalendar.removeOBRoomRow(ev.data.oldReservation);
|
||||
}
|
||||
}).fail(function(err, errev){
|
||||
self.renderer._hcalendar.replaceReservation(ev.data.newReservation, ev.data.oldReservation);
|
||||
});
|
||||
},
|
||||
|
||||
_onSwapReservations: function (ev) {
|
||||
var self = this;
|
||||
return this.model.swap_reservations(ev.data.fromIds, ev.data.toIds).then(function(results){
|
||||
var allReservs = ev.data.detail.inReservs.concat(ev.data.detail.outReservs);
|
||||
for (var nreserv of allReservs) {
|
||||
self.renderer.$el.find(nreserv._html).stop(true);
|
||||
}
|
||||
}).fail(function(err, errev){
|
||||
for (var nreserv of ev.data.detail.inReservs) {
|
||||
self.renderer.$el.find(nreserv._html).animate({'top': refFromReservDiv.style.top}, 'fast');
|
||||
}
|
||||
for (var nreserv of ev.detail.outReservs) {
|
||||
self.renderer.$el.find(nreserv._html).animate({'top': refToReservDiv.style.top}, 'fast');
|
||||
}
|
||||
|
||||
self.renderer.$el._hcalendar.swapReservations(ev.data.detail.outReservs, ev.data.detail.inReservs);
|
||||
});
|
||||
},
|
||||
|
||||
_onLoadCalendarSettings: function (ev) {
|
||||
var self = this;
|
||||
return this.model.get_hcalendar_settings().then(function(options){
|
||||
@@ -71,17 +104,15 @@ var PMSCalendarController = AbstractController.extend({
|
||||
r[0], // Id
|
||||
r[1], // Name
|
||||
r[2], // Capacity
|
||||
r[4], // Category
|
||||
r[5], // Shared Room
|
||||
r[6] // Price
|
||||
r[3], // Category
|
||||
r[4], // Shared Room
|
||||
r[5] // Price
|
||||
);
|
||||
nroom.addUserData({
|
||||
'categ_id': r[3],
|
||||
'price_from': r[6][0] === 'fixed'?`${r[6][1]}${HotelConstants.CURRENCY_SYMBOL} (${_t('Fixed Price')})`:r[6][3],
|
||||
'inside_rooms': r[7],
|
||||
'inside_rooms_ids': r[8],
|
||||
'floor_id': r[9],
|
||||
'amenities': r[10]
|
||||
'room_type_name': r[6],
|
||||
'room_type_id': r[7],
|
||||
'floor_id': r[8],
|
||||
'amenities': r[9]
|
||||
});
|
||||
rooms.push(nroom);
|
||||
}
|
||||
@@ -91,10 +122,10 @@ var PMSCalendarController = AbstractController.extend({
|
||||
// TODO: Not read this... do the change!!
|
||||
var reservs = [];
|
||||
for (var r of results['reservations']) {
|
||||
var room = self._hcalendar.getRoom(r[0], r[15], r[1]);
|
||||
var room = self.renderer._hcalendar.getRoom(r[0], r[15], r[1]);
|
||||
// need create a overbooking row?
|
||||
if (!room && r[15]) {
|
||||
room = self.renderer._hcalendar.createOBRoom(self._hcalendar.getRoom(r[0]), r[1]);
|
||||
room = self.renderer._hcalendar.createOBRoom(self.renderer._hcalendar.getRoom(r[0]), r[1]);
|
||||
self.renderer._hcalendar.createOBRoomRow(room);
|
||||
}
|
||||
if (!room) {
|
||||
@@ -241,10 +272,10 @@ var PMSCalendarController = AbstractController.extend({
|
||||
nreservs = _.reject(nreservs, function(item){ return item.id == reserv['reserv_id']; });
|
||||
} else {
|
||||
nreservs = _.reject(nreservs, {'id': reserv['reserv_id']}); // Only like last changes
|
||||
var room = this.renderer._hcalendar.getRoom(reserv['product_id'], reserv['overbooking'], reserv['reserv_id']);
|
||||
var room = this.renderer._hcalendar.getRoom(reserv['id'], reserv['overbooking'], reserv['reserv_id']);
|
||||
// need create a overbooking row?
|
||||
if (!room && reserv['overbooking']) {
|
||||
room = this.renderer._hcalendar.createOBRoom(this.renderer._hcalendar.getRoom(reserv['product_id']), reserv['reserv_id']);
|
||||
room = this.renderer._hcalendar.createOBRoom(this.renderer._hcalendar.getRoom(reserv['id']), reserv['reserv_id']);
|
||||
this.renderer._hcalendar.createOBRoomRow(room);
|
||||
}
|
||||
if (!room) {
|
||||
|
||||
@@ -102,7 +102,7 @@ return AbstractModel.extend({
|
||||
return this._rpc({
|
||||
model: this.modelName,
|
||||
method: 'write',
|
||||
args: [ids, write_values],
|
||||
args: [ids, vals],
|
||||
context: Session.user_context,
|
||||
});
|
||||
},
|
||||
|
||||
@@ -35,7 +35,6 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
/** VIEW METHODS **/
|
||||
init: function(parent, state, params) {
|
||||
this._super.apply(this, arguments);
|
||||
this.model = params.model;
|
||||
},
|
||||
|
||||
start: function () {
|
||||
@@ -204,20 +203,12 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
for (var nreserv of ev.detail.outReservs) {
|
||||
$(nreserv._html).animate({'top': refFromReservDiv.style.top});
|
||||
}
|
||||
self.model.swapReservations(fromIds, toIds).then(function(results){
|
||||
var allReservs = ev.detail.inReservs.concat(ev.detail.outReservs);
|
||||
for (nreserv of allReservs) {
|
||||
$(nreserv._html).stop(true);
|
||||
}
|
||||
}).fail(function(err, errev){
|
||||
for (var nreserv of ev.detail.inReservs) {
|
||||
$(nreserv._html).animate({'top': refFromReservDiv.style.top}, 'fast');
|
||||
}
|
||||
for (var nreserv of ev.detail.outReservs) {
|
||||
$(nreserv._html).animate({'top': refToReservDiv.style.top}, 'fast');
|
||||
}
|
||||
|
||||
self._hcalendar.swapReservations(ev.detail.outReservs, ev.detail.inReservs);
|
||||
self.trigger_up('onSwapReservations', {
|
||||
'fromIds': fromIds,
|
||||
'toIds': toIds,
|
||||
'detail': ev.detail,
|
||||
'refFromReservDiv': refFromReservDiv,
|
||||
'refToReservDiv': refToReservDiv
|
||||
});
|
||||
} else {
|
||||
var qdict = {};
|
||||
@@ -290,16 +281,14 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
var write_values = {
|
||||
'checkin': newReservation.startDate.format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT),
|
||||
'checkout': newReservation.endDate.format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT),
|
||||
'product_id': roomId,
|
||||
'room_id': roomId,
|
||||
'overbooking': newReservation.room.overbooking
|
||||
};
|
||||
self.model.update_records([newReservation.id], write_values).then(function(result){
|
||||
// Remove OB Room Row?
|
||||
if (oldReservation.room.overbooking) {
|
||||
self._hcalendar.removeOBRoomRow(oldReservation);
|
||||
}
|
||||
}).fail(function(err, errev){
|
||||
self._hcalendar.replaceReservation(newReservation, oldReservation);
|
||||
self.trigger_up('onUpdateReservations', {
|
||||
'ids': [newReservation.id],
|
||||
'values': write_values,
|
||||
'oldReservation': oldReservation,
|
||||
'newReservation': newReservation
|
||||
});
|
||||
// Workarround for dispatch room lines regeneration
|
||||
// new Model('hotel.reservation').call('on_change_checkin_checkout_product_id', [[newReservation.id], false]);
|
||||
@@ -313,7 +302,7 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
],
|
||||
$content: QWeb.render('HotelCalendar.ConfirmReservationChanges', qdict)
|
||||
}).open();
|
||||
dialog.$modal.on('hide.bs.modal', function(e){
|
||||
dialog.opened(function(e){
|
||||
if (!hasChanged) {
|
||||
self._hcalendar.replaceReservation(newReservation, oldReservation);
|
||||
}
|
||||
@@ -327,14 +316,14 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
var last_cell = ev.detail.cells[ev.detail.cells.length-1];
|
||||
var date_cell_start = HotelCalendar.toMoment(self._hcalendar.etable.querySelector(`#${ev.detail.cells[0].dataset.hcalParentCell}`).dataset.hcalDate);
|
||||
var date_cell_end = HotelCalendar.toMoment(self._hcalendar.etable.querySelector(`#${last_cell.dataset.hcalParentCell}`).dataset.hcalDate);
|
||||
var parentRow = document.querySelector(`#${ev.detail.cells[0].dataset.hcalParentRow}`);
|
||||
var room = self._hcalendar.getRoom(parentRow.dataset.hcalRoomObjId);
|
||||
if (room.overbooking) {
|
||||
return;
|
||||
}
|
||||
var nights = date_cell_end.diff(date_cell_start, 'days');
|
||||
var parentRow = document.querySelector(`#${ev.detail.cells[0].dataset.hcalParentRow}`);
|
||||
var room = self._hcalendar.getRoom(parentRow.dataset.hcalRoomObjId);
|
||||
if (room.overbooking) {
|
||||
return;
|
||||
}
|
||||
var nights = date_cell_end.diff(date_cell_start, 'days');
|
||||
var qdict = {
|
||||
'total_price': Number(ev.detail.totalPrice).toLocaleString(),
|
||||
//'total_price': Number(ev.detail.totalPrice).toLocaleString(),
|
||||
'nights': nights
|
||||
};
|
||||
$(last_cell).tooltip({
|
||||
@@ -379,7 +368,8 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
'default_checkout': endDate.utc().format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT),
|
||||
'default_adults': numBeds,
|
||||
'default_children': 0,
|
||||
'default_product_id': room.id,
|
||||
'default_room_id': room.id,
|
||||
'default_room_type_id': room.getUserData('room_type_id'),
|
||||
},
|
||||
title: _t("Create: ") + _t("Reservation"),
|
||||
initial_view: "form",
|
||||
@@ -403,10 +393,10 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
_assign_extra_info: function() {
|
||||
var self = this;
|
||||
$(this._hcalendar.etable).find('.hcal-cell-room-type-group-item.btn-hcal-3d').on("mouseenter", function(){
|
||||
var $this = $(this);
|
||||
var room = self._hcalendar.getRoom($this.parent().data("hcalRoomObjId"));
|
||||
if (room.overbooking) {
|
||||
$this.tooltip({
|
||||
var $this = $(this);
|
||||
var room = self._hcalendar.getRoom($this.parent().data("hcalRoomObjId"));
|
||||
if (room.overbooking) {
|
||||
$this.tooltip({
|
||||
animation: true,
|
||||
html: true,
|
||||
placement: 'right',
|
||||
@@ -414,13 +404,11 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
}).tooltip('show');
|
||||
return;
|
||||
} else {
|
||||
var qdict = {
|
||||
'price_from': room.getUserData('price_from'),
|
||||
'inside_rooms': room.getUserData('inside_rooms'),
|
||||
'num_inside_rooms': room.getUserData('inside_rooms').length,
|
||||
'name': room.number
|
||||
};
|
||||
$this.tooltip({
|
||||
var qdict = {
|
||||
'room_type_name': room.getUserData('room_type_name'),
|
||||
'name': room.number
|
||||
};
|
||||
$this.tooltip({
|
||||
animation: true,
|
||||
html: true,
|
||||
placement: 'right',
|
||||
@@ -636,7 +624,7 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
var $list = this.$el.find('#pms-search #type_list');
|
||||
$list.html('');
|
||||
resultsHotelRoomType.forEach(function(item, index){
|
||||
$list.append(`<option value="${item.cat_id[0]}">${item.name}</option>`);
|
||||
$list.append(`<option value="${item.id}">${item.name}</option>`);
|
||||
});
|
||||
$list.select2({
|
||||
theme: "classic"
|
||||
@@ -800,7 +788,7 @@ var HotelCalendarView = AbstractRenderer.extend({
|
||||
domain.push(['amenities', 'in', amenities]);
|
||||
}
|
||||
if (virtual && virtual.length > 0) {
|
||||
domain.push(['inside_rooms_ids', 'some', virtual]);
|
||||
domain.push(['room_type_id', 'some', virtual]);
|
||||
}
|
||||
|
||||
this._hcalendar.setDomain(HotelCalendar.DOMAIN.ROOMS, domain);
|
||||
|
||||
@@ -193,8 +193,6 @@ var PMSCalendarView = AbstractView.extend({
|
||||
this.controllerParams.context = params.context || {};
|
||||
this.controllerParams.displayName = params.action && params.action.name;
|
||||
|
||||
this.rendererParams.model = viewInfo.model;
|
||||
|
||||
this.loadParams.fields = fields;
|
||||
this.loadParams.fieldsInfo = viewInfo.fieldsInfo;
|
||||
this.loadParams.creatable = false;
|
||||
|
||||
@@ -83,15 +83,7 @@
|
||||
|
||||
<t t-name="HotelCalendar.TooltipRoom">
|
||||
<div class="oe_tooltip_string"><t t-esc="name"/></div>
|
||||
<p><b>Price From:</b> <t t-esc="price_from"/></p>
|
||||
<t t-if="num_inside_rooms > 0">
|
||||
<b>Belongs to the Virtual Rooms:</b>
|
||||
<ul>
|
||||
<li t-foreach="inside_rooms" t-as="room_name">
|
||||
<t t-esc="room_name"/>
|
||||
</li>
|
||||
</ul>
|
||||
</t>
|
||||
<p><b>Room Type:</b> <t t-esc="room_type_name"/></p>
|
||||
</t>
|
||||
|
||||
<t t-name="HotelCalendar.TooltipEvent">
|
||||
|
||||
@@ -222,12 +222,12 @@ class TestReservationsCalendar(TestHotelCalendar):
|
||||
self.user_hotel_manager.pms_type_move == 'assisted',
|
||||
"Hotel Calendar Invalid Options!")
|
||||
default_arrival_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_arrival_hour')
|
||||
'res.config.settings', 'default_arrival_hour')
|
||||
self.assertEqual(hcal_options['default_arrival_hour'],
|
||||
default_arrival_hour,
|
||||
"Hotel Calendar Invalid Options!")
|
||||
default_departure_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour')
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
self.assertEqual(hcal_options['default_departure_hour'],
|
||||
default_departure_hour,
|
||||
"Hotel Calendar Invalid Options!")
|
||||
|
||||
@@ -48,7 +48,7 @@ class FolioWizard(models.TransientModel):
|
||||
def _get_default_checkin(self):
|
||||
folio = False
|
||||
default_arrival_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_arrival_hour')
|
||||
'res.config.settings', 'default_arrival_hour')
|
||||
if 'folio_id' in self._context:
|
||||
folio = self.env['hotel.folio'].search([
|
||||
('id', '=', self._context['folio_id'])
|
||||
@@ -57,7 +57,7 @@ class FolioWizard(models.TransientModel):
|
||||
return folio.room_lines[0].checkin
|
||||
else:
|
||||
tz_hotel = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'tz_hotel')
|
||||
'res.config.settings', 'tz_hotel')
|
||||
now_utc_dt = date_utils.now()
|
||||
ndate = "%s %s:00" % \
|
||||
(now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
||||
@@ -70,7 +70,7 @@ class FolioWizard(models.TransientModel):
|
||||
def _get_default_checkout(self):
|
||||
folio = False
|
||||
default_departure_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour')
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
if 'folio_id' in self._context:
|
||||
folio = self.env['hotel.folio'].search([
|
||||
('id', '=', self._context['folio_id'])
|
||||
@@ -79,7 +79,7 @@ class FolioWizard(models.TransientModel):
|
||||
return folio.room_lines[0].checkout
|
||||
else:
|
||||
tz_hotel = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'tz_hotel')
|
||||
'res.config.settings', 'tz_hotel')
|
||||
now_utc_dt = date_utils.now() + timedelta(days=1)
|
||||
ndate = "%s %s:00" % \
|
||||
(now_utc_dt.strftime(DEFAULT_SERVER_DATE_FORMAT),
|
||||
@@ -148,14 +148,14 @@ class FolioWizard(models.TransientModel):
|
||||
line.checkout,
|
||||
hours=False)
|
||||
hotel_tz = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings',
|
||||
'res.config.settings',
|
||||
'hotel_tz')
|
||||
start_date_utc_dt = date_utils.get_datetime(self.checkin)
|
||||
start_date_dt = date_utils.dt_as_timezone(start_date_utc_dt,
|
||||
hotel_tz)
|
||||
for room in product_list:
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if pricelist_id:
|
||||
pricelist_id = int(pricelist_id)
|
||||
res_price = 0
|
||||
@@ -208,14 +208,14 @@ class FolioWizard(models.TransientModel):
|
||||
self.checkout = time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
||||
|
||||
# UTC -> Hotel tz
|
||||
tz = self.env['ir.default'].sudo().get('hotel.config.settings',
|
||||
tz = self.env['ir.default'].sudo().get('res.config.settings',
|
||||
'tz_hotel')
|
||||
chkin_utc_dt = date_utils.get_datetime(self.checkin)
|
||||
chkout_utc_dt = date_utils.get_datetime(self.checkout)
|
||||
|
||||
if chkin_utc_dt >= chkout_utc_dt:
|
||||
dpt_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour')
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
checkout_str = (chkin_utc_dt + timedelta(days=1)).strftime(
|
||||
DEFAULT_SERVER_DATE_FORMAT)
|
||||
checkout_str = "%s %s:00" % (checkout_str, dpt_hour)
|
||||
@@ -397,14 +397,14 @@ class VirtualRoomWizars(models.TransientModel):
|
||||
if self.rooms_num > self.max_rooms:
|
||||
raise ValidationError(_("There are not enough rooms!"))
|
||||
# UTC -> Hotel tz
|
||||
tz = self.env['ir.default'].sudo().get('hotel.config.settings',
|
||||
tz = self.env['ir.default'].sudo().get('res.config.settings',
|
||||
'tz_hotel')
|
||||
chkin_utc_dt = date_utils.get_datetime(self.checkin)
|
||||
chkout_utc_dt = date_utils.get_datetime(self.checkout)
|
||||
|
||||
if chkin_utc_dt >= chkout_utc_dt:
|
||||
dpt_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour')
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
checkout_str = (chkin_utc_dt + timedelta(days=1)).strftime(
|
||||
DEFAULT_SERVER_DATE_FORMAT)
|
||||
checkout_str = "%s %s:00" % (checkout_str, dpt_hour)
|
||||
@@ -424,7 +424,7 @@ class VirtualRoomWizars(models.TransientModel):
|
||||
checkout_dt -= timedelta(days=1)
|
||||
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if pricelist_id:
|
||||
pricelist_id = int(pricelist_id)
|
||||
|
||||
@@ -507,14 +507,14 @@ class ReservationWizard(models.TransientModel):
|
||||
self.checkout = self.folio_wizard_id.checkout
|
||||
|
||||
hotel_tz = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'hotel_tz')
|
||||
'res.config.settings', 'hotel_tz')
|
||||
start_date_utc_dt = date_utils.get_datetime(line.checkin)
|
||||
start_date_dt = date_utils.dt_as_timezone(start_date_utc_dt,
|
||||
hotel_tz)
|
||||
|
||||
if line.virtual_room_id:
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if pricelist_id:
|
||||
pricelist_id = int(pricelist_id)
|
||||
nights = days_diff = date_utils.date_diff(line.checkin,
|
||||
@@ -567,7 +567,7 @@ class ServiceWizard(models.TransientModel):
|
||||
if self.product_id:
|
||||
#TODO change pricelist for partner
|
||||
pricelist_id = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
prod = self.product_id.with_context(
|
||||
lang=self.folio_wizard_id.partner_id.lang,
|
||||
partner=self.folio_wizard_id.partner_id.id,
|
||||
|
||||
@@ -14,13 +14,13 @@ class HotelReservation(models.Model):
|
||||
|
||||
@api.model
|
||||
def _generate_reservation_notif(self, action, ntype, title,
|
||||
product_id, reserv_id, partner_name,
|
||||
id, reserv_id, partner_name,
|
||||
adults, children, checkin, checkout,
|
||||
folio_id, color, color_text, splitted,
|
||||
parent_reservation, room_name,
|
||||
partner_phone, state, fix_days):
|
||||
vals = super(HotelReservation, self)._generate_reservation_notif(
|
||||
action, ntype, title, product_id,
|
||||
action, ntype, title, id,
|
||||
reserv_id, partner_name, adults,
|
||||
children, checkin, checkout,
|
||||
folio_id, color, color_text, splitted, parent_reservation,
|
||||
|
||||
@@ -193,13 +193,13 @@ class HotelChannelConnectorImporter(AbstractComponent):
|
||||
_logger.info("=== BOOKINGS FROM WUBOOK")
|
||||
_logger.info(bookings)
|
||||
default_arrival_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_arrival_hour')
|
||||
'res.config.settings', 'default_arrival_hour')
|
||||
default_departure_hour = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'default_departure_hour')
|
||||
'res.config.settings', 'default_departure_hour')
|
||||
|
||||
# Get user timezone
|
||||
tz_hotel = self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'tz_hotel')
|
||||
'res.config.settings', 'tz_hotel')
|
||||
res_partner_obj = self.env['res.partner']
|
||||
hotel_reserv_obj = self.env['hotel.reservation']
|
||||
hotel_folio_obj = self.env['hotel.folio']
|
||||
|
||||
@@ -82,7 +82,7 @@ class website_wubook(http.Controller):
|
||||
wubook_obj.fetch_rooms_values(dfrom, dto)
|
||||
|
||||
parity_restr_id = request.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id')
|
||||
'res.config.settings', 'parity_restrictions_id')
|
||||
if parity_restr_id:
|
||||
vroom_restr_obj = request.env['hotel.virtual.room.restriction']
|
||||
restr_id = vroom_restr_obj.sudo().browse(int(parity_restr_id))
|
||||
@@ -91,7 +91,7 @@ class website_wubook(http.Controller):
|
||||
rpid=restr_id.wpid)
|
||||
|
||||
parity_pricelist_id = request.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id')
|
||||
'res.config.settings', 'parity_pricelist_id')
|
||||
if parity_pricelist_id:
|
||||
pricelist_id = request.env['product.pricelist'].sudo().browse(
|
||||
int(parity_pricelist_id))
|
||||
|
||||
@@ -115,9 +115,9 @@ class HotelChannelConnectorConfiguration(models.TransientModel):
|
||||
|
||||
# Get Parity Models
|
||||
pricelist_id = int(self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_pricelist_id'))
|
||||
'res.config.settings', 'parity_pricelist_id'))
|
||||
restriction_id = int(self.env['ir.default'].sudo().get(
|
||||
'hotel.config.settings', 'parity_restrictions_id'))
|
||||
'res.config.settings', 'parity_restrictions_id'))
|
||||
|
||||
vroom_restr_it_obj = self.env['hotel.virtual.room.restriction.item']
|
||||
# Secure Wubook Input
|
||||
|
||||
@@ -124,10 +124,10 @@ class WuBookInstallerParity(models.TransientModel):
|
||||
wubookObj = self.env['wubook']
|
||||
irValuesObj = self.env['ir.values']
|
||||
for rec in self:
|
||||
irValuesObj.sudo().set_default('hotel.config.settings',
|
||||
irValuesObj.sudo().set_default('res.config.settings',
|
||||
'parity_pricelist_id',
|
||||
rec.parity_pricelist_id.id)
|
||||
irValuesObj.sudo().set_default('hotel.config.settings',
|
||||
irValuesObj.sudo().set_default('res.config.settings',
|
||||
'parity_restrictions_id',
|
||||
rec.parity_restrictions_id.id)
|
||||
import_data = rec.import_data
|
||||
|
||||
Reference in New Issue
Block a user