From 3f91a17f1c7e3abf73a45bbfaf90707ed3e71133 Mon Sep 17 00:00:00 2001 From: Joseph Caburnay Date: Wed, 21 Sep 2022 10:25:52 +0000 Subject: [PATCH] [FIX] point_of_sale: reuse empty order when refunding X-original-commit: 2a633ee1035810f64a85360ff7559d9a219a8e52 Part-of: odoo/odoo#100891 --- .../js/Screens/TicketScreen/TicketScreen.js | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/addons/point_of_sale/static/src/js/Screens/TicketScreen/TicketScreen.js b/addons/point_of_sale/static/src/js/Screens/TicketScreen/TicketScreen.js index 0da6f74efa3..0f89df82efc 100644 --- a/addons/point_of_sale/static/src/js/Screens/TicketScreen/TicketScreen.js +++ b/addons/point_of_sale/static/src/js/Screens/TicketScreen/TicketScreen.js @@ -213,7 +213,7 @@ odoo.define('point_of_sale.TicketScreen', function (require) { const destinationOrder = this.props.destinationOrder && partner === this.props.destinationOrder.get_partner() ? this.props.destinationOrder - : this.env.pos.add_new_order(); + : this._getEmptyOrder(partner); // Add orderline for each toRefundDetail to the destinationOrder. for (const refundDetail of allToRefundDetails) { @@ -229,6 +229,10 @@ odoo.define('point_of_sale.TicketScreen', function (require) { destinationOrder.updatePricelist(partner); } + if (this.env.pos.get_order().cid !== destinationOrder.cid) { + this.env.pos.set_order(destinationOrder); + } + this._onCloseScreen(); } //#endregion @@ -377,6 +381,30 @@ odoo.define('point_of_sale.TicketScreen', function (require) { } //#endregion //#region PRIVATE METHODS + /** + * Find the empty order with the following priority: + * - The empty order with the same parter as the provided. + * - The first empty order without a partner. + * - If no empty order, create a new one. + * @param {Object | null} partner + * @returns {boolean} + */ + _getEmptyOrder(partner) { + let emptyOrderForPartner = null; + let emptyOrder = null; + for (const order of this.env.pos.orders) { + if (order.get_orderlines().length === 0 && order.get_paymentlines().length === 0) { + if (order.get_partner() === partner) { + emptyOrderForPartner = order; + break; + } else if (!order.get_partner() && emptyOrder === null) { + // If emptyOrderForPartner is not found, we will use the first empty order. + emptyOrder = order; + } + } + } + return emptyOrderForPartner || emptyOrder || this.env.pos.add_new_order(); + } _doesOrderHaveSoleItem(order) { const orderlines = order.get_orderlines(); if (orderlines.length !== 1) return false;