/**
* Retrieve last history Data for an item
*
* @param $item CommonDBTM object
* @param $start integer first line to retrieve (default 0)
* @param $limit integer max number of line to retrive (0 for all) (default 0)
* @param $sqlfilter string to add an SQL filter (default '')
*
* @return array of localized log entry (TEXT only, no HTML)
**/
static function getHistoryData(CommonDBTM $item, $start = 0, $limit = 0, $sqlfilter = '')
{
global $DB;
$itemtype = $item->getType();
$items_id = $item->getField('id');
$itemtable = $item->getTable();
$SEARCHOPTION = Search::getOptions($itemtype);
$query = "SELECT *\n FROM `glpi_logs`\n WHERE `items_id` = '{$items_id}'\n AND `itemtype` = '{$itemtype}' ";
if ($sqlfilter) {
$query .= "AND ({$sqlfilter}) ";
}
$query .= "ORDER BY `id` DESC";
if ($limit) {
$query .= " LIMIT " . intval($start) . "," . intval($limit);
}
$changes = array();
foreach ($DB->request($query) as $data) {
$tmp = array();
$tmp['display_history'] = true;
$tmp['id'] = $data["id"];
$tmp['date_mod'] = Html::convDateTime($data["date_mod"]);
$tmp['user_name'] = $data["user_name"];
$tmp['field'] = "";
$tmp['change'] = "";
$tmp['datatype'] = "";
// This is an internal device ?
if ($data["linked_action"]) {
// Yes it is an internal device
switch ($data["linked_action"]) {
case self::HISTORY_CREATE_ITEM:
$tmp['change'] = __('Add the item');
break;
case self::HISTORY_DELETE_ITEM:
$tmp['change'] = __('Delete the item');
break;
case self::HISTORY_LOCK_ITEM:
$tmp['change'] = __('Lock the item');
break;
case self::HISTORY_UNLOCK_ITEM:
$tmp['change'] = __('Unlock the item');
break;
case self::HISTORY_RESTORE_ITEM:
$tmp['change'] = __('Restore the item');
break;
case self::HISTORY_ADD_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the component name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Add the component'), $data["new_value"]);
break;
case self::HISTORY_UPDATE_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
$change = '';
$linktype_field = explode('#', $data["itemtype_link"]);
$linktype = $linktype_field[0];
$field = $linktype_field[1];
$devicetype = $linktype::getDeviceType();
$tmp['field'] = $devicetype;
$specif_fields = $linktype::getSpecificities();
if (isset($specif_fields[$field]['short name'])) {
$tmp['field'] = $devicetype;
$tmp['field'] .= " (" . $specif_fields[$field]['short name'] . ")";
}
//TRANS: %1$s is the old_value, %2$s is the new_value
$tmp['change'] = sprintf(__('Change the component %1$s: %2$s'), $tmp['field'], sprintf(__('%1$s by %2$s'), $data["old_value"], $data["new_value"]));
break;
case self::HISTORY_DELETE_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the component name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Delete the component'), $data["old_value"]);
break;
case self::HISTORY_LOCK_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the component name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Lock the component'), $data["old_value"]);
break;
case self::HISTORY_UNLOCK_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the component name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Unlock the component'), $data["new_value"]);
break;
case self::HISTORY_INSTALL_SOFTWARE:
$tmp['field'] = _n('Software', 'Software', 1);
//TRANS: %s is the software name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Install the software'), $data["new_value"]);
break;
case self::HISTORY_UNINSTALL_SOFTWARE:
$tmp['field'] = _n('Software', 'Software', 1);
//TRANS: %s is the software name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Uninstall the software'), $data["old_value"]);
break;
case self::HISTORY_DISCONNECT_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the item name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Disconnect the item'), $data["old_value"]);
break;
case self::HISTORY_CONNECT_DEVICE:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
//TRANS: %s is the item name
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Connect the item'), $data["new_value"]);
break;
case self::HISTORY_LOG_SIMPLE_MESSAGE:
$tmp['field'] = "";
$tmp['change'] = $data["new_value"];
break;
case self::HISTORY_ADD_RELATION:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Add a link with an item'), $data["new_value"]);
break;
case self::HISTORY_DEL_RELATION:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Delete a link with an item'), $data["old_value"]);
break;
case self::HISTORY_LOCK_RELATION:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Lock a link with an item'), $data["old_value"]);
break;
case self::HISTORY_UNLOCK_RELATION:
$tmp['field'] = NOT_AVAILABLE;
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Unlock a link with an item'), $data["new_value"]);
break;
case self::HISTORY_ADD_SUBITEM:
$tmp['field'] = '';
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Add the item'), sprintf(__('%1$s (%2$s)'), $tmp['field'], $data["new_value"]));
break;
case self::HISTORY_UPDATE_SUBITEM:
$tmp['field'] = '';
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Update the item'), sprintf(__('%1$s (%2$s)'), $tmp['field'], $data["new_value"]));
break;
case self::HISTORY_DELETE_SUBITEM:
$tmp['field'] = '';
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Delete the item'), sprintf(__('%1$s (%2$s)'), $tmp['field'], $data["old_value"]));
break;
case self::HISTORY_LOCK_SUBITEM:
$tmp['field'] = '';
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Lock an item'), sprintf(__('%1$s (%2$s)'), $tmp['field'], $data["old_value"]));
break;
case self::HISTORY_UNLOCK_SUBITEM:
$tmp['field'] = '';
if ($item2 = getItemForItemtype($data["itemtype_link"])) {
$tmp['field'] = $item2->getTypeName(1);
}
$tmp['change'] = sprintf(__('%1$s: %2$s'), __('Unlock an item'), sprintf(__('%1$s (%2$s)'), $tmp['field'], $data["new_value"]));
break;
default:
$fct = array($data['itemtype_link'], 'getHistoryEntry');
if ($data['linked_action'] >= self::HISTORY_PLUGIN && $data['itemtype_link'] && is_callable($fct)) {
$tmp['field'] = $data['itemtype_link']::getTypeName(1);
$tmp['change'] = call_user_func($fct, $data);
}
$tmp['display_history'] = !empty($tmp['change']);
}
} else {
$fieldname = "";
$searchopt = array();
$tablename = '';
// It's not an internal device
foreach ($SEARCHOPTION as $key2 => $val2) {
if ($key2 == $data["id_search_option"]) {
$tmp['field'] = $val2["name"];
$tablename = $val2["table"];
$fieldname = $val2["field"];
$searchopt = $val2;
if (isset($val2['datatype'])) {
$tmp['datatype'] = $val2["datatype"];
}
break;
}
}
if ($itemtable == $tablename) {
switch ($tmp['datatype']) {
// specific case for text field
case 'text':
$tmp['change'] = __('Update of the field');
break;
default:
$data["old_value"] = $item->getValueToDisplay($searchopt, $data["old_value"]);
$data["new_value"] = $item->getValueToDisplay($searchopt, $data["new_value"]);
break;
}
}
if (empty($tmp['change'])) {
$tmp['change'] = sprintf(__('Change %1$s by %2$s'), $data["old_value"], $data["new_value"]);
}
}
$changes[] = $tmp;
}
return $changes;
}