1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
|
# -*- coding: utf-8 -*-
from odoo import Command
from odoo.addons.account.tests.common import AccountTestInvoicingCommon
from odoo.addons.l10n_eu_oss.models.eu_tag_map import EU_TAG_MAP
from odoo.tests import tagged
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSBelgium(AccountTestInvoicingCommon):
@classmethod
@AccountTestInvoicingCommon.setup_country('be')
def setUpClass(cls):
super().setUpClass()
cls.root_company = cls.company_data['company']
cls.root_company.child_ids = [Command.create({'name': 'Branch A'})]
cls.cr.precommit.run() # load the CoA
cls.child_company = cls.root_company.child_ids
cls.child_company.child_ids = [Command.create({'name': 'sub Branch B'})]
cls.sub_child_company = cls.root_company.child_ids.child_ids
cls.cr.precommit.run() # load the CoA
def test_oss_tax_should_be_instantiated_on_root_company_if_no_tax_id_on_sub_branch(self):
self.sub_child_company._map_eu_taxes()
# simulate sub child selection in the switcher
self.env.user.company_id, self.env.user.company_ids = self.sub_child_company, self.sub_child_company
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.sub_child_company.country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%"{another_eu_country_code}"%')], limit=1)
self.assertTrue(tax_oss)
self.assertEqual(tax_oss.company_id, self.root_company)
def test_oss_tax_should_be_instantiated_on_first_branch_having_a_tax_id(self):
# simulate sub child selection in the switcher
self.env.user.company_id, self.env.user.company_ids = self.sub_child_company, self.sub_child_company
self.sub_child_company.vat = "BE0477472701"
self.sub_child_company._map_eu_taxes()
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.sub_child_company.country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%{another_eu_country_code}%')], limit=1)
self.assertTrue(tax_oss)
self.assertEqual(tax_oss.company_id, self.sub_child_company)
def test_country_tag_from_belgium(self):
"""
This test ensure that xml_id from `account.tax.report.line` in the EU_TAG_MAP are processed correctly by the oss
tax creation mechanism.
"""
self.sub_child_company._map_eu_taxes()
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%"{another_eu_country_code}"%')], limit=1)
for doc_type, report_expression_xml_id in (
("invoice", "l10n_be.tax_report_line_47_tag"),
("refund", "l10n_be.tax_report_line_49_tag"),
):
with self.subTest(doc_type=doc_type, report_expression_xml_id=report_expression_xml_id):
oss_tag_id = tax_oss[f"{doc_type}_repartition_line_ids"]\
.filtered(lambda x: x.repartition_type == 'base')\
.tag_ids
expected_tag_id = self.env.ref(report_expression_xml_id)\
._get_matching_tags()\
.filtered(lambda t: not t.tax_negate)
self.assertIn(expected_tag_id, oss_tag_id, f"{doc_type} tag from Belgian CoA not correctly linked")
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSSpain(AccountTestInvoicingCommon):
@classmethod
@AccountTestInvoicingCommon.setup_country('es')
def setUpClass(cls):
super().setUpClass()
cls.company_data['company']._map_eu_taxes()
def test_country_tag_from_spain(self):
"""
This test ensure that xml_id from `account.account.tag` in the EU_TAG_MAP are processed correctly by the oss
tax creation mechanism.
"""
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%"{another_eu_country_code}"%')], limit=1)
for doc_type, tag_xml_id in (
("invoice", "l10n_es.mod_303_casilla_124_balance"),
):
with self.subTest(doc_type=doc_type, report_line_xml_id=tag_xml_id):
oss_tag_id = tax_oss[f"{doc_type}_repartition_line_ids"]\
.filtered(lambda x: x.repartition_type == 'base')\
.tag_ids
expected_tag_id = self.env.ref(tag_xml_id)\
._get_matching_tags()\
.filtered(lambda t: not t.tax_negate)
self.assertIn(expected_tag_id, oss_tag_id, f"{doc_type} tag from Spanish CoA not correctly linked")
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSUSA(AccountTestInvoicingCommon):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.company_data['company']._map_eu_taxes()
def test_no_oss_tax(self):
# get an eu country which isn't the current one:
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.company_data['company'].country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%"{another_eu_country_code}"%')], limit=1)
self.assertFalse(len(tax_oss), "OSS tax shouldn't be instanced on a US company")
def test_oss_tax_on_eu_branch(self):
"""Ensure a company outside EU can have an EU branch with an EU VAT and that the OSS feature could be used on those"""
# This test can only be run if l10n_be is installed
if not self.env['ir.module.module'].search_count([('name', '=', 'l10n_be'), ('state', '=', 'installed')], limit=1):
self.skipTest(reason="The belgian CoA is required for this test to be performed but the corresponding localization module isn't installed")
self.root_company = self.company_data['company']
self.root_company.child_ids = [Command.create({'name': 'Branch A'})]
self.cr.precommit.run() # load the CoA
self.child_company = self.root_company.child_ids
self.child_company.child_ids = [Command.create({'name': 'sub Branch B'})]
self.sub_child_company = self.root_company.child_ids.child_ids
self.cr.precommit.run() # load the CoA
# simulate sub child selection in the switcher
self.env.user.company_id, self.env.user.company_ids = self.sub_child_company, self.sub_child_company
foreign_country = self.env.ref('base.be')
self.sub_child_company.country_id = foreign_country
self.sub_child_company.account_fiscal_country_id = self.sub_child_company.country_id
self.sub_child_company.vat = "BE0477472701"
self.foreign_vat_fpos = self.env["account.fiscal.position"].create({
"name": "sub branch BE foreign VAT",
"auto_apply": True,
"country_id": foreign_country.id,
"foreign_vat": "BE0477472701",
"company_id": self.sub_child_company.id,
})
self.foreign_vat_fpos.action_create_foreign_taxes()
self.sub_child_company._map_eu_taxes()
another_eu_country_code = (self.env.ref('base.europe').country_ids - self.sub_child_company.country_id)[0].code
tax_oss = self.env['account.tax'].search([('name', 'ilike', f'%{another_eu_country_code}%')], limit=1)
self.assertTrue(tax_oss)
self.assertEqual(tax_oss.company_id, self.sub_child_company)
self.assertEqual(tax_oss.country_id, self.foreign_vat_fpos.country_id)
@tagged('post_install', 'post_install_l10n', '-at_install')
class TestOSSMap(AccountTestInvoicingCommon):
def test_oss_eu_tag_map(self):
""" Checks that the xml_id referenced in the map are correct.
In case of failure display the couple (chart_template_xml_id, tax_report_line_xml_id).
The test doesn't fail for unreferenced char_template or unreferenced tax_report_line.
"""
chart_templates = self.env['account.chart.template']._get_chart_template_mapping()
for chart_template, template_vals in chart_templates.items():
if self.env.ref(f"base.module_{template_vals['module']}").state != 'installed':
continue
oss_tags = EU_TAG_MAP.get(chart_template, {})
for tax_report_line_xml_id in filter(lambda d: d, oss_tags.values()):
with self.subTest(chart_template=chart_template, tax_report_line_xml_id=tax_report_line_xml_id):
tag = self.env.ref(tax_report_line_xml_id, raise_if_not_found=False)
self.assertIsNotNone(tag, f"The following xml_id is incorrect in EU_TAG_MAP.py: {tax_report_line_xml_id}")
|