Files
pms/pos_pms_link/static/src/js/models.js
2023-11-02 11:49:14 +01:00

491 lines
19 KiB
JavaScript

/*
##############################################################################
# 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 <vicente@comunitea.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
*/
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 last_line = self.pos.get_order().get_last_orderline();
last_line.set_note(
"RESERVATION: " +
reservation.name +
" ROOMS: " +
reservation.rooms
);
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
);
}
},
export_for_printing: function () {
const result = _super_order.export_for_printing.apply(this, arguments);
result.paid_on_reservation = this.paid_on_reservation;
result.pms_reservation_id = this.pms_reservation_id;
return result;
},
});
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",
"checkin",
"checkout",
"folio_internal_comment",
"rooms",
],
context: function (self) {
var ctx_copy = session.user_context;
ctx_copy.pos_user_force = true;
return ctx_copy;
},
domain: function (self) {
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 domain = [
"|",
["state", "=", "onboard"],
"&",
["checkout", "=", current_date],
["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;
});
},
});
models.PosModel.prototype.models.some(function (model) {
if (model.model !== "pos.config" && model.model !== "product.pricelist.item") {
return false;
}
const superContext = model.context;
model.context = function () {
const context = {};
if (superContext) {
context = superContext.apply(this, arguments);
}
context.pos_user_force = true;
return context;
};
return true;
});
});