diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index d8b1bc81af9..46e3b5f8855 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -611,6 +611,21 @@ class AccountMoveLine(models.Model): :param excluded_ids: list of ids of move lines that should not be fetched :param str: search string """ + epsilon = 0.0001 + + def _domain_range_amount(field, amount, signed=False): + def build_for_amount(amount): + return expression.AND([ + [(field, '>=', amount - epsilon)], + [(field, '<=', amount + epsilon)] + ]) + + unsigned_domain = build_for_amount(amount) + if not signed: + return unsigned_domain + + return expression.OR([unsigned_domain, build_for_amount(-amount)]) + context = (self._context or {}) if excluded_ids is None: excluded_ids = [] @@ -627,14 +642,20 @@ class AccountMoveLine(models.Model): ] try: amount = float(str) - amount_domain = [ - '|', ('amount_residual', '=', amount), - '|', ('amount_residual_currency', '=', amount), - '|', ('amount_residual', '=', -amount), - '|', ('amount_residual_currency', '=', -amount), - '&', ('account_id.internal_type', '=', 'liquidity'), - '|', '|', ('debit', '=', amount), ('credit', '=', amount), ('amount_currency', '=', amount), - ] + residual_domain = expression.OR([ + _domain_range_amount(field, amount, True) + for field in ('amount_residual', 'amount_residual_currency') + ]) + + liquidity_domain = expression.AND([ + [('account_id.internal_type', '=', 'liquidity')], + expression.OR([ + _domain_range_amount(field, amount) + for field in ('debit', 'credit', 'amount_currency') + ]) + ]) + + amount_domain = expression.OR([residual_domain, liquidity_domain]) str_domain = expression.OR([str_domain, amount_domain]) except: pass diff --git a/addons/crm/models/crm_lead.py b/addons/crm/models/crm_lead.py index 1edc0792683..7d9c4151c9e 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -648,7 +648,7 @@ class Lead(models.Model): partner_match_domain.append(('partner_id', '=', partner_id)) partner_match_domain = ['|'] * (len(partner_match_domain) - 1) + partner_match_domain if not partner_match_domain: - return [] + return self.env['crm.lead'] domain = partner_match_domain if not include_lost: domain += ['&', ('active', '=', True), ('probability', '<', 100)] diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index 94d12ceebf2..89ce5fbeaa9 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -380,8 +380,8 @@ class Channel(models.Model): AND P.partner_id IN %s AND channel_type LIKE 'chat' GROUP BY P.channel_id - HAVING COUNT(P.partner_id) = %s - """, (tuple(partners_to), len(partners_to),)) + HAVING array_agg(P.partner_id ORDER BY P.partner_id) = %s + """, (tuple(partners_to), sorted(list(partners_to)),)) result = self.env.cr.dictfetchall() if result: # get the existing channel between the given partners