/* ############################################################################## # License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html # Copyright (C) 2022 Comunitea Servicios Tecnológicos S.L. All Rights Reserved # Vicente Ángel Gutiérrez # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ############################################################################## */ odoo.define('pos_pms_link.models', function (require) { "use strict"; var models = require('point_of_sale.models'); var utils = require('web.utils'); var round_di = utils.round_decimals; var core = require('web.core'); const { Gui } = require('point_of_sale.Gui'); var QWeb = core.qweb; const session = require('web.session'); var _t = core._t; var _super_order = models.Order.prototype; models.Order = models.Order.extend({ initialize: function(attr, options) { _super_order.initialize.apply(this,arguments); this.paid_on_reservation = this.paid_on_reservation || null; this.pms_reservation_id = this.pms_reservation_id || null; }, get_paid_on_reservation: function() { var paid_on_reservation = this.paid_on_reservation; return paid_on_reservation; }, set_paid_on_reservation: function(value) { this.paid_on_reservation = value; this.trigger('change', this); }, get_pms_reservation_id: function() { var pms_reservation_id = this.pms_reservation_id; return pms_reservation_id; }, set_pms_reservation_id: function(value) { this.pms_reservation_id = value; this.trigger('change', this); }, export_as_JSON: function() { var json = _super_order.export_as_JSON.apply(this,arguments); json.paid_on_reservation = this.paid_on_reservation; json.pms_reservation_id = this.pms_reservation_id; return json; }, init_from_JSON: function(json) { _super_order.init_from_JSON.apply(this,arguments); this.paid_on_reservation = json.paid_on_reservation; this.pms_reservation_id = json.pms_reservation_id; }, apply_ms_data: function(data) { if (typeof data.paid_on_reservation !== "undefined") { this.set_paid_on_reservation(data.paid_on_reservation); } if (typeof data.pms_reservation_id !== "undefined") { this.set_pms_reservation_id(data.pms_reservation_id); } this.trigger('change', this); }, add_reservation_services: function(reservation) { var self = this; var d = new Date(); var month = d.getMonth()+1; var day = d.getDate(); var current_date = d.getFullYear() + '-' + (month<10 ? '0' : '') + month + '-' + (day<10 ? '0' : '') + day; var service_line_ids = reservation.service_ids.map(x => x.service_line_ids) || false; var today_service_lines = [] _.each(service_line_ids, function(service_array){ today_service_lines.push(service_array.find(x => x.date === current_date)); }); _.each(today_service_lines, function(service_line_id){ if (service_line_id){ var qty = service_line_id.day_qty if (service_line_id.pos_order_line_ids.length > 0) { _.each(service_line_id.pos_order_line_ids, function(order_line_id){ qty -= order_line_id.qty; }); } if (qty > 0) { var options = { 'quantity': qty, 'pms_service_line_id': service_line_id.id, 'price': 0.0, }; var service_product = self.pos.db.get_product_by_id(service_line_id.product_id[0]); self.pos.get_order().add_product(service_product, options); var r_service_line_id = reservation.service_ids.map(x => x.service_line_ids)[0].find(x=>x.id==service_line_id.id); if (r_service_line_id.pos_order_line_ids.length == 0) { r_service_line_id.pos_order_line_ids.push({ 'id': 0, 'qty': parseInt(qty) }); } else if (r_service_line_id.pos_order_line_ids.length == 1 && r_service_line_id.pos_order_line_ids[0].id == 0){ r_service_line_id.pos_order_line_ids[0].qty = parseInt(qty); } else if (r_service_line_id.pos_order_line_ids.length == 1 && r_service_line_id.pos_order_line_ids[0].id != 0){ r_service_line_id.pos_order_line_ids.push({ 'id': 0, 'qty': parseInt(qty) }); } else if (r_service_line_id.pos_order_line_ids.length > 1){ var id_in_lines = false; _.each(r_service_line_id.pos_order_line_ids, function(pos_line_id){ if(pos_line_id.id == self.id) { pos_line_id.qty = parseInt(qty); id_in_lines = true; } }); if (id_in_lines == false) { r_service_line_id.pos_order_line_ids.push({ 'id': self.id, 'qty': parseInt(qty) }); } } } } }); }, add_product: function(product, options){ _super_order.add_product.apply(this,arguments); if (options.pms_service_line_id) { this.selected_orderline.set_pms_service_line_id(options.pms_service_line_id); } }, }) var _super_orderline = models.Orderline.prototype; models.Orderline = models.Orderline.extend({ initialize: function(attr, options) { _super_orderline.initialize.call(this,attr,options); this.server_id = this.server_id || null; this.pms_service_line_id = this.pms_service_line_id || null; }, get_pms_service_line_id: function() { var pms_service_line_id = this.pms_service_line_id; return pms_service_line_id; }, set_pms_service_line_id: function(value) { this.pms_service_line_id = value; this.trigger('change', this); }, export_as_JSON: function() { var json = _super_orderline.export_as_JSON.apply(this,arguments); json.pms_service_line_id = this.pms_service_line_id; return json; }, init_from_JSON: function(json) { _super_orderline.init_from_JSON.apply(this,arguments); this.pms_service_line_id = json.pms_service_line_id; this.server_id = json.server_id; }, apply_ms_data: function(data) { if (typeof data.pms_service_line_id !== "undefined") { this.set_pms_service_line_id(data.pms_service_line_id); } this.trigger('change', this); }, set_quantity: function(quantity, keep_price) { _super_orderline.set_quantity.apply(this, arguments); var is_real_qty = true; if (!quantity || quantity == "remove") { is_real_qty = false; } var self = this; if (self.pms_service_line_id) { this.pos.reservations.map(function(x) { _.each(x.service_ids, function(service){ _.each(service.service_line_ids, function(line){ if (line.id == self.pms_service_line_id) { if (line.pos_order_line_ids.length == 0 && is_real_qty) { line.pos_order_line_ids.push({ 'id': self.server_id || 0, 'qty': parseInt(quantity) }); } else if (line.pos_order_line_ids.length == 1 && line.pos_order_line_ids[0].id == self.server_id){ if (is_real_qty) { line.pos_order_line_ids[0].qty = parseInt(quantity); } else { line.pos_order_line_ids.pop(line.pos_order_line_ids[0]); } } else if (line.pos_order_line_ids.length == 1 && line.pos_order_line_ids[0].id != self.server_id && is_real_qty){ line.pos_order_line_ids.push({ 'id': self.server_id || 0, 'qty': parseInt(quantity) }); } else if (line.pos_order_line_ids.length > 1){ var id_in_lines = false; _.each(line.pos_order_line_ids, function(pos_line_id){ if(pos_line_id.id == self.server_id) { if (is_real_qty) { pos_line_id.qty = parseInt(quantity); } else { line.pos_order_line_ids.pop(pos_line_id); } id_in_lines = true; } }); _.each(line.pos_order_line_ids, function(pos_line_id){ if(pos_line_id.id == 0) { if (is_real_qty) { pos_line_id.qty = parseInt(quantity); } else { line.pos_order_line_ids.pop(pos_line_id); } id_in_lines = true; } }); if (id_in_lines == false && is_real_qty) { line.pos_order_line_ids.push({ 'id': self.server_id || 0, 'qty': parseInt(quantity) }); } } } }); }); }) } }, }); var _super_posmodel = models.PosModel.prototype; models.PosModel = models.PosModel.extend({ initialize: function(attr, options) { _super_posmodel.initialize.apply(this,arguments); this.reservations = []; }, }); models.load_models({ model: 'pms.reservation', fields: ['name', 'id', 'state', 'service_ids', 'partner_name', 'adults', 'children'], context: function(self){ var ctx_copy = session.user_context ctx_copy['pos_user_force'] = true; return ctx_copy; }, domain: function(self){ var domain = [ ['state', '!=', 'cancel'] ]; if (self.config_id && self.config.reservation_allowed_propertie_ids) domain.push(['pms_property_id', 'in', self.config.reservation_allowed_propertie_ids]); return domain; }, loaded: function(self, reservations) { self.reservations = reservations; self.db.add_reservations(reservations); }, }); models.load_models({ model: 'pms.service', fields: ['name', 'id', 'service_line_ids', 'product_id', 'reservation_id'], context: function(self){ var ctx_copy = session.user_context ctx_copy['pos_user_force'] = true; return ctx_copy; }, domain: function(self){ return [['reservation_id', 'in', self.reservations.map(x => x.id)]]; }, loaded: function (self, services){ self.services = services; var services = [] _.each(self.reservations, function(reservation){ services = []; _.each(reservation.service_ids, function(service_id){ services.push(self.services.find(x => x.id === service_id)); }); reservation.service_ids = services; }); }, }); models.load_models({ model: 'pms.service.line', fields: ['date', 'service_id', 'id', 'product_id', 'day_qty', 'pos_order_line_ids'], context: function(self){ var ctx_copy = session.user_context ctx_copy['pos_user_force'] = true; return ctx_copy; }, domain: function(self){ return [['service_id', 'in', self.services.map(x => x.id)]]; }, loaded: function (self, service_lines){ self.service_lines = service_lines; var service_lines = [] _.each(self.reservations, function(reservation){ _.each(reservation.service_ids, function(service_id){ service_lines = []; _.each(service_id.service_line_ids, function(line_id){ service_lines.push(self.service_lines.find(x => x.id === line_id)); }); service_id.service_line_ids = service_lines; }); }); }, }); models.load_models({ model: 'pos.order.line', fields: ['qty', 'id'], domain: function(self){ var order_line_ids = []; _.each(self.service_lines, function(service_line) { if(service_line.pos_order_line_ids.length > 0) { _.each(service_line.pos_order_line_ids, function(line_id) { order_line_ids.push(line_id); }) } }); return [['id', 'in', order_line_ids]]; }, loaded: function (self, pos_order_lines){ self.pos_order_lines = pos_order_lines; _.each(self.service_lines, function(service_line){ var order_lines = [] _.each(service_line.pos_order_line_ids, function(order_line){ order_lines.push(self.pos_order_lines.find(x => x.id === order_line)); }); service_line.pos_order_line_ids = order_lines; }); }, }); var existing_models = models.PosModel.prototype.models; var pos_index = _.findIndex(existing_models, function (model) { return model.model === "pos.config"; }); var pos_model = existing_models[pos_index]; var ctx_copy = session.user_context ctx_copy['pos_user_force'] = true; models.load_models([{ model: pos_model.model, fields: pos_model.fields, condition: pos_model.condition, domain: pos_model.domain, context: ctx_copy, loaded: pos_model.loaded, }]); var pli_index = _.findIndex(existing_models, function (model) { return model.model === "product.pricelist.item"; }); var pli_model = existing_models[pli_index]; models.load_models([{ model: pli_model.model, fields: pli_model.fields, condition: pli_model.condition, domain: pli_model.domain, context: ctx_copy, loaded: pli_model.loaded, }]); });