EIOS/inc/it.php

857 lines
38 KiB
PHP
Raw Normal View History

2023-12-28 15:39:22 +03:00
<?
//ИТ-отдел
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;
}
?>