diff --git a/hotel_calendar/models/inherited_hotel_reservation.py b/hotel_calendar/models/inherited_hotel_reservation.py index cf1a84ade..ea554a076 100644 --- a/hotel_calendar/models/inherited_hotel_reservation.py +++ b/hotel_calendar/models/inherited_hotel_reservation.py @@ -96,6 +96,7 @@ class HotelReservation(models.Model): 'fix_days': reserv.splitted, # Fix Days 'fix_room': False, # Fix Rooms 'overbooking': reserv.overbooking, + 'state': reserv.state, 'real_dates': reserv.get_real_checkin_checkout()}) num_split = 0 if reserv.splitted: @@ -177,11 +178,7 @@ class HotelReservation(models.Model): date_start = fields.Date.from_string(dfrom) - timedelta(days=1) date_start_str = date_start.strftime(DEFAULT_SERVER_DATETIME_FORMAT) reservations_raw = self.env['hotel.reservation'].search( - [ - ('room_id', 'in', rooms.ids), - ('state', 'in', - ['draft', 'confirm', 'booking', 'done', False]), - ], + [('room_id', 'in', rooms.ids)], order="checkin DESC, checkout ASC, adults DESC, children DESC") reservations_ll = self.env['hotel.reservation'].search([ ('checkin', '<=', dto), 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 05f353d2b..2614d9937 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 @@ -69,8 +69,8 @@ var PMSCalendarController = AbstractController.extend({ var self = this; return this.model.update_records(ids, values).then(function(result){ // Remove OB Room Row? - if (oldReserv.room.overbooking && !newReserv.room.overbooking) { - self._multi_calendar.remove_obroom_row(oldReserv, true); + if ((oldReserv.room.overbooking && !newReserv.room.overbooking) || (oldReserv.room.cancelled && !newReserv.room.cancelled)) { + self._multi_calendar.remove_extra_room_row(oldReserv, true); } }).fail(function(err, errev){ calendar.replaceReservation(newReserv, oldReserv); @@ -262,9 +262,16 @@ var PMSCalendarController = AbstractController.extend({ }); this.renderer.$el.find('#pms-menu #btn_action_cancelled button').on('click', function(ev){ - var active_calendar = self._multi_calendar.get_active_calendar(); - active_calendar.toggleCancelledVisibility(); - active_calendar.addReservations(self._multi_calendar._dataset['reservations']); + var active_calendar = self._multi_calendar.get_active_calendar(); + active_calendar.toggleCancelledVisibility(); + active_calendar.addReservations(self._multi_calendar._dataset['reservations']); + if (active_calendar.options.showCancelled) { + $(this).find('.led').removeClass('led-disabled'); + $(this).find('.led').addClass('led-enabled'); + } else { + $(this).find('.led').addClass('led-disabled'); + $(this).find('.led').removeClass('led-enabled'); + } }); this.renderer.$el.find('#pms-menu #btn_action_divide button').on('click', function(ev){ @@ -436,7 +443,7 @@ var PMSCalendarController = AbstractController.extend({ disabled: !newReservation.id, click: function () { var roomId = newReservation.room.id; - if (newReservation.room.overbooking) { + if (newReservation.room.overbooking || newReservation.room.cancelled) { roomId = +newReservation.room.id.substr(newReservation.room.id.indexOf('@')+1); } var write_values = { @@ -445,6 +452,11 @@ var PMSCalendarController = AbstractController.extend({ 'room_id': roomId, 'overbooking': newReservation.room.overbooking }; + if (newReservation.room.cancelled) { + write_values['state'] = 'cancelled'; + } else if (!newReservation.room.cancelled && oldReservation.cancelled) { + write_values['state'] = 'draft'; + } self.updateReservations(ev.detail.calendar_obj, [newReservation.id], write_values, oldReservation, newReservation); hasChanged = true; @@ -473,7 +485,7 @@ var PMSCalendarController = AbstractController.extend({ var date_cell_end = HotelCalendar.toMoment(ev.detail.calendar_obj.etable.querySelector(`#${last_cell.dataset.hcalParentCell}`).dataset.hcalDate).add(1, 'd'); var parentRow = document.querySelector(`#${ev.detail.cells[0].dataset.hcalParentRow}`); var room = ev.detail.calendar_obj.getRoom(parentRow.dataset.hcalRoomObjId); - if (room.overbooking) { + if (room.overbooking || room.cancelled) { return; } var nights = date_cell_end.diff(date_cell_start, 'days'); @@ -510,7 +522,7 @@ var PMSCalendarController = AbstractController.extend({ var startDate = HotelCalendar.toMoment(parentCellStart.dataset.hcalDate); var endDate = HotelCalendar.toMoment(parentCellEnd.dataset.hcalDate).add(1, 'd'); var room = ev.detail.calendar_obj.getRoom(parentRow.dataset.hcalRoomObjId); - if (room.overbooking) { + if (room.overbooking || room.cancelled) { return; } var numBeds = (room.shared || ev.detail.calendar_obj.getOptions('divideRoomsByCapacity'))?(ev.detail.cellEnd.dataset.hcalBedNum - ev.detail.cellStart.dataset.hcalBedNum)+1:room.capacity; @@ -599,12 +611,14 @@ var PMSCalendarController = AbstractController.extend({ var domain_checkouts = [['checkout', '=', moment().format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT)]]; var domain_checkins = [['checkin', '=', moment().format(HotelConstants.ODOO_DATETIME_MOMENT_FORMAT)]]; var domain_overbookings = [['overbooking', '=', true], ['state', 'not in', ['cancelled']]]; + var domain_cancelled = [['state', '=', 'cancelled']]; $.when( this.model.search_count(domain_checkouts), this.model.search_count(domain_checkins), this.model.search_count(domain_overbookings), - ).then(function(a1, a2, a3){ - self.renderer.update_buttons_counter(a1, a2, a3); + this.model.search_count(domain_cancelled), + ).then(function(a1, a2, a3, a4){ + self.renderer.update_buttons_counter(a1, a2, a3, a4); }); }, @@ -638,6 +652,7 @@ var PMSCalendarController = AbstractController.extend({ 'unusedZone': false, 'linkedId': false, 'overbooking': reserv['overbooking'], + 'cancelled': reserv['state'] === 'cancelled', 'realDates': reserv['real_dates'] } }, @@ -669,7 +684,7 @@ var PMSCalendarController = AbstractController.extend({ // } // Create/Update/Delete reservation - if (notif[1]['action'] === 'unlink' || reserv['state'] === 'cancelled') { + if (notif[1]['action'] === 'unlink') { this._multi_calendar.remove_reservation(reserv['id']); this._multi_calendar._reserv_tooltips = _.pick(this._multi_calendar._reserv_tooltips, function(value, key, obj){ return key != reserv['id']; }); nreservs = _.reject(nreservs, function(item){ return item.id == reserv['id']; }); @@ -789,8 +804,16 @@ var PMSCalendarController = AbstractController.extend({ $led.removeClass('led-enabled').addClass('led-disabled'); } + /* Cancelled Led */ + $led = this.renderer.$el.find('#pms-menu #btn_action_cancelled button .led'); + if (active_calendar.options.showCancelled) { + $led.removeClass('led-disabled').addClass('led-enabled'); + } else { + $led.removeClass('led-enabled').addClass('led-disabled'); + } + /* Divide Led */ - var $led = this.renderer.$el.find('#pms-menu #btn_action_divide button .led'); + $led = this.renderer.$el.find('#pms-menu #btn_action_divide button .led'); if (active_calendar.getSelectionMode() === HotelCalendar.ACTION.DIVIDE) { $led.removeClass('led-disabled').addClass('led-enabled'); } else { @@ -798,7 +821,7 @@ var PMSCalendarController = AbstractController.extend({ } /* Unify Led */ - var $led = this.renderer.$el.find('#pms-menu #btn_action_unify button .led'); + $led = this.renderer.$el.find('#pms-menu #btn_action_unify button .led'); if (active_calendar.getSelectionMode() === HotelCalendar.ACTION.UNIFY) { $led.removeClass('led-disabled').addClass('led-enabled'); } else { diff --git a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js index d0346bbe3..1cce405c8 100644 --- a/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js +++ b/hotel_calendar/static/src/js/views/calendar/hotel_calendar_renderer.js @@ -76,7 +76,7 @@ var HotelCalendarView = AbstractRenderer.extend({ this._last_dates = this.get_view_filter_dates(); }, - update_buttons_counter: function(ncheckouts, ncheckins, noverbookings) { + update_buttons_counter: function(ncheckouts, ncheckins, noverbookings, ncancelled) { var self = this; // Checkouts Button var $ninfo = self.$el.find('#pms-menu #btn_action_checkout span.ninfo'); @@ -104,6 +104,15 @@ var HotelCalendarView = AbstractRenderer.extend({ } else { $ninfo.parent().parent().removeClass('button-highlight'); } + + // Cancelled + $ninfo = self.$el.find('#pms-menu #btn_action_cancelled span.ninfo'); + $ninfo.text(ncancelled); + if (ncancelled) { + $ninfo.parent().parent().addClass('button-highlight'); + } else { + $ninfo.parent().parent().removeClass('button-highlight'); + } }, init_calendar_view: function(){ diff --git a/hotel_calendar/static/src/js/widgets/MultiCalendar.js b/hotel_calendar/static/src/js/widgets/MultiCalendar.js index f0516b2c8..02bd885c5 100644 --- a/hotel_calendar/static/src/js/widgets/MultiCalendar.js +++ b/hotel_calendar/static/src/js/widgets/MultiCalendar.js @@ -114,12 +114,12 @@ odoo.define('hotel_calendar.MultiCalendar', function(require) { } }, - remove_obroom_row: function(reserv, only_active_calendar) { + remove_extra_room_row: function(reserv, only_active_calendar) { if (only_active_calendar) { - this.get_active_calendar().removeOBRoomRow(reserv); + this.get_active_calendar().removeExtraRoomRow(reserv); } else { for (var calendar of this._calendars) { - calendar.removeOBRoomRow(reserv); + calendar.removeExtraRoomRow(reserv); } } }, diff --git a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js index 38cc5afef..db67be318 100644 --- a/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js +++ b/hotel_calendar/static/src/lib/hcalendar/js/hcalendar.js @@ -8,8 +8,9 @@ * Dependencies: * - moment * - underscore - * - awesomeicons !shit - * - bootstrap !shit + * - awesomeicons + * - bootstrap + * - jquery */ function HotelCalendar(/*String*/querySelector, /*Dictionary*/options, /*List*/pricelist, /*restrictions*/restrictions, /*HTMLObject?*/_base) { @@ -269,7 +270,7 @@ HotelCalendar.prototype = { var addedReservations = []; for (var r of reservations) { var rindex = _.findKey(this._reservations, {'id': r.id}); - if (!this.options.showOverbookings && r.overbooking) { + if ((!this.options.showOverbookings && r.overbooking) || (!this.options.showCancelled && r.cancelled)) { if (rindex) { this.removeReservation(this._reservations[rindex]); } @@ -277,12 +278,15 @@ HotelCalendar.prototype = { } r = r.clone(); // HOT-FIX: Multi-Calendar Support - r.room = this.getRoom(r.room_id, r.overbooking, r.id); + r.room = this.getRoom(r.room_id, r.overbooking || r.cancelled, r.id); // need create a overbooking row? if (!r.room) { - if (r.overbooking) { - r.room = this.createOBRoom(this.getRoom(r.room_id), r.id); - this.createOBRoomRow(r.room); + if (r.overbooking || r.cancelled) { + r.room = this.createExtraRoom(this.getRoom(r.room_id), r.id, { + overbooking: r.overbooking, + cancelled: r.cancelled, + }); + this.createExtraRoomRow(r.room); } else { console.warn(`Can't found the room '${r.room_id}' for the reservation '${r.id}' (${r.title})!`); continue; @@ -292,9 +296,9 @@ HotelCalendar.prototype = { if (rindex) { var reserv = this._reservations[rindex]; r._html = reserv._html; - if (reserv.overbooking && !r.overbooking) { + if ((reserv.overbooking && !r.overbooking) || (reserv.cancelled && !r.cancelled)) { if (this.getReservationsByRoom(reserv.room).length === 1) { - this.removeOBRoomRow(reserv); + this.removeExtraRoomRow(reserv); } } this._reservations[rindex] = r; @@ -357,9 +361,9 @@ HotelCalendar.prototype = { } } // Remove OB Row - if (reserv.overbooking) { + if (reserv.overbooking || reserv.cancelled) { if (this.getReservationsByRoom(reserv.room).length === 1) { - this.removeOBRoomRow(reserv); + this.removeExtraRoomRow(reserv); } } // Remove Unused Zones @@ -567,7 +571,7 @@ HotelCalendar.prototype = { }, getRoomsByType: function(/*String*/type) { - return _.filter(this.options.rooms, function(item){ return item.type === type && !item.overbooking; }); + return _.filter(this.options.rooms, function(item){ return item.type === type && !item.overbooking && !item.cancelled; }); }, getRoomsCapacityByType: function(/*String*/type) { @@ -581,7 +585,7 @@ HotelCalendar.prototype = { getRoomsCapacityTotal: function() { var num_rooms = 0; - var rooms = _.filter(this.options.rooms, function(item){ return !item.overbooking; }); + var rooms = _.filter(this.options.rooms, function(item){ return !item.overbooking && !item.cancelled; }); for (var tr of rooms) { num_rooms += tr.shared?tr.capacity:1; } @@ -592,16 +596,9 @@ HotelCalendar.prototype = { return _.uniq(_.pluck(this.options.rooms, 'type')); }, - getOBRooms: function(/*Int*/parentRoomId) { - var $this = this; - return _.filter(this.options.rooms, function(item) { - return (item.overbooking && +$this.parseOBRoomId(item.id)[1] === +parentRoomId); - }); - }, - - getRoom: function(/*String,Int*/id, /*Boolean?*/isOverbooking, /*Int?*/reservId) { - if (isOverbooking) { - return _.find(this.options.rooms, function(item){ return item.id === `${reservId}@${id}` && item.overbooking; }); + getRoom: function(/*String,Int*/id, /*Boolean?*/isExtra, /*Int?*/reservId) { + if (isExtra) { + return _.find(this.options.rooms, function(item){ return item.id === `${reservId}@${id}` && (item.overbooking || item.cancelled); }); } return _.find(this.options.rooms, function(item){ return item.id == id; }); }, @@ -632,18 +629,26 @@ HotelCalendar.prototype = { return 0.0; }, - removeOBRoomRow: function(/*HReservationObject*/ob_reserv) { - if (!ob_reserv.room.overbooking) { - console.warn(`[HotelCalendar][removeOBRoomRow] Can't remove the row for room ${ob_reserv.room.id}`); + // Extra Room (Overbooking, cancelled, ...) + getExtraRooms: function(/*Int*/parentRoomId) { + var $this = this; + return _.filter(this.options.rooms, function(item) { + return ((item.overbooking || item.cancelled) && +$this.parseExtraRoomId(item.id)[1] === +parentRoomId); + }); + }, + + removeExtraRoomRow: function(/*HReservationObject*/ex_reserv) { + if (!ex_reserv.room.overbooking && !ex_reserv.room.cancelled) { + console.warn(`[HotelCalendar][removeExtraRoomRow] Can't remove the row for room ${ex_reserv.room.id}`); return false; } - var obRoomRow = this.getOBRoomRow(ob_reserv); - if (obRoomRow) { + var exRoomRow = this.getExtraRoomRow(ex_reserv); + if (exRoomRow) { // Update Reservations Position - var bounds = obRoomRow.getBoundingClientRect(); + var bounds = exRoomRow.getBoundingClientRect(); var cheight = bounds.bottom-bounds.top; - var start_index = _.indexOf(this.options.rooms, ob_reserv.room) + 1; + var start_index = _.indexOf(this.options.rooms, ex_reserv.room) + 1; for (var i=start_index; i
+ 0
Cancelled