[FIX] point_of_sale, pos_self_order: prevent duplicate orders in kiosk
Issue: - when an order is created through the kiosk, the order appears several times on the cashiers side. Steps to Reproduce: - Make an order in the POS kiosk. - In the backend, navigate to the kiosk's session and select "Continue Selling." - Click on "Orders" located on the top right. - Observe that the order appears multiple times on the cashier's side. Solution: - added _get_shared_orders that retrieve orders without duplicates. opw-3597973 closes odoo/odoo#149049 Signed-off-by: Joseph Caburnay (jcb) <jcb@odoo.com>
This commit is contained in:
@@ -1186,9 +1186,14 @@ class PosOrder(models.Model):
|
||||
|
||||
@api.model
|
||||
def export_for_ui_shared_order(self, config_id):
|
||||
orders = self._get_shared_orders(config_id)
|
||||
return orders.export_for_ui()
|
||||
|
||||
@api.model
|
||||
def _get_shared_orders(self, config_id):
|
||||
config = self.env['pos.config'].browse(config_id)
|
||||
orders = self.env['pos.order'].search(['&', ('state', '=', 'draft'), '|', ('config_id', '=', config_id), ('config_id', 'in', config.trusted_config_ids.ids)])
|
||||
return orders.export_for_ui()
|
||||
return orders
|
||||
|
||||
def export_for_ui(self):
|
||||
""" Returns a list of dict with each item having similar signature as the return of
|
||||
|
||||
@@ -161,10 +161,10 @@ class PosOrder(models.Model):
|
||||
return orders
|
||||
|
||||
@api.model
|
||||
def export_for_ui_shared_order(self, config_id):
|
||||
orders = super().export_for_ui_shared_order(config_id)
|
||||
self_orders = self.get_standalone_self_order().export_for_ui()
|
||||
return orders + self_orders
|
||||
def _get_shared_orders(self, config_id):
|
||||
orders = super()._get_shared_orders(config_id)
|
||||
self_orders = self.get_standalone_self_order()
|
||||
return orders | self_orders
|
||||
|
||||
@api.model
|
||||
def export_for_ui_table_draft(self, table_ids):
|
||||
|
||||
@@ -98,3 +98,17 @@ registry.category("web_tour.tours").add("self_order_kiosk_cancel", {
|
||||
Utils.checkIsDisabledBtn("Order"),
|
||||
],
|
||||
});
|
||||
|
||||
registry.category("web_tour.tours").add("self_simple_order", {
|
||||
test: true,
|
||||
steps: () => [
|
||||
Utils.checkIsNoBtn("My Order"),
|
||||
Utils.clickBtn("Order Now"),
|
||||
ProductPage.clickProduct("Coca-Cola"),
|
||||
Utils.clickBtn("Order"),
|
||||
CartPage.checkProduct("Coca-Cola", "2.53", "1"),
|
||||
Utils.clickBtn("Pay"),
|
||||
Utils.clickBtn("Close"),
|
||||
Utils.checkIsNoBtn("My Order"),
|
||||
],
|
||||
});
|
||||
|
||||
@@ -32,3 +32,15 @@ class TestSelfOrderKiosk(SelfOrderCommonTest):
|
||||
|
||||
# Cancel behavior
|
||||
self.start_tour(self_route, "self_order_kiosk_cancel")
|
||||
|
||||
def test_duplicate_order_kiosk(self):
|
||||
self.pos_config.write({
|
||||
'self_ordering_takeaway': False,
|
||||
'self_ordering_mode': 'kiosk',
|
||||
'self_ordering_pay_after': 'each',
|
||||
})
|
||||
self.pos_config.with_user(self.pos_user).open_ui()
|
||||
self_route = self.pos_config._get_self_order_route()
|
||||
self.start_tour(self_route, "self_simple_order")
|
||||
orders = self.pos_config.current_session_id.order_ids
|
||||
self.assertEqual(len(orders.export_for_ui_shared_order(self.pos_config.id)), 1)
|
||||
|
||||
Reference in New Issue
Block a user