From e47bd1d71e19ab6f19696295713b7fbaeed3d71b Mon Sep 17 00:00:00 2001 From: "David Monnom (moda)" Date: Wed, 3 May 2023 13:03:47 +0000 Subject: [PATCH] [IMP] point_of_sale,pos_restaurant: cancelled order to preparation tools Before when you deleted a order in PoS with the preparation tools enabled. The order was not cancelled on them. Now, when cancelling/deleting an order in PoS the information is sent to the preparation tools. closes odoo/odoo#120447 Taskid: 3278081 Related: odoo/enterprise#40673 Signed-off-by: Joseph Caburnay (jcb) --- .../point_of_sale/static/src/app/pos_store.js | 8 ++++--- .../js/Screens/ReceiptScreen/ReceiptScreen.js | 6 +++-- .../js/Screens/TicketScreen/TicketScreen.js | 3 +++ addons/point_of_sale/static/src/js/models.js | 23 +++++++++++-------- .../point_of_sale/views/pos_printer_view.xml | 7 ++++++ .../static/src/js/Screens/TicketScreen.js | 4 +++- 6 files changed, 35 insertions(+), 16 deletions(-) diff --git a/addons/point_of_sale/static/src/app/pos_store.js b/addons/point_of_sale/static/src/app/pos_store.js index 7f678586b4e..3bd14b15478 100644 --- a/addons/point_of_sale/static/src/app/pos_store.js +++ b/addons/point_of_sale/static/src/app/pos_store.js @@ -57,11 +57,13 @@ export class PosStore extends Reactive { } // Now the printer should work in PoS without restaurant - async sendOrderInPreparation(order) { + async sendOrderInPreparation(order, cancelled = false) { if (this.globalState.printers_category_ids_set.size) { try { - if (order.hasChangesToPrint()) { - const isPrintSuccessful = await order.printChanges(); + const changes = order.changesToOrder(cancelled); + + if (changes.cancelled.length > 0 || changes.new.length > 0) { + const isPrintSuccessful = await order.printChanges(cancelled); if (!isPrintSuccessful) { this.popup.add(ErrorPopup, { title: _t("Printing failed"), diff --git a/addons/point_of_sale/static/src/js/Screens/ReceiptScreen/ReceiptScreen.js b/addons/point_of_sale/static/src/js/Screens/ReceiptScreen/ReceiptScreen.js index 24bdf0be5d5..70d908b56a8 100644 --- a/addons/point_of_sale/static/src/js/Screens/ReceiptScreen/ReceiptScreen.js +++ b/addons/point_of_sale/static/src/js/Screens/ReceiptScreen/ReceiptScreen.js @@ -5,7 +5,7 @@ import { AbstractReceiptScreen } from "@point_of_sale/js/Misc/AbstractReceiptScr import { OfflineErrorPopup } from "@point_of_sale/js/Popups/OfflineErrorPopup"; import { registry } from "@web/core/registry"; import { OrderReceipt } from "./OrderReceipt"; -import { onMounted, useRef, status, useState } from "@odoo/owl"; +import { onMounted, useRef, status, useState, onWillStart } from "@odoo/owl"; import { usePos } from "@point_of_sale/app/pos_hook"; import { useService } from "@web/core/utils/hooks"; import { BasePrinter } from "@point_of_sale/app/printer/base_printer"; @@ -44,11 +44,13 @@ export class ReceiptScreen extends AbstractReceiptScreen { await this.handleAutoPrint(); } }, 0); + }); + onWillStart(async () => { // When the order is paid, if there is still a part of the order // to send in preparation it is automatically sent if (this.pos.globalState.orderPreparationCategories.size) { - this.pos.sendOrderInPreparation(this.currentOrder); + await this.pos.sendOrderInPreparation(this.currentOrder); } }); } 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 cf7610353a2..d968f294884 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 @@ -148,6 +148,9 @@ export class TicketScreen extends IndependentToOrderScreen { } const { globalState } = this.pos; if (order && (await this._onBeforeDeleteOrder(order))) { + if (Object.keys(order.lastOrderPrepaChange).length > 0) { + await this.pos.sendOrderInPreparation(order, true); + } if (order === globalState.get_order()) { this._selectNextOrder(order); } diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 0d51b5d70a2..6558ac6e5f3 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -2974,8 +2974,10 @@ export class Order extends PosModel { return receipt; } - async printChanges() { - const orderChange = this.changesToOrder; + // This function send order change to printer + // For sending changes to preparation display see sendChanges function. + async printChanges(cancelled) { + const orderChange = this.changesToOrder(cancelled); let isPrintSuccessful = true; const d = new Date(); let hours = "" + d.getHours(); @@ -3013,8 +3015,7 @@ export class Order extends PosModel { return isPrintSuccessful; } - _getPrintingCategoriesChanges(categories) { - const currentOrderChange = this.changesToOrder; + _getPrintingCategoriesChanges(categories, currentOrderChange) { return { new: currentOrderChange["new"].filter((change) => this.pos.db.is_product_in_category(categories, change["product_id"]) @@ -3082,7 +3083,7 @@ export class Order extends PosModel { for (const orderlineIdx in this.orderlines) { const orderline = this.orderlines[orderlineIdx]; - if (orderline.skipChange) { + if (orderline.skipChange || orderline.refunded_orderline_id) { continue; } @@ -3136,16 +3137,18 @@ export class Order extends PosModel { // This function transforms the data generated by getOrderChanges into the old // pattern used by the printer and the display preparation. This old pattern comes from // the time when this logic was in pos_restaurant. - get changesToOrder() { + changesToOrder(cancelled = false) { const toAdd = []; const toRemove = []; - const changes = Object.values(this.getOrderChanges()); + const changes = !cancelled + ? Object.values(this.getOrderChanges()) + : Object.values(this.lastOrderPrepaChange); for (const lineChange of changes) { - if (lineChange["quantity"] > 0) { + if (lineChange["quantity"] > 0 && !cancelled) { toAdd.push(lineChange); - } else if (lineChange["quantity"] < 0) { - lineChange["quantity"] *= -1; // we change the sign because that's how it is + } else { + lineChange["quantity"] = Math.abs(lineChange["quantity"]); // we need always positive values. toRemove.push(lineChange); } } diff --git a/addons/point_of_sale/views/pos_printer_view.xml b/addons/point_of_sale/views/pos_printer_view.xml index be6197fe814..825a5adcea0 100644 --- a/addons/point_of_sale/views/pos_printer_view.xml +++ b/addons/point_of_sale/views/pos_printer_view.xml @@ -46,4 +46,11 @@ + + diff --git a/addons/pos_restaurant/static/src/js/Screens/TicketScreen.js b/addons/pos_restaurant/static/src/js/Screens/TicketScreen.js index f8c3d2a3ce1..e89ffb3c61f 100644 --- a/addons/pos_restaurant/static/src/js/Screens/TicketScreen.js +++ b/addons/pos_restaurant/static/src/js/Screens/TicketScreen.js @@ -83,11 +83,13 @@ patch(TicketScreen.prototype, "pos_restaurant.TicketScreen", { const { globalState } = this.pos; if (globalState.config.module_pos_restaurant) { globalState.setOrderToRemove(order); + await _super(...arguments); if (!globalState.table) { await globalState._removeOrdersFromServer(); } + } else { + await _super(...arguments); } - await _super(...arguments); }, async setTip(order, serverId, amount) { const { globalState } = this.pos;