glpi-plugin-auf : ajout rapport parc physique
authorProgfou <jean-christophe.andre@auf.org>
Tue, 1 Apr 2014 16:00:26 +0000 (12:00 -0400)
committerProgfou <jean-christophe.andre@auf.org>
Tue, 1 Apr 2014 16:00:26 +0000 (12:00 -0400)
glpi-plugin-auf/plugin/report.computers.php [new file with mode: 0644]
glpi-plugin-auf/plugin/report.operatingsystems.php
glpi-plugin-auf/plugin/setup.php

diff --git a/glpi-plugin-auf/plugin/report.computers.php b/glpi-plugin-auf/plugin/report.computers.php
new file mode 100644 (file)
index 0000000..d37511a
--- /dev/null
@@ -0,0 +1,225 @@
+<?php
+//Options for GLPI 0.71 and newer : need slave db to access the report
+$USEDBREPLICATE=1;
+$DBCONNECTION_REQUIRED=0;
+
+include ("../../inc/includes.php");
+
+Session::checkRight("reports", "r");
+Session::checkRight("computer", "r");
+
+#Html::header(Report::getTypeName(2), $_SERVER['PHP_SELF'], "utils", "report");
+Html::header("Ordinateurs par implantation", $_SERVER['PHP_SELF'], "utils", "report");
+Report::title();
+
+$computer = new Computer();
+
+$state_sql = "";
+if (($state != "") AND ($state != "0")) {
+   $state_sql = " AND `states_id` = '".$state."' ";
+}
+
+$itemtype = 'Computer';
+$table_item = getTableForItemType($itemtype);
+
+function svg_circle($color, $size=4) {
+  $r = (int)$size; $cx = $r+1; $cy = $r+1;
+  $svg = '<svg width="'.(2+2*$r).'" height="'.(2+2*$r).'" style="margin: 1px;">';
+  $svg .= "<circle cx='$cx' cy='$cy' r='$r' stroke='black' stroke-width='0' fill='$color' />";
+  $svg .= '</svg>';
+  return $svg;
+}
+
+function svg_pie_chart($values, $size=16) {
+  $colors = Array("#ffa0a0", "#a0ffa0", "#ffffa0", "#a0a0ff"); $color_idx = 0;
+  $total = 0.0; foreach ($values as $v) { $total += $v; }
+  $r = (int)$size; $cx = $r+1; $cy = $r+1; $rad = 2*pi()/$total; $old_a = 0;
+  $svg = '<svg width="'.(2+2*$r).'" height="'.(2+2*$r).'" style="margin: 1px;">';
+  foreach ($values as $a) {
+    $x1 = $cx + $r * cos(-$old_a * $rad);
+    $y1 = $cy + $r * sin(-$old_a * $rad);
+    $x2 = $cx + $r * cos(-($old_a + $a) * $rad);
+    $y2 = $cy + $r * sin(-($old_a + $a) * $rad);
+    $big = ($a > ($total/2)) ? '1' : '0';
+    $color = $colors[$color_idx++];
+    $svg .= "<path d=\"M$cx,$cy L$x1,$y1 A$r,$r 0 $big,0 $x2,$y2 z\" style=\"stroke: 0 black; fill: $color;\" />";
+    $old_a += $a;
+  }
+  $svg .= '</svg>';
+  return $svg;
+}
+
+echo "\n<span class='big b'>Ordinateurs par implantation</span><br><br>";
+echo "<table class='tab_cadrehov'>";
+echo "<tr class='tab_bg_1'><th rowspan='2' colspan='2'>Implantation</th>";
+echo "<th colspan='2'>".svg_circle("#ffa0a0")." Serveurs</th>";
+echo "<th colspan='2'>".svg_circle("#a0ffa0")." Clients internes</th>";
+echo "<th colspan='2'>".svg_circle("#ffffa0")." Clients publics</th>";
+echo "<th rowspan='2'>Total<br /><span style='font-size: 75%'>(+ sans statut)</span></th>";
+echo "<th rowspan='2'>".svg_circle("#a0a0ff")." Virtuels</th></tr>";
+echo "<tr class='tab_bg_1'><th>Total</th><th>Production</th>";
+echo "<th>Total</th><th>Attribué</th><th>Total</th><th>Attribué</th></tr>\n";
+
+# récupération de la liste des régions
+$grand_total = 0;
+$query = "SELECT id FROM glpi_entities WHERE (id=0 OR entities_id=0)";
+$query .= " ".getEntitiesRestrictRequest("AND", "glpi_entities")." ORDER BY name";
+$region_result = $DB->query($query);
+# parcours des régions
+while ($region_data = $DB->fetch_assoc($region_result)) {
+  $region_id = $region_data['id'];
+  if ($region_id != 0) {
+    $region_name = getTreeLeafValueName("glpi_entities", $region_id);
+  } else {
+    $region_name = "AUF";
+  }
+  $table_lines = Array();
+  $region_serveurs_total = 0; $region_serveurs_prod = 0;
+  $region_internes_total = 0; $region_internes_prod = 0;
+  $region_publics_total = 0; $region_publics_prod = 0;
+  $region_total = 0; $region_virtuels_total = 0;
+  $region_autres_total = 0;
+
+  # récupération de la liste des implantations
+  $query = "SELECT id,level FROM glpi_entities WHERE ";
+  if ($region_id != 0) {
+    $query .= getRealQueryForTreeItem("glpi_entities", $region_id, "id");
+  } else {
+    $query .= "id=0";
+  }
+  $query .= " ".getEntitiesRestrictRequest("AND", "glpi_entities")." ORDER BY name";
+  $implant_result = $DB->query($query);
+  # parcours des implantations
+  while ($implant_data = $DB->fetch_assoc($implant_result)) {
+    $implant_id = $implant_data['id'];
+    if ($implant_id != 0) {
+      $implant_name = getTreeLeafValueName("glpi_entities", $implant_id);
+    } else {
+      $implant_name = "<i>(non classé)</i>";
+    }
+
+    # récupération de la liste des systèmes de l'implantation
+    $nb_serveurs_total = 0; $nb_serveurs_prod = 0;
+    $nb_internes_total = 0; $nb_internes_prod = 0;
+    $nb_publics_total = 0;  $nb_publics_prod = 0;
+    $nb_virtuels_total = 0; $nb_autres_total = 0;
+    $query = "SELECT COUNT(c.id) AS count, s.id AS sid, s.completename AS sname
+              FROM `$table_item` c
+              LEFT JOIN glpi_entities e ON (c.entities_id = e.id)
+              LEFT JOIN glpi_states s ON (c.states_id = s.id)
+              WHERE c.is_deleted = '0' AND c.is_template = '0'
+                AND c.entities_id = '".$implant_id."'
+              GROUP BY 2 ORDER BY 2";
+    $result = $DB->query($query);
+    while ($data=$DB->fetch_assoc($result)) {
+      if (preg_match("/^système.*virtu.l/i", $data['sname'])) {
+        $nb_virtuels_total += $data['count'];
+      } elseif (preg_match("/^réserv.*serveur.*test/i", $data['sname'])) {
+        $nb_serveurs_total += $data['count'];
+      } elseif (preg_match("/^attrib.*serveur.*production/i", $data['sname'])) {
+        $nb_serveurs_total += $data['count'];
+        $nb_serveurs_prod += $data['count'];
+      } elseif (preg_match("/^réserv.*poste.*mission/i", $data['sname'])) {
+        $nb_internes_total += $data['count'];
+      } elseif (preg_match("/^attrib.*poste.*interne/i", $data['sname'])) {
+        $nb_internes_total += $data['count'];
+        $nb_internes_prod += $data['count'];
+      } elseif (preg_match("/^réserv.*poste.*stock/i", $data['sname'])) {
+        $nb_publics_total += $data['count'];
+      } elseif (preg_match("/^attrib.*poste.*public/i", $data['sname'])) {
+        $nb_publics_total += $data['count'];
+        $nb_publics_prod += $data['count'];
+      } elseif (preg_match("/^sortie/i", $data['sname'])) {
+        // on ne compte pas les sorties d'inventaire
+      } else {
+        $nb_autres_total += $data['count'];
+      }
+    } // systèmes dans l'implantation
+
+    $total = $nb_serveurs_total + $nb_internes_total + $nb_publics_total + $nb_autres_total;
+    if ($total > 0) {
+      $spaces = "";
+      for ($i=1;$i<$implant_data['level'];$i++) { $spaces .= "&nbsp;&nbsp;"; }
+      $line = "<tr><td class='tab_bg_1'>".$spaces.$implant_name."</td>";
+      $line .= "<td class='numeric'>".$nb_serveurs_total."</td>";
+      $line .= "<td class='numeric'>".$nb_serveurs_prod."</td>";
+      $line .= "<td class='numeric'>".$nb_internes_total."</td>";
+      $line .= "<td class='numeric'>".$nb_internes_prod."</td>";
+      $line .= "<td class='numeric'>".$nb_publics_total."</td>";
+      $line .= "<td class='numeric'>".$nb_publics_prod."</td>";
+      $autres = ($nb_autres_total > 0) ? "(".$nb_autres_total." +) " : "";
+      $line .= "<td class='numeric tab_bg_1'>".$autres.$total."</td>";
+      $line .= "<td class='numeric'>".$nb_virtuels_total."</td></tr>";
+      $table_lines[] = $line;
+    }
+    $region_serveurs_total += $nb_serveurs_total;
+    $region_serveurs_prod += $nb_serveurs_prod;
+    $region_internes_total += $nb_internes_total;
+    $region_internes_prod += $nb_internes_prod;
+    $region_publics_total += $nb_publics_total;
+    $region_publics_prod += $nb_publics_prod;
+    $region_total += $total;
+    $region_virtuels_total += $nb_virtuels_total;
+    $region_autres_total += $nb_autres_total;
+    //$table_lines[] = "<tr><td>".$implant_name."</td></tr>";
+  } // fin des implantations de la région
+
+  $line = "<tr class='tab_bg_1 b'><td>Sous-total</td>";
+  $line .= "<td class='numeric'>".$region_serveurs_total."</td>";
+  $line .= "<td class='numeric'>".$region_serveurs_prod."</td>";
+  $line .= "<td class='numeric'>".$region_internes_total."</td>";
+  $line .= "<td class='numeric'>".$region_internes_prod."</td>";
+  $line .= "<td class='numeric'>".$region_publics_total."</td>";
+  $line .= "<td class='numeric'>".$region_publics_prod."</td>";
+  $autres = ($region_autres_total > 0) ? "(".$region_autres_total." +) " : "";
+  $line .= "<td class='numeric tab_bg_1'>".$autres.$region_total."</td>";
+  $line .= "<td class='numeric'>".$region_virtuels_total."</td></tr>";
+  $table_lines[] = $line;
+
+  $region_name = svg_pie_chart(Array($region_serveurs_total, $region_internes_total, $region_publics_total, $region_virtuels_total), 16) . $region_name;
+  $table_lines[0] = str_replace("<tr>", "<tr><td class='tab_bg_1 b' rowspan='".count($table_lines)."'>$region_name</td>", $table_lines[0]);
+  echo implode("\n", $table_lines);
+
+  $grand_serveurs_total += $region_serveurs_total;
+  $grand_serveurs_prod += $region_serveurs_prod;
+  $grand_internes_total += $region_internes_total;
+  $grand_internes_prod += $region_internes_prod;
+  $grand_publics_total += $region_publics_total;
+  $grand_publics_prod += $region_publics_prod;
+  $grand_total += $region_total;
+  $grand_virtuels_total += $region_virtuels_total;
+  $grand_autres_total += $region_autres_total;
+} // fin des régions
+
+// echo "<tr class='tab_bg_1'><td colspan='8'>&nbsp;</td></tr>";
+
+/*
+# total operating systems
+$query = "SELECT COUNT(DISTINCT fia.`tag`) FROM `".$table_item."`
+          LEFT JOIN `glpi_computers_items` ci
+          ON (ci.`itemtype` = '".$itemtype."'
+          AND ci.`items_id` = `".$table_item."`.`id`)
+          LEFT JOIN `glpi_plugin_fusioninventory_agents` fia
+          ON (fia.`computers_id` = `".$table_item."`.`id`)
+          WHERE `".$table_item."`.`is_deleted` = '0'
+            AND `".$table_item."`.`is_template` = '0' ".
+          getEntitiesRestrictRequest("AND", $table_item);
+$result = $DB->query($query);
+$grand_total = $DB->result($result, 0, 0);
+*/
+$line = "<tr class='tab_bg_1'><td class='b' colspan='2'>Total général</td>";
+$line .= "<td class='numeric b'>".$grand_serveurs_total."</td>";
+$line .= "<td class='numeric b'>".$grand_serveurs_prod."</td>";
+$line .= "<td class='numeric b'>".$grand_internes_total."</td>";
+$line .= "<td class='numeric b'>".$grand_internes_prod."</td>";
+$line .= "<td class='numeric b'>".$grand_publics_total."</td>";
+$line .= "<td class='numeric b'>".$grand_publics_prod."</td>";
+$autres = ($grand_autres_total > 0) ? "(".$grand_autres_total." +) " : "";
+$line .= "<td class='numeric b'>".$autres.$grand_total."</td>";
+$line .= "<td class='numeric b'>$grand_virtuels_total</td></tr>";
+echo $line;
+
+echo "</table>";
+
+Html::footer();
+?>
index b061b84..87bcdc2 100644 (file)
@@ -58,7 +58,6 @@ $query = "SELECT COUNT(c.id) AS count, e.name AS ename,
                 WHEN o.name REGEXP '^Mac ' THEN REPLACE(o.name,'Mac ','')
                 ELSE o.name END) AS oname
           FROM `$table_item` c
