Skip to content

Commit c743e07

Browse files
committed
[FIX] pos_self_order: reset order ui state on back navigation
Steps to reproduce: =================== - Start a self-order session. - Add some products to the cart. - Navigate to the payment page. - Click the back button. Issue: ====== - When going back to the cart page from the payment page, products in the cart are not editable. - On the product page, the cart total shows 0. Cause: ====== - `lineChanges` were not cleared on back navigation, leaving previous data in the cart. Fix: ==== - Clear `lineChanges` when navigating back from the payment page to ensure a clean state. closes odoo#233198 Task: 5055279 X-original-commit: c35ee37 Signed-off-by: David Monnom (moda) <moda@odoo.com> Signed-off-by: Abhishek Khant (abhk) <abhk@odoo.com>
1 parent 9164eb3 commit c743e07

File tree

8 files changed

+100
-13
lines changed

8 files changed

+100
-13
lines changed

addons/pos_online_payment_self_order/static/tests/tours/pos_self_order_mobile_online_payment_tour.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,21 @@ registry
6767
...CartPage.selectTable("1"),
6868
].flat(),
6969
});
70+
71+
registry.category("web_tour.tours").add("test_kiosk_cart_restore_and_cancel", {
72+
test: true,
73+
steps: () => [
74+
Utils.clickBtn("Order Now"),
75+
ProductPage.clickProduct("Coca-Cola"),
76+
ProductPage.clickProduct("Fanta"),
77+
Utils.clickBtn("Checkout"),
78+
CartPage.checkProduct("Coca-Cola", "2.53", "1"),
79+
CartPage.checkProduct("Fanta", "2.53", "1"),
80+
Utils.clickBtn("Pay"),
81+
Utils.clickBtn("Back"),
82+
CartPage.checkProduct("Coca-Cola", "2.53", "1"),
83+
CartPage.checkProduct("Fanta", "2.53", "1"),
84+
Utils.clickBackBtn(),
85+
...ProductPage.clickCancel(),
86+
],
87+
});

addons/pos_online_payment_self_order/tests/test_self_order_mobile.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,38 @@ def test_online_payment_mobile_self_order_preparation_changes(self):
8888

8989
# Check self-order in pos-terminal order button remains enabled
9090
self.start_tour('/pos/ui?config_id=%d' % self.pos_config.id, 'test_online_payment_pos_self_order_preparation_changes', login='pos_user')
91+
92+
def test_kiosk_cart_restore_and_cancel(self):
93+
"""
94+
Verify that the cart restores correctly after back navigation from payment
95+
and that order cancellation works as expected.
96+
"""
97+
98+
self.pos_config.write({
99+
'self_ordering_mode': 'kiosk',
100+
'self_ordering_pay_after': 'each',
101+
'payment_method_ids': [Command.set(self.online_payment_method.ids)],
102+
'use_presets': False,
103+
})
104+
105+
self.pos_config.with_user(self.pos_user).open_ui()
106+
self.pos_config.current_session_id.set_opening_control(0, "")
107+
self_route = self.pos_config._get_self_order_route()
108+
self.start_tour(self_route, "test_kiosk_cart_restore_and_cancel")
109+
110+
kiosk_order = self.env['pos.order'].search(
111+
[('config_id', '=', self.pos_config.id), ('state', '=', 'cancel')],
112+
order="id desc", limit=1
113+
)
114+
115+
# Collect order lines in a dict by product name
116+
order_lines = {line.product_id.name: line for line in kiosk_order.lines}
117+
self.assertEqual(len(order_lines), 2, "There should be exactly 2 order lines")
118+
119+
coca_line = order_lines.get("Coca-Cola")
120+
self.assertIsNotNone(coca_line, "Expected order line not found")
121+
self.assertEqual(coca_line.qty, 1, "Order line quantity mismatch")
122+
123+
fanta_line = order_lines.get("Fanta")
124+
self.assertIsNotNone(fanta_line, "Expected order line not found")
125+
self.assertEqual(fanta_line.qty, 1, "Order line quantity mismatch")

addons/pos_self_order/static/src/app/pages/cart_page/cart_page.js

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import { useScrollShadow } from "../../utils/scroll_shadow_hook";
88
import { useTrackedAsync } from "@point_of_sale/app/hooks/hooks";
99
import { OrderReceipt } from "@point_of_sale/app/screens/receipt_screen/receipt/order_receipt";
1010
import { CancelPopup } from "@pos_self_order/app/components/cancel_popup/cancel_popup";
11-
import { rpc } from "@web/core/network/rpc";
1211
import { _t } from "@web/core/l10n/translation";
1312

