Odoo18-Base/addons/account_payment_term/tests/test_payment_term.py
2025-03-10 10:52:11 +07:00

170 lines
7.5 KiB
Python

from odoo import Command, fields
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
from odoo.tests import tagged
from odoo.tests.common import Form
@tagged('post_install', '-at_install')
class TestAccountPaymentTerms(AccountTestInvoicingCommon):
@classmethod
def setUpClass(cls, chart_template_ref=None):
super().setUpClass(chart_template_ref=chart_template_ref)
cls.invoice = cls.init_invoice('out_refund', products=cls.product_a + cls.product_b)
cls.pay_term_days_end_of_month_10 = cls.env['account.payment.term'].create({
'name': "basic case",
'line_ids': [
Command.create({
'value': 'percent',
'value_amount': 100,
'nb_days': 30,
'delay_type': 'days_end_of_month_on_the',
'days_next_month': 10,
}),
],
})
cls.pay_term_days_end_of_month_31 = cls.env['account.payment.term'].create({
'name': "special case 31",
'line_ids': [
Command.create({
'value': 'percent',
'value_amount': 100,
'nb_days': 30,
'delay_type': 'days_end_of_month_on_the',
'days_next_month': 31,
}),
],
})
cls.pay_term_days_end_of_month_30 = cls.env['account.payment.term'].create({
'name': "special case 30",
'line_ids': [
Command.create({
'value': 'percent',
'value_amount': 100,
'delay_type': 'days_end_of_month_on_the',
'days_next_month': 30,
'nb_days': 0,
}),
],
})
cls.pay_term_days_end_of_month_29 = cls.env['account.payment.term'].create({
'name': "special case 29",
'line_ids': [
Command.create({
'value': 'percent',
'value_amount': 100,
'delay_type': 'days_end_of_month_on_the',
'days_next_month': 29,
'nb_days': 0,
}),
],
})
cls.pay_term_days_end_of_month_days_next_month_0 = cls.env['account.payment.term'].create({
'name': "special case days next month 0",
'line_ids': [
Command.create({
'value': 'percent',
'value_amount': 100,
'delay_type': 'days_end_of_month_on_the',
'days_next_month': 0,
'nb_days': 30,
}),
],
})
def test_payment_term_days_end_of_month_on_the(self):
"""
This test will check that payment terms with a delay_type 'days_end_of_month_on_the' works as expected.
It will check if the date of the date maturity is correctly calculated depending on the invoice date and payment
term selected.
"""
with Form(self.invoice) as basic_case:
basic_case.invoice_payment_term_id = self.pay_term_days_end_of_month_10
basic_case.invoice_date = '2023-12-12'
expected_date_basic_case = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity'),
self.assertEqual(expected_date_basic_case[0], [fields.Date.from_string('2024-02-10')])
with Form(self.invoice) as special_case:
special_case.invoice_payment_term_id = self.pay_term_days_end_of_month_31
special_case.invoice_date = '2023-12-12'
expected_date_special_case = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity'),
self.assertEqual(expected_date_special_case[0], [fields.Date.from_string('2024-02-29')])
def test_payment_term_days_end_of_month_nb_days_0(self):
"""
This test will check that payment terms with a delay_type 'days_end_of_month_on_the'
in combination with nb_days works as expected
Invoice date = 2024-05-23
# case 1
'nb_days' = 0
`days_next_month` = 29
-> 2024-05-23 + 0 days = 2024-05-23
=> `date_maturity` -> 2024-06-29
# case 2
'nb_days' = 0
`days_next_month` = 31
-> 2024-05-23 + 0 days = 2024-05-23
=> `date_maturity` -> 2024-06-30
"""
self.pay_term_days_end_of_month_29.line_ids.nb_days = 0
self.pay_term_days_end_of_month_31.line_ids.nb_days = 0
with Form(self.invoice) as case_1:
case_1.invoice_payment_term_id = self.pay_term_days_end_of_month_29
case_1.invoice_date = '2024-05-23'
expected_date_case_1 = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity')
self.assertEqual(expected_date_case_1, [fields.Date.from_string('2024-06-29')])
with Form(self.invoice) as case_2:
case_2.invoice_payment_term_id = self.pay_term_days_end_of_month_31
case_2.invoice_date = '2024-05-23'
expected_date_case_2 = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity')
self.assertEqual(expected_date_case_2, [fields.Date.from_string('2024-06-30')])
def test_payment_term_days_end_of_month_nb_days_15(self):
"""
This test will check that payment terms with a delay_type 'days_end_of_month_on_the'
in combination with nb_days works as expected
Invoice date = 2024-05-23
# case 1
'nb_days' = 15
`days_next_month` = 30
-> 2024-05-23 + 15 days = 2024-06-07
=> `date_maturity` -> 2024-07-30
# case 2
'nb_days' = 15
`days_next_month` = 31
-> 2024-05-23 + 15 days = 2024-06-07
=> `date_maturity` -> 2024-07-31
"""
self.pay_term_days_end_of_month_30.line_ids.nb_days = 15
self.pay_term_days_end_of_month_31.line_ids.nb_days = 15
with Form(self.invoice) as case_1:
case_1.invoice_payment_term_id = self.pay_term_days_end_of_month_30
case_1.invoice_date = '2024-05-24'
expected_date_case_1 = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity')
self.assertEqual(expected_date_case_1, [fields.Date.from_string('2024-07-30')])
with Form(self.invoice) as case_2:
case_2.invoice_payment_term_id = self.pay_term_days_end_of_month_31
case_2.invoice_date = '2024-05-23'
expected_date_case_2 = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity')
self.assertEqual(expected_date_case_2, [fields.Date.from_string('2024-07-31')])
def test_payment_term_days_end_of_month_days_next_month_0(self):
with Form(self.invoice) as case_1:
case_1.invoice_payment_term_id = self.pay_term_days_end_of_month_days_next_month_0
case_1.invoice_date = '2024-04-22'
expected_date_case_1 = self.invoice.line_ids.filtered(lambda l: l.account_id == self.company_data['default_account_receivable']).mapped('date_maturity')
self.assertEqual(expected_date_case_1, [fields.Date.from_string('2024-05-31')])