diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 841b7d5d84d..7ad166b12e1 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -699,6 +699,22 @@ class AccountMoveLine(models.Model): """ if not str: return [] + + 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)]) + str_domain = [ '|', ('move_id.name', 'ilike', str), '|', ('move_id.ref', 'ilike', str), @@ -710,28 +726,32 @@ class AccountMoveLine(models.Model): amounts_str = str.split('|') for amount_str in amounts_str: amount = amount_str[0] == '-' and float(amount_str) or float(amount_str[1:]) - amount_domain = [ - '|', ('amount_residual', '=', amount), - '|', ('amount_residual_currency', '=', amount), - '|', (amount_str[0] == '-' and 'credit' or 'debit', '=', float(amount_str[1:])), - ('amount_currency', '=', amount), - ] + amount_domain = expression.OR([ + _domain_range_amount(field, amount) + for field in ('amount_residual', 'amount_residual_currency', 'amount_currency') + ] + [_domain_range_amount(amount_str[0] == '-' and 'credit' or 'debit', float(amount_str[1:]))] + ) str_domain = expression.OR([str_domain, amount_domain]) except: pass else: 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), - ('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('debit', amount), + _domain_range_amount('credit', amount), + _domain_range_amount('amount_currency', amount, True), + ]) + ]) + + 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 644429bcf0a..026cb46fcb7 100644 --- a/addons/crm/models/crm_lead.py +++ b/addons/crm/models/crm_lead.py @@ -708,7 +708,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 1b69bfcfd33..5078cb190ee 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -413,8 +413,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