'required|db report.userid', 'name' => 'required|db report.name|not_empty', 'dashboardid' => 'required|db report.dashboardid', 'period' => 'db report.period|in '.implode(',', [ZBX_REPORT_PERIOD_DAY, ZBX_REPORT_PERIOD_WEEK, ZBX_REPORT_PERIOD_MONTH, ZBX_REPORT_PERIOD_YEAR]), 'cycle' => 'db report.cycle|in '.implode(',', [ZBX_REPORT_CYCLE_DAILY, ZBX_REPORT_CYCLE_WEEKLY, ZBX_REPORT_CYCLE_MONTHLY, ZBX_REPORT_CYCLE_YEARLY]), 'weekdays' => 'array', 'hours' => 'int32|ge 0|le 23', 'minutes' => 'int32|ge 0|le 59', 'active_since' => 'string', 'active_till' => 'string', 'subject' => 'string', 'message' => 'string', 'subscriptions' => 'array', 'description' => 'db report.description', 'status' => 'db report.status|in '.ZBX_REPORT_STATUS_DISABLED.','.ZBX_REPORT_STATUS_ENABLED, 'form_refresh' => 'int32' ]; $ret = $this->validateInput($fields) && $this->validateWeekdays(); if (!$ret) { $this->setResponse( new CControllerResponseData(['main_block' => json_encode([ 'error' => [ 'messages' => array_column(get_and_clear_messages(), 'message') ] ])]) ); } return $ret; } /** * Validate days of the week. * * @return bool */ private function validateWeekdays(): bool { $cycle = $this->getInput('cycle', ZBX_REPORT_CYCLE_DAILY); $weekdays = array_sum($this->getInput('weekdays', [])); if ($cycle == ZBX_REPORT_CYCLE_WEEKLY && $weekdays == 0) { error(_s('Incorrect value for field "%1$s": %2$s.', _('Repeat on'), _('at least one day of the week must be selected')) ); return false; } return true; } protected function checkPermissions() { return $this->checkAccess(CRoleHelper::UI_REPORTS_SCHEDULED_REPORTS) && $this->checkAccess(CRoleHelper::ACTIONS_MANAGE_SCHEDULED_REPORTS); } protected function doAction() { $report = []; $this->getInputs($report, ['userid', 'name', 'dashboardid', 'period', 'cycle', 'subject', 'message', 'description', 'status' ]); if ($report['cycle'] == ZBX_REPORT_CYCLE_WEEKLY) { $report['weekdays'] = array_sum($this->getInput('weekdays', [])); } $report['start_time'] = ($this->getInput('hours') * SEC_PER_HOUR) + ($this->getInput('minutes') * SEC_PER_MIN); if ($this->getInput('active_since') !== '') { $report['active_since'] = $this->getInput('active_since'); } if ($this->getInput('active_till') !== '') { $report['active_till'] = $this->getInput('active_till'); } $report['users'] = []; $report['user_groups'] = []; foreach ($this->getInput('subscriptions', []) as $subscription) { if ($subscription['recipient_type'] == ZBX_REPORT_RECIPIENT_TYPE_USER) { $report['users'][] = [ 'userid' => $subscription['recipientid'], 'exclude' => $subscription['exclude'], 'access_userid' => $subscription['creatorid'] ]; } else { $report['user_groups'][] = [ 'usrgrpid' => $subscription['recipientid'], 'access_userid' => $subscription['creatorid'] ]; } } $result = API::Report()->create($report); $output = []; if ($result) { $output['success']['title'] = _('Scheduled report created'); if ($messages = get_and_clear_messages()) { $output['success']['messages'] = array_column($messages, 'message'); } } else { $output['error'] = [ 'title' => _('Cannot create scheduled report'), 'messages' => array_column(get_and_clear_messages(), 'message') ]; } $this->setResponse((new CControllerResponseData(['main_block' => json_encode($output)]))->disableView()); } }