|
Server : Apache System : Linux vps.urbanovitalino.adv.br 3.10.0-1062.12.1.el7.x86_64 #1 SMP Tue Feb 4 23:02:59 UTC 2020 x86_64 User : urbanovitalinoad ( 1001) PHP Version : 7.3.33 Disable Function : exec,passthru,shell_exec,system Directory : /usr/local/apache/htdocs/glpi/inc/ |
Upload File : |
<?php
/**
* ---------------------------------------------------------------------
* GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2015-2018 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* GLPI is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GLPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/**
* Report class
*
* @ since version 0.84
**/
class Report extends CommonGLPI{
static protected $notable = false;
static $rightname = 'reports';
/**
* @since 0.85.3
**/
static function canView() {
return Session::haveRight(self::$rightname, READ);
}
static function getTypeName($nb = 0) {
return _n('Report', 'Reports', $nb);
}
/**
* @see CommonGLPI::getMenuShorcut()
*
* @since 0.85
**/
static function getMenuShorcut() {
return 'e';
}
/**
* Show report title
**/
static function title() {
global $PLUGIN_HOOKS, $CFG_GLPI;
// Report generation
// Default Report included
$report_list["default"]["name"] = __('Default report');
$report_list["default"]["file"] = "report.default.php";
if (Contract::canView()) {
// Rapport ajoute par GLPI V0.2
$report_list["Contrats"]["name"] = __('By contract');
$report_list["Contrats"]["file"] = "report.contract.php";
}
if (Infocom::canView()) {
$report_list["Par_annee"]["name"] = __('By year');
$report_list["Par_annee"]["file"] = "report.year.php";
$report_list["Infocoms"]["name"] = __('Hardware financial and administrative information');
$report_list["Infocoms"]["file"] = "report.infocom.php";
$report_list["Infocoms2"]["name"] = __('Other financial and administrative information (licenses, cartridges, consumables)');
$report_list["Infocoms2"]["file"] = "report.infocom.conso.php";
}
if (Session::haveRight("networking", READ)) {
$report_list["Rapport prises reseau"]["name"] = __('Network report');
$report_list["Rapport prises reseau"]["file"] = "report.networking.php";
}
if (Session::haveRight("reservation", READ)) {
$report_list["reservation"]["name"] = __('Loan');
$report_list["reservation"]["file"] = "report.reservation.php";
}
if (Computer::canView()
|| Monitor::canView()
|| Session::haveRight("networking", READ)
|| Peripheral::canView()
|| Printer::canView()
|| Phone::canView()) {
$report_list["state"]["name"] = _n('Status', 'Statuses', Session::getPluralNumber());
$report_list["state"]["file"] = "report.state.php";
}
//Affichage du tableau de presentation des stats
echo "<table class='tab_cadre_fixe'>";
echo "<tr><th colspan='2'>".__('Select the report you want to generate')."</th></tr>";
echo "<tr class='tab_bg_1'><td class='center'>";
$count = count($report_list);
$selected = -1;
$values = [$CFG_GLPI["root_doc"].'/front/report.php' => Dropdown::EMPTY_VALUE];
foreach ($report_list as $val => $data) {
$name = $data['name'];
$file = $data['file'];
$key = $CFG_GLPI["root_doc"]."/front/".$file;
$values[$key] = $name;
if (stripos($_SERVER['REQUEST_URI'], $key) !== false) {
$selected = $key;
}
}
$names = [];
$optgroup = [];
if (isset($PLUGIN_HOOKS["reports"]) && is_array($PLUGIN_HOOKS["reports"])) {
foreach ($PLUGIN_HOOKS["reports"] as $plug => $pages) {
if (!Plugin::isPluginLoaded($plug)) {
continue;
}
if (is_array($pages) && count($pages)) {
foreach ($pages as $page => $name) {
$names[$plug.'/'.$page] = ["name" => $name,
"plug" => $plug];
$optgroup[$plug] = Plugin::getInfo($plug, 'name');
}
}
}
asort($names);
}
foreach ($optgroup as $opt => $title) {
$group = $title;
foreach ($names as $key => $val) {
if ($opt == $val["plug"]) {
$file = $CFG_GLPI["root_doc"]."/plugins/".$key;
$values[$group][$file] = $val["name"];
if (stripos($_SERVER['REQUEST_URI'], $file) !== false) {
$selected = $file;
}
}
}
}
Dropdown::showFromArray('statmenu', $values,
['on_change' => "window.location.href=this.options[this.selectedIndex].value",
'value' => $selected]);
echo "</td>";
echo "</tr>";
echo "</table>";
}
/**
* Show Default Report
*
* @since 0.84
**/
static function showDefaultReport() {
global $DB;
// Title
echo "<span class='big b'>GLPI ".Report::getTypeName(Session::getPluralNumber())."</span><br><br>";
// 1. Get counts of itemtype
$items = ['Computer', 'Monitor', 'NetworkEquipment', 'Peripheral', 'Phone',
'Printer', 'Software'];
$linkitems = ['Monitor', 'Peripheral', 'Phone', 'Printer'];
echo "<table class='tab_cadrehov'>";
foreach ($items as $itemtype) {
$table_item = getTableForItemType($itemtype);
$criteria = [
'COUNT' => 'cpt',
'FROM' => $table_item,
'WHERE' => [
"$table_item.is_deleted" => 0,
"$table_item.is_template" => 0
] + getEntitiesRestrictCriteria($table_item)
];
if (in_array($itemtype, $linkitems)) {
$criteria['LEFT JOIN'] = [
'glpi_computers_items' => [
'ON' => [
'glpi_computers_items' => 'items_id',
$table_item => 'id', [
'AND' => [
'glpi_computers_items.itemtype' => $itemtype
]
]
]
]
];
}
$result = $DB->request($criteria)->next();
$number = (int)$result['cpt'];
echo "<tr class='tab_bg_2'><td>".$itemtype::getTypeName(Session::getPluralNumber())."</td>";
echo "<td class='numeric'>$number</td></tr>";
}
echo "<tr class='tab_bg_1'><td colspan='2' class='b'>".__('Operating system')."</td></tr>";
// 2. Get some more number data (operating systems per computer)
$iterator = $DB->request([
'SELECT' => [
'COUNT' => '* AS count',
'glpi_operatingsystems.name AS name'
],
'FROM' => 'glpi_items_operatingsystems',
'LEFT JOIN' => [
'glpi_operatingsystems' => [
'ON' => [
'glpi_items_operatingsystems' => 'operatingsystems_id',
'glpi_operatingsystems' => 'id'
]
]
],
'WHERE' => ['is_deleted' => 0],
'GROUPBY' => 'glpi_operatingsystems.name'
]);
while ($data = $iterator->next()) {
if (empty($data['name'])) {
$data['name'] = Dropdown::EMPTY_VALUE;
}
echo "<tr class='tab_bg_2'><td>".$data['name']."</td>";
echo "<td class='numeric'>".$data['count']."</td></tr>";
}
// Get counts of types
$val = array_flip($items);
unset($val["Software"]);
$items = array_flip($val);
foreach ($items as $itemtype) {
echo "<tr class='tab_bg_1'><td colspan='2' class='b'>".$itemtype::getTypeName(Session::getPluralNumber()).
"</td></tr>";
$table_item = getTableForItemType($itemtype);
$typeclass = $itemtype."Type";
$type_table = getTableForItemType($typeclass);
$typefield = getForeignKeyFieldForTable(getTableForItemType($typeclass));
$criteria = [
'SELECT' => [
'COUNT' => '* AS count',
"$type_table.name AS name"
],
'FROM' => $table_item,
'LEFT JOIN' => [
$type_table => [
'ON' => [
$table_item => $typefield,
$type_table => 'id'
]
]
],
'WHERE' => [
"$table_item.is_deleted" => 0,
"$table_item.is_template" => 0
] + getEntitiesRestrictCriteria($table_item),
'GROUPBY' => "$type_table.name"
];
if (in_array($itemtype, $linkitems)) {
$criteria['LEFT JOIN']['glpi_computers_items'] = [
'ON' => [
'glpi_computers_items' => 'items_id',
$table_item => 'id', [
'AND' => [
'glpi_computers_items.itemtype' => $itemtype
]
]
]
];
}
$iterator = $DB->request($criteria);
while ($data = $iterator->next()) {
if (empty($data['name'])) {
$data['name'] = Dropdown:: EMPTY_VALUE;
}
echo "<tr class='tab_bg_2'><td>".$data['name']."</td>";
echo "<td class='numeric'>".$data['count']."</td></tr>";
}
}
echo "</table>";
}
/**
* @since 0.84
*
* @param $networkport_prefix
* @param $networkport_crit
* @param $where_crit
* @param $order (default '')
* @param $field (default '')
* @param $extra (default '')
**/
static function reportForNetworkInformations($networkport_prefix, $networkport_crit,
$where_crit, $order = '', $field = '', $extra = '') {
global $DB;
// This SQL request matches the NetworkPort, then its NetworkName and IPAddreses. It also
// match opposite NetworkPort, then its NetworkName and IPAddresses.
// Results are groupes by NetworkPort. Then all IPs are concatenated by comma as separator.
$query = "SELECT $field
PORT_1.`itemtype` AS itemtype_1,
PORT_1.`items_id` AS items_id_1,
PORT_1.`id` AS id_1,
PORT_1.`name` AS port_1,
PORT_1.`mac` AS mac_1,
PORT_1.`logical_number` AS logical_1,
GROUP_CONCAT(ADDR_1.`name` SEPARATOR ',') AS ip_1,
PORT_2.`itemtype` AS itemtype_2,
PORT_2.`items_id` AS items_id_2,
PORT_2.`id` AS id_2,
PORT_2.`name` AS port_2,
PORT_2.`mac` AS mac_2,
GROUP_CONCAT(ADDR_2.`name` SEPARATOR ',') AS ip_2
FROM $networkport_prefix
INNER JOIN `glpi_networkports` AS PORT_1
ON ($networkport_crit
AND PORT_1.`is_deleted` = 0)
LEFT JOIN `glpi_networknames` AS NAME_1
ON (NAME_1.`itemtype` = 'NetworkPort'
AND PORT_1.`id` = NAME_1.`items_id`
AND NAME_1.`is_deleted` = 0)
LEFT JOIN `glpi_ipaddresses` AS ADDR_1
ON (ADDR_1.`itemtype` = 'NetworkName'
AND NAME_1.`id` = ADDR_1.`items_id`
AND ADDR_1.`is_deleted` = 0)
LEFT JOIN `glpi_networkports_networkports` AS LINK
ON (LINK.`networkports_id_1` = PORT_1.`id`
OR LINK.`networkports_id_2` = PORT_1.`id`)
LEFT JOIN `glpi_networkports` AS PORT_2
ON (PORT_2.`id` = IF(LINK.`networkports_id_1` = PORT_1.`id`,
LINK.`networkports_id_2`,
LINK.`networkports_id_1`))
LEFT JOIN `glpi_networknames` AS NAME_2
ON (NAME_2.`itemtype` = 'NetworkPort'
AND PORT_2.`id` = NAME_2.`items_id`
AND NAME_2.`is_deleted` = 0)
LEFT JOIN `glpi_ipaddresses` AS ADDR_2
ON (ADDR_2.`itemtype` = 'NetworkName'
AND NAME_2.`id` = ADDR_2.`items_id`
AND ADDR_2.`is_deleted` = 0)
WHERE $where_crit
GROUP BY PORT_1.`id`";
if (!empty($order)) {
$query .= "ORDER BY $order";
}
$result = $DB->request($query);
if ($result->numrows() > 0) {
echo "<table class='tab_cadre_fixehov'>";
echo "<tr>";
if (!empty($extra)) {
echo "<td> </td>";
}
echo "<th colspan='5'>".__('Device 1')."</th>";
echo "<th colspan='5'>".__('Device 2')."</th>";
echo "</tr>\n";
echo "<tr>";
if (!empty($extra)) {
echo "<th>$extra</th>";
}
echo "<th>".__('Device type')."</th>";
echo "<th>".__('Device name')."</th>";
echo "<th>".__('Port Number')."</th>";
echo "<th>".NetworkPort::getTypeName(1)."</th>";
echo "<th>".__('MAC address')."</th>";
echo "<th>".IPAddress::getTypeName(0)."</th>";
echo "<th>".NetworkPort::getTypeName(1)."</th>";
echo "<th>".__('MAC address')."</th>";
echo "<th>".IPAddress::getTypeName(0)."</th>";
echo "<th>".__('Device type')."</th>";
echo "<th>".__('Device name')."</th>";
echo "</tr>\n";
foreach ($result as $line) {
echo "<tr class='tab_bg_1'>";
// To ensure that the NetworkEquipment remain the first item, we test its type
if ($line['itemtype_2'] == 'NetworkEquipment') {
$idx = 2;
} else {
$idx = 1;
}
if (!empty($extra)) {
echo "<td>".(empty($line['extra']) ? NOT_AVAILABLE : $line['extra'])."</td>";
}
$itemtype = $line["itemtype_$idx"];
if (!empty($itemtype)) {
echo "<td>".$itemtype::getTypeName(1)."</td>";
$item_name = '';
if ($item = getItemForItemtype($itemtype)) {
if ($item->getFromDB($line["items_id_$idx"])) {
$item_name = $item->getName();
}
}
echo "<td>".(empty($item_name) ? NOT_AVAILABLE : $item_name)."</td>";
} else {
echo "<td> ".NOT_AVAILABLE." </td>";
echo "<td> ".NOT_AVAILABLE." </td>";
}
echo "<td>".(empty($line["logical_$idx"]) ? NOT_AVAILABLE : $line["logical_$idx"])."</td>";
echo "<td>".(empty($line["port_$idx"]) ? NOT_AVAILABLE : $line["port_$idx"])."</td>";
echo "<td>".(empty($line["mac_$idx"]) ? NOT_AVAILABLE : $line["mac_$idx"])."</td>";
echo "<td>".(empty($line["ip_$idx"]) ? NOT_AVAILABLE : $line["ip_$idx"])."</td>";
if ($idx == 1) {
$idx = 2;
} else {
$idx = 1;
}
echo "<td>".(empty($line["port_$idx"]) ? NOT_AVAILABLE : $line["port_$idx"])."</td>";
echo "<td>".(empty($line["mac_$idx"]) ? NOT_AVAILABLE : $line["mac_$idx"])."</td>";
echo "<td>".(empty($line["ip_$idx"]) ? NOT_AVAILABLE : $line["ip_$idx"])."</td>";
$itemtype = $line["itemtype_$idx"];
if (!empty($itemtype)) {
echo "<td>".$itemtype::getTypeName(1)."</td>";
$item_name = '';
if ($item = getItemForItemtype($itemtype)) {
if ($item->getFromDB($line["items_id_$idx"])) {
$item_name = $item->getName();
}
}
echo "<td>".(empty($item_name) ? NOT_AVAILABLE : $item_name)."</td>";
} else {
echo "<td> ".NOT_AVAILABLE." </td>";
echo "<td> ".NOT_AVAILABLE." </td>";
}
echo "</tr>\n";
}
echo "</table><br><hr><br>";
}
}
/**
* @since 0.85
*
* @see commonDBTM::getRights()
**/
function getRights($interface = 'central') {
$values = [ READ => __('Read')];
return $values;
}
}