From 983a9663654f0c8c3afd741af5d64dcf7c48c055 Mon Sep 17 00:00:00 2001 From: "Adrien Guilliams (adgu)" Date: Wed, 18 Oct 2023 17:45:00 +0200 Subject: [PATCH] [IMP] point_of_sale: add tracking_number as searchable field in ticket_screen In this commit, we add the tracking_number of an order as a searchable field in the ticket_screen. This is useful when using pos_self_order for example. If a mobile is made with service at table and pay at cashier after each order, the cashier can search the order by its tracking_number in the history of orders. closes odoo/odoo#139187 Related: odoo/enterprise#49200 Signed-off-by: Vlad Stroia (vlst) --- addons/point_of_sale/models/pos_order.py | 14 +++++++++++++- .../screens/ticket_screen/ticket_screen.js | 19 ++++++++++++++----- .../screens/ticket_screen/ticket_screen.xml | 6 +++++- .../static/src/app/store/models.js | 1 + addons/point_of_sale/views/pos_order_view.xml | 3 +++ .../components/order_widget/order_widget.js | 15 +++++++++++---- .../components/order_widget/order_widget.js | 5 +++-- .../src/app/pages/cart_page/cart_page.js | 1 - .../confirmation_page/confirmation_page.xml | 2 +- .../order_history_page/order_history_page.xml | 2 +- 10 files changed, 52 insertions(+), 16 deletions(-) diff --git a/addons/point_of_sale/models/pos_order.py b/addons/point_of_sale/models/pos_order.py index 3a875ccac35..04dc6abfbc7 100644 --- a/addons/point_of_sale/models/pos_order.py +++ b/addons/point_of_sale/models/pos_order.py @@ -328,7 +328,19 @@ class PosOrder(models.Model): has_refundable_lines = fields.Boolean('Has Refundable Lines', compute='_compute_has_refundable_lines') refunded_orders_count = fields.Integer(compute='_compute_refund_related_fields') ticket_code = fields.Char(help='5 digits alphanumeric code to be used by portal user to request an invoice') - tracking_number = fields.Char(string="Short order number", compute='_compute_tracking_number') + tracking_number = fields.Char(string="Order Number", compute='_compute_tracking_number', search='_search_tracking_number') + + def _search_tracking_number(self, operator, value): + #search is made over the pos_reference field + #The pos_reference field is like 'Order 00001-001-0001' + if operator in ['ilike', '='] and isinstance(value, str): + if value[0] == '%' and value[-1] == '%': + value = value[1:-1] + value = value.zfill(3) + search = '% ____' + value[0] + '-___-__' + value[1:] + return [('pos_reference', operator, search or '')] + else: + raise NotImplementedError(_("Unsupported search operation")) @api.depends('lines.refund_orderline_ids', 'lines.refunded_orderline_id') def _compute_refund_related_fields(self): diff --git a/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.js b/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.js index 5bfc951ee9b..39dea94a85d 100644 --- a/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.js +++ b/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.js @@ -560,9 +560,11 @@ export class TicketScreen extends Component { orderPartnerId, tax_ids: orderline.get_taxes().map((tax) => tax.id), discount: orderline.discount, - pack_lot_lines: orderline.pack_lot_lines ? orderline.pack_lot_lines.map(lot => { - return { lot_name: lot.lot_name }; - }) : false, + pack_lot_lines: orderline.pack_lot_lines + ? orderline.pack_lot_lines.map((lot) => { + return { lot_name: lot.lot_name }; + }) + : false, }, destinationOrderUid: false, }; @@ -595,7 +597,9 @@ export class TicketScreen extends Component { */ _prepareRefundOrderlineOptions(toRefundDetail) { const { qty, orderline } = toRefundDetail; - const draftPackLotLines = orderline.pack_lot_lines ? { modifiedPackLotLines: [], newPackLotLines: orderline.pack_lot_lines} : false; + const draftPackLotLines = orderline.pack_lot_lines + ? { modifiedPackLotLines: [], newPackLotLines: orderline.pack_lot_lines } + : false; return { quantity: -qty, price: orderline.price, @@ -604,7 +608,7 @@ export class TicketScreen extends Component { refunded_orderline_id: orderline.id, tax_ids: orderline.tax_ids, discount: orderline.discount, - draftPackLotLines: draftPackLotLines + draftPackLotLines: draftPackLotLines, }; } _setOrder(order) { @@ -627,6 +631,11 @@ export class TicketScreen extends Component { */ _getSearchFields() { const fields = { + TRACKING_NUMBER: { + repr: (order) => order.trackingNumber, + displayName: _t("Order Number"), + modelField: "tracking_number", + }, RECEIPT_NUMBER: { repr: (order) => order.name, displayName: _t("Receipt Number"), diff --git a/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.xml b/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.xml index 20fbaf83ddb..3d82d4409b3 100644 --- a/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.xml +++ b/addons/point_of_sale/static/src/app/screens/ticket_screen/ticket_screen.xml @@ -51,6 +51,7 @@
Date
Receipt Number
+
Order number
Customer
Cardholder Name
Cashier
@@ -67,6 +68,9 @@
+
+
+
@@ -92,7 +96,7 @@
-
+
/
diff --git a/addons/point_of_sale/static/src/app/store/models.js b/addons/point_of_sale/static/src/app/store/models.js index b02d3239cfb..2a87673ee7f 100644 --- a/addons/point_of_sale/static/src/app/store/models.js +++ b/addons/point_of_sale/static/src/app/store/models.js @@ -1451,6 +1451,7 @@ export class Order extends PosModel { this.ticketCode = json.ticket_code || ""; this.lastOrderPrepaChange = json.last_order_preparation_change && JSON.parse(json.last_order_preparation_change); + this.trackingNumber = json.tracking_number || ""; } export_as_JSON() { var orderLines, paymentLines; diff --git a/addons/point_of_sale/views/pos_order_view.xml b/addons/point_of_sale/views/pos_order_view.xml index 29d7f3737f6..6fcf15d5599 100644 --- a/addons/point_of_sale/views/pos_order_view.xml +++ b/addons/point_of_sale/views/pos_order_view.xml @@ -148,6 +148,7 @@ + @@ -266,6 +267,7 @@ + @@ -381,6 +383,7 @@ + diff --git a/addons/pos_online_payment_self_order/static/src/components/order_widget/order_widget.js b/addons/pos_online_payment_self_order/static/src/components/order_widget/order_widget.js index f71899542e5..11981e0ea9e 100644 --- a/addons/pos_online_payment_self_order/static/src/components/order_widget/order_widget.js +++ b/addons/pos_online_payment_self_order/static/src/components/order_widget/order_widget.js @@ -29,10 +29,17 @@ patch(OrderWidget.prototype, { if (isOnlinePayment) { return { label: buttonName, disabled: false }; } else { - return { - label: _t("Pay at cashier"), - disabled: false, - }; + if (this.router.activeSlot === "product_list") { + return { + label: _t("Order"), + disabled: true, + }; + } else { + return { + label: _t("Pay at cashier"), + disabled: false, + }; + } } } } else { diff --git a/addons/pos_self_order/static/src/app/components/order_widget/order_widget.js b/addons/pos_self_order/static/src/app/components/order_widget/order_widget.js index 395f4431efa..74e8109b507 100644 --- a/addons/pos_self_order/static/src/app/components/order_widget/order_widget.js +++ b/addons/pos_self_order/static/src/app/components/order_widget/order_widget.js @@ -42,6 +42,7 @@ export class OrderWidget extends Component { const kioskPayment = this.selfOrder.pos_payment_methods; const isNoLine = this.selfOrder.currentOrder.lines.length === 0; const hasNotAllLinesSent = this.selfOrder.currentOrder.hasNotAllLinesSent(); + const isMobilePayment = this.selfOrder.pos_payment_methods.find((p) => p.is_mobile_payment); let label = ""; let disabled = false; @@ -53,8 +54,8 @@ export class OrderWidget extends Component { label = _t("Order"); disabled = isNoLine; } else { - label = kioskPayment ? _t("Pay") : _t("Pay at cashier"); - disabled = false; + label = kioskPayment ? _t("Pay") : _t("Order"); + disabled = !kioskPayment && !isMobilePayment; } return { label, disabled }; diff --git a/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js b/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js index 6901d6ebbcd..3909dbe850b 100644 --- a/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js +++ b/addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js @@ -52,7 +52,6 @@ export class CartPage extends Component { const type = this.selfOrder.config.self_ordering_mode; const takeAway = this.selfOrder.currentOrder.take_away; const mode = this.selfOrder.config.self_ordering_pay_after; - const isOnlinePayment = this.selfOrder.pos_payment_methods.find((p) => p.is_online_payment); const order = this.selfOrder.currentOrder; const isPaymentMethod = this.selfOrder.pos_payment_methods.length > 0; diff --git a/addons/pos_self_order/static/src/app/pages/confirmation_page/confirmation_page.xml b/addons/pos_self_order/static/src/app/pages/confirmation_page/confirmation_page.xml index de89572d1e0..c718c421919 100644 --- a/addons/pos_self_order/static/src/app/pages/confirmation_page/confirmation_page.xml +++ b/addons/pos_self_order/static/src/app/pages/confirmation_page/confirmation_page.xml @@ -13,7 +13,7 @@

We're preparing your order!

Pay at the cashier

- Your short order number + Your order number

diff --git a/addons/pos_self_order/static/src/app/pages/order_history_page/order_history_page.xml b/addons/pos_self_order/static/src/app/pages/order_history_page/order_history_page.xml index 9a0c4b3c0d5..21273befc6f 100644 --- a/addons/pos_self_order/static/src/app/pages/order_history_page/order_history_page.xml +++ b/addons/pos_self_order/static/src/app/pages/order_history_page/order_history_page.xml @@ -17,7 +17,7 @@
- Short order number: + Order number: