857 lines
38 KiB
PHP
857 lines
38 KiB
PHP
<?
|
||
//ИТ-отдел
|
||
include_once $_SERVER['DOCUMENT_ROOT'].'/inc/class_SYSTEM.php';
|
||
$SYSTEMclass = new SYSTEMclass();
|
||
|
||
|
||
//категории обращений
|
||
$categoryTicket = array(
|
||
'0' => 'Прочее',
|
||
'1' => 'Официальный сайт',
|
||
'2' => 'ЭИОС (LMS)',
|
||
'3' => 'Вычислительная и организационная техника',
|
||
'4' => 'Мероприятие',
|
||
'5' => '1С',
|
||
'6' => 'Сеть (Интернет)',
|
||
'7' => 'СКУД',
|
||
'8' => 'РПД',
|
||
'9' => 'Расчет часов/Расписание',
|
||
'10' => 'Программное обеспечение'
|
||
);
|
||
|
||
//статусы обращений
|
||
$statusTicket = array(
|
||
'white' => 'на рассмотрении',
|
||
'lightgray' => 'архив',
|
||
'lavender' => 'в работе',
|
||
'#ffc880' => 'на доработке',
|
||
'#d2ffd2' => 'одобрено',
|
||
'#d2ffd1' => 'выполнено',
|
||
'#fbffd5' => 'на проверке'
|
||
);
|
||
|
||
//корпусы
|
||
$corpuses = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_corpuses ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$corpuses[] = $val;
|
||
}
|
||
}
|
||
|
||
//ПОДКЛЮЧЕНИЕ К СЕРВЕРУ С БОТОМ
|
||
function botConnect($command, $chat_id = 0){
|
||
GLOBAL $DB, $ST;
|
||
/**
|
||
command - выполнение команды
|
||
chat_id - для более персональной команды, например, закрыть заявку
|
||
**/
|
||
// Установка параметров базы данных MySQL
|
||
$servername = "212.109.222.2";
|
||
$username = "tg_bot";
|
||
$password = "gC0eG3lC6f";
|
||
$dbname = "tg_bot";
|
||
|
||
// Создание подключения к базе данных
|
||
$conn = mysqli_connect($servername, $username, $password, $dbname);
|
||
|
||
if ($command == 'view'){ //для тестов
|
||
$sql_order = "SELECT * FROM it_tg LIMIT 10";
|
||
$result_order = mysqli_query($conn, $sql_order);
|
||
//echo mysqli_num_rows($result_order);
|
||
|
||
while ($row = mysqli_fetch_assoc($result_order)) {
|
||
echo $row["phone"].'<br />';
|
||
|
||
}
|
||
|
||
} elseif ($command == 'upload'){ //загрузить заявки из телеги
|
||
|
||
|
||
//рассматриваем только заявки типа open и ограничиваем - подгружаем по 10 заявок, чтобы ничего плохого не случилось не дай бог)
|
||
$sql_order = 'SELECT * FROM it_tg WHERE status = "open" LIMIT 10';
|
||
$result_order = mysqli_query($conn, $sql_order);
|
||
while ($row = mysqli_fetch_assoc($result_order)){
|
||
//echo $row["phone"].'<br />';
|
||
|
||
//обязательно меняем статус на "в работе"
|
||
$sql_update = 'UPDATE it_tg SET status="work" WHERE id='.$row['id'].' AND status="open"';
|
||
if (mysqli_query($conn, $sql_update)) {
|
||
//сохраняем в нашу базу
|
||
//вместо почты - айдишник телеги
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order (`id_user`, `fio`, `email`, `phone`, `rol`, `doljnost`, `category`, `about`, `file`, `prioritet`, `m_date`, `j_date`, `date_create`, `place`) VALUES ("0", "'.$row['fio'].'", "'.$row['chat_id'].'", "'.$row['phone'].'", "-", "-", "Telegram", "'.$row['about'].'", "", "обычный", "", "", "'.date("U").'", "'.$row['address'].'") ');
|
||
$id = mysql_insert_id();
|
||
save_logs('Поступление заявки в ИТ-отдел из телеграма под номером №'.$id);
|
||
}
|
||
|
||
}
|
||
|
||
} elseif ($command == 'message'){ //подгружаем сообщения из телеги
|
||
//смотрим заявки, у которых статус message
|
||
$sql_message = 'SELECT * FROM it_tg WHERE status = "message" ';
|
||
//echo $sql_message;
|
||
$result_message = mysqli_query($conn, $sql_message);
|
||
while ($row = mysqli_fetch_assoc($result_message)){
|
||
//echo $row['message'];
|
||
//обязательно меняем статус на "в работе"
|
||
$sql_update = 'UPDATE it_tg SET status="work" WHERE id='.$row['id'].' AND status="message"';
|
||
if (mysqli_query($conn, $sql_update)) {
|
||
//нужно определить номер заявки, в которую будем сохранять
|
||
$sql_order = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE category = "Telegram" AND email = "'.$row['chat_id'].'" AND status = "в работе" ORDER BY id DESC LIMIT 1';
|
||
$rez_order = $DB->QUR_SEL($sql_order);
|
||
$id_order = $rez_order[1]['id']; //номер заявки
|
||
//echo $id_order;
|
||
|
||
//сохраняем в нашу базу сообщение - ID_USER = 0 - значит ФИО основное, для удобства, чтобы не перегружать телегу
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (`id_order`, `id_user`, `date_create`, `comment`, `file`) VALUES ("'.$id_order.'", "0", "'.date("U").'", "'.$row['message'].'", "") ');
|
||
//$id = mysql_insert_id();
|
||
//save_logs('Сохранение сообщение из телеги №'.$id);
|
||
}
|
||
}
|
||
|
||
} elseif ($command == 'close'){ //закрытие заявки
|
||
//chat_id
|
||
$sql_update = 'UPDATE it_tg SET status="close" WHERE chat_id='.$chat_id.' AND status="work"';
|
||
mysqli_query($conn, $sql_update);
|
||
}
|
||
|
||
|
||
// Закрытие соединения с базой данных
|
||
mysqli_close($conn);
|
||
}
|
||
|
||
//ФУНКЦИЯ ТЕЛЕГИ - написать сообщение
|
||
function TGsendMessage($message, $chat_id) {
|
||
//include 'https://tg.mkgtu.ru/?eios';
|
||
//echo '<iframe src="https://tg.mkgtu.ru/?eios&message='.$message.'&chat_id='.$chat_id.'" height="0px" width="0px" style="display: none; visibility: hidden;"></iframe>';
|
||
echo '<iframe src="https://tg.mkgtu.ru/?eios&message='.urlencode($message).'&chat_id='.$chat_id.'" height="0px" width="0px" style="display: none; visibility: hidden;"></iframe>';
|
||
}
|
||
|
||
function TGsendMessageNew($message, $chat_id,$id_order){
|
||
//TODO заменить на POST
|
||
//$rez = file_get_contents('https://teleg.mkgtu.ru/tg/api.php?raz=eios_it_order&des=send&chat_id='.$chat_id.'&message='.urlencode($message));
|
||
echo '<iframe src="https://teleg.mkgtu.ru/tg/api.php?raz=eios_it_order&des=send&message='.urlencode($message).'&chat_id='.$chat_id.'&id_order='.$id_order.'" height="0px" width="0px" style="display: none; visibility: hidden;"></iframe>';
|
||
//return $rez;
|
||
}
|
||
//ОТПРАВИТЬ СООБЩЕНИЕ В ТЕЛЕГУ, ВЗЯВ ДАННЫЕ ИЗ ЗАЯВКИ
|
||
function getOrderToMessage($id_order, $message){
|
||
GLOBAL $DB, $ST;
|
||
//отправляем сообщение в Телегу - предварительно узнаем айдишник телеги, если туда нужно отправлять
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id = "'.$id_order.'" ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
if ($rez[1]['category'] == 'Telegram'){
|
||
//также укажем, кто оставил сообщение
|
||
$worker = get_user($_SESSION['user']['id']);
|
||
//$message = '<b>'.$worker['fio'].' (Заявка №'.$id_order.'): </b>\n' .$message;
|
||
$message = '<b>'.$worker['fio'].' (Заявка №'.$id_order.'): </b>'."\n".$message;
|
||
TGsendMessageNew($message, $rez[1]['email'],$id_order); //в емайле прячется телега))
|
||
//TGsendMessage($message, $rez[1]['email']); //в емайле прячется телега))
|
||
}
|
||
}
|
||
}
|
||
|
||
botConnect('upload');
|
||
botConnect('message');
|
||
|
||
//форма обращения в ИТ-отдел
|
||
if ($_GET['page'] == 'order'){
|
||
$user = $_SESSION['user']; //данные о пользователе
|
||
$msg = 0;
|
||
//создание заявки
|
||
if (isset($_POST['order_ticket'])){
|
||
/*print_r($_POST);
|
||
print_r($_FILES);*/
|
||
|
||
$id_user = (int)$_POST['id_user'];
|
||
$fio = $_POST['fio'];
|
||
$email = $_POST['email'];
|
||
$phone = $_POST['phone'];
|
||
$rol = $_POST['rol'];
|
||
$doljnost = $_POST['doljnost'];
|
||
$category = $_POST['category'];
|
||
$about = addslashes($_POST['about']);
|
||
$corpuses = $_POST['corpuses'];
|
||
$aud = $_POST['aud'];
|
||
$prioritet = $_POST['prioritet'][0];
|
||
$m_date = strtotime($_POST['m_date']);
|
||
$j_date = strtotime($_POST['j_date']);
|
||
|
||
//место проблемы - корпус:аудитория
|
||
$place = $corpuses.':'.$aud;
|
||
|
||
$file = '';
|
||
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order (`id_user`, `fio`, `email`, `phone`, `rol`, `doljnost`, `category`, `about`, `file`, `prioritet`, `m_date`, `j_date`, `date_create`, `place`) VALUES ("'.$id_user.'", "'.$fio.'", "'.$email.'", "'.$phone.'", "'.$rol.'", "'.$doljnost.'", "'.$category.'", "'.$about.'", "'.$file.'", "'.$prioritet.'", "'.$m_date.'", "'.$j_date.'", "'.date("U").'", "'.$place.'") ');
|
||
$id = mysql_insert_id();
|
||
|
||
//загрузка файла
|
||
$uploadfile='';
|
||
if(isset($_FILES['file'])){
|
||
$dir_dest = 'upload/it/'.$id.'/';
|
||
if(!file_exists($dir_dest)) mkdir($dir_dest);
|
||
$fil = date("U").$_FILES['file']['name'];
|
||
$t = explode('.',$fil); $ext = $t[count($t)-1];
|
||
unset($t[count($t)-1]); $fn = implode('.',$t);
|
||
$uploadfile = $dir_dest . basename(translit($fn).'.'.$ext);
|
||
//if (!move_uploaded_file($_FILES['sfile']['tmp_name'], $uploadfile)) {
|
||
if (!$SYSTEMclass->sysUPLOAD($_FILES['file']['tmp_name'], $uploadfile)) {
|
||
$uploadfile='';
|
||
}
|
||
}
|
||
|
||
//а теперь указываем файл в базе
|
||
$sql = 'UPDATE '.$ST['dbpf'].'_it_order SET file = "'.$uploadfile.'" WHERE id = "'.$id.'" ';
|
||
$rez = $DB->QUR($sql);
|
||
|
||
$msg = 1;
|
||
save_logs('Создано обращение в ИТ-отдел под №'.$id);
|
||
|
||
TGsendMessageNew('Новая заявка в ИТ отдел из ЭИОС.'.PHP_EOL.'ФИО: '.$fio.' '.$rol.PHP_EOL.'Категория: '.$category.' Место: '.$place.PHP_EOL.strip_tags($about).PHP_EOL.'Дата: '.date('d.m.Y',$m_date), 145276809,$id);
|
||
|
||
//выход
|
||
//header("Location: /it/order/");
|
||
//exit;
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
|
||
//открываем почту и ЗАПИСЫВАЕМ ТОЛЬКО ТЕ ПИСЬМА, которых ЕЩЕ по дате НЕ БЫЛО из этого источника - email
|
||
/*$mailbox = '{imap.yandex.ru:993/imap/ssl}INBOX';
|
||
if (!$inbox = imap_open($mailbox, 'order@mkgtu.ru', 'gxgfgxrrcthradbk')) {
|
||
throw new Exception(imap_last_error());
|
||
}
|
||
|
||
foreach(imap_search($inbox,'ALL') as $msg_number) {
|
||
// структура сообщения
|
||
$struct = imap_fetchstructure($inbox, $msg_number);
|
||
echo '<pre>'; var_dump($struct); echo '</pre>';
|
||
var_dump($struct);
|
||
|
||
// важные заголовки письма
|
||
$overview = imap_fetch_overview($inbox, $msg_number, 0);
|
||
echo '<pre>'; var_dump($overview[0]); echo '</pre>';
|
||
var_dump($overview[0]);
|
||
|
||
// тело сообщения
|
||
$text = imap_fetchbody($inbox, $msg_number, 2);
|
||
echo '<pre>'; var_dump($text); echo '</pre>';
|
||
$body = imap_utf8(quoted_printable_decode($text));
|
||
echo '<br /><hr />QWER '; var_dump($body);
|
||
|
||
$body = imap_body($inbox, $msg_number);
|
||
$body = quoted_printable_decode($body); //расшифрованное сообщение
|
||
echo $body;
|
||
|
||
|
||
}
|
||
|
||
imap_close($inbox);*/
|
||
|
||
|
||
|
||
//не выбрана конкретная заявка
|
||
if (!isset($_GET['des'])){
|
||
|
||
//все "тикеты" пользователя, которые он оставлял в качестве заявок
|
||
$orders = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id_user = "'.$user['id'].'" ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
$val['m_date'] = date("d.m.Y", $val['m_date']);
|
||
$val['j_date'] = date("d.m.Y", $val['j_date']);
|
||
$val['date_create'] = date("d.m.Y", $val['date_create']);
|
||
$val['date_end'] = date("d.m.Y", $val['date_end']);
|
||
$val['worker'] = get_user($val['worker_id']);
|
||
|
||
$orders[] = $val;
|
||
}
|
||
}
|
||
|
||
//все "тикеты" ДОСТУПНЫЕ ДЛЯ РАБОТЫ
|
||
$ordersAll = array();
|
||
if(isset($_SESSION['user']['statuses'][77])) $sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE worker_id = "'.$_SESSION['user']['id'].'" ORDER BY date_create DESC'; //если простой сотрудник, то только его заявки, где он исполнитель
|
||
if(isset($_SESSION['user']['statuses'][76])) $sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order ORDER BY FIELD(status, "архив", "одобрено", "выполнено", "в работе", "на доработке", "на проверке", "на рассмотрении") DESC, date_create DESC'; //если руководитель отдела, то все выводим
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
//определяем, сколько прошло времени с момента одобрения задачи
|
||
if ($val['status'] == 'одобрено') {
|
||
$val['raznica'] = date("U")-$val['date_end'];
|
||
|
||
//если разница больше 24 часов, переводим заявку в статус "выполнено"
|
||
if ($val['raznica'] > 24*60*60){
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "выполнено" WHERE id = "'.$val['id'].'" ');
|
||
}
|
||
|
||
}
|
||
|
||
//команда
|
||
$val['teams'] = array();
|
||
$teams_id = $val['teams_id'];
|
||
$one_sotr = explode(',', $teams_id);
|
||
$ind = 1;
|
||
while ($ind < count($one_sotr)){
|
||
if ($one_sotr[$ind] > 0) $val['teams'][] = get_user($one_sotr[$ind]);
|
||
|
||
$ind++;
|
||
}
|
||
|
||
|
||
|
||
|
||
/******/
|
||
$val['m_date'] = date("d.m.Y", $val['m_date']);
|
||
$val['j_date'] = date("d.m.Y", $val['j_date']);
|
||
$val['date_create'] = date("d.m.Y H:i:s", $val['date_create']);
|
||
$val['date_end'] = date("d.m.Y H:i:s", $val['date_end']);
|
||
$val['worker'] = get_user($val['worker_id']);
|
||
|
||
|
||
|
||
//определяем цвет заявки в зависимости от статуса
|
||
$color = array_keys($statusTicket, $val['status']);
|
||
$val['color'] = $color[0];
|
||
|
||
$ordersAll[] = $val;
|
||
}
|
||
}
|
||
|
||
if (!isset($_GET['us'])) $smarty->assign('us', get_user($user['id']));
|
||
else $smarty->assign('us', get_user($_GET['us'])); //заполняем заявку за человека
|
||
$smarty->assign('orders', $orders);
|
||
$smarty->assign('ordersAll', $ordersAll);
|
||
|
||
} else{ //УКАЗАНА КОНКРЕТНАЯ ЗАЯВКА - отображаем детальную информацию
|
||
$id = (int) $_GET['des'];
|
||
|
||
//руководитель отдела РАЗДАЕТ ЗАДАЧИ
|
||
if (isset($_POST['order_work'])){
|
||
//print_r($_POST);
|
||
|
||
$id_order = (int) $_POST['id_order'];
|
||
$prioritet = $_POST['prioritet'];
|
||
if($_POST['j_date']==''){
|
||
$j_date = mktime(11,0,0,date('m'),date('d')+3,date('Y'));
|
||
} else {
|
||
$j_date = strtotime($_POST['j_date']);
|
||
}
|
||
$worker = (int)$_POST['worker'];
|
||
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "в работе", worker_id = "'.$worker.'", date_start = "'.date("U").'", prioritet = "'.$prioritet.'", j_date = "'.$j_date.'" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id_order.'", "'.$user['id'].'", "'.date("U").'", "Добрый день! Исполнитель назначен. Задача взята в работу") ');
|
||
|
||
//отправляем уведомление пользователю, что он теперь исполнитель по данной задаче
|
||
//write_message($worker, 'Вы назначены исполнителем заявки №'.$id_order.' (<a href="/it/order/'.$id_order.'/">посмотреть</a>)');
|
||
write_message($worker, 'Вы назначены исполнителем заявки №'.$id_order.PHP_EOL.'Приоритет: '.$prioritet.' Срок выполнения: '.date('d.m.Y',$j_date));
|
||
|
||
//выход
|
||
$info_worker = get_user($worker);
|
||
getOrderToMessage($id, "По Вашей заявке назначен исполнитель: ".$info_worker['fio']);
|
||
header( "Refresh:0; url=/it/order/".$id."/", true, 303);
|
||
//header("Location: /it/order/".$id."/");
|
||
//exit;
|
||
}
|
||
//write_message(7632, 'Вы назначены исполнителем заявки ');
|
||
|
||
//руководитель отдела ОДОБРЯЕТ ЗАДАЧУ
|
||
if (isset($_POST['success_order'])){
|
||
|
||
$id_order = (int) $_POST['id_order'];
|
||
$score = $_POST['score'];
|
||
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "одобрено", score = "'.$score.'" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id_order.'", "'.$user['id'].'", "'.date("U").'", "Работа одобрена. Если в течение 24 часов со стороны руководителя не будет предпринято никаких действий, то задача будет считаться выполненной.") ');
|
||
|
||
//выход
|
||
//getOrderToMessage($id, "заявка одобрена руководителем (на данное уведомление реагировать не требуется)");
|
||
getOrderToMessage($id, "заявка одобрена руководителем (на данное уведомление реагировать не требуется)");
|
||
header( "Refresh:0; url=/it/order/".$id."/", true, 303);
|
||
//header("Location: /it/order/".$id."/");
|
||
//exit;
|
||
}
|
||
|
||
//включить в команду по решению задачи еще айтишников - НАЗНАЧАЕТ ИСПОЛНИТЕЛЬ
|
||
if (isset($_POST['team_save'])){
|
||
|
||
$str = ','; //айдишники с членами команды
|
||
foreach($_POST['it_users'] as $key => $val) {
|
||
$str .= $val.',';
|
||
}
|
||
|
||
//записываем
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET teams_id = "'.$str.'" WHERE id = "'.$id.'"');
|
||
//выход
|
||
header("Location: /it/order/".$id."/");
|
||
exit;
|
||
}
|
||
|
||
//отклонение/одобрение заявки
|
||
if (isset($_GET['action'])){
|
||
if ($_GET['action'] == 0){ //отправить в архив
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "архив" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id.'", "'.$user['id'].'", "'.date("U").'", "Задание отправлено в архив") ');
|
||
//отправляем сообщение в Телегу
|
||
getOrderToMessage($id, "заявка отправлена в архив (на данное уведомление реагировать не требуется)");
|
||
|
||
//берем информацию о заявке
|
||
$sql_info = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id = "'.$id.'" AND category = "Telegram" ORDER BY id DESC LIMIT 1';
|
||
$rez_info = $DB->QUR_SEL($sql_info);
|
||
botConnect('close', $rez_info[1]['email']);
|
||
} elseif ($_GET['action'] == 1){ //взять в работу
|
||
/*$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "в работе", worker_id = "'.$user['id'].'", date_start = "'.date("U").'" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id.'", "'.$user['id'].'", "'.date("U").'", "Добрый день! Задача взята в работу") ');*/
|
||
|
||
}
|
||
elseif ($_GET['action'] == 2){ //отправить на проверку
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "на проверке", date_end = "'.date("U").'" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id.'", "'.$user['id'].'", "'.date("U").'", "Исполнитель посчитал работу выполненной и отправил ее на проверку") ');
|
||
getOrderToMessage($id, "заявка отправлена на проверку руководителю (на данное уведомление реагировать не требуется)");
|
||
|
||
//берем информацию о заявке
|
||
$sql_info = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id = "'.$id.'" AND category = "Telegram" ORDER BY id DESC LIMIT 1';
|
||
$rez_info = $DB->QUR_SEL($sql_info);
|
||
botConnect('close', $rez_info[1]['email']);
|
||
}
|
||
elseif ($_GET['action'] == 3){ //отправить на доработку
|
||
$rez = $DB->QUR('UPDATE '.$ST['dbpf'].'_it_order SET status = "на доработке" WHERE id = "'.$id.'" ');
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (id_order, id_user, date_create, comment) VALUES ("'.$id.'", "'.$user['id'].'", "'.date("U").'", "Работа возвращена на доработку. Комментарии в сообщениях") ');
|
||
getOrderToMessage($id, "заявка отправлена на доработку (на данное уведомление реагировать не требуется)");
|
||
}
|
||
|
||
//выход
|
||
header( "Refresh:0; url=/it/order/".$id."/", true, 303);
|
||
//header("Location: /it/order/".$id."/");
|
||
//exit;
|
||
}
|
||
|
||
//отправляем сообщение в тикеты
|
||
if (isset($_POST['message_add'])){
|
||
$message = $_POST['message'];
|
||
|
||
$rez = $DB->QUR('INSERT INTO '.$ST['dbpf'].'_it_order_pr (`id_order`, `id_user`, `date_create`, `comment`, `file`) VALUES ("'.$id.'", "'.$user['id'].'", "'.date("U").'", "'.$message.'", "") ');
|
||
$id_mess = mysql_insert_id();
|
||
save_logs('отправлено сообщение №'.$id_mess);
|
||
|
||
//отправляем сообщение в Телегу
|
||
getOrderToMessage($id, $message);
|
||
|
||
|
||
//загрузка файла
|
||
$uploadfile='';
|
||
if(isset($_FILES['file'])){
|
||
$dir_dest = 'upload/it/'.$id.'/';
|
||
if(!file_exists($dir_dest)) mkdir($dir_dest);
|
||
$fil = date("U").'_mes_'.$_FILES['file']['name'];
|
||
$t = explode('.',$fil); $ext = $t[count($t)-1];
|
||
unset($t[count($t)-1]); $fn = implode('.',$t);
|
||
$uploadfile = $dir_dest . basename(translit($fn).'.'.$ext);
|
||
//if (!move_uploaded_file($_FILES['sfile']['tmp_name'], $uploadfile)) {
|
||
if (!$SYSTEMclass->sysUPLOAD($_FILES['file']['tmp_name'], $uploadfile)) {
|
||
$uploadfile='';
|
||
}
|
||
}
|
||
|
||
//а теперь указываем файл в базе
|
||
$sql = 'UPDATE '.$ST['dbpf'].'_it_order_pr SET file = "'.$uploadfile.'" WHERE id = "'.$id_mess.'" ';
|
||
$rez = $DB->QUR($sql);
|
||
|
||
//выход
|
||
header( "Refresh:0; url=/it/order/".$id."/", true, 303);
|
||
|
||
|
||
//header("Location: /it/order/".$id."/");
|
||
//exit;
|
||
}
|
||
|
||
|
||
/****/
|
||
$order = array();
|
||
//$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id_user = "'.$user['id'].'" AND id = "'.$id.'" LIMIT 1';
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE id = "'.$id.'" LIMIT 1';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
$val['m_date'] = date("d.m.Y", $val['m_date']);
|
||
$val['j_date'] = date("d.m.Y", $val['j_date']);
|
||
$val['date_create'] = date("d.m.Y", $val['date_create']);
|
||
$val['date_end'] = date("d.m.Y", $val['date_end']);
|
||
$val['worker'] = get_user($val['worker_id']);
|
||
$val['about'] = nl2br($val['about']);
|
||
|
||
//берем сообщения в заявке
|
||
$val['message'] = array();
|
||
$sql_mes = 'SELECT * FROM '.$ST['dbpf'].'_it_order_pr WHERE id_order = "'.$id.'" ORDER BY id ';
|
||
$rez_mes = $DB->QUR_SEL($sql_mes);
|
||
if ($rez_mes){
|
||
foreach ($rez_mes as $key2 => $val2) if ($key2){
|
||
$val2['user'] = get_user($val2['id_user']);
|
||
|
||
$val2['date_create'] = date("d.m.Y H:i:s", $val2['date_create']);
|
||
|
||
$val['message'][] = $val2;
|
||
}
|
||
}
|
||
|
||
$order[] = $val;
|
||
}
|
||
}
|
||
|
||
//print_r($order);
|
||
|
||
$smarty->assign('order', $order);
|
||
$smarty->assign('des', $_GET['des']);
|
||
|
||
}
|
||
|
||
//список айтишников
|
||
$itUsers = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_users as us, '.$ST['dbpf'].'_users_statuses as st WHERE us.id = st.id_user AND (st.statuses LIKE "%77%" OR us.status = 77) ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
|
||
$itUsers[] = $val;
|
||
}
|
||
}
|
||
|
||
$smarty->assign('itUsers', $itUsers);
|
||
|
||
|
||
/****/
|
||
|
||
$smarty->assign('corpuses', $corpuses); //корпусы
|
||
$smarty->assign('categoryTicket', $categoryTicket);
|
||
$smarty->assign('user', $user);
|
||
$smarty->assign('msg', $msg);
|
||
|
||
$maincontent = $smarty->fetch('tpl_it_order.html');
|
||
}
|
||
|
||
|
||
//баллы за редактирование профилей за месяц
|
||
/*
|
||
@id_worker - айдишник сотрудника
|
||
@date_my - месяц/год в формате 01.mm.YYYY - первые две цифры берем по умолчанию
|
||
*/
|
||
function pointsProfiles($id_worker, $seconds){
|
||
GLOBAL $ST, $DB;
|
||
|
||
//следующий месяц
|
||
/*$m = date('m')+1;
|
||
$next_month = strtotime(date('01.'.$m.'.Y'));*/
|
||
|
||
//возвращаем количество дней в месяце
|
||
$number_days = cal_days_in_month(CAL_GREGORIAN, date('m', $seconds), date('Y', $seconds));
|
||
|
||
|
||
//смотрим в логах активность за месяц
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_logs WHERE id_user = "'.$id_worker.'" AND message LIKE "%Обновлены учетные данные пользователя%" AND data_c >= "'.$seconds.'" AND data_c <= "'.($seconds + $number_days*24*60*60).'" GROUP BY message ';
|
||
//$sql = 'SELECT * FROM '.$ST['dbpf'].'_logs WHERE id_user = "'.$id_worker.'" AND message LIKE "%Обновлены учетные данные пользователя%" AND data_c >= "'.$seconds.'" AND data_c <= "'.($next_month).'" GROUP BY message ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
return round($rez[0]/20, 1); //за 20 паролей = 1 балл
|
||
}
|
||
|
||
}
|
||
|
||
//теперь смотрим баллы за выполненные задания в текущем месяце
|
||
function pointsOrdersSuccess($id_worker, $seconds){
|
||
GLOBAL $ST, $DB;
|
||
|
||
$score = 0;
|
||
|
||
//следующий месяц
|
||
/*$m = date('m')+1;
|
||
$next_month = strtotime(date('01.'.$m.'.Y'));*/
|
||
|
||
//возвращаем количество дней в месяце
|
||
$number_days = cal_days_in_month(CAL_GREGORIAN, date('m', $seconds), date('Y', $seconds));
|
||
//echo $number_days;
|
||
|
||
//т.е. является человек исполнителем или членом команды
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE (worker_id = "'.$id_worker.'" OR teams_id LIKE "%,'.$id_worker.',%") AND date_end >= "'.$seconds.'" AND date_end <= "'.($seconds + $number_days*24*60*60).'" AND status="выполнено" ';
|
||
//$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order WHERE (worker_id = "'.$id_worker.'" OR teams_id LIKE "%,'.$id_worker.',%") AND date_end >= "'.$seconds.'" AND date_end <= "'.($next_month).'" AND status="выполнено" ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$score += $val['score'];
|
||
}
|
||
}
|
||
|
||
//также начисляем за отработанные заявки - за каждые 50 сообщений = 1 балл
|
||
//$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order_pr WHERE id_user = "'.$id_worker.'" AND date_create >= "'.$seconds.'" AND date_create <= "'.($next_month).'"';
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_it_order_pr WHERE id_user = "'.$id_worker.'" AND date_create >= "'.$seconds.'" AND date_create <= "'.($seconds + $number_days*24*60*60).'"';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
$score += $rez[0]/50;
|
||
}
|
||
|
||
|
||
//округляем до десятых
|
||
return round($score, 1);
|
||
}
|
||
|
||
//РЕЙТИНГ ОТДЕЛА ПО МЕСЯЦАМ
|
||
if ($_GET['page'] == 'rating'){
|
||
|
||
$start_date = 0;
|
||
//выбран другой период - месяц/год
|
||
if (isset($_POST['select_date'])){
|
||
$year = $_POST['year'];
|
||
$month = (string) $_POST['month'];
|
||
|
||
//$start_date = strtotime(date('01.'.$month.'.'.$year.''))+3*60*60; //т.к. московское время смотрим
|
||
$start_date = date('01.'.$month.'.'.$year.''); //т.к. московское время смотрим
|
||
/*echo date('01.'.$month.'.'.$year.'');
|
||
echo ' '.$start_date.' ';*/
|
||
|
||
}
|
||
|
||
|
||
//список айтишников
|
||
$itUsers = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_users as us, '.$ST['dbpf'].'_users_statuses as st WHERE us.id = st.id_user AND (st.statuses LIKE "%77%" OR us.status = 77) ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
$date_start_month = date('01.m.Y');
|
||
|
||
//если выбран месяц/год, то отображать нужно за нужный период
|
||
if ($start_date != 0) $date_start_month = $start_date;
|
||
|
||
//$val['date_start_month'] = $date_start_month; //активность за текущий месяц
|
||
$val['score_tek'] = pointsProfiles($val['id_user'], strtotime($date_start_month)) + pointsOrdersSuccess($val['id_user'], strtotime($date_start_month)); //активность за текущий месяц
|
||
$itUsers[] = $val;
|
||
}
|
||
}
|
||
|
||
$smarty->assign('itUsers', $itUsers);
|
||
$maincontent = $smarty->fetch('tpl_it_rating.html');
|
||
}
|
||
|
||
//журнал восстановления паролей
|
||
if ($_GET['page'] == 'journalPass'){
|
||
$msg = 0; //нет сообщений
|
||
|
||
$pass = array();
|
||
|
||
$date = date("U")-3*24*60*60;
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_logs WHERE message LIKE "%Обновлены учетные данные пользователя%" AND data_c >= "'.$date.'" ORDER BY data_c DESC ';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$exp = explode("Обновлены учетные данные пользователя", $val['message']);
|
||
|
||
$val['user'] = get_user($exp[1]);
|
||
$val['sotr'] = get_user($val['id_user']);
|
||
$val['data_c'] = date("d.m.Y H:i:s", $val['data_c']);
|
||
$pass[] = $val;
|
||
}
|
||
}
|
||
|
||
$smarty->assign('pass', $pass);
|
||
$maincontent = $smarty->fetch('tpl_it_pass.html');
|
||
}
|
||
|
||
//lms - доступ к системе
|
||
if ($_GET['page'] == 'lms'){
|
||
$user = $_SESSION['user'];
|
||
$smarty->assign('user', $user);
|
||
$maincontent = $smarty->fetch('tpl_lms.html');
|
||
}
|
||
//LMS Moodle - по умолчанию выводим список всех групп
|
||
if ($_GET['page'] == 'moodle'){
|
||
$msg = 0;
|
||
$grupps = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_grupp WHERE NOT sokr LIKE "%выпуск%" AND sokr LIKE "%-%" ORDER BY id';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$val['name'] = translit($val['sokr'].' '.$val['fo']);
|
||
$val['idnumber'] = translit($val['name']);
|
||
//$val['description'] = $val['specialnost'];
|
||
$val['description'] = $val['sokr'].' '.$val['fo'];
|
||
$grupps[] = $val;
|
||
}
|
||
}
|
||
$smarty->assign('grupps', $grupps);
|
||
$maincontent = $smarty->fetch('tpl_it_moodle.html');
|
||
}
|
||
//LMS Moodle - список студентов
|
||
if ($_GET['page'] == 'moodle_students'){
|
||
if(isset($_POST['moodle_grupp_csv_get'])){
|
||
if(isset($_POST['id_grupps'])&&count($_POST['id_grupps'])) {
|
||
//$id_grupp = (int)$_POST['id_grupp'];
|
||
$file = 'tmp/moodle_grupp_csv_get.csv';
|
||
$csvs = array();
|
||
$csvs[] = 'username;password;firstname;lastname;email;cohort1';
|
||
foreach($_POST['id_grupps'] as $id_grupp => $val) {
|
||
$users = moodle_grupp_csv_get($id_grupp);
|
||
if (count($users)) $csvs = array_merge($csvs, $users);
|
||
}
|
||
file_put_contents($file, implode(PHP_EOL, $csvs));
|
||
include_once 'downloadfile.php';
|
||
file_force_download($file);
|
||
exit();
|
||
}
|
||
}
|
||
//получение групп
|
||
$grupps = array();
|
||
$sql = 'SELECT id,sokr,fo,year_start FROM '.$ST['dbpf'].'_grupp WHERE NOT sokr LIKE "%выпуск%" AND sokr LIKE "%-%" ORDER BY sokr,fo';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$val['name'] = translit($val['sokr'].' '.$val['fo']);
|
||
$val['idnumber'] = translit($val['name']);
|
||
$val['description'] = $val['sokr'].' '.$val['fo'];
|
||
$grupps[] = $val;
|
||
}
|
||
}
|
||
$smarty->assign('grupps', $grupps);
|
||
|
||
|
||
|
||
$date = date("U");
|
||
$users = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_users WHERE status >= 0 AND data_c >= "'.($date-6*30*24*60*60).'" GROUP BY email';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$val['student'] = get_student($val['id']);
|
||
$val['cohort'] = translit($val['student']['sokr'].' '.$val['student']['fo']);
|
||
$users[] = $val;
|
||
}
|
||
}
|
||
$smarty->assign('users', $users);
|
||
$maincontent = $smarty->fetch('tpl_it_moodle_students.html');
|
||
}
|
||
//LMS Moodle - обновленный список студентов с группами
|
||
if ($_GET['page'] == 'moodle_update_students'){
|
||
if (isset($_GET['des'])){
|
||
$year = (int)$_GET['des']; //смотрим зарегистрированных за определенный год и потом делаем выгрузку и меняем группу
|
||
$date = $year.'-01-01';
|
||
$time = strtotime($date);
|
||
$users = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_users WHERE status >= 0 AND data_c >= "'.$time.'" AND data_c <= "'.($time + 365*24*60*60).'" GROUP BY email';
|
||
//echo $sql;
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
|
||
$val['student'] = get_student($val['id']);
|
||
$val['cohort'] = translit($val['student']['sokr'].' '.$val['student']['fo']);
|
||
|
||
$users[] = $val;
|
||
}
|
||
}
|
||
}
|
||
$smarty->assign('users', $users);
|
||
$maincontent = $smarty->fetch('tpl_it_moodle_update_students.html');
|
||
}
|
||
|
||
//ДЕАКТИВАЦИЯ КАРТ - БЛОК выпускники, которые не продолжают обучение
|
||
if ($_GET['page'] == 'cards_block'){
|
||
//количество выбывших студентов, количество продолжающих обучение и кол-во преподавателей
|
||
$count['vib'] = 0;
|
||
$count['prod'] = 0;
|
||
$count['teach'] = 0;
|
||
|
||
if (isset($_GET['des'])){
|
||
$year = (int)$_GET['des']; //смотрим выпускников за определенный год
|
||
|
||
//для начала определяем список групп
|
||
$grupps = array();
|
||
$sql = 'SELECT * FROM '.$ST['dbpf'].'_grupp WHERE sokr LIKE "Выпуск '.$year.'%" ';
|
||
//echo $sql;
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
//теперь записываем студентов в группу
|
||
$val['students'] = array();
|
||
$sql_students = 'SELECT * FROM '.$ST['dbpf'].'_students WHERE id_grupp = "'.$val['id'].'" ';
|
||
$rez_students = $DB->QUR_SEL($sql_students);
|
||
if ($rez_students){
|
||
foreach ($rez_students as $key_st => $val_st) if ($key_st){
|
||
$val_st['user'] = get_user($val_st['id_user']);
|
||
|
||
//также смотрим, учится ли где-нибудь еще данный студент (может есть еще профили) и главное - не является ли преподавателем
|
||
$val_st['teacher'] = get_teacher_only($val_st['id_user']);
|
||
|
||
//также смотрим, есть ли дубликаты в системе - по ним делаем вывод, что скорее всего студент продолжает обучение
|
||
$val_st['duplicates'] = 1;
|
||
$sql_dup = 'SELECT * FROM '.$ST['dbpf'].'_users WHERE fio LIKE "%'.$val_st['user']['fio'].'%" LIMIT 2';
|
||
$rez_dup = $DB->QUR_SEL($sql_dup);
|
||
if ($rez_dup) $val_st['duplicates'] = $rez_dup[0];
|
||
|
||
//МЫ НЕ БУДЕМ ВЫЯСНЯТЬ ВЫПУСТИЛСЯ ЛИ ОН ТАМ, чтобы НЕ ПЕРЕГРУЖАТЬ СИСТЕМУ И ПЕРЕСТРАХОВАТЬСЯ: деканаыт могут не отметить какого-либо студента
|
||
|
||
if ($val_st['teacher']['id'] > 0) $count['teach']++;
|
||
elseif ($val_st['duplicates'] > 1) $count['prod']++;
|
||
else $count['vib']++;
|
||
|
||
$val['students'][] = $val_st;
|
||
}
|
||
}
|
||
|
||
|
||
$grupps[] = $val;
|
||
}
|
||
}
|
||
|
||
//echo '<pre>'; print_r($grupps); echo '</pre>';
|
||
|
||
}
|
||
|
||
$smarty->assign('count', $count);
|
||
$smarty->assign('grupps', $grupps);
|
||
$maincontent = $smarty->fetch('tpl_it_cards_block.html');
|
||
}
|
||
|
||
/**
|
||
* Выбираем пользователей по группам и формируем массив
|
||
* @param $id_grupp
|
||
* @return array
|
||
*/
|
||
function moodle_grupp_csv_get($id_grupp){
|
||
GLOBAL $ST,$DB; $csvs = array();
|
||
$users=array(); //Выберем студентов из группы
|
||
$sql = 'SELECT u.id,u.fio,u.email FROM '.$ST['dbpf'].'_users as u,'.$ST['dbpf'].'_students as s WHERE s.id_grupp='.$id_grupp.' AND s.id_user=u.id AND u.status >= 0';
|
||
$rez = $DB->QUR_SEL($sql);
|
||
if ($rez){
|
||
foreach ($rez as $key => $val) if ($key){
|
||
$val['student'] = get_student($val['id']);
|
||
$val['cohort'] = translit($val['student']['sokr'].' '.$val['student']['fo']);
|
||
$val['password'] = 'Mgtu'.$val['id'].'pw!';
|
||
$tmp = explode(' ',$val['fio']);
|
||
$val['firstname'] = $tmp[0];
|
||
$val['lastname'] = $tmp[1];
|
||
if(isset($tmp[2])) $val['lastname'] .= ' '.$tmp[2];
|
||
if(isset($tmp[3])) $val['lastname'] .= ' '.$tmp[3];
|
||
if(isset($tmp[4])) $val['lastname'] .= ' '.$tmp[4];
|
||
//$tmp = explode('@',$val['email']);
|
||
$val['username'] = $val['email'];
|
||
$users[] = $val;
|
||
}
|
||
}
|
||
//echo '<pre>'.print_r($users,1).'</pre>'; exit();
|
||
if(count($users)) {
|
||
//https://docs.moodle.org/311/en/Cohorts
|
||
//username,password,firstname,lastname,email,cohort1
|
||
foreach($users as $k => $user){
|
||
$csvs[] = trim($user['username']).';'.trim($user['password']).';'.trim($user['firstname']).';'.trim($user['lastname']).';'.trim($user['email']).';'.trim($user['cohort']);
|
||
}
|
||
}
|
||
return $csvs;
|
||
}
|
||
?>
|