You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

208 lines
5.9 KiB

1 year ago
<?php declare(strict_types = 0);
/*
** Zabbix
** Copyright (C) 2001-2023 Zabbix SIA
**
** This program 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.
**
** This program 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 this program; if not, write to the Free Software
** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
**/
/**
* @var CView $this
* @var array $data
*/
$this->addJsFile('class.calendar.js');
$this->includeJsFile('slareport.list.js.php');
$filter = (new CFilter())
->addVar('action', 'slareport.list')
->setResetUrl((new CUrl('zabbix.php'))->setArgument('action', 'slareport.list'))
->setProfile('web.slareport.list.filter')
->setActiveTab($data['active_tab'])
->addFilterTab(_('Filter'), [
(new CFormGrid())
->addClass(CFormGrid::ZBX_STYLE_FORM_GRID_LABEL_WIDTH_TRUE)
->addItem([
new CLabel(_('SLA'), 'filter_slaid_ms'),
new CFormField(
(new CMultiSelect([
'name' => 'filter_slaid',
'object_name' => 'sla',
'data' => $data['sla'] !== null
? [CArrayHelper::renameKeys($data['sla'], ['slaid' => 'id'])]
: [],
'multiple' => false,
'popup' => [
'parameters' => [
'srctbl' => 'sla',
'srcfld1' => 'slaid',
'dstfrm' => 'zbx_filter',
'dstfld1' => 'filter_slaid',
'enabled_only' => 1
]
]
]))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
),
new CLabel(_('Service'), 'filter_serviceid_ms'),
new CFormField(
(new CMultiSelect([
'name' => 'filter_serviceid',
'object_name' => 'services',
'data' => $data['service'] !== null
? [CArrayHelper::renameKeys($data['service'], ['serviceid' => 'id'])]
: [],
'multiple' => false,
'custom_select' => true
]))->setWidth(ZBX_TEXTAREA_FILTER_STANDARD_WIDTH)
)
]),
(new CFormGrid())
->addClass(CFormGrid::ZBX_STYLE_FORM_GRID_LABEL_WIDTH_TRUE)
->addItem([
new CLabel(_('From'), 'filter_date_from'),
new CFormField(
(new CDateSelector('filter_date_from', $data['filter']['date_from']))
->setDateFormat(ZBX_DATE)
->setPlaceholder(_('YYYY-MM-DD'))
),
new CLabel(_('To'), 'filter_date_to'),
new CFormField(
(new CDateSelector('filter_date_to', $data['filter']['date_to']))
->setDateFormat(ZBX_DATE)
->setPlaceholder(_('YYYY-MM-DD'))
)
])
]);
$html_page = (new CHtmlPage())
->setTitle(_('SLA report'))
->setDocUrl(CDocHelper::getUrl(CDocHelper::SERVICES_SLAREPORT_LIST))
->addItem($filter);
$report = new CTableInfo();
$form = (new CForm())
->setId('slareport-list')
->setName('slareport_list');
if ($data['sla'] === null || $data['has_errors']) {
if ($data['sla'] === null) {
$report->setNoDataMessage(_('Select SLA to display SLA report.'));
}
$form->addItem($report);
}
elseif ($data['service'] === null) {
$header = [
make_sorting_header(_('Service'), 'name', $data['sort'], $data['sortorder'],
(new CUrl('zabbix.php'))
->setArgument('action', 'slareport.list')
->getUrl()
)->addStyle('width: 15%;'),
_('SLO')
];
foreach ($data['sli']['periods'] as $period) {
$header[] = CSlaHelper::getPeriodTag((int) $data['sla']['period'], $period['period_from'], $period['period_to'],
$data['sla']['timezone']
)->addClass($data['sla']['period'] != ZBX_SLA_PERIOD_ANNUALLY ? 'vertical' : null);
}
$report->setHeader($header);
$service_index = array_flip($data['sli']['serviceids']);
foreach (array_intersect_key($data['services'], $service_index) as $serviceid => $service) {
$row = [
(new CCol($data['has_access'][CRoleHelper::ACTIONS_MANAGE_SLA]
? new CLink(
$service['name'],
(new CUrl('zabbix.php'))
->setArgument('action', 'slareport.list')
->setArgument('filter_slaid', $data['sla']['slaid'])
->setArgument('filter_serviceid', $serviceid)
->setArgument('filter_set', 1)
->getUrl()
)
: $service['name']
))->addClass(ZBX_STYLE_WORDBREAK),
CSlaHelper::getSloTag((float) $data['sla']['slo'])
];
foreach (array_keys($data['sli']['periods']) as $period_index) {
$row[] = CSlaHelper::getSliTag(
$data['sli']['sli'][$period_index][$service_index[$serviceid]]['sli'],
(float) $data['sla']['slo']
);
}
$report->addRow($row);
}
$form
->addItem($report)
->addItem($data['paging']);
}
else {
$report->setHeader([
CSlaHelper::getReportNames()[$data['sla']['period']],
_('SLO'),
_('SLI'),
_('Uptime'),
_('Downtime'),
_('Error budget'),
_('Excluded downtimes')
]);
if ($data['sli']['serviceids']) {
$service_index = 0;
foreach (array_reverse($data['sli']['periods'], true) as $period_index => $period) {
$sli = $data['sli']['sli'][$period_index][$service_index];
$excluded_downtime_tags = [];
foreach ($sli['excluded_downtimes'] as $excluded_downtime) {
$excluded_downtime_tags[] = CSlaHelper::getExcludedDowntimeTag($excluded_downtime);
}
$report->addRow([
CSlaHelper::getPeriodTag((int) $data['sla']['period'], $period['period_from'], $period['period_to'],
$data['sla']['timezone']
),
CSlaHelper::getSloTag((float) $data['sla']['slo']),
CSlaHelper::getSliTag($sli['sli'], (float) $data['sla']['slo']),
CSlaHelper::getUptimeTag($sli['uptime']),
CSlaHelper::getDowntimeTag($sli['downtime']),
CSlaHelper::getErrorBudgetTag($sli['error_budget']),
$excluded_downtime_tags
]);
}
}
$form->addItem($report);
}
$html_page
->addItem($form)
->show();
(new CScriptTag('
view.init();
'))
->setOnDocumentReady()
->show();