[FIX] point_of_sale: order invoicing was broken

This commit is contained in:
Frederic van der Essen 2014-07-18 13:28:22 +02:00
parent ac47f95bad
commit 4f0d454217
2 changed files with 26 additions and 53 deletions

View File

@ -324,20 +324,21 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
// it returns a deferred that succeeds after having tried to send the order and all the other pending orders.
push_order: function(order) {
var self = this;
this.proxy.log('push_order',order.export_as_JSON());
var order_id = this.db.add_order(order.export_as_JSON());
if(order){
this.proxy.log('push_order',order.export_as_JSON());
this.db.add_order(order.export_as_JSON());
}
var pushed = new $.Deferred();
this.set('synch',{state:'connecting', pending:self.db.get_orders().length});
this.flush_mutex.exec(function(){
var flushed = self._flush_all_orders();
var flushed = self._flush_orders(self.db.get_orders());
flushed.always(function(){
flushed.always(function(ids){
console.log('pushed orders:',ids);
pushed.resolve();
});
return flushed;
});
return pushed;
},
@ -361,8 +362,6 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
var order_id = this.db.add_order(order.export_as_JSON());
this.set('synch',{state:'connecting', pending:self.db.get_orders().length});
this.flush_mutex.exec(function(){
var done = new $.Deferred(); // holds the mutex
@ -373,7 +372,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
// things will happen as a duplicate will be sent next time
// so we must make sure the server detects and ignores duplicated orders
var transfer = self._flush_order(order_id, {timeout:30000, to_invoice:true});
var transfer = self._flush_orders([self.db.get_order(order_id)], {timeout:30000, to_invoice:true});
transfer.fail(function(){
invoiced.reject('error-transfer');
@ -382,10 +381,12 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
// on success, get the order id generated by the server
transfer.pipe(function(order_server_id){
// generate the pdf and download it
self.pos_widget.do_action('point_of_sale.pos_invoice_report',{additional_context:{
active_ids:order_server_id,
}});
invoiced.resolve();
done.resolve();
});
@ -397,62 +398,33 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
return invoiced;
},
// attemps to send all pending orders ( stored in the pos_db ) to the server,
// and remove the successfully sent ones from the db once
// it has been confirmed that they have been sent correctly.
flush: function() {
// wrapper around the _save_to_server that updates the synch status widget
_flush_orders: function(orders, options) {
var self = this;
var flushed = new $.Deferred();
this.flush_mutex.exec(function(){
var done = new $.Deferred();
this.set('synch',{ state: 'connecting', pending: orders.length});
self._flush_all_orders()
.done( function(){ flushed.resolve();})
.fail( function(){ flushed.reject(); })
.always(function(){ done.resolve(); });
return done;
});
return flushed;
},
// attempts to send the locally stored order of id 'order_id'
// the sending is asynchronous and can take some time to decide if it is successful or not
// it is therefore important to only call this method from inside a mutex
// this method returns a deferred indicating wether the sending was successful or not
// there is a timeout parameter which is set to 2 seconds by default.
_flush_order: function( order_id, options) {
return this._flush_all_orders([this.db.get_order(order_id)], options);
},
// attempts to send all the locally stored orders. As with _flush_order, it should only be
// called from within a mutex.
// this method returns a deferred that always succeeds when all orders have been tried to be sent,
// even if none of them could actually be sent.
_flush_all_orders: function () {
var self = this;
self.set('synch', {
state: 'connecting',
pending: self.get('synch').pending
});
return self._save_to_server(self.db.get_orders()).done(function () {
return self._save_to_server(orders, options).done(function (server_ids) {
var pending = self.db.get_orders().length;
self.set('synch', {
state: pending ? 'connecting' : 'connected',
pending: pending
});
return server_ids;
});
},
// send an array of orders to the server
// available options:
// - timeout: timeout for the rpc call in ms
// returns a deferred that resolves with the list of
// server generated ids for the sent orders
_save_to_server: function (orders, options) {
if (!orders || !orders.length) {
var result = $.Deferred();
result.resolve();
result.resolve([]);
return result;
}
@ -474,10 +446,11 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal
shadow: !options.to_invoice,
timeout: timeout
}
).then(function () {
).then(function (server_ids) {
_.each(orders, function (order) {
self.db.remove_order(order.id);
});
return server_ids;
}).fail(function (unused, event){
// prevent an error popup creation by the rpc failure
// we want the failure to be silent as we send the orders in the background

View File

@ -840,7 +840,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
self.set_status(synch.state, synch.pending);
});
this.$el.click(function(){
self.pos.flush();
self.pos.push_order();
});
},
});
@ -1005,7 +1005,7 @@ function openerp_pos_widgets(instance, module){ //module is instance.point_of_sa
self.$('.loader').animate({opacity:0},1500,'swing',function(){self.$('.loader').addClass('oe_hidden');});
self.pos.flush();
self.pos.push_order();
}).fail(function(){ // error when loading models data from the backend
return new instance.web.Model("ir.model.data").get_func("search_read")([['name', '=', 'action_pos_session_opening']], ['res_id'])