
############
TicketSearch
############


****
NAME
****


Kernel::System::Ticket::TicketSearch - ticket search lib


***********
DESCRIPTION
***********


All ticket search functions.

TicketSearch()
==============


To find tickets in your system.


.. code-block:: perl

     my @TicketIDs = $TicketObject->TicketSearch(
         # result (optional, default is 'HASH')
         Result => 'ARRAY' || 'HASH' || 'COUNT',
 
         # limit the number of found tickets (optional, default is 10000)
         Limit => 100,
 
         # Use TicketSearch as a ticket filter on a single ticket,
         # or a predefined ticket list
         TicketID     => 1234,
         TicketID     => [1234, 1235],
 
         # ticket number (optional) as STRING or as ARRAYREF
         # The value will be treated as a SQL query expression.
         TicketNumber => '%123546%',
         TicketNumber => ['%123546%', '%123666%'],
 
         # ticket title (optional) as STRING or as ARRAYREF
         # The value will be treated as a SQL query expression.
         # When ConditionInline is set then remaining whitespace will be treated as a && condition and
         # and the settings of ContentSearchPrefix and ContentSearchSuffix will be honored.
         Title => '%SomeText%',
         Title => ['%SomeTest1%', '%SomeTest2%'],
 
         Queues   => ['system queue', 'other queue'],
         QueueIDs => [1, 42, 512],
 
         # use also sub queues of Queue|Queues in search
         UseSubQueues => 0,
 
         # You can use types like normal, ...
         Types   => ['normal', 'change', 'incident'],
         TypeIDs => [3, 4],
 
         # You can use states like new, open, pending reminder, ...
         States   => ['new', 'open'],
         StateIDs => [3, 4],
 
         # (Open|Closed) tickets for all closed or open tickets.
         StateType => 'Open',
 
         # You also can use real state types like new, open, closed,
         # pending reminder, pending auto, removed and merged.
         StateType    => ['open', 'new'],
         StateTypeIDs => [1, 2, 3],
 
         Priorities  => ['1 very low', '2 low', '3 normal'],
         PriorityIDs => [1, 2, 3],
 
         Services   => ['Service A', 'Service B'],
         ServiceIDs => [1, 2, 3],
 
         SLAs   => ['SLA A', 'SLA B'],
         SLAIDs => [1, 2, 3],
 
         Locks   => ['unlock'],
         LockIDs => [1, 2, 3],
 
         OwnerIDs => [1, 12, 455, 32],
 
         ResponsibleIDs => [1, 12, 455, 32],
 
         WatchUserIDs => [1, 12, 455, 32],
 
         # CustomerID (optional) as STRING or as ARRAYREF
         # The value will be treated as a SQL query expression.
         CustomerID => '123',
         CustomerID => ['123', 'ABC'],
 
         # CustomerIDRaw (optional) as STRING or as ARRAYREF
         # CustomerID without QueryCondition checking.
         # The param CustomerID will be ignored when CustomerIDRaw is set.
         # The raw values will be quoted and combined with 'OR' for the query.
         CustomerIDRaw => '123 + 345',
         CustomerIDRaw => ['123', 'ABC','123 && 456','ABC % efg'],
 
         # CustomerUserLogin (optional) as STRING as ARRAYREF
         # The value will be treated as a SQL query expression.
         CustomerUserLogin => 'uid123',
         CustomerUserLogin => ['uid123', 'uid777'],
 
         # CustomerUserLoginRaw (optional) as STRING as ARRAYREF
         # CustomerUserLogin without QueryCondition checking.
         # The param CustomerUserLogin will be ignored when CustomerUserLoginRaw is set.
         # The raw values will be quoted and combined with 'OR' for the query.
         CustomerUserLoginRaw => 'uid',
         CustomerUserLoginRaw => 'uid + 123',
         CustomerUserLoginRaw => ['uid  -  123', 'uid # 777 + 321'],
 
         # create ticket properties (optional)
         CreatedUserIDs     => [1, 12, 455, 32]
         CreatedTypes       => ['normal', 'change', 'incident'],
         CreatedTypeIDs     => [1, 2, 3],
         CreatedPriorities  => ['1 very low', '2 low', '3 normal'],
         CreatedPriorityIDs => [1, 2, 3],
         CreatedStates      => ['new', 'open'],
         CreatedStateIDs    => [3, 4],
         CreatedQueues      => ['system queue', 'other queue'],
         CreatedQueueIDs    => [1, 42, 512],
 
         # DynamicFields
         #   At least one operator must be specified. Operators will be connected with AND,
         #       values in an operator with OR.
         #   You can also pass more than one argument to an operator: ['value1', 'value2']
         DynamicField_FieldNameX => {
             Empty             => 1,                       # will return dynamic fields without a value
                                                           # set to 0 to search fields with a value present
             Equals            => 123,
             Like              => 'value*',                # "equals" operator with wildcard support
             GreaterThan       => '2001-01-01 01:01:01',
             GreaterThanEquals => '2001-01-01 01:01:01',
             SmallerThan       => '2002-02-02 02:02:02',
             SmallerThanEquals => '2002-02-02 02:02:02',
         },
 
         # User ID for searching tickets by ticket flags (optional, defaults to UserID)
         TicketFlagUserID => 1,
 
         # search for ticket flags
         TicketFlag => {
             Seen => 1,
         },
 
         # search for ticket flag that is absent, or a different value than the
         # one given:
         NotTicketFlag => {
             Seen => 1,
         },
 
         # User ID for searching tickets by article flags (optional, defaults to UserID)
         ArticleFlagUserID => 1,
 
 
         # search for tickets by the presence of flags on articles
         ArticleFlag => {
             Important => 1,
         },
 
         # article stuff (optional)
         MIMEBase_From    => '%spam@example.com%',
         MIMEBase_To      => '%service@example.com%',
         MIMEBase_Cc      => '%client@example.com%',
         MIMEBase_Subject => '%VIRUS 32%',
         MIMEBase_Body    => '%VIRUS 32%',
 
         # attachment stuff (optional, applies only for ArticleStorageDB)
         AttachmentName => '%anyfile.txt%',
 
         # use full article text index if configured (optional, defaults to off)
         FullTextIndex => 1,
 
         # article content search (AND or OR for From, To, Cc, Subject and Body) (optional, defaults to 'AND')
         ContentSearch => 'AND',
 
         # article content search prefix (for From, To, Cc, Subject and Body) (optional, defaults to '*')
         # For Title the default is the empty string.
         ContentSearchPrefix => '*',
 
         # article content search suffix (for From, To, Cc, Subject and Body) (optional, defaults to '*')
         # For Title the default is the empty string.
         ContentSearchSuffix => '*',
 
         # content conditions for From, To, Cc, Subject, Body,
         # and Title (all optional)
         # For Title it also activates ContentSearchPrefix and ContentSearchSuffix,
         ConditionInline => 1,
 
         # articles created more than 60 minutes ago (article older than 60 minutes) (optional)
         ArticleCreateTimeOlderMinutes => 60,
         # articles created less than 120 minutes ago (article newer than 60 minutes) (optional)
         ArticleCreateTimeNewerMinutes => 120,
 
         # articles with create time after ... (article newer than this date) (optional)
         ArticleCreateTimeNewerDate => '2006-01-09 00:00:01',
         # articles with created time before ... (article older than this date) (optional)
         ArticleCreateTimeOlderDate => '2006-01-19 23:59:59',
 
         # tickets created more than 60 minutes ago (ticket older than 60 minutes)  (optional)
         TicketCreateTimeOlderMinutes => 60,
         # tickets created less than 120 minutes ago (ticket newer than 120 minutes) (optional)
         TicketCreateTimeNewerMinutes => 120,
 
         # tickets with create time after ... (ticket newer than this date) (optional)
         TicketCreateTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with created time before ... (ticket older than this date) (optional)
         TicketCreateTimeOlderDate => '2006-01-19 23:59:59',
 
         # ticket history entries that created more than 60 minutes ago (optional)
         TicketChangeTimeOlderMinutes => 60,
         # ticket history entries that created less than 120 minutes ago (optional)
         TicketChangeTimeNewerMinutes => 120,
 
         # ticket history entry create time after ... (ticket history entries newer than this date) (optional)
         TicketChangeTimeNewerDate => '2006-01-09 00:00:01',
         # ticket history entry create time before ... (ticket history entries older than this date) (optional)
         TicketChangeTimeOlderDate => '2006-01-19 23:59:59',
 
         # tickets changed more than 60 minutes ago (optional)
         TicketLastChangeTimeOlderMinutes => 60,
         # tickets changed less than 120 minutes ago (optional)
         TicketLastChangeTimeNewerMinutes => 120,
 
         # tickets with changed time after ... (ticket changed newer than this date) (optional)
         TicketLastChangeTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with changed time before ... (ticket changed older than this date) (optional)
         TicketLastChangeTimeOlderDate => '2006-01-19 23:59:59',
 
         # tickets closed more than 60 minutes ago (optional)
         TicketCloseTimeOlderMinutes => 60,
         # tickets closed less than 120 minutes ago (optional)
         TicketCloseTimeNewerMinutes => 120,
 
         # tickets with closed time after ... (ticket closed newer than this date) (optional)
         TicketCloseTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with closed time before ... (ticket closed older than this date) (optional)
         TicketCloseTimeOlderDate => '2006-01-19 23:59:59',
 
         # tickets with last close time more than 60 minutes ago (optional)
         TicketLastCloseTimeOlderMinutes => 60,
         # tickets with last close time less than 120 minutes ago (optional)
         TicketLastCloseTimeNewerMinutes => 120,
 
         # tickets with last close time after ... (ticket last close newer than this date) (optional)
         TicketLastCloseTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with last close time before ... (ticket last close older than this date) (optional)
         TicketLastCloseTimeOlderDate => '2006-01-19 23:59:59',
 
         # tickets with pending time of more than 60 minutes ago (optional)
         TicketPendingTimeOlderMinutes => 60,
         # tickets with pending time of less than 120 minutes ago (optional)
         TicketPendingTimeNewerMinutes => 120,
 
         # tickets with pending time after ... (optional)
         TicketPendingTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with pending time before ... (optional)
         TicketPendingTimeOlderDate => '2006-01-19 23:59:59',
 
         # you can use all following escalation options with this four different ways of escalations
         # TicketEscalationTime...
         # TicketEscalationUpdateTime...
         # TicketEscalationResponseTime...
         # TicketEscalationSolutionTime...
 
         # ticket escalation time of more than 60 minutes ago (optional)
         TicketEscalationTimeOlderMinutes => -60,
         # ticket escalation time of less than 120 minutes ago (optional)
         TicketEscalationTimeNewerMinutes => -120,
 
         # tickets with escalation time after ... (optional)
         TicketEscalationTimeNewerDate => '2006-01-09 00:00:01',
         # tickets with escalation time before ... (optional)
         TicketEscalationTimeOlderDate => '2006-01-09 23:59:59',
 
         # search in archive (optional)
         # if archiving is on, if not specified the search processes unarchived only
         # 'y' searches archived tickets, 'n' searches unarchived tickets
         # if specified together all tickets are searched
         ArchiveFlags => ['y', 'n'],
 
         # OrderBy (optional, default is 'Down')
         OrderBy => 'Down',  # Down|Up
         # SortBy (optional, default is 'Age')
         SortBy  => 'Age',   # Created|Owner|Responsible|CustomerID|State|TicketNumber|Queue|Priority|Age|Type|Lock
                             # Changed|Title|Service|SLA|PendingTime|EscalationTime
                             # EscalationUpdateTime|EscalationResponseTime|EscalationSolutionTime
                             # DynamicField_FieldNameX
 
         # OrderBy and SortBy as ARRAY for sub sorting (optional)
         OrderBy => ['Down', 'Up'],
         SortBy  => ['Priority', 'Age'],
 
         # user search (UserID is required)
         UserID     => 123,
         Permission => 'ro' || 'rw', # optional, default is 'ro'
 
         # customer search (CustomerUserID is required)
         CustomerUserID => 123,
         Permission     => 'ro' || 'rw', # optional, default is 'ro'
 
         # CacheTTL, cache search result in seconds (optional, the default is four minutes)
         CacheTTL => 60 * 15,
     );


Returns:

Result: 'ARRAY'


.. code-block:: perl

     @TicketIDs = ( 1, 2, 3 );


Result: 'HASH'


.. code-block:: perl

     %TicketIDs = (
         1 => '2010102700001',
         2 => '2010102700002',
         3 => '2010102700003',
     );


Result: 'COUNT'


.. code-block:: perl

     $TicketIDs = 123;



TicketCountByAttribute()
========================


Returns count of tickets per value for a specific attribute.


.. code-block:: perl

     my $TicketCount = $TicketObject->TicketCountByAttribute(
         Attribute => 'ServiceID',
         TicketIDs => [ 1, 2, 3 ],
     );


Returns:


.. code-block:: perl

     $TicketCount = {
         Attribute_Value_1 => 1,
         Attribute_Value_2 => 3,
         # ...
     };




*****************
PRIVATE INTERFACE
*****************


_TicketHistoryReferenceForSearchArgument
========================================


Returns the ticket history reference to the given search argument.


.. code-block:: perl

     my $Self->_TicketHistoryReferenceForSearchArgument(
         Argument => '...' # argument name
     );


Result
    \ ``undef``\  - in case the argument is not mapped
    string   - the ticket history reference name




