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()