3232
3333namespace GlpiPlugin \Carbon \Dashboard ;
3434
35- use Computer ;
36- use ComputerModel ;
35+ use Computer as GlpiComputer ;
36+ use ComputerModel as GlpiComputerModel ;
3737use ComputerType as GlpiComputerType ;
3838use DateInterval ;
3939use DateTime ;
5252use GlpiPlugin \Carbon \UsageImpact ;
5353use Glpi \DBAL \QueryExpression ;
5454use Glpi \DBAL \QuerySubQuery ;
55- use Monitor ;
56- use Network ;
57- use NetworkEquipment ;
5855use Search ;
5956use Session ;
6057use Toolbox as GlpiToolbox ;
@@ -112,37 +109,59 @@ public static function getSumUsageEmissionsPerModel(array $params = [], array $w
112109 /** @var DBmysql $DB */
113110 global $ DB ;
114111
115- $ computermodels_table = ComputerModel ::getTable ();
112+ $ glpi_computermodels_table = GlpiComputerModel ::getTable ();
116113 $ carbonemissions_table = CarbonEmission::getTable ();
114+ $ glpi_computer_table = getTableForItemType (GlpiComputer::class);
115+ $ computer_type_table = getTableForItemType (ComputerType::class);
117116
118117 $ sql_year_month = "DATE_FORMAT(`date`, '%Y-%m') " ;
119118 $ entity_restrict = (new DbUtils ())->getEntitiesRestrictCriteria ($ carbonemissions_table , '' , '' , 'auto ' );
120119 $ subrequest = [
121120 'SELECT ' => [
122- ComputerModel::getTableField ('id ' ),
123- ComputerModel::getTableField ('name ' ),
124- /** */
121+ GlpiComputerModel::getTableField ('id ' ),
122+ GlpiComputerModel::getTableField ('name ' ),
125123 new QueryExpression ("$ sql_year_month as `date` " ),
126124 'SUM ' => 'emission_per_day AS monthly_emission_per_model ' ,
127125 new QueryExpression ('COUNT(DISTINCT ' . CarbonEmission::getTableField ('items_id ' ) . ') AS nb_computers_per_model ' ),
128126 ],
129- 'FROM ' => $ computermodels_table ,
127+ 'FROM ' => $ glpi_computermodels_table ,
130128 'INNER JOIN ' => [
131129 $ carbonemissions_table => [
132130 'FKEY ' => [
133131 $ carbonemissions_table => 'models_id ' ,
134- $ computermodels_table => 'id '
132+ $ glpi_computermodels_table => 'id '
135133 ]
136134 ],
135+ $ glpi_computer_table => [
136+ 'FKEY ' => [
137+ $ carbonemissions_table => 'items_id ' ,
138+ $ glpi_computer_table => 'id ' ,
139+ [
140+ 'AND ' => [CarbonEmission::getTableField ('itemtype ' ) => GlpiComputer::class]
141+ ]
142+ ]
143+ ]
144+ ],
145+ 'LEFT JOIN ' => [
146+ $ computer_type_table => [
147+ 'FKEY ' => [
148+ $ glpi_computer_table => 'computertypes_id ' ,
149+ $ computer_type_table => 'computertypes_id ' ,
150+ ]
151+ ]
137152 ],
138153 'WHERE ' => [
139- CarbonEmission::getTableField ('itemtype ' ) => Computer::class
154+ CarbonEmission::getTableField ('itemtype ' ) => GlpiComputer::class,
155+ 'OR ' => [
156+ [ComputerType::getTableField ('is_ignore ' ) => 0 ],
157+ [ComputerType::getTableField ('is_ignore ' ) => null ],
158+ ]
140159 ] + $ entity_restrict + $ where ,
141160 'GROUPBY ' => [
142- ComputerModel ::getTableField ('id ' ),
161+ GlpiComputerModel ::getTableField ('id ' ),
143162 new QueryExpression ($ sql_year_month )
144163 ],
145- 'ORDER ' => ComputerModel ::getTableField ('name ' ),
164+ 'ORDER ' => GlpiComputerModel ::getTableField ('name ' ),
146165 ];
147166
148167 $ request = [
@@ -160,7 +179,7 @@ public static function getSumUsageEmissionsPerModel(array $params = [], array $w
160179 ];
161180
162181 if ($ where !== []) {
163- $ filter_criteria = self ::getFiltersCriteria (Computer ::getTable (), []);
182+ $ filter_criteria = self ::getFiltersCriteria (GlpiComputer ::getTable (), []);
164183 $ request ['WHERE ' ] += $ filter_criteria ;
165184 }
166185 $ result = $ DB ->request ($ request );
@@ -199,9 +218,9 @@ public static function getSumUsageEmissionsPerModel(array $params = [], array $w
199218 foreach ($ result as $ row ) {
200219 $ count = $ row ['nb_computers_per_model ' ];
201220 $ data ['series ' ][] = (float ) $ emissions ['serie ' ][$ row ['id ' ]];
202- $ data ['labels ' ][] = $ row ['name ' ] . " ( " . $ row ['nb_computers_per_model ' ] . " " . Computer ::getTypeName ($ count ) . ") " ;
221+ $ data ['labels ' ][] = $ row ['name ' ] . " ( " . $ row ['nb_computers_per_model ' ] . " " . GlpiComputer ::getTypeName ($ count ) . ") " ;
203222 $ models_id = $ row ['id ' ];
204- $ data ['url ' ][] = Computer ::getSearchURL () . '? ' . GlpiToolbox::append_params ($ search_criteria );
223+ $ data ['url ' ][] = GlpiComputer ::getSearchURL () . '? ' . GlpiToolbox::append_params ($ search_criteria );
205224 }
206225
207226 $ data ['unit ' ] = $ emissions ['unit ' ];
@@ -211,54 +230,126 @@ public static function getSumUsageEmissionsPerModel(array $params = [], array $w
211230 ];
212231 }
213232
214- public static function getSumEmissionsPerType (array $ where = [])
233+ /**
234+ * Undocumented function
235+ *
236+ * @param array $where
237+ * @return array
238+ */
239+ public static function getSumUsageEmissionsPerType (array $ where = []): array
215240 {
216241 /** @var DBmysql $DB */
217242 global $ DB ;
218243
219- $ glpicomputertypes_table = GlpiComputerType::getTable ();
244+ $ glpi_computertypes_table = GlpiComputerType::getTable ();
220245 $ carbonemissions_table = CarbonEmission::getTable ();
246+ $ computer_type_table = getTableForItemType (ComputerType::class);
221247
248+ $ sql_year_month = "DATE_FORMAT(`date`, '%Y-%m') " ;
222249 $ entity_restrict = (new DbUtils ())->getEntitiesRestrictCriteria ($ carbonemissions_table , '' , '' , 'auto ' );
223- $ request = [
250+ $ subrequest = [
224251 'SELECT ' => [
225252 GlpiComputerType::getTableField ('id ' ),
226253 GlpiComputerType::getTableField ('name ' ),
227- 'SUM ' => 'emission_per_day AS total_per_type ' ,
254+ new QueryExpression ("$ sql_year_month as `date` " ),
255+ 'SUM ' => 'emission_per_day AS monthly_emission_per_type ' ,
228256 new QueryExpression ('COUNT(DISTINCT ' . CarbonEmission::getTableField ('items_id ' ) . ') AS nb_computers_per_type ' ),
229257 ],
230- 'FROM ' => $ glpicomputertypes_table ,
258+ 'FROM ' => $ glpi_computertypes_table ,
231259 'INNER JOIN ' => [
232260 $ carbonemissions_table => [
233261 'FKEY ' => [
234262 $ carbonemissions_table => 'types_id ' ,
235- $ glpicomputertypes_table => 'id '
263+ $ glpi_computertypes_table => 'id '
236264 ]
237265 ],
238266 ],
267+ 'LEFT JOIN ' => [
268+ $ computer_type_table => [
269+ 'FKEY ' => [
270+ $ glpi_computertypes_table => 'id ' ,
271+ $ computer_type_table => 'computertypes_id ' ,
272+ ]
273+ ]
274+ ],
239275 'WHERE ' => [
240- CarbonEmission::getTableField ('itemtype ' ) => Computer::class
241- ] + $ entity_restrict ,
242- 'GROUPBY ' => GlpiComputerType::getTableField ('id ' ),
276+ CarbonEmission::getTableField ('itemtype ' ) => GlpiComputer::class,
277+ 'OR ' => [
278+ [ComputerType::getTableField ('is_ignore ' ) => 0 ],
279+ [ComputerType::getTableField ('is_ignore ' ) => null ],
280+ ]
281+ ] + $ entity_restrict + $ where ,
282+ 'GROUPBY ' => [
283+ GlpiComputerType::getTableField ('id ' ),
284+ new QueryExpression ($ sql_year_month )
285+ ],
243286 'ORDER ' => GlpiComputerType::getTableField ('name ' ),
244287 ];
245288
289+ $ request = [
290+ 'SELECT ' => [
291+ 'id ' ,
292+ 'name ' ,
293+ 'AVG ' => 'monthly_emission_per_type AS total_per_type ' ,
294+ 'MAX ' => 'nb_computers_per_type AS nb_computers_per_type '
295+ ],
296+ 'FROM ' => new QuerySubQuery ($ subrequest , 'montly_per_type ' ),
297+ 'WHERE ' => [],
298+ 'GROUPBY ' => ['id ' ],
299+ 'ORDERBY ' => 'total_per_type DESC ' ,
300+ 'LIMIT ' => $ params ['limit ' ] ?? 9999
301+ ];
302+
246303 if ($ where !== []) {
247- $ request ['WHERE ' ] += $ where ;
304+ $ filter_criteria = self ::getFiltersCriteria (GlpiComputer::getTable (), []);
305+ $ request ['WHERE ' ] += $ filter_criteria ;
248306 }
249307 $ result = $ DB ->request ($ request );
250308
251- $ data = [];
309+ $ emissions = [];
310+ foreach ($ result as $ row ) {
311+ $ emissions [$ row ['id ' ]] = $ row ['total_per_type ' ];
312+ }
313+ $ co2eq = __ ('CO₂eq ' , 'carbon ' );
314+ $ units = [
315+ __ ('g ' , 'carbon ' ) . ' ' . $ co2eq ,
316+ __ ('Kg ' , 'carbon ' ) . ' ' . $ co2eq ,
317+ __ ('t ' , 'carbon ' ) . ' ' . $ co2eq ,
318+ __ ('Kt ' , 'carbon ' ) . ' ' . $ co2eq ,
319+ __ ('Mt ' , 'carbon ' ) . ' ' . $ co2eq ,
320+ __ ('Gt ' , 'carbon ' ) . ' ' . $ co2eq ,
321+ __ ('Tt ' , 'carbon ' ) . ' ' . $ co2eq ,
322+ __ ('Pt ' , 'carbon ' ) . ' ' . $ co2eq ,
323+ __ ('Et ' , 'carbon ' ) . ' ' . $ co2eq ,
324+ __ ('Zt ' , 'carbon ' ) . ' ' . $ co2eq ,
325+ __ ('Yt ' , 'carbon ' ) . ' ' . $ co2eq ,
326+ ];
327+ $ emissions = Toolbox::scaleSerie ($ emissions , $ units );
328+ $ types_id = null ;
329+ $ search_criteria = [
330+ 'criteria ' => [
331+ [
332+ 'field ' => 40 ,
333+ 'searchtype ' => 'equals ' ,
334+ 'value ' => &$ types_id // Reference to $types_id !
335+ ],
336+ ],
337+ 'reset ' => 'reset '
338+ ];
339+
252340 foreach ($ result as $ row ) {
253341 $ count = $ row ['nb_computers_per_type ' ];
254- $ data [] = [
255- 'number ' => number_format ($ row ['total_per_type ' ], PLUGIN_CARBON_DECIMALS , ', ' , '' ),
256- 'url ' => GlpiComputerType::getFormURLWithID ($ row ['id ' ]),
257- 'label ' => $ row ['name ' ] . " ( " . $ row ['nb_computers_per_type ' ] . " " . Computer::getTypeName ($ count ) . ") " ,
258- ];
342+ $ data ['series ' ][] = (float ) $ emissions ['serie ' ][$ row ['id ' ]];
343+ $ data ['labels ' ][] = $ row ['name ' ] . " ( " . $ row ['nb_computers_per_type ' ] . " " . GlpiComputer::getTypeName ($ count ) . ") " ;
344+ $ types_id = $ row ['id ' ];
345+ $ data ['url ' ][] = GlpiComputer::getSearchURL () . '? ' . GlpiToolbox::append_params ($ search_criteria );
259346 }
260347
261- return $ data ;
348+ $ data ['unit ' ] = $ emissions ['unit ' ];
349+
350+ return [
351+ 'data ' => $ data
352+ ];
262353 }
263354
264355 /**
@@ -272,18 +363,18 @@ public static function getSumPowerPerModel(array $where = [])
272363 /** @var DBmysql $DB */
273364 global $ DB ;
274365
275- $ computers_table = Computer ::getTable ();
276- $ computermodels_table = ComputerModel ::getTable ();
366+ $ computers_table = GlpiComputer ::getTable ();
367+ $ computermodels_table = GlpiComputerModel ::getTable ();
277368 $ glpiComputertypes_table = GlpiComputerType::getTable ();
278369 $ computertype_table = ComputerType::getTable ();
279370
280371 $ entity_restrict = (new DbUtils ())->getEntitiesRestrictCriteria ($ computers_table , '' , '' , 'auto ' );
281372 $ request = [
282373 'SELECT ' => [
283- ComputerModel ::getTableField ('id ' ),
284- ComputerModel ::getTableField ('name ' ),
285- 'SUM ' => ComputerModel ::getTableField ('power_consumption ' ) . ' AS total_per_model ' ,
286- 'COUNT ' => Computer ::getTableField ('id ' ) . ' AS nb_computers_per_model ' ,
374+ GlpiComputerModel ::getTableField ('id ' ),
375+ GlpiComputerModel ::getTableField ('name ' ),
376+ 'SUM ' => GlpiComputerModel ::getTableField ('power_consumption ' ) . ' AS total_per_model ' ,
377+ 'COUNT ' => GlpiComputer ::getTableField ('id ' ) . ' AS nb_computers_per_model ' ,
287378 ],
288379 'FROM ' => $ computermodels_table ,
289380 'INNER JOIN ' => [
@@ -307,8 +398,8 @@ public static function getSumPowerPerModel(array $where = [])
307398 ]
308399 ],
309400 'WHERE ' => $ entity_restrict ,
310- 'GROUPBY ' => ComputerModel ::getTableField ('id ' ),
311- 'ORDER ' => ComputerModel ::getTableField ('name ' ),
401+ 'GROUPBY ' => GlpiComputerModel ::getTableField ('id ' ),
402+ 'ORDER ' => GlpiComputerModel ::getTableField ('name ' ),
312403 ];
313404 if ($ where !== []) {
314405 $ request ['WHERE ' ] += $ where ;
@@ -319,7 +410,7 @@ public static function getSumPowerPerModel(array $where = [])
319410 foreach ($ result as $ row ) {
320411 $ data [] = [
321412 'number ' => number_format ($ row ['total_per_model ' ], PLUGIN_CARBON_DECIMALS ),
322- 'url ' => ComputerModel ::getFormURLWithID ($ row ['id ' ]),
413+ 'url ' => GlpiComputerModel ::getFormURLWithID ($ row ['id ' ]),
323414 'label ' => $ row ['name ' ] . " ( " . $ row ['nb_computers_per_model ' ] . " computers) " ,
324415 ];
325416 }
0 commit comments