mirror of
https://gitlab.com/hibou-io/hibou-odoo/suite.git
synced 2025-01-20 12:37:31 +02:00
[IMP] account_payment_disperse: refactor test in progress
H4805
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user