[IMP] Show Cancelled

This commit is contained in:
QS5ELkMu
2018-12-19 02:23:21 +01:00
parent a6d7968b8a
commit 843e01677c
6 changed files with 150 additions and 104 deletions

View File

@@ -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),

View File

@@ -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 {

View File

@@ -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(){

View File

@@ -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);
}
}
},

View File

@@ -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<this.options.rooms.length; i++) {
var reservs = this.getReservationsByRoom(this.options.rooms[i], true);
for (var reserv of reservs) {
@@ -654,14 +659,14 @@ HotelCalendar.prototype = {
}
}
obRoomRow.parentNode.removeChild(obRoomRow);
this.options.rooms = _.reject(this.options.rooms, function(item){ return item.id === ob_reserv.room.id; });
exRoomRow.parentNode.removeChild(exRoomRow);
this.options.rooms = _.reject(this.options.rooms, function(item){ return item.id === ex_reserv.room.id; });
}
},
getOBRealRoomInfo: function(/*HRoomObject*/room) {
getRealExtraRoomInfo: function(/*HRoomObject*/room) {
// Obtain real id
var isf = room.number.search('OB-');
var isf = room.number.search('EX-');
var isfb = room.number.search('/#');
var cnumber = room.number;
if (isf != -1 && isfb != -1) { cnumber = cnumber.substr(isf+3, isfb-(isf+3)); }
@@ -676,58 +681,63 @@ HotelCalendar.prototype = {
return [this.getRoom(mainRoomRow.dataset.hcalRoomObjId), mainRoomRow];
},
getOBRoomRow: function(/*HReservationObject*/ob_reserv) {
getExtraRoomRow: function(/*HReservationObject*/ex_reserv) {
// Obtain real id
var isf = ob_reserv.room.number.search('OB-');
var isfb = ob_reserv.room.number.search('/#');
var cnumber = ob_reserv.room.number;
var isf = ex_reserv.room.number.search('EX-');
var isfb = ex_reserv.room.number.search('/#');
var cnumber = ex_reserv.room.number;
if (isf != -1 && isfb != -1) { cnumber = cnumber.substr(isf+3, isfb-(isf+3)); }
return this.e.querySelector(`#${this._sanitizeId(`ROW_${cnumber}_${ob_reserv.room.type}_OVER${ob_reserv.id}`)}`);
return this.e.querySelector(`#${this._sanitizeId(`ROW_${cnumber}_${ex_reserv.room.type}_EXTRA${ex_reserv.id}`)}`);
},
parseOBRoomId: function(/*String*/id) {
parseExtraRoomId: function(/*String*/id) {
if (typeof id !== 'number') {
return id.split('@');
}
return id;
},
createOBRoom: function(/*HRoomObject*/mainRoom, /*Int*/reservId) {
var obr = this.getOBRooms(mainRoom.id);
// Create Overbooking Room
var ob_room = mainRoom.clone();
ob_room.id = `${reservId}@${mainRoom.id}`;
ob_room.number = `OB-${mainRoom.number}/#${obr.length}`;
ob_room.overbooking = true;
this._insertRoomAt(mainRoom, ob_room, true);
return ob_room;
createExtraRoom: function(/*HRoomObject*/mainRoom, /*Int*/reservId, /*Dict*/extraData) {
var exr = this.getExtraRooms(mainRoom.id);
var ex_room = mainRoom.clone();
ex_room.id = `${reservId}@${mainRoom.id}`;
ex_room.number = `EX-${mainRoom.number}/#${exr.length}`;
for (var key in extraData) {
ex_room[key] = extraData[key];
}
this._insertRoomAt(mainRoom, ex_room, true);
return ex_room;
},
createOBRoomRow: function(/*Int,HRoomObject*/ob_room) {
var mainRoomInfo = this.getOBRealRoomInfo(ob_room);
var obRoomId = this.parseOBRoomId(ob_room.id);
createExtraRoomRow: function(/*HRoomObject*/ex_room) {
var mainRoomInfo = this.getRealExtraRoomInfo(ex_room);
var exRoomId = this.parseExtraRoomId(ex_room.id);
if (!mainRoomInfo) {
console.warn(`[HotelCalendar][createOBRoomRow] Can't found room row: ${mainRoomRowId}`);
console.warn(`[HotelCalendar][createExtraRoomRow] Can't found room row: ${mainRoomRowId}`);
return false;
}
var mainRoom = mainRoomInfo[0];
var mainRoomRow = mainRoomInfo[1];
var row = document.createElement("TR");
row.setAttribute('id', this._sanitizeId(`ROW_${mainRoom.number}_${ob_room.type}_OVER${obRoomId[0]}`));
row.setAttribute('id', this._sanitizeId(`ROW_${mainRoom.number}_${ex_room.type}_EXTRA${exRoomId[0]}`));
row.classList.add('hcal-row-room-type-group-item');
row.classList.add('hcal-row-room-type-group-overbooking-item');
row.dataset.hcalRoomObjId = ob_room.id;
if (ex_room.overbooking) {
row.classList.add('hcal-row-room-type-group-overbooking-item');
} else if (ex_room.cancelled) {
row.classList.add('hcal-row-room-type-group-cancelled-item');
}
row.dataset.hcalRoomObjId = ex_room.id;
mainRoomRow.parentNode.insertBefore(row, mainRoomRow.nextSibling);
var cell = row.insertCell();
cell.textContent = ob_room.number;
cell.textContent = ex_room.number;
cell.classList.add('hcal-cell-room-type-group-item');
cell.classList.add('btn-hcal');
cell.classList.add('btn-hcal-3d');
cell.setAttribute('colspan', '2');
cell = row.insertCell();
cell.textContent = ob_room.type;
cell.textContent = ex_room.type;
cell.classList.add('hcal-cell-room-type-group-item');
cell.classList.add('btn-hcal');
cell.classList.add('btn-hcal-flat');
@@ -737,13 +747,13 @@ HotelCalendar.prototype = {
var dd = this.options.startDate.clone().local().startOf('day').add(i,'d').utc();
var dd_local = dd.clone().local();
cell = row.insertCell();
cell.setAttribute('id', this._sanitizeId(`${ob_room.type}_${ob_room.number}_${dd_local.format(HotelCalendar.DATE_FORMAT_SHORT_)}`));
cell.setAttribute('id', this._sanitizeId(`${ex_room.type}_${ex_room.number}_${dd_local.format(HotelCalendar.DATE_FORMAT_SHORT_)}`));
cell.classList.add('hcal-cell-room-type-group-item-day');
cell.dataset.hcalParentRow = row.getAttribute('id');
cell.dataset.hcalDate = dd_local.format(HotelCalendar.DATE_FORMAT_SHORT_);
cell.dataset.hcalRoomObjId = ob_room.id;
cell.dataset.hcalRoomObjId = ex_room.id;
// Generate Interactive Table
cell.appendChild(this._generateTableDay(cell, ob_room));
cell.appendChild(this._generateTableDay(cell, ex_room));
//cell.innerHTML = dd.format("DD");
var day = +dd_local.format("D");
if (day == 1) {
@@ -759,8 +769,8 @@ HotelCalendar.prototype = {
// Update Reservations Position
var bounds = row.getBoundingClientRect();
var cheight = bounds.bottom-bounds.top;
var start_index = _.indexOf(this.options.rooms, ob_room) + 1;
for (var i=start_index; i<this.options.rooms.length; i++) {
var start_index = _.indexOf(this.options.rooms, ex_room) + 1;
for (var i=start_index; i<this.options.rooms.length; ++i) {
var reservs = this.getReservationsByRoom(this.options.rooms[i], true);
for (var reserv of reservs) {
if (reserv && reserv._html) {
@@ -842,7 +852,7 @@ HotelCalendar.prototype = {
var reservs = this.getDayRoomTypeReservations(day, room_type);
var num_rooms = this.getRoomsCapacityByType(room_type);
for (var r of reservs) {
if (r.unusedZone || r.overbooking) {
if (r.unusedZone || r.overbooking || r.cancelled) {
continue;
}
num_rooms -= (r.room && r.room.shared)?r.getTotalPersons(false):1;
@@ -860,7 +870,7 @@ HotelCalendar.prototype = {
var reservs = this.getReservationsByDay(day, true);
var num_rooms = this.getRoomsCapacityTotal();
for (var r of reservs) {
if (r.unusedZone || r.overbooking) {
if (r.unusedZone || r.overbooking || r.cancelled) {
continue;
}
num_rooms -= (r.room && r.room.shared)?r.getTotalPersons(false):1;
@@ -876,7 +886,7 @@ HotelCalendar.prototype = {
}
var reservs = this.getReservationsByDay(day, true);
return Math.round(reservs.length/_.filter(this.options.rooms, function(item){ return !item.overbooking; }).length*100.0);
return Math.round(reservs.length/_.filter(this.options.rooms, function(item){ return !item.overbooking && !item.cancelled; }).length*100.0);
},
@@ -1129,13 +1139,13 @@ HotelCalendar.prototype = {
row = tbody.insertRow();
row.dataset.hcalRoomObjId = itemRoom.id;
row.classList.add('hcal-row-room-type-group-item');
if (itemRoom.overbooking) {
var reservId = this.parseOBRoomId(itemRoom.id)[0];
if ((this.options.showOverbookings && itemRoom.overbooking) || (this.options.showCancelled && itemRoom.cancelled)) {
var reservId = this.parseExtraRoomId(itemRoom.id)[0];
var cnumber = itemRoom.number;
var isf = cnumber.search('OB-');
var isf = cnumber.search('EX-');
var isfb = cnumber.search('/#');
if (isf != -1 && isfb != -1) { cnumber = cnumber.substr(isf+3, isfb-(isf+3)); }
row.setAttribute('id', this._sanitizeId(`ROW_${cnumber}_${itemRoom.type}_OVER${reservId}`));
row.setAttribute('id', this._sanitizeId(`ROW_${cnumber}_${itemRoom.type}_EXTRA${reservId}`));
row.classList.add('hcal-row-room-type-group-overbooking-item');
} else {
row.setAttribute('id', $this._sanitizeId(`ROW_${itemRoom.number}_${itemRoom.type}`));
@@ -1677,7 +1687,7 @@ HotelCalendar.prototype = {
for (var c of cells) {
var parentRow = this.$base.querySelector(`#${c.dataset.hcalParentRow}`);
var room = this.getRoom(parentRow.dataset.hcalRoomObjId);
if (room.overbooking) {
if (room.overbooking || room.cancelled) {
continue;
}
c.classList.add('hcal-cell-highlight');
@@ -1806,36 +1816,36 @@ HotelCalendar.prototype = {
var refToReservs = toReservations[0];
var refFromRoom = refFromReservs.room;
var refToRoom = refToReservs.room;
var fromRoomRow = this.getOBRoomRow(refFromReservs);
var toRoomRow = this.getOBRoomRow(refToReservs);
var refFromRoomNewId = refFromRoom.overbooking?this.parseOBRoomId(refFromRoom.id)[1]:refFromRoom.id;
var fromRoomRow = this.getExtraRoomRow(refFromReservs);
var toRoomRow = this.getExtraRoomRow(refToReservs);
var refFromRoomNewId = (refFromRoom.overbooking||refFromRoom.cancelled)?this.parseExtraRoomId(refFromRoom.id)[1]:refFromRoom.id;
refFromRoomNewId = `${refToReservs.id}@${refFromRoomNewId}`;
var refToRoomNewId = refToRoom.overbooking?this.parseOBRoomId(refToRoom.id)[1]:refToRoom.id;
var refToRoomNewId = (refToRoom.overbooking||refToRoom.cancelled)?this.parseExtraRoomId(refToRoom.id)[1]:refToRoom.id;
refToRoomNewId = `${refFromReservs.id}@${refToRoomNewId}`;
if (refFromRoom.overbooking) {
if (refFromRoom.overbooking || refFromRoom.cancelled) {
// Obtain real id
var isf = refFromReservs.room.number.search('OB-');
var isf = refFromReservs.room.number.search('EX-');
var isfb = refFromReservs.room.number.search('/#');
var cnumber = refFromReservs.room.number;
if (isf != -1 && isfb != -1) { cnumber = cnumber.substr(isf+3, isfb-(isf+3)); }
refFromRoom.id = refFromRoomNewId;
var newRowId = `${this._sanitizeId(`ROW_${cnumber}_${refToRoom.type}_OVER${refToReservs.id}`)}`;
var newRowId = `${this._sanitizeId(`ROW_${cnumber}_${refToRoom.type}_EXTRA${refToReservs.id}`)}`;
var elms = fromRoomRow.querySelectorAll(`td[data-hcal-parent-row='${fromRoomRow.id}']`);
for (var elm of elms) { elm.dataset.hcalParentRow = newRowId; }
fromRoomRow.setAttribute('id', `${newRowId}`);
fromRoomRow.dataset.hcalRoomObjId = refFromRoom.id;
}
if (refToRoom.overbooking) {
if (refToRoom.overbooking || refToRoom.cancelled) {
// Obtain real id
var isf = refToReservs.room.number.search('OB-');
var isf = refToReservs.room.number.search('EX-');
var isfb = refToReservs.room.number.search('/#');
var cnumber = refToReservs.room.number;
if (isf != -1 && isfb != -1) { cnumber = cnumber.substr(isf+3, isfb-(isf+3)); }
refToRoom.id = refToRoomNewId;
var newRowId = `${this._sanitizeId(`ROW_${cnumber}_${refFromRoom.type}_OVER${refFromReservs.id}`)}`;
var newRowId = `${this._sanitizeId(`ROW_${cnumber}_${refFromRoom.type}_EXTRA${refFromReservs.id}`)}`;
var elms = toRoomRow.querySelectorAll(`td[data-hcal-parent-row='${toRoomRow.id}']`);
for (var elm of elms) { elm.dataset.hcalParentRow = newRowId; }
toRoomRow.setAttribute('id', `${newRowId}`);
@@ -1843,11 +1853,13 @@ HotelCalendar.prototype = {
}
for (var nreserv of fromReservations) {
nreserv.cancelled = refToRoom.cancelled;
nreserv.overbooking = refToRoom.overbooking;
nreserv.room = refToRoom;
}
for (var nreserv of toReservations) {
nreserv.overbooking = refToRoom.overbooking;
nreserv.cancelled = refFromRoom.cancelled;
nreserv.overbooking = refFromRoom.overbooking;
nreserv.room = refFromRoom;
}
} else {
@@ -2809,6 +2821,7 @@ function HRoom(/*Int*/id, /*String*/number, /*Int*/capacity, /*String*/type, /*B
this.shared = shared;
this.price = price || false;
this.overbooking = false;
this.cancelled = false;
this._html = false;
this._active = true;
@@ -2839,6 +2852,7 @@ HRoom.prototype = {
this.price
);
nroom.overbooking = this.overbooking;
nroom.cancelled = this.cancelled;
nroom._html = this._html;
nroom._active = this._active;
nroom.addUserData(this.getUserData());
@@ -2870,6 +2884,7 @@ function HReservation(/*Dictionary*/rValues) {
this.linkedId = rValues.linkedId || -1;
this.splitted = rValues.splitted || false;
this.overbooking = rValues.overbooking || false;
this.cancelled = rValues.cancelled || false;
this.room = rValues.room || null;
this._drawModes = ['hard-start', 'hard-end'];
@@ -2923,6 +2938,7 @@ HReservation.prototype = {
'linkedId': this.linkedId,
'splitted': this.splitted,
'overbooking': this.overbooking,
'cancelled': this.cancelled,
'room_id': this.room_id,
});
nreserv._beds = _.clone(this._beds);

View File

@@ -68,6 +68,7 @@
<div class='led led-disabled'></div>
<i class="fa fa-fw o_button_icon fa-calendar-times-o"> </i>
<div class="o_button_text">
<span class="ninfo">0</span><br/>
Cancelled
</div>
</button>