128 lines
4.7 KiB
Python
128 lines
4.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from odoo import Command
|
|
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
|
|
from odoo.tests import tagged
|
|
from odoo.exceptions import UserError, ValidationError
|
|
|
|
|
|
@tagged('post_install', '-at_install')
|
|
class TestAccountTax(AccountTestInvoicingCommon):
|
|
|
|
def test_changing_tax_company(self):
|
|
''' Ensure you can't change the company of an account.tax if there are some journal entries '''
|
|
|
|
# Avoid duplicate key value violates unique constraint "account_tax_name_company_uniq".
|
|
self.company_data['default_tax_sale'].name = 'test_changing_account_company'
|
|
|
|
self.env['account.move'].create({
|
|
'move_type': 'out_invoice',
|
|
'date': '2019-01-01',
|
|
'invoice_line_ids': [
|
|
(0, 0, {
|
|
'name': 'invoice_line',
|
|
'quantity': 1.0,
|
|
'price_unit': 100.0,
|
|
'tax_ids': [(6, 0, self.company_data['default_tax_sale'].ids)],
|
|
}),
|
|
],
|
|
})
|
|
|
|
with self.assertRaises(UserError), self.cr.savepoint():
|
|
self.company_data['default_tax_sale'].company_id = self.company_data_2['company']
|
|
|
|
def test_tax_is_used_when_in_transactions(self):
|
|
''' Ensures that a tax is set to used when it is part of some transactions '''
|
|
|
|
# Account.move is one type of transaction
|
|
tax_invoice = self.env['account.tax'].create({
|
|
'name': 'test_is_used_invoice',
|
|
'amount': '100',
|
|
})
|
|
|
|
self.env['account.move'].create({
|
|
'move_type': 'out_invoice',
|
|
'date': '2023-01-01',
|
|
'invoice_line_ids': [
|
|
Command.create({
|
|
'name': 'invoice_line',
|
|
'quantity': 1.0,
|
|
'price_unit': 100.0,
|
|
'tax_ids': [Command.set(tax_invoice.ids)],
|
|
}),
|
|
],
|
|
})
|
|
tax_invoice.invalidate_model(fnames=['is_used'])
|
|
self.assertTrue(tax_invoice.is_used)
|
|
|
|
# Account.reconcile is another of transaction
|
|
tax_reconciliation = self.env['account.tax'].create({
|
|
'name': 'test_is_used_reconcilition',
|
|
'amount': '100',
|
|
})
|
|
self.env['account.reconcile.model'].create({
|
|
'name': "test_tax_is_used",
|
|
'rule_type': 'writeoff_suggestion',
|
|
'auto_reconcile': False,
|
|
'line_ids': [Command.create({
|
|
'account_id': self.company_data['default_account_revenue'].id,
|
|
'tax_ids': [Command.set(tax_reconciliation.ids)],
|
|
})],
|
|
})
|
|
tax_reconciliation.invalidate_model(fnames=['is_used'])
|
|
self.assertTrue(tax_reconciliation.is_used)
|
|
|
|
def test_tax_is_used_restrictions(self):
|
|
''' You should not be able to modify some values of a used tax '''
|
|
|
|
tax = self.env['account.tax'].create({
|
|
'name': 'test_is_used',
|
|
'amount': '100',
|
|
})
|
|
|
|
# A newly created tax should not be used
|
|
self.assertFalse(tax.is_used)
|
|
|
|
self.env['account.move'].create({
|
|
'move_type': 'out_invoice',
|
|
'date': '2023-01-01',
|
|
'invoice_line_ids': [
|
|
Command.create({
|
|
'name': 'invoice_line',
|
|
'quantity': 1.0,
|
|
'price_unit': 100.0,
|
|
'tax_ids': [Command.set(tax.ids)],
|
|
}),
|
|
],
|
|
})
|
|
tax.invalidate_model(fnames=['is_used'])
|
|
|
|
# amount_type
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
tax.amount_type = 'fixed'
|
|
|
|
# type_tax_use
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
tax.type_tax_use = 'purchase'
|
|
|
|
# price_include
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
tax.price_include = True
|
|
|
|
# include_base_amount
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
tax.include_base_amount = True
|
|
|
|
# add repartition lines
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
self.env['account.tax.repartition.line'].create([
|
|
{'tax_id': tax.id, 'document_type': 'invoice', 'repartition_type': 'tax', 'factor': -100},
|
|
{'tax_id': tax.id, 'document_type': 'refund', 'repartition_type': 'tax', 'factor': -100},
|
|
])
|
|
|
|
# remove repartition lines
|
|
with self.assertRaises(ValidationError), self.cr.savepoint():
|
|
invoice_repartition_lines = tax.invoice_repartition_line_ids
|
|
for rep_line in invoice_repartition_lines:
|
|
rep_line.unlink()
|