1413
export class CartPage extends Component {
@@ -67,17 +66,7 @@ export class CartPage extends Component {
6766
this.dialog.add(CancelPopup, {
6867
title: _t("Cancel order"),
6968
confirm: async () => {
70-
try {
71-
await rpc("/pos-self-order/remove-order", {
72-
access_token: this.selfOrder.access_token,
73-
order_id: this.selfOrder.currentOrder.id,
74-
order_access_token: this.selfOrder.currentOrder.access_token,
75-
});
76-
this.selfOrder.currentOrder.state = "cancel";
77-
this.router.navigate("default");
78-
} catch (error) {
79-
this.selfOrder.handleErrorNotification(error);
80-
}
69+
this.selfOrder.cancelBackendOrder();
8170
},
8271
});
8372
}

addons/pos_self_order/static/src/app/pages/payment_page/payment_page.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ export class PaymentPage extends Component {
2828
});
2929
}
3030

31+
back() {
32+
this.selfOrder.currentOrder.uiState.lineChanges = {};
33+
this.router.back();
34+
}
35+
3136
selectMethod(methodId) {
3237
this.state.selection = false;
3338
this.state.paymentMethodId = methodId;

addons/pos_self_order/static/src/app/pages/payment_page/payment_page.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
</div>
2828

2929
<div class="o_self_footer container o_self_container d-flex justify-content-between align-items-center position-relative py-3">
30-
<button class="btn btn-secondary btn-lg" t-if="state.selection || selectedPaymentMethod.is_online_payment || this.selfOrder.paymentError" t-on-click="() => this.router.back()">Back</button>
30+
<button class="btn btn-secondary btn-lg" t-if="state.selection || selectedPaymentMethod.is_online_payment || this.selfOrder.paymentError" t-on-click="back">Back</button>
3131
<button class="btn btn-primary btn-lg" t-if="!state.selection and selfOrder.paymentError" t-on-click="startPayment">Retry</button>
3232
</div>
3333

addons/pos_self_order/static/src/app/services/self_order_service.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,15 @@ export class SelfOrder extends Reactive {
544544
}
545545

546546
cancelOrder() {
547+
if (
548+
this.config.self_ordering_mode === "kiosk" &&
549+
this.hasPaymentMethod() &&
550+
typeof this.currentOrder.id === "number"
551+
) {
552+
this.cancelBackendOrder();
553+
return;
554+
}
555+
547556
const lineToDelete = [];
548557
for (const line of this.currentOrder.lines) {
549558
const changes = line.changes;
@@ -583,6 +592,20 @@ export class SelfOrder extends Reactive {
583592
}
584593
}
585594

595+
async cancelBackendOrder() {
596+
try {
597+
await rpc("/pos-self-order/remove-order", {
598+
access_token: this.access_token,
599+
order_id: this.currentOrder.id,
600+
order_access_token: this.currentOrder.access_token,
601+
});
602+
this.currentOrder.state = "cancel";
603+
this.router.navigate("default");
604+
} catch (error) {
605+
this.handleErrorNotification(error);
606+
}
607+
}
608+
586609
async sendDraftOrderToServer() {
587610
if (
588611
Object.keys(this.currentOrder.changes).length === 0 ||

addons/pos_self_order/static/tests/unit/services/self_order_service.test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,4 +248,20 @@ describe("self_order_service", () => {
248248
expect(models["pos.order.line"].length).toBe(2);
249249
});
250250
});
251+
252+
test("cancelBackendOrder", async () => {
253+
const store = await setupSelfPosEnv();
254+
const order = await getFilledSelfOrder(store);
255+
256+
const syncOrder = await store.sendDraftOrderToServer();
257+
expect(order.id).toBeOfType("number");
258+
expect(order.lines[0].id).toBeOfType("number");
259+
expect(order.lines[1].id).toBeOfType("number");
260+
expect(syncOrder.id).toBe(order.id);
261+
262+
await store.cancelBackendOrder();
263+
264+
expect(order.state).toBe("cancel");
265+
expect(store.router.activeSlot).toBe("default");
266+
});
251267
});

addons/pos_self_order/static/tests/unit/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export function initMockRpc() {
3131
onRpc("/pos-self-order/process-order/kiosk", mockProcssOrder);
3232
onRpc("/pos-self-order/process-order/mobile", mockProcssOrder);
3333
onRpc("/pos-self-order/get-slots/", () => ({ usage_utc: {} }));
34+
onRpc("/pos-self-order/remove-order", () => ({}));
3435
}
3536

3637
export const setupPoSEnvForSelfOrder = async () => {

0 commit comments

Comments
 (0)