[MERGE] OPW 18123
[odoo/odoo.git] / addons / account_voucher / account_voucher.py
index 8fcbf5f..c4bfe29 100644 (file)
@@ -581,17 +581,31 @@ class account_voucher(osv.osv):
     def cancel_voucher(self, cr, uid, ids, context=None):
         reconcile_pool = self.pool.get('account.move.reconcile')
         move_pool = self.pool.get('account.move')
+        move_line_pool = self.pool.get('account.move.line')
+        wf_service = netsvc.LocalService("workflow")
 
         for voucher in self.browse(cr, uid, ids, context=context):
             recs = []
+            invoice_ids = []
             for line in voucher.move_ids:
                 if line.reconcile_id:
-                    recs += [line.reconcile_id.id]
-                if line.reconcile_partial_id:
-                    recs += [line.reconcile_partial_id.id]
-
-            reconcile_pool.unlink(cr, uid, recs)
-
+                    invoice_ids = [rec_line.invoice.id for rec_line in line.reconcile_id.line_id if rec_line.invoice]
+                    recs.append(line.reconcile_id.id)
+                    move_lines = [move_line.id for move_line in line.reconcile_id.line_id]
+                    move_lines.remove(line.id)
+                    partial_ids = reconcile_pool.create(cr, uid, {
+                        'type': 'auto',
+                        'line_id': False,
+                        'line_partial_ids': [(6, 0, move_lines)]})
+                    
+                    move_line_pool.write(cr, uid, move_lines, {
+                        'reconcile_id': False,
+                        'reconcile_partial_id': partial_ids
+                    }, update_check=False)
+                elif line.reconcile_partial_id:
+                    invoice_ids = [rec_line.invoice.id for rec_line in line.reconcile_partial_id.line_partial_ids if rec_line.invoice]
+            if recs:
+                reconcile_pool.unlink(cr, uid, recs)
             if voucher.move_id:
                 move_pool.button_cancel(cr, uid, [voucher.move_id.id])
                 move_pool.unlink(cr, uid, [voucher.move_id.id])
@@ -599,6 +613,8 @@ class account_voucher(osv.osv):
             'state':'cancel',
             'move_id':False,
         }
+        if invoice_ids:
+            wf_service.trg_validate(uid, 'account.invoice', invoice_ids[0], 'open_test', cr)
         self.write(cr, uid, ids, res)
         return True
 
@@ -734,6 +750,9 @@ class account_voucher(osv.osv):
                     'debit': 0.0,
                     'date': inv.date
                 }
+                if not amount:
+                    raise osv.except_osv(_('Warning'),
+                        _("Error while processing 'account.voucher %s' (id:%s) for partner '%s', amount: %s !") % (inv.name, inv.id, inv.partner_id.name, inv.amount))
                 if amount < 0:
                     amount = -amount
                     if line.type == 'dr':
@@ -855,7 +874,7 @@ class account_voucher_line(osv.osv):
         'move_line_id': fields.many2one('account.move.line', 'Journal Item'),
         'date_original': fields.related('move_line_id','date', type='date', relation='account.move.line', string='Date', readonly=1),
         'date_due': fields.related('move_line_id','date_maturity', type='date', relation='account.move.line', string='Due Date', readonly=1),
-        'amount_original': fields.function(_compute_balance, method=True, multi='dc', type='float', string='Original Amount', store=True),
+        'amount_original': fields.function(_compute_balance, method=True, multi='dc', type='float', string='Original Amount', store=True, digits_compute=dp.get_precision('Account')),
         'amount_unreconciled': fields.function(_compute_balance, method=True, multi='dc', type='float', string='Open Balance', store=True, digits_compute=dp.get_precision('Account')),
         'company_id': fields.related('voucher_id','company_id', relation='res.company', type='many2one', string='Company', store=True, readonly=True),
     }