Search code examples
javascriptodooodoo-12

Search domain : multiple condition in odoo


How to convert this expression : ((A & B) | ( C & D)) | (( E & F) | (G & H)) in OpenERP domain syntax

PostgreSQL query is :

SELECT
  *
FROM
   calendar_event
WHERE
  (
    (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
    (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
  ) or (
    ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
    ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
  )

I try to make like this but is not correct, where i'm wrong please?

   inParams1.push([
         "|",
         "&",
         ["start_datetime", "<",  '2020-01-07 09:00:00'],
         ['2020-01-07 09:00:00', "<=", "stop_datetime"],
         "&",
         ["start_datetime", "<=", '2020-01-07 11:00:00'],
         ['2020-01-07 11:00:00', "<=", "stop_datetime"],

         "|",
         "&",
         ['2020-01-07 09:00:00', "<=", " start_datetime"],
         ["start_datetime", "<=",'2020-01-07 11:00:00'],
         "&",
         ['2020-01-07 09:00:00', "<=",  "stop_datetime"],
     ["stop_datetime", "<=",'2020-01-07 11:00:00']
]);

Please i need your help, i have many days working and i can't find a solution :(


Solution

  • You complicated the filter by parentheses:

    (
        (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime) or
        (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
      ) or (
        ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') or
        ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
      )
    

    Is the same as this:

        (start_datetime <= '2020-01-07 09:00:00' and '2020-01-07 09:00:00' <= stop_datetime)
         or
        (start_datetime <= '2020-01-07 11:00:00' and '2020-01-07 11:00:00' <= stop_datetime)
        or 
        ('2020-01-07 09:00:00' <= start_datetime and start_datetime <= '2020-01-07 11:00:00') 
        or
        ('2020-01-07 09:00:00' <= stop_datetime and stop_datetime <= '2020-01-07 11:00:00')
    

    So just try this:

        [    '|'
             "&",
             ["start_datetime", "<",  '2020-01-07 09:00:00'],
             ["stop_datetime", ">=", '2020-01-07 09:00:00'],
             '|',
             "&",
             ["start_datetime", "<=", '2020-01-07 11:00:00'],
             ["stop_datetime", ">=", '2020-01-07 11:00:00'],
             '|',
             "&",
             ["start_datetime", ">=", '2020-01-07 09:00:00'],
             ["start_datetime", "<=",'2020-01-07 11:00:00'],
             "&",
             ["stop_datetime", ">=",  '2020-01-07 09:00:00'],
             ["stop_datetime", "<=",'2020-01-07 11:00:00']
         ] 
    

    let me know if it doesn't work for you.