Inheritance: extends CommonDBChild
 /**
  * @since version 0.85
  *
  * @see commonDBTM::getRights()
  **/
 function getRights($interface = 'central')
 {
     $values = parent::getRights();
     unset($values[UPDATE], $values[CREATE], $values[READ]);
     $values[self::CREATEREQUEST] = array('short' => __('Create for request'), 'long' => __('Create a validation request for a request'));
     $values[self::CREATEINCIDENT] = array('short' => __('Create for incident'), 'long' => __('Create a validation request for an incident'));
     $values[self::VALIDATEREQUEST] = __('Validate a request');
     $values[self::VALIDATEINCIDENT] = __('Validate an incident');
     if ($interface == 'helpdesk') {
         unset($values[PURGE]);
     }
     return $values;
 }
 function getDatasForTemplate($event, $options = array())
 {
     $this->datas['##consumable.entity##'] = Dropdown::getDropdownName('glpi_entities', $options['entities_id']);
     $this->datas['##lang.consumable.entity##'] = __('Entity');
     $this->datas['##consumable.entity##'] = Dropdown::getDropdownName('glpi_entities', $options['entities_id']);
     $this->datas['##lang.consumable.entity##'] = __('Entity');
     switch ($event) {
         case self::CONSUMABLE_REQUEST:
             $this->datas['##consumable.action##'] = __('Consumable request', 'consumables');
             break;
         case self::CONSUMABLE_RESPONSE:
             $this->datas['##consumable.action##'] = __('Consumable validation', 'consumables');
             break;
     }
     // Consumable request
     $this->datas['##lang.consumablerequest.consumable##'] = _n('Consumable', 'Consumables', 1);
     $this->datas['##lang.consumablerequest.consumabletype##'] = _n('Consumable type', 'Consumable types', 1);
     $this->datas['##lang.consumablerequest.request_date##'] = __('Request date');
     $this->datas['##lang.consumablerequest.requester##'] = __('Requester');
     $this->datas['##lang.consumablerequest.status##'] = __('Status');
     $this->datas['##lang.consumablerequest.number##'] = __('Number of used consumables');
     $this->datas['##lang.consumablerequest.validator##'] = __('Approver');
     $this->datas['##lang.consumablerequest.comment##'] = __('Comments');
     $consumable = $options['consumablerequest'];
     $this->datas['##consumablerequest.consumable##'] = Dropdown::getDropdownName(ConsumableItem::getTable(), $consumable['consumables_id']);
     $this->datas['##consumablerequest.consumabletype##'] = Dropdown::getDropdownName(ConsumableItemType::getTable(), $consumable['consumableitemtypes_id']);
     $this->datas['##consumablerequest.request_date##'] = Html::convDateTime($consumable['date_mod']);
     $this->datas['##consumablerequest.end_date##'] = Html::convDateTime($consumable['end_date']);
     $this->datas['##consumablerequest.requester##'] = Html::clean(getUserName($consumable['requesters_id']));
     $this->datas['##consumablerequest.validator##'] = Html::clean(getUserName($consumable['validators_id']));
     $this->datas['##consumablerequest.number##'] = $consumable['number'];
     $this->datas['##consumablerequest.status##'] = CommonITILValidation::getStatus($consumable['status']);
     if (isset($options['comment'])) {
         $this->datas['##consumablerequest.comment##'] = Html::clean($options['comment']);
     }
 }
 /**
  * @since version 0.84
  *
  * @param $field
  * @param $name            (default '')
  * @param $values          (default '')
  * @param $options   array
  **/
 static function getSpecificValueToSelect($field, $name = '', $values = '', array $options = array())
 {
     if (!is_array($values)) {
         $values = array($field => $values);
     }
     $options['display'] = false;
     switch ($field) {
         case 'status':
             $options['name'] = $name;
             $options['value'] = $values[$field];
             return self::dropdownStatus($options);
         case 'impact':
             $options['name'] = $name;
             $options['value'] = $values[$field];
             return self::dropdownImpact($options);
         case 'urgency':
             $options['name'] = $name;
             $options['value'] = $values[$field];
             return self::dropdownUrgency($options);
         case 'priority':
             $options['name'] = $name;
             $options['value'] = $values[$field];
             return self::dropdownPriority($options);
         case 'global_validation':
             $options['global'] = true;
             $options['value'] = $values[$field];
             return CommonITILValidation::dropdownStatus($name, $options);
     }
     return parent::getSpecificValueToSelect($field, $name, $values, $options);
 }
