From 78994b55b6241ea95feb45b4b2826de5aabbb48c Mon Sep 17 00:00:00 2001 From: Pierre Masereel Date: Tue, 24 Sep 2019 08:25:49 +0000 Subject: [PATCH] [FIX] l10n_fr_pos_cert: avoid editing orders Once an order is created in the french certification, we cannot modify it wihout traces, so we've disabled the edtition of the order lines in the frontend, disable the price changing, and the deletion of orders. So when we want to decrease the quantity, a line with negative quantity should be done. TASK-ID: 47990 --- addons/l10n_fr_pos_cert/models/pos.py | 6 + addons/l10n_fr_pos_cert/static/src/js/pos.js | 125 ++++++++++++++++++- 2 files changed, 130 insertions(+), 1 deletion(-) diff --git a/addons/l10n_fr_pos_cert/models/pos.py b/addons/l10n_fr_pos_cert/models/pos.py index 8f53c3dd1ef..4e4b6f2d61e 100644 --- a/addons/l10n_fr_pos_cert/models/pos.py +++ b/addons/l10n_fr_pos_cert/models/pos.py @@ -120,6 +120,12 @@ class pos_order(models.Model): res |= super(pos_order, order).write(vals_hashing) return res + def unlink(self): + for order in self: + if order.company_id._is_accounting_unalterable(): + raise UserError(_("According to French law, you cannot delet a point of sale order.")) + return super(pos_order, self).unlink() + class PosOrderLine(models.Model): _inherit = "pos.order.line" diff --git a/addons/l10n_fr_pos_cert/static/src/js/pos.js b/addons/l10n_fr_pos_cert/static/src/js/pos.js index 8634181937d..20f15e17c0a 100644 --- a/addons/l10n_fr_pos_cert/static/src/js/pos.js +++ b/addons/l10n_fr_pos_cert/static/src/js/pos.js @@ -5,12 +5,28 @@ var models = require('point_of_sale.models'); var screens = require('point_of_sale.screens'); var rpc = require('web.rpc'); var session = require('web.session'); +var core = require('web.core'); +var utils = require('web.utils'); +var _t = core._t; +var round_di = utils.round_decimals; + +var _super_posmodel = models.PosModel.prototype; models.PosModel = models.PosModel.extend({ is_french_country: function(){ var french_countries = ['FR', 'MF', 'MQ', 'NC', 'PF', 'RE', 'GF', 'GP', 'TF']; return _.contains(french_countries, this.company.country.code); - } + }, + delete_current_order: function () { + if (this.is_french_country() && this.get_order().get_orderlines().length) { + this.gui.show_popup("error", { + 'title': _t("Fiscal Data Module error"), + 'body': _t("Deleting of orders is not allowed."), + }); + } else { + _super_posmodel.delete_current_order.apply(this, arguments); + } + }, }); @@ -39,6 +55,62 @@ models.Order = models.Order.extend({ } }); +var orderline_super = models.Orderline.prototype; +models.Orderline = models.Orderline.extend({ + set_quantity: function (quantity, keep_price) { + var current_quantity = this.get_quantity(); + var new_quantity = parseFloat(quantity) || 0; + if (this.pos.is_french_country() && (new_quantity === 0 || new_quantity < current_quantity)) { + var quantity_to_decrease = current_quantity - new_quantity; + this.pos.gui.show_popup("number", { + 'title': _t("Decrease the quantity by"), + 'confirm': function (qty_decrease) { + if (qty_decrease) { + var order = this.pos.get_order(); + var selected_orderline = order.get_selected_orderline(); + qty_decrease = parseFloat(qty_decrease); + var decimals = this.pos.dp['Product Unit of Measure']; + qty_decrease = round_di(qty_decrease, decimals); + + var current_total_quantity_remaining = selected_orderline.get_quantity(); + order.get_orderlines().forEach(function (orderline, index, array) { + if (selected_orderline.id != orderline.id && + selected_orderline.get_product().id === orderline.get_product().id && + selected_orderline.get_discount() === orderline.get_discount()) { + current_total_quantity_remaining += orderline.get_quantity(); + } + }); + + if (qty_decrease > current_total_quantity_remaining) { + this.pos.gui.show_popup("error", { + 'title': _t("Order error"), + 'body': _t("Not allowed to take back more than was ordered."), + }); + } else { + var decrease_line = selected_orderline.clone(); + decrease_line.order = order; + orderline_super.set_quantity.apply(decrease_line, [-qty_decrease]); + order.add_orderline(decrease_line); + } + } + } + }); + } else { + orderline_super.set_quantity.apply(this, arguments); + } + }, + can_be_merged_with: function(orderline) { + var order = this.pos.get_order(); + var last_id = Object.keys(order.orderlines._byId)[Object.keys(order.orderlines._byId).length-1]; + + if(this.pos.is_french_country() && (order.orderlines._byId[last_id].product.id !== orderline.product.id || order.orderlines._byId[last_id].quantity < 0)) { + return false; + } else { + return orderline_super.can_be_merged_with.apply(this, arguments); + } + } +}); + screens.PaymentScreenWidget.include({ post_push_order_resolve: function (order, server_ids) { @@ -70,4 +142,55 @@ screens.PaymentScreenWidget.include({ } }, }); + +screens.ProductScreenWidget.include({ + _onKeypadKeyDown: function (event) { + if (this.pos.is_french_country()) { + var order = this.pos.get_order(); + var orderline = this.pos.get_order().selected_orderline; + var last_id = Object.keys(order.orderlines._byId)[Object.keys(order.orderlines._byId).length-1]; + + if( !orderline || (last_id === orderline.cid && orderline.quantity > 0)){ + this._super(event); + } + } else { + this._super(event); + } + }, + }); + +screens.NumpadWidget.include({ + start: function(event) { + this._super(event); + if (this.pos.is_french_country()) { + this.$el.find('.numpad-minus').prop("disabled",true); + } + }, + clickChangeMode: function (event) { + if (this.pos.is_french_country() && event.currentTarget.attributes['data-mode'].nodeValue === "price") { + this.gui.show_popup("error", { + 'title': _t("Module error"), + 'body': _t("Adjusting the price is not allowed."), + }); + } else { + this._super(event); + } + }, + clickAppendNewChar: function(event) { + if (this.pos.is_french_country()) { + var order = this.pos.get_order(); + var orderline = this.pos.get_order().selected_orderline; + var last_id = Object.keys(order.orderlines._byId)[Object.keys(order.orderlines._byId).length-1]; + + if(last_id === orderline.cid && orderline.quantity > 0){ + this._super(event); + } + } else { + this._super(event); + } + }, +}); + + + });