Skip to content

Commit 9d7be6b

Browse files
committed
feat(Dashboad\Provider): class aliases, emissions per type, add test
1 parent 390f223 commit 9d7be6b

File tree

5 files changed

+301
-93
lines changed

5 files changed

+301
-93
lines changed

src/Dashboard/Dashboard.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,16 +38,16 @@
3838
class Dashboard
3939
{
4040
/**
41-
* Returns total carbon emission per computer type.
41+
* Returns total usage carbon emission per computer type.
4242
*
4343
* @return array of:
4444
* - float 'number': total carbon emission of the type
4545
* - string 'url': url to redirect when clicking on the slice
4646
* - string 'label': name of the computer type
4747
*/
48-
public static function getTotalCarbonEmissionPerType()
48+
public static function getTotalUsageCarbonEmissionPerType()
4949
{
50-
return Provider::getSumEmissionsPerType();
50+
return Provider::getSumUsageEmissionsPerType();
5151
}
5252

5353
/**

src/Dashboard/Grid.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,8 @@
3333
namespace GlpiPlugin\Carbon\Dashboard;
3434

3535
use Computer;
36-
use DateTimeImmutable;
3736
use Glpi\Dashboard\Filter;
38-
use GlpiPlugin\Carbon\CarbonIntensity;
3937
use GlpiPlugin\Carbon\Config;
40-
use GlpiPlugin\Carbon\Toolbox;
41-
use Monitor;
42-
use NetworkEquipment;
4338
use Session;
4439

4540
class Grid

src/Dashboard/Provider.php

Lines changed: 134 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@
3232

3333
namespace GlpiPlugin\Carbon\Dashboard;
3434

35-
use Computer;
36-
use ComputerModel;
35+
use Computer as GlpiComputer;
36+
use ComputerModel as GlpiComputerModel;
3737
use ComputerType as GlpiComputerType;
3838
use DateInterval;
3939
use DateTime;
@@ -52,9 +52,6 @@
5252
use GlpiPlugin\Carbon\UsageImpact;
5353
use Glpi\DBAL\QueryExpression;
5454
use Glpi\DBAL\QuerySubQuery;
55-
use Monitor;
56-
use Network;
57-
use NetworkEquipment;
5855
use Search;
5956
use Session;
6057
use 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
}

tests/src/DbTestCase.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,24 +32,29 @@
3232

3333
namespace GlpiPlugin\Carbon\Tests;
3434

35+
use DBmysql;
36+
3537
class DbTestCase extends CommonTestCase
3638
{
3739
public function setUp(): void
3840
{
41+
/** @var DBmysql $DB */
3942
global $DB;
4043
$DB->beginTransaction();
4144
parent::setUp();
4245
}
4346

4447
public function tearDown(): void
4548
{
49+
/** @var DBmysql $DB */
4650
global $DB;
4751
$DB->rollback();
4852
parent::tearDown();
4953
}
5054

5155
protected function DBVersionCheck()
5256
{
57+
/** @var DBmysql $DB */
5358
global $DB;
5459
$version_string = $DB->getVersion();
5560

0 commit comments

Comments
 (0)