diff --git a/addons/sale/sale.py b/addons/sale/sale.py
index 28d95384350..052a5648865 100644
--- a/addons/sale/sale.py
+++ b/addons/sale/sale.py
@@ -264,6 +264,20 @@ class sale_order(osv.osv):
cr.execute('insert into sale_order_invoice_rel (order_id,invoice_id) values (%d,%d)', (o.id, res))
return res
+ def action_invoice_cancel(self, cr, uid, ids, context={}):
+ for sale in self.browse(cr, uid, ids):
+ for line in sale.order_line:
+ invoiced=False
+ for iline in line.invoice_lines:
+ if iline.invoice_id and iline.invoice_id.state == 'cancel':
+ continue
+ else:
+ invoiced=True
+ self.pool.get('sale.order.line').write(cr, uid, [line.id], {'invoiced': invoiced})
+ self.write(cr, uid, ids, {'state':'invoice_except', 'invoice_id':False})
+ return True
+
+
def action_cancel(self, cr, uid, ids, context={}):
ok = True
for sale in self.browse(cr, uid, ids):
@@ -508,7 +522,7 @@ class sale_order_line(osv.osv):
'delay': fields.float('Delivery Delay', required=True),
'product_id': fields.many2one('product.product', 'Product', domain=[('sale_ok','=',True)], change_default=True, relate=True),
'invoice_lines': fields.many2many('account.invoice.line', 'sale_order_line_invoice_rel', 'order_line_id','invoice_id', 'Invoice Lines', readonly=True),
- 'invoiced': fields.boolean('Paid', readonly=True, select=True),
+ 'invoiced': fields.boolean('Invoiced', readonly=True, select=True),
'procurement_id': fields.many2one('mrp.procurement', 'Procurement'),
'price_unit': fields.float('Unit Price', required=True, digits=(16, int(config['price_accuracy']))),
'price_net': fields.function(_amount_line_net, method=True, string='Net Price', digits=(16, int(config['price_accuracy']))),
diff --git a/addons/sale/sale_workflow.xml b/addons/sale/sale_workflow.xml
index a05a97d24a5..f0ced38a5eb 100644
--- a/addons/sale/sale_workflow.xml
+++ b/addons/sale/sale_workflow.xml
@@ -72,7 +72,7 @@
invoice_except
function
- write({'state':'invoice_except', 'invoice_id':False})
+ action_invoice_cancel()