Skip to content
Snippets Groups Projects
Commit bba4c637 authored by pedrambiria's avatar pedrambiria
Browse files

[FIX] pos_restaurant: synchronize orders in TicketScreen


Before this commit: if more than one user work on a PoS restaurant, the
synced validated orders wouldn't remove from other user devices.

Steps to reproduce the issue:
	1. Create a PoS resturant
	2. Login to the PoS with two different browser
	3. Create some orders with some products in one of the browsers
	4. Complete the orders in another browser
	=> Orders will not remove from the first browser

The solution is to retrieve the latest orders of every table when going to
the TicketScreen

opw-2925193

closes odoo/odoo#98928

Signed-off-by: default avatarTrinh Jacky (trj) <trj@odoo.com>
parent 86abed0a
Branches
Tags
No related merge requests found
......@@ -7,6 +7,29 @@ odoo.define('pos_restaurant.TicketButton', function (require) {
const PosResTicketButton = (TicketButton) =>
class extends TicketButton {
async onClick() {
if (this.env.pos.config.iface_floorplan && !this.props.isTicketScreenShown && !this.env.pos.table) {
await this._syncAllFromServer();
this.showScreen('TicketScreen');
} else {
super.onClick();
}
}
async _syncAllFromServer() {
const pos = this.env.pos;
try {
for (const floor of pos.floors) {
for (const table of floor.tables) {
await pos.replace_table_orders_from_server(table);
}
}
} catch (e) {
await this.showPopup('ErrorPopup', {
title: this.env._t('Connection Error'),
body: this.env._t('Due to a connection error, the orders are not synchronized.'),
});
}
}
mounted() {
posbus.on('table-set', this, this.render);
}
......
......@@ -226,20 +226,7 @@ models.PosModel = models.PosModel.extend({
this.set_synch('connecting', 1);
this._get_from_server(table.id).then(function (server_orders) {
var orders = self.get_order_list();
orders.forEach(function(order){
// We don't remove the validated orders because we still want to see them
// in the ticket screen. Orders in 'ReceiptScreen' or 'TipScreen' are validated
// orders.
if (order.server_id && !order.finalized){
self.get("orders").remove(order);
order.destroy();
}
});
server_orders.forEach(function(server_order){
var new_order = new models.Order({},{pos: self, json: server_order});
self.get("orders").add(new_order);
new_order.save_to_db();
})
self._replace_orders(orders, server_orders);
if (!ids_to_remove.length) {
self.set_synch('connected');
} else {
......@@ -251,7 +238,29 @@ models.PosModel = models.PosModel.extend({
self.set_order_on_table(order);
});
},
_replace_orders: function(orders_to_replace, new_orders) {
var self = this;
orders_to_replace.forEach(function(order){
// We don't remove the validated orders because we still want to see them
// in the ticket screen. Orders in 'ReceiptScreen' or 'TipScreen' are validated
// orders.
if (order.server_id && !order.finalized){
self.get("orders").remove(order);
order.destroy();
}
});
new_orders.forEach(function(server_order){
var new_order = new models.Order({},{pos: self, json: server_order});
self.get("orders").add(new_order);
new_order.save_to_db();
});
},
//@throw error
replace_table_orders_from_server: async function(table) {
const server_orders = await this._get_from_server(table.id);
const orders = this.get_table_orders(table);
this._replace_orders(orders, server_orders);
},
get_order_with_uid: function() {
var order_ids = [];
this.get_order_list().forEach(function(o){
......
......@@ -55,7 +55,7 @@ odoo.define('pos_restaurant.tour.TipScreen', function (require) {
Chrome.do.backToFloor();
FloorScreen.check.orderCountSyncedInTableIs('T5', '1');
Chrome.do.clickTicketButton();
TicketScreen.check.nthRowContains('4', 'Tipping');
TicketScreen.check.nthRowContains('3', 'Tipping');
// Tip 20% on order1
TicketScreen.do.selectOrder('-0001');
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment