[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
This commit is contained in:
Robin Heinz
2020-01-28 09:00:33 +00:00
committed by Antoine Prieels
parent 766e43a0d3
commit 22fc63af16
+114 -86
View File
@@ -881,6 +881,110 @@ models.PosModel = models.PosModel.extend({
}
},
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();
},
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);
},
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();
}
});
});
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.clean_table_transfer(table);
});
} else {
if (ids_to_remove.length) {
self.remove_from_server_and_set_sync_state(ids_to_remove);
}
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.
*
@@ -888,96 +992,20 @@ models.PosModel = models.PosModel.extend({
* @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);
});
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();
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);
}
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);
}
});
} else {
if (ids_to_remove.length) {
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);
}
}
this.set_order(null); // unset curent selected order
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 {
clearInterval(this.table_longpolling);
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);
}
},