function get_desk_item($desks_array, $no_buttons = '') { global $systems, $db_rs, $elements; $html = ''; write_log(print_r($desks_array, true), 'desk_array'); foreach ($desks_array as $desk) { // ID образения; $desk_id = $desk['id']; // Получаем нормальную дату; $date_create = date('d.m.Y H:i:s', strtotime($desk['datetime_create'])); $date_update = date('d.m.Y H:i:s', strtotime($desk['datetime_last_update'])); // Получаем имя автора; $author = $systems->get_user_avatar_and_full_name($desk['author_user_id']); /* $sql = "SELECT CONCAT(`fam`, ' ', `name`) as `name` FROM `users` WHERE `login` = '".$author_id."';"; $author = $db->one($sql); */ // Текст обращения; $desk_message = str_replace("\n", '<br>', $desk['desk_text']); // Статус обращения; $status = $desk['status']; if ($status == '1') { $status_text = 'Новоя заявка'; } if ($status == '2') { $status_text = 'Заявка принята'; } if ($status == '3') { $status_text = 'Заявка выполняется'; } if ($status == '4') { $status_text = 'Отказ в выполнении'; } if ($status == '5') { $status_text = 'Ожидание подтверждения выполнения'; } if ($status == '6') { $status_text = 'Заявка не выполнена'; } if ($status == '7') { $status_text = 'Заявка выполнена'; } if ($status == '1') { $move_color = 1; } // Желтый if ($status == '2' || $status == '3') { $move_color = 4; } // Зеленый цвет; if ($status == '7' || $status == '5') { $move_color = 3; } // Красный свет if ($status == '6' || $status == '4') { $move_color = 2; } // Но если у заявки нет исполнителя, мы все равно красим ее в красный цвет; if ($desk['todo_user_id'] == '') { $move_color = 2; } $html .= '<div class="desk_item notification_type_' . $move_color . '" id="' . $desk_id . '" style="min-height: 478px;font-size: 0.85em; padding: 10px 10px 10px 10px; vertical-align:top;">'; $html .= '<div id="hidden_desk_window_id_' . $desk_id . '" window_id="" style="display: none;"></div>'; $html .= '<table style="border: none;" cellspacing="0" cellpadding="0">'; $html .= '<tr>'; $html .= '<td style="text-align: right">Номер заявки:</td>'; $html .= '<td><b>' . $desk_id . '</b></td>'; $html .= '<td style="text-align: right">Принадлежность:</td>'; $html .= '<td>'; // Здесь мы выводим принадлежности пользователь к заявке; $html .= "<script>\$('.user_desk').tipsy();</script>"; if ($desk['author'] == '1') { $html .= '<img src="/templates/images/icons/author.png" class="user_desk" title="Вы автор" width="24px" style="margin: 3px;"/>'; } if ($desk['boss'] == '1') { $html .= '<img src="/templates/images/icons/boss.png" class="user_desk" title="Заявка вашего отдела" width="24px" style="margin: 3px;"/>'; } if ($desk['todo'] == '1') { $html .= '<img src="/templates/images/icons/todo.png" class="user_desk" title="Вы исполнитель" width="24px" style="margin: 3px;"/>'; } if ($desk['viewer'] == '1') { $html .= '<img src="/templates/images/icons/viewer.png" class="user_desk" title="Вы наблюдатель" width="24px" style="margin: 3px;"/>'; } // Если у нас есть вложенные заявки, надо их отобразить; $sql = "SELECT `id` FROM `service_desk` WHERE `parent_id` = '" . $desk_id . "';"; $child_desk = $db_rs->all($sql); if (count($child_desk) > 0) { $html .= '<img src="/templates/images/icons/parent_desk.png" class="user_desk" title="Эта заявка имеет вложенные заявки" width="24px" style="margin: 3px;"/>'; } if ($desk['parent_id'] != '') { $html .= '<img src="/templates/images/icons/desk_child.png" class="user_desk" title="Это вложенная заявка" width="24px" style="margin: 3px;"/>'; } if ($desk['date_todo_view'] != '') { $html .= '<img src="/templates/images/icons/desk_opened.png" class="user_desk" title="Исполнитель просмотрел заявку в: ' . get_local_date_time($desk['date_todo_view'], 1) . '" width="20px" style="margin: 3px;"/>'; } $html .= '</td>'; $html .= '</tr>'; // Если у нас есть вложенные заявки, надо их отобразить; $sql = "SELECT `id` FROM `service_desk` WHERE `parent_id` = '" . $desk_id . "';"; $child_desk = $db_rs->all($sql); if (count($child_desk) > 0) { // Осталвляем ссылки на детей этой заявки; $html .= '<tr>'; $html .= '<td style="text-align: right; vertical-align: top;">Вложенные заявки:</td>'; $html .= '<td><b>'; foreach ($child_desk as $child) { // Получаем статус вложенной заявки; $sql = "SELECT `status` FROM `service_desk` WHERE `id` = '" . $child['id'] . "';"; $child_desk_status = $db_rs->one($sql); if ($child_desk_status == '1') { $child_status_text = 'Новоя заявка'; } if ($child_desk_status == '2') { $child_status_text = 'Заявка принята'; } if ($child_desk_status == '3') { $child_status_text = 'Заявка выполняется'; } if ($child_desk_status == '4') { $child_status_text = 'Отказ в выполнении'; } if ($child_desk_status == '5') { $child_status_text = 'Ожидание подтверждения выполнения'; } if ($child_desk_status == '6') { $child_status_text = 'Заявка не выполнена'; } if ($child_desk_status == '7') { $child_status_text = 'Заявка выполнена'; } $html .= '<div onclick="show_desk_window(' . $child['id'] . ', \'new\')" style="cursor:pointer;">' . $child['id'] . ' ( ' . $child_status_text . ' )</div>'; } $html .= '</b></td>'; $html .= '</tr>'; } // Если заявка имеет родителя, то нам надо оставить ссылку на родительскую заявку; if ($desk['parent_id'] != '') { // Получаем статус вложенной заявки; $sql = "SELECT `status` FROM `service_desk` WHERE `id` = '" . $desk['parent_id'] . "';"; $parent_desk_status = $db_rs->one($sql); if ($parent_desk_status == '1') { $parent_status_text = 'Новоя заявка'; } if ($parent_desk_status == '2') { $parent_status_text = 'Заявка принята'; } if ($parent_desk_status == '3') { $parent_status_text = 'Заявка выполняется'; } if ($parent_desk_status == '4') { $parent_status_text = 'Отказ в выполнении'; } if ($parent_desk_status == '5') { $parent_status_text = 'Ожидание подтверждения выполнения'; } if ($parent_desk_status == '6') { $parent_status_text = 'Заявка не выполнена'; } if ($parent_desk_status == '7') { $parent_status_text = 'Заявка выполнена'; } $html .= '<tr>'; $html .= '<td style="text-align: right; vertical-align: top;">Родительская заявка:</td>'; $html .= '<td onclick="show_desk_window(' . $desk['parent_id'] . ', \'new\')" style="cursor:pointer;"><b>' . $desk['parent_id'] . ' ( ' . $parent_status_text . ' )</b></td>'; $html .= '</tr>'; } $html .= '<tr>'; $html .= '<td style="text-align: right">Автор:</td>'; $html .= '<td style="width: 398px;font-size: 0.9em;"><b>' . $author . '</b></td>'; $html .= '<td style="text-align: right">Исполнитель:</td>'; // Если пользователь у нас руководитель отдела по этому заявке, ему надо дать возможность менять испольнителя; if (get_desk_boss_id($desk_id) == 1 && $status != '7') { // Здесь мы будем строить выпдашку с пользователями; $sql = "select `id`, `user_full_name` as `name` FROM `users_apps` WHERE `dep_id` = '" . $_SESSION['department_id'] . "';"; $users = $db_rs->all($sql); $html .= '<td><select id="desk_todo_user" desk_id="' . $desk_id . '" style="height: 39px; text-align: center; background-color: #ffffff; padding: 5px 5px 5px 5px; border-radius: 7px; opacity: 0.9; border: 1px solid #5f5f5f;">'; $html .= '<option value="none" disabled selected>Выберите исполнителя для заявки</option>'; foreach ($users as $user) { $html .= '<option value="' . $user['id'] . '" ' . ($desk['todo_user_id'] == $user['id'] ? 'selected' : '') . '>' . $user['name'] . '</option>'; } $html .= '</select></td>'; } else { $html .= '<td style="font-size: 0.9em;width: 398px;"><b>' . $systems->get_user_avatar_and_full_name($desk['todo_user_id']) . '</b></td>'; } $html .= '</tr>'; $html .= '<tr>'; $html .= '<td style="text-align: right">Офис в котором делалась заявка:</td>'; $html .= '<td><b>' . get_office_name($desk['author_office']) . '</b></td>'; $html .= '<td style="text-align: right">Для какого отдела заявка:</td>'; $html .= '<td><b>' . get_department_name($desk['department_id']) . '</b></td>'; $html .= '</tr>'; $html .= '<tr>'; $html .= '<td style="text-align: right">Тип заявки:</td>'; $html .= '<td><b>' . get_desk_type_name($desk['type_id']) . '</b></td>'; $html .= '<td style="text-align: right">Когда создано:</td>'; $html .= '<td><b>' . $date_create . '</b></td>'; $html .= '</tr>'; $html .= '<tr>'; $html .= '<td style="text-align: right">Предпочтительная дата исполнения:</td>'; $html .= '<td><b>' . get_local_date_time($desk['date_dead_line']) . '</b></td>'; $html .= '<td style="text-align: right">Последнее обновление:</td>'; $html .= '<td><b>' . $date_update . '</b></td>'; $html .= '</tr>'; $html .= '<tr>'; $html .= '<td style="text-align: right; vertical-align: top;">Статус:</td>'; $html .= '<td><b>' . $status_text . '</b></td>'; $html .= '</tr>'; if ($desk['attache'] != '') { $html .= '<tr>'; $html .= '<td style="text-align: right; vertical-align: top;">Прикрепленный заказ:</td>'; $html .= '<td style="cursor: pointer;" onclick="show_info_window(' . $desk['attache'] . ', \'new\');"><b>' . $desk['attache'] . '</b></td>'; $html .= '</tr>'; } $html .= '<tr>'; $html .= '<td style="text-align: right; vertical-align: top;">Текст обращения:</td>'; $html .= '<td colspan="4" width="200px" style="-ms-word-break: break-all;word-break: break-all;word-break: break-word;-webkit-hyphens: auto;-moz-hyphens: auto;hyphens: auto;"><b>' . $desk_message . '</b></td>'; $html .= '</tr>'; $html .= '</table>'; //$html .= //$html .= '<div>'; if ($no_buttons == '') { // Здесь мы выводим операционные кнопки для управления состоянием обращения, в зависимости от статуса обращения и пользователя, кнопки мгут быть разными; $html .= '<div id="desk_buttons">'; // Если ты автор, исполнитель, или же руководитель отдела, ты можешь создать дочернюю заявку; $boss_array = get_department_boss(get_desk_department($desk_id)); $boss = 0; foreach ($boss_array as $boss) { if ($boss == $_SESSION['user_id']) { $boss = 1; } } if (($boss == 1 || get_desk_author_user($desk_id) == $_SESSION['user_id'] || get_desk_todo_user($desk_id) == $_SESSION['user_id']) && $status != '7') { $html .= $elements->button('Создать вложенную заявку', 'create_child_desk', '', '', '', 'desk_id="' . $desk_id . '"'); } // Важно, что работать с наблюдателями может только либо автор заявки, либо реководитель отдела на который создана заявка; $boss_array = get_department_boss(get_desk_department($desk_id)); $boss = 0; foreach ($boss_array as $boss) { if ($boss == $_SESSION['user_id']) { $boss = 1; break; } } if ((get_desk_author_user($desk_id) == $_SESSION['user_id'] || $boss == 1 || $_SESSION['department_id'] == 2) && $status != '7') { // Кнопки управления наблюдателями; $html .= '<div class="menu_button" onclick="$(\'#viewers_list_' . $desk_id . '\').toggle(\'fast\')">Работа с наблюдателями заявки</div><br>'; // Форма для работы с наблюдателями; $html .= '<div id="viewers_list_' . $desk_id . '" style="display: none;">'; $sql = "SELECT `users_apps`.`id`, `users_apps`.`user_full_name` as `user` FROM `service_desk_viewers`\n LEFT JOIN `users_apps` ON `users_apps`.`id` = `service_desk_viewers`.`viewer_user_id`\n WHERE `service_desk_id` = '" . $desk_id . "' AND `service_desk_viewers`.`status` != 0;"; $viewers_array = $db_rs->all($sql); $html .= $elements->caption('Список наблюдателей'); $html .= "<script>\$('.unview_desk').tipsy();</script>"; $html .= '<br>'; $html .= '<table style="margin-top: -8px;">'; $html .= '<tr>'; $html .= '<td class="row_top">Имя пользователя</td>'; $html .= '<td class="inf_row row_top">Действие</td>'; $html .= '</tr>'; foreach ($viewers_array as $key => $viewers) { // Визуальный класс чет нечет; $class = ''; if ($key % 2 != 0) { $class = 'row_1'; } else { $class = 'row_2'; } $html .= '<tr>'; $html .= '<td align="center" class="' . $class . '">' . $viewers['user'] . '</td>'; $html .= '<td align="center" class="' . $class . ' inf_row"><img class="unview_desk" desk_id="' . $desk_id . '" user_id="' . $viewers['id'] . '" style="cursor:pointer;" src="/templates/images/icons/close.png" title="Убрать пользователя из наблюдателей" height="16px"></td>'; $html .= '</tr>'; } $html .= '</table>'; // Получаем список всез сотрудников компании достпуных в новой системе $sql = "SELECT `users_apps`.`id`, CONCAT(`user_full_name`, ' (', `appointments`.`name`, ')') as `name` FROM `users_apps`\n LEFT JOIN `departments` ON `departments`.`id` = `users_apps`.`dep_id`\n LEFT JOIN `appointments` ON `appointments`.`id` = `users_apps`.`app_id`\n WHERE `users_apps`.`id` != '" . $_SESSION['user_id'] . "' ORDER BY `departments`.`id`;"; $users = $db_rs->all($sql); $html .= $elements->caption('Вы можете добавить нового наблюдателя за заявкой'); $html .= '<br>'; $html .= '<select id="add_desk_viewer" desk_id="' . $desk_id . '" style="margin-top: -9px;height: 39px; text-align: center; background-color: #ffffff; padding: 5px 5px 5px 5px; border-radius: 7px; opacity: 0.9; border: 1px solid #5f5f5f;">'; $html .= '<option value="none" disabled selected>Выберите нового наблюдателя за заявкой</option>'; foreach ($users as $user) { $html .= '<option value="' . $user['id'] . '">' . $user['name'] . '</option>'; } $html .= '</select>'; $html .= '</div>'; } // Всякие другие кнопки чисто для заявок; $boss_array = get_department_boss(get_desk_department($desk_id)); $boss = 0; foreach ($boss_array as $boss) { if ($boss == $_SESSION['user_id']) { $boss = 1; } } // Только руководитель отдела может одобрить заявку на выполнение; if ($boss == 1 && $status == '1') { $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 2);">Одобрить заявку для исполнения</div>'; } // $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 4);">Отказать в выполнении</div>'; // Только исполнитель может начать выполнение заявки; if (get_desk_todo_user($desk_id) == $_SESSION['user_id'] && $status == '2') { $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 3);$(\'#' . $desk_id . '\').closest(\'.refresh_window\').trigger(\'click\');">Начать выполнение</div>'; } // Только исполнитель может завешить выполнение заявки; if (get_desk_todo_user($desk_id) == $_SESSION['user_id'] && ($status == '3' || $status == '6')) { // Важный момент, мы не можем "выполнить" заявку, если у нее есть не выполненные дочерние заявки; $sql = "SELECT COUNT(`id`) FROM `service_desk` WHERE `parent_id` = '" . $desk_id . "' AND `status` != 7;"; $bad_child = $db_rs->one($sql); // Если все вложенные заявки выполнены, мы можем провести и родителя; if ($bad_child == 0) { $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 5);">Заявка выполнена</div>'; } } // Только автор заявки может подтверджить выполнение заявки; if (get_desk_author_user($desk_id) == $_SESSION['user_id'] && ($status == '4' || $status == '5')) { $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 7);">Выполнение проверено</div>'; $html .= '<div class="menu_button" onclick="desk_set_status_new(' . $desk_id . ', 6);">Заявка не выполнена</div>'; } $html .= '</div>'; } $html .= '<div style="margin-top: 5px; margin-bottom: 5px; margin-right: 10px; font-size: 0.9em;" align="center"><div class="menu_button" onclick="view_desk_dialog(' . $desk_id . ');">Показать диалог</div></div>'; $html .= '<div class="dialog_' . $desk_id . '" style="margin-top: 0.5em;" hidden>'; // Написать сообщение к обращению; //$html .= $elements->button(); $html .= '<div style="display: inline-block;"><input style="width: 46.9em;" type="text" desk_id="' . $desk_id . '" id="desk_message_text_' . $desk_id . '" value="" onkeydown = "if(event.which == 13) add_new_desk_chat_message(this, ' . $desk_id . ')">'; $html .= '</div>'; $html .= get_desk_chat($desk_id); $html .= '</div>'; $html .= '</div>'; } return $html; }
// После добавление автора как наблюдателя $sql = "SELECT `parent_id` FROM `service_desk` WHERE `id` = '" . $parent_id . "';"; write_log($sql, 'create_new_desk'); $grand_parent_id = $db_rs->one($sql); $sql = "SELECT `author_user_id` FROM `service_desk` WHERE `id` = '" . $grand_parent_id . "';"; write_log($sql, 'create_new_desk'); $parent_author = $db_rs->one($sql); if ($parent_author != '') { $parent_id = $grand_parent_id; goto again; } } // Далее нам надо уведомить исполнителя если он был выбран; if ($work_user != '') { write_log('У нас есть исполнитель заявки ' . $desk_item_id, 'create_new_desk'); if (in_array($work_user, get_desk_boss_id($desk_item_id))) { $systems->send_telegram($work_user, "⚠ Вас выбрали исполнителем для новой заявки №" . $desk_item_id . "\r\n" . "Автор: " . get_user_full_name($_SESSION['user_id']) . "\r\n" . "Текст: " . mb_strimwidth($_POST['desk_text'], 0, 300, '...')); send_notification($work_user, 'Вас выбрали исполнителем для новой заявки №' . $desk_item_id . '<br>Нажмите для перехода в список заявок.', 'service_desk', '', '4', $desk_item_id); } } else { write_log('У нас нет исполнителя заявки', 'create_new_desk'); } // И в любом случае нам надо уведомить руководитель этого отдела; write_log('Получаем руководтиеля отдела', 'create_new_desk'); $dep_boss_array = get_department_boss($_POST['dep_id']); write_log(print_r($dep_boss_array, true), 'create_new_desk'); foreach ($dep_boss_array as $boss_item) { write_log('Уведомляем боссов', 'create_new_desk'); // так же, если у заявки нет исполнителя, то там надо уведомить об руководителя; send_notification($boss_item, 'В вашем отделе появилась новая заявка №' . $desk_item_id . '<br>Нажмите для перехода в список заявок.', 'service_desk', '', '3', $desk_item_id); $systems->send_telegram($boss_item, "⚠ В вашем отделе появилась новая заявка №" . $desk_item_id . "\r\n" . "Автор: " . get_user_full_name($_SESSION['user_id']) . "\r\n" . "Текст: " . mb_strimwidth($_POST['desk_text'], 0, 300, '...'));