1<?php
2/*
3 * Copyright 2005-2016 OCSInventory-NG/OCSInventory-ocsreports contributors.
4 * See the Contributors file for more details about them.
5 *
6 * This file is part of OCSInventory-NG/OCSInventory-ocsreports.
7 *
8 * OCSInventory-NG/OCSInventory-ocsreports is free software: you can redistribute
9 * it and/or modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation, either version 2 of the License,
11 * or (at your option) any later version.
12 *
13 * OCSInventory-NG/OCSInventory-ocsreports is distributed in the hope that it
14 * will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
15 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with OCSInventory-NG/OCSInventory-ocsreports. if not, write to the
20 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
21 * MA 02110-1301, USA.
22 */
23
24 /**
25  * This class implement the base behavior for search :
26  * - Query generation
27  * - Data management
28  * - Return structure
29  * Used in new search
30  */
31 class Search
32 {
33
34    const SESS_FIELDS = "fields";
35    const SESS_VALUES = "value";
36    const SESS_OPERATOR = "operator";
37    const SESS_COMPARATOR = "comparator";
38
39    const DB_TEXT = "text";
40    const DB_INT = "int";
41    const DB_VARCHAR = "varchar";
42    const DB_DATETIME = "datetime";
43
44    const HTML_SELECT = "SELECT";
45
46    const MULTIPLE_DONE = "DONE";
47
48    const GROUP_TABLE = "groups_cache";
49
50    public $correspondance = [
51      "NAME_ID" => self::DB_VARCHAR,
52      "PUBLISHER_ID" => self::DB_VARCHAR,
53      "VERSION_ID" => self::DB_VARCHAR,
54      "CATEGORY_ID" => self::HTML_SELECT,
55      "CATEGORY" => self::HTML_SELECT,
56    ];
57
58    private $type;
59
60    public $fieldsList = [];
61    public $defaultFields = [
62        "hardware.ID",
63        "hardware.DEVICEID",
64        "hardware.NAME",
65        "hardware.WORKGROUP",
66        "hardware.OSNAME",
67    ];
68
69    public $baseQuery = "SELECT";
70    public $baseLsitIdQuery = "SELECT hardware.ID";
71    public $searchQuery = "FROM hardware ";
72    public $queryArgs = [];
73    public $columnsQueryConditions = "";
74    public $values_cache_sql = [];
75
76    private $translationSearch;
77    private $databaseSearch;
78    private $accountinfoSearch;
79    public $groupSearch;
80    private $softwareSearch;
81
82    /**
83     * Excluded columns that won't be visible
84     */
85    private $excludedVisuColumns = [
86        "ID",
87        "HARDWARE_ID"
88    ];
89
90    /**
91     * Operator list
92     */
93    private $operatorList = [
94        "EQUAL",
95        "MORE",
96        "LESS",
97        "LIKE",
98        "DIFFERENT",
99        "ISNULL",
100        "DOESNTCONTAIN",
101        "ISNOTEMPTY",
102    ];
103
104    /**
105     * Delay operator list
106     */
107    private $operatorDelay = [
108      "MORETHANXDAY",
109      "LESSTHANXDAY",
110    ];
111
112    /**
113     * Operator list
114     */
115    private $operatorGroup = [
116        "BELONG",
117        "DONTBELONG",
118    ];
119
120    /**
121     * Operator list
122     */
123    private $operatorAccount = [
124        "HAVING",
125        "NOTHAVING",
126    ];
127
128    /**
129     * Operator list
130     */
131    private $operatorAccountCheckbox = [
132        "HAVINGCHECK",
133        "NOTHAVINGCHECK",
134    ];
135
136    /**
137     * Comparator list
138     */
139    private $comparatorList = [
140        "AND",
141        "OR"
142    ];
143
144    /**
145     * Multiples fields search
146     */
147    private $multipleFieldsSearch = [];
148    private $multipleFieldsSearchCache = [];
149
150    /**
151     * Final query and args used for multicrits
152     */
153    private $finalQuery;
154    private $finalArgs;
155
156
157    /**
158     * Constructor
159     *
160     * @param TranslationSearch $translationSearch
161     * @param DatabaseSearch $databaseSearch
162     * @param AccountinfoSearch $accountinfoSearch
163     * @param GroupSearch $groupSearch
164     * @param SQLCache $sqlCache
165     */
166    function __construct($translationSearch, $databaseSearch, $accountinfoSearch, $groupSearch, $softwareSearch)
167    {
168
169        $this->translationSearch = $translationSearch;
170        $this->databaseSearch = $databaseSearch;
171        $this->accountinfoSearch = $accountinfoSearch;
172        $this->groupSearch = $groupSearch;
173        $this->softwareSearch = $softwareSearch;
174
175        if ($_SESSION['OCS']['profile']->getConfigValue('DELETE_COMPUTERS') == "YES") {
176            $this->fieldsList['CHECK'] = 'hardwareID';
177        }
178
179        // Translation for default fields
180        $defaultFieldsArray = ['CHECK' => 'CHECK'];
181        foreach ($this->defaultFields as $value) {
182            $translation = $this->translationSearch->getTranslationForListField($value);
183            if($value = "hardware.NAME"){
184                $defaultFieldsArray["NAME"] = $value;
185            }
186            $defaultFieldsArray[$translation] = $value;
187        }
188        $this->defaultFields = $defaultFieldsArray;
189    }
190
191    /**
192     * Add sessions infos when search criteria is added
193     *
194     * @param Array $postData
195     * @return void
196     */
197    public function addSessionsInfos($postData)
198    {
199        $_SESSION['OCS']['multi_search'][$postData['table_select']][uniqid()] = [
200            self::SESS_FIELDS => $postData['columns_select'],
201            self::SESS_VALUES => null,
202            self::SESS_OPERATOR => null,
203            self::SESS_COMPARATOR => null,
204        ];
205    }
206
207    /**
208     * Update sessions infos when changing search criteria
209     *
210     * @param Array $postData
211     * @return void
212     */
213    public function updateSessionsInfos($postData)
214    {
215        foreach ($postData as $key => $value) {
216            $keyExploded = explode("_", $key);
217            if(count($keyExploded) > 1 && !is_null($_SESSION['OCS']['multi_search'][$keyExploded[1]])){
218                if ($keyExploded[2] == self::SESS_OPERATOR) {
219                    $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_OPERATOR] = $value;
220                } elseif($keyExploded[2] == self::SESS_FIELDS && $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_OPERATOR] != 'ISNULL') {
221                    $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_VALUES] = $value;
222                }elseif($keyExploded[2] == self::SESS_COMPARATOR){
223                  $_SESSION['OCS']['multi_search'][$keyExploded[1]][$keyExploded[0]][self::SESS_COMPARATOR] = $value;
224                }
225            }elseif(count($keyExploded) == 4){
226                $keyExplodedBis = $keyExploded[1]."_".$keyExploded[2];
227                if(!is_null($_SESSION['OCS']['multi_search'][$keyExplodedBis])){
228                  if ($keyExploded[3] == self::SESS_OPERATOR) {
229                      $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_OPERATOR] = $value;
230                  } elseif($keyExploded[3] == self::SESS_COMPARATOR){
231                    $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_COMPARATOR] = $value;
232                  } else {
233                      $_SESSION['OCS']['multi_search'][$keyExplodedBis][$keyExploded[0]][self::SESS_VALUES] = $value;
234                  }
235                }
236            }
237        }
238    }
239
240    /**
241     * Remove sessions data when removing search field
242     *
243     * @param String $rowReference
244     * @return void
245     */
246    public function removeSessionsInfos($rowReference){
247        $explodedRef = explode("_", $rowReference);
248        if(empty($explodedRef[2])){
249            unset($_SESSION['OCS']['multi_search'][$explodedRef[1]][$explodedRef[0]]);
250        }else{
251            $exploded = $explodedRef[1]."_".$explodedRef[2];
252            unset($_SESSION['OCS']['multi_search'][$exploded][$explodedRef[0]]);
253            if(empty($_SESSION['OCS']['multi_search'][$exploded])){
254                unset($_SESSION['OCS']['multi_search'][$exploded]);
255            }
256        }
257        if(empty($_SESSION['OCS']['multi_search'][$explodedRef[1]])){
258            unset($_SESSION['OCS']['multi_search'][$explodedRef[1]]);
259        }
260    }
261
262    /**
263     * Get the type of the searched field
264     *
265     * @param String $tablename
266     * @param String $fieldsname
267     * @return void
268     */
269    public function getSearchedFieldType($tablename, $fieldsname)
270    {
271        $tableFields = $this->databaseSearch->getColumnsList($tablename);
272        return $tableFields[$fieldsname][DatabaseSearch::TYPE];
273    }
274
275    /**
276     * Generate operator uniq id for displaying
277     *
278     * @param String $uniqid
279     * @param String $tableName
280     * @return void
281     */
282    public function getOperatorUniqId($uniqid, $tableName)
283    {
284        return $uniqid."_".$tableName."_".self::SESS_OPERATOR;
285    }
286
287    /**
288     * Generate comparator uniq id for displaying
289     *
290     * @param String $uniqid
291     * @param String $tableName
292     * @return void
293     */
294    public function getComparatorUniqId($uniqid, $tableName)
295    {
296        return $uniqid."_".$tableName."_".self::SESS_COMPARATOR;
297    }
298
299    /**
300     * Generate feilds uniq id for displaying
301     *
302     * @param String $uniqid
303     * @param String $tableName
304     * @return void
305     */
306    public function getFieldUniqId($uniqid, $tableName)
307    {
308        return $uniqid."_".$tableName."_".self::SESS_FIELDS;
309    }
310
311    /**
312     * Generate search query (operator and values)
313     *
314     * @param Array $sessData
315     * @return void
316     */
317    public function generateSearchQuery($sessData){
318
319        $accountInfos = new AccountinfoSearch();
320        $this->pushBaseQueryForTable("hardware", null);
321        if(!isset($sessData['accountinfo'])) $sessData['accountinfo'] = array();
322        foreach ($sessData as $tableName => $searchInfos) {
323            if($tableName != "hardware"){
324                $this->pushBaseQueryForTable($tableName, $sessData);
325            }
326        }
327        $i = 0;
328        $p = 0;
329
330        foreach ($sessData as $tableName => $searchInfos) {
331
332            if($tableName != "hardware"){
333                // Generate union
334                if ($tableName == "groups_cache") {
335                  $this->searchQuery .= "LEFT JOIN $tableName on hardware.id = $tableName.hardware_id ";
336                } else {
337                  $this->searchQuery .= "INNER JOIN $tableName on hardware.id = $tableName.hardware_id ";
338                }
339			}
340
341			if($tableName == SoftwareSearch::SOFTWARE_TABLE) {
342				$this->searchQuery .= "LEFT JOIN software_name on software_name.id = $tableName.name_id ";
343				$this->searchQuery .= "LEFT JOIN software_publisher on software_publisher.id = $tableName.publisher_id ";
344				$this->searchQuery .= "LEFT JOIN software_version on software_version.id = $tableName.version_id ";
345            }
346
347            foreach ($searchInfos as $index => $value) {
348				if($tableName == "download_history" && $value['fields'] == "PKG_NAME") {
349					// Generate union
350					$this->searchQuery .= "INNER JOIN download_available on download_available.FILEID = $tableName.PKG_ID ";
351				}
352
353                if($value['comparator'] != null){
354                    $operator[] = $value['comparator'];
355                }elseif($i != 0 && $value['comparator'] == null){
356                    $operator[] = "AND";
357                }else{
358                    $operator[] = "";
359                }
360                $i++;
361            }
362
363            $isSameColumn = [];
364            $columnName = [];
365            $doesntcontainmulti = [];
366
367
368            foreach ($searchInfos as $index => $value) {
369                  $values[] = $value;
370                  $columnName[$index] = $value['fields'];
371                  $containvalue[$index] = $value['operator'];
372            }
373
374            foreach ($searchInfos as $index => $value) {
375              $nameTable = $tableName;
376              $open="";
377              $close="";
378              // Generate condition
379              $this->getOperatorSign($value);
380              if($nameTable == SoftwareSearch::SOFTWARE_TABLE) {
381                $nameTable = $this->softwareSearch->getTableName($value['fields']);
382                $value[self::SESS_FIELDS] = $this->softwareSearch->getColumnName($value['fields']);
383                //var_dump()
384              }
385
386              foreach(array_count_values($columnName) as $name => $nb){
387                if($nb > 1){
388                $isSameColumn[$nameTable] = $name;
389                }
390              }
391
392              foreach(array_count_values($containvalue) as $name => $nb){
393                if($nb > 1){
394                $doesntcontainmulti[$nameTable] = $name;
395                }
396              }
397
398              if($p == 0 && $operator[$p+1] == 'OR'){
399                $open = "(";
400              }if($operator[$p] =='OR' && $operator[$p+1] !='OR'){
401                $close=")";
402              }if($p != 0 && $operator[$p] !='OR' && $operator[$p+1] =='OR'){
403                $open = "(";
404              }
405
406              unset($value['ignore']);
407
408              if($value[self::SESS_OPERATOR] == "DOESNTCONTAIN" && empty($doesntcontainmulti)){
409                $excluID = $this->contain($value, $nameTable);
410                if($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE){
411                $value[self::SESS_FIELDS] = "HARDWARE_ID";
412                }else{
413                $value[self::SESS_FIELDS] = "ID";
414                }
415
416                $value[self::SESS_VALUES] = implode(',', $excluID);
417                $value[self::SESS_OPERATOR] = "NOT IN";
418
419              }elseif($value[self::SESS_OPERATOR] == "DOESNTCONTAIN" && !empty($isSameColumn) && !empty($doesntcontainmulti)){
420                $excluID = $this->containmulti($isSameColumn, $searchInfos);
421                if($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE){
422                $value[self::SESS_FIELDS] = "HARDWARE_ID";
423                }else{
424                $value[self::SESS_FIELDS] = "ID";
425                }
426
427                $value[self::SESS_VALUES] = implode(',', $excluID);
428                $value[self::SESS_OPERATOR] = "NOT IN";
429                $value['ignore'] = "";
430              }
431
432              if(!empty($isSameColumn) && $isSameColumn[$nameTable] == $value[self::SESS_FIELDS]
433                    && !array_key_exists("ignore", $value) && !array_key_exists('devices', $isSameColumn)){
434                if($value[self::SESS_OPERATOR] != "IS NULL"){
435                  if ($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE && $nameTable != self::GROUP_TABLE && $value[self::SESS_FIELDS] != 'CATEGORY_ID' && $value[self::SESS_FIELDS] != 'CATEGORY'
436                  && $value[self::SESS_OPERATOR] != "NOT IN") {
437                    $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s '%s')$close ";
438                    $this->queryArgs[] = $nameTable;
439                    $this->queryArgs[] = $nameTable;
440                    $this->queryArgs[] = $nameTable;
441                    $this->queryArgs[] = $value[self::SESS_FIELDS];
442                    $this->queryArgs[] = $value[self::SESS_OPERATOR];
443                    $this->queryArgs[] = $value[self::SESS_VALUES];
444                  }elseif($nameTable == self::GROUP_TABLE || $value[self::SESS_FIELDS] == 'CATEGORY_ID' || $value[self::SESS_FIELDS] == 'CATEGORY'
445                  || $value[self::SESS_OPERATOR] == "NOT IN"){
446                    $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s (%s))$close ";
447                    if($nameTable == self::GROUP_TABLE){
448                    $this->queryArgs[] = $nameTable;
449                    $this->queryArgs[] = $nameTable;
450                    $this->queryArgs[] = 'hardware';
451                    $this->queryArgs[] = 'ID';
452                    $this->queryArgs[] = $value[self::SESS_OPERATOR];
453                    $this->queryArgs[] = $this->groupSearch->get_all_id($value[self::SESS_VALUES]);
454                    }else{
455                    $this->queryArgs[] = $nameTable;
456                    $this->queryArgs[] = $nameTable;
457                    $this->queryArgs[] = $nameTable;
458                    $this->queryArgs[] = $value[self::SESS_FIELDS];
459                    $this->queryArgs[] = $value[self::SESS_OPERATOR];
460                    $this->queryArgs[] = $value[self::SESS_VALUES];
461                    }
462                  } elseif($value[self::SESS_OPERATOR] == "ISNOTEMPTY") {
463                    $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s IS NOT NULL AND TRIM(%s.%s) != '')$close ";
464                    $this->queryArgs[] = $nameTable;
465                    $this->queryArgs[] = $nameTable;
466                    $this->queryArgs[] = $nameTable;
467                    $this->queryArgs[] = $value[self::SESS_FIELDS];
468                    $this->queryArgs[] = $nameTable;
469                    $this->queryArgs[] = $value[self::SESS_FIELDS];
470                  }else{
471                    if($value[self::SESS_OPERATOR] == "MORETHANXDAY" || $value[self::SESS_OPERATOR] == "LESSTHANXDAY") {
472                      $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s NOW() - INTERVAL %s DAY)$close ";
473                      $this->queryArgs[] = $nameTable;
474                      $this->queryArgs[] = $nameTable;
475                      $this->queryArgs[] = $value[self::SESS_FIELDS];
476                      if($value[self::SESS_OPERATOR] == "MORETHANXDAY") { $op = "<"; } else { $op = ">"; }
477                      $this->queryArgs[] = $op;
478                      $this->queryArgs[] = $value[self::SESS_VALUES];
479                    // text fix datetime in multisearch
480                    } else if($this->getSearchedFieldType($nameTable, $value[self::SESS_FIELDS]) == 'datetime' && $value[self::SESS_OPERATOR] != "MORETHANXDAY" && $value[self::SESS_OPERATOR] != "LESSTHANXDAY" ) {
481                      $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s str_to_date('%s', '%s')$close ";
482                      $this->queryArgs[] = $nameTable;
483                      $this->queryArgs[] = $value[self::SESS_FIELDS];
484                      $this->queryArgs[] = $value[self::SESS_OPERATOR];
485                      $this->queryArgs[] = $value[self::SESS_VALUES];
486                      global $l;
487                      $this->queryArgs[] = $l->g(269);
488                    } else {
489                      $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s '%s')$close ";
490                      $this->queryArgs[] = $nameTable;
491                      $this->queryArgs[] = $nameTable;
492                      $this->queryArgs[] = $value[self::SESS_FIELDS];
493                      $this->queryArgs[] = $value[self::SESS_OPERATOR];
494                      $this->queryArgs[] = $value[self::SESS_VALUES];
495                    }
496                  }
497                }else{
498                  if ($nameTable != DatabaseSearch::COMPUTER_DEF_TABLE) {
499                    $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE hardware.ID = %s.HARDWARE_ID AND %s.%s %s)$close ";
500                    $this->queryArgs[] = $nameTable;
501                    $this->queryArgs[] = $nameTable;
502                    $this->queryArgs[] = $nameTable;
503                    $this->queryArgs[] = $value[self::SESS_FIELDS];
504                    $this->queryArgs[] = $value[self::SESS_OPERATOR];
505                  }else{
506                    $this->columnsQueryConditions .= "$operator[$p] $open EXISTS (SELECT 1 FROM %s WHERE %s.%s %s)$close ";
507                    $this->queryArgs[] = $nameTable;
508                    $this->queryArgs[] = $nameTable;
509                    $this->queryArgs[] = $value[self::SESS_FIELDS];
510                    $this->queryArgs[] = $value[self::SESS_OPERATOR];
511                  }
512                }
513              }elseif($value[self::SESS_OPERATOR] == 'IS NULL' && (empty($isSameColumn))){
514                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s IS NULL OR TRIM(%s.%s) = ''$close ";
515                $this->queryArgs[] = $nameTable;
516                $this->queryArgs[] = $value[self::SESS_FIELDS];
517                $this->queryArgs[] = $nameTable;
518                $this->queryArgs[] = $value[self::SESS_FIELDS];
519              } elseif($value[self::SESS_OPERATOR] == "ISNOTEMPTY") {
520                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s IS NOT NULL AND TRIM(%s.%s) != ''$close ";
521                $this->queryArgs[] = $nameTable;
522                $this->queryArgs[] = $value[self::SESS_FIELDS];
523                $this->queryArgs[] = $nameTable;
524                $this->queryArgs[] = $value[self::SESS_FIELDS];
525              } elseif($nameTable == self::GROUP_TABLE || $value[self::SESS_FIELDS] == 'CATEGORY_ID' || $value[self::SESS_FIELDS] == 'CATEGORY'
526                    || $value[self::SESS_OPERATOR] == "NOT IN"){
527                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s (%s)$close ";
528                if($nameTable == self::GROUP_TABLE){
529                $this->queryArgs[] = 'hardware';
530                $this->queryArgs[] = 'ID';
531                $this->queryArgs[] = $value[self::SESS_OPERATOR];
532                $this->queryArgs[] = $this->groupSearch->get_all_id($value[self::SESS_VALUES]);
533                }else{
534                $this->queryArgs[] = $nameTable;
535                $this->queryArgs[] = $value[self::SESS_FIELDS];
536                $this->queryArgs[] = $value[self::SESS_OPERATOR];
537                $this->queryArgs[] = $value[self::SESS_VALUES];
538                }
539              // test fix datetime in multisearch
540              }else if($this->getSearchedFieldType($nameTable, $value[self::SESS_FIELDS]) == 'datetime' && $value[self::SESS_OPERATOR] != "MORETHANXDAY" && $value[self::SESS_OPERATOR] != "LESSTHANXDAY" ){
541                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s str_to_date('%s', '%s')$close ";
542                $this->queryArgs[] = $nameTable;
543                $this->queryArgs[] = $value[self::SESS_FIELDS];
544                $this->queryArgs[] = $value[self::SESS_OPERATOR];
545                $this->queryArgs[] = $value[self::SESS_VALUES];
546                global $l;
547                $this->queryArgs[] = $l->g(269);
548              } elseif($value[self::SESS_OPERATOR] == "MORETHANXDAY" || $value[self::SESS_OPERATOR] == "LESSTHANXDAY") {
549                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s NOW() - INTERVAL %s DAY$close ";
550                $this->queryArgs[] = $nameTable;
551                $this->queryArgs[] = $value[self::SESS_FIELDS];
552                if($value[self::SESS_OPERATOR] == "MORETHANXDAY") { $op = "<"; } else { $op = ">"; }
553                $this->queryArgs[] = $op;
554                $this->queryArgs[] = $value[self::SESS_VALUES];
555              } else {
556                $this->columnsQueryConditions .= "$operator[$p] $open%s.%s %s '%s'$close ";
557                if($nameTable == "download_history" && $value[self::SESS_FIELDS] == "PKG_NAME"){
558                $this->queryArgs[] = 'download_available';
559                $this->queryArgs[] = 'NAME';
560                }else{
561                $this->queryArgs[] = $nameTable;
562                $this->queryArgs[] = $value[self::SESS_FIELDS];
563                }
564                $this->queryArgs[] = $value[self::SESS_OPERATOR];
565                $this->queryArgs[] = $value[self::SESS_VALUES];
566              }
567              $p++;
568            }
569        }
570        $this->columnsQueryConditions = "WHERE".$this->columnsQueryConditions;
571
572        // has tag restrictions?
573        if(!empty($_SESSION['OCS']['TAGS']))
574        {
575            $tags = $_SESSION['OCS']['TAGS'];
576            foreach($tags as $k => $v)
577                $tags[$k] = "'".mysqli_real_escape_string($_SESSION['OCS']["readServer"], $v)."'";
578            $tags = implode(', ', $tags);
579            $this->columnsQueryConditions .= " AND accountinfo.TAG IN ($tags)";
580        }
581
582        // has lock machine ?
583        if (isset($_SESSION['OCS']["mesmachines"]) && strpos($_SESSION['OCS']["mesmachines"], 'a.TAG') === false) {
584            $lockResult = str_replace('a.hardware_id', 'accountinfo.hardware_id', $_SESSION['OCS']["mesmachines"]);
585            $this->columnsQueryConditions .=  " AND " . $lockResult;
586        }
587
588        $this->columnsQueryConditions .= " GROUP BY hardware.id";
589        $this->baseQuery = substr($this->baseQuery, 0, -1);
590    }
591
592    /**
593     * Generate select query for table using session variables generated from the search
594     *
595     * @param String $tableName
596     * @param Array $sessData
597     * @return void
598     */
599    private function pushBaseQueryForTable($tableName, $sessData = null){
600        foreach($this->databaseSearch->getColumnsList($tableName) as $index => $fieldsInfos){
601			$name = "";
602            if($tableName == "download_history" && $fieldsInfos['Field'] == "PKG_NAME"){
603				$tableName = "download_available";
604				$fieldsInfos['Field'] = "NAME";
605			}
606
607			if($tableName == "software" && array_key_exists($fieldsInfos['Field'], $this->correspondance)) {
608				if($fieldsInfos['Field'] == "CATEGORY") {
609					$table = $tableName."_name";
610					$field = "CATEGORY";
611				} else {
612					$name = explode("_", $fieldsInfos['Field']);
613					$table = $tableName."_".strtolower($name[0]);
614					$field = $name[0];
615				}
616				$generatedId = $table.".".$field;
617				$selectAs = $table.$field;
618				$this->baseQuery .= " %s.%s AS ".$selectAs." ,";
619				$this->queryArgs[] = $table;
620				$this->queryArgs[] = $field;
621			} else {
622				$generatedId = $tableName.".".$fieldsInfos['Field'];
623				$selectAs = $tableName.$fieldsInfos['Field'];
624				$this->baseQuery .= " %s.%s AS ".$selectAs." ,";
625				$this->queryArgs[] = $tableName;
626				$this->queryArgs[] = $fieldsInfos['Field'];
627			}
628
629
630            if($generatedId == 'hardware.NAME'){
631                $this->fieldsList["NAME"] = $selectAs;
632            } elseif($generatedId != 'hardware.ID') {
633                $this->fieldsList[$this->translationSearch->getTranslationForListField($generatedId)] = $selectAs;
634            }
635
636            /*if($sessData != null){
637                if($sessData[$tableName][key($sessData[$tableName])][self::SESS_FIELDS] == $fieldsInfos['Field']){
638                    $this->defaultFields[$this->translationSearch->getTranslationForListField($generatedId)] = $generatedId;
639                }
640            }*/
641
642        }
643    }
644
645    /**
646     * Depending on selected operator
647     * Return compliant operator for database query
648     *
649     * @param Array $valueArray
650     * @return void
651     */
652    public function getOperatorSign(&$valueArray){
653        switch ($valueArray[self::SESS_OPERATOR]) {
654            case 'EQUAL':
655                $valueArray[self::SESS_OPERATOR] = "=";
656                break;
657            case 'MORE':
658                $valueArray[self::SESS_OPERATOR] = ">";
659                break;
660            case 'LESS':
661                $valueArray[self::SESS_OPERATOR] = "<";
662                break;
663            case 'LIKE':
664                $valueArray[self::SESS_OPERATOR] = "LIKE";
665                $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%";
666                break;
667            case 'DIFFERENT':
668                $valueArray[self::SESS_OPERATOR] = "NOT LIKE";
669                $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%";
670                break;
671            case 'ISNULL':
672                $valueArray[self::SESS_OPERATOR] = "IS NULL";
673                break;
674            case 'ISNOTEMPTY':
675                $valueArray[self::SESS_OPERATOR] = "ISNOTEMPTY";
676                break;
677            case 'DOESNTCONTAIN':
678                $valueArray[self::SESS_OPERATOR] = "DOESNTCONTAIN";
679                break;
680            case 'BELONG' :
681                $valueArray[self::SESS_OPERATOR] = "IN";
682                break;
683            case 'DONTBELONG' :
684                $valueArray[self::SESS_OPERATOR] = "NOT IN";
685                break;
686            case 'NOTHAVING' :
687                $valueArray[self::SESS_OPERATOR] = "!=";
688                break;
689            case 'NOTHAVINGCHECK' :
690                $valueArray[self::SESS_OPERATOR] = "NOT LIKE";
691                $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%";
692                break;
693            case 'HAVINGCHECK' :
694                $valueArray[self::SESS_OPERATOR] = "LIKE";
695                $valueArray[self::SESS_VALUES] = "%".$valueArray[self::SESS_VALUES]."%";
696                break;
697            case 'MORETHANXDAY' :
698                $valueArray[self::SESS_OPERATOR] = "MORETHANXDAY";
699                break;
700            case 'LESSTHANXDAY' :
701                $valueArray[self::SESS_OPERATOR] = "LESSTHANXDAY";
702                break;
703            default:
704                $valueArray[self::SESS_OPERATOR] = "=";
705                break;
706        }
707    }
708
709    /**
710     * Generate HTML select options for operators
711     *
712     * @param String $defaultValue
713     * @return void
714     */
715    public function getSelectOptionForOperators($defaultValue, $table = null, $field = null)
716    {
717        $account = new AccountinfoSearch();
718        $accounttype = null;
719        if($field != null && $field != "LASTCOME" && $field != "LASTDATE"){
720          $accounttype = $account->getSearchAccountInfo($field);
721        }
722
723        $html = "";
724        $operatorList = array();
725        if($table == self::GROUP_TABLE || $field == "CATEGORY_ID" || $field == "CATEGORY") {
726            $operatorList = $this->operatorGroup;
727        } elseif($accounttype == '2' || $accounttype == '11') {
728            $operatorList = $this->operatorAccount;
729        } elseif($accounttype == '5') {
730            $operatorList = $this->operatorAccountCheckbox;
731        } elseif($this->getSearchedFieldType($table, $field) == 'datetime') {
732            $operatorList = array_merge($this->operatorList, $this->operatorDelay);
733        } else {
734            $operatorList = $this->operatorList;
735        }
736
737        foreach ($operatorList as $value) {
738            $trValue = $this->translationSearch->getTranslationForOperator($value);
739            if ($defaultValue == $value) {
740                $html .= "<option selected value=".$value." >".$trValue."</option>";
741            } else {
742                $html .= "<option value=".$value." >".$trValue."</option>";
743            }
744        }
745
746        return $html;
747    }
748
749    /**
750     * Generate HTML select options for tables select
751     *
752     * @param String $defautValue
753     * @return void
754     */
755    public function getSelectOptionForTables($defautValue = null)
756    {
757        $html = "<option>----------</option>";
758        foreach ($this->databaseSearch->getTablesList() as $tableName) {
759            $translation = $this->translationSearch->getTranslationFor($tableName);
760            $sortTable[$tableName] .= $translation;
761        }
762        asort($sortTable);
763        foreach ($sortTable as $key => $value){
764            if ($defautValue == $key) {
765                $html .= "<option selected value=".$key." >".$value."</option>";
766            } else {
767                $html .= "<option value=".$key." >".$value."</option>";
768            }
769
770        }
771        return $html;
772    }
773
774    /**
775     * Generate HTML select options for columns select
776     *
777     * @param String $tableName
778     * @return void
779     */
780    public function getSelectOptionForColumns($tableName = null)
781    {
782        $html = "";
783        $sortColumn = array();
784        if($tableName == "accountinfo"){
785          $accountinfoList = new AccountinfoSearch();
786          $accountFields = $accountinfoList->getAccountInfosList();
787          if(isset($accountFields['COMPUTERS']) && is_array($accountFields['COMPUTERS']))
788          foreach ($accountFields['COMPUTERS'] as $index => $fieldsInfos) {
789              if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){
790                  $trField = $fieldsInfos;
791                  $sortColumn[$index] .= $trField;
792              }
793          }
794        }elseif($tableName == self::GROUP_TABLE){
795          $trField = $this->translationSearch->getTranslationFor('NAME');
796          $sortColumn['name'] = $trField;
797        }else{
798          $fields = $this->databaseSearch->getColumnsList($tableName);
799          if(is_array($fields)) foreach ($fields as $index => $fieldsInfos) {
800              if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){
801                  $trField = $this->translationSearch->getTranslationFor($fieldsInfos[DatabaseSearch::FIELD]);
802                  $sortColumn[$fieldsInfos[DatabaseSearch::FIELD]] .= $trField;
803              }
804          }
805        }
806        asort($sortColumn);
807        foreach ($sortColumn as $key => $value){
808            if(!in_array($fieldsIndefaultTablefos[DatabaseSearch::FIELD], $this->excludedVisuColumns)){
809                $html .= "<option value=".$key." >".$value."</option>";
810            }
811        }
812        return $html;
813    }
814
815    /**
816     * Generate HTML fields depending on database field type
817     *
818     * @param String $uniqid
819     * @param Array $fieldsInfos
820     * @param String $tableName
821     * @return String HTML
822     */
823    public function returnFieldHtml($uniqid, $fieldsInfos, $tableName, $field = null, $operator = null)
824    {
825        global $l;
826
827        $fieldId = $this->getFieldUniqId($uniqid, $tableName);
828        $fieldGroup = array();
829
830        $accountInfos = new AccountinfoSearch();
831
832        if($field != null && $field != "CATEGORY_ID" && $field != "CATEGORY" && $operator == null){
833          $accounttype = $accountInfos->getSearchAccountInfo($field);
834        }
835
836        if($tableName == self::GROUP_TABLE) {
837          $this->type = self::HTML_SELECT;
838        } elseif(array_key_exists($field, $this->correspondance)) {
839          $this->type = $this->correspondance[$field];
840        }elseif($accounttype == '2' || $accounttype == '11' || $accounttype =='5') {
841          $this->type = self::HTML_SELECT;
842        } else {
843          $this->type = $this->getSearchedFieldType($tableName, $fieldsInfos[self::SESS_FIELDS]);
844        }
845
846        if($operator == "MORETHANXDAY" || $operator == "LESSTHANXDAY") {
847          $this->type = self::DB_INT;
848        }
849
850        $html = "";
851        if($fieldsInfos[self::SESS_OPERATOR]== 'ISNULL' || $fieldsInfos[self::SESS_OPERATOR]== 'ISNOTEMPTY'){
852          $attr = 'disabled';
853        }else{
854          $attr = '';
855        }
856
857        switch ($this->type) {
858            case self::DB_VARCHAR:
859                $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>';
860                break;
861
862            case self::DB_TEXT:
863                $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>';
864                break;
865
866            case self::DB_INT:
867                $html = '<input class="form-control" type="number" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>';
868                break;
869
870            case self::DB_DATETIME:
871                $html = '<div class="input-group date form_datetime">
872                            <input type="text" class="form-control" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'/>
873                            <span class="input-group-addon">
874                                '.calendars($fieldId, $l->g(1270)).'
875                            </span>
876                        </div>';
877                break;
878            case self::HTML_SELECT:
879
880                $html = '<select class="form-control" name="'.$fieldId.'" id="'.$fieldId.'">';
881                if($accounttype != null) {
882                  $fieldSelect = $accountInfos->find_accountinfo_values($field, $accounttype);
883                } elseif($field == 'CATEGORY_ID') {
884                   $fieldSelect = $this->asset_categories();
885                } elseif($field == 'CATEGORY'){
886                  require_once('require/softwares/SoftwareCategory.php');
887                  $soft = new SoftwareCategory();
888                  $fieldSelect = $soft->search_all_cat();
889                  unset($fieldSelect[0]);
890                } else {
891                  $fieldSelect = $this->groupSearch->get_group_name();
892                }
893
894                foreach ($fieldSelect as $key => $value){
895                    if ($fieldsInfos[self::SESS_VALUES] == $key) {
896                        $html .= "<option value=".$key." selected >".$value."</option>";
897                    } else {
898                        $html .= "<option value=".$key." >".$value."</option>";
899                    }
900                }
901                $html .= '</select>';
902                break;
903
904            default:
905                $html = '<input class="form-control" type="text" name="'.$fieldId.'" id="'.$fieldId.'" value="'.$fieldsInfos[self::SESS_VALUES].'" '.$attr.'>';
906                break;
907        }
908
909        return $html;
910    }
911
912    public function returnFieldHtmlAndOr($uniqid, $fieldsInfos, $infos, $tableName, $defaultValue = null)
913    {
914        global $l;
915        $i = 0;
916
917        foreach ($infos as $id => $value){
918            if($value['fields'] == $fieldsInfos['fields']){
919              $i++;
920            }
921        }
922
923        $fieldId = $this->getFieldUniqId($uniqid, $tableName);
924        $html = "";
925
926        if($i > 1){
927          $html = "<select class='form-control' name='".$this->getComparatorUniqId($uniqid, $tableName)."' id='".$this->getComparatorUniqId($uniqid, $tableName)."'>";
928          foreach ($this->comparatorList as $value) {
929              $trValue = $this->translationSearch->getTranslationForComparator($value);
930              if ($defaultValue == $value) {
931                  $html .= "<option selected value=".$value." >".$trValue."</option>";
932              } else {
933                  $html .= "<option value=".$value." >".$trValue."</option>";
934              }
935          }
936          $html .= "</select>";
937        }
938
939        return $html;
940    }
941
942    /**
943     * [link_multi description]
944     * @param  string $fields [description]
945     * @param  string $value  [description]
946     * @param  string $option [description]
947     * @return [type]         [description]
948     */
949    public function link_multi($fields, $value, $option = ""){
950        switch($fields){
951          case 'cveNamePublisherVersion':
952            $value = explode(";", $value);
953            $_SESSION['OCS']['multi_search'] = array();
954            $_SESSION['OCS']['multi_search']['software']['allsoft'] = [
955                'fields' => 'NAME_ID',
956                'value' => $value[0],
957                'operator' => 'EQUAL',
958            ];
959            $_SESSION['OCS']['multi_search']['software']['allsoftpublisher'] = [
960              'fields' => 'PUBLISHER_ID',
961              'value' => $value[1],
962              'operator' => 'EQUAL',
963            ];
964            $_SESSION['OCS']['multi_search']['software']['allsoftversion'] = [
965              'fields' => 'VERSION_ID',
966              'value' => $value[2],
967              'operator' => 'EQUAL',
968            ];
969            break;
970            case 'cveNameVersion':
971              $value = explode(";", $value);
972              $_SESSION['OCS']['multi_search'] = array();
973              $_SESSION['OCS']['multi_search']['software']['allsoft'] = [
974                  'fields' => 'NAME_ID',
975                  'value' => $value[0],
976                  'operator' => 'EQUAL',
977              ];
978              $_SESSION['OCS']['multi_search']['software']['allsoftversion'] = [
979                'fields' => 'VERSION_ID',
980                'value' => $value[1],
981                'operator' => 'EQUAL',
982              ];
983              break;
984          case 'cveName':
985            $_SESSION['OCS']['multi_search'] = array();
986            $_SESSION['OCS']['multi_search']['software']['allsoft'] = [
987                'fields' => 'NAME_ID',
988                'value' => $value,
989                'operator' => 'EQUAL',
990            ];
991            break;
992
993          case 'ipdiscover1':
994            $_SESSION['OCS']['multi_search'] = array();
995            if(!isset($_SESSION['OCS']['multi_search']['networks']['ipdiscover1'])){
996                if(strpos($value, ";") !== false) {
997                  $explode = explode(";", $value);
998                  $value = $explode[0];
999                  if(count($explode) == 2) {
1000                    $tag = $explode[1];
1001                  } else {
1002                    $tag = null;
1003                  }
1004                }
1005                $_SESSION['OCS']['multi_search']['networks']['ipdiscover1'] = [
1006                    'fields' => 'IPSUBNET',
1007                    'value' => $value,
1008                    'operator' => 'EQUAL',
1009                ];
1010                $_SESSION['OCS']['multi_search']['devices']['ipdiscover1'] = [
1011                    'fields' => 'NAME',
1012                    'value' => 'IPDISCOVER',
1013                    'operator' => 'EQUAL',
1014                ];
1015                $_SESSION['OCS']['multi_search']['devices']['ipdiscover2'] = [
1016                    'fields' => 'IVALUE',
1017                    'value' => '1',
1018                    'operator' => 'EQUAL',
1019                ];
1020                $_SESSION['OCS']['multi_search']['devices']['ipdiscover3'] = [
1021                    'fields' => 'IVALUE',
1022                    'value' => '2',
1023                    'operator' => 'EQUAL',
1024                    'comparator' => 'OR',
1025                ];
1026                $_SESSION['OCS']['multi_search']['devices']['ipdiscover4'] = [
1027                    'fields' => 'TVALUE',
1028                    'value' => $value,
1029                    'operator' => 'EQUAL',
1030                ];
1031                if($tag != null && $tag != "") {
1032                  $_SESSION['OCS']['multi_search']['accountinfo']['ipdiscover5'] = [
1033                    'fields' => 'TAG',
1034                    'value' => $tag,
1035                    'operator' => 'EQUAL',
1036                ];
1037                }
1038            }
1039            break;
1040
1041          case 'stat':
1042            {
1043              $_SESSION['OCS']['multi_search'] = array();
1044              $_SESSION['OCS']['multi_search']['devices']['stat'] = [
1045                  'fields' => 'NAME',
1046                  'value' => 'DOWNLOAD',
1047                  'operator' => 'EQUAL',
1048              ];
1049
1050              $i = 0;
1051              if(isset($option['idPackage'])) foreach($option['idPackage'] as $key =>$value){
1052                if($i == 0){
1053                  $comparator = 'AND';
1054                }else{
1055                  $comparator = 'OR';
1056                }
1057                $_SESSION['OCS']['multi_search']['devices']['stat'.$key] = [
1058                    'fields' => 'IVALUE',
1059                    'value' => $value,
1060                    'operator' => 'EQUAL',
1061                    'comparator' => $comparator
1062                ];
1063                $i++;
1064              }
1065
1066              $comparator = 'AND';
1067
1068              if($option['stat'] == 'WAITING')
1069              {
1070                $value_stat = '';
1071                $operator_stat = 'ISNULL';
1072              }
1073              else if($option['stat'] == 'ERRORS')
1074              {
1075                $value_stat = 'EXIT_CODE';
1076                $operator_stat = 'LIKE';
1077
1078                $_SESSION['OCS']['multi_search']['devices']['stattvalue2'] = [
1079                    'fields' => 'TVALUE',
1080                    'value' => $value_stat,
1081                    'operator' => $operator_stat,
1082                    'comparator' => $comparator
1083                ];
1084
1085                $value_stat = 'ERR';
1086                $comparator = 'OR';
1087              }
1088              else
1089              {
1090                $value_stat = $option['stat'];
1091                $operator_stat = 'EQUAL';
1092              }
1093
1094              $_SESSION['OCS']['multi_search']['devices']['stattvalue'] = [
1095                  'fields' => 'TVALUE',
1096                  'value' => $value_stat,
1097                  'operator' => $operator_stat,
1098                  'comparator' => $comparator
1099              ];
1100            }
1101            break;
1102
1103          case 'saas':
1104            if(!array_key_exists('saas',$_SESSION['OCS']['multi_search']['saas'])){
1105                $_SESSION['OCS']['multi_search'] = array();
1106                $_SESSION['OCS']['multi_search']['saas']['saas'] = [
1107                    'fields' => 'ENTRY',
1108                    'value' => $value,
1109                    'operator' => 'EQUAL',
1110                ];
1111            }
1112            break;
1113
1114          case 'querysave':
1115            $parameters = $this->query_save($value);
1116
1117            $_SESSION['OCS']['multi_search'] = array();
1118            $_SESSION['OCS']['multi_search'] = $parameters;
1119
1120            break;
1121
1122          default :
1123            break;
1124        }
1125    }
1126
1127    public function query_save($id) {
1128      $sql = "SELECT PARAMETERS FROM save_query WHERE ID = %s";
1129      $sql_arg = array($id);
1130
1131      $result = mysql2_query_secure($sql, $_SESSION['OCS']['readServer'], $sql_arg);
1132
1133      while($item = mysqli_fetch_array($result)){
1134        $parameters = $item['PARAMETERS'];
1135      }
1136
1137      return unserialize($parameters);
1138    }
1139
1140    /**
1141     * [link_index description]
1142     * @param  string $fields [description]
1143     * @param  string $comp   [description]
1144     * @param  string $value  [description]
1145     * @return [type]         [description]
1146     */
1147    public function link_index($fields, $comp = "", $value, $value2 = null){
1148      $field = explode("-", $fields) ;
1149
1150      if($comp== 'small') { $operator = 'LESS'; }
1151      elseif($comp == 'tall') { $operator = 'MORE'; }
1152      elseif($comp == 'exact') { $operator = 'EQUAL'; }
1153
1154      if($fields == 'HARDWARE-LASTDATE' || $fields == 'HARDWARE-LASTCOME'){
1155          $value = str_replace(substr($value, -5), '00:00', $value);
1156      }
1157
1158      if(empty($field[2])){
1159        if(strpos($field[0], 'HARDWARE') !== false){
1160          if(!isset($_SESSION['OCS']['multi_search']['hardware']) || !array_key_exists('HARDWARE-'.$field[1].$comp.preg_replace("/\s+/","", preg_replace("/_/","",$value)).preg_replace("/_/","",$value2),$_SESSION['OCS']['multi_search']['hardware'])){
1161              $_SESSION['OCS']['multi_search'] = array();
1162              $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field[1].$comp.preg_replace("/\s+/","", preg_replace("/_/","",$value)).preg_replace("/_/","",$value2)] = [
1163                  'fields' => $field[1],
1164                  'value' => $value,
1165                  'operator' => $operator,
1166              ];
1167              if($value2 != null && $value2 != 'all')
1168              $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field[1].$comp.preg_replace("/_/","",$value2)] = [
1169                  'fields' => 'USERAGENT',
1170                  'value' => $value2,
1171                  'operator' => 'LIKE',
1172              ];
1173          }
1174        }elseif(strpos($field[0], 'ACCOUNTINFO') !== false){
1175          if(!isset($_SESSION['OCS']['multi_search']['accountinfo']) || !array_key_exists('ACCOUNTINFO-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['accountinfo'])){
1176              $_SESSION['OCS']['multi_search'] = array();
1177              $_SESSION['OCS']['multi_search']['accountinfo']['ACCOUNTINFO-'.$field[1].$comp.preg_replace("/_/","",$value)] = [
1178                  'fields' => $field[1],
1179                  'value' => $value,
1180                  'operator' => $operator,
1181              ];
1182          }
1183        }elseif(strpos($field[0], 'NETWORKS') !== false){
1184          if(!isset($_SESSION['OCS']['multi_search']['networks']) || !array_key_exists('NETWORKS-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['networks'])){
1185              $_SESSION['OCS']['multi_search'] = array();
1186              $_SESSION['OCS']['multi_search']['networks']['NETWORKS-'.$field[1].$comp.preg_replace("/_/","",$value)] = [
1187                  'fields' => $field[1],
1188                  'value' => preg_replace("/[^A-Za-z0-9\.]/", "", $value),
1189                  'operator' => $operator,
1190              ];
1191          }
1192        }elseif(strpos($field[0], 'VIDEOS') !== false){
1193          if(!isset($_SESSION['OCS']['multi_search']['videos']) || !array_key_exists('VIDEOS-'.$field[1].$comp.$value,$_SESSION['OCS']['multi_search']['videos'])){
1194              $_SESSION['OCS']['multi_search'] = array();
1195              $_SESSION['OCS']['multi_search']['videos']['VIDEOS-'.$field[1].$comp.preg_replace("/_/","",$value)] = [
1196                  'fields' => $field[1],
1197                  'value' => $value,
1198                  'operator' => $operator,
1199              ];
1200          }
1201        }elseif(strpos($field[0], 'ASSETS') !== false){
1202          if(!isset($_SESSION['OCS']['multi_search']['hardware']) || !array_key_exists('ASSETS'.$value,$_SESSION['OCS']['multi_search']['hardware'])){
1203              $_SESSION['OCS']['multi_search'] = array();
1204              $_SESSION['OCS']['multi_search']['hardware']['ASSETS'.preg_replace("/_/","",$value)] = [
1205                  'fields' => 'CATEGORY_ID',
1206                  'value' => $value,
1207                  'operator' => "BELONG",
1208              ];
1209          }
1210        }
1211      }else{
1212        $field_bis = explode(",", $field[1]) ;
1213        $comps = explode(",", $comp) ;
1214        $values = explode(",", $value) ;
1215
1216        if($comps[1] == 'small') { $operator1 = 'LESS'; }
1217        if($comps[0] == 'tall') { $operator2 = 'MORE'; }
1218
1219        if(!array_key_exists('HARDWARE-'.$field_bis[0].$comps[0].$values[0],$_SESSION['OCS']['multi_search']['hardware'])){
1220            $_SESSION['OCS']['multi_search'] = array();
1221            $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field_bis[0].$comps[0].preg_replace("/_/","",$values[0])] = [
1222                'fields' => $field_bis[0],
1223                'value' => $values[0],
1224                'operator' => $operator2,
1225            ];
1226
1227            $_SESSION['OCS']['multi_search']['hardware']['HARDWARE-'.$field_bis[0].$comp[1].preg_replace("/_/","",$values[1])] = [
1228                'fields' => $field_bis[0],
1229                'value' => $values[1],
1230                'operator' => $operator1,
1231            ];
1232        }
1233      }
1234    }
1235
1236    /**
1237     * Get all assets category
1238     */
1239    public function asset_categories(){
1240      $sqlAsset = "SELECT CATEGORY_NAME, ID FROM assets_categories";
1241      $result = mysqli_query($_SESSION['OCS']["readServer"], $sqlAsset);
1242
1243      while($asset_row = mysqli_fetch_array($result)){
1244        $asset[$asset_row['ID']] = $asset_row['CATEGORY_NAME'];
1245      }
1246      return $asset;
1247    }
1248
1249    /**
1250     * Doesn't contain traitment
1251     */
1252    public function contain($value, $tableName){
1253      if($tableName != DatabaseSearch::COMPUTER_DEF_TABLE){
1254        $field = "HARDWARE_ID";
1255      }else{
1256        $field = "ID";
1257      }
1258      $sql_search = "SELECT DISTINCT %s FROM %s WHERE %s LIKE '%s'";
1259      $sql_search_arg = array($field, $tableName, $value['fields'], "%".$value['value']."%");
1260      $result = mysql2_query_secure($sql_search, $_SESSION['OCS']["readServer"], $sql_search_arg);
1261
1262      while($notcontain = mysqli_fetch_array($result)){
1263        $excluID[] = $notcontain[$field];
1264      }
1265
1266      if($excluID[0] == null){
1267        $excluID[0] = 0;
1268      }
1269
1270      return $excluID;
1271    }
1272
1273    /**
1274     * Doesn't contain traitment if multi search
1275     */
1276    public function containmulti($name, $value){
1277      $excluID = null;
1278      $allID = null;
1279      foreach ($name as $table => $field){
1280        $tablename = $table;
1281        $column = $field;
1282      }
1283
1284      if($tablename != DatabaseSearch::COMPUTER_DEF_TABLE){
1285        $fieldname = "HARDWARE_ID";
1286      }else{
1287        $fieldname = "ID";
1288      }
1289
1290      foreach ($value as $uniqID => $values){
1291        if ($values['fields'] == $field && $values['operator'] == "DOESNTCONTAIN"){
1292          $search[] = $values['value'];
1293          if($values['comparator'] != null){
1294            $comparator[] = $values['comparator'];
1295          }
1296        }
1297      }
1298
1299      for($i = 0; $i != count($comparator)+1; $i++){
1300
1301        $sql = "SELECT DISTINCT %s FROM %s WHERE %s LIKE '%s'";
1302        $sql_arg = array($fieldname, $tablename, $column, "%".$search[$i]."%");
1303
1304        $result = mysql2_query_secure($sql, $_SESSION['OCS']["readServer"], $sql_arg);
1305
1306        while($notcontain = mysqli_fetch_array($result)){
1307          $excluID[$notcontain[$fieldname]] = $notcontain[$fieldname];
1308          $allID[$search[$i]][$notcontain[$fieldname]] = $notcontain[$fieldname];
1309        }
1310      }
1311
1312      for($i = 0; $i != count($comparator)+1; $i++){
1313        foreach($excluID as $key => $values){
1314          foreach($allID as $searching => $compare){
1315            if(!array_key_exists($values, $compare) && $comparator[$i] == "AND"){
1316              unset($excluID[$key]);
1317            }
1318          }
1319        }
1320      }
1321
1322      if($excluID == null){
1323        $excluID[0] = 0;
1324      }
1325
1326      return $excluID;
1327    }
1328 }
1329