[FIX] account: divide the residual amount of invoices proportionally to the number of invoices partially reconciled together if needed + if necessary, do a conversion at the right currency rate
bzr revid: qdp-launchpad@openerp.com-20130523122855-n0o1rz9ajxkbgsnj
This commit is contained in:
parent
7ca85ffbba
commit
d9c00b129b
|
@ -92,13 +92,43 @@ class account_invoice(osv.osv):
|
||||||
return [('none', _('Free Reference'))]
|
return [('none', _('Free Reference'))]
|
||||||
|
|
||||||
def _amount_residual(self, cr, uid, ids, name, args, context=None):
|
def _amount_residual(self, cr, uid, ids, name, args, context=None):
|
||||||
|
"""Function of the field residua. It computes the residual amount (balance) for each invoice"""
|
||||||
|
if context is None:
|
||||||
|
context = {}
|
||||||
|
ctx = context.copy()
|
||||||
result = {}
|
result = {}
|
||||||
|
currency_obj = self.pool.get('res.currency')
|
||||||
for invoice in self.browse(cr, uid, ids, context=context):
|
for invoice in self.browse(cr, uid, ids, context=context):
|
||||||
|
nb_inv_in_partial_rec = max_invoice_id = 0
|
||||||
result[invoice.id] = 0.0
|
result[invoice.id] = 0.0
|
||||||
if invoice.move_id:
|
if invoice.move_id:
|
||||||
for m in invoice.move_id.line_id:
|
for aml in invoice.move_id.line_id:
|
||||||
if m.account_id.type in ('receivable','payable'):
|
if aml.account_id.type in ('receivable','payable'):
|
||||||
result[invoice.id] += m.amount_residual_currency
|
if aml.currency_id and aml.currency_id.id == invoice.currency_id.id:
|
||||||
|
result[invoice.id] += aml.amount_residual_currency
|
||||||
|
else:
|
||||||
|
ctx['date'] = aml.date
|
||||||
|
result[invoice.id] += currency_obj.compute(cr, uid, aml.company_id.currency_id.id, invoice.currency_id.id, aml.amount_residual, context=ctx)
|
||||||
|
|
||||||
|
if aml.reconcile_partial_id.line_partial_ids:
|
||||||
|
#we check if the invoice is partially reconciled and if there are other invoices
|
||||||
|
#involved in this partial reconciliation (and we sum these invoices)
|
||||||
|
for line in aml.reconcile_partial_id.line_partial_ids:
|
||||||
|
if line.invoice:
|
||||||
|
nb_inv_in_partial_rec += 1
|
||||||
|
#store the max invoice id as for this invoice we will make a balance instead of a simple division
|
||||||
|
max_invoice_id = max(max_invoice_id, line.invoice.id)
|
||||||
|
if nb_inv_in_partial_rec:
|
||||||
|
#if there are several invoices in a partial reconciliation, we split the residual by the number
|
||||||
|
#of invoice to have a sum of residual amounts that matches the partner balance
|
||||||
|
new_value = currency_obj.round(cr, uid, invoice.currency_id, result[invoice.id] / nb_inv_in_partial_rec)
|
||||||
|
if invoice.id == max_invoice_id:
|
||||||
|
#if it's the last the invoice of the bunch of invoices partially reconciled together, we make a
|
||||||
|
#balance to avoid rounding errors
|
||||||
|
result[invoice.id] = result[invoice.id] - ((nb_inv_in_partial_rec - 1) * new_value)
|
||||||
|
else:
|
||||||
|
result[invoice.id] = new_value
|
||||||
|
|
||||||
#prevent the residual amount on the invoice to be less than 0
|
#prevent the residual amount on the invoice to be less than 0
|
||||||
result[invoice.id] = max(result[invoice.id], 0.0)
|
result[invoice.id] = max(result[invoice.id], 0.0)
|
||||||
return result
|
return result
|
||||||
|
|
Loading…
Reference in New Issue