[REV] Revert "[FIX] account: fix payment on multiple invoices" because runbot is red, which isn't a good thing... even more on a Friday!

This reverts commit ce8ad842a2.
This commit is contained in:
qdp-odoo
2015-06-19 16:42:43 +02:00
parent 428072f3b2
commit 3faa57656a
4 changed files with 50 additions and 38 deletions
+2 -4
View File
@@ -520,12 +520,10 @@ class AccountInvoice(models.Model):
tax_grouped[key]['amount'] += val['amount']
return tax_grouped
@api.multi
@api.one
def register_payment(self, payment_line, writeoff_acc_id=False, writeoff_journal_id=False):
""" Reconcile payable/receivable lines from the invoice with payment_line """
line_to_reconcile = self.env['account.move.line']
for inv in self:
line_to_reconcile += inv.move_id.line_ids.filtered(lambda r: not r.reconciled and r.account_id.internal_type in ('payable', 'receivable'))
line_to_reconcile = self.move_id.line_ids.filtered(lambda r: not r.reconciled and r.account_id.internal_type in ('payable', 'receivable'))
return (line_to_reconcile + payment_line).reconcile(writeoff_acc_id, writeoff_journal_id)
@api.v7
+8 -11
View File
@@ -695,17 +695,14 @@ class AccountMoveLine(models.Model):
def _get_pair_to_reconcile(self):
#field is either 'amount_residual' or 'amount_residual_currency' (if the reconciled account has a secondary currency set)
field = self[0].account_id.currency_id and 'amount_residual_currency' or 'amount_residual'
#target the pair of move in self that are the oldest
sorted_moves = sorted(self, key=lambda a: a.date)
debit = credit = False
for aml in sorted_moves:
if credit != False and credit != False:
break
if aml[field] > 0 and debit == False:
debit = aml
elif aml[field] < 0 and credit == False:
credit = aml
return debit, credit
#target the pair of move in self with smallest debit, credit
smallest_debit = smallest_credit = False
for aml in self:
if aml[field] > 0:
smallest_debit = (not smallest_debit or aml[field] < smallest_debit[field]) and aml or smallest_debit
elif aml[field] < 0:
smallest_credit = (not smallest_credit or aml[field] > smallest_credit[field]) and aml or smallest_credit
return smallest_debit, smallest_credit
def auto_reconcile_lines(self):
""" This function iterates recursively on the recordset given as parameter as long as it
+39 -22
View File
@@ -146,7 +146,7 @@ class account_register_payments(models.TransientModel):
'communication': self.communication,
'invoice_ids': [(4, inv.id, None) for inv in self._get_invoices()],
'payment_type': self.payment_type,
'amount': self.amount,
'amount': self._compute_total_invoices_amount(),
'currency_id': self.currency_id.id,
'partner_id': self.partner_id.id,
'partner_type': self.partner_type,
@@ -175,7 +175,11 @@ class account_payment(models.Model):
def _compute_payment_difference(self):
if len(self.invoice_ids) == 0:
return
self.payment_difference = self._compute_total_invoices_amount() - self.amount
# A payment on multiple invoices must pay them entirely (and amount be readonly of course)
if len(self.invoice_ids) != 1:
self.payment_difference = 0
else:
self.payment_difference = self._compute_total_invoices_amount() - self.amount
company_id = fields.Many2one(store=True)
@@ -310,7 +314,7 @@ class account_payment(models.Model):
@api.multi
def unlink(self):
if any(rec.state != 'draft' for rec in self):
raise UserError(_("You can not delete a payment that is already posted"))
raise UserError(_("In order to delete a payment, it must first be canceled."))
return super(account_payment, self).unlink()
@api.multi
@@ -363,24 +367,42 @@ class account_payment(models.Model):
Return the journal entry.
"""
aml_obj = self.env['account.move.line'].with_context(check_move_validity=False)
debit, credit, amount_currency = aml_obj.with_context(date=self.payment_date).compute_amount_fields(amount, self.currency_id, self.company_id.currency_id)
invoice_id = len(self.invoice_ids) == 1 and self.invoice_ids[0] or False
total_debit, total_credit, total_amount_currency = aml_obj.with_context(date=self.payment_date).compute_amount_fields(amount, self.currency_id, self.company_id.currency_id)
move = self.env['account.move'].create(self._get_move_vals())
#Write line corresponding to invoice payment
counterpart_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, move.id, False)
counterpart_aml_dict.update(self._get_counterpart_move_line_vals(self.invoice_ids))
counterpart_aml_dict.update({'currency_id': self.currency_id != self.company_id.currency_id and self.currency_id.id or False})
counterpart_aml = aml_obj.create(counterpart_aml_dict)
#Reconcile with the invoices
if self.payment_difference_handling == 'reconcile':
self.invoice_ids.register_payment(counterpart_aml, self.writeoff_account, self.journal_id)
if len(self.invoice_ids) > 1:
total_amount = 0
for invoice_id in self.invoice_ids:
# Create a reconciliable journal item corresponding to the invoice
inv_amount = -invoice_id.residual * MAP_INVOICE_TYPE_PAYMENT_SIGN[invoice_id.type]
debit = inv_amount > 0 and inv_amount or 0
credit = inv_amount < 0 and -inv_amount or 0
amount_currency = self.currency_id != self.company_id.currency_id and self.company_id.currency_id.with_context(date=self.payment_date).compute(inv_amount, self.currency_id) or 0
# Avoid unbalanced journal entry due to rounding error
total_amount = total_amount + debit - credit
counterpart_aml_dict = self._get_shared_move_line_vals(debit, credit, amount_currency, move.id, invoice_id)
counterpart_aml_dict.update(self._get_counterpart_move_line_vals(invoice_id))
counterpart_aml_dict.update({'currency_id': self.currency_id != self.company_id.currency_id and self.currency_id.id or False})
counterpart_aml = aml_obj.create(counterpart_aml_dict)
invoice_id.register_payment(counterpart_aml)
total_debit = total_amount > 0 and total_amount or 0
total_credit = total_amount < 0 and -total_amount or 0
else:
self.invoice_ids.register_payment(counterpart_aml)
# Create reconciliable journal item
counterpart_aml_dict = self._get_shared_move_line_vals(total_debit, total_credit, total_amount_currency, move.id, invoice_id)
counterpart_aml_dict.update(self._get_counterpart_move_line_vals(invoice_id))
counterpart_aml = aml_obj.create(counterpart_aml_dict)
#Write counterpart lines
liquidity_aml_dict = self._get_shared_move_line_vals(credit, debit, -amount_currency, move.id, False)
# Reconcile it with the invoice if present
if invoice_id:
if self.payment_difference_handling == 'reconcile':
invoice_id.register_payment(counterpart_aml, self.writeoff_account, self.journal_id)
else:
invoice_id.register_payment(counterpart_aml)
liquidity_aml_dict = self._get_shared_move_line_vals(total_credit, total_debit, -total_amount_currency, move.id, invoice_id)
liquidity_aml_dict.update(self._get_liquidity_move_line_vals(-amount))
aml_obj.create(liquidity_aml_dict)
@@ -453,7 +475,7 @@ class account_payment(models.Model):
if self.payment_type == 'transfer':
name = self.name
else:
name = ''
name = invoice and invoice.number + ': ' or ''
if self.partner_type == 'customer':
if self.payment_type == 'inbound':
name += _("Customer Payment")
@@ -464,11 +486,6 @@ class account_payment(models.Model):
name += _("Supplier Refund")
elif self.payment_type == 'outbound':
name += _("Supplier Payment")
if invoice:
name += ': '
for inv in invoice:
name += inv.number+', '
name = name[:len(name)-2]
return {
'name': name,
'account_id': self.destination_account_id.id,
@@ -244,7 +244,7 @@
<field name="hide_payment_method" invisible="1"/>
<field name="payment_method" widget="radio" attrs="{'invisible': [('hide_payment_method', '=', True)]}"/>
<field name="payment_method_code" invisible="1"/>
<field name="amount"/>
<field name="amount" readonly="1"/>
<field name="currency_id" invisible="1"/>
</group>
<group>