summaryrefslogtreecommitdiff
path: root/addons/pos_restaurant/static/src
diff options
context:
space:
mode:
authorRobin Heinz <rhe@odoo.com>2019-10-17 13:09:06 +0000
committerAntoine Prieels <anp@odoo.com>2020-01-28 09:00:33 +0000
commit22fc63af16d54daeeed07d5c901c09deb3ab5140 (patch)
tree0eda682672561337dd04c779cfee8ebd44fe2097 /addons/pos_restaurant/static/src
parent766e43a0d3b95c9c1499e289060f0afb49c72d22 (diff)
[FIX] point_of_sale: Separate order sync from set table
Separate orders synchronization from set table to make the code clearer and enable overriding. X-original-commit: 5dd115b885193d1b301f4154d76f028194a7ae09
Diffstat (limited to 'addons/pos_restaurant/static/src')
-rw-r--r--addons/pos_restaurant/static/src/js/floors.js200
1 files changed, 114 insertions, 86 deletions
diff --git a/addons/pos_restaurant/static/src/js/floors.js b/addons/pos_restaurant/static/src/js/floors.js
index aeda7259ba9..a56ea30ebe4 100644
--- a/addons/pos_restaurant/static/src/js/floors.js
+++ b/addons/pos_restaurant/static/src/js/floors.js
@@ -881,103 +881,131 @@ models.PosModel = models.PosModel.extend({
}
},
- /**
- * Changes the current table.
- *
- * Switch table and make sure all nececery syncing tasks are done.
- * @param {object} table.
- */
- set_table: function(table) {
- var self = this;
- var ids_to_remove = this.db.get_ids_to_remove_from_server();
- if (!table || this.order_to_transfer_to_different_table) { // no table ? go back to the floor plan, see ScreenSelector
- this.set_idle_timer(true);
- var order_ids = [];
- var table_orders = this.get_order_list();
- table_orders.forEach(function(o){
- order_ids.push(o.uid);
- });
+ transfer_order_to_table: function(table) {
+ this.order_to_transfer_to_different_table.table = table;
+ this.order_to_transfer_to_different_table.save_to_db();
+ },
- if (this.order_to_transfer_to_different_table && table) {
- this.order_to_transfer_to_different_table.table = table;
- this.order_to_transfer_to_different_table.save_to_db();
- order_ids.push(this.order_to_transfer_to_different_table.uid);
- table_orders.push(this.order_to_transfer_to_different_table);
- }
+ push_order_for_transfer: function(order_ids, table_orders) {
+ order_ids.push(this.order_to_transfer_to_different_table.uid);
+ table_orders.push(this.order_to_transfer_to_different_table);
+ },
- var orders_to_sync = this.db.get_unpaid_orders_to_sync(order_ids);
- if (orders_to_sync.length) {
- this.set_synch('connecting', orders_to_sync.length);
- this._save_to_server(orders_to_sync, {'draft': true})
- .then(function (server_ids) {
- server_ids.forEach(function(server_id){
- table_orders.some(function(o){
- if (o.name === server_id.pos_reference) {
- o.server_id = server_id.id;
- o.save_to_db();
- }
- });
- });
- if (!ids_to_remove.length) {
- self.set_synch('connected');
- } else {
- self.remove_from_server_and_set_sync_state(ids_to_remove);
- }
- }).catch(function(reason){
- self.set_synch('error');
- }).finally(function(){
- if (self.order_to_transfer_to_different_table && table) {
- self.order_to_transfer_to_different_table = null;
- self.set_table(table);
+ clean_table_transfer: function(table) {
+ if (this.order_to_transfer_to_different_table && table) {
+ this.order_to_transfer_to_different_table = null;
+ this.set_table(table);
+ }
+ },
+
+ sync_from_server: function(table, table_orders, order_ids) {
+ var self = this;
+ var ids_to_remove = this.db.get_ids_to_remove_from_server();
+ this.set_idle_timer(true);
+ var orders_to_sync = this.db.get_unpaid_orders_to_sync(order_ids);
+ if (orders_to_sync.length) {
+ this.set_synch('connecting', orders_to_sync.length);
+ this._save_to_server(orders_to_sync, {'draft': true}).then(function (server_ids) {
+ server_ids.forEach(function(server_id){
+ table_orders.some(function(o){
+ if (o.name === server_id.pos_reference) {
+ o.server_id = server_id.id;
+ o.save_to_db();
}
});
- } else {
- if (ids_to_remove.length) {
+ });
+ if (!ids_to_remove.length) {
+ self.set_synch('connected');
+ } else {
self.remove_from_server_and_set_sync_state(ids_to_remove);
}
- if (self.order_to_transfer_to_different_table && table) {
- self.order_to_transfer_to_different_table = null;
- self.set_table(table);
- }
+ }).catch(function(reason){
+ self.set_synch('error');
+ }).finally(function(){
+ self.clean_table_transfer(table);
+ });
+ } else {
+ if (ids_to_remove.length) {
+ self.remove_from_server_and_set_sync_state(ids_to_remove);
}
- this.set_order(null); // unset curent selected order
+ self.clean_table_transfer(table);
+ }
+ },
+ set_order_on_table: function() {
+ var orders = this.get_order_list();
+ if (orders.length) {
+ this.set_order(orders[0]); // and go to the first one ...
} else {
+ this.add_new_order(); // or create a new order with the current table
+ }
+ },
+
+ sync_to_server: function(table) {
+ var self = this;
+ var ids_to_remove = this.db.get_ids_to_remove_from_server();
+
+ clearInterval(this.table_longpolling);
+ this.set_idle_timer();
+
+ 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){
+ if (order.server_id){
+ self.get("orders").remove(order);
+ order.destroy();
+ }
+ });
+ server_orders.forEach(function(server_order){
+ if (server_order.lines.length){
+ var new_order = new models.Order({},{pos: self, json: server_order});
+ self.get("orders").add(new_order);
+ new_order.save_to_db();
+ }
+ })
+ if (!ids_to_remove.length) {
+ self.set_synch('connected');
+ } else {
+ self.remove_from_server_and_set_sync_state(ids_to_remove);
+ }
+ }).catch(function(reason){
+ self.set_synch('error');
+ }).finally(function(){
+ self.set_order_on_table();
+ });
+ },
+
+ get_order_with_uid: function() {
+ var order_ids = [];
+ this.get_order_list().forEach(function(o){
+ order_ids.push(o.uid);
+ });
+
+ return order_ids;
+ },
+
+ /**
+ * Changes the current table.
+ *
+ * Switch table and make sure all nececery syncing tasks are done.
+ * @param {object} table.
+ */
+ set_table: function(table) {
+ if(!table){
+ this.sync_from_server(table, this.get_order_list(), this.get_order_with_uid());
+ this.set_order(null);
+ } else if (this.order_to_transfer_to_different_table) {
+ var order_ids = this.get_order_with_uid();
- clearInterval(this.table_longpolling);
+ this.transfer_order_to_table(table);
+ this.push_order_for_transfer(order_ids, this.get_order_list());
+
+ this.sync_from_server(table, this.get_order_list(), order_ids);
+ this.set_order(null);
+ } else {
this.table = table;
- this.set_idle_timer();
-
- 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){
- if (order.server_id){
- 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();
- })
- if (!ids_to_remove.length) {
- self.set_synch('connected');
- } else {
- self.remove_from_server_and_set_sync_state(ids_to_remove);
- }
- }).catch(function(reason){
- self.set_synch('error');
- }).finally(function(){
- var orders = self.get_order_list();
- if (orders.length) {
- self.set_order(orders[0]); // and go to the first one ...
- } else {
- self.add_new_order(); // or create a new order with the current table
- }
- });
+ this.sync_to_server(table);
}
},