[IMP] account_payment_disperse: refactor test in progress

H4805
This commit is contained in:
Leo Pinedo
2022-10-11 21:23:54 +00:00
parent 75ad1f9147
commit 601d31e340
3 changed files with 134 additions and 126 deletions

View File

@@ -10,7 +10,7 @@ class PaymentMultiTest(TransactionCase):
# @classmethod
def setUp(self):
super().setUp()
self.register_payments_model = self.env['account.payment.register'].with_context(active_model='account.invoice')
self.register_payments_model = self.env['account.payment.register'].with_context(active_model='account.move')
self.payment_model = self.env['account.payment']
self.invoice_model = self.env['account.move']
self.invoice_line_model = self.env['account.move.line']
@@ -33,20 +33,22 @@ class PaymentMultiTest(TransactionCase):
invoice = self.invoice_model.create({
'partner_id': partner or self.partner_agrolait.id,
'currency_id': currency_id or self.currency_eur_id,
'name': move_type,
# 'name': move_type,
'account_id': account_id or self.account_receivable.id,
'move_type': move_type,
'date': time.strftime('%Y') + '-06-26',
'invoice_date': time.strftime('%Y') + '-06-26',
'invoice_line_ids': [
(0, 0, {
'product_id': self.product.id,
'quantity': 1.0,
'price_unit': amount,
# 'move_id': invoice.id,
'name': 'something',
'account_id': self.account_revenue.id,
}),
],
})
self.invoice_line_model.create({
'product_id': self.product.id,
'quantity': 1,
'price_unit': amount,
'move_id': invoice.id,
'name': 'something',
'account_id': self.account_revenue.id,
})
invoice.action_invoice_open()
invoice.action_post()
return invoice
def test_multiple_payments_partial(self):
@@ -59,13 +61,13 @@ class PaymentMultiTest(TransactionCase):
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
'payment_method_line_id': self.payment_method_manual_in.id,
})
register_payments.amount = 399.0
register_payments.is_manual_disperse = True
with self.assertRaises(ValidationError):
register_payments.create_payments()
register_payments._create_payments()
for line in register_payments.invoice_line_ids:
if line.move_id == inv_1:
@@ -73,129 +75,129 @@ class PaymentMultiTest(TransactionCase):
if line.move_id == inv_2:
line.amount = 300.0
register_payments.create_payments()
register_payments._create_payments()
payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
self.assertEqual(payment_ids.amount, 399.0)
# payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
# self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
# self.assertEqual(payment_ids.amount, 399.0)
self.assertEqual(inv_1.residual_signed, 1.0)
self.assertEqual(inv_2.residual_signed, 200.0)
# self.assertEqual(inv_1.residual_signed, 1.0)
# self.assertEqual(inv_2.residual_signed, 200.0)
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
})
register_payments.amount = 200.0
register_payments.is_manual_disperse = True
# register_payments = self.register_payments_model.with_context(active_ids=ids).create({
# 'payment_date': time.strftime('%Y') + '-07-15',
# 'journal_id': self.bank_journal_euro.id,
# 'payment_method_id': self.payment_method_manual_in.id,
# })
# register_payments.amount = 200.0
# register_payments.is_manual_disperse = True
for line in register_payments.invoice_line_ids:
if line.move_id == inv_2:
line.amount = 200.0
# for line in register_payments.invoice_line_ids:
# if line.move_id == inv_2:
# line.amount = 200.0
register_payments.create_payments()
self.assertEqual(inv_1.residual_signed, 1.0)
self.assertEqual(inv_2.residual_signed, 0.0)
# register_payments._create_payments()
# self.assertEqual(inv_1.residual_signed, 1.0)
# self.assertEqual(inv_2.residual_signed, 0.0)
def test_multiple_payments_write_off(self):
inv_1 = self.create_invoice(amount=100, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
inv_2 = self.create_invoice(amount=500, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
# def test_multiple_payments_write_off(self):
# inv_1 = self.create_invoice(amount=100, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
# inv_2 = self.create_invoice(amount=500, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
ids = [inv_1.id, inv_2.id]
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
})
register_payments.amount = 400.0
register_payments.is_manual_disperse = True
register_payments.writeoff_journal_id = inv_1.journal_id
# ids = [inv_1.id, inv_2.id]
# register_payments = self.register_payments_model.with_context(active_ids=ids).create({
# 'payment_date': time.strftime('%Y') + '-07-15',
# 'journal_id': self.bank_journal_euro.id,
# 'payment_method_id': self.payment_method_manual_in.id,
# })
# register_payments.amount = 400.0
# register_payments.is_manual_disperse = True
# register_payments.writeoff_journal_id = inv_1.journal_id
with self.assertRaises(ValidationError):
register_payments.create_payments()
# with self.assertRaises(ValidationError):
# register_payments._create_payments()
for line in register_payments.invoice_line_ids:
if line.move_id == inv_1:
line.amount = 100.0
if line.move_id == inv_2:
line.amount = 300.0
line.writeoff_acc_id = self.account_revenue
# for line in register_payments.invoice_line_ids:
# if line.move_id == inv_1:
# line.amount = 100.0
# if line.move_id == inv_2:
# line.amount = 300.0
# line.writeoff_acc_id = self.account_revenue
register_payments.create_payments()
# register_payments._create_payments()
payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
self.assertEqual(payment_ids.amount, 400.0)
# payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
# self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
# self.assertEqual(payment_ids.amount, 400.0)
self.assertEqual(inv_1.residual_signed, 0.0)
self.assertEqual(inv_2.residual_signed, 0.0)
# self.assertEqual(inv_1.residual_signed, 0.0)
# self.assertEqual(inv_2.residual_signed, 0.0)
def test_multiple_payments_partial_multi(self):
""" Create test to pay several vendor bills/invoices at once """
# One payment for inv_1 and inv_2 (same partner)
inv_1 = self.create_invoice(amount=100, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
inv_2 = self.create_invoice(amount=500, currency_id=self.currency_eur_id, partner=self.partner_china_exp.id)
# def test_multiple_payments_partial_multi(self):
# """ Create test to pay several vendor bills/invoices at once """
# # One payment for inv_1 and inv_2 (same partner)
# inv_1 = self.create_invoice(amount=100, currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
# inv_2 = self.create_invoice(amount=500, currency_id=self.currency_eur_id, partner=self.partner_china_exp.id)
ids = [inv_1.id, inv_2.id]
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_in.id,
})
register_payments.amount = 400.0
register_payments.is_manual_disperse = True
# ids = [inv_1.id, inv_2.id]
# register_payments = self.register_payments_model.with_context(active_ids=ids).create({
# 'payment_date': time.strftime('%Y') + '-07-15',
# 'journal_id': self.bank_journal_euro.id,
# 'payment_method_id': self.payment_method_manual_in.id,
# })
# register_payments.amount = 400.0
# register_payments.is_manual_disperse = True
for line in register_payments.invoice_line_ids:
if line.move_id == inv_1:
line.amount = 100.0
if line.move_id == inv_2:
line.amount = 300.0
# for line in register_payments.invoice_line_ids:
# if line.move_id == inv_1:
# line.amount = 100.0
# if line.move_id == inv_2:
# line.amount = 300.0
register_payments.create_payments()
# register_payments._create_payments()
payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
self.assertEqual(len(payment_ids), 2, 'Need two payments.')
# Useful for logging amounts of payments and their accounting
# for pay in payment_ids:
# _logger.warn(str(pay) + ' amount: ' + str(pay.amount))
# for line in pay.move_line_ids:
# _logger.warn(' ' +
# str(line) + ' name: ' + str(line.name) + ' :: credit: ' + str(line.credit) + ' debit: ' +
# str(line.debit))
self.assertEqual(sum(payment_ids.mapped('amount')), 400.0)
# payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
# self.assertEqual(len(payment_ids), 2, 'Need two payments.')
# # Useful for logging amounts of payments and their accounting
# # for pay in payment_ids:
# # _logger.warn(str(pay) + ' amount: ' + str(pay.amount))
# # for line in pay.move_line_ids:
# # _logger.warn(' ' +
# # str(line) + ' name: ' + str(line.name) + ' :: credit: ' + str(line.credit) + ' debit: ' +
# # str(line.debit))
# self.assertEqual(sum(payment_ids.mapped('amount')), 400.0)
self.assertEqual(inv_1.residual_signed, 0.0)
self.assertEqual(inv_2.residual_signed, 200.0)
# self.assertEqual(inv_1.residual_signed, 0.0)
# self.assertEqual(inv_2.residual_signed, 200.0)
def test_vendor_multiple_payments_write_off(self):
inv_1 = self.create_invoice(amount=100, move_type='in_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
inv_2 = self.create_invoice(amount=500, move_type='in_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
ids = [inv_1.id, inv_2.id]
register_payments = self.register_payments_model.with_context(active_ids=ids).create({
'payment_date': time.strftime('%Y') + '-07-15',
'journal_id': self.bank_journal_euro.id,
'payment_method_id': self.payment_method_manual_out.id,
})
register_payments.amount = 400.0
register_payments.is_manual_disperse = True
register_payments.writeoff_journal_id = inv_1.journal_id
# def test_vendor_multiple_payments_write_off(self):
# inv_1 = self.create_invoice(amount=100, move_type='in_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
# inv_2 = self.create_invoice(amount=500, move_type='in_invoice', currency_id=self.currency_eur_id, partner=self.partner_agrolait.id)
# ids = [inv_1.id, inv_2.id]
# register_payments = self.register_payments_model.with_context(active_ids=ids).create({
# 'payment_date': time.strftime('%Y') + '-07-15',
# 'journal_id': self.bank_journal_euro.id,
# 'payment_method_id': self.payment_method_manual_out.id,
# })
# register_payments.amount = 400.0
# register_payments.is_manual_disperse = True
# register_payments.writeoff_journal_id = inv_1.journal_id
with self.assertRaises(ValidationError):
register_payments.create_payments()
# with self.assertRaises(ValidationError):
# register_payments._create_payments()
for line in register_payments.invoice_line_ids:
if line.move_id == inv_1:
line.amount = 100.0
if line.move_id == inv_2:
line.amount = 300.0
line.writeoff_acc_id = self.account_revenue
# for line in register_payments.invoice_line_ids:
# if line.move_id == inv_1:
# line.amount = 100.0
# if line.move_id == inv_2:
# line.amount = 300.0
# line.writeoff_acc_id = self.account_revenue
register_payments.create_payments()
# register_payments._create_payments()
payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
self.assertEqual(payment_ids.amount, 400.0)
# payment_ids = self.payment_model.search([('move_ids', 'in', ids)], order="id desc")
# self.assertEqual(len(payment_ids), 1, 'Need only one payment.')
# self.assertEqual(payment_ids.amount, 400.0)
self.assertEqual(inv_1.residual_signed, 0.0)
self.assertEqual(inv_2.residual_signed, 0.0)
# self.assertEqual(inv_1.residual_signed, 0.0)
# self.assertEqual(inv_2.residual_signed, 0.0)

View File

@@ -1,6 +1,10 @@
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
import logging
_logger = logging.getLogger(__name__)
# class AccountRegisterPayments(models.TransientModel):
class AccountPaymentRegister(models.TransientModel):
@@ -21,16 +25,17 @@ class AccountPaymentRegister(models.TransientModel):
return rec
# # @api.multi
def create_payments(self):
def _create_payments(self):
for payment in self.filtered(lambda p: p.is_manual_disperse):
# _logger.warning('\n\n\n ############## \n create_payments()payment:\n%s\n############## \n\n\n'% (payment, ))
line_amount = sum(payment.invoice_line_ids.mapped('amount'))
# _logger.warning('\n\n\n ############## \n create_payments()payment.invoice_line_ids:\n%s\n############## \n\n\n'% (payment.invoice_line_ids, ))
if abs(line_amount - payment.amount) >= 0.01:
raise ValidationError(_('Cannot pay for %s worth of invoices with %s total.' %
(line_amount, payment.amount)))
raise ValidationError(_('Cannot pay for %s worth of invoices with %s total.') % (line_amount, payment.amount))
if not payment.writeoff_journal_id and payment.invoice_line_ids.filtered(lambda l: l.writeoff_acc_id):
raise ValidationError(_('Cannot write off without a write off journal.'))
new_self = self.with_context(payment_wizard_id=self.id)
return super(AccountPaymentRegister, new_self).create_payments()
return super(AccountPaymentRegister, new_self)._create_payments()
# # @api.multi
def action_fill_residual(self):
@@ -55,7 +60,7 @@ class AccountRegisterPaymentsInvoiceLine(models.TransientModel):
_name = 'account.register.payments.invoice.line'
wizard_id = fields.Many2one('account.payment.register')
invoice_id = fields.Many2one('account.invoice', string='Invoice', required=True)
invoice_id = fields.Many2one('account.move', string='Invoice', required=True)
partner_id = fields.Many2one('res.partner', string='Partner', compute='_compute_balances', compute_sudo=True)
residual = fields.Float(string='Remaining', compute='_compute_balances', compute_sudo=True)
residual_due = fields.Float(string='Due', compute='_compute_balances', compute_sudo=True)
@@ -68,13 +73,16 @@ class AccountRegisterPaymentsInvoiceLine(models.TransientModel):
for line in self:
# Bug in the ORM 12.0? The invoice is set, but there is no residual
# on anything other than the first invoice/line processed.
_logger.warning('\n\n\n ############## \n _compute_balances()line:\n%s\n############## \n\n\n'% (line, ))
invoice = line.invoice_id.browse(line.invoice_id.id)
_logger.warning('\n\n\n ############## \n _compute_balances()invoice:\n%s\n############## \n\n\n'% (invoice, ))
residual = invoice.residual
_logger.warning('\n\n\n ############## \n _compute_balances()residual:\n%s\n############## \n\n\n'% (residual, ))
cutoff_date = line.wizard_id.due_date_cutoff
total_amount = 0.0
total_reconciled = 0.0
for move_line in invoice.move_id.line_ids.filtered(lambda r: (
for move_line in invoice.line_ids.filtered(lambda r: (
not r.reconciled
and r.account_id.internal_type in ('payable', 'receivable')
and r.date_maturity <= cutoff_date

View File

@@ -19,10 +19,8 @@
<xpath expr="//group[@name='group1']" position="after">
<group name="invoice_lines" attrs="{'invisible': [('is_manual_disperse', '=', False)]}">
<group>
<button type="object" name="action_fill_residual"
string="Fill with Remaining" class="btn-default"/>
<button type="object" name="action_fill_residual_due"
string="Fill with Due" class="btn-default"/>
<button type="object" name="action_fill_residual" string="Fill with Remaining" class="btn-default"/>
<button type="object" name="action_fill_residual_due" string="Fill with Due" class="btn-default"/>
</group>
<field name="invoice_line_ids" nolabel="1">
<tree editable="bottom" create="false">