diff --git a/hotel_calendar/models/bus_hotel_calendar.py b/hotel_calendar/models/bus_hotel_calendar.py
index d1016ae29..f46b13598 100644
--- a/hotel_calendar/models/bus_hotel_calendar.py
+++ b/hotel_calendar/models/bus_hotel_calendar.py
@@ -52,6 +52,7 @@ class BusHotelCalendar(models.TransientModel):
'price_room_services_set': vals['price_room_services_set'],
'amount_total': vals['pending_amount'] + vals['invoices_paid'],
'real_dates': vals['real_dates'],
+ 'channel_type': vals['channel_type'],
},
'tooltip': {
'folio_name': vals['folio_name'],
diff --git a/hotel_calendar/models/inherited_hotel_reservation.py b/hotel_calendar/models/inherited_hotel_reservation.py
index 262a6f6c2..b99f2963d 100644
--- a/hotel_calendar/models/inherited_hotel_reservation.py
+++ b/hotel_calendar/models/inherited_hotel_reservation.py
@@ -94,7 +94,9 @@ class HotelReservation(models.Model):
'state': reserv['state'],
'price_room_services_set': reserv['price_room_services_set'],
'amount_total': reserv['amount_total'],
- 'real_dates': [reserv['real_checkin'], reserv['real_checkout']]})
+ 'real_dates': [reserv['real_checkin'], reserv['real_checkout']],
+ 'channel_type': reserv['channel_type'],
+ })
json_reservation_tooltips.update({
reserv['id']: {
'folio_name': reserv['folio_name'],
diff --git a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js
index d6e801f58..db93063ec 100644
--- a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js
+++ b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_controller.js
@@ -376,6 +376,7 @@ var PMSCalendarController = AbstractController.extend({
_assign_multi_calendar_events: function() {
var self = this;
this._multi_calendar.on_calendar('hcalOnSavePricelist', function(ev){
+ document.getElementById("btn_save_changes").disabled = true;
self.savePricelist(ev.detail.calendar_obj, ev.detail.pricelist_id, ev.detail.pricelist);
});
diff --git a/hotel_calendar/static/src/js/views/calendar_management/hotel_calendar_management_renderer.js b/hotel_calendar/static/src/js/views/calendar_management/hotel_calendar_management_renderer.js
index b3042c6cd..be035d910 100644
--- a/hotel_calendar/static/src/js/views/calendar_management/hotel_calendar_management_renderer.js
+++ b/hotel_calendar/static/src/js/views/calendar_management/hotel_calendar_management_renderer.js
@@ -84,7 +84,9 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
save_changes: function() {
var oparams = this.get_values_to_save();
- this.trigger_up('onSaveChanges', oparams);
+ if (oparams) {
+ this.trigger_up('onSaveChanges', oparams);
+ }
},
resetSaveState: function() {
@@ -138,6 +140,9 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
// Sticky Header Days
$('.o_content').scroll(this._on_scroll.bind(this));
+
+ // Initialize Save Button state to disable
+ document.getElementById("btn_save_changes").disabled = true;
},
setCalendarData: function (prices, restrictions, availability, count_reservations) {
@@ -149,23 +154,19 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
var self = this;
this._hcalendar.addEventListener('hcOnChangeDate', function(ev){
var date_begin = moment(ev.detail.newDate);
- var days = self._hcalendar.getOptions('days')-1;
- var date_end = date_begin.clone().add(days, 'd');
-
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
self.reload_hcalendar_management();
});
this._hcalendar.addEventListener('hcmOnInputChanged', function(ev){
var btn_save = self.$el.find('#btn_save_changes');
if (self._hcalendar.hasChangesToSave()) {
btn_save.addClass('need-save');
+ document.getElementById("btn_save_changes").disabled = false;
} else {
btn_save.removeClass('need-save');
+ document.getElementById("btn_save_changes").disabled = true;
}
});
},
@@ -250,94 +251,82 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
format : HotelConstants.L10N_DATE_MOMENT_FORMAT,
//disabledHours: [0, 1, 2, 3, 4, 5, 6, 7, 8, 18, 19, 20, 21, 22, 23]
};
+
var $dateTimePickerBegin = this.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = this.$el.find('#mpms-search #date_end');
$dateTimePickerBegin.datetimepicker(DTPickerOptions);
- $dateTimePickerEnd.datetimepicker($.extend({}, DTPickerOptions, { 'useCurrent': false }));
$dateTimePickerBegin.on("dp.change", function (e) {
- $dateTimePickerEnd.data("DateTimePicker").minDate(e.date.clone().add(3,'d'));
- $dateTimePickerEnd.data("DateTimePicker").maxDate(e.date.clone().add(2,'M'));
$dateTimePickerBegin.data("DateTimePicker").hide(); // TODO: Odoo uses old datetimepicker version
self.on_change_filter_date(e, true);
});
- $dateTimePickerEnd.on("dp.change", function (e) {
- $dateTimePickerEnd.data("DateTimePicker").hide(); // TODO: Odoo uses old datetimepicker version
- self.on_change_filter_date(e, false);
+
+ var $dateEndDays = this.$el.find('#mpms-search #date_end_days');
+ $dateEndDays.select2({
+ data: [
+ {id:7, text: '1w'},
+ {id:12, text: '2w'},
+ {id:21, text: '3w'},
+ {id:'month', text: '1m'},
+ {id:60, text: '2m'},
+ {id:90, text: '3m'},
+ ],
+ allowClear: true,
+ minimumResultsForSearch: -1
});
- // var date_begin = moment().startOf('day');
- // var date_end = date_begin.clone().add(this._view_options['days'], 'd').endOf('day');
- // $dateTimePickerBegin.data("ignore_onchange", true);
- // $dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- // $dateTimePickerEnd.data("DateTimePicker").date(date_end);
- // this._last_dates = this.generate_params()['dates'];
+ $dateEndDays.on("change", function (e) {
+ self.on_change_filter_date();
+ });
// View Events
this.$el.find("#mpms-search #cal-pag-prev-plus").on('click', function(ev){
// FIXME: Ugly repeated code. Change place.
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
- //var days = moment($dateTimePickerBegin.data("DateTimePicker").date()).clone().local().daysInMonth();
var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().subtract(14, 'd');
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().subtract(14, 'd');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
+ self.on_change_filter_date(ev, true);
ev.preventDefault();
});
this.$el.find("#mpms-search #cal-pag-prev").on('click', function(ev){
// FIXME: Ugly repeated code. Change place.
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().subtract(7, 'd');
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().subtract(7, 'd');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
+ self.on_change_filter_date(ev, true);
ev.preventDefault();
});
this.$el.find("#mpms-search #cal-pag-next-plus").on('click', function(ev){
// FIXME: Ugly repeated code. Change place.
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
- //var days = moment($dateTimePickerBegin.data("DateTimePicker").date()).clone().local().daysInMonth();
var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().add(14, 'd');
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().add(14, 'd');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
+ self.on_change_filter_date(ev, true);
ev.preventDefault();
});
this.$el.find("#mpms-search #cal-pag-next").on('click', function(ev){
// FIXME: Ugly repeated code. Change place.
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().add(7, 'd');
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().add(7, 'd');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
+ self.on_change_filter_date(ev, true);
ev.preventDefault();
});
this.$el.find("#mpms-search #cal-pag-selector").on('click', function(ev){
// FIXME: Ugly repeated code. Change place.
var $dateTimePickerBegin = self.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = self.$el.find('#mpms-search #date_end');
var date_begin = moment().startOf('day');
- var date_end = date_begin.clone().add(self._view_options['days'], 'd').endOf('day');
$dateTimePickerBegin.data("ignore_onchange", true);
$dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
-
+ self.on_change_filter_date(ev, true);
ev.preventDefault();
});
// Save Button
- this.$el.find("#btn_save_changes").on('click', function(ev){
+ this.$el.find("#btn_save_changes").on('click', function(ev) {
+ document.getElementById(this.id).disabled = true;
self.save_changes();
});
@@ -358,15 +347,15 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
} else {
this._view_options['days'] = (this._view_options['days'] !== 'month')?parseInt(this._view_options['days']):date_begin.daysInMonth();
}
- var date_end = date_begin.clone().add(this._view_options['days'], 'd').endOf('day');
- var $dateTimePickerBegin = this.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = this.$el.find('#mpms-search #date_end');
- //$dateTimePickerBegin.data("ignore_onchange", true);
- $dateTimePickerBegin.data("DateTimePicker").date(date_begin);
- //$dateTimePickerEnd.data("ignore_onchange", true);
- $dateTimePickerEnd.data("DateTimePicker").date(date_end);
- this._last_dates = this.generate_params()['dates'];
+ var $dateTimePickerBegin = this.$el.find('#mpms-search #date_begin');
+ $dateTimePickerBegin.data("DateTimePicker").date(date_begin);
+
+ var $dateEndDays = this.$el.find('#mpms-search #date_end_days');
+ $dateEndDays.val('month');
+ $dateEndDays.trigger('change');
+
+ this._last_dates = this.generate_params()['dates'];
this.trigger_up('onLoadCalendar');
},
@@ -374,25 +363,23 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
var self = this;
isStartDate = isStartDate || false;
var $dateTimePickerBegin = this.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = this.$el.find('#mpms-search #date_end');
+ var $dateEndDays = this.$el.find('#mpms-search #date_end_days');
// FIXME: Hackish onchange ignore (Used when change dates from code)
- if ($dateTimePickerBegin.data("ignore_onchange") || $dateTimePickerEnd.data("ignore_onchange")) {
+ if ($dateTimePickerBegin.data("ignore_onchange") || $dateEndDays.data("ignore_onchange")) {
$dateTimePickerBegin.data("ignore_onchange", false);
- $dateTimePickerEnd.data("ignore_onchange", false)
+ $dateEndDays.data("ignore_onchange", false);
return true;
}
var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().set({'hour': 0, 'minute': 0, 'second': 0}).clone();
if (this._hcalendar && date_begin) {
- if (isStartDate) {
- var ndate_end = date_begin.clone().add(this._view_options['days'], 'd');
- $dateTimePickerEnd.data("ignore_onchange", true);
- $dateTimePickerEnd.data("DateTimePicker").date(ndate_end.local());
+ var days = $dateEndDays.val();
+ if (days === 'month') {
+ days = date_begin.daysInMonth();
}
-
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().set({'hour': 23, 'minute': 59, 'second': 59}).clone();
+ var date_end = date_begin.set({'hour': 23, 'minute': 59, 'second': 59}).clone().add(days, 'd');
this._check_unsaved_changes(function(){
self._hcalendar.setStartDate(date_begin, self._hcalendar.getDateDiffDays(date_begin, date_end));
@@ -411,11 +398,15 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
var restrictions = this.$el.find('#mpms-search #restriction_list').val();
var $dateTimePickerBegin = this.$el.find('#mpms-search #date_begin');
- var $dateTimePickerEnd = this.$el.find('#mpms-search #date_end');
+ var $dateEndDays = this.$el.find('#mpms-search #date_end_days');
- var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().set({'hour': 0, 'minute': 0, 'second': 0}).clone().utc().format(HotelConstants.ODOO_DATE_MOMENT_FORMAT);
- var date_end = $dateTimePickerEnd.data("DateTimePicker").date().set({'hour': 23, 'minute': 59, 'second': 59}).clone().utc().format(HotelConstants.ODOO_DATE_MOMENT_FORMAT);
+ var date_begin = $dateTimePickerBegin.data("DateTimePicker").date().set({'hour': 0, 'minute': 0, 'second': 0}).clone();
+ var days = $dateEndDays.val();
+ if (days === 'month') {
+ days = date_begin.daysInMonth();
+ }
+ var date_end = date_begin.set({'hour': 23, 'minute': 59, 'second': 59}).clone().add(days, 'd');
return {
'dates': [date_begin, date_end],
'prices': prices,
@@ -428,6 +419,7 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
var btn_save = this.$el.find("#btn_save_changes");
if (!btn_save.hasClass('need-save')) {
btn_save.removeClass('need-save');
+ document.getElementById("btn_save_changes").disabled = true;
fnCallback();
return;
}
@@ -440,6 +432,7 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
classes: 'btn-primary',
close: true,
click: function() {
+ document.getElementById("btn_save_changes").disabled = true;
self.save_changes();
fnCallback();
}
@@ -449,6 +442,7 @@ var HotelCalendarManagementView = AbstractRenderer.extend({
close: true,
click: function() {
btn_save.removeClass('need-save');
+ document.getElementById("btn_save_changes").disabled = true;
fnCallback();
}
}
diff --git a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js
index e38a31e3e..554ea291a 100644
--- a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js
+++ b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js
@@ -1240,6 +1240,8 @@ HotelCalendar.prototype = {
});
}
});
+ // Initialize Save Button state to disable
+ this.btnSaveChanges.disabled = true;
cell.appendChild(this.btnSaveChanges);
}
//cell.setAttribute('class', 'col-xs-1 col-lg-1');
@@ -2451,8 +2453,10 @@ HotelCalendar.prototype = {
if (this.edivc.querySelector('.hcal-input-changed') !== null)
{
this.btnSaveChanges.classList.add('need-save');
+ this.btnSaveChanges.disabled = false;
} else {
this.btnSaveChanges.classList.remove('need-save');
+ this.btnSaveChanges.disabled = true;
}
},
diff --git a/hotel_calendar/static/src/xml/hotel_calendar_management_view.xml b/hotel_calendar/static/src/xml/hotel_calendar_management_view.xml
index 2e131f5b5..c75e7ee68 100644
--- a/hotel_calendar/static/src/xml/hotel_calendar_management_view.xml
+++ b/hotel_calendar/static/src/xml/hotel_calendar_management_view.xml
@@ -22,22 +22,27 @@
- FROM
+ FROM
+
|
- TO
-
-
-
-
-
-
+ RANGE
+
+
+
+
+
+
+
+
+
+
|
diff --git a/hotel_calendar_channel_connector/static/src/js/views/hotel_calendar_controller.js b/hotel_calendar_channel_connector/static/src/js/views/hotel_calendar_controller.js
index 996d133d2..266291905 100644
--- a/hotel_calendar_channel_connector/static/src/js/views/hotel_calendar_controller.js
+++ b/hotel_calendar_channel_connector/static/src/js/views/hotel_calendar_controller.js
@@ -76,7 +76,7 @@ var PMSHotelCalendarController = PMSCalendarController.include({
}
else if (notif[1]['type'] === 'reservation') {
var reserv = notif[1]['reservation'];
- if (reserv['external_id']) {
+ if (reserv['channel_type'] == 'web') {
if (notif[1]['action'] === 'create') {
this._play_sound(this.SOUNDS.BOOK_NEW);
} else if (notif[1]['action'] !== 'unlink' && reserv['state'] === 'cancelled') {
diff --git a/hotel_channel_connector/models/channel_backend/common.py b/hotel_channel_connector/models/channel_backend/common.py
index 4797d3c4d..6440c087c 100644
--- a/hotel_channel_connector/models/channel_backend/common.py
+++ b/hotel_channel_connector/models/channel_backend/common.py
@@ -267,11 +267,11 @@ class ChannelBackend(models.Model):
_logger.warning(msg)
email_values.update({'body_html': email_values['body_html'] + msg + '
'})
-
if len(email_values['body_html']) > 0:
- template = self.env.ref('hotel_channel_connector.mail_template_hotel_availability_watchdog')
- email_values.update({'email_to': self._context['email_to']})
- template.send_mail(self.id, email_values=email_values)
+ if 'email_to' in self._context:
+ template = self.env.ref('hotel_channel_connector.mail_template_hotel_availability_watchdog')
+ email_values.update({'email_to': self._context['email_to']})
+ template.send_mail(self.id, email_values=email_values)
# push availability on demand
self.with_context({'show_notify': False}).push_availability()
diff --git a/hotel_channel_connector/models/hotel_room_type/common.py b/hotel_channel_connector/models/hotel_room_type/common.py
index 8c5b6224a..2b70f9676 100644
--- a/hotel_channel_connector/models/hotel_room_type/common.py
+++ b/hotel_channel_connector/models/hotel_room_type/common.py
@@ -2,7 +2,6 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import api, models, fields, _
-from odoo.exceptions import UserError
from odoo.exceptions import ValidationError
from odoo.addons import decimal_precision as dp
from odoo.addons.queue_job.job import job
@@ -26,7 +25,6 @@ class ChannelHotelRoomType(models.Model):
def _default_availability(self):
return max(min(self.default_quota, self.default_max_avail), 0)
-
odoo_id = fields.Many2one(comodel_name='hotel.room.type',
string='Room Type',
required=True,
@@ -139,6 +137,14 @@ class HotelRoomType(models.Model):
for record in self:
record.capacity = record.get_capacity()
+ @api.constrains('active')
+ def _check_active(self):
+ for record in self:
+ if not record.active and record.total_rooms_count > 0:
+ raise ValidationError(
+ _("You can not archive a room type with active rooms.") + " " +
+ _("Please, change the %s room(s) to other room type.") % str(record.total_rooms_count))
+
@api.multi
def get_restrictions(self, date, restriction_plan_id):
self.ensure_one()
@@ -172,10 +178,14 @@ class HotelRoomType(models.Model):
@api.multi
def disconnect_channel_bind_ids(self):
- channel_bind_ids = self.mapped('channel_bind_ids')
- msg = _("This function is not yet implemented.")
- msg += _(" The room type [%s] should be delete from the channel manager.") % channel_bind_ids.get_external_id
- raise UserError(msg)
+ # TODO: multichannel rooms is not implemented
+ self.channel_bind_ids.with_context({'connector_no_export': True}).unlink()
+
+ @api.multi
+ def write(self, vals):
+ if 'active' in vals and vals.get('active') is False:
+ self.channel_bind_ids.unlink()
+ return super().write(vals)
class BindingHotelRoomTypeListener(Component):
diff --git a/hotel_channel_connector/models/hotel_room_type_restriction/common.py b/hotel_channel_connector/models/hotel_room_type_restriction/common.py
index 4cd669c67..c8d902198 100644
--- a/hotel_channel_connector/models/hotel_room_type_restriction/common.py
+++ b/hotel_channel_connector/models/hotel_room_type_restriction/common.py
@@ -53,6 +53,7 @@ class ChannelHotelRoomTypeRestriction(models.Model):
importer = work.component(usage='hotel.room.type.restriction.importer')
return importer.import_restriction_plans()
+
class HotelRoomTypeRestriction(models.Model):
_inherit = 'hotel.room.type.restriction'
@@ -99,10 +100,15 @@ class HotelRoomTypeRestriction(models.Model):
@api.multi
def disconnect_channel_bind_ids(self):
- channel_bind_ids = self.mapped('channel_bind_ids')
- msg = _("This function is not yet implemented.")
- msg += _(" The restriction plan [%s] should be delete from the channel manager.") % channel_bind_ids.get_external_id
- raise UserError(msg)
+ # TODO: multichannel rooms is not implemented
+ self.channel_bind_ids.with_context({'connector_no_export': True}).unlink()
+
+ @api.multi
+ def write(self, vals):
+ if 'active' in vals and vals.get('active') is False:
+ self.channel_bind_ids.unlink()
+ return super().write(vals)
+
class BindingHotelRoomTypeListener(Component):
_name = 'binding.hotel.room.type.restriction.listener'
@@ -115,6 +121,7 @@ class BindingHotelRoomTypeListener(Component):
for binding in record.channel_bind_ids:
binding.update_plan_name()
+
class ChannelBindingHotelRoomTypeRestrictionListener(Component):
_name = 'channel.binding.hotel.room.type.restriction.listener'
_inherit = 'base.connector.listener'
diff --git a/hotel_channel_connector/models/inherited_hotel_room.py b/hotel_channel_connector/models/inherited_hotel_room.py
index bf411908f..b297cba99 100644
--- a/hotel_channel_connector/models/inherited_hotel_room.py
+++ b/hotel_channel_connector/models/inherited_hotel_room.py
@@ -61,7 +61,7 @@ class HotelRoom(models.Model):
channel_availability = self.env['channel.hotel.room.type.availability'].search([
('room_type_id', '=', item['old_room_type_id']),
- ('channel_avail', '>=', old_room_type_total_rooms_count),
+ ('channel_avail', '>', old_room_type_total_rooms_count),
('date', '>=', _today)
], order='date asc') or False
if channel_availability:
@@ -119,6 +119,11 @@ class HotelRoom(models.Model):
checkout=dto,
backend_id=new_channel_room_type.backend_id.id,
room_type_id=item['new_room_type_id'], )
+ # TODO: channel_backend MUST be the same for both room types
+ channel_backend = self.env['channel.hotel.room.type'].search([
+ ('odoo_id', '=', vals.get('room_type_id'))
+ ]).backend_id
+ channel_backend.channel_availability_watchdog()
else:
res = super().write(vals)
return res
diff --git a/hotel_channel_connector/models/product_pricelist/common.py b/hotel_channel_connector/models/product_pricelist/common.py
index f2257a721..995672a20 100644
--- a/hotel_channel_connector/models/product_pricelist/common.py
+++ b/hotel_channel_connector/models/product_pricelist/common.py
@@ -82,7 +82,6 @@ class ProductPricelist(models.Model):
inverse_name='odoo_id',
string='Hotel Channel Connector Bindings')
-
pricelist_type = fields.Selection(selection_add=[
('virtual', 'Virtual Plan'),
])
@@ -104,7 +103,6 @@ class ProductPricelist(models.Model):
for item in record.item_ids):
record.is_virtual_plan = False
-
@api.multi
@api.depends('name')
def name_get(self):
@@ -144,10 +142,14 @@ class ProductPricelist(models.Model):
@api.multi
def disconnect_channel_bind_ids(self):
- channel_bind_ids = self.mapped('channel_bind_ids')
- msg = _("This function is not yet implemented.")
- msg += _(" The pricelist [%s] should be delete from the channel manager.") % channel_bind_ids.get_external_id
- raise UserError(msg)
+ # TODO: multichannel rooms is not implemented
+ self.channel_bind_ids.with_context({'connector_no_export': True}).unlink()
+
+ @api.multi
+ def write(self, vals):
+ if 'active' in vals and vals.get('active') is False:
+ self.channel_bind_ids.unlink()
+ return super().write(vals)
class BindingProductPricelistListener(Component):
diff --git a/hotel_channel_connector/views/inherited_hotel_room_type_restriction_views.xml b/hotel_channel_connector/views/inherited_hotel_room_type_restriction_views.xml
index fcc2e4585..e822a7328 100644
--- a/hotel_channel_connector/views/inherited_hotel_room_type_restriction_views.xml
+++ b/hotel_channel_connector/views/inherited_hotel_room_type_restriction_views.xml
@@ -5,20 +5,41 @@
hotel.room.type.restriction
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/hotel_channel_connector/views/inherited_hotel_room_type_views.xml b/hotel_channel_connector/views/inherited_hotel_room_type_views.xml
index 814227f2d..df2689cc2 100644
--- a/hotel_channel_connector/views/inherited_hotel_room_type_views.xml
+++ b/hotel_channel_connector/views/inherited_hotel_room_type_views.xml
@@ -5,20 +5,43 @@
hotel.room.type
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/hotel_channel_connector/views/inherited_product_pricelist_views.xml b/hotel_channel_connector/views/inherited_product_pricelist_views.xml
index 4a12b3f05..09f8b7309 100644
--- a/hotel_channel_connector/views/inherited_product_pricelist_views.xml
+++ b/hotel_channel_connector/views/inherited_product_pricelist_views.xml
@@ -5,20 +5,41 @@
product.pricelist
+
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/hotel_channel_connector_wubook/models/hotel_room_type/deleter.py b/hotel_channel_connector_wubook/models/hotel_room_type/deleter.py
index fa49153e5..31460f4bf 100644
--- a/hotel_channel_connector_wubook/models/hotel_room_type/deleter.py
+++ b/hotel_channel_connector_wubook/models/hotel_room_type/deleter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api
+from odoo import api, _
+from odoo.exceptions import ValidationError
class HotelRoomTypeDeleter(Component):
@@ -18,3 +19,4 @@ class HotelRoomTypeDeleter(Component):
section='room',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']) + ". " + _(str(err)))
diff --git a/hotel_channel_connector_wubook/models/hotel_room_type/exporter.py b/hotel_channel_connector_wubook/models/hotel_room_type/exporter.py
index 9131fb5d5..757a12380 100644
--- a/hotel_channel_connector_wubook/models/hotel_room_type/exporter.py
+++ b/hotel_channel_connector_wubook/models/hotel_room_type/exporter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api, fields
+from odoo import api, fields, _
+from odoo.exceptions import AccessError, UserError, ValidationError
class HotelRoomTypeExporter(Component):
@@ -44,6 +45,7 @@ class HotelRoomTypeExporter(Component):
section='room',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
@api.model
def create_room(self, binding):
@@ -78,6 +80,7 @@ class HotelRoomTypeExporter(Component):
section='room',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
else:
binding.with_context({
'connector_no_export': True,
diff --git a/hotel_channel_connector_wubook/models/hotel_room_type_restriction/deleter.py b/hotel_channel_connector_wubook/models/hotel_room_type_restriction/deleter.py
index 87b19d310..5f990a772 100644
--- a/hotel_channel_connector_wubook/models/hotel_room_type_restriction/deleter.py
+++ b/hotel_channel_connector_wubook/models/hotel_room_type_restriction/deleter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api
+from odoo import api, _
+from odoo.exceptions import ValidationError
class HotelRoomTypeRestrictionDeleter(Component):
@@ -18,3 +19,4 @@ class HotelRoomTypeRestrictionDeleter(Component):
section='restriction',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']) + ". " + _(str(err)))
diff --git a/hotel_channel_connector_wubook/models/hotel_room_type_restriction/exporter.py b/hotel_channel_connector_wubook/models/hotel_room_type_restriction/exporter.py
index 793a041f9..788e042fd 100644
--- a/hotel_channel_connector_wubook/models/hotel_room_type_restriction/exporter.py
+++ b/hotel_channel_connector_wubook/models/hotel_room_type_restriction/exporter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api, fields
+from odoo import api, fields, _
+from odoo.exceptions import ValidationError
class HotelRoomTypeRestrictionExporter(Component):
@@ -23,6 +24,7 @@ class HotelRoomTypeRestrictionExporter(Component):
section='restriction',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
@api.model
def create_rplan(self, binding):
@@ -33,5 +35,6 @@ class HotelRoomTypeRestrictionExporter(Component):
section='restriction',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
else:
self.binder.bind(external_id, binding)
diff --git a/hotel_channel_connector_wubook/models/product_pricelist/deleter.py b/hotel_channel_connector_wubook/models/product_pricelist/deleter.py
index 6fd73acaa..8874d2ba2 100644
--- a/hotel_channel_connector_wubook/models/product_pricelist/deleter.py
+++ b/hotel_channel_connector_wubook/models/product_pricelist/deleter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api
+from odoo import api, _
+from odoo.exceptions import ValidationError
class ProductPricelistDeleter(Component):
@@ -18,3 +19,4 @@ class ProductPricelistDeleter(Component):
section='pricelist',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']) + ". " + _(str(err)))
diff --git a/hotel_channel_connector_wubook/models/product_pricelist/exporter.py b/hotel_channel_connector_wubook/models/product_pricelist/exporter.py
index a073f2dc0..e1ab247a0 100644
--- a/hotel_channel_connector_wubook/models/product_pricelist/exporter.py
+++ b/hotel_channel_connector_wubook/models/product_pricelist/exporter.py
@@ -3,7 +3,8 @@
from odoo.addons.component.core import Component
from odoo.addons.hotel_channel_connector.components.core import ChannelConnectorError
-from odoo import api, _, fields
+from odoo import api, fields, _
+from odoo.exceptions import ValidationError
class ProductPricelistExporter(Component):
@@ -23,6 +24,7 @@ class ProductPricelistExporter(Component):
section='pricelist',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
@api.model
def create_plan(self, binding):
@@ -33,6 +35,7 @@ class ProductPricelistExporter(Component):
section='pricelist',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
else:
binding.external_id = external_id
self.binder.bind(external_id, binding)
@@ -67,6 +70,7 @@ class ProductPricelistExporter(Component):
section='pricelist',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))
else:
binding.external_id = external_id
self.binder.bind(external_id, binding)
@@ -102,3 +106,4 @@ class ProductPricelistExporter(Component):
section='pricelist',
internal_message=str(err),
channel_message=err.data['message'])
+ raise ValidationError(_(err.data['message']))