From 85e9c84dab3d394c26873a34e9fb6e8f7c215017 Mon Sep 17 00:00:00 2001 From: "Jacky (trj)" Date: Mon, 13 Mar 2023 13:13:33 +0000 Subject: [PATCH] [FIX] pos_sale: add down payment limit Before: When taking a SO from the Sales app in the POS, there is no "Down payment limit". There is either no way to check what has still to be paid. So the POS user can charge a customer several times for the same down payment because he cannot see if it has already been paid. After: When you click on the Quotation/Order list the amount left to pay is displayed. When a down payment is chosen and a percentage is entered that is too high and represents more than the remaining amount to be paid, a warning appears and warns that the orderline will be adjusted to the remaining price. closes odoo/odoo#116182 X-original-commit: 185324cc1abf1448d3db976c8e5751196baad3ee Signed-off-by: Trinh Jacky (trj) --- addons/pos_sale/i18n/pos_sale.pot | 9 +++++++++ addons/pos_sale/models/sale_order.py | 1 - .../OrderManagementScreen/SaleOrderFetcher.js | 13 +++++++------ .../SaleOrderManagementScreen.js | 19 +++++++++++++++++++ .../js/OrderManagementScreen/SaleOrderRow.js | 11 +---------- 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/addons/pos_sale/i18n/pos_sale.pot b/addons/pos_sale/i18n/pos_sale.pot index 9cb722ebaf6..ffa05f77d1e 100644 --- a/addons/pos_sale/i18n/pos_sale.pot +++ b/addons/pos_sale/i18n/pos_sale.pot @@ -560,3 +560,12 @@ msgstr "" #, python-format msgid "Yes" msgstr "" + +#. module: pos_sale +#. openerp-web +#: code:addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderManagementScreen.js:0 +#, python-format +msgid "" +"You have tried to charge a down payment of %s but only %s remains to be " +"paid, %s will be applied to the purchase order line." +msgstr "" \ No newline at end of file diff --git a/addons/pos_sale/models/sale_order.py b/addons/pos_sale/models/sale_order.py index e4ed57333e1..b69e26bf154 100644 --- a/addons/pos_sale/models/sale_order.py +++ b/addons/pos_sale/models/sale_order.py @@ -34,7 +34,6 @@ class SaleOrder(models.Model): total_pos_paid = sum(sale_order.order_line.filtered(lambda l: not l.display_type).mapped('pos_order_line_ids.price_subtotal_incl')) sale_order.amount_unpaid = sale_order.amount_total - (total_invoice_paid + total_pos_paid) - class SaleOrderLine(models.Model): _inherit = 'sale.order.line' diff --git a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderFetcher.js b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderFetcher.js index 6a11f17a618..b469f62255e 100644 --- a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderFetcher.js +++ b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderFetcher.js @@ -61,12 +61,12 @@ class SaleOrderFetcher extends EventBus { return sale_orders; } async _getOrderIdsForCurrentPage(limit, offset) { - const domain = [["currency_id", "=", this.pos.globalState.currency.id]]; - if (this.searchDomain) { - domain.push(...this.searchDomain); - } + const domain = [["currency_id", "=", this.pos.globalState.currency.id]].concat( + this.searchDomain || [] + ); + this.pos.globalState.set_synch("connecting"); - const res = await this.orm.searchRead( + const saleOrders = await this.orm.searchRead( "sale.order", domain, [ @@ -80,8 +80,9 @@ class SaleOrderFetcher extends EventBus { ], { offset, limit } ); + this.pos.globalState.set_synch("connected"); - return res; + return saleOrders; } nextPage() { diff --git a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderManagementScreen.js b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderManagementScreen.js index 63a7a441c4b..ed2ddaec298 100644 --- a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderManagementScreen.js +++ b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderManagementScreen.js @@ -259,6 +259,24 @@ export class SaleOrderManagementScreen extends ControlButtonsMixin(IndependentTo down_payment = (down_payment * parse.float(payload)) / 100; } + if (down_payment > sale_order.amount_unpaid) { + const errorBody = sprintf( + this.env._t( + "You have tried to charge a down payment of %s but only %s remains to be paid, %s will be applied to the purchase order line." + ), + this.env.pos.format_currency(down_payment), + this.env.pos.format_currency(sale_order.amount_unpaid), + sale_order.amount_unpaid > 0 + ? this.env.pos.format_currency(sale_order.amount_unpaid) + : this.env.pos.format_currency(0) + ); + await this.popup.add(ErrorPopup, { + title: "Error amount too high", + body: errorBody, + }); + down_payment = sale_order.amount_unpaid > 0 ? sale_order.amount_unpaid : 0; + } + const new_line = new Orderline( {}, { @@ -298,6 +316,7 @@ export class SaleOrderManagementScreen extends ControlButtonsMixin(IndependentTo "fiscal_position_id", "amount_total", "amount_untaxed", + "amount_unpaid", "picking_ids", ] ); diff --git a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderRow.js b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderRow.js index 3257274d9cf..945b4f01031 100644 --- a/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderRow.js +++ b/addons/pos_sale/static/src/js/OrderManagementScreen/SaleOrderRow.js @@ -1,7 +1,5 @@ /** @odoo-module */ - import { Component } from "@odoo/owl"; -import utils from "web.utils"; /** * @props {models.Order} order @@ -42,14 +40,7 @@ export class SaleOrderRow extends Component { * @returns {boolean} */ get showAmountUnpaid() { - const isFullAmountUnpaid = utils.float_is_zero( - Math.abs(this.order.amount_total - this.order.amount_unpaid), - this.env.pos.currency.decimal_places - ); - return ( - !isFullAmountUnpaid && - !utils.float_is_zero(this.order.amount_unpaid, this.env.pos.currency.decimal_places) - ); + return this.order.amount_total != this.order.amount_unpaid; } get amountUnpaidRepr() { return this.env.pos.format_currency(this.order.amount_unpaid);