-          LEFT JOIN glpi_computers_items i ON (i.itemtype = 'Computer' AND i.items_id = c.id)
           LEFT JOIN glpi_entities e ON (c.entities_id = e.id)
           LEFT JOIN glpi_operatingsystems o ON (c.operatingsystems_id = o.id)
           WHERE c.is_deleted = '0' AND c.is_template = '0'
index 829e1b4..459f09d 100644 (file)
@@ -19,7 +19,8 @@ function plugin_init_auf() {
          $report_list = array();
          if (Session::haveRight("computer", "r")) {
             $report_list["report.operatingsystems.php"] = "Systèmes d'exploitation par implantation";
-            $report_list["report.wip.php"] = 'WIP (rapport en cours de développement)';
+            $report_list["report.computers.php"] = "Ordinateurs par implantation";
+            // $report_list["report.wip.php"] = 'WIP (rapport en cours de développement)';
          }
          $PLUGIN_HOOKS['reports']['auf'] = $report_list;
       }
@@ -30,7 +31,7 @@ function plugin_init_auf() {
 function plugin_version_auf() {
    return array(
       'name'           => 'AUF',
-      'version'        => '0.1.0',
+      'version'        => '0.2.0',
       'author'         => 'Jean Christophe André',
       'license'        => 'GPLv2+',
       'homepage'       => 'http://git.auf.org/?p=glpi',