summaryrefslogtreecommitdiff
path: root/addons/account/tests/test_account_move_out_refund.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/account/tests/test_account_move_out_refund.py')
-rw-r--r--addons/account/tests/test_account_move_out_refund.py933
1 files changed, 933 insertions, 0 deletions
diff --git a/addons/account/tests/test_account_move_out_refund.py b/addons/account/tests/test_account_move_out_refund.py
new file mode 100644
index 00000000..967eb232
--- /dev/null
+++ b/addons/account/tests/test_account_move_out_refund.py
@@ -0,0 +1,933 @@
+# -*- coding: utf-8 -*-
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
+from odoo.tests.common import Form
+from odoo.tests import tagged
+from odoo import fields
+
+
+@tagged('post_install', '-at_install')
+class TestAccountMoveOutRefundOnchanges(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.product_line_vals_1 = {
+ 'name': cls.product_a.name,
+ 'product_id': cls.product_a.id,
+ 'account_id': cls.product_a.property_account_income_id.id,
+ 'partner_id': cls.partner_a.id,
+ 'product_uom_id': cls.product_a.uom_id.id,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 1000.0,
+ 'price_subtotal': 1000.0,
+ 'price_total': 1150.0,
+ 'tax_ids': cls.product_a.taxes_id.ids,
+ 'tax_line_id': False,
+ 'currency_id': cls.company_data['currency'].id,
+ 'amount_currency': 1000.0,
+ 'debit': 1000.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ }
+ cls.product_line_vals_2 = {
+ 'name': cls.product_b.name,
+ 'product_id': cls.product_b.id,
+ 'account_id': cls.product_b.property_account_income_id.id,
+ 'partner_id': cls.partner_a.id,
+ 'product_uom_id': cls.product_b.uom_id.id,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 200.0,
+ 'price_subtotal': 200.0,
+ 'price_total': 260.0,
+ 'tax_ids': cls.product_b.taxes_id.ids,
+ 'tax_line_id': False,
+ 'currency_id': cls.company_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 200.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ }
+ cls.tax_line_vals_1 = {
+ 'name': cls.tax_sale_a.name,
+ 'product_id': False,
+ 'account_id': cls.company_data['default_account_tax_sale'].id,
+ 'partner_id': cls.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 180.0,
+ 'price_subtotal': 180.0,
+ 'price_total': 180.0,
+ 'tax_ids': [],
+ 'tax_line_id': cls.tax_sale_a.id,
+ 'currency_id': cls.company_data['currency'].id,
+ 'amount_currency': 180.0,
+ 'debit': 180.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ }
+ cls.tax_line_vals_2 = {
+ 'name': cls.tax_sale_b.name,
+ 'product_id': False,
+ 'account_id': cls.company_data['default_account_tax_sale'].id,
+ 'partner_id': cls.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 30.0,
+ 'price_subtotal': 30.0,
+ 'price_total': 30.0,
+ 'tax_ids': [],
+ 'tax_line_id': cls.tax_sale_b.id,
+ 'currency_id': cls.company_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 30.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ }
+ cls.term_line_vals_1 = {
+ 'name': '',
+ 'product_id': False,
+ 'account_id': cls.company_data['default_account_receivable'].id,
+ 'partner_id': cls.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': -1410.0,
+ 'price_subtotal': -1410.0,
+ 'price_total': -1410.0,
+ 'tax_ids': [],
+ 'tax_line_id': False,
+ 'currency_id': cls.company_data['currency'].id,
+ 'amount_currency': -1410.0,
+ 'debit': 0.0,
+ 'credit': 1410.0,
+ 'date_maturity': fields.Date.from_string('2019-01-01'),
+ 'tax_exigible': True,
+ }
+ cls.move_vals = {
+ 'partner_id': cls.partner_a.id,
+ 'currency_id': cls.company_data['currency'].id,
+ 'journal_id': cls.company_data['default_journal_sale'].id,
+ 'date': fields.Date.from_string('2019-01-01'),
+ 'fiscal_position_id': False,
+ 'payment_reference': '',
+ 'invoice_payment_term_id': cls.pay_terms_a.id,
+ 'amount_untaxed': 1200.0,
+ 'amount_tax': 210.0,
+ 'amount_total': 1410.0,
+ }
+
+ def setUp(self):
+ super(TestAccountMoveOutRefundOnchanges, self).setUp()
+ self.assertInvoiceValues(self.invoice, [
+ self.product_line_vals_1,
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ self.term_line_vals_1,
+ ], self.move_vals)
+
+ def test_out_refund_line_onchange_product_1(self):
+ move_form = Form(self.invoice)
+ with move_form.invoice_line_ids.edit(0) as line_form:
+ line_form.product_id = self.product_b
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'name': self.product_b.name,
+ 'product_id': self.product_b.id,
+ 'product_uom_id': self.product_b.uom_id.id,
+ 'account_id': self.product_b.property_account_income_id.id,
+ 'price_unit': 200.0,
+ 'price_subtotal': 200.0,
+ 'price_total': 260.0,
+ 'tax_ids': self.product_b.taxes_id.ids,
+ 'amount_currency': 200.0,
+ 'debit': 200.0,
+ },
+ self.product_line_vals_2,
+ {
+ **self.tax_line_vals_1,
+ 'price_unit': 60.0,
+ 'price_subtotal': 60.0,
+ 'price_total': 60.0,
+ 'amount_currency': 60.0,
+ 'debit': 60.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'price_unit': 60.0,
+ 'price_subtotal': 60.0,
+ 'price_total': 60.0,
+ 'amount_currency': 60.0,
+ 'debit': 60.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -520.0,
+ 'price_subtotal': -520.0,
+ 'price_total': -520.0,
+ 'amount_currency': -520.0,
+ 'credit': 520.0,
+ },
+ ], {
+ **self.move_vals,
+ 'amount_untaxed': 400.0,
+ 'amount_tax': 120.0,
+ 'amount_total': 520.0,
+ })
+
+ def test_out_refund_line_onchange_business_fields_1(self):
+ move_form = Form(self.invoice)
+ with move_form.invoice_line_ids.edit(0) as line_form:
+ # Current price_unit is 1000.
+ # We set quantity = 4, discount = 50%, price_unit = 400. The debit/credit fields don't change because (4 * 500) * 0.5 = 1000.
+ line_form.quantity = 4
+ line_form.discount = 50
+ line_form.price_unit = 500
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'quantity': 4,
+ 'discount': 50.0,
+ 'price_unit': 500.0,
+ },
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ self.term_line_vals_1,
+ ], self.move_vals)
+
+ move_form = Form(self.invoice)
+ with move_form.line_ids.edit(2) as line_form:
+ # Reset field except the discount that becomes 100%.
+ # /!\ The modification is made on the accounting tab.
+ line_form.quantity = 1
+ line_form.discount = 100
+ line_form.price_unit = 1000
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'discount': 100.0,
+ 'price_subtotal': 0.0,
+ 'price_total': 0.0,
+ 'amount_currency': 0.0,
+ 'debit': 0.0,
+ },
+ self.product_line_vals_2,
+ {
+ **self.tax_line_vals_1,
+ 'price_unit': 30.0,
+ 'price_subtotal': 30.0,
+ 'price_total': 30.0,
+ 'amount_currency': 30.0,
+ 'debit': 30.0,
+ },
+ self.tax_line_vals_2,
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -260.0,
+ 'price_subtotal': -260.0,
+ 'price_total': -260.0,
+ 'amount_currency': -260.0,
+ 'credit': 260.0,
+ },
+ ], {
+ **self.move_vals,
+ 'amount_untaxed': 200.0,
+ 'amount_tax': 60.0,
+ 'amount_total': 260.0,
+ })
+
+ def test_out_refund_line_onchange_accounting_fields_1(self):
+ move_form = Form(self.invoice)
+ with move_form.line_ids.edit(2) as line_form:
+ # Custom debit on the first product line.
+ line_form.debit = 3000
+ with move_form.line_ids.edit(3) as line_form:
+ # Custom credit on the second product line. Credit should be reset by onchange.
+ # /!\ It's a negative line.
+ line_form.credit = 500
+ with move_form.line_ids.edit(0) as line_form:
+ # Custom debit on the first tax line.
+ line_form.debit = 800
+ with move_form.line_ids.edit(4) as line_form:
+ # Custom debit on the second tax line.
+ line_form.debit = 250
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'price_unit': 3000.0,
+ 'price_subtotal': 3000.0,
+ 'price_total': 3450.0,
+ 'amount_currency': 3000.0,
+ 'debit': 3000.0,
+ },
+ {
+ **self.product_line_vals_2,
+ 'price_unit': -500.0,
+ 'price_subtotal': -500.0,
+ 'price_total': -650.0,
+ 'amount_currency': -500.0,
+ 'debit': 0.0,
+ 'credit': 500.0,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'price_unit': 800.0,
+ 'price_subtotal': 800.0,
+ 'price_total': 800.0,
+ 'amount_currency': 800.0,
+ 'debit': 800.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'price_unit': 250.0,
+ 'price_subtotal': 250.0,
+ 'price_total': 250.0,
+ 'amount_currency': 250.0,
+ 'debit': 250.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -3550.0,
+ 'price_subtotal': -3550.0,
+ 'price_total': -3550.0,
+ 'amount_currency': -3550.0,
+ 'credit': 3550.0,
+ },
+ ], {
+ **self.move_vals,
+ 'amount_untaxed': 2500.0,
+ 'amount_tax': 1050.0,
+ 'amount_total': 3550.0,
+ })
+
+ def test_out_refund_line_onchange_partner_1(self):
+ move_form = Form(self.invoice)
+ move_form.partner_id = self.partner_b
+ move_form.payment_reference = 'turlututu'
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'partner_id': self.partner_b.id,
+ },
+ {
+ **self.product_line_vals_2,
+ 'partner_id': self.partner_b.id,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'partner_id': self.partner_b.id,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'partner_id': self.partner_b.id,
+ },
+ {
+ **self.term_line_vals_1,
+ 'name': 'turlututu',
+ 'partner_id': self.partner_b.id,
+ 'account_id': self.partner_b.property_account_receivable_id.id,
+ 'price_unit': -987.0,
+ 'price_subtotal': -987.0,
+ 'price_total': -987.0,
+ 'amount_currency': -987.0,
+ 'credit': 987.0,
+ 'date_maturity': fields.Date.from_string('2019-02-28'),
+ },
+ {
+ **self.term_line_vals_1,
+ 'name': 'turlututu',
+ 'partner_id': self.partner_b.id,
+ 'account_id': self.partner_b.property_account_receivable_id.id,
+ 'price_unit': -423.0,
+ 'price_subtotal': -423.0,
+ 'price_total': -423.0,
+ 'amount_currency': -423.0,
+ 'credit': 423.0,
+ },
+ ], {
+ **self.move_vals,
+ 'partner_id': self.partner_b.id,
+ 'payment_reference': 'turlututu',
+ 'fiscal_position_id': self.fiscal_pos_a.id,
+ 'invoice_payment_term_id': self.pay_terms_b.id,
+ 'amount_untaxed': 1200.0,
+ 'amount_tax': 210.0,
+ 'amount_total': 1410.0,
+ })
+
+ # Remove lines and recreate them to apply the fiscal position.
+ move_form = Form(self.invoice)
+ move_form.invoice_line_ids.remove(0)
+ move_form.invoice_line_ids.remove(0)
+ with move_form.invoice_line_ids.new() as line_form:
+ line_form.product_id = self.product_a
+ with move_form.invoice_line_ids.new() as line_form:
+ line_form.product_id = self.product_b
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'account_id': self.product_b.property_account_income_id.id,
+ 'partner_id': self.partner_b.id,
+ 'tax_ids': self.tax_sale_b.ids,
+ },
+ {
+ **self.product_line_vals_2,
+ 'partner_id': self.partner_b.id,
+ 'price_total': 230.0,
+ 'tax_ids': self.tax_sale_b.ids,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'name': self.tax_sale_b.name,
+ 'partner_id': self.partner_b.id,
+ 'tax_line_id': self.tax_sale_b.id,
+ },
+ {
+ **self.term_line_vals_1,
+ 'name': 'turlututu',
+ 'account_id': self.partner_b.property_account_receivable_id.id,
+ 'partner_id': self.partner_b.id,
+ 'price_unit': -966.0,
+ 'price_subtotal': -966.0,
+ 'price_total': -966.0,
+ 'amount_currency': -966.0,
+ 'credit': 966.0,
+ 'date_maturity': fields.Date.from_string('2019-02-28'),
+ },
+ {
+ **self.term_line_vals_1,
+ 'name': 'turlututu',
+ 'account_id': self.partner_b.property_account_receivable_id.id,
+ 'partner_id': self.partner_b.id,
+ 'price_unit': -414.0,
+ 'price_subtotal': -414.0,
+ 'price_total': -414.0,
+ 'amount_currency': -414.0,
+ 'credit': 414.0,
+ },
+ ], {
+ **self.move_vals,
+ 'partner_id': self.partner_b.id,
+ 'payment_reference': 'turlututu',
+ 'fiscal_position_id': self.fiscal_pos_a.id,
+ 'invoice_payment_term_id': self.pay_terms_b.id,
+ 'amount_untaxed': 1200.0,
+ 'amount_tax': 180.0,
+ 'amount_total': 1380.0,
+ })
+
+ def test_out_refund_line_onchange_taxes_1(self):
+ move_form = Form(self.invoice)
+ with move_form.invoice_line_ids.edit(0) as line_form:
+ line_form.price_unit = 1200
+ line_form.tax_ids.add(self.tax_armageddon)
+ move_form.save()
+
+ child_tax_1 = self.tax_armageddon.children_tax_ids[0]
+ child_tax_2 = self.tax_armageddon.children_tax_ids[1]
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'price_unit': 1200.0,
+ 'price_subtotal': 1000.0,
+ 'price_total': 1470.0,
+ 'tax_ids': (self.tax_sale_a + self.tax_armageddon).ids,
+ 'tax_exigible': False,
+ },
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ {
+ 'name': child_tax_1.name,
+ 'product_id': False,
+ 'account_id': self.company_data['default_account_tax_sale'].id,
+ 'partner_id': self.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 80.0,
+ 'price_subtotal': 80.0,
+ 'price_total': 88.0,
+ 'tax_ids': child_tax_2.ids,
+ 'tax_line_id': child_tax_1.id,
+ 'currency_id': self.company_data['currency'].id,
+ 'amount_currency': 80.0,
+ 'debit': 80.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': False,
+ },
+ {
+ 'name': child_tax_1.name,
+ 'product_id': False,
+ 'account_id': self.company_data['default_account_revenue'].id,
+ 'partner_id': self.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 120.0,
+ 'price_subtotal': 120.0,
+ 'price_total': 132.0,
+ 'tax_ids': child_tax_2.ids,
+ 'tax_line_id': child_tax_1.id,
+ 'currency_id': self.company_data['currency'].id,
+ 'amount_currency': 120.0,
+ 'debit': 120.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': False,
+ },
+ {
+ 'name': child_tax_2.name,
+ 'product_id': False,
+ 'account_id': child_tax_2.cash_basis_transition_account_id.id,
+ 'partner_id': self.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 120.0,
+ 'price_subtotal': 120.0,
+ 'price_total': 120.0,
+ 'tax_ids': [],
+ 'tax_line_id': child_tax_2.id,
+ 'currency_id': self.company_data['currency'].id,
+ 'amount_currency': 120.0,
+ 'debit': 120.0,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': False,
+ },
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -1730.0,
+ 'price_subtotal': -1730.0,
+ 'price_total': -1730.0,
+ 'amount_currency': -1730.0,
+ 'credit': 1730.0,
+ },
+ ], {
+ **self.move_vals,
+ 'amount_untaxed': 1200.0,
+ 'amount_tax': 530.0,
+ 'amount_total': 1730.0,
+ })
+
+ def test_out_refund_line_onchange_cash_rounding_1(self):
+ move_form = Form(self.invoice)
+ # Add a cash rounding having 'add_invoice_line'.
+ move_form.invoice_cash_rounding_id = self.cash_rounding_a
+ move_form.save()
+
+ # The cash rounding does nothing as the total is already rounded.
+ self.assertInvoiceValues(self.invoice, [
+ self.product_line_vals_1,
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ self.term_line_vals_1,
+ ], self.move_vals)
+
+ move_form = Form(self.invoice)
+ with move_form.invoice_line_ids.edit(0) as line_form:
+ line_form.price_unit = 999.99
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ 'name': 'add_invoice_line',
+ 'product_id': False,
+ 'account_id': self.cash_rounding_a.loss_account_id.id,
+ 'partner_id': self.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': 0.01,
+ 'price_subtotal': 0.01,
+ 'price_total': 0.01,
+ 'tax_ids': [],
+ 'tax_line_id': False,
+ 'currency_id': self.company_data['currency'].id,
+ 'amount_currency': 0.01,
+ 'debit': 0.01,
+ 'credit': 0.0,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ },
+ {
+ **self.product_line_vals_1,
+ 'price_unit': 999.99,
+ 'price_subtotal': 999.99,
+ 'price_total': 1149.99,
+ 'amount_currency': 999.99,
+ 'debit': 999.99,
+ },
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ self.term_line_vals_1,
+ ], self.move_vals)
+
+ move_form = Form(self.invoice)
+ # Change the cash rounding to one having 'biggest_tax'.
+ move_form.invoice_cash_rounding_id = self.cash_rounding_b
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'price_unit': 999.99,
+ 'price_subtotal': 999.99,
+ 'price_total': 1149.99,
+ 'amount_currency': 999.99,
+ 'debit': 999.99,
+ },
+ self.product_line_vals_2,
+ self.tax_line_vals_1,
+ self.tax_line_vals_2,
+ {
+ 'name': '%s (rounding)' % self.tax_sale_a.name,
+ 'product_id': False,
+ 'account_id': self.company_data['default_account_tax_sale'].id,
+ 'partner_id': self.partner_a.id,
+ 'product_uom_id': False,
+ 'quantity': 1.0,
+ 'discount': 0.0,
+ 'price_unit': -0.04,
+ 'price_subtotal': -0.04,
+ 'price_total': -0.04,
+ 'tax_ids': [],
+ 'tax_line_id': self.tax_sale_a.id,
+ 'currency_id': self.company_data['currency'].id,
+ 'amount_currency': -0.04,
+ 'debit': 0.0,
+ 'credit': 0.04,
+ 'date_maturity': False,
+ 'tax_exigible': True,
+ },
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -1409.95,
+ 'price_subtotal': -1409.95,
+ 'price_total': -1409.95,
+ 'amount_currency': -1409.95,
+ 'credit': 1409.95,
+ },
+ ], {
+ **self.move_vals,
+ 'amount_untaxed': 1199.99,
+ 'amount_tax': 209.96,
+ 'amount_total': 1409.95,
+ })
+
+ def test_out_refund_line_onchange_currency_1(self):
+ move_form = Form(self.invoice)
+ move_form.currency_id = self.currency_data['currency']
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 1000.0,
+ 'debit': 500.0,
+ },
+ {
+ **self.product_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 100.0,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 180.0,
+ 'debit': 90.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 15.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': -1410.0,
+ 'credit': 705.0,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.currency_data['currency'].id,
+ })
+
+ move_form = Form(self.invoice)
+ # Change the date to get another rate: 1/3 instead of 1/2.
+ move_form.date = fields.Date.from_string('2016-01-01')
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 1000.0,
+ 'debit': 333.33,
+ },
+ {
+ **self.product_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 66.67,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 180.0,
+ 'debit': 60.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 10.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': -1410.0,
+ 'credit': 470.0,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.currency_data['currency'].id,
+ 'date': fields.Date.from_string('2016-01-01'),
+ })
+
+ move_form = Form(self.invoice)
+ with move_form.invoice_line_ids.edit(0) as line_form:
+ # 0.045 * 0.1 = 0.0045. As the foreign currency has a 0.001 rounding,
+ # the result should be 0.005 after rounding.
+ line_form.quantity = 0.1
+ line_form.price_unit = 0.045
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'quantity': 0.1,
+ 'price_unit': 0.05,
+ 'price_subtotal': 0.005,
+ 'price_total': 0.006,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 0.005,
+ 'debit': 0.0,
+ },
+ {
+ **self.product_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 66.67,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'price_unit': 30.0,
+ 'price_subtotal': 30.001,
+ 'price_total': 30.001,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.001,
+ 'debit': 10.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 10.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'price_unit': -260.01,
+ 'price_subtotal': -260.006,
+ 'price_total': -260.006,
+ 'amount_currency': -260.006,
+ 'credit': 86.67,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.currency_data['currency'].id,
+ 'date': fields.Date.from_string('2016-01-01'),
+ 'amount_untaxed': 200.005,
+ 'amount_tax': 60.001,
+ 'amount_total': 260.006,
+ })
+
+ # Exit the multi-currencies.
+ move_form = Form(self.invoice)
+ move_form.currency_id = self.company_data['currency']
+ move_form.save()
+
+ self.assertInvoiceValues(self.invoice, [
+ {
+ **self.product_line_vals_1,
+ 'quantity': 0.1,
+ 'price_unit': 0.05,
+ 'price_subtotal': 0.01,
+ 'price_total': 0.01,
+ 'amount_currency': 0.01,
+ 'debit': 0.01,
+ },
+ self.product_line_vals_2,
+ {
+ **self.tax_line_vals_1,
+ 'price_unit': 30.0,
+ 'price_subtotal': 30.0,
+ 'price_total': 30.0,
+ 'amount_currency': 30.0,
+ 'debit': 30.0,
+ },
+ self.tax_line_vals_2,
+ {
+ **self.term_line_vals_1,
+ 'price_unit': -260.01,
+ 'price_subtotal': -260.01,
+ 'price_total': -260.01,
+ 'amount_currency': -260.01,
+ 'credit': 260.01,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.company_data['currency'].id,
+ 'date': fields.Date.from_string('2016-01-01'),
+ 'amount_untaxed': 200.01,
+ 'amount_tax': 60.0,
+ 'amount_total': 260.01,
+ })
+
+ def test_out_refund_create_1(self):
+ # Test creating an account_move with the least information.
+ move = self.env['account.move'].create({
+ 'move_type': 'out_refund',
+ 'partner_id': self.partner_a.id,
+ 'invoice_date': fields.Date.from_string('2019-01-01'),
+ 'currency_id': self.currency_data['currency'].id,
+ 'invoice_payment_term_id': self.pay_terms_a.id,
+ 'invoice_line_ids': [
+ (0, None, self.product_line_vals_1),
+ (0, None, self.product_line_vals_2),
+ ]
+ })
+
+ self.assertInvoiceValues(move, [
+ {
+ **self.product_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 1000.0,
+ 'debit': 500.0,
+ },
+ {
+ **self.product_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 100.0,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 180.0,
+ 'debit': 90.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 15.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': -1410.0,
+ 'credit': 705.0,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.currency_data['currency'].id,
+ })
+
+ def test_out_refund_write_1(self):
+ # Test creating an account_move with the least information.
+ move = self.env['account.move'].create({
+ 'move_type': 'out_refund',
+ 'partner_id': self.partner_a.id,
+ 'invoice_date': fields.Date.from_string('2019-01-01'),
+ 'currency_id': self.currency_data['currency'].id,
+ 'invoice_payment_term_id': self.pay_terms_a.id,
+ 'invoice_line_ids': [
+ (0, None, self.product_line_vals_1),
+ ]
+ })
+ move.write({
+ 'invoice_line_ids': [
+ (0, None, self.product_line_vals_2),
+ ]
+ })
+
+ self.assertInvoiceValues(move, [
+ {
+ **self.product_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 1000.0,
+ 'debit': 500.0,
+ },
+ {
+ **self.product_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 200.0,
+ 'debit': 100.0,
+ },
+ {
+ **self.tax_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 180.0,
+ 'debit': 90.0,
+ },
+ {
+ **self.tax_line_vals_2,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': 30.0,
+ 'debit': 15.0,
+ },
+ {
+ **self.term_line_vals_1,
+ 'currency_id': self.currency_data['currency'].id,
+ 'amount_currency': -1410.0,
+ 'credit': 705.0,
+ },
+ ], {
+ **self.move_vals,
+ 'currency_id': self.currency_data['currency'].id,
+ })