Beispiel #4
0
 /**
  * Generic Function to add where to a request
  *
  * @param $link         link string
  * @param $nott         is it a negative search ?
  * @param $itemtype     item type
  * @param $ID           ID of the item to search
  * @param $searchtype   searchtype used (equals or contains)
  * @param $val          item num in the request
  * @param $meta         is a meta search (meta=2 in search.class.php) (default 0)
  *
  * @return select string
  **/
 static function addWhere($link, $nott, $itemtype, $ID, $searchtype, $val, $meta = 0)
 {
     $searchopt =& self::getOptions($itemtype);
     $table = $searchopt[$ID]["table"];
     $field = $searchopt[$ID]["field"];
     $inittable = $table;
     $addtable = '';
     if ($table != 'asset_types' && $table != getTableForItemType($itemtype) && $searchopt[$ID]["linkfield"] != getForeignKeyFieldForTable($table)) {
         $addtable = "_" . $searchopt[$ID]["linkfield"];
         $table .= $addtable;
     }
     if (isset($searchopt[$ID]['joinparams'])) {
         $complexjoin = self::computeComplexJoinID($searchopt[$ID]['joinparams']);
         if (!empty($complexjoin)) {
             $table .= "_" . $complexjoin;
         }
     }
     if ($meta && getTableForItemType($itemtype) != $table) {
         $table .= "_" . $itemtype;
     }
     // Hack to allow search by ID on every sub-table
     if (preg_match('/^\\$\\$\\$\\$([0-9]+)$/', $val, $regs)) {
         return $link . " (`{$table}`.`id` " . ($nott ? "<>" : "=") . $regs[1] . " " . ($regs[1] == 0 ? " OR `{$table}`.`id` IS NULL" : '') . ") ";
     }
     // Preparse value
     if (isset($searchopt[$ID]["datatype"])) {
         switch ($searchopt[$ID]["datatype"]) {
             case "datetime":
             case "date":
             case "date_delay":
                 $force_day = true;
                 if ($searchopt[$ID]["datatype"] == 'datetime') {
                     $force_day = false;
                 }
                 if (strstr($val, 'BEGIN') || strstr($val, 'LAST')) {
                     $force_day = true;
                 }
                 $val = Html::computeGenericDateTimeSearch($val, $force_day);
                 break;
         }
     }
     switch ($searchtype) {
         case "contains":
             $SEARCH = self::makeTextSearch($val, $nott);
             break;
         case "equals":
             if ($nott) {
                 $SEARCH = " <> '{$val}'";
             } else {
                 $SEARCH = " = '{$val}'";
             }
             break;
         case "notequals":
             if ($nott) {
                 $SEARCH = " = '{$val}'";
             } else {
                 $SEARCH = " <> '{$val}'";
             }
             break;
         case "under":
             if ($nott) {
                 $SEARCH = " NOT IN ('" . implode("','", getSonsOf($inittable, $val)) . "')";
             } else {
                 $SEARCH = " IN ('" . implode("','", getSonsOf($inittable, $val)) . "')";
             }
             break;
         case "notunder":
             if ($nott) {
                 $SEARCH = " IN ('" . implode("','", getSonsOf($inittable, $val)) . "')";
             } else {
                 $SEARCH = " NOT IN ('" . implode("','", getSonsOf($inittable, $val)) . "')";
             }
             break;
     }
     // Plugin can override core definition for its type
     if ($plug = isPluginItemType($itemtype)) {
         $function = 'plugin_' . $plug['plugin'] . '_addWhere';
         if (function_exists($function)) {
             $out = $function($link, $nott, $itemtype, $ID, $val, $searchtype);
             if (!empty($out)) {
                 return $out;
             }
         }
     }
     switch ($inittable . "." . $field) {
         // //          case "glpi_users_validation.name" :
         case "glpi_users.name":
             if ($itemtype == 'User') {
                 // glpi_users case / not link table
                 if (in_array($searchtype, array('equals', 'notequals'))) {
                     return " {$link} `{$table}`.`id`" . $SEARCH;
                 }
                 return self::makeTextCriteria("`{$table}`.`{$field}`", $val, $nott, $link);
             }
             if ($_SESSION["glpinames_format"] == User::FIRSTNAME_BEFORE) {
                 $name1 = 'firstname';
                 $name2 = 'realname';
             } else {
                 $name1 = 'realname';
                 $name2 = 'firstname';
             }
             if (in_array($searchtype, array('equals', 'notequals'))) {
                 return " {$link} (`{$table}`.`id`" . $SEARCH . ($val == 0 ? " OR `{$table}`.`id` IS NULL" : '') . ') ';
             }
             $toadd = '';
             $tmplink = 'OR';
             if ($nott) {
                 $tmplink = 'AND';
             }
             if ($itemtype == 'Ticket' || $itemtype == 'Problem') {
                 if (isset($searchopt[$ID]["joinparams"]["beforejoin"]["table"]) && isset($searchopt[$ID]["joinparams"]["beforejoin"]["joinparams"]) && ($searchopt[$ID]["joinparams"]["beforejoin"]["table"] == 'glpi_tickets_users' || $searchopt[$ID]["joinparams"]["beforejoin"]["table"] == 'glpi_problems_users' || $searchopt[$ID]["joinparams"]["beforejoin"]["table"] == 'glpi_changes_users')) {
                     $bj = $searchopt[$ID]["joinparams"]["beforejoin"];
                     $linktable = $bj['table'] . '_' . self::computeComplexJoinID($bj['joinparams']);
                     //$toadd     = "`$linktable`.`alternative_email` $SEARCH $tmplink ";
                     $toadd = self::makeTextCriteria("`{$linktable}`.`alternative_email`", $val, $nott, $tmplink);
                 }
             }
             $toadd2 = '';
             if ($nott && $val != 'NULL' && $val != 'null') {
                 $toadd2 = " OR `{$table}`.`{$field}` IS NULL";
             }
             return $link . " (((`{$table}`.`{$name1}` {$SEARCH}\n                            {$tmplink} `{$table}`.`{$name2}` {$SEARCH}\n                            {$tmplink} `{$table}`.`{$field}` {$SEARCH}\n                            {$tmplink} CONCAT(`{$table}`.`{$name1}`, ' ', `{$table}`.`{$name2}`) {$SEARCH} )\n                            {$toadd2}) {$toadd})";
         case "glpi_groups.completename":
             if ($val == 'mygroups') {
                 switch ($searchtype) {
                     case 'equals':
                         return " {$link} (`{$table}`.`id` IN ('" . implode("','", $_SESSION['glpigroups']) . "')) ";
                     case 'notequals':
                         return " {$link} (`{$table}`.`id` NOT IN ('" . implode("','", $_SESSION['glpigroups']) . "')) ";
                     case 'under':
                         $groups = $_SESSION['glpigroups'];
                         foreach ($_SESSION['glpigroups'] as $g) {
                             $groups += getSonsOf($inittable, $g);
                         }
                         $groups = array_unique($groups);
                         return " {$link} (`{$table}`.`id` IN ('" . implode("','", $groups) . "')) ";
                     case 'notunder':
                         $groups = $_SESSION['glpigroups'];
                         foreach ($_SESSION['glpigroups'] as $g) {
                             $groups += getSonsOf($inittable, $g);
                         }
                         $groups = array_unique($groups);
                         return " {$link} (`{$table}`.`id` NOT IN ('" . implode("','", $groups) . "')) ";
                 }
             }
             break;
         case "glpi_auth_tables.name":
             $user_searchopt = self::getOptions('User');
             $tmplink = 'OR';
             if ($nott) {
                 $tmplink = 'AND';
             }
             return $link . " (`glpi_authmails" . $addtable . "_" . self::computeComplexJoinID($user_searchopt[31]['joinparams']) . "`.`name`\n                           {$SEARCH}\n                           {$tmplink} `glpi_authldaps" . $addtable . "_" . self::computeComplexJoinID($user_searchopt[30]['joinparams']) . "`.`name`\n                           {$SEARCH} ) ";
         case "glpi_ipaddresses.name":
             $search = array("/\\&lt;/", "/\\&gt;/");
             $replace = array("<", ">");
             $val = preg_replace($search, $replace, $val);
             if (preg_match("/^\\s*([<>])([=]*)[[:space:]]*([0-9\\.]+)/", $val, $regs)) {
                 if ($nott) {
                     if ($regs[1] == '<') {
                         $regs[1] = '>';
                     } else {
                         $regs[1] = '<';
                     }
                 }
                 $regs[1] .= $regs[2];
                 return $link . " (INET_ATON(`{$table}`.`{$field}`) " . $regs[1] . " INET_ATON('" . $regs[3] . "')) ";
             }
             break;
         case "glpi_tickets.status":
         case "glpi_problems.status":
         case "glpi_changes.status":
             if ($val == 'all') {
                 return "";
             }
             $tocheck = array();
             if ($item = getItemForItemtype($itemtype)) {
                 switch ($val) {
                     case 'process':
                         $tocheck = $item->getProcessStatusArray();
                         break;
                     case 'notclosed':
                         $tocheck = $item->getAllStatusArray();
                         foreach ($item->getClosedStatusArray() as $status) {
                             if (isset($tocheck[$status])) {
                                 unset($tocheck[$status]);
                             }
                         }
                         $tocheck = array_keys($tocheck);
                         break;
                     case 'old':
                         $tocheck = array_merge($item->getSolvedStatusArray(), $item->getClosedStatusArray());
                         break;
                     case 'notold':
                         $tocheck = $item->getAllStatusArray();
                         foreach ($item->getSolvedStatusArray() as $status) {
                             if (isset($tocheck[$status])) {
                                 unset($tocheck[$status]);
                             }
                         }
                         foreach ($item->getClosedStatusArray() as $status) {
                             if (isset($tocheck[$status])) {
                                 unset($tocheck[$status]);
                             }
                         }
                         $tocheck = array_keys($tocheck);
                         break;
                 }
             }
             if (count($tocheck) == 0) {
                 $statuses = $item->getAllStatusArray();
                 if (isset($statuses[$val])) {
                     $tocheck = array($val);
                 }
             }
             if (count($tocheck)) {
                 if ($nott) {
                     return $link . " `{$table}`.`{$field}` NOT IN ('" . implode("','", $tocheck) . "')";
                 }
                 return $link . " `{$table}`.`{$field}` IN ('" . implode("','", $tocheck) . "')";
             }
             break;
         case "glpi_tickets_tickets.tickets_id_1":
             $tmplink = 'OR';
             $compare = '=';
             if ($nott) {
                 $tmplink = 'AND';
                 $compare = '<>';
             }
             $toadd2 = '';
             if ($nott && $val != 'NULL' && $val != 'null') {
                 $toadd2 = " OR `{$table}`.`{$field}` IS NULL";
             }
             return $link . " (((`{$table}`.`tickets_id_1` {$compare} '{$val}'\n                              {$tmplink} `{$table}`.`tickets_id_2` {$compare} '{$val}')\n                             AND `glpi_tickets`.`id` <> '{$val}')\n                            {$toadd2})";
         case "glpi_tickets.priority":
         case "glpi_tickets.impact":
         case "glpi_tickets.urgency":
         case "glpi_problems.priority":
         case "glpi_problems.impact":
         case "glpi_problems.urgency":
         case "glpi_changes.priority":
         case "glpi_changes.impact":
         case "glpi_changes.urgency":
         case "glpi_projects.priority":
             if (is_numeric($val)) {
                 if ($val > 0) {
                     return $link . " `{$table}`.`{$field}` = '{$val}'";
                 }
                 if ($val < 0) {
                     return $link . " `{$table}`.`{$field}` >= '" . abs($val) . "'";
                 }
                 // Show all
                 return $link . " `{$table}`.`{$field}` >= '0' ";
             }
             return "";
         case "glpi_tickets.global_validation":
         case "glpi_ticketvalidations.status":
             if ($val == 'all') {
                 return "";
             }
             $tocheck = array();
             switch ($val) {
                 case 'can':
                     $tocheck = CommonITILValidation::getCanValidationStatusArray();
                     break;
                 case 'all':
                     $tocheck = CommonITILValidation::getAllValidationStatusArray();
                     break;
             }
             if (count($tocheck) == 0) {
                 $tocheck = array($val);
             }
             if (count($tocheck)) {
                 if ($nott) {
                     return $link . " `{$table}`.`{$field}` NOT IN ('" . implode("','", $tocheck) . "')";
                 }
                 return $link . " `{$table}`.`{$field}` IN ('" . implode("','", $tocheck) . "')";
             }
             break;
     }
     //// Default cases
     // Link with plugin tables
     if (preg_match("/^glpi_plugin_([a-z0-9]+)/", $inittable, $matches)) {
         if (count($matches) == 2) {
             $plug = $matches[1];
             $function = 'plugin_' . $plug . '_addWhere';
             if (function_exists($function)) {
                 $out = $function($link, $nott, $itemtype, $ID, $val, $searchtype);
                 if (!empty($out)) {
                     return $out;
                 }
             }
         }
     }
     $tocompute = "`{$table}`.`{$field}`";
     $tocomputetrans = "`" . $table . "_" . $field . "_trans`.`value`";
     if (isset($searchopt[$ID]["computation"])) {
         $tocompute = $searchopt[$ID]["computation"];
         $tocompute = str_replace("TABLE", "`{$table}`", $tocompute);
     }
     // Preformat items
     if (isset($searchopt[$ID]["datatype"])) {
         switch ($searchopt[$ID]["datatype"]) {
             case "itemtypename":
                 if (in_array($searchtype, array('equals', 'notequals'))) {
                     return " {$link} (`{$table}`.`{$field}`" . $SEARCH . ') ';
                 }
                 break;
             case "itemlink":
                 if (in_array($searchtype, array('equals', 'notequals', 'under', 'notunder'))) {
                     return " {$link} (`{$table}`.`id`" . $SEARCH . ') ';
                 }
                 break;
             case "datetime":
             case "date":
             case "date_delay":
                 if ($searchopt[$ID]["datatype"] == 'datetime') {
                     // Specific search for datetime
                     if (in_array($searchtype, array('equals', 'notequals'))) {
                         $val = preg_replace("/:00\$/", '', $val);
                         $val = '^' . $val;
                         if ($searchtype == 'notequals') {
                             $nott = !$nott;
                         }
                         return self::makeTextCriteria("`{$table}`.`{$field}`", $val, $nott, $link);
                     }
                 }
                 if ($searchtype == 'lessthan') {
                     $val = '<' . $val;
                 }
                 if ($searchtype == 'morethan') {
                     $val = '>' . $val;
                 }
                 if ($searchtype) {
                     $date_computation = $tocompute;
                 }
                 $search_unit = ' MONTH ';
                 if (isset($searchopt[$ID]['searchunit'])) {
                     $search_unit = $searchopt[$ID]['searchunit'];
                 }
                 if ($searchopt[$ID]["datatype"] == "date_delay") {
                     $delay_unit = ' MONTH ';
                     if (isset($searchopt[$ID]['delayunit'])) {
                         $delay_unit = $searchopt[$ID]['delayunit'];
                     }
                     $add_minus = '';
                     if (isset($searchopt[$ID]["datafields"][3])) {
                         $add_minus = "-`{$table}`.`" . $searchopt[$ID]["datafields"][3] . "`";
                     }
                     $date_computation = "ADDDATE(`{$table}`." . $searchopt[$ID]["datafields"][1] . ",\n                                               INTERVAL (`{$table}`." . $searchopt[$ID]["datafields"][2] . "\n                                                         {$add_minus})\n                                               {$delay_unit})";
                 }
                 if (in_array($searchtype, array('equals', 'notequals'))) {
                     return " {$link} ({$date_computation} " . $SEARCH . ') ';
                 }
                 $search = array("/\\&lt;/", "/\\&gt;/");
                 $replace = array("<", ">");
                 $val = preg_replace($search, $replace, $val);
                 if (preg_match("/^\\s*([<>=]+)(.*)/", $val, $regs)) {
                     if (is_numeric($regs[2])) {
                         return $link . " {$date_computation} " . $regs[1] . "\n                            ADDDATE(NOW(), INTERVAL " . $regs[2] . " {$search_unit}) ";
                     }
                     // ELSE Reformat date if needed
                     $regs[2] = preg_replace('@(\\d{1,2})(-|/)(\\d{1,2})(-|/)(\\d{4})@', '\\5-\\3-\\1', $regs[2]);
                     if (preg_match('/[0-9]{2,4}-[0-9]{1,2}-[0-9]{1,2}/', $regs[2])) {
                         return $link . " {$date_computation} " . $regs[1] . " '" . $regs[2] . "'";
                     }
                     return "";
                 }
                 // ELSE standard search
                 // Date format modification if needed
                 $val = preg_replace('@(\\d{1,2})(-|/)(\\d{1,2})(-|/)(\\d{4})@', '\\5-\\3-\\1', $val);
                 return self::makeTextCriteria($date_computation, $val, $nott, $link);
             case "right":
                 if ($searchtype == 'notequals') {
                     $nott = !$nott;
                 }
                 return $link . ($nott ? ' NOT' : '') . " ({$tocompute} & '{$val}') ";
             case "bool":
                 if (!is_numeric($val)) {
                     if (strcasecmp($val, __('No')) == 0) {
                         $val = 0;
                     } else {
                         if (strcasecmp($val, __('Yes')) == 0) {
                             $val = 1;
                         }
                     }
                 }
                 if ($searchtype == 'notequals') {
                     $nott = !$nott;
                 }
                 // No break here : use number comparaison case
             // No break here : use number comparaison case
             case "count":
             case "number":
             case "decimal":
             case "timestamp":
                 $search = array("/\\&lt;/", "/\\&gt;/");
                 $replace = array("<", ">");
                 $val = preg_replace($search, $replace, $val);
                 if (preg_match("/([<>])([=]*)[[:space:]]*([0-9]+)/", $val, $regs)) {
                     if ($nott) {
                         if ($regs[1] == '<') {
                             $regs[1] = '>';
                         } else {
                             $regs[1] = '<';
                         }
                     }
                     $regs[1] .= $regs[2];
                     return $link . " ({$tocompute} " . $regs[1] . " " . $regs[3] . ") ";
                 }
                 if (is_numeric($val)) {
                     if (isset($searchopt[$ID]["width"])) {
                         $ADD = "";
                         if ($nott && $val != 'NULL' && $val != 'null') {
                             $ADD = " OR {$tocompute} IS NULL";
                         }
                         if ($nott) {
                             return $link . " ({$tocompute} < " . (intval($val) - $searchopt[$ID]["width"]) . "\n                                        OR {$tocompute} > " . (intval($val) + $searchopt[$ID]["width"]) . "\n                                        {$ADD}) ";
                         }
                         return $link . " (({$tocompute} >= " . (intval($val) - $searchopt[$ID]["width"]) . "\n                                      AND {$tocompute} <= " . (intval($val) + $searchopt[$ID]["width"]) . ")\n                                     {$ADD}) ";
                     }
                     if (!$nott) {
                         return " {$link} ({$tocompute} = " . intval($val) . ") ";
                     }
                     return " {$link} ({$tocompute} <> " . intval($val) . ") ";
                 }
                 break;
         }
     }
     // Default case
     if (in_array($searchtype, array('equals', 'notequals', 'under', 'notunder'))) {
         if ((!isset($searchopt[$ID]['searchequalsonfield']) || !$searchopt[$ID]['searchequalsonfield']) && ($table != getTableForItemType($itemtype) || $itemtype == 'AllAssets')) {
             $out = " {$link} (`{$table}`.`id`" . $SEARCH;
         } else {
             $out = " {$link} (`{$table}`.`{$field}`" . $SEARCH;
         }
         if ($searchtype == 'notequals') {
             $nott = !$nott;
         }
         // Add NULL if $val = 0 and not negative search
         // Or negative search on real value
         if (!$nott && $val == 0 || $nott && $val != 0) {
             $out .= " OR `{$table}`.`id` IS NULL";
         }
         $out .= ')';
         return $out;
     }
     $transitemtype = getItemTypeForTable($inittable);
     if (Session::haveTranslations($transitemtype, $field)) {
         return " {$link} (" . self::makeTextCriteria($tocompute, $val, $nott, '') . "\n                          OR " . self::makeTextCriteria($tocomputetrans, $val, $nott, '') . ")";
     }
     return self::makeTextCriteria($tocompute, $val, $nott, $link);
 }
 /**
  * Show consumable validation
  */
 function showConsumableValidation()
 {
     global $CFG_GLPI;
     if (!$this->canView()) {
         return false;
     }
     // Wizard title
     echo "<div class='consumables_wizard_title'><p>";
     echo "<img class='consumables_wizard_img' src='" . $CFG_GLPI['root_doc'] . "/plugins/consumables/pics/consumablevalidation.png' alt='consumablevalidation'/>&nbsp;";
     _e("Consumable validation", "consumables");
     echo "</p></div>";
     $rand = mt_rand();
     $fields = $this->find("`status` NOT IN ('" . CommonITILValidation::REFUSED . "','" . CommonITILValidation::ACCEPTED . "')", "`date_mod`");
     echo "<div class='center'>";
     if (!empty($fields)) {
         if ($this->canValidate()) {
             Html::openMassiveActionsForm('mass' . __CLASS__ . $rand);
             $massiveactionparams = array('item' => __CLASS__, 'container' => 'mass' . __CLASS__ . $rand);
             Html::showMassiveActions($massiveactionparams);
         }
         echo "<table class='tab_cadre_fixe'>";
         echo "<tr>";
         echo "<th colspan='7'>" . self::getTypeName() . "</th>";
         echo "</tr>";
         echo "<tr>";
         echo "<th width='10'>";
         if ($this->canValidate()) {
             echo Html::getCheckAllAsCheckbox('mass' . __CLASS__ . $rand);
         }
         echo "</th>";
         echo "<th>" . __('Requester') . "</th>";
         echo "<th>" . _n('Consumable type', 'Consumable types', 1) . "</th>";
         echo "<th>" . _n('Consumable', 'Consumables', 1) . "</th>";
         echo "<th>" . __('Number', 'consumables') . "</th>";
         echo "<th>" . __("Give to") . "</th>";
         echo "<th>" . _sx("item", "State") . "</th>";
         echo "</tr>";
         foreach ($fields as $field) {
             echo "<tr class='tab_bg_1'>";
             echo "<td width='10'>";
             if ($this->canValidate()) {
                 Html::showMassiveActionCheckBox(__CLASS__, $field['id']);
             }
             echo "</td>";
             echo "<td>";
             echo getUserName($field['requesters_id']);
             echo "</td>";
             echo "<td>";
             echo Dropdown::getDropdownName("glpi_consumableitemtypes", $field['consumableitemtypes_id']);
             echo "</td>";
             echo "<td>";
             echo Dropdown::getDropdownName("glpi_consumableitems", $field['consumables_id']);
             echo "</td>";
             echo "<td>";
             echo $field['number'];
             echo "</td>";
             echo "<td>";
             if (!empty($field['give_itemtype'])) {
                 $give_item = getItemForItemtype($field['give_itemtype']);
                 $give_item->getFromDB($field['give_items_id']);
                 echo $give_item->getLink();
             }
             echo "</td>";
             echo "<td>";
             $bgcolor = CommonITILValidation::getStatusColor($field['status']);
             $status = CommonITILValidation::getStatus($field['status']);
             echo "<div style='background-color:" . $bgcolor . ";'>" . $status . "</div>";
             echo "</td>";
             echo "</tr>";
         }
         if ($this->canValidate()) {
             $massiveactionparams['ontop'] = false;
             Html::showMassiveActions($massiveactionparams);
             Html::closeForm();
         }
         echo "</table>";
     } else {
         echo __("No item to display");
     }
     echo "</div>";
     // Footer
     if ($this->canCreate() && $this->canValidate()) {
         echo "<br/><table width='100%'>";
         echo "<tr>";
         echo "<td class='consumables_wizard_button'>";
         echo "<div id='dialog-confirm'></div>";
         echo "<input type=\"button\" class=\"consumable_previous_button submit\" name=\"previous\" value=\"" . _sx('button', 'Cancel') . "\" onclick=\"consumables_cancel('" . $CFG_GLPI['root_doc'] . "/plugins/consumables/front/wizard.php');\">";
         echo "<input type='hidden' name='requesters_id' value='" . Session::getLoginUserID() . "'>";
         echo "</td>";
         echo "</tr>";
         echo "</table>";
     }
     // Init consumable cart javascript
     echo "<script type='text/javascript'>";
     echo "consumables_initJs('" . $CFG_GLPI['root_doc'] . "');";
     echo "</script>";
 }
 /**
  * Show list of items
  * 
  * @param type $fields
  */
 function listItemsForUser($requesters_id, $options = array())
 {
     $params['begin_date'] = "NULL";
     $params['end_date'] = "NULL";
     foreach ($options as $key => $val) {
         $params[$key] = $val;
     }
     $data = $this->find('`requesters_id` = ' . $requesters_id . " " . "AND `end_date` >= '" . $params['begin_date'] . "' " . "AND (`end_date` <= '" . $params['end_date'] . "' OR `end_date` IS NULL)", "`end_date` DESC");
     $message = null;
     if (!empty($data)) {
         $message .= "<table class='tab_cadre_fixe'>";
         $message .= "<tr>";
         $message .= "<th colspan='7'>" . __('Consumable request report', 'consumables') . "</th>";
         $message .= "</tr>";
         $message .= "<tr>";
         $message .= "<th>" . _n('Consumable', 'Consumables', 1) . "</th>";
         $message .= "<th>" . _n('Consumable type', 'Consumable types', 1) . "</th>";
         $message .= "<th>" . __('Requester') . "</th>";
         $message .= "<th>" . __('Approver') . "</th>";
         $message .= "<th>" . __('Number of used consumables') . "</th>";
         $message .= "<th>" . __('Request date') . "</th>";
         $message .= "<th>" . __('Status') . "</th>";
         $message .= "</tr>";
         $consumable = new ConsumableItem();
         foreach ($data as $field) {
             $message .= "<tr class='tab_bg_1'>";
             $consumable->getFromDB($field['consumables_id']);
             $message .= "<td>" . $consumable->getLink() . "</td>";
             $message .= "<td>" . Dropdown::getDropdownName(ConsumableItemType::getTable(), $field['consumableitemtypes_id']) . "</td>";
             $message .= "<td>" . getUserName($field['requesters_id']) . "</td>";
             $message .= "<td>" . getUserName($field['validators_id']) . "</td>";
             $message .= "<td>" . $field['number'] . "</td>";
             $message .= "<td>" . Html::convDateTime($field['date_mod']) . "</td>";
             $message .= "<td>";
             $bgcolor = CommonITILValidation::getStatusColor($field['status']);
             $status = CommonITILValidation::getStatus($field['status']);
             $message .= "<div style='background-color:" . $bgcolor . ";'>" . $status . "</div>";
             $message .= "</td>";
             $message .= "</tr>";
         }
         $message .= "</table>";
         $message .= "</div>";
     } else {
         $message .= "<div class='center'>";
         $message .= "<table class='tab_cadre_fixe'>";
         $message .= "<tr>";
         $message .= "<th colspan='6'>" . __('Consumable request report', 'consumables') . "</th>";
         $message .= "</tr>";
         $message .= "<tr><td class='center'>" . __('No item found') . "</td></tr>";
         $message .= "</table>";
     }
     return array('success' => true, 'message' => $message);
 }