diff --git a/pandora_console/extras/delete_files/delete_files.txt b/pandora_console/extras/delete_files/delete_files.txt
index 888b359278..50f79eb02f 100644
--- a/pandora_console/extras/delete_files/delete_files.txt
+++ b/pandora_console/extras/delete_files/delete_files.txt
@@ -113,4 +113,5 @@ enterprise/include/javascript/SimpleMapController.js
enterprise/include/javascript/tooltipster.bundle.min.js
enterprise/include/styles/tooltipster.bundle.min.css
mobile/include/javascript/jquery.mobile-1.3.1.js
-mobile/include/style/jquery.mobile-1.3.1.css
\ No newline at end of file
+mobile/include/style/jquery.mobile-1.3.1.css
+godmode/alerts/configure_alert_special_days.php
\ No newline at end of file
diff --git a/pandora_console/extras/mr/51.sql b/pandora_console/extras/mr/51.sql
index ea9d454839..290defc3dd 100644
--- a/pandora_console/extras/mr/51.sql
+++ b/pandora_console/extras/mr/51.sql
@@ -1,5 +1,30 @@
START TRANSACTION;
+CREATE TABLE IF NOT EXISTS `talert_calendar` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL default '',
+ `id_group` INT(10) NOT NULL DEFAULT 0,
+ `description` text,
+ PRIMARY KEY (`id`),
+ UNIQUE (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT IGNORE INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar');
+
+ALTER TABLE `talert_special_days` ADD COLUMN `id_calendar` int(10) unsigned NOT NULL DEFAULT 1;
+ALTER TABLE `talert_special_days` ADD COLUMN `day_code` tinyint(2) unsigned NOT NULL DEFAULT 0;
+
+UPDATE `talert_special_days` set `day_code` = 1 WHERE `same_day` = 'monday';
+UPDATE `talert_special_days` set `day_code` = 2 WHERE `same_day` = 'tuesday';
+UPDATE `talert_special_days` set `day_code` = 3 WHERE `same_day` = 'wednesday';
+UPDATE `talert_special_days` set `day_code` = 4 WHERE `same_day` = 'thursday';
+UPDATE `talert_special_days` set `day_code` = 5 WHERE `same_day` = 'friday';
+UPDATE `talert_special_days` set `day_code` = 6 WHERE `same_day` = 'saturday';
+UPDATE `talert_special_days` set `day_code` = 7 WHERE `same_day` = 'sunday';
+
+ALTER TABLE `talert_special_days` DROP COLUMN `same_day`;
+ALTER TABLE `talert_special_days` ADD FOREIGN KEY (`id_calendar`) REFERENCES `talert_calendar`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+
ALTER TABLE `tagent_repository` ADD COLUMN `deployment_timeout` INT UNSIGNED DEFAULT 600 AFTER `path`;
COMMIT;
\ No newline at end of file
diff --git a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
index a84cd73032..21d4bc2552 100644
--- a/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
+++ b/pandora_console/extras/pandoradb_migrate_6.0_to_7.0.mysql.sql
@@ -4224,3 +4224,31 @@ INSERT INTO `tncm_script` VALUES
(5,5,'enable
expect:Password:\s*
_enablepass_
term length 0
config term
end
end
exit
');
INSERT INTO `tncm_template_scripts`(`id_template`, `id_script`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5);
+
+-- ----------------------------------------------------------------------
+-- Table `talert_calendar`
+-- ----------------------------------------------------------------------
+CREATE TABLE IF NOT EXISTS `talert_calendar` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL default '',
+ `id_group` INT(10) NOT NULL DEFAULT 0,
+ `description` text,
+ PRIMARY KEY (`id`),
+ UNIQUE (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+INSERT IGNORE INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar');
+
+ALTER TABLE `talert_special_days` ADD COLUMN `id_calendar` int(10) unsigned NOT NULL DEFAULT 1;
+ALTER TABLE `talert_special_days` ADD COLUMN `day_code` tinyint(2) unsigned NOT NULL DEFAULT 0;
+
+UPDATE `talert_special_days` set `day_code` = 1 WHERE `same_day` = 'monday';
+UPDATE `talert_special_days` set `day_code` = 2 WHERE `same_day` = 'tuesday';
+UPDATE `talert_special_days` set `day_code` = 3 WHERE `same_day` = 'wednesday';
+UPDATE `talert_special_days` set `day_code` = 4 WHERE `same_day` = 'thursday';
+UPDATE `talert_special_days` set `day_code` = 5 WHERE `same_day` = 'friday';
+UPDATE `talert_special_days` set `day_code` = 6 WHERE `same_day` = 'saturday';
+UPDATE `talert_special_days` set `day_code` = 7 WHERE `same_day` = 'sunday';
+
+ALTER TABLE `talert_special_days` DROP COLUMN `same_day`;
+ALTER TABLE `talert_special_days` ADD FOREIGN KEY (`id_calendar`) REFERENCES `talert_calendar`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/pandora_console/godmode/alerts/alert_special_days.php b/pandora_console/godmode/alerts/alert_special_days.php
index 31f787f910..3a8957293b 100644
--- a/pandora_console/godmode/alerts/alert_special_days.php
+++ b/pandora_console/godmode/alerts/alert_special_days.php
@@ -1,577 +1,75 @@
'[CalendarManager]'.$e->getMessage() ]);
+ exit;
+ } else {
+ echo '[CalendarManager]'.$e->getMessage();
}
+ // Stop this execution, but continue 'globally'.
return;
}
-// Header
-ui_print_page_header(
- __('Alerts').' » '.__('Special days list'),
- 'images/gm_alerts.png',
- false,
- 'alert_special_days',
- true
-);
+// AJAX controller.
+if ((bool) is_ajax() === true) {
+ $method = get_parameter('method');
-$update_special_day = (bool) get_parameter('update_special_day');
-$create_special_day = (bool) get_parameter('create_special_day');
-$delete_special_day = (bool) get_parameter('delete_special_day');
-$upload_ical = (bool) get_parameter('upload_ical', 0);
-$display_range = (int) get_parameter('display_range');
-
-if ($upload_ical) {
- $same_day = (string) get_parameter('same_day');
- $overwrite = (bool) get_parameter('overwrite', 0);
- $values = [];
- $values['id_group'] = (string) get_parameter('id_group');
- $values['same_day'] = $same_day;
-
- $error = $_FILES['ical_file']['error'];
- $extension = substr($_FILES['ical_file']['name'], -3);
-
- if ($error == 0 && strcasecmp($extension, 'ics') == 0) {
- $skipped_dates = '';
- // $today = date ('Ymd');
- $this_month = date('Ym');
- $ical = new ICal($_FILES['ical_file']['tmp_name']);
- $events = $ical->events();
- foreach ($events as $event) {
- $event_date = substr($event['DTSTART'], 0, 8);
- $event_month = substr($event['DTSTART'], 0, 6);
- if ($event_month >= $this_month) {
- $values['description'] = @$event['SUMMARY'];
- $values['date'] = $event_date;
- $date = date('Y-m-d', strtotime($event_date));
- $date_check = '';
- $filter['id_group'] = $values['id_group'];
- $filter['date'] = $date;
- $date_check = db_get_value_filter('date', 'talert_special_days', $filter);
- if ($date_check == $date) {
- if ($overwrite) {
- $id_special_day = db_get_value_filter('id', 'talert_special_days', $filter);
- alerts_update_alert_special_day($id_special_day, $values);
- } else {
- if ($skipped_dates == '') {
- $skipped_dates = __('Skipped dates: ');
- }
-
- $skipped_dates .= $date.' ';
- }
- } else {
- alerts_create_alert_special_day($date, $same_day, $values);
- }
- }
- }
-
- $result = true;
- } else {
- $result = false;
- }
-
- if ($result) {
- db_pandora_audit('Special days list', 'Upload iCalendar '.$_FILES['ical_file']['name']);
- }
-
- ui_print_result_message($result, __('Success to upload iCalendar').'
'.$skipped_dates, __('Fail to upload iCalendar'));
-}
-
-if ($create_special_day) {
- $date = (string) get_parameter('date');
- $same_day = (string) get_parameter('same_day');
- $values = [];
- $values['id_group'] = (string) get_parameter('id_group');
- $values['description'] = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description'))));
-
- $aviable_description = true;
- if (preg_match('/script/i', $values['description'])) {
- $aviable_description = false;
- }
-
- $array_date = explode('-', $date);
-
- $year = $array_date[0];
- $month = $array_date[1];
- $day = $array_date[2];
-
- if ($year == '*') {
- // '0001' means every year.
- $year = '0001';
- $date = $year.'-'.$month.'-'.$day;
- }
-
- if (!checkdate($month, $day, $year)) {
- $result = '';
- } else {
- $date_check = '';
- $filter['id_group'] = $values['id_group'];
- $filter['date'] = $date;
- $date_check = db_get_value_filter('date', 'talert_special_days', $filter);
- if ($date_check == $date) {
- $result = '';
- $messageAction = __('Could not be created, it already exists');
+ if (method_exists($cs, $method) === true) {
+ if (CalendarManager::ajaxMethod($method) === true) {
+ $cs->{$method}();
} else {
- if ($aviable_description) {
- $result = alerts_create_alert_special_day($date, $same_day, $values);
- $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$values['description'].'"}';
- } else {
- $result = false;
- }
+ $cs->error('Unavailable method.');
}
- }
-
- if ($result) {
- db_pandora_audit('Command management', 'Create special day '.$result, false, false, $info);
} else {
- db_pandora_audit('Command management', 'Fail try to create special day', false, false);
+ $cs->error('Method not found. ['.$method.']');
}
-
- // Show errors
- if (!isset($messageAction)) {
- $messageAction = __('Could not be created');
- }
-
- $messageAction = ui_print_result_message(
- $result,
- __('Successfully created'),
- $messageAction
- );
-}
-
-if ($update_special_day) {
- $id = (int) get_parameter('id');
- $alert = alerts_get_alert_special_day($id);
- $date = (string) get_parameter('date');
- $date_orig = (string) get_parameter('date_orig');
- $same_day = (string) get_parameter('same_day');
- $description = io_safe_input(strip_tags(io_safe_output((string) get_parameter('description'))));
- $id_group = (string) get_parameter('id_group');
- $id_group_orig = (string) get_parameter('id_group_orig');
-
- $aviable_description = true;
- if (preg_match('/script/i', $description)) {
- $aviable_description = false;
- }
-
- $array_date = explode('-', $date);
-
- $year = $array_date[0];
- $month = $array_date[1];
- $day = $array_date[2];
-
- if ($year == '*') {
- // '0001' means every year.
- $year = '0001';
- $date = $year.'-'.$month.'-'.$day;
- }
-
- $values = [];
- $values['date'] = $date;
- $values['id_group'] = $id_group;
- $values['same_day'] = $same_day;
- $values['description'] = $description;
-
- if (!checkdate($month, $day, $year)) {
- $result = '';
- } else {
- if ($id_group != $id_group_orig || $date != $date_orig) {
- $date_check = '';
- $filter['id_group'] = $id_group;
- $filter['date'] = $date;
- $date_check = db_get_value_filter('date', 'talert_special_days', $filter);
- if ($date_check == $date) {
- $result = '';
- $messageAction = __('Could not be updated, it already exists');
- } else {
- if ($aviable_description !== false) {
- $result = alerts_update_alert_special_day($id, $values);
- $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$description.'"}';
- }
- }
- } else {
- if ($aviable_description !== false) {
- $result = alerts_update_alert_special_day($id, $values);
- $info = '{"Date":"'.$date.'","Same day of the week":"'.$same_day.'","Description":"'.$description.'"}';
- }
- }
- }
-
- if ($result) {
- db_pandora_audit('Command management', 'Update special day '.$id, false, false, $info);
- } else {
- db_pandora_audit('Command management', 'Fail to update special day '.$id, false, false);
- }
-
-
- // Show errors
- if (!isset($messageAction)) {
- $messageAction = __('Could not be updated');
- }
-
- $messageAction = ui_print_result_message(
- $result,
- __('Successfully updated'),
- $messageAction
- );
-}
-
-if ($delete_special_day) {
- $id = (int) get_parameter('id');
-
- $result = alerts_delete_alert_special_day($id);
-
- if ($result) {
- db_pandora_audit('Command management', 'Delete special day '.$id);
- } else {
- db_pandora_audit('Command management', 'Fail to delete special day '.$id);
- }
-
- ui_print_result_message(
- $result,
- __('Successfully deleted'),
- __('Could not be deleted')
- );
-}
-
-
-echo "
';
-
-
-$this_year = date('Y');
-$this_month = date('m');
-
-$filter = [];
-if (!is_user_admin($config['id_user'])) {
- $filter['id_group'] = array_keys(users_get_groups(false, 'LM'));
-}
-
-// Show display range.
-$html = "".__('Display range: ');
-if ($display_range) {
- $html .= '['.__('Default').'] ';
- if ($display_range > 1970) {
- $html .= '<< ';
- }
-
- $html .= '['.$display_range.']';
- $html .= ' >>';
-} else {
- $html .= '['.__('Default').'] ';
- $html .= '<< ';
- $html .= '[';
- $html .= $this_year;
- $html .= ']';
- $html .= ' >>';
-}
-
-$html .= ' |
';
-echo $html;
-
-// Show calendar
-for ($month = 1; $month <= 12; $month++) {
- if ($display_range) {
- $display_month = $month;
- $display_year = $display_range;
- } else {
- $display_month = ($this_month + $month - 1);
- $display_year = $this_year;
- }
-
- if ($display_month > 12) {
- $display_month -= 12;
- $display_year += 1;
- }
-
- $cal_table = new stdClass();
- $cal_table->width = '100%';
- $cal_table->class = 'databox data';
-
- $cal_table->data = [];
- $cal_table->head = [];
- $cal_table->head[0] = __('Sun');
- $cal_table->head[1] = __('Mon');
- $cal_table->head[2] = __('Tue');
- $cal_table->head[3] = __('Wed');
- $cal_table->head[4] = __('Thu');
- $cal_table->head[5] = __('Fri');
- $cal_table->head[6] = __('Sat');
- $cal_table->cellstyle = [];
- $cal_table->size = [];
- $cal_table->size[0] = '14%';
- $cal_table->size[1] = '14%';
- $cal_table->size[2] = '14%';
- $cal_table->size[3] = '14%';
- $cal_table->size[4] = '14%';
- $cal_table->size[5] = '14%';
- $cal_table->size[6] = '14%';
- $cal_table->align = [];
- $cal_table->border = '1';
- $cal_table->titlestyle = 'text-align:center; font-weight: bold;';
- switch ($display_month) {
- case 1:
- $cal_table->title = __('January');
- break;
-
- case 2:
- $cal_table->title = __('February');
- break;
-
- case 3:
- $cal_table->title = __('March');
- break;
-
- case 4:
- $cal_table->title = __('April');
- break;
-
- case 5:
- $cal_table->title = __('May');
- break;
-
- case 6:
- $cal_table->title = __('June');
- break;
-
- case 7:
- $cal_table->title = __('July');
- break;
-
- case 8:
- $cal_table->title = __('August');
- break;
-
- case 9:
- $cal_table->title = __('September');
- break;
-
- case 10:
- $cal_table->title = __('October');
- break;
-
- case 11:
- $cal_table->title = __('November');
- break;
-
- case 12:
- $cal_table->title = __('December');
- break;
- }
-
- $cal_table->title .= ' / '.$display_year;
-
- $last_day = date('j', mktime(0, 0, 0, ($display_month + 1), 0, $display_year));
- $cal_line = 0;
-
- for ($day = 1; $day < ($last_day + 1); $day++) {
- $week = date('w', mktime(0, 0, 0, $display_month, $day, $display_year));
- if ($cal_line == 0 && $week != 0 && $day == 1) {
- for ($i = 0; $i < $week; $i++) {
- $cal_table->cellstyle[$cal_line][$i] = 'font-size: 18px;';
- $cal_table->data[$cal_line][$i] = '-';
- }
- }
-
- if ($week == 0 || $week == 6) {
- $cal_table->cellstyle[$cal_line][$week] = 'color: red;';
- }
-
- $date = sprintf('%04d-%02d-%02d', $display_year, $display_month, $day);
- $date_wildcard = sprintf('0001-%02d-%02d', $display_month, $day);
- $special_days = '';
- $filter['date'] = [
- $date,
- $date_wildcard,
- ];
- $filter['order']['field'] = 'date';
- $filter['order']['order'] = 'DESC';
- $special_days = db_get_all_rows_filter('talert_special_days', $filter);
-
- if ($special_days != '') {
- foreach ($special_days as $special_day) {
- $cal_table->data[$cal_line][$week] .= '';
- $cal_table->data[$cal_line][$week] .= $day;
- $cal_table->data[$cal_line][$week] .= '
';
- $cal_table->data[$cal_line][$week] .= ui_print_group_icon($special_day['id_group'], true);
-
- if ($special_day['date'] == $date_wildcard) {
- $cal_table->data[$cal_line][$week] .= '('.ui_print_help_tip('This is valid every year. However, this will be ignored if indivisual setting for the same group is available.', true).') ';
- }
-
- $cal_table->data[$cal_line][$week] .= __('Same as ');
- switch ($special_day['same_day']) {
- case 'monday':
- $cal_table->data[$cal_line][$week] .= __('Monday');
- break;
-
- case 'tuesday':
- $cal_table->data[$cal_line][$week] .= __('Tuesday');
- break;
-
- case 'wednesday':
- $cal_table->data[$cal_line][$week] .= __('Wednesday');
- break;
-
- case 'thursday':
- $cal_table->data[$cal_line][$week] .= __('Thursday');
- break;
-
- case 'friday':
- $cal_table->data[$cal_line][$week] .= __('Friday');
- break;
-
- case 'saturday':
- $cal_table->data[$cal_line][$week] .= __('Saturday');
- break;
-
- case 'sunday':
- $cal_table->data[$cal_line][$week] .= __('Sunday');
- break;
- }
-
- // Only show description if is filled.
- if (empty($special_day['description']) === false) {
- $cal_table->data[$cal_line][$week] .= ui_print_help_tip($special_day['description'], true);
- }
-
- if ($special_day['id_group'] || ($can_manage_group_all && $special_day['id_group'] == 0)) {
- $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image(
- 'images/config.png',
- true,
- ['class' => 'invert_filter']
- ).' ';
- $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image(
- 'images/cross.png',
- true,
- ['class' => 'invert_filter']
- ).'';
- ;
- }
-
- $cal_table->data[$cal_line][$week] .= '
';
- $cal_table->cellstyle[$cal_line][$week] = 'font-weight: bold;';
- }
- } else {
- $cal_table->cellstyle[$cal_line][$week] .= 'font-size: 18px;';
- $cal_table->data[$cal_line][$week] = $day.' ';
- }
-
- $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image(
- 'images/add_mc.png',
- true,
- ['class' => 'invert_filter']
- ).'';
-
- if ($week == 6) {
- $cal_line++;
- }
- }
-
- for ($padding = ($week + 1); $padding <= 6; $padding++) {
- $cal_table->cellstyle[$cal_line][$padding] = 'font-size: 18px;';
- $cal_table->data[$cal_line][$padding] = '-';
- }
-
- html_print_table($cal_table);
-}
-
-echo '';
-echo '';
-echo '
';
diff --git a/pandora_console/godmode/alerts/configure_alert_special_days.php b/pandora_console/godmode/alerts/configure_alert_special_days.php
deleted file mode 100644
index 14d85afc1d..0000000000
--- a/pandora_console/godmode/alerts/configure_alert_special_days.php
+++ /dev/null
@@ -1,159 +0,0 @@
-width = '100%';
-$table->class = 'databox filters';
-
-$table->style = [];
-$table->style[0] = 'font-weight: bold';
-$table->size = [];
-$table->size[0] = '20%';
-$table->data = [];
-$table->data[0][0] = __('Date');
-$table->data[0][1] = html_print_input_text(
- 'date',
- $date,
- '',
- 10,
- 10,
- true
-);
-$table->data[0][1] .= html_print_image(
- 'images/calendar_view_day.png',
- true,
- [
- 'alt' => 'calendar',
- 'onclick' => "scwShow(scwID('text-date'),this);",
- 'class' => 'invert_filter',
- ]
-);
-$table->data[1][0] = __('Group');
-$groups = users_get_groups();
-$own_info = get_user_info($config['id_user']);
-// Only display group "All" if user is administrator or has "LM" privileges.
-if (users_can_manage_group_all('LM')) {
- $display_all_group = true;
-} else {
- $display_all_group = false;
-}
-
-$table->data[1][1] = html_print_select_groups(
- false,
- 'LW',
- $display_all_group,
- 'id_group',
- $id_group,
- '',
- '',
- 0,
- true
-);
-
-$table->data[2][0] = __('Same day of the week');
-$days = [];
-$days['monday'] = __('Monday');
-$days['tuesday'] = __('Tuesday');
-$days['wednesday'] = __('Wednesday');
-$days['thursday'] = __('Thursday');
-$days['friday'] = __('Friday');
-$days['saturday'] = __('Saturday');
-$days['sunday'] = __('Sunday');
-$table->data[2][1] = html_print_select(
- $days,
- 'same_day',
- $same_day,
- '',
- '',
- 0,
- true,
- false,
- false
-);
-
-$table->data[3][0] = __('Description');
-$table->data[3][1] = html_print_textarea(
- 'description',
- 10,
- 30,
- $description,
- '',
- true
-);
-
-echo '';
diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php
index 36767a3e72..4936617b47 100644
--- a/pandora_console/godmode/alerts/configure_alert_template.php
+++ b/pandora_console/godmode/alerts/configure_alert_template.php
@@ -11,8 +11,11 @@
// 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.
-// Load global vars
+// Load global vars.
global $config;
+
+use PandoraFMS\Calendar;
+
require_once $config['homedir'].'/include/functions_alerts.php';
require_once $config['homedir'].'/include/functions_users.php';
enterprise_include_once('meta/include/functions_alerts_meta.php');
@@ -288,7 +291,7 @@ function update_template($step)
$friday = (bool) get_parameter('friday');
$saturday = (bool) get_parameter('saturday');
$sunday = (bool) get_parameter('sunday');
- $special_day = (bool) get_parameter('special_day');
+ $special_day = (int) get_parameter('special_day');
$time_from = (string) get_parameter('time_from');
$time_from = date('H:i:00', strtotime($time_from));
$time_to = (string) get_parameter('time_to');
@@ -418,7 +421,7 @@ $thursday = true;
$friday = true;
$saturday = true;
$sunday = true;
-$special_day = false;
+$special_day = 0;
$default_action = 0;
$fields = [];
for ($i = 1; $i <= $config['max_macro_fields']; $i++) {
@@ -561,7 +564,7 @@ if ($id && ! $create_template) {
$friday = (bool) $template['friday'];
$saturday = (bool) $template['saturday'];
$sunday = (bool) $template['sunday'];
- $special_day = (bool) $template['special_day'];
+ $special_day = (int) $template['special_day'];
$max_alerts = $template['max_alerts'];
$min_alerts = $template['min_alerts'];
$min_alerts_reset_counter = $template['min_alerts_reset_counter'];
@@ -671,11 +674,36 @@ if ($step == 2) {
);
$table->data[0][2] = __('Use special days list');
- $table->data[0][3] = html_print_checkbox(
+ $data_special_days = Calendar::calendars(
+ // Fields.
+ [ '`talert_calendar`.*' ],
+ // Filter.
+ [],
+ // Count.
+ false,
+ // Offset.
+ null,
+ // Limit.
+ null,
+ // Order.
+ null,
+ // Sort field.
+ null,
+ // Reduce to a select.
+ true
+ );
+
+ $table->data[0][3] = html_print_select(
+ $data_special_days,
'special_day',
- 1,
$special_day,
+ '',
+ __('None'),
+ 0,
true,
+ false,
+ false,
+ '',
(!$is_management_allowed | $disabled)
);
diff --git a/pandora_console/include/class/CalendarManager.class.php b/pandora_console/include/class/CalendarManager.class.php
new file mode 100644
index 0000000000..9d5db4e80d
--- /dev/null
+++ b/pandora_console/include/class/CalendarManager.class.php
@@ -0,0 +1,1158 @@
+ $msg]
+ );
+ }
+
+
+ /**
+ * Instantiate controller.
+ *
+ * @param string $url Utility url.
+ * @param string|null $ajax_url Ajax url.
+ */
+ public function __construct(string $url, ?string $ajax_url=null)
+ {
+ global $config;
+ $this->access = 'LM';
+
+ check_login();
+ // ACL Check.
+ if ((bool) check_acl($config['id_user'], 0, $this->access) !== true) {
+ db_pandora_audit(
+ 'ACL Violation',
+ 'Trying to access Alert calendar view'
+ );
+ include 'general/noaccess.php';
+ exit;
+ }
+
+ $this->url = $url;
+ $this->ajaxUrl = self::BASE_AJAX_PAGE;
+
+ if (empty($ajax_url) === false) {
+ $this->ajaxUrl = $ajax_url;
+ }
+ }
+
+
+ /**
+ * Retrieves a list of.
+ *
+ * @param string $tab Active tab.
+ *
+ * @return array
+ */
+ public function getTabs(string $tab='list')
+ {
+ global $config;
+
+ $buttons = [];
+
+ $buttons['list'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image(
+ 'images/list.png',
+ true,
+ [
+ 'title' => __('Alert calendar list'),
+ 'class' => 'invert_filter',
+ ]
+ ).'',
+ ];
+
+ $id_calendar = get_parameter('id_calendar', 0);
+ $id = get_parameter('id', 0);
+
+ $op = get_parameter('op', '');
+ $action = get_parameter('action', '');
+
+ if (($id_calendar !== 0 || $id !== 0)) {
+ $id = ($id_calendar === 0) ? $id : $id_calendar;
+ $buttons['list_edit'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image(
+ 'images/pencil.png',
+ true,
+ [
+ 'title' => __('Edit calendar'),
+ 'class' => 'invert_filter',
+ ]
+ ).'',
+ ];
+
+ $buttons['special_days'] = [
+ 'active' => false,
+ 'text' => ''.html_print_image(
+ 'images/templates.png',
+ true,
+ [
+ 'title' => __('Alert special days'),
+ 'class' => 'invert_filter',
+ ]
+ ).'',
+ ];
+ }
+
+ if ($op === 'edit' && $action === '') {
+ $tab = 'list_edit';
+ }
+
+ $buttons[$tab]['active'] = true;
+
+ return $buttons;
+ }
+
+
+ /**
+ * Execute page and show interface.
+ *
+ * @return void
+ */
+ public function run()
+ {
+ \ui_require_css_file('alert');
+ $op = get_parameter('op');
+ $tab = get_parameter('tab_calendar');
+ switch ($tab) {
+ case 'special_days':
+ if ($op === 'edit') {
+ if ($this->showSpecialDaysEdition() !== true) {
+ return;
+ }
+ } else if ($op === 'delete') {
+ $this->deleteSpecialDay();
+ } else if ($op === 'upload_ical') {
+ $this->iCalendarSpecialDay();
+ }
+
+ $this->showSpecialDays();
+ break;
+
+ case 'list':
+ default:
+ if ($op === 'edit') {
+ if ($this->showCalendarEdition() !== true) {
+ return;
+ }
+ } else if ($op === 'delete') {
+ $this->deleteCalendar();
+ }
+
+ $this->showCalendarList();
+ break;
+ }
+
+ }
+
+
+ /**
+ * Delete calendar
+ *
+ * @return void
+ */
+ public function deleteCalendar()
+ {
+ $id = (int) get_parameter('id');
+ try {
+ $calendar = new Calendar($id);
+ if ($id === 0) {
+ return;
+ }
+ } catch (\Exception $e) {
+ if ($id > 0) {
+ $this->message = \ui_print_error_message(
+ \__('Calendar not found: %s', $e->getMessage()),
+ '',
+ true
+ );
+ }
+
+ return;
+ }
+
+ // Remove.
+ $calendar->delete();
+ $this->message = \ui_print_success_message(
+ \__('Calendar successfully deleted'),
+ '',
+ true
+ );
+ }
+
+
+ /**
+ * Delete special day.
+ *
+ * @return void
+ */
+ public function deleteSpecialDay()
+ {
+ $id = (int) get_parameter('id');
+ try {
+ $specialDay = new SpecialDay($id);
+ if ($id === 0) {
+ return;
+ }
+ } catch (\Exception $e) {
+ if ($id > 0) {
+ $this->message = \ui_print_error_message(
+ \__('Special day not found: %s', $e->getMessage()),
+ '',
+ true
+ );
+ }
+
+ return;
+ }
+
+ // Remove.
+ $specialDay->delete();
+ $this->message = \ui_print_success_message(
+ \__('Special day successfully deleted'),
+ '',
+ true
+ );
+ }
+
+
+ /**
+ * Icalendar.
+ *
+ * @return void
+ */
+ public function iCalendarSpecialDay()
+ {
+ include_once 'include/ics-parser/class.iCalReader.php';
+
+ $day_code = (string) get_parameter('day_code');
+ $overwrite = (bool) get_parameter('overwrite', 0);
+ $values = [];
+ $values['id_group'] = (string) get_parameter('id_group');
+ $values['id_calendar'] = get_parameter('id_calendar');
+ $values['day_code'] = $day_code;
+ $error = $_FILES['ical_file']['error'];
+ $extension = substr($_FILES['ical_file']['name'], -3);
+
+ if ($error == 0 && strcasecmp($extension, 'ics') == 0) {
+ $result = true;
+ $skipped_dates = '';
+ $this_month = date('Ym');
+ $ical = new \ICal($_FILES['ical_file']['tmp_name']);
+ $events = $ical->events();
+ foreach ($events as $event) {
+ $event_date = substr($event['DTSTART'], 0, 8);
+ $event_month = substr($event['DTSTART'], 0, 6);
+ if ($event_month >= $this_month) {
+ $values['description'] = @$event['SUMMARY'];
+ $values['date'] = $event_date;
+ $date = date('Y-m-d', strtotime($event_date));
+ $date_check = '';
+ $filter['id_group'] = $values['id_group'];
+ $filter['date'] = $date;
+ $filter['id_calendar'] = $values['id_calendar'];
+ $date_check = db_get_value_filter(
+ 'date',
+ 'talert_special_days',
+ $filter
+ );
+
+ if ($date_check === $date) {
+ if ($overwrite === true) {
+ $id_special_day = db_get_value_filter(
+ 'id',
+ 'talert_special_days',
+ $filter
+ );
+ try {
+ $specialDay = new SpecialDay($id_special_day);
+ $specialDay->date($values['date']);
+ $specialDay->id_group($values['id_group']);
+ $specialDay->day_code($values['day_code']);
+ $specialDay->description($values['description']);
+ $specialDay->id_calendar($values['id_calendar']);
+
+ if ($specialDay->save() === true) {
+ $result = true;
+ } else {
+ $result = false;
+ }
+ } catch (\Exception $e) {
+ $result = false;
+ }
+ } else {
+ if ($skipped_dates == '') {
+ $skipped_dates = __('Skipped dates: ');
+ }
+
+ $skipped_dates .= $date.' ';
+ }
+ } else {
+ try {
+ $specialDay = new SpecialDay();
+ $specialDay->date($values['date']);
+ $specialDay->id_group($values['id_group']);
+ $specialDay->day_code($values['day_code']);
+ $specialDay->description($values['description']);
+ $specialDay->id_calendar($values['id_calendar']);
+
+ if ($specialDay->save() === true) {
+ $result = true;
+ } else {
+ $result = false;
+ }
+ } catch (\Exception $e) {
+ $result = false;
+ }
+ }
+ }
+ }
+ } else {
+ $result = false;
+ }
+
+ if ($result === true) {
+ db_pandora_audit(
+ 'Special days list',
+ 'Upload iCalendar '.$_FILES['ical_file']['name']
+ );
+ }
+
+ $this->message = \ui_print_result_message(
+ $result,
+ \__('Success to upload iCalendar').'
'.$skipped_dates,
+ \__('Fail to upload iCalendar')
+ );
+ }
+
+
+ /**
+ * Show a list of models registered in this system.
+ *
+ * @return void
+ */
+ public function showCalendarList()
+ {
+ View::render(
+ 'calendar/list',
+ [
+ 'ajax_url' => $this->ajaxUrl,
+ 'url' => $this->url,
+ 'tabs' => $this->getTabs('list'),
+ 'message' => $this->message,
+ ]
+ );
+ }
+
+
+ /**
+ * Show a list of network configuration templates.
+ *
+ * @return boolean Continue showing list or not.
+ */
+ public function showCalendarEdition()
+ {
+ global $config;
+ $id = (int) get_parameter('id');
+ $new = false;
+ try {
+ $calendar = new Calendar($id);
+ if ($id === 0) {
+ $new = true;
+ }
+ } catch (\Exception $e) {
+ if ($id > 0) {
+ $this->message = \ui_print_error_message(
+ \__('Calendar not found: %s', $e->getMessage()),
+ '',
+ true
+ );
+ }
+
+ $calendar = new Calendar();
+ $new = true;
+ }
+
+ $action = get_parameter('action');
+ if ($action === 'save') {
+ $success = false;
+
+ $msg_ok = \__('Successfully updated');
+ $msg_err = \__('Failed to update');
+ if ($new === true) {
+ $msg_ok = \__('Successfully created');
+ $msg_err = \__('Failed to create');
+ }
+
+ try {
+ $name = get_parameter('name', null);
+ $change_name = true;
+ if ($new === false && $name === $calendar->name()) {
+ $change_name = false;
+ }
+
+ $calendar->name($name);
+ $calendar->id_group(get_parameter('id_group', null));
+ $calendar->description(get_parameter('description', null));
+
+ if ($change_name === true && empty($calendar->search(['name' => $calendar->name()])) === false) {
+ $reason = \__(
+ 'Failed saving calendar: name exists',
+ $config['dbconnection']->error
+ );
+ } else {
+ // Save template.
+ if ($calendar->save() === true) {
+ $success = true;
+ } else {
+ $reason = \__(
+ 'Failed saving calendar: ',
+ $config['dbconnection']->error
+ );
+ }
+ }
+ } catch (\Exception $e) {
+ $this->message = \ui_print_error_message(
+ \__('Error: %s', $e->getMessage()),
+ '',
+ true
+ );
+ $success = false;
+ }
+
+ $this->message .= \ui_print_result_message(
+ $success,
+ $msg_ok,
+ sprintf('%s%s', $msg_err, $reason),
+ '',
+ true
+ );
+
+ if ($success === true) {
+ return $success;
+ }
+ }
+
+ View::render(
+ 'calendar/edit',
+ [
+ 'ajax_url' => $this->ajaxUrl,
+ 'url' => $this->url.'&op=edit&tab_calendar=list',
+ 'tabs' => $this->getTabs('list'),
+ 'calendar' => $calendar,
+ 'message' => $this->message,
+ 'create' => $new,
+ ]
+ );
+
+ return false;
+ }
+
+
+ /**
+ * AJAX Method, draws calendar list.
+ *
+ * @return void
+ */
+ public function drawListCalendar()
+ {
+ global $config;
+
+ // Datatables offset, limit and order.
+ $filter = get_parameter('filter', []);
+ $start = get_parameter('start', 0);
+ $length = get_parameter('length', $config['block_size']);
+ $order = get_datatable_order(true);
+
+ try {
+ ob_start();
+
+ $fields = ['`talert_calendar`.*'];
+
+ // Retrieve data.
+ $data = Calendar::calendars(
+ // Fields.
+ $fields,
+ // Filter.
+ $filter,
+ // Count.
+ false,
+ // Offset.
+ $start,
+ // Limit.
+ $length,
+ // Order.
+ $order['direction'],
+ // Sort field.
+ $order['field']
+ );
+
+ // Retrieve counter.
+ $count = Calendar::calendars(
+ $fields,
+ $filter,
+ true
+ )['count'];
+
+ $is_management_allowed = \is_management_allowed();
+
+ if ((bool) $data === true) {
+ $manage = check_acl(
+ $config['id_user'],
+ 0,
+ 'LM',
+ true
+ );
+
+ $data = array_reduce(
+ $data,
+ function ($carry, $item) use ($manage, $is_management_allowed) {
+ // phpcs:disable Squiz.NamingConventions.ValidVariableName.MemberNotCamelCaps
+ // Transforms array of arrays $data into an array
+ // of objects, making a post-process of certain fields.
+ $tmp = (object) $item;
+
+ if ((bool) $manage === true) {
+ $name = '';
+ $name .= $tmp->name;
+ $name .= '';
+ $tmp->name = $name;
+ }
+
+ $tmp->id_group = \ui_print_group_icon(
+ $tmp->id_group,
+ true
+ );
+
+ // Options. View.
+ $tmp->options = '';
+ if ((bool) $manage === true) {
+ if ($is_management_allowed === true) {
+ // Options. Edit.
+ $tmp->options .= '';
+ $tmp->options .= html_print_image(
+ 'images/config.png',
+ true,
+ [
+ 'title' => __('Edit'),
+ 'class' => 'invert_filter',
+ ]
+ );
+ $tmp->options .= '';
+ }
+
+ // Options. Especial days.
+ $tmp->options .= '';
+ $tmp->options .= html_print_image(
+ 'images/add.png',
+ true,
+ [
+ 'title' => __('Special days'),
+ 'class' => 'invert_filter',
+ ]
+ );
+ $tmp->options .= '';
+
+ if ($is_management_allowed === true && $tmp->id != 1) {
+ // Options. Delete.
+ $tmp->options .= '';
+ $tmp->options .= html_print_image(
+ 'images/cross.png',
+ true,
+ [
+ 'title' => __('Delete'),
+ 'class' => 'invert_filter',
+ ]
+ );
+ $tmp->options .= '';
+ }
+ }
+
+ $carry[] = $tmp;
+ return $carry;
+ }
+ );
+ }
+
+ // Datatables format: RecordsTotal && recordsfiltered.
+ echo json_encode(
+ [
+ 'data' => $data,
+ 'recordsTotal' => $count,
+ 'recordsFiltered' => $count,
+ ]
+ );
+ // Capture output.
+ $response = ob_get_clean();
+ } catch (\Exception $e) {
+ echo json_encode(['error' => $e->getMessage()]);
+ exit;
+ }
+
+ // If not valid, show error with issue.
+ json_decode($response);
+ if (json_last_error() === JSON_ERROR_NONE) {
+ // If valid dump.
+ echo $response;
+ } else {
+ echo json_encode(
+ ['error' => $response]
+ );
+ }
+
+ }
+
+
+ /**
+ * Show a list of models registered in this system.
+ *
+ * @return void
+ */
+ public function showSpecialDays()
+ {
+ global $config;
+ $id_calendar = (int) get_parameter('id_calendar');
+
+ $display_range = (int) get_parameter('display_range', 0);
+ try {
+ // Datatables offset, limit and order.
+ if ($display_range === 0) {
+ $date = date('Y').'-'.date('m').'-1';
+ } else {
+ $date = $display_range.'-1-1';
+ }
+
+ $futureDate = date('Y-m-d', strtotime('+1 year', strtotime($date)));
+
+ $filter = [];
+ $filter['date'] = $date;
+ $filter['futureDate'] = $futureDate;
+ $filter['id_calendar'] = $id_calendar;
+ if (!is_user_admin($config['id_user'])) {
+ $filter['id_group'] = array_keys(
+ users_get_groups(false, 'LM')
+ );
+ }
+
+ $fields = ['`talert_special_days`.*'];
+
+ $specialDays = specialDay::specialDays(
+ // Fields.
+ $fields,
+ // Filter.
+ $filter,
+ // Count.
+ false,
+ // Offset.
+ null,
+ // Limit.
+ null,
+ // Order.
+ null,
+ // Sort field.
+ null,
+ // Reduce array.
+ true
+ );
+ } catch (\Exception $e) {
+ if ($id_calendar > 0) {
+ $this->message = \ui_print_error_message(
+ \__('Special days not found: %s', $e->getMessage()),
+ '',
+ true
+ );
+ }
+ }
+
+ View::render(
+ 'calendar/special_days',
+ [
+ 'ajax_url' => $this->ajaxUrl,
+ 'url' => $this->url.'&tab_calendar=special_days',
+ 'tabs' => $this->getTabs('special_days'),
+ 'message' => $this->message,
+ 'specialDays' => $specialDays,
+ 'id_calendar' => $id_calendar,
+ 'display_range' => $display_range,
+ ]
+ );
+ }
+
+
+ /**
+ * Show form special day.
+ *
+ * @return boolean Continue showing list or not.
+ */
+ public function showSpecialDaysEdition()
+ {
+ global $config;
+
+ $id = (int) get_parameter('id');
+ $new = false;
+ try {
+ $specialDay = new SpecialDay($id);
+ if ($id === 0) {
+ $specialDay->date(get_parameter('date', null));
+ $specialDay->id_calendar(get_parameter('id_calendar', null));
+ $new = true;
+ }
+ } catch (\Exception $e) {
+ if ($id > 0) {
+ $this->message = \ui_print_error_message(
+ \__('SpecialDay not found: %s', $e->getMessage()),
+ '',
+ true
+ );
+ }
+
+ $specialDay = new SpecialDay();
+ $new = true;
+ }
+
+ $action = get_parameter('action');
+ if ($action === 'save') {
+ $success = false;
+
+ $msg_ok = \__('Successfully updated');
+ $msg_err = \__('Failed to update');
+ if ($new === true) {
+ $msg_ok = \__('Successfully created');
+ $msg_err = \__('Failed to create');
+ }
+
+ try {
+ $date = get_parameter('date', null);
+ $id_group = get_parameter('id_group', null);
+ $day_code = get_parameter('day_code', null);
+ $id_calendar = get_parameter('id_calendar', null);
+ $description = get_parameter('description', null);
+ $change = true;
+ if ($new === false
+ && ($date === $specialDay->date()
+ || $id_group === $specialDay->id_group()
+ || $day_code === $specialDay->day_code())
+ ) {
+ $change = false;
+ }
+
+ $specialDay->date($date);
+ $specialDay->id_group($id_group);
+ $specialDay->day_code($day_code);
+ $specialDay->description($description);
+ $specialDay->id_calendar($id_calendar);
+
+ $search = specialDay::specialDays(
+ [ '`talert_special_days`.*' ],
+ [
+ 'date_match' => $specialDay->date(),
+ 'id_group' => [$specialDay->id_group()],
+ 'day_code' => $specialDay->day_code(),
+ ]
+ );
+
+ if ($change === true && empty($search) === false) {
+ $reason = \__(
+ 'Failed saving calendar: already exists',
+ $config['dbconnection']->error
+ );
+ } else {
+ // Save template.
+ if ($specialDay->save() === true) {
+ $success = true;
+ } else {
+ $reason = \__(
+ 'Failed saving special day: ',
+ $config['dbconnection']->error
+ );
+ }
+ }
+ } catch (\Exception $e) {
+ $this->message = \ui_print_error_message(
+ \__('Error: %s', $e->getMessage()),
+ '',
+ true
+ );
+ $success = false;
+ }
+
+ $this->message .= \ui_print_result_message(
+ $success,
+ $msg_ok,
+ sprintf('%s%s', $msg_err, $reason),
+ '',
+ true
+ );
+
+ if ($success === true) {
+ return $success;
+ }
+ }
+
+ View::render(
+ 'calendar/special_days_edit',
+ [
+ 'ajax_url' => $this->ajaxUrl,
+ 'url' => $this->url.'&id_calendar='.$specialDay->id_calendar().'&op=edit&tab_calendar=special_days',
+ 'tabs' => $this->getTabs('special_days'),
+ 'specialDay' => $specialDay,
+ 'message' => $this->message,
+ 'create' => $new,
+ 'id_calendar' => $specialDay->id_calendar(),
+ ]
+ );
+
+ return false;
+ }
+
+
+ /**
+ * AJAX Method, draw Alert Template list.
+ *
+ * @return void
+ */
+ public function drawAlertTemplates()
+ {
+ global $config;
+ $date = get_parameter('date', '');
+ $id_group = get_parameter('id_group', 0);
+ $day_code = get_parameter('day_code', '');
+ $id_calendar = get_parameter('id_calendar', 0);
+
+ $weekdays = [
+ 1 => 'monday',
+ 2 => 'tuesday',
+ 3 => 'wednesday',
+ 4 => 'thursday',
+ 5 => 'friday',
+ 6 => 'saturday',
+ 7 => 'sunday',
+ 8 => 'holidays',
+ ];
+
+ $output = ''.__('Same as %s', $weekdays[$day_code]);
+ $output .= ' » ';
+ $output .= __('Templates not being fired');
+ $output .= '
';
+
+ $columns = [
+ 'name',
+ 'id_group',
+ 'type',
+ 'monday',
+ 'tuesday',
+ 'wednesday',
+ 'thursday',
+ 'friday',
+ 'saturday',
+ 'sunday',
+ ];
+
+ $column_names = [
+ __('Name'),
+ __('Group'),
+ __('Type'),
+ __('Mon'),
+ __('Tue'),
+ __('Wed'),
+ __('Thu'),
+ __('Fri'),
+ __('Sat'),
+ __('Sun'),
+ ];
+ try {
+ $output .= ui_print_datatable(
+ [
+ 'id' => 'templates_alerts_special_days',
+ 'return' => true,
+ 'class' => 'info_table',
+ 'style' => 'width: 100%',
+ 'columns' => $columns,
+ 'column_names' => $column_names,
+ 'ajax_url' => 'godmode/alerts/alert_special_days',
+ 'ajax_data' => [
+ 'method' => 'dataAlertTemplates',
+ 'day_code' => $day_code,
+ 'id_calendar' => $id_calendar,
+ 'id_group' => $id_group,
+ ],
+ 'no_sortable_columns' => [-1],
+ 'order' => [
+ 'field' => 'name',
+ 'direction' => 'asc',
+ ],
+ 'search_button_class' => 'sub filter float-right',
+ 'form' => [
+ 'inputs' => [
+ [
+ 'label' => __('Type'),
+ 'type' => 'select',
+ 'name' => 'type',
+ 'fields' => alerts_get_alert_templates_types(),
+ 'selected' => 0,
+ 'nothing' => 'None',
+ 'nothing_value' => 0,
+ ],
+ [
+ 'label' => __('Search'),
+ 'type' => 'text',
+ 'class' => 'mw250px',
+ 'id' => 'name',
+ 'name' => 'name',
+ ],
+ ],
+ ],
+ ]
+ );
+ } catch (Exception $e) {
+ $output .= $e->getMessage();
+ }
+
+ echo $output;
+
+ return;
+ }
+
+
+ /**
+ * AJAX Method, draw Alert Template list.
+ *
+ * @return array
+ */
+ public function dataAlertTemplates()
+ {
+ global $config;
+ $filters = get_parameter('filter', []);
+ if (empty($filters['type']) === false) {
+ $filter['type'] = $filters['type'];
+ }
+
+ if (empty($filters['name']) === false) {
+ $filter[] = "name LIKE '%".$filters['name']."%'";
+ }
+
+ $id_calendar = (int) get_parameter('id_calendar', 0);
+ $id_group = (int) get_parameter('id_group', 0);
+ $filter['special_day'] = $id_calendar;
+
+ if ($id_group !== 0) {
+ $filter['id_group'] = $id_group;
+ }
+
+ $templates = alerts_get_alert_templates($filter);
+
+ $count = alerts_get_alert_templates($filter, ['COUNT(*) AS total']);
+
+ $day_code = get_parameter('day_code', '');
+
+ $weekdays = [
+ 1 => 'monday',
+ 2 => 'tuesday',
+ 3 => 'wednesday',
+ 4 => 'thursday',
+ 5 => 'friday',
+ 6 => 'saturday',
+ 7 => 'sunday',
+ ];
+
+ $data = [];
+ if (empty($templates) === false) {
+ foreach ($templates as $template) {
+ if ((bool) $template[$weekdays[$day_code]] === false) {
+ $data[] = [
+ 'name' => $template['name'],
+ 'id_group' => ui_print_group_icon(
+ $template['id_group'],
+ true
+ ),
+ 'type' => $template['type'],
+ 'monday' => (bool) $template['monday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'tuesday' => (bool) $template['tuesday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'wednesday' => (bool) $template['wednesday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'thursday' => (bool) $template['thursday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'friday' => (bool) $template['friday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'saturday' => (bool) $template['saturday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ 'sunday' => (bool) $template['sunday'] === true
+ ? html_print_image(
+ 'images/tick.png',
+ true,
+ ['class' => 'invert_filter']
+ )
+ : '',
+ ];
+ }
+ }
+ }
+
+ echo json_encode(
+ [
+ 'data' => $data,
+ 'recordsTotal' => $count[0]['total'],
+ 'recordsFiltered' => count($data),
+ ]
+ );
+
+ return $data;
+ }
+
+
+}
diff --git a/pandora_console/include/functions_alerts.php b/pandora_console/include/functions_alerts.php
index 6ca454695d..19aff75cce 100644
--- a/pandora_console/include/functions_alerts.php
+++ b/pandora_console/include/functions_alerts.php
@@ -2380,118 +2380,6 @@ function get_alert_last_fire_timestamp_in_period($id_alert_module, $period, $dat
}
-/**
- * Insert in talert_special_days a new special day.
- *
- * @param date of special day.
- * @param same day of the week.
- * @param mixed A single value or array of values to insert (can be a multiple a mount of rows).
- *
- * @return mixed False in case of error or invalid values passed. Affected rows otherwise.
- */
-function alerts_create_alert_special_day($date, $same_day, $values=false)
-{
- if (empty($date)) {
- return false;
- }
-
- if (empty($same_day)) {
- return false;
- }
-
- if (! is_array($values)) {
- $values = [];
- }
-
- global $config;
- $date_db = '';
-
- switch ($config['dbtype']) {
- case 'mysql':
- $date_db = 'date';
- break;
-
- case 'oracle':
- $date_db = '"date"';
- break;
- }
-
- $values[$date_db] = $date;
- $values['same_day'] = $same_day;
-
- return @db_process_sql_insert('talert_special_days', $values);
-}
-
-
-/**
- * Update a special day in talert_special_days.
- *
- * @param int special day Id.
- * @param mixed Array of values to update.
- *
- * @return mixed False in case of error or invalid values passed. Affected rows otherwise
- */
-function alerts_update_alert_special_day($id_special_day, $values)
-{
- $id_special_day = safe_int($id_special_day, 1);
-
- if (empty($id_special_day)) {
- return false;
- }
-
- if (! is_array($values)) {
- return false;
- }
-
- return (@db_process_sql_update(
- 'talert_special_days',
- $values,
- ['id' => $id_special_day]
- )) !== false;
-}
-
-
-/**
- * Delete a special day in talert_special_days.
- *
- * @param int special day Id.
- *
- * @return mixed False in case of error or invalid values passed. Affected rows otherwise
- */
-function alerts_delete_alert_special_day($id_special_day)
-{
- $id_special_day = safe_int($id_special_day, 1);
-
- if (empty($id_special_day)) {
- return false;
- }
-
- return (@db_process_sql_delete(
- 'talert_special_days',
- ['id' => $id_special_day]
- )) !== false;
-}
-
-
-/**
- * Get a special day in talert_special_days.
- *
- * @param int special day Id.
- *
- * @return mixed False in case of error or invalid values passed. All row of the selected command otherwise
- */
-function alerts_get_alert_special_day($id_special_day)
-{
- $id_special_day = safe_int($id_special_day, 1);
-
- if (empty($id_special_day)) {
- return false;
- }
-
- return db_get_row('talert_special_days', 'id', $id_special_day);
-}
-
-
/**
* Get number of alert fired that an action is executed. Only fot non default alerts
*
diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php
index 0ee513a877..bfdc8c712e 100644
--- a/pandora_console/include/functions_api.php
+++ b/pandora_console/include/functions_api.php
@@ -55,6 +55,7 @@ enterprise_include_once('include/functions_alerts.php');
// Clases.
use PandoraFMS\Module;
use PandoraFMS\Enterprise\Cluster;
+use PandoraFMS\SpecialDay;
/**
@@ -14131,7 +14132,7 @@ function api_get_special_days($thrash1, $thrash2, $other, $thrash3)
*
* @param $thrash1 Don't use.
* @param $thrash2 Don't use.
- * @param array $other it's array, $other as param is ;;;; in this order
+ * @param array $other it's array, $other as param is ;;;; in this order
* and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_)
* @param $thrash3 Don't use
*
@@ -14150,6 +14151,7 @@ function api_set_create_special_day($thrash1, $thrash2, $other, $thrash3)
$same_day = $other['data'][1];
$description = $other['data'][2];
$idGroup = $other['data'][3];
+ $calendar_name = (isset($other['data'][4]) === true) ? $other['data'][4] : 'Default';
if (!check_acl($config['id_user'], $idGroup, 'LM', true)) {
returnError('forbidden', 'string');
@@ -14186,17 +14188,51 @@ function api_set_create_special_day($thrash1, $thrash2, $other, $thrash3)
}
}
- $values = [
- 'description' => $other['data'][2],
- 'id_group' => $other['data'][3],
+ $weekdays = [
+ 'monday' => 1,
+ 'tuesday' => 2,
+ 'wednesday' => 3,
+ 'thursday' => 4,
+ 'friday' => 5,
+ 'saturday' => 6,
+ 'sunday' => 7,
+ 'holiday' => 8,
];
- $idSpecialDay = alerts_create_alert_special_day($special_day, $same_day, $values);
+ $day_code = (isset($weekdays[$same_day]) === true) ? $weekdays[$same_day] : 0;
- if (is_error($idSpecialDay)) {
- returnError('Special Day could not be created');
- } else {
- returnData('string', ['type' => 'string', 'data' => $idSpecialDay]);
+ if ($day_code === 0) {
+ returnError('Special Day could not be created. Same day doesn\'t exists.');
+ return;
+ }
+
+ $id_calendar = db_get_value_sql(
+ sprintf(
+ 'SELECT id FROM talert_calendar WHERE name="%s"',
+ $calendar_name
+ )
+ );
+
+ if ($id_calendar === false) {
+ returnError('Special Day could not be created. Calendar doesn\'t exists.');
+ return;
+ }
+
+ try {
+ $sd = new SpecialDay();
+ $sd->date($special_day);
+ $sd->id_group($idGroup);
+ $sd->day_code($day_code);
+ $sd->description($description);
+ $sd->id_calendar($id_calendar);
+ $sd->save();
+ if ($sd->save() === true) {
+ returnData('string', ['type' => 'string', 'data' => $sd->id()]);
+ } else {
+ returnError('Special Day could not be created');
+ }
+ } catch (Exception $e) {
+ returnData('string', ['type' => 'string', 'data' => $e]);
}
}
@@ -14693,7 +14729,7 @@ function api_set_recreate_service_modules($id, $id_agent)
*
* @param string $id Id of the special day to update.
* @param $thrash2 Don't use.
- * @param array $other it's array, $other as param is ;;;; in this order
+ * @param array $other it's array, $other as param is ;;;; in this order
* and separator char (after text ; ) and separator (pass in param othermode as othermode=url_encode_separator_)
* @param $thrash3 Don't use
*
@@ -14709,9 +14745,10 @@ function api_set_update_special_day($id_special_day, $thrash2, $other, $thrash3)
}
$special_day = $other['data'][0];
- $same_day = $other['data'][1];
+ $day_code = $other['data'][1];
$description = $other['data'][2];
$idGroup = $other['data'][3];
+ $id_calendar = $other['data'][4];
if (!check_acl($config['id_user'], $idGroup, 'LM', true)) {
returnError('forbidden', 'string');
@@ -14742,24 +14779,22 @@ function api_set_update_special_day($id_special_day, $thrash2, $other, $thrash3)
return;
}
- $return = db_process_sql_update(
- 'talert_special_days',
- [
- 'date' => $special_day,
- 'same_day' => $same_day,
- 'description' => $description,
- 'id_group' => $idGroup,
- ],
- ['id' => $id_special_day]
- );
-
- returnData(
- 'string',
- [
- 'type' => 'string',
- 'data' => (int) ((bool) $return),
- ]
- );
+ try {
+ $sd = new SpecialDay();
+ $sd->date($special_day);
+ $sd->id_group($idGroup);
+ $sd->day_code($day_code);
+ $sd->description($description);
+ $sd->id_calendar($id_calendar);
+ $sd->save();
+ if ($sd->save() === true) {
+ returnError('Special Day could not be updated');
+ } else {
+ returnData('string', ['type' => 'string', 'data' => $sd->id()]);
+ }
+ } catch (Exception $e) {
+ returnData('string', ['type' => 'string', 'data' => $e]);
+ }
}
@@ -14805,13 +14840,20 @@ function api_set_delete_special_day($id_special_day, $thrash2, $thrash3, $thrash
return;
}
- $return = alerts_delete_alert_special_day($id_special_day);
+ try {
+ $specialDay = new SpecialDay($id_special_day);
+ } catch (\Exception $e) {
+ if ($id > 0) {
+ returnError('The Special Day could not be deleted.');
+ }
- if (is_error($return)) {
- returnError('The Special Day could not be deleted.');
- } else {
- returnData('string', ['type' => 'string', 'data' => $return]);
+ return;
}
+
+ // Remove.
+ $specialDay->delete();
+ $return = 'success';
+ returnData('string', ['type' => 'string', 'data' => $return]);
}
diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php
index 804bf56024..06d56df4ed 100644
--- a/pandora_console/include/functions_html.php
+++ b/pandora_console/include/functions_html.php
@@ -4032,15 +4032,19 @@ function html_print_input_file($name, $return=false, $options=false)
if ($options) {
if (isset($options['size'])) {
- $output .= 'size="'.$options['size'].'"';
+ $output .= ' size="'.$options['size'].'"';
}
if (isset($options['disabled'])) {
- $output .= 'disabled="disabled"';
+ $output .= ' disabled="disabled"';
}
if (isset($options['class'])) {
- $output .= 'class="'.$options['class'].'"';
+ $output .= ' class="'.$options['class'].'"';
+ }
+
+ if (isset($options['required'])) {
+ $output .= ' required';
}
}
diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php
index bb4193a9b7..03ec3ee614 100755
--- a/pandora_console/include/functions_ui.php
+++ b/pandora_console/include/functions_ui.php
@@ -3591,19 +3591,87 @@ function ui_print_datatable(array $parameters)
// Order.
$err_msg = '';
$output = $err_msg.$filter.$extra.$table.$js;
+ if (is_ajax() === false) {
+ ui_require_css_file('datatables.min', 'include/styles/js/');
+ ui_require_css_file('tables');
+ if (is_metaconsole()) {
+ ui_require_css_file('tables_meta', ENTERPRISE_DIR.'/include/styles/');
+ }
- ui_require_css_file('datatables.min', 'include/styles/js/');
- ui_require_css_file('tables');
- if (is_metaconsole()) {
- ui_require_css_file('tables_meta', ENTERPRISE_DIR.'/include/styles/');
+ ui_require_javascript_file('datatables.min');
+ ui_require_javascript_file('buttons.dataTables.min');
+ ui_require_javascript_file('dataTables.buttons.min');
+ ui_require_javascript_file('buttons.html5.min');
+ ui_require_javascript_file('buttons.print.min');
+ } else {
+ // Load tables.css.
+ $output .= '';
+ if (is_metaconsole() === true) {
+ // Load tables_meta.css.
+ $output .= '';
+ }
+
+ // Load datatables.js.
+ $output .= '';
+ // Load buttons.dataTables.min.js.
+ $output .= '';
+ // Load dataTables.buttons.min.js.
+ $output .= '';
+ // Load buttons.html5.min.js.
+ $output .= '';
+ // Load buttons.print.min.js.
+ $output .= '';
}
- ui_require_javascript_file('datatables.min');
- ui_require_javascript_file('buttons.dataTables.min');
- ui_require_javascript_file('dataTables.buttons.min');
- ui_require_javascript_file('buttons.html5.min');
- ui_require_javascript_file('buttons.print.min');
-
if (isset($parameters['return']) && $parameters['return'] == true) {
// Compat.
$parameters['print'] = false;
diff --git a/pandora_console/include/javascript/pandora_alerts.js b/pandora_console/include/javascript/pandora_alerts.js
index 7ecded70c8..b527067290 100644
--- a/pandora_console/include/javascript/pandora_alerts.js
+++ b/pandora_console/include/javascript/pandora_alerts.js
@@ -1,5 +1,4 @@
-/* globals $ */
-
+/* globals $ confirmDialog uniqId showMsg*/
function parse_alert_command(command, classs) {
if (classs == "recovery") {
classs = "fields_recovery";
@@ -36,21 +35,64 @@ function parse_alert_command(command, classs) {
return command;
}
+// eslint-disable-next-line no-unused-vars
function render_command_preview(original_command) {
$("#textarea_command_preview").html(
parse_alert_command(original_command, "")
);
}
+// eslint-disable-next-line no-unused-vars
function render_command_recovery_preview(original_command) {
$("#textarea_command_recovery_preview").html(
parse_alert_command(original_command, "recovery")
);
}
+// eslint-disable-next-line no-unused-vars
function render_command_description(command_description) {
if (command_description != "") {
command_description = "
" + command_description;
}
$("#command_description").html(command_description);
}
+
+// eslint-disable-next-line no-unused-vars
+function load_templates_alerts_special_days(settings) {
+ confirmDialog({
+ title: settings.title,
+ message: function() {
+ var id = "div-" + uniqId();
+ $.ajax({
+ method: "post",
+ url: settings.url,
+ data: {
+ page: settings.page,
+ method: "drawAlertTemplates",
+ date: settings.date,
+ id_group: settings.id_group,
+ day_code: settings.day_code,
+ id_calendar: settings.id_calendar
+ },
+ datatype: "html",
+ success: function(data) {
+ $("#" + id)
+ .empty()
+ .html(data);
+ },
+ error: function(e) {
+ showMsg(e);
+ }
+ });
+
+ return "" + settings.loading + "
";
+ },
+ ok: settings.btn_ok_text,
+ cancel: settings.btn_cancel_text,
+ onAccept: function() {
+ $("#" + settings.name_form).submit();
+ },
+ size: 750,
+ maxHeight: 500
+ });
+}
diff --git a/pandora_console/include/lib/Calendar.php b/pandora_console/include/lib/Calendar.php
new file mode 100644
index 0000000000..3b6b1560fe
--- /dev/null
+++ b/pandora_console/include/lib/Calendar.php
@@ -0,0 +1,274 @@
+ $id];
+
+ $this->existsInDB = false;
+
+ if (is_numeric($id) === true
+ && $id > 0
+ ) {
+ parent::__construct(
+ $table,
+ $filter,
+ null,
+ false
+ );
+ $this->existsInDB = true;
+ } else {
+ // Create empty skel.
+ parent::__construct($table, null);
+ }
+ }
+
+
+ /**
+ * Saves current definition to database.
+ *
+ * @return mixed Affected rows of false in case of error.
+ * @throws \Exception On error.
+ */
+ public function save()
+ {
+ if ($this->fields['id'] > 0) {
+ // Update.
+ $updates = $this->fields;
+
+ $rs = \db_process_sql_update(
+ $this->table,
+ $updates,
+ ['id' => $this->fields['id']]
+ );
+
+ if ($rs === false) {
+ global $config;
+ throw new \Exception(
+ __METHOD__.' error: '.$config['dbconnection']->error
+ );
+ }
+ } else {
+ // Creation.
+ $inserts = $this->fields;
+
+ // Clean null fields.
+ foreach ($inserts as $k => $v) {
+ if ($v === null) {
+ unset($inserts[$k]);
+ }
+ }
+
+ $rs = \db_process_sql_insert(
+ $this->table,
+ $inserts
+ );
+
+ if ($rs === false) {
+ global $config;
+ throw new \Exception(
+ __METHOD__.' error: '.$config['dbconnection']->error
+ );
+ }
+
+ $this->fields['id'] = $rs;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Remove this calendar.
+ *
+ * @return void
+ */
+ public function delete()
+ {
+ if ($this->existsInDB === true) {
+ \db_process_delete_temp(
+ $this->table,
+ 'id',
+ $this->fields['id']
+ );
+ }
+ }
+
+
+ /**
+ * Returns an array with all calendar filtered.
+ *
+ * @param array $fields Fields array or 'count' keyword to retrieve count.
+ * @param array $filter Filters to be applied.
+ * @param boolean $count Retrieve count of items instead results.
+ * @param integer $offset Offset (pagination).
+ * @param integer $limit Limit (pagination).
+ * @param string $order Sort order.
+ * @param string $sort_field Sort field.
+ * @param boolean $select_options Array options for select.
+ *
+ * @return array With all results.
+ * @throws \Exception On error.
+ */
+ public static function calendars(
+ array $fields=[ '`talert_calendar`.*' ],
+ array $filter=[],
+ bool $count=false,
+ ?int $offset=null,
+ ?int $limit=null,
+ ?string $order=null,
+ ?string $sort_field=null,
+ ?bool $select_options=false
+ ) {
+ $sql_filters = [];
+ $order_by = '';
+ $pagination = '';
+
+ if (isset($filter['free_search']) === true
+ && empty($filter['free_search']) === false
+ ) {
+ $sql_filters[] = vsprintf(
+ ' AND (`talert_calendar`.`name` like "%%%s%%"
+ OR `talert_calendar`.`description` like "%%%s%%")',
+ array_fill(0, 2, $filter['free_search'])
+ );
+ }
+
+ if (isset($order) === true) {
+ $dir = 'asc';
+ if ($order === 'desc') {
+ $dir = 'desc';
+ };
+
+ if (in_array(
+ $sort_field,
+ [ 'name' ]
+ ) === true
+ ) {
+ $order_by = sprintf(
+ 'ORDER BY `talert_calendar`.`%s` %s',
+ $sort_field,
+ $dir
+ );
+ } else {
+ // Custom field order.
+ $order_by = sprintf(
+ 'ORDER BY `%s` %s',
+ $sort_field,
+ $dir
+ );
+ }
+ }
+
+ if (isset($limit) === true && $limit > 0
+ && isset($offset) === true && $offset >= 0
+ ) {
+ $pagination = sprintf(
+ ' LIMIT %d OFFSET %d ',
+ $limit,
+ $offset
+ );
+ }
+
+ $sql = sprintf(
+ 'SELECT %s
+ FROM `talert_calendar`
+ WHERE 1=1
+ %s
+ %s
+ %s',
+ join(',', $fields),
+ join(' ', $sql_filters),
+ $order_by,
+ $pagination
+ );
+
+ if ($count === true) {
+ $sql = sprintf('SELECT count(*) as n FROM ( %s ) tt', $sql);
+
+ return ['count' => \db_get_value_sql($sql)];
+ }
+
+ $return = \db_get_all_rows_sql($sql);
+
+ if (is_array($return) === false) {
+ return [];
+ }
+
+ if ($select_options === true) {
+ $return = array_reduce(
+ $return,
+ function ($carry, $item) {
+ $carry[$item['id']] = $item['name'];
+ return $carry;
+ }
+ );
+ }
+
+ return $return;
+ }
+
+
+}
diff --git a/pandora_console/include/lib/SpecialDay.php b/pandora_console/include/lib/SpecialDay.php
new file mode 100644
index 0000000000..bd7816b94c
--- /dev/null
+++ b/pandora_console/include/lib/SpecialDay.php
@@ -0,0 +1,310 @@
+ $id];
+
+ $this->existsInDB = false;
+
+ if (is_numeric($id) === true
+ && $id > 0
+ ) {
+ parent::__construct(
+ $table,
+ $filter,
+ null,
+ false
+ );
+ $this->existsInDB = true;
+ } else {
+ // Create empty skel.
+ parent::__construct($table, null);
+ }
+ }
+
+
+ /**
+ * Saves current definition to database.
+ *
+ * @return mixed Affected rows of false in case of error.
+ * @throws \Exception On error.
+ */
+ public function save()
+ {
+ if ($this->fields['id'] > 0) {
+ // Update.
+ $updates = $this->fields;
+
+ $rs = \db_process_sql_update(
+ $this->table,
+ $updates,
+ ['id' => $this->fields['id']]
+ );
+
+ if ($rs === false) {
+ global $config;
+ throw new \Exception(
+ __METHOD__.' error: '.$config['dbconnection']->error
+ );
+ }
+ } else {
+ // Creation.
+ $inserts = $this->fields;
+
+ // Clean null fields.
+ foreach ($inserts as $k => $v) {
+ if ($v === null) {
+ unset($inserts[$k]);
+ }
+ }
+
+ $rs = \db_process_sql_insert(
+ $this->table,
+ $inserts
+ );
+
+ if ($rs === false) {
+ global $config;
+ throw new \Exception(
+ __METHOD__.' error: '.$config['dbconnection']->error
+ );
+ }
+
+ $this->fields['id'] = $rs;
+ }
+
+ return true;
+ }
+
+
+ /**
+ * Remove this Special day.
+ *
+ * @return void
+ */
+ public function delete()
+ {
+ if ($this->existsInDB === true) {
+ \db_process_delete_temp(
+ $this->table,
+ 'id',
+ $this->fields['id']
+ );
+ }
+ }
+
+
+ /**
+ * Returns an array with all special days filtered.
+ *
+ * @param array $fields Fields array or 'count' keyword to retrieve count.
+ * @param array $filter Filters to be applied.
+ * @param boolean $count Retrieve count of items instead results.
+ * @param integer $offset Offset (pagination).
+ * @param integer $limit Limit (pagination).
+ * @param string $order Sort order.
+ * @param string $sort_field Sort field.
+ * @param boolean $reduce Reduce result [Year][month][day].
+ *
+ * @return array With all results.
+ * @throws \Exception On error.
+ */
+ public static function specialDays(
+ array $fields=[ '`talert_special_days`.*' ],
+ array $filter=[],
+ bool $count=false,
+ ?int $offset=null,
+ ?int $limit=null,
+ ?string $order=null,
+ ?string $sort_field=null,
+ ?bool $reduce=false
+ ) {
+ $sql_filters = [];
+ $order_by = '';
+ $pagination = '';
+
+ if (isset($filter['free_search']) === true
+ && empty($filter['free_search']) === false
+ ) {
+ $sql_filters[] = vsprintf(
+ ' AND `talert_special_days`.`name` like "%%%s%%"',
+ array_fill(0, 1, $filter['free_search'])
+ );
+ }
+
+ if (isset($filter['id_calendar']) === true
+ && empty($filter['id_calendar']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`id_calendar` = %d',
+ $filter['id_calendar']
+ );
+ }
+
+ if (isset($filter['date']) === true
+ && empty($filter['date']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`date` >= "%s"',
+ $filter['date']
+ );
+ }
+
+ if (isset($filter['futureDate']) === true
+ && empty($filter['futureDate']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`date` <= "%s"',
+ $filter['futureDate']
+ );
+ }
+
+ if (isset($filter['id_group']) === true
+ && empty($filter['id_group']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`id_group` IN ("%s")',
+ implode(',', $filter['id_group'])
+ );
+ }
+
+ if (isset($filter['date_match']) === true
+ && empty($filter['date_match']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`date` = "%s"',
+ $filter['date_match']
+ );
+ }
+
+ if (isset($filter['day_code']) === true
+ && empty($filter['day_code']) === false
+ ) {
+ $sql_filters[] = sprintf(
+ ' AND `talert_special_days`.`day_code` = %d',
+ $filter['day_code']
+ );
+ }
+
+ if (isset($order) === true) {
+ $dir = 'asc';
+ if ($order === 'desc') {
+ $dir = 'desc';
+ };
+
+ if (in_array(
+ $sort_field,
+ [ 'name' ]
+ ) === true
+ ) {
+ $order_by = sprintf(
+ 'ORDER BY `talert_special_days`.`%s` %s',
+ $sort_field,
+ $dir
+ );
+ } else {
+ // Custom field order.
+ $order_by = sprintf(
+ 'ORDER BY `%s` %s',
+ $sort_field,
+ $dir
+ );
+ }
+ }
+
+ if (isset($limit) === true && $limit > 0
+ && isset($offset) === true && $offset >= 0
+ ) {
+ $pagination = sprintf(
+ ' LIMIT %d OFFSET %d ',
+ $limit,
+ $offset
+ );
+ }
+
+ $sql = sprintf(
+ 'SELECT %s
+ FROM `talert_special_days`
+ WHERE 1=1
+ %s
+ %s
+ %s',
+ join(',', $fields),
+ join(' ', $sql_filters),
+ $order_by,
+ $pagination
+ );
+
+ if ($count === true) {
+ $sql = sprintf('SELECT count(*) as n FROM ( %s ) tt', $sql);
+
+ return ['count' => \db_get_value_sql($sql)];
+ }
+
+ $return = \db_get_all_rows_sql($sql);
+
+ if (is_array($return) === false) {
+ return [];
+ }
+
+ if ($reduce === true) {
+ $return = array_reduce(
+ $return,
+ function ($carry, $item) {
+ $year = date('Y', strtotime($item['date']));
+ $month = date('n', strtotime($item['date']));
+ $day = date('j', strtotime($item['date']));
+ $carry[$year][$month][$day][] = $item;
+ return $carry;
+ }
+ );
+ }
+
+ return $return;
+ }
+
+
+}
diff --git a/pandora_console/include/styles/alert.css b/pandora_console/include/styles/alert.css
index 52320eb741..a18d1eb9d6 100644
--- a/pandora_console/include/styles/alert.css
+++ b/pandora_console/include/styles/alert.css
@@ -292,3 +292,54 @@ div#rules.show {
#rules select.click-list-elements:focus {
outline-color: transparent;
}
+
+#icalendar-special-days {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ align-items: center;
+ background-color: #fff;
+ border: 1px solid #e1e1e1;
+ border-radius: 5px;
+ padding: 20px 50px;
+}
+
+#icalendar-special-days ul.wizard {
+ flex: 0;
+}
+
+#icalendar-special-days ul.wizard:first-child {
+ flex: 1 1 100%;
+ display: flex;
+ flex-direction: row;
+ flex-wrap: nowrap;
+ justify-content: space-between;
+ align-items: center;
+ margin-right: 80px;
+}
+
+.note-special-day {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ justify-content: space-between;
+ align-items: center;
+ align-content: center;
+}
+
+.note-special-day div {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ align-content: center;
+}
+
+.note-special-day div a.tip {
+ margin: 0px;
+ margin-right: 2px;
+}
+
+.note-special-day div a.tip > img {
+ margin: 0px;
+}
diff --git a/pandora_console/pandoradb.sql b/pandora_console/pandoradb.sql
index d40975cd1f..c75a4c616e 100644
--- a/pandora_console/pandoradb.sql
+++ b/pandora_console/pandoradb.sql
@@ -570,16 +570,31 @@ CREATE TABLE IF NOT EXISTS `talert_template_module_actions` (
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+-- -----------------------------------------------------
+-- Table `talert_calendar`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `talert_calendar` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(100) NOT NULL default '',
+ `id_group` INT(10) NOT NULL DEFAULT 0,
+ `description` text,
+ PRIMARY KEY (`id`),
+ UNIQUE (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
-- -----------------------------------------------------
-- Table `talert_special_days`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `talert_special_days` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `id_calendar` int(10) unsigned NOT NULL DEFAULT 1,
`id_group` INT(10) NOT NULL DEFAULT 0,
`date` date NOT NULL DEFAULT '1970-01-01',
- `same_day` enum('monday','tuesday','wednesday','thursday','friday','saturday','sunday') NOT NULL DEFAULT 'sunday',
+ `day_code` tinyint(2) NOT NULL,
`description` text,
- PRIMARY KEY (`id`)
+ PRIMARY KEY (`id`),
+ FOREIGN KEY (`id_calendar`) REFERENCES talert_calendar(`id`)
+ ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- -----------------------------------------------------
diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql
index 69802ec826..da203476bd 100644
--- a/pandora_console/pandoradb_data.sql
+++ b/pandora_console/pandoradb_data.sql
@@ -2777,3 +2777,5 @@ INSERT INTO `tncm_script` VALUES
(5,5,'enable
expect:Password:\s*
_enablepass_
term length 0
config term
end
end
exit
');
INSERT INTO `tncm_template_scripts`(`id_template`, `id_script`) VALUES (1,1),(1,2),(1,3),(1,4),(1,5);
+
+INSERT INTO `talert_calendar` VALUES (1, 'Default', 0, 'Default calendar');
diff --git a/pandora_console/views/calendar/edit.php b/pandora_console/views/calendar/edit.php
new file mode 100644
index 0000000000..17d25fa97b
--- /dev/null
+++ b/pandora_console/views/calendar/edit.php
@@ -0,0 +1,140 @@
+';
+ $url_link .= __('metaconsole');
+ $url_link .= '';
+ } else {
+ $url_link = __('any node');
+ }
+
+ \ui_print_warning_message(
+ __(
+ 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.',
+ $url_link
+ )
+ );
+}
+
+if (empty($message) === false) {
+ echo $message;
+}
+
+$inputs = [];
+
+// Name.
+$inputs[] = [
+ 'label' => __('Name'),
+ 'arguments' => [
+ 'type' => 'text',
+ 'name' => 'name',
+ 'required' => true,
+ 'value' => $calendar->name(),
+ ],
+];
+
+// Group.
+$inputs[] = [
+ 'label' => __('Group'),
+ 'arguments' => [
+ 'type' => 'select_groups',
+ 'returnAllGroup' => true,
+ 'name' => 'id_group',
+ 'selected' => $calendar->id_group(),
+ 'required' => true,
+ ],
+];
+
+// Description.
+$inputs[] = [
+ 'label' => __('Description'),
+ 'arguments' => [
+ 'type' => 'textarea',
+ 'name' => 'description',
+ 'required' => false,
+ 'value' => $calendar->description(),
+ 'rows' => 50,
+ 'columns' => 30,
+ ],
+];
+
+
+if ($is_management_allowed === true) {
+ // Submit.
+ $inputs[] = [
+ 'arguments' => [
+ 'name' => 'button',
+ 'label' => (($create === true) ? __('Create') : __('Update')),
+ 'type' => 'submit',
+ 'attributes' => 'class="sub next"',
+ ],
+ ];
+}
+
+// Print form.
+HTML::printForm(
+ [
+ 'form' => [
+ 'action' => $url.'&op=edit&action=save&id='.$calendar->id(),
+ 'method' => 'POST',
+ ],
+ 'inputs' => $inputs,
+ ],
+ false,
+ true
+);
+
+\enterprise_hook('close_meta_frame');
diff --git a/pandora_console/views/calendar/list.php b/pandora_console/views/calendar/list.php
new file mode 100644
index 0000000000..80a1811b8f
--- /dev/null
+++ b/pandora_console/views/calendar/list.php
@@ -0,0 +1,154 @@
+';
+ $url_link .= __('metaconsole');
+ $url_link .= '';
+ } else {
+ $url_link = __('any node');
+ }
+
+ \ui_print_warning_message(
+ __(
+ 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.',
+ $url_link
+ )
+ );
+}
+
+if (empty($message) === false) {
+ echo $message;
+}
+
+// Datatables list.
+try {
+ $columns = [
+ [
+ 'text' => 'id',
+ 'class' => 'invisible',
+ ],
+ 'name',
+ 'id_group',
+ 'description',
+ [
+ 'text' => 'options',
+ 'class' => 'w150px action_buttons',
+ ],
+ ];
+
+ $column_names = [
+ __('ID'),
+ __('Name'),
+ __('Group'),
+ __('Description'),
+ __('Options'),
+ ];
+
+ $tableId = 'calendar_list';
+ // Load datatables user interface.
+ ui_print_datatable(
+ [
+ 'id' => $tableId,
+ 'class' => 'info_table',
+ 'style' => 'width: 100%',
+ 'columns' => $columns,
+ 'column_names' => $column_names,
+ 'ajax_url' => $ajax_url,
+ 'ajax_data' => ['method' => 'drawListCalendar'],
+ 'no_sortable_columns' => [-1],
+ 'order' => [
+ 'field' => 'id',
+ 'direction' => 'asc',
+ ],
+ 'search_button_class' => 'sub filter float-right',
+ 'form' => [
+ 'inputs' => [
+ [
+ 'label' => __('Free search'),
+ 'type' => 'text',
+ 'class' => 'mw250px',
+ 'id' => 'free_search',
+ 'name' => 'free_search',
+ ],
+ ],
+ ],
+ ]
+ );
+} catch (Exception $e) {
+ echo $e->getMessage();
+}
+
+if ((bool) check_acl($config['id_user'], 0, 'LM') === true) {
+ HTML::printForm(
+ [
+ 'form' => [
+ 'action' => $url.'&op=edit',
+ 'method' => 'POST',
+ ],
+ 'inputs' => [
+ [
+ 'arguments' => [
+ 'name' => 'button',
+ 'label' => __('Create'),
+ 'type' => 'submit',
+ 'attributes' => 'class="sub next"',
+ ],
+ ],
+ ],
+ ]
+ );
+}
+
+\enterprise_hook('close_meta_frame');
diff --git a/pandora_console/views/calendar/special_days.php b/pandora_console/views/calendar/special_days.php
new file mode 100644
index 0000000000..4c50485d67
--- /dev/null
+++ b/pandora_console/views/calendar/special_days.php
@@ -0,0 +1,515 @@
+';
+ $url_link .= __('metaconsole');
+ $url_link .= '';
+ } else {
+ $url_link = __('any node');
+ }
+
+ \ui_print_warning_message(
+ __(
+ 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.',
+ $url_link
+ )
+ );
+}
+
+if (empty($message) === false) {
+ echo $message;
+}
+
+$inputs = [];
+
+// Name.
+$inputs[] = [
+ 'label' => __('iCalendar(.ics) file'),
+ 'arguments' => [
+ 'name' => 'ical_file',
+ 'type' => 'file',
+ 'columns' => 25,
+ 'rows' => 10,
+ 'options' => ['required' => 1],
+ ],
+];
+
+$days = [];
+$days['monday'] = __('Monday');
+$days['tuesday'] = __('Tuesday');
+$days['wednesday'] = __('Wednesday');
+$days['thursday'] = __('Thursday');
+$days['friday'] = __('Friday');
+$days['saturday'] = __('Saturday');
+$days['sunday'] = __('Sunday');
+
+// Same day of the week.
+$inputs[] = [
+ 'label' => __('Same day of the week'),
+ 'arguments' => [
+ 'name' => 'day_code',
+ 'type' => 'select',
+ 'fields' => $days,
+ ],
+];
+
+// Group.
+$inputs[] = [
+ 'label' => __('Group'),
+ 'arguments' => [
+ 'type' => 'select_groups',
+ 'returnAllGroup' => true,
+ 'name' => 'id_group',
+ ],
+];
+
+// Group.
+$inputs[] = [
+ 'label' => __('Overwrite').ui_print_help_tip(
+ __('Check this box, if you want to overwrite existing same days.'),
+ true
+ ),
+ 'arguments' => [
+ 'type' => 'checkbox',
+ 'name' => 'overwrite',
+ 'id' => 'overwrite',
+ 'disabled_hidden' => true,
+ ],
+];
+
+// Submit.
+$inputs[] = [
+ 'arguments' => [
+ 'name' => 'button',
+ 'label' => __('Upload'),
+ 'type' => 'submit',
+ 'attributes' => 'class="sub next"',
+ ],
+];
+
+if ($is_management_allowed === true) {
+ // Print form.
+ HTML::printForm(
+ [
+ 'form' => [
+ 'action' => $url.'&op=upload_ical&id='.$id_calendar,
+ 'method' => 'POST',
+ 'id' => 'icalendar-special-days',
+ 'enctype' => 'multipart/form-data',
+ ],
+ 'inputs' => $inputs,
+ ],
+ false
+ );
+}
+
+
+$this_year = date('Y');
+$this_month = date('m');
+
+$filter = [];
+if (!is_user_admin($config['id_user'])) {
+ $filter['id_group'] = array_keys(users_get_groups(false, 'LM'));
+}
+
+$url = $url.'&id_calendar='.$id_calendar;
+
+// Show display range.
+$html = "".__('Display range: ');
+if ($display_range) {
+ $html .= '['.__('Default').'] ';
+ if ($display_range > 1970) {
+ $html .= '<< ';
+ }
+
+ $html .= '['.$display_range.']';
+ $html .= ' >>';
+} else {
+ $html .= '['.__('Default').'] ';
+ $html .= '<< ';
+ $html .= '[';
+ $html .= $this_year;
+ $html .= ']';
+ $html .= ' >>';
+}
+
+$html .= ' |
';
+echo $html;
+
+// Show calendar.
+for ($month = 1; $month <= 12; $month++) {
+ if ($display_range) {
+ $display_month = $month;
+ $display_year = $display_range;
+ } else {
+ $display_month = ($this_month + $month - 1);
+ $display_year = $this_year;
+ }
+
+ if ($display_month > 12) {
+ $display_month -= 12;
+ $display_year++;
+ }
+
+ $cal_table = new stdClass();
+ $cal_table->width = '100%';
+ $cal_table->class = 'databox data';
+
+ $cal_table->data = [];
+ $cal_table->head = [];
+ $cal_table->head[0] = __('Sun');
+ $cal_table->head[1] = __('Mon');
+ $cal_table->head[2] = __('Tue');
+ $cal_table->head[3] = __('Wed');
+ $cal_table->head[4] = __('Thu');
+ $cal_table->head[5] = __('Fri');
+ $cal_table->head[6] = __('Sat');
+ $cal_table->cellstyle = [];
+ $cal_table->size = [];
+ $cal_table->size[0] = '14%';
+ $cal_table->size[1] = '14%';
+ $cal_table->size[2] = '14%';
+ $cal_table->size[3] = '14%';
+ $cal_table->size[4] = '14%';
+ $cal_table->size[5] = '14%';
+ $cal_table->size[6] = '14%';
+ $cal_table->align = [];
+ $cal_table->border = '1';
+ $cal_table->titlestyle = 'text-align:center; font-weight: bold;';
+ switch ($display_month) {
+ case 1:
+ $cal_table->title = __('January');
+ break;
+
+ case 2:
+ $cal_table->title = __('February');
+ break;
+
+ case 3:
+ $cal_table->title = __('March');
+ break;
+
+ case 4:
+ $cal_table->title = __('April');
+ break;
+
+ case 5:
+ $cal_table->title = __('May');
+ break;
+
+ case 6:
+ $cal_table->title = __('June');
+ break;
+
+ case 7:
+ $cal_table->title = __('July');
+ break;
+
+ case 8:
+ $cal_table->title = __('August');
+ break;
+
+ case 9:
+ $cal_table->title = __('September');
+ break;
+
+ case 10:
+ $cal_table->title = __('October');
+ break;
+
+ case 11:
+ $cal_table->title = __('November');
+ break;
+
+ case 12:
+ $cal_table->title = __('December');
+ break;
+
+ default:
+ // Not possible.
+ break;
+ }
+
+ $cal_table->title .= ' / '.$display_year;
+
+ $last_day = date('j', mktime(0, 0, 0, ($display_month + 1), 0, $display_year));
+ $cal_line = 0;
+
+ for ($day = 1; $day < ($last_day + 1); $day++) {
+ $week = date('w', mktime(0, 0, 0, $display_month, $day, $display_year));
+ if ($cal_line == 0 && $week != 0 && $day == 1) {
+ for ($i = 0; $i < $week; $i++) {
+ $cal_table->cellstyle[$cal_line][$i] = 'font-size: 18px;';
+ $cal_table->data[$cal_line][$i] = '-';
+ }
+ }
+
+ if ($week == 0 || $week == 6) {
+ $cal_table->cellstyle[$cal_line][$week] = 'color: red;';
+ }
+
+ $date = sprintf('%04d-%02d-%02d', $display_year, $display_month, $day);
+ $date_wildcard = sprintf('0001-%02d-%02d', $display_month, $day);
+
+ $cal_table->cellstyle[$cal_line][$week] .= 'font-size: 18px;';
+ $cal_table->data[$cal_line][$week] = $day.' ';
+
+ if ($is_management_allowed === true) {
+ $cal_table->data[$cal_line][$week] .= 'data[$cal_line][$week] .= '>'.html_print_image(
+ 'images/add_mc.png',
+ true,
+ ['class' => 'invert_filter']
+ ).'';
+ }
+
+ if (empty($specialDays) === false && isset($specialDays[$display_year][$display_month][$day]) === true) {
+ $cal_table->data[$cal_line][$week] .= '
';
+ foreach ($specialDays[$display_year][$display_month][$day] as $special_day) {
+ // Only show description if is filled.
+ $cal_table->data[$cal_line][$week] .= '';
+ $cal_table->data[$cal_line][$week] .= '
';
+ $cal_table->data[$cal_line][$week] .= ui_print_group_icon(
+ $special_day['id_group'],
+ true
+ );
+
+ if (empty($special_day['description']) === false) {
+ $cal_table->data[$cal_line][$week] .= ui_print_help_tip($special_day['description'], true);
+ }
+
+ if ($special_day['date'] == $date_wildcard) {
+ $cal_table->data[$cal_line][$week] .= '(';
+ $cal_table->data[$cal_line][$week] .= ui_print_help_tip(
+ 'This is valid every year. However, this will be ignored if indivisual setting for the same group is available.',
+ true
+ );
+ $cal_table->data[$cal_line][$week] .= ') ';
+ }
+
+ $cal_table->data[$cal_line][$week] .= __('As ');
+ switch ($special_day['day_code']) {
+ case '1':
+ $cal_table->data[$cal_line][$week] .= __('Monday');
+ break;
+
+ case '2':
+ $cal_table->data[$cal_line][$week] .= __('Tuesday');
+ break;
+
+ case '3':
+ $cal_table->data[$cal_line][$week] .= __('Wednesday');
+ break;
+
+ case '4':
+ $cal_table->data[$cal_line][$week] .= __('Thursday');
+ break;
+
+ case '5':
+ $cal_table->data[$cal_line][$week] .= __('Friday');
+ break;
+
+ case '6':
+ $cal_table->data[$cal_line][$week] .= __('Saturday');
+ break;
+
+ case '7':
+ $cal_table->data[$cal_line][$week] .= __('Sunday');
+ break;
+
+ case '8':
+ $cal_table->data[$cal_line][$week] .= __('Holidays');
+ break;
+
+ default:
+ // Not possible.
+ break;
+ }
+
+ $cal_table->data[$cal_line][$week] .= '
';
+ $cal_table->data[$cal_line][$week] .= '
';
+ if ($special_day['id_group'] || (users_can_manage_group_all('LM') === true && $special_day['id_group'] == 0)) {
+ $script_delete = '';
+ $dateformat = date_create($special_day['date']);
+ $options_zoom = htmlspecialchars(
+ json_encode(
+ [
+ 'date' => $special_day['date'],
+ 'id_group' => $special_day['id_group'],
+ 'day_code' => $special_day['day_code'],
+ 'id_calendar' => $special_day['id_calendar'],
+ 'btn_ok_text' => __('Create'),
+ 'btn_cancel_text' => __('Cancel'),
+ 'title' => date_format($dateformat, 'd M Y'),
+ 'url' => ui_get_full_url('ajax.php', false, false, false),
+ 'page' => $ajax_url,
+ 'loading' => __('Loading, this operation might take several minutes...'),
+ ]
+ ),
+ ENT_QUOTES,
+ 'UTF-8'
+ );
+
+ $onclick_zoom = 'load_templates_alerts_special_days('.$options_zoom.')';
+ $cal_table->data[$cal_line][$week] .= '
data[$cal_line][$week] .= 'title="';
+ $cal_table->data[$cal_line][$week] .= __('Show templates');
+ $cal_table->data[$cal_line][$week] .= '">';
+ $cal_table->data[$cal_line][$week] .= html_print_image(
+ 'images/zoom.png',
+ true,
+ ['class' => 'invert_filter']
+ ).'';
+
+ if ($is_management_allowed === true) {
+ $cal_table->data[$cal_line][$week] .= '
data[$cal_line][$week] .= '>'.html_print_image(
+ 'images/config.png',
+ true,
+ ['class' => 'invert_filter']
+ ).' ';
+ $url_delete = $url.'&op=delete&id='.$special_day['id'];
+ $script_delete = 'if (!confirm(\''.__('Are you sure?').'\')) return false;';
+ $cal_table->data[$cal_line][$week] .= '
data[$cal_line][$week] .= ' onClick="'.$script_delete.'"';
+ $cal_table->data[$cal_line][$week] .= 'title="';
+ $cal_table->data[$cal_line][$week] .= __('Remove');
+ $cal_table->data[$cal_line][$week] .= '">';
+ $cal_table->data[$cal_line][$week] .= html_print_image(
+ 'images/cross.png',
+ true,
+ ['class' => 'invert_filter']
+ ).'';
+ }
+ }
+
+ $cal_table->data[$cal_line][$week] .= '
';
+ $cal_table->data[$cal_line][$week] .= '
';
+ }
+ }
+
+ if ($week == 6) {
+ $cal_line++;
+ }
+ }
+
+ for ($padding = ($week + 1); $padding <= 6; $padding++) {
+ $cal_table->cellstyle[$cal_line][$padding] = 'font-size: 18px;';
+ $cal_table->data[$cal_line][$padding] = '-';
+ }
+
+ html_print_table($cal_table);
+}
+
+if ((bool) check_acl($config['id_user'], 0, 'LM') === true) {
+ HTML::printForm(
+ [
+ 'form' => [
+ 'action' => $url.'&op=edit',
+ 'method' => 'POST',
+ ],
+ 'inputs' => [
+ [
+ 'arguments' => [
+ 'name' => 'button',
+ 'label' => __('Create'),
+ 'type' => 'submit',
+ 'attributes' => 'class="sub next"',
+ ],
+ ],
+ ],
+ ]
+ );
+}
+
+echo '';
+ui_require_javascript_file('pandora_alerts');
+
+\enterprise_hook('close_meta_frame');
+?>
+
\ No newline at end of file
diff --git a/pandora_console/views/calendar/special_days_edit.php b/pandora_console/views/calendar/special_days_edit.php
new file mode 100644
index 0000000000..23f72dc38f
--- /dev/null
+++ b/pandora_console/views/calendar/special_days_edit.php
@@ -0,0 +1,216 @@
+';
+ $url_link .= __('metaconsole');
+ $url_link .= '';
+ } else {
+ $url_link = __('any node');
+ }
+
+ \ui_print_warning_message(
+ __(
+ 'This node is configured with centralized mode. All alert calendar information is read only. Go to %s to manage it.',
+ $url_link
+ )
+ );
+}
+
+if (empty($message) === false) {
+ echo $message;
+}
+
+$inputs = [];
+
+// Date.
+$inputs[] = [
+ 'label' => __('Date'),
+ 'arguments' => [
+ 'type' => 'text',
+ 'name' => 'date',
+ 'required' => true,
+ 'value' => $specialDay->date(),
+ ],
+ 'extra' => html_print_image(
+ 'images/calendar_view_day.png',
+ true,
+ [
+ 'alt' => 'calendar',
+ 'onclick' => "scwShow(scwID('text-date'),this);",
+ 'class' => 'invert_filter',
+ ]
+ ),
+];
+
+if (users_can_manage_group_all('LM') === true) {
+ $display_all_group = true;
+} else {
+ $display_all_group = false;
+}
+
+// Group.
+$inputs[] = [
+ 'label' => __('Group'),
+ 'arguments' => [
+ 'type' => 'select_groups',
+ 'returnAllGroup' => $display_all_group,
+ 'name' => 'id_group',
+ 'selected' => $specialDay->id_group(),
+ ],
+];
+
+$days = [];
+$days[1] = __('Monday');
+$days[2] = __('Tuesday');
+$days[3] = __('Wednesday');
+$days[4] = __('Thursday');
+$days[5] = __('Friday');
+$days[6] = __('Saturday');
+$days[7] = __('Sunday');
+$days[8] = __('Holidays');
+
+// Same day of the week.
+$inputs[] = [
+ 'label' => __('Same day of the week'),
+ 'arguments' => [
+ 'name' => 'day_code',
+ 'type' => 'select',
+ 'fields' => $days,
+ 'selected' => ($specialDay->day_code() === null) ? 1 : $specialDay->day_code(),
+ ],
+];
+
+// Description.
+$inputs[] = [
+ 'label' => __('Description'),
+ 'arguments' => [
+ 'type' => 'textarea',
+ 'name' => 'description',
+ 'required' => false,
+ 'value' => $specialDay->description(),
+ 'rows' => 50,
+ 'columns' => 30,
+ ],
+];
+
+// Calendar.
+$inputs[] = [
+ 'arguments' => [
+ 'type' => 'hidden',
+ 'name' => 'id_calendar',
+ 'value' => $specialDay->id_calendar(),
+ ],
+];
+
+if ($is_management_allowed === true) {
+ // Submit.
+ $inputs[] = [
+ 'arguments' => [
+ 'name' => 'button',
+ 'label' => (($create === true) ? __('Create') : __('Update')),
+ 'type' => 'submit',
+ 'attributes' => 'class="sub next"',
+ ],
+ ];
+}
+
+// Print form.
+HTML::printForm(
+ [
+ 'form' => [
+ 'id' => 'form-special-days',
+ 'action' => $url.'&action=save&id='.$specialDay->id(),
+ 'method' => 'POST',
+ ],
+ 'inputs' => $inputs,
+ ],
+ false,
+ true
+);
+
+echo '';
+
+ui_require_javascript_file('calendar');
+ui_require_javascript_file('pandora_alerts');
+
+\enterprise_hook('close_meta_frame');
+?>
+
\ No newline at end of file
diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm
index 2a9634d33c..3347eca41a 100644
--- a/pandora_server/lib/PandoraFMS/Core.pm
+++ b/pandora_server/lib/PandoraFMS/Core.pm
@@ -531,15 +531,16 @@ sub pandora_evaluate_alert ($$$$$$$;$$$$) {
my $date = sprintf("%4d%02d%02d", $year + 1900, $mon + 1, $mday);
# '0001' means every year.
my $date_every_year = sprintf("0001%02d%02d", $mon + 1, $mday);
- my $special_day = get_db_value ($dbh, 'SELECT same_day FROM talert_special_days WHERE (date = ? OR date = ?) AND (id_group = 0 OR id_group = ?) ORDER BY date DESC', $date, $date_every_year, $alert->{'id_group'});
-
+ my $special_day = get_db_value ($dbh, 'SELECT day_code FROM talert_special_days WHERE (date = ? OR date = ?) AND (id_group = 0 OR id_group = ?) AND (id_calendar = ?) ORDER BY date DESC', $date, $date_every_year, $alert->{'id_group'}, $alert->{'special_day'});
+
if (!defined($special_day)) {
- $special_day = '';
+ $special_day = 0;
}
-
- if ($special_day ne '') {
- logger ($pa_config, $date . " is a special day for " . $alert->{'name'} . ". (as a " . $special_day . ")", 10);
- return $status if ($alert->{$special_day} != 1);
+
+ my @weeks = ( 'none', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'holiday');
+ if ($special_day != 0) {
+ logger ($pa_config, $date . " is a special day for " . $alert->{'name'} . ". (as a " . $weeks[$special_day] . ")", 10);
+ return $status if (!defined($alert->{$weeks[$special_day]}) || $alert->{$weeks[$special_day]} == 0);
}
else {
logger ($pa_config, $date . " is *NOT* a special day for " . $alert->{'name'}, 10);
diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl
index 3127261899..801a10540e 100755
--- a/pandora_server/util/pandora_manage.pl
+++ b/pandora_server/util/pandora_manage.pl
@@ -179,7 +179,7 @@ sub help_screen{
help_screen_line('--update_alert_template', " \n\t ", 'Update a field of an alert template');
help_screen_line('--validate_all_alerts', '', 'Validate all the alerts');
help_screen_line('--validate_alert', ' []', 'Validate alert given angent, module and alert');
- help_screen_line('--create_special_day', " ", 'Create special day');
+ help_screen_line('--create_special_day', " ", 'Create special day');
help_screen_line('--delete_special_day', '', 'Delete special day');
help_screen_line('--update_special_day', " ", 'Update a field of a special day');
help_screen_line('--create_data_module_from_local_component', ' []', "Create a new data \n\t module from a local component");
@@ -956,6 +956,31 @@ sub pandora_get_special_day_id ($$) {
return defined ($special_day_id) ? $special_day_id : -1;
}
+
+##########################################################################
+## SUB pandora_get_calendar_id(id)
+## Return calendar id, given "calendar_name"
+##########################################################################
+sub pandora_get_calendar_id ($$) {
+ my ($dbh, $calendar_name) = @_;
+
+ my $calendar_id = get_db_value ($dbh, "SELECT id FROM talert_calendar WHERE ${RDBMS_QUOTE}name${RDBMS_QUOTE} = ?", $calendar_name);
+
+ return defined ($calendar_id) ? $calendar_id : -1;
+}
+
+##########################################################################
+## SUB pandora_get_same_day_id(id)
+## Return same day id, given "same_day"
+##########################################################################
+sub pandora_get_same_day_id ($$) {
+ my ($dbh, $same_day) = @_;
+
+ my $weeks = { 'monday' => 1, 'tuesday' => 2, 'wednesday' => 3, 'thursday' => 4, 'friday' => 5, 'saturday' => 6, 'sunday' => 7, 'holiday' => 8};
+
+ return defined ($weeks{$same_day}) ? $weeks{$same_day} : -1;
+}
+
##########################################################################
## Delete a special day.
##########################################################################
@@ -6413,12 +6438,16 @@ sub pandora_get_network_component_id($$) {
##############################################################################
sub cli_create_special_day() {
- my ($special_day, $same_day, $description, $group_name) = @ARGV[2..5];
+ my ($special_day, $calendar_name, $same_day, $description, $group_name) = @ARGV[2..5];
+ my $calendar_name_exists = pandora_get_calendar_id ($dbh, $calendar_name);
+ my $same_day_exists = pandora_get_same_day_id ($dbh, $same_day);
my $special_day_exists = pandora_get_special_day_id ($dbh, $special_day);
non_exist_check($special_day_exists,'special day',$special_day);
+ non_exist_check($calendar_name_exists,'calendar name',$calendar_name);
+ non_exist_check($same_day_exists,'same day',$same_day);
my $group_id = 0;
-
+
# If group name is not defined, we assign group All (0)
if(defined($group_name)) {
$group_id = get_group_id($dbh, decode('UTF-8', $group_name));
@@ -6434,19 +6463,21 @@ sub cli_create_special_day() {
help_screen ();
exit 1;
}
- if ($same_day !~ /monday|tuesday|wednesday|thursday|friday|saturday|sunday/) {
+
+ if ($same_day !~ /monday|tuesday|wednesday|thursday|friday|saturday|sunday|holiday/) {
print_log "[ERROR] '$same_day' is invalid day.\n\n";
$param = '--create_special_day';
help_screen ();
exit 1;
}
-
+
my %parameters;
-
+
$parameters{"${RDBMS_QUOTE}date${RDBMS_QUOTE}"} = $special_day;
$parameters{'same_day'} = $same_day;
$parameters{'description'} = decode('UTF-8', $description);
$parameters{'id_group'} = $group_id;
+ $parameters{'calendar_name'} = $calendar_name;
pandora_create_special_day_from_hash ($conf, \%parameters, $dbh);
}