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 @@
+
+
+
+
+
+
+
+
+
@@ -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))