diff --git a/addons/l10n_nl/data/account_fiscal_position_tax_template.xml b/addons/l10n_nl/data/account_fiscal_position_tax_template.xml index bb3153bab97..366ec73618f 100644 --- a/addons/l10n_nl/data/account_fiscal_position_tax_template.xml +++ b/addons/l10n_nl/data/account_fiscal_position_tax_template.xml @@ -16,6 +16,11 @@ + + + + + @@ -36,6 +41,11 @@ + + + + + @@ -52,6 +62,11 @@ + + + + + @@ -67,6 +82,11 @@ + + + + + @@ -89,6 +109,11 @@ + + + + + @@ -109,6 +134,11 @@ + + + + + @@ -124,6 +154,11 @@ + + + + + @@ -139,6 +174,11 @@ + + + + + diff --git a/addons/l10n_nl/data/account_tax_template.xml b/addons/l10n_nl/data/account_tax_template.xml index b534e9b7369..b5ea4280642 100644 --- a/addons/l10n_nl/data/account_tax_template.xml +++ b/addons/l10n_nl/data/account_tax_template.xml @@ -19,7 +19,7 @@ 10 - Verkopen/omzet laag + Verkopen/omzet laag 6% 6% BTW percent @@ -28,6 +28,18 @@ sale + + 10 + + Verkopen/omzet laag 9% + 9% BTW + + percent + + + sale + + 5 @@ -68,7 +80,7 @@ 10 - Verkopen/omzet laag diensten + Verkopen/omzet laag diensten 6% 6% BTW diensten percent @@ -77,6 +89,18 @@ sale + + 10 + + Verkopen/omzet laag diensten 9% + 9% BTW diensten + + percent + + + sale + + 6 @@ -105,7 +129,7 @@ 10 - BTW te vorderen laag (inkopen) + BTW te vorderen laag (inkopen) 6% 6% BTW percent @@ -114,10 +138,23 @@ purchase + + 10 + + BTW te vorderen laag (inkopen) 9% + 9% BTW + + percent + + + purchase + + + 10 - BTW te vorderen laag (inkopen incl. BTW) + BTW te vorderen laag (inkopen incl. BTW) 6% 6% BTW Incl. percent @@ -127,6 +164,19 @@ purchase + + 10 + + BTW te vorderen laag (inkopen incl. BTW) 9% + 9% BTW Incl. + + percent + True + + + purchase + + 5 @@ -168,7 +218,7 @@ 10 - BTW te vorderen laag (inkopen) diensten + BTW te vorderen laag (inkopen) diensten 6% 6% BTW diensten percent @@ -177,6 +227,18 @@ purchase + + 10 + + BTW te vorderen laag (inkopen) diensten 9% + 9% BTW diensten + + percent + + + purchase + + 6 @@ -214,7 +276,7 @@ sale - + 98 BTW te vorderen verlegd (inkopen1) @@ -256,7 +318,7 @@ 21 - Inkopen import binnen EU laag(1) + Inkopen import binnen EU laag(1) 6% Inkopen import binnen EU laag(1) percent @@ -265,10 +327,22 @@ none + + + 21 + Inkopen import binnen EU laag(1) 9% + Inkopen import binnen EU laag(1) + + percent + + + none + + 22 - Inkopen import binnen EU laag(2) + Inkopen import binnen EU laag(2) 6% Inkopen import binnen EU laag(2) percent @@ -277,10 +351,22 @@ none + + + 22 + Inkopen import binnen EU laag(2) 9% + Inkopen import binnen EU laag(2) + + percent + + + none + + 20 - Inkopen import binnen EU laag + Inkopen import binnen EU laag 6% 6% BTW import binnen EU group @@ -288,6 +374,17 @@ + + 20 + + Inkopen import binnen EU laag 9% + 9% BTW import binnen EU + + group + purchase + + + 21 @@ -387,7 +484,7 @@ 21 - Inkopen import binnen EU laag(1) diensten + Inkopen import binnen EU laag(1) diensten 6% Inkopen import binnen EU laag(1) diensten percent @@ -396,10 +493,22 @@ none + + + 21 + Inkopen import binnen EU laag(1) diensten 9% + Inkopen import binnen EU laag(1) diensten + + percent + + + none + + 22 - Inkopen import binnen EU laag(2) diensten + Inkopen import binnen EU laag(2) diensten 6% Inkopen import binnen EU laag(2) diensten percent @@ -408,10 +517,22 @@ none + + + 22 + Inkopen import binnen EU laag(2) diensten 9% + Inkopen import binnen EU laag(2) diensten + + percent + + + none + + 20 - Inkopen import binnen EU laag diensten + Inkopen import binnen EU laag diensten 6% 6% BTW import binnen EU diensten group @@ -419,6 +540,17 @@ + + 20 + + Inkopen import binnen EU laag diensten 9% + 9% BTW import binnen EU diensten + + group + purchase + + + 21 @@ -494,7 +626,7 @@ - Inkopen import buiten EU laag(1) + Inkopen import buiten EU laag(1) 6% Inkopen import buiten EU laag(1) percent @@ -504,9 +636,21 @@ none + + + Inkopen import buiten EU laag(1) 9% + Inkopen import buiten EU laag(1) + + percent + + + 21 + none + + - Inkopen import buiten EU laag(2) + Inkopen import buiten EU laag(2) 6% Inkopen import buiten EU laag(2) percent @@ -516,10 +660,22 @@ none + + + Inkopen import buiten EU laag(2) 9% + Inkopen import buiten EU laag(2) + + percent + + + 22 + none + + 20 - Inkopen import buiten EU laag + Inkopen import buiten EU laag 6% BTW import buiten EU laag inkopen group @@ -527,6 +683,17 @@ + + 20 + + Inkopen import buiten EU laag 9% + BTW import buiten EU laag inkopen + + group + purchase + + + Inkopen import buiten EU hoog(1) @@ -625,7 +792,7 @@ - Inkopen import buiten EU laag(1) diensten + Inkopen import buiten EU laag(1) diensten 6% Inkopen import buiten EU laag(1) diensten percent @@ -635,9 +802,21 @@ none + + + Inkopen import buiten EU laag(1) diensten 9% + Inkopen import buiten EU laag(1) diensten + + percent + + + 21 + none + + - Inkopen import buiten EU laag(2) diensten + Inkopen import buiten EU laag(2) diensten 6% Inkopen import buiten EU laag(2) diensten percent @@ -647,10 +826,22 @@ none + + + Inkopen import buiten EU laag(2) diensten 9% + Inkopen import buiten EU laag(2) diensten + + percent + + + 22 + none + + 20 - Inkopen import buiten EU laag diensten + Inkopen import buiten EU laag diensten 6% BTW import buiten EU laag inkopen diensten group @@ -658,6 +849,17 @@ + + 20 + + Inkopen import buiten EU laag diensten 9% + BTW import buiten EU laag inkopen diensten + + group + purchase + + + Inkopen import buiten EU hoog(1) diensten diff --git a/addons/product/models/product.py b/addons/product/models/product.py index b817bc0022d..9bd1a22ce26 100644 --- a/addons/product/models/product.py +++ b/addons/product/models/product.py @@ -399,17 +399,36 @@ class ProductProduct(models.Model): self.check_access_rule("read") result = [] + + # Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields + # Use `load=False` to not call `name_get` for the `product_tmpl_id` + self.sudo().read(['name', 'default_code', 'product_tmpl_id', 'attribute_value_ids'], load=False) + + product_template_ids = self.sudo().mapped('product_tmpl_id').ids + + if partner_ids: + supplier_info = self.env['product.supplierinfo'].sudo().search([ + ('product_tmpl_id', 'in', product_template_ids), + ('name', 'in', partner_ids), + ]) + # Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields + # Use `load=False` to not call `name_get` for the `product_tmpl_id` and `product_id` + supplier_info.sudo().read(['product_tmpl_id', 'product_id', 'product_name', 'product_code'], load=False) + supplier_info_by_template = {} + for r in supplier_info: + supplier_info_by_template.setdefault(r.product_tmpl_id, []).append(r) for product in self.sudo(): # display only the attributes with multiple possible values on the template - variable_attributes = product.attribute_line_ids.filtered(lambda l: len(l.value_ids) > 1).mapped('attribute_id') + variable_attributes = product.attribute_value_ids.filtered(lambda v: len(v.attribute_id.value_ids) > 1).mapped('attribute_id') variant = product.attribute_value_ids._variant_name(variable_attributes) name = variant and "%s (%s)" % (product.name, variant) or product.name sellers = [] if partner_ids: - sellers = [x for x in product.seller_ids if (x.name.id in partner_ids) and (x.product_id == product)] + product_supplier_info = supplier_info_by_template.get(product.product_tmpl_id, []) + sellers = [x for x in product_supplier_info if x.product_id and x.product_id == product] if not sellers: - sellers = [x for x in product.seller_ids if (x.name.id in partner_ids) and not x.product_id] + sellers = [x for x in product_supplier_info if not x.product_id] if sellers: for s in sellers: seller_variant = s.product_name and ( diff --git a/addons/product/models/product_template.py b/addons/product/models/product_template.py index 0994fdc05d7..f71e570d2b4 100644 --- a/addons/product/models/product_template.py +++ b/addons/product/models/product_template.py @@ -321,6 +321,8 @@ class ProductTemplate(models.Model): @api.multi def name_get(self): + # Prefetch the fields used by the `name_get`, so `browse` doesn't fetch other fields + self.read(['name', 'default_code']) return [(template.id, '%s%s' % (template.default_code and '[%s] ' % template.default_code or '', template.name)) for template in self] diff --git a/odoo/addons/base/res/res_currency_data.xml b/odoo/addons/base/res/res_currency_data.xml index dc864e1dc9a..b3829b2d430 100644 --- a/odoo/addons/base/res/res_currency_data.xml +++ b/odoo/addons/base/res/res_currency_data.xml @@ -158,7 +158,7 @@ VND ₫ - 0.01 + 1.00 diff --git a/odoo/addons/base/res/res_partner.py b/odoo/addons/base/res/res_partner.py index 1e239a21973..d4309a9de3a 100644 --- a/odoo/addons/base/res/res_partner.py +++ b/odoo/addons/base/res/res_partner.py @@ -648,6 +648,7 @@ class Partner(models.Model): where_query = self._where_calc(args) self._apply_ir_rules(where_query, 'read') from_clause, where_clause, where_clause_params = where_query.get_sql() + from_str = from_clause if from_clause else 'res_partner' where_str = where_clause and (" WHERE %s AND " % where_clause) or ' WHERE ' # search on the name of the contacts and of its company @@ -659,8 +660,8 @@ class Partner(models.Model): unaccent = get_unaccent_wrapper(self.env.cr) - query = """SELECT id - FROM res_partner + query = """SELECT res_partner.id + FROM {from_str} {where} ({email} {operator} {percent} OR {display_name} {operator} {percent} OR {reference} {operator} {percent} @@ -668,11 +669,12 @@ class Partner(models.Model): -- don't panic, trust postgres bitmap ORDER BY {display_name} {operator} {percent} desc, {display_name} - """.format(where=where_str, + """.format(from_str=from_str, + where=where_str, operator=operator, - email=unaccent('email'), - display_name=unaccent('display_name'), - reference=unaccent('ref'), + email=unaccent('res_partner.email'), + display_name=unaccent('res_partner.display_name'), + reference=unaccent('res_partner.ref'), percent=unaccent('%s'), vat=unaccent('vat'),) diff --git a/odoo/addons/base/tests/__init__.py b/odoo/addons/base/tests/__init__.py index e40c2d042c3..0ca5c962f19 100644 --- a/odoo/addons/base/tests/__init__.py +++ b/odoo/addons/base/tests/__init__.py @@ -30,5 +30,6 @@ import test_user_has_group import test_view_validation import test_views import test_xmlrpc +import test_res_partner import test_res_partner_bank import test_non_regression diff --git a/odoo/addons/base/tests/test_res_partner.py b/odoo/addons/base/tests/test_res_partner.py new file mode 100644 index 00000000000..2a6722553af --- /dev/null +++ b/odoo/addons/base/tests/test_res_partner.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests.common import TransactionCase + + +class TestPartner(TransactionCase): + + def test_name_search(self): + """ Check name_search on partner, especially with domain based on auto_join + user_ids field. Check specific SQL of name_search correctly handle joined tables. """ + test_partner = self.env['res.partner'].create({'name': 'Vlad the Impaler'}) + test_user = self.env['res.users'].create({'name': 'Vlad the Impaler', 'login': 'vlad', 'email': 'vlad.the.impaler@example.com'}) + + ns_res = self.env['res.partner'].name_search('Vlad', operator='ilike') + self.assertEqual(set(i[0] for i in ns_res), set((test_partner | test_user.partner_id).ids)) + + ns_res = self.env['res.partner'].name_search('Vlad', args=[('user_ids.email', 'ilike', 'vlad')]) + self.assertEqual(set(i[0] for i in ns_res), set(test_user.partner_id.ids))