From 940a0e45d40b83a8b49a50ec823bdac808ae6fc8 Mon Sep 17 00:00:00 2001 From: Goffin Simon Date: Mon, 23 Mar 2015 13:55:35 +0100 Subject: [PATCH] [FIX] account: choosing the right fiscal position for a partner who has vat number, fiscal positions with vat_required are prefered. opw:630849 --- addons/account/partner.py | 30 +++++++------- addons/account/tests/__init__.py | 1 + addons/account/tests/test_fiscal_position.py | 41 ++++++++++++++++++++ addons/l10n_eu_service/wizard/wizard.py | 3 +- 4 files changed, 60 insertions(+), 15 deletions(-) create mode 100644 addons/account/tests/test_fiscal_position.py diff --git a/addons/account/partner.py b/addons/account/partner.py index f6eaeb5fc08..416ecf5fbbf 100644 --- a/addons/account/partner.py +++ b/addons/account/partner.py @@ -123,22 +123,24 @@ class account_fiscal_position(osv.osv): else: delivery = partner - domain = [ - ('auto_apply', '=', True), - '|', ('vat_required', '=', False), ('vat_required', '=', partner.vat_subjected), - ] - if delivery.country_id.id: - fiscal_position_ids = self.search(cr, uid, domain + [('country_id', '=', delivery.country_id.id)], context=context, limit=1) + domains = [[('auto_apply', '=', True), ('vat_required', '=', partner.vat_subjected)]] + if partner.vat_subjected: + # Possibly allow fallback to non-VAT positions, if no VAT-required position matches + domains += [[('auto_apply', '=', True), ('vat_required', '=', False)]] + + for domain in domains: + if delivery.country_id.id: + fiscal_position_ids = self.search(cr, uid, domain + [('country_id', '=', delivery.country_id.id)], context=context, limit=1) + if fiscal_position_ids: + return fiscal_position_ids[0] + + fiscal_position_ids = self.search(cr, uid, domain + [('country_group_id.country_ids', '=', delivery.country_id.id)], context=context, limit=1) + if fiscal_position_ids: + return fiscal_position_ids[0] + + fiscal_position_ids = self.search(cr, uid, domain + [('country_id', '=', None), ('country_group_id', '=', None)], context=context, limit=1) if fiscal_position_ids: return fiscal_position_ids[0] - - fiscal_position_ids = self.search(cr, uid, domain + [('country_group_id.country_ids', '=', delivery.country_id.id)], context=context, limit=1) - if fiscal_position_ids: - return fiscal_position_ids[0] - - fiscal_position_ids = self.search(cr, uid, domain + [('country_id', '=', None), ('country_group_id', '=', None)], context=context, limit=1) - if fiscal_position_ids: - return fiscal_position_ids[0] return False class account_fiscal_position_tax(osv.osv): diff --git a/addons/account/tests/__init__.py b/addons/account/tests/__init__.py index 152f89cdcc1..75f03b9a8be 100644 --- a/addons/account/tests/__init__.py +++ b/addons/account/tests/__init__.py @@ -2,3 +2,4 @@ from . import test_tax from . import test_search from . import test_reconciliation from . import test_account_move_closed_period +from . import test_fiscal_position diff --git a/addons/account/tests/test_fiscal_position.py b/addons/account/tests/test_fiscal_position.py new file mode 100644 index 00000000000..046b558860d --- /dev/null +++ b/addons/account/tests/test_fiscal_position.py @@ -0,0 +1,41 @@ +from openerp.tests.common import TransactionCase + +class TestFiscalPosition(TransactionCase): + """Tests for fiscal positions in auto apply (account.fiscal.position). + If a partner has a vat number, the fiscal positions with "vat_required=True" + are prefered. + """ + + def setUp(self): + super(TestFiscalPosition, self).setUp() + self.fiscal_position_model = self.registry('account.fiscal.position') + self.res_partner_model = self.registry('res.partner') + self.res_country_model = self.registry('res.country') + + def test_fiscal_position(self): + cr, uid = self.cr, self.uid + company_id = 1 + country_id = self.res_country_model.search(cr, uid, [('name', '=', 'France')])[0] + partner_id = self.res_partner_model.create(cr, uid, dict( + name="George", + vat_subjected=True, + notify_email="always", + country_id=country_id)) + fp_b2c_id = self.fiscal_position_model.create(cr, uid, dict(name="EU-VAT-FR-B2C", + auto_apply=True, + country_id=country_id, + vat_required=False, + sequence=1)) + fp_b2b_id = self.fiscal_position_model.create(cr, uid, dict(name="EU-VAT-FR-B2B", + auto_apply=True, + country_id=country_id, + vat_required=True, + sequence=2)) + res = self.fiscal_position_model.get_fiscal_position(cr, uid, company_id, partner_id) + self.assertEquals(fp_b2b_id, res, + "Fiscal position detection should pick B2B position as 1rst match") + + self.fiscal_position_model.write(cr, uid, [fp_b2b_id], {'auto_apply': False}) + res = self.fiscal_position_model.get_fiscal_position(cr, uid, company_id, partner_id) + self.assertEquals(fp_b2c_id, res, + "Fiscal position detection should pick B2C position as 1rst match") diff --git a/addons/l10n_eu_service/wizard/wizard.py b/addons/l10n_eu_service/wizard/wizard.py index ac672c16899..dba6fb1b007 100644 --- a/addons/l10n_eu_service/wizard/wizard.py +++ b/addons/l10n_eu_service/wizard/wizard.py @@ -151,7 +151,8 @@ class l10n_eu_service(models.TransientModel): 'ref_tax_code_id': tx_code.id, 'ref_base_sign': -1, 'ref_tax_sign': -1, - 'description': "EU-VAT-%s-S" % country.code + 'description': "EU-VAT-%s-S" % country.code, + 'sequence': 1000, } tax = account_tax.create(data_tax) if self.fiscal_position_id: