1<?php
2/*
3** Zabbix
4** Copyright (C) 2001-2021 Zabbix SIA
5**
6** This program is free software; you can redistribute it and/or modify
7** it under the terms of the GNU General Public License as published by
8** the Free Software Foundation; either version 2 of the License, or
9** (at your option) any later version.
10**
11** This program is distributed in the hope that it will be useful,
12** but WITHOUT ANY WARRANTY; without even the implied warranty of
13** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14** GNU General Public License for more details.
15**
16** You should have received a copy of the GNU General Public License
17** along with this program; if not, write to the Free Software
18** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19**/
20
21
22/**
23 * @var CView $this
24 */
25
26$this->addJsFile('layout.mode.js');
27$this->includeJsFile('report.services.js.php');
28
29$this->enableLayoutModes();
30$web_layout_mode = $this->getLayoutMode();
31
32$widget = (new CWidget())
33	->setTitle(_('Service availability report').': '.$data['service']['name'])
34	->setWebLayoutMode($web_layout_mode);
35
36$controls = (new CList())
37	->addItem([
38		new CLabel(_('Period'), 'label-period'),
39		(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
40		(new CSelect('period'))
41			->setFocusableElementId('label-period')
42			->setValue($data['period'])
43			->addOptions(CSelect::createOptionsFromArray([
44				'daily' => _('Daily'),
45				'weekly' => _('Weekly'),
46				'monthly' => _('Monthly'),
47				'yearly' => _('Yearly')
48			]))
49	]);
50
51if ($data['period'] != 'yearly') {
52	$years = [];
53	for ($y = (date('Y') - $data['YEAR_LEFT_SHIFT']); $y <= date('Y'); $y++) {
54		$years[$y] = $y;
55	}
56	$controls->addItem([
57		new CLabel(_('Year'), 'label-year'),
58		(new CDiv())->addClass(ZBX_STYLE_FORM_INPUT_MARGIN),
59		(new CSelect('year'))
60			->setFocusableElementId('label-year')
61			->setValue($data['year'])
62			->addOptions(CSelect::createOptionsFromArray($years))
63	]);
64}
65
66$widget->setControls(new CList([
67	(new CForm())
68		->cleanItems()
69		->setName('report.services')
70		->setMethod('get')
71		->addVar('action', 'report.services')
72		->addVar('serviceid', $data['service']['serviceid'])
73		->setAttribute('aria-label', _('Main filter'))
74		->addItem($controls),
75	(new CTag('nav', true, get_icon('kioskmode', ['mode' => $web_layout_mode])))
76		->setAttribute('aria-label', _('Content controls'))
77]));
78
79$header = [
80	'yearly' => [_('Year'), null, _('Ok'), _('Problems'), _('Downtime'), _('SLA'), _('Acceptable SLA')],
81	'monthly' => [_('Month'), null, _('Ok'), _('Problems'), _('Downtime'), _('SLA'), _('Acceptable SLA')],
82	'weekly' => [_('From'), _('Till'), _('Ok'), _('Problems'), _('Downtime'), _('SLA'), _('Acceptable SLA')],
83	'daily' => [_('Day'), null, _('Ok'), _('Problems'), _('Downtime'), _('SLA'), _('Acceptable SLA')]
84];
85
86// create table
87$table = (new CTableInfo())->setHeader($header[$data['period']]);
88
89order_result($data['sla']['sla'], 'from', ZBX_SORT_DOWN);
90
91foreach ($data['sla']['sla'] as $sla) {
92	switch ($data['period']) {
93		case 'yearly':
94			$from = zbx_date2str(_x('Y', DATE_FORMAT_CONTEXT), $sla['from']);
95			$to = null;
96			break;
97
98		case 'monthly':
99			$from =  zbx_date2str(_x('F', DATE_FORMAT_CONTEXT), $sla['from']);
100			$to = null;
101			break;
102
103		case 'daily':
104			$from = zbx_date2str(DATE_FORMAT, $sla['from']);
105			$to = null;
106			break;
107
108		case 'weekly':
109			$from = zbx_date2str(DATE_TIME_FORMAT, $sla['from']);
110			$to = zbx_date2str(DATE_TIME_FORMAT, $sla['to']);
111			break;
112	}
113
114	$ok = ($sla['okTime'] != 0)
115		? (new CSpan(
116			sprintf('%dd %dh %dm',
117				$sla['okTime'] / SEC_PER_DAY,
118				($sla['okTime'] % SEC_PER_DAY) / SEC_PER_HOUR,
119				($sla['okTime'] % SEC_PER_HOUR) / SEC_PER_MIN
120			)
121		))->addClass(ZBX_STYLE_GREEN)
122		: '';
123
124	$problems = ($sla['problemTime'] != 0)
125		? (new CSpan(
126			sprintf('%dd %dh %dm',
127				$sla['problemTime'] / SEC_PER_DAY,
128				($sla['problemTime'] % SEC_PER_DAY) / SEC_PER_HOUR,
129				($sla['problemTime'] % SEC_PER_HOUR) /SEC_PER_MIN
130			)
131		))->addClass(ZBX_STYLE_RED)
132		: '';
133
134	$downtime = ($sla['downtimeTime'] != 0)
135		? (new CSpan(
136			sprintf('%dd %dh %dm',
137				$sla['downtimeTime'] / SEC_PER_DAY,
138				($sla['downtimeTime'] % SEC_PER_DAY) / SEC_PER_HOUR,
139				($sla['downtimeTime'] % SEC_PER_HOUR) / SEC_PER_MIN
140			)
141		))->addClass(ZBX_STYLE_GREY)
142		: '';
143
144	$percentage = $data['service']['showsla']
145		? (new CSpan(sprintf('%2.4f', $sla['sla'])))
146			->addClass($sla['sla'] >= $data['service']['goodsla'] ? ZBX_STYLE_GREEN : ZBX_STYLE_RED)
147		: '';
148
149	$goodsla = $data['service']['showsla'] ? $data['service']['goodsla'] : '';
150
151	$table->addRow([$from, $to, $ok, $problems, $downtime, $percentage, $goodsla]);
152}
153
154$widget
155	->addItem($table)
156	->show();
157