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