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 + + + + + + + + + + + + + - + + + + - + + + + -