'use strict'; var statuses = {'new': 'Новая анкета', 'filled': 'Анкета заполнена', 'work': 'В работе', 'soglasovanie_uk': 'На согласовании УК', 'soglasovanie_uk1': 'На согласовании УК 1', 'soglasovanie_uk2': 'На согласовании УК 2', 'soglasovanie_uoup': 'На согласовании УОУП', 'accepted_uoup': 'Простановка источника финансирования', 'accepted': 'Согласована', 'refused': 'Отказ факультета', 'predstavlenie': 'Представление на прием сформировано', 'predstavlenie_signed_dean': 'Представление на прием подписано факультетом', 'predstavlenie_signed_rector': 'Представление на прием согласовано ректором', 'done': 'Трудоустроен', 'done_delete_pd': 'Удалены ПД'}; var $_sciences = ['архитектуры', 'биологических наук', 'ветеринарных наук', 'военных наук', 'географических наук', 'геолого–минералогических наук', 'искусствоведения', 'исторических наук', 'культурологии', 'медицинских наук', 'наук о Земле', 'педагогических наук', 'политических наук', 'психологических наук', 'сельскохозяйственных наук', 'социологических наук', 'теологии', 'технических наук', 'фармацевтических наук', 'физико-математических наук', 'филологических наук', 'философских наук', 'химических наук', 'экономических наук', 'юридических наук']; // var statuses_without_done = clone(statuses); // delete statuses_without_done['done']; // delete statuses_without_done['initial']; var roles_titles = {'administrator': 'Администратор', 'uoup': 'Управление организации учебного процесса', 'kandidat': 'Кандидат', 'uk': 'Управление кадров', 'uk1': 'Управление кадров 1', 'uk2': 'Управление кадров 2', 'department': 'Факультет', 'ufmts': 'УФМТС'}; var c_roles = {}; var $_education_levels = {high: 'Высшее образование', spo: 'СПО', mid: 'Среднее образование'}; var c_access = ''; var c_login = ''; var c_sharp = ''; var c_id = 0; var CUR_YEAR = new Date().getFullYear(); var $_theme_types = {'1': 'Фундаментальное', '2': 'Прикладное', '3': 'Экспериментальное', '4': 'Другое'}; var $_1c_education_levels = {'0': 'аспирантура', '1': 'бакалавр', '2': 'магистр', '3': 'ординатура', '4': 'специалист'}; // var $_roles = {}; var c_department_id = ''; if (Object.keys(c_roles).length == 0) c_roles = null; CL(c_roles); function transformDepartments(jsonString) { try { const departmentsArray = JSON.parse(jsonString); return departmentsArray.reduce((acc, department) => { acc[department.department_id] = department; return acc; }, {}); } catch (error) { console.error("Error parsing JSON:", error); return {}; } } // Факультеты (может быть > 1), где декан является деканом const c_dean_departments_json = ''; // CL(c_dean_departments_json); const c_departments_obj = c_dean_departments_json.length ? transformDepartments(c_dean_departments_json) : {}; // CL(c_departments_obj); var MONTHS = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ]; function empty(val) { return !val || !val.length; } function isEmptyObject(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object } function MysqlToDE($date) { var dateArr = $date.split('-'); return dateArr[2] + "." + dateArr[1] + "." + dateArr[0]; } // https://stackoverflow.com/questions/10015027/javascript-tofixed-not-rounding function toFixed(number, decimals) { var x = Math.pow(10, Number(decimals) + 1); return (Number(number) + (1 / x)).toFixed(decimals) } function roundToTwo(num) { return toFixed(+(Math.round(num + "e+2") + "e-2"), 2); } Array.prototype.in_array = function(p_val) { for(var i = 0, l = this.length; i < l; i++) { if(this[i] == p_val) { return true; } } return false; } if (!String.prototype.trim) { (function() { // Make sure we trim BOM and NBSP var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; String.prototype.trim = function() { return this.replace(rtrim, ''); }; })(); } function monthDiff(d1, d2) { var months; months = (d2.getFullYear() - d1.getFullYear()) * 12; months -= d1.getMonth(); months += d2.getMonth() + 1; return months <= 0 ? 0 : months; } function strip_tags(str){ return str .replace(/(<(br[^>]*)>)/ig, '\n') .replace(/(<([^>]+)>)/ig,''); } function replaceComma(value) { if (value) return value.replace(',', '.'); else return ''; // CL(value); } function findById(obj, id) { for (var key in obj) { if (parseInt(obj[key].id) == id) return obj[key]; // else CL(obj[key].id + " != " + id); } return null; } // Разница между датами в кол-ве месяцев (включает частично затронутые месяцы) function GetStageMonthsNum(stage) { // CL($scope.selected_project_stage.start_date); if (stage.start_date && stage.end_date) { var dateArr = stage.start_date.split('.'); var start_date = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); dateArr = stage.end_date.split('.'); var end_date = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); return monthDiff(start_date, end_date); } else { // CL("GetStageMonthsNum: у этапа " + stage.id + " нет срока"); return 0; } } function findKeyByValue(obj, val) { for (var key in obj) { if (obj[key] == val) return key; } return null; } function findByColumn(arr, column, value) { for (var i = 0; i < arr.length; i++) { if (arr[i][column] == value) { return arr[i]; } } } function deleteByColumn(arr, column, value) { for (var i = 0; i < arr.length; i++) { if (arr[i][column] == value) { arr.splice(i, 1); // CL(i); return; } } } function clone(obj) { var copy; // Handle the 3 simple types, and null or undefined if (null == obj || "object" != typeof obj) return obj; // Handle Date if (obj instanceof Date) { copy = new Date(); copy.setTime(obj.getTime()); return copy; } // Handle Array if (obj instanceof Array) { copy = []; for (var i = 0, len = obj.length; i < len; i++) { copy[i] = clone(obj[i]); } return copy; } // Handle Object if (obj instanceof Object) { copy = {}; for (var attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); } return copy; } throw new Error("Unable to copy obj! Its type isn't supported."); } function getExtension(filename) { var name_parts = filename.split('.'); return name_parts[name_parts.length - 1]; } function getRandom(min, max) { return Math.random() * (max - min) + min; } var members_types = { sci: 'Члены научного коллектива, выполняющие научную работу в рамках проекта', itr: 'Члены научного коллектива, выполняющие инженерно-техническую работу', aux: 'Вспомогательный персонал по выполнению проекта' }; //**************************************** // https://amsul.ca/pickadate.js/ angular.module('app', ['ngRoute', 'ngDialog', 'angularSpinners', 'ngMask', 'angularFileUpload', 'ngSanitize', 'toastr', 'ngAnimate', 'angucomplete-alt', 'pickadate']) .constant('system_start_year', 2023) // http://oncodesign.io/2014/02/19/safely-prevent-template-caching-in-angularjs/ .run(function($rootScope, $templateCache) { $rootScope.$on('$routeChangeStart', function(event, next, current) { if (typeof(current) !== 'undefined'){ $templateCache.remove(current.templateUrl); } }); }) .config(['$routeProvider', '$locationProvider', 'toastrConfig', /*'uiMask.ConfigProvider',*/ function ($routeProvider, $locationProvider, toastrConfig) { angular.extend(toastrConfig, { autoDismiss: false, containerId: 'toast-container', maxOpened: 0, newestOnTop: true, positionClass: 'toast-bottom-right', preventDuplicates: false, preventOpenDuplicates: true, target: 'html', // debug: true, // timeOut: 500000 }); $locationProvider.hashPrefix(''); $routeProvider .when('/', { templateUrl: 'index.tpl.html?' + getRandom(10000, 99999), controller: 'IndexCtrl', resolve: { kandidat: function($http) { if (c_id) return $http({url: 'ajax/get/get_kandidat.php', method: 'GET', params: {}}); else return {data: {}}; }, admin: function() { return false; }, redirect_kandidat_id: function() { return null; }, redirect_predstavlenie: function() { return null; } } }) .when('/admin', { templateUrl: 'index.tpl.html?' + getRandom(10000, 99999), controller: 'IndexCtrl', resolve: { kandidat: function($http) { return {data: {}}; }, admin: function() { return true; }, redirect_kandidat_id: function() { return null; }, redirect_predstavlenie: function() { return null; } } }) // Для декана/директора, чтобы по его ссылке на представления показать форму авторизации, а затем перейти автоматом на представления .when('/admin/predstavlenie', { templateUrl: 'index.tpl.html?' + getRandom(10000, 99999), controller: 'IndexCtrl', resolve: { kandidat: function($http) { return {data: {}}; }, admin: function() { return true; }, redirect_kandidat_id: function() { return null; }, redirect_predstavlenie: function() { return true; } } }) // для того чтобы после авторизации сразу перейти к нужной анкете (чтобы из письма удобно переходить, когда авторизация уже слетела) .when('/admin/anketa/:id', { templateUrl: 'index.tpl.html?' + getRandom(10000, 99999), controller: 'IndexCtrl', resolve: { kandidat: function($http) { return {data: {}}; }, admin: function() { return true; }, redirect_kandidat_id: function($route) { return $route.current.params.id; }, redirect_predstavlenie: function() { return null; } } }) // "Кандидаты" .when('/kandidats', { // конкретный статус используется для роли факультет templateUrl: 'kandidats.tpl.php?status=filled&' + getRandom(10000, 99999), controller: 'KandidatsCtrl', resolve: { params: function() { return {status: 'filled'}; } } }) // "Все кандидаты" .when('/all', { // все статусы, но с привязкой к факультету // страница создана для роли УК templateUrl: 'kandidats.tpl.php?status=all&' + getRandom(10000, 99999), controller: 'KandidatsCtrl', resolve: { params: function() { return {status: 'all'}; } } }) // "В работе"; показываются кандидаты, привязанные к факультету, независимо от статуса! // конкретный статус используется для роли факультет .when('/kandidats/work', { templateUrl: 'kandidats.tpl.php?status=work&' + getRandom(10000, 99999), controller: 'KandidatsCtrl', resolve: { params: function() { return {status: 'work'}; } } }) .when('/anketa/:id', { templateUrl: 'index.tpl.html?' + getRandom(10000, 99999), controller: 'AnketaCtrl', resolve: { kandidat: function(LDialog, $route, $http) { return $http({url: 'ajax/get/get_kandidat.php', method: 'GET', params: {id: $route.current.params.id}}); }, sprav: function($http) { return $http({url: 'ajax/get/sprav.php', method: 'GET', params: {}}); }, kandidat_id: function($route) { return $route.current.params.id } } }) // Согласованные .when('/accepted', { templateUrl: 'accepted.tpl.html?' + getRandom(10000, 99999), controller: 'AcceptedCtrl', resolve: { kandidats: function(LDialog, $route, $http) { return $http({url: 'ajax/get/accepted.php', method: 'GET', params: {}}); } } }) // Представление .when('/predstavlenie', { templateUrl: 'predstavlenie.tpl.html?' + getRandom(10000, 99999), controller: 'PredstavlenieCtrl', resolve: { // kandidats: function(LDialog, $route, $http) // { // return $http({url: 'ajax/get/predstavlenie.php', method: 'GET', params: {}}); // } } }) .when('/users', { templateUrl: 'users.tpl.html?' + getRandom(10000, 99999), controller: 'UsersCtrl', resolve: { Departments: function(LDialog, $route, $http) { return $http({url: 'ajax/get/departments.php', method: 'GET', params: {}}); }, Users: function(LDialog, $route, $http) { return $http({url: 'ajax/get/users.php', method: 'GET', params: {}}); } } }) .when('/registration', { templateUrl: 'registration.tpl.html?' + getRandom(10000, 99999), controller: 'RegistrationCtrl', resolve: { forgot: function() { return false } } }) .when('/registration/forgot', { templateUrl: 'registration.tpl.html?' + getRandom(10000, 99999), controller: 'RegistrationCtrl', resolve: { forgot: function() { return true } } }) .when('/documents', { templateUrl: 'documents.tpl.php?' + getRandom(10000, 99999), controller: 'DocumentsCtrl' }) // .when('/uk', // { // templateUrl: 'uk.tpl.html?' + getRandom(10000, 99999), // controller: 'UKCtrl', // resolve: // { // kandidats: function(LDialog, $route, $http) // { // return $http({url: 'ajax/get/predstavlenie.php', method: 'GET', params: {}}); // } // } // }) // .when('/edit/:id', // { // templateUrl: 'project.tpl.html?' + getRandom(10000, 99999), // controller: 'ProjectCtrl', // resolve: // { // project: function(dbNIR, LDialog, $route, $http) // { // if (parseFloat($route.current.params.id)) // { // // LDialog.error('Ошибка получения Проекта'); // return $http({url: 'ajax/get/get_project.php', method: 'GET', params: {id: $route.current.params.id}}); // // dbNIR.get($route.current.params.id) // // .error(function() // // { // // LDialog.error('Ошибка получения Проекта'); // // }) // ; // } // else if ($route.current.params.id == 'new') // { // return {id: 'new'} // } // } // } // }) // .when('/edit/new', // { // templateUrl: 'project.tpl.html?' + getRandom(10000, 99999), // controller: 'ProjectCtrl', // resolve: // { // project: function($route) // { // return {id: 'new'} // } // } // }) .otherwise( { template: 'Страница не найдена' }); }]) //Главный контроллер .controller ('AppCtrl', function($scope, $rootScope, ngDialog) { CL('AppCtrl') $rootScope.c_roles = c_roles; $rootScope.statuses = statuses; $rootScope.c_login = c_login; $rootScope.c_sharp = c_sharp; // if (c_roles.uk) window.location = '#/uk'; // if (c_access == 'full') window.location = '#/users'; // CL(c_roles); // $rootScope.statuses = statuses; // var cur_date = new Date(); // var cur_month = cur_date.getMonth(); // $scope.$on('$routeChangeSuccess', function() { // $scope.selected_year = $route.current.params.year; // }); $rootScope.min_date = new Date(CUR_YEAR - 90, 0, 1); $rootScope.max_date = new Date(CUR_YEAR - 0, 11, 31); // CL($scope.max_date); $rootScope.pickDateOptions = { monthsFull: MONTHS, monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], weekdaysFull: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'], weekdaysShort: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пн', 'Сб'], showMonthsShort: undefined, showWeekdaysFull: undefined, firstDay: 1, selectYears: 90 - 16, today: 'Сегодня', clear: 'Очистить', close: 'Закрыть', format: 'dd.mm.yyyy', formatSubmit: 'yyyy-mm-dd', editable: true, onSet: function(context) { if (context['select']) { // var selectedDate = new Date(context['select']); // CL(selectedDate); // CheckTermDates(context); } } }; $rootScope.pickTimeOptions = { clear: '', format: 'HH:i', interval: 10, // editable: true }; $rootScope.ShowSoglasie = function() { $scope.show_pdn_dialog_close_button = true; ngDialog.open({ template: "pdn.tpl.html" + "?" + getRandom(10000, 99999), scope: $scope, plain: false, disableAnimation: true, className: 'ngdialog-theme-default history' }) return true; } }) // Анкета кандидата (интерфейс кандидата) // Также формы авторизации кандидата и администратора // redirect_kandidat_id - для быстрого перехода (администратора) к анкете кандидата после авторизации .controller ('IndexCtrl', function($scope, $rootScope, kandidat, FileUploader, toastr, $http, spinnerService, $interval, admin, ngDialog, $templateCache, redirect_kandidat_id, redirect_predstavlenie) { if (c_access == 'full') window.location = '#/users'; CL('IndexCtrl'); // CL(redirect_predstavlenie); // CL(c_id); $templateCache.put('confirm_delete', '
Вы уверены, что хотите удалить?
\ '); $rootScope.page = 'index'; $scope.c_login = c_login; $scope.c_id = c_id; $scope.anketa = kandidat.data; $scope.auth = {}; $scope.statuses = statuses; $scope.admin = admin; $scope.c_department_id = c_department_id; $scope.$_sciences = $_sciences; $scope.$_1c_education_levels = $_1c_education_levels; // $scope.c_roles = c_roles; // CL($scope.anketa.type); // if (!c_id && c_access == 'admin') window.location = "/#/kandidats"; // форма авторизации if (!$scope.c_id) { } // $scope.setValidity = function(some) // { // CL(some); // } // Инициализация загрузчиков для "Образования" function InitEducationUploader(education, index) { // CL(education); // CL(index); if (!$scope.educations_uploaders) $scope.educations_uploaders = []; $scope.educations_uploaders[index] = new FileUploader({ scope: $scope, url: 'ajax/post/education_file_upload.php', autoUpload: true, formData: [{kandidat_id: $scope.anketa.id, education_id: education.id}] }); $scope.educations_uploaders[index].onErrorItem = function(item, response, status, headers) { $scope.educations_uploaders[index].errorHappened = true; toastr.error("Ошибка при загрузке файла"); } $scope.educations_uploaders[index].onCompleteAll = function() { if (!$scope.educations_uploaders[index].errorHappened) { toastr.success("Файл загружен"); } this.clearQueue(); } $scope.educations_uploaders[index].onSuccessItem = function(item, response, status, headers) { if (response.result == 'success') { education.file_hash = response.created_file.file_hash; education.file_src_name = response.created_file.file_src_name; } else $scope.educations_uploaders[index].errorHappened = true; } } if ($scope.anketa.educations) { angular.forEach($scope.anketa.educations, function(education, index) { InitEducationUploader(education, index); }) } $scope.Auth = function() { $http({url: 'ajax/post/auth.php', method: 'POST', data: $scope.auth}) .then(function(result) { if (result.data.result == 'success') { // CL(redirect_predstavlenie); if (redirect_kandidat_id) { // CL(1); window.location = "/anketa/" + redirect_kandidat_id; } else if (redirect_predstavlenie) { // CL(2); window.location = "/predstavlenie"; } else { // CL(3); window.location = "/" ; } } else { toastr.error("Вы ввели неправильный логин или пароль"); } }); } // Fix bug when can not reupload the same file FileUploader.FileSelect.prototype.isEmptyAfterSelection = function() { return true }; var dateArr = []; if ($scope.anketa.birth_date) dateArr = $scope.anketa.birth_date.split('.'); if (dateArr.length) $scope.anketa.birth_date_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); dateArr = []; if ($scope.anketa.passport_kogda) dateArr = $scope.anketa.passport_kogda.split('.'); if (dateArr.length) $scope.anketa.passport_kogda_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); $scope.MayEditAnketa = function() { return $scope.anketa.status == 'new' || $scope.anketa.status == 'filled'; } $scope.SaveKandidat = function() { // валидация $scope.anketa.valid = true; $scope.anketa.save_pressed = true; // CL($scope.anketa.save_pressed); if (empty($scope.anketa.surname)) $scope.anketa.valid = false; if (empty($scope.anketa.name)) $scope.anketa.valid = false; if (!$scope.anketa.no_patronymic && empty($scope.anketa.patronymic)) $scope.anketa.valid = false; if (empty($scope.anketa.birth_date)) $scope.anketa.valid = false; if (empty($scope.anketa.e_mail)) $scope.anketa.valid = false; // if (empty($scope.anketa.vo)) $scope.anketa.valid = false; // -- если человек не найден в кадрах, то обязательная за // if (!$scope.anketa.login && empty($scope.anketa.files['vo'])) $scope.anketa.valid = false; // commented Rotkov // if (!$scope.anketa.login && empty($scope.anketa.files['trudovaya'])) $scope.anketa.valid = false; // if (empty($scope.anketa.files['vo'])) $scope.anketa.valid = false; // if (empty($scope.anketa.files['soglasie'])) $scope.anketa.valid = false; if (empty($scope.anketa.passport_num)) $scope.anketa.valid = false; if (empty($scope.anketa.passport_seria)) $scope.anketa.valid = false; if (empty($scope.anketa.passport_kem)) $scope.anketa.valid = false; if (empty($scope.anketa.passport_kogda)) $scope.anketa.valid = false; if (empty($scope.anketa.passport_address)) $scope.anketa.valid = false; if (empty($scope.anketa.passport_podrazdelenie)) $scope.anketa.valid = false; if (empty($scope.anketa.common_stage)) $scope.anketa.valid = false; if (empty($scope.anketa.science_stage)) $scope.anketa.valid = false; if (empty($scope.anketa.pedagogic_stage)) $scope.anketa.valid = false; //if (empty($scope.anketa.files['passport'])) $scope.anketa.valid = false; if (empty($scope.anketa.snils)) $scope.anketa.valid = false; // if (empty($scope.anketa.medpolis)) $scope.anketa.valid = false; // файл обязательный, только если СНИЛС не взят из 1С //if ($scope.anketa.snils_1c == '0' && empty($scope.anketa.files['snils'])) $scope.anketa.valid = false; if (empty($scope.anketa.inn)) $scope.anketa.valid = false; //if (empty($scope.anketa.files['inn'])) $scope.anketa.valid = false; if (empty($scope.anketa.zvanie)) $scope.anketa.valid = false; if (empty($scope.anketa.stepen)) $scope.anketa.valid = false; if (($scope.anketa.zvanie == 'доцент' || $scope.anketa.zvanie == 'профессор') && empty($scope.anketa.zvanie_date)) { $scope.anketa.valid = false; } if (($scope.anketa.zvanie == 'доцент' || $scope.anketa.zvanie == 'профессор') && empty($scope.anketa.zvanie_attestat)) { $scope.anketa.valid = false; } if (($scope.anketa.zvanie == 'доцент' || $scope.anketa.zvanie == 'профессор') && empty($scope.anketa.files['zvanie'])) { $scope.anketa.valid = false; } if ((empty($scope.anketa.main_work_place) || empty($scope.anketa.main_work_dolzhnost)) && ($scope.anketa.type == 'vnutr' || $scope.anketa.type == 'vnesh')) { $scope.anketa.valid = false; } // if (empty($scope.anketa.articles)) $scope.anketa.valid = false; // if (empty($scope.anketa.grants)) $scope.anketa.valid = false; // if (empty($scope.anketa.grants_applications)) $scope.anketa.valid = false; // if (empty($scope.anketa.)) $scope.anketa.valid = false; // меняем статус в зависимости от валидности формы // СОХРАНЯЕТ КАНДИДАТ САМ if ($scope.anketa.status == 'new' && $scope.anketa.valid) $scope.anketa.new_status = 'filled'; else if ($scope.anketa.status == 'filled' && !$scope.anketa.valid) $scope.anketa.new_status = 'new'; // а в других статусах менять анкету нельзя { // CL($scope.anketa); // return; $http({url: 'ajax/post/save_kandidat.php', method: 'POST', data: $scope.anketa}) .then(function(result) { if (result.data.result == 'success') { $scope.anketa.history = result.data.history; if ($scope.anketa.valid) { if ($scope.anketa.new_status == 'filled') { toastr.success("Анкета перешла в статус \"Заполнена\" и отправлена на рассмотрение"); } else { toastr.success("Анкета сохранена"); } } else { toastr.warning("Анкета сохранена, но не все обязательные поля заполнены"); } if ($scope.anketa.new_status) { $scope.anketa.status = $scope.anketa.new_status; $scope.anketa.new_status = ''; } // $scope.onControllerChanged(); $scope.$broadcast('angucomplete-alt:clearInput', 'fio'); // $scope.add_user = {role: undefined}; // $scope.params.show_add_user = false; } else if (result.data.result == 'snils_exists') { toastr.error("Пользователь с данным СНИЛС уже существует. Запрещено создавать двойные учетные записи."); } else { toastr.error("Ошибка сохранения"); } }); } } $scope.NewPhoneSendCode = function() { // CL($scope.anketa.new_phone); // return; if ($scope.anketa.new_phone.length < 11) { toastr.error("Некорректный ввод номера телефона"); return; } spinnerService.show('spinner'); $http({url: 'ajax/post/new_phone_send_code.php', method: 'POST', data: {phone: $scope.anketa.new_phone}}) .then(function(result) { if (result.data.exists == true) { toastr.error("Пользователь с таким телефоном уже зарегистрирован"); } else if (result.data.result == 'success') { $scope.anketa.submode_phone = 'input_code'; // TMP // $scope.anketa.new_phone_code = result.data.code; $scope.start_timer(); } // else spinnerService.hide('spinner'); }); } $scope.code_time = 0; var timer; $scope.start_timer = function() { $scope.code_time = 30; timer = $interval(function() { $scope.code_time--; if ($scope.code_time == 0) // таймер окончен { $scope.stop_timer(); } }, 1000); }; $scope.stop_timer = function() { //$scope.where_sent_code.mobile = undefined; if (angular.isDefined(timer)) { $interval.cancel(timer); timer = undefined; } }; $scope.NewPhoneCancel = function() { $scope.anketa.submode_phone = ''; $scope.anketa.new_phone_code = ''; $scope.anketa.new_phone = ''; } $scope.NewPhoneCheckCode = function() { $http({url: 'ajax/post/new_phone_check_code.php', method: 'POST', data: {code: $scope.anketa.new_phone_code}}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Номер телефона изменён"); $scope.anketa.phone = $scope.anketa.new_phone; $scope.NewPhoneCancel(); } else { toastr.error("Неверный код"); } }); } var uploaderInit = { scope: $scope, url: 'ajax/post/file_upload.php', autoUpload: true }; // Инициализировать загрузчики файлов для анкеты кандидата // function InitKandidatUploaders() { angular.forEach($scope.uploaders, function(obj, type) { // var init = clone(uploaderInit); // CL('InitKandidatUploaders: ' + type); uploaderInit.formData = [{kandidat_id: $scope.anketa.id, type: type}]; $scope.uploaders[type] = new FileUploader(uploaderInit); $scope.uploaders[type].onErrorItem = function(item, response, status, headers) { $scope.uploaders[type].errorHappened = true; toastr.error("Ошибка при загрузке файла"); } $scope.uploaders[type].onCompleteAll = function() { if (!$scope.uploaders[type].errorHappened) { toastr.success("Файлы загружены"); } this.clearQueue(); } $scope.uploaders[type].onSuccessItem = function(item, response, status, headers) { if (response.result == 'success') { if (!$scope.anketa.files) $scope.anketa.files = {}; if (!$scope.anketa.files[type]) $scope.anketa.files[type] = []; $scope.anketa.files[type].push(response.created_file); } else $scope.uploaders[type].errorHappened = true; } // $scope.disciplines_uploaders[type][discipline.disc_nrec + discipline.abr].onAfterAddingAll = function(items) // { // // CL('onAfterAddingAll'); // var type = this.formData[0].type; // // CL(type); // $scope.disciplines_uploaders[type][discipline.disc_nrec + discipline.abr].errorHappened = false; // } // if (type == 'fos') // { // $scope.disciplines_uploaders[type][discipline.disc_nrec + discipline.abr].filters.push( // { // name: 'pdf-doc-docx', // fn: function(item) // { // var re = /(?:\.([^.]+))?$/; // if (re.exec(item.name)[1].equalsci('doc') || re.exec(item.name)[1].equalsci('docx')) { // return true; // } else { // toastr.error('Можно загружать только файлы DOC(X)'); // return false; // } // } // }); // } }); } $scope.uploaders = {vo: {}, zvanie: {}, stepen: {}, trudovaya: {}, soglasie: {}, passport: {}, snils: {}, inn: {}, flg: {}, qualification: {}, others: {}, articles: {}}; InitKandidatUploaders(); $scope.DeleteFile = function(file) { // CL($scope.anketa.files); $http({url: 'ajax/post/delete_file.php', method: 'GET', params: {hash: file.file_hash}}) .then(function(response) { if (response.data.result == 'success') { deleteByColumn($scope.anketa.files[file.type], 'id', file.id); toastr.success('Файл удалён'); } else { toastr.error('Ошибка удаления файла'); } }); } $scope.DeleteEducationFile = function(education) { // CL($scope.anketa.files); $http({url: 'ajax/post/delete_file.php', method: 'GET', params: {hash: education.file_hash, type: 'vo'}}) .then(function(response) { if (response.data.result == 'success') { education.file_date = education.file_name = education.file_src_name = education.file_size = education.file_hash = ''; // education.file_date = null; toastr.success('Файл удалён'); } else { toastr.error('Ошибка удаления файла'); } }); } $scope.AddEducation = function() { $http({url: 'ajax/post/add_education.php', method: 'POST', data: {kandidat_id: $scope.anketa.id}}) .then(function(result) { if (result.data.result == 'success') { var education = {id: result.data.id, kandidat_id: $scope.anketa.id}; InitEducationUploader(education, $scope.anketa.educations.length); // id - ключ таблицы kandidat_educations $scope.anketa.educations.push(education); } }); } $scope.DeleteEducation = function(education, index) { ngDialog.openConfirm({ template: 'confirm_delete', className: 'ngdialog-theme-default', disableAnimation: true }).then(function (value) { // да $http({url: 'ajax/post/delete_education.php', method: 'GET', params: {id: education.id}}) .then(function(result) { if (result.data.result == 'success') { $scope.anketa.educations.splice(index, 1); } }); }, function() {} ); } $scope.ShowAddDiscipline = function() { $scope.show_add_discipline = true; } $scope.ShowAddDiscipline(); $scope.onDiscSelect = function(data) { // CL('onDiscSelect'); // CL(data); if (!Array.isArray($scope.anketa.disciplines)) $scope.anketa.disciplines = []; else { if (data && findByColumn($scope.anketa.disciplines, 'title', data.originalObject.title)) { $scope.$broadcast('angucomplete-alt:clearInput', 'add_disc'); return; } } if (data) { // CL(data); data.originalObject.kandidat_id = $scope.anketa.id; $http({url: 'ajax/post/add_discipline.php', method: 'POST', data: data.originalObject}) .then(function(result) { if (result.data.result == 'success') { data.originalObject.id = result.data.id; $scope.anketa.disciplines.push(data.originalObject); $scope.$broadcast('angucomplete-alt:clearInput', 'add_disc'); } }); } // CL($scope.anketa.disciplines); } $scope.onDiscChanged= function(data) { // $scope.add_user.login = $scope.add_user.fio = ''; // CL('onDiscChanged'); } $scope.onDiscFocusOut = function() { CL('focusOutDisc'); // // if (!$scope.add_user.login) // { $scope.$broadcast('angucomplete-alt:clearInput', 'add_disc'); // } } $scope.DeleteDiscipline = function(discipline) { $http({url: 'ajax/post/delete_discipline.php', method: 'GET', params: {id: discipline.id}}) .then(function(response) { if (response.data.result == 'success') { deleteByColumn($scope.anketa.disciplines, 'id', discipline.id); toastr.success('Дисциплина удалена'); } else { toastr.error('Ошибка удаления дисциплины'); } }); } $scope.SaveDiscipline = function(discipline) { $http({url: 'ajax/post/save_discipline.php', method: 'POST', data: discipline}) .then(function(result) { if (result.data.result == 'success') { toastr.success('Дисциплина сохранена') discipline.changed = false; } }); } // IndexCtrl $scope.CanViewKandidatHistory = function() { return true; } // История по Кандидату // IndexCtrl $scope.ShowKandidatHistory = function() { ngDialog.open({ template: "history_kandidat.tpl.html" + "?" + getRandom(10000, 99999), scope: $scope, plain: false, disableAnimation: true, className: 'ngdialog-theme-default history' }); } // $scope.ShowSoglasie = function() // { // $scope.show_pdn_dialog_close_button = true; // ngDialog.open({ // template: "pdn.tpl.html" + "?" + getRandom(10000, 99999), // scope: $scope, // plain: false, // disableAnimation: true, // className: 'ngdialog-theme-default history' // }) // return true; // } $scope.onAddrSelect = function(data) { CL('onAddrSelect'); CL(data); if (data) { CL(data); $scope.anketa.addr_region = data.originalObject.data.region_with_type; $scope.anketa.addr_region_fias = data.originalObject.data.region_fias_id; $scope.anketa.addr_area = data.originalObject.data.area_with_type; $scope.anketa.addr_area_fias = data.originalObject.data.area_fias; $scope.anketa.addr_city = data.originalObject.data.city_with_type; $scope.anketa.addr_city_fias = data.originalObject.data.city_fias_id; $scope.anketa.addr_settlement = data.originalObject.data.settlement_with_type; $scope.anketa.addr_settlement_fias = data.originalObject.data.settlement_fias_id; $scope.anketa.addr_stead = data.originalObject.data.stead ? data.originalObject.data.stead_type_full + ' ' + data.originalObject.data.stead : ''; $scope.anketa.addr_stead_fias = data.originalObject.data.stead_fias_id; $scope.anketa.addr_street = data.originalObject.data.street_with_type; $scope.anketa.addr_street_fias = data.originalObject.data.street_fias_id; $scope.anketa.addr_house = data.originalObject.data.house ? data.originalObject.data.house_type + ' ' + data.originalObject.data.house : ''; $scope.anketa.addr_house_fias = data.originalObject.data.house_fias_id; $scope.anketa.addr_block = data.originalObject.data.block ? data.originalObject.data.block_type + ' ' + data.originalObject.data.block : ''; $scope.anketa.addr_flat = data.originalObject.data.flat ? data.originalObject.data.flat_type + ' ' + data.originalObject.data.flat : ''; $scope.anketa.addr_flat_fias = data.originalObject.data.flat_fias_id; $scope.anketa.addr_postal_code = data.originalObject.data.postal_code; $scope.anketa.passport_address = data.originalObject.unrestricted_value; $scope.anketa.show_dadata = false; } // CL($scope.anketa.disciplines); } $scope.onAddrChanged= function(data) { // $scope.add_user.login = $scope.add_user.fio = ''; } $scope.onAddrFocusOut = function() { CL('onAddrFocusOut'); // // if (!$scope.add_user.login) // { $scope.$broadcast('angucomplete-alt:clearInput', 'addr'); // } } // По Ctrl-S сохраним var isCtrl = false; document.onkeyup=function(e){ if(e.keyCode == 17) isCtrl=false; } document.onkeydown=function(e){ if(e.keyCode == 17) isCtrl=true; if(e.keyCode == 83 && isCtrl == true) { $scope.SaveKandidat(); return false; } } /* $scope.min_date = new Date(CUR_YEAR - 90, 0, 1); $scope.max_date = new Date(CUR_YEAR - 16, 11, 31); // CL($scope.max_date); $scope.pickDateOptions = { monthsFull: MONTHS, monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], weekdaysFull: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'], weekdaysShort: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пн', 'Сб'], showMonthsShort: undefined, showWeekdaysFull: undefined, firstDay: 1, selectYears: 90 - 16, today: 'Сегодня', clear: 'Очистить', close: 'Закрыть', format: 'dd.mm.yyyy', formatSubmit: 'yyyy-mm-dd', editable: true, onSet: function(context) { if (context['select']) { // var selectedDate = new Date(context['select']); // CL(selectedDate); // CheckTermDates(context); } } }; */ // InitTermDates(); }) .controller ('KandidatsCtrl', function($scope, $rootScope, LDialog, params) // , FileUploader, toastr, $http) { CL('KandidatsCtrl'); // CL(params); if (!c_roles) window.location = '/'; if (params) { if (params.status == 'all') { $rootScope.page = 'all'; } // work else if (params.status == 'work') { $rootScope.page = 'work'; } else { // $rootScope.page = 'kandidats'; } } else { $rootScope.page = 'kandidats'; } }) // Интерфейс администратора .controller ('AnketaCtrl', function($scope, $rootScope, LDialog, kandidat, $http, toastr, sprav, ngDialog, kandidat_id) { CL('AnketaCtrl'); // CL(kandidat.data); if (!kandidat.data) window.location = '/#/admin/anketa/' + kandidat_id; $rootScope.page = 'kandidats_'; $scope.anketa = kandidat.data; $scope.c_department_id = c_department_id; $scope.c_roles = c_roles; $scope.c_id = c_id; $scope.sprav_tarif = sprav.data.tarif; $scope.c_access = c_access; $scope.$_sciences = $_sciences; $scope.$_1c_education_levels = $_1c_education_levels; if ($scope.anketa.dekret == '1') { $scope.anketa.dekret = true; } // CL(c_access); // CL($scope.c_access); // CL($scope.c_roles); var dateArr = []; if ($scope.anketa.period_start) dateArr = $scope.anketa.period_start.split('.'); if (dateArr.length) $scope.anketa.period_start_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); dateArr = []; if ($scope.anketa.period_end) dateArr = $scope.anketa.period_end.split('.'); if (dateArr.length) $scope.anketa.period_end_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); $scope.min_date = new Date(CUR_YEAR, 0, 1); $scope.max_date = new Date(CUR_YEAR + 10, 11, 31); var dateArr = []; if ($scope.anketa.birth_date) dateArr = $scope.anketa.birth_date.split('.'); if (dateArr.length) $scope.anketa.birth_date_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); dateArr = []; if ($scope.anketa.passport_kogda) dateArr = $scope.anketa.passport_kogda.split('.'); if (dateArr.length) $scope.anketa.passport_kogda_obj = new Date(dateArr[2], dateArr[1] - 1, dateArr[0]); // AnketaCtrl $scope.SetStatus = function(status) { // CL('SetStatus'); // CL($scope.selected_project_stage.shr_date); // return; // if (status == 'done') // { // $scope.show_progress = true; // } // if ($scope.anketa.type == 'gph' && status == 'soglasovanie_uk1') // { // status = 'soglasovanie_uk2'; // } // по заявке // https://portal.unn.ru/app/requests/view/76122 // Согласование УК1 необходимо только, если кандидат идёт на высшее образование по совместительству (любому) или на высшее образование по конкурсу. Для СПО, СОО, приём по ГПХ - сразу в УК2. // if (!($scope.anketa.education == 'high' && ($scope.anketa.type == 'vnutr' || $scope.anketa.type == 'vnesh' || $scope.anketa.konkurs == '1')) && status == 'soglasovanie_uk1') if (status == 'soglasovanie_uk1' && ($scope.anketa.education == 'spo' || $scope.anketa.education == 'mid' || $scope.anketa.type == 'gph')) { status = 'soglasovanie_uk2'; } var anketa_is_valid; // на всякий случай сохраним анкету предварительно, но не когда берём в работу if (c_roles.department && status != 'work' && status != 'refused') { anketa_is_valid = $scope.SaveKandidatByDepOrUK(); } else if (c_roles.uoup && status == 'accepted_uoup') { $scope.SaveKandidatByUKorUOUPorUFMTS(); // на самом деле ниже будет проверяться анкета на случай, если меняем статус anketa_is_valid = true; } else if (c_roles.ufmts && status == 'accepted') { $scope.SaveKandidatByUKorUOUPorUFMTS(); // на самом деле ниже будет проверяться анкета на случай, если меняем статус anketa_is_valid = true; } else { anketa_is_valid = true; } if (!anketa_is_valid) return; // валидность не анкеты, а данных для смены статуса, т.е. сообщения на доработку $scope.anketa.valid = true; $scope.anketa.push_set_status = true; if (c_roles.department) { // Факультет на доработку if (status == 'filled') { if (!$scope.anketa.new_message || !$scope.anketa.new_message.length) { $scope.anketa.valid = false; toastr.error("Введите сообщение"); } } } if (c_roles.uk1 || c_roles.uk2) { // УК отказ if (status == 'work') { if (!$scope.anketa.new_message || !$scope.anketa.new_message.length) { $scope.anketa.valid = false; toastr.error("Введите сообщение"); } } // УК согласовать else if (status == 'soglasovanie_uoup') { // для ГПХ не нужны поля pkg, pku, konkurs if ($scope.anketa.type != 'gph') { if (!$scope.anketa.pkg || !$scope.anketa.pku) { $scope.anketa.valid = false; toastr.error("Выберите ПКГ, ПКУ"); } } } } if (c_roles.uoup) { // УОУП отказ if (status == 'work') { if (!$scope.anketa.new_message || !$scope.anketa.new_message.length) { $scope.anketa.valid = false; toastr.error("Введите сообщение"); } } // УОУП согласовать else if (status == 'accepted_uoup') { // CL(parseFloat($scope.anketa.hours_total)); if (!$scope.anketa.hours_total || isNaN(parseFloat($scope.anketa.hours_total))) { $scope.anketa.valid = false; toastr.error("Введите Часы всего"); } // CL(parseFloat($scope.anketa.hours_aud)); if (!$scope.anketa.hours_aud || isNaN(parseFloat($scope.anketa.hours_aud))) { $scope.anketa.valid = false; toastr.error("Введите Часы аудиторные"); } } } if ($scope.anketa.valid) $http({url: 'ajax/post/set_status.php', method: 'POST', data: {kandidat_id: $scope.anketa.id, status: status, message: $scope.anketa.new_message}}) .then(function(result) { $scope.show_progress = false; if (result.data.new_status) { $scope.anketa.status = result.data.new_status; $scope.anketa.history = result.data.history; if (c_roles.department) { // Взять в работу if (status == 'work') { $scope.anketa.department_id = c_department_id; toastr.success("Анкета взята в работу"); } // Отправить на согласование else if (status == 'soglasovanie_uk1' || status == 'soglasovanie_uk2') { $scope.anketa.show_soglasovanie_message = false; $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; toastr.success("Отправлено на согласование в УК"); } // Отправить на доработку else if (status == 'filled') { toastr.success("Отправлено на доработку"); $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; $scope.anketa.show_dorabotka_message = false; } // Отказаться от кандидата else if (status == 'refused') { window.location = '/'; } } // УК if (c_roles.uk1 || c_roles.uk2) { // Отказать (с сообщением) if (status == 'work') { toastr.success("Отказ УК"); } else if (status == 'soglasovanie_uk2') { $scope.anketa.show_soglasovanie_message = false; $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; toastr.success("Согласована УК 1"); } else if (status == 'soglasovanie_uoup') { $scope.anketa.show_soglasovanie_message = false; $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; toastr.success("Согласована УК 2"); } setTimeout(function() { window.location = "/"; }, 2000) } // УОУП if (c_roles.uoup) { // Отказать (с сообщением) if (status == 'work') { toastr.success("Отказ УОУП"); $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; $scope.anketa.show_refuse_message = false; } else if (status == 'accepted_uoup') { $scope.anketa.show_soglasovanie_message = false; $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; toastr.success("Согласована УОУП"); } // setTimeout(function() // { // window.location = "/"; // }, 2000) } if (c_roles.ufmts) { // УФМТС проставил смету if (status == 'accepted') { $scope.anketa.show_soglasovanie_message = false; $scope.anketa.message = $scope.anketa.new_message; $scope.anketa.new_message = ''; toastr.success("Анкета согласована"); } } } else { toastr.error("Произошла ошибка при установке статуса"); } $scope.anketa.push_set_status = false; }); } function prepareNumber(val) { // CL('prepareNumber'); return val.replace(/,/g, '.').replace(/[A-Za-zа-яА-Я]/g, ''); } $scope.prepareHoursTotal = function(val) { $scope.anketa.hours_total = prepareNumber(val) } $scope.prepareHoursAud = function(val) { $scope.anketa.hours_aud = prepareNumber(val) } $scope.onDolzhnostSelect = function(data) { // CL('onDiscSelect'); // CL(onDolzhnostSelect); if (data) { // CL(data); $scope.anketa.dolzhnost = data.originalObject.dolzhnost; } // CL($scope.anketa.disciplines); } $scope.onDolzhnostChanged= function(data) { // $scope.add_user.login = $scope.add_user.fio = ''; } $scope.onDolzhnostFocusOut = function() { CL('onDolzhnostFocusOut'); // // if (!$scope.add_user.login) // { $scope.$broadcast('angucomplete-alt:clearInput', 'dolzhnost'); // } } $scope.SaveKandidatByDepOrUK = function() { var valid = true; $scope.anketa.save_pressed = true; if (empty($scope.anketa.dolzhnost)) valid = false; if (empty($scope.anketa.education)) valid = false; if (empty($scope.anketa.chair_id)) valid = false; if (empty($scope.anketa.type)) valid = false; if (!empty($scope.anketa.type) && $scope.anketa.type != 'gph' && empty($scope.anketa.stavka)) valid = false; if ($scope.anketa.type != 'gph' && empty($scope.anketa.konkurs)) valid = false; if (empty($scope.anketa.period_start)) valid = false; if (!$scope.anketa.period_endless && empty($scope.anketa.period_end)) valid = false; var stavka_dot = $scope.anketa.stavka.replace(',', '.'); stavka_dot = parseFloat(stavka_dot); if (stavka_dot == 0 || stavka_dot > 1) { valid = false; $scope.anketa.incorrect_stavka = true; toastr.warning("Ставка должна быть ненулевой и не более 1"); } else { $scope.anketa.incorrect_stavka = false; } if (!valid) { toastr.error("Не все поля заполнены"); } else { $http({url: 'ajax/post/save_kandidat.php', method: 'POST', data: $scope.anketa}) .then(function(result) { if (!$scope.anketa.period_endless && $scope.anketa.period_start_obj > $scope.anketa.period_end_obj) { toastr.error("Некорректный период"); return; } if (result.data.result == 'success') { $scope.anketa.history = result.data.history; toastr.success("Данные сохранены"); // if ($scope.anketa.new_status) // { // $scope.anketa.status = $scope.anketa.new_status; // $scope.anketa.new_status = ''; // } } else { toastr.error("Ошибка сохранения"); } }); } return valid; } // взять и сохранить также название кафедры $scope.onChairSelect = function() { var chair_obj = findByColumn($scope.anketa.chairs, 'id', $scope.anketa.chair_id); $scope.anketa.chair = chair_obj['pname']; } $scope.SaveKandidatByUKorUOUPorUFMTS = function() { if (!$scope.anketa.dekret) { $scope.anketa.dekret_fio = ''; } $http({url: 'ajax/post/save_kandidat.php', method: 'POST', data: $scope.anketa}) .then(function(result) { if (result.data.result == 'success') { $scope.anketa.history = result.data.history; toastr.success("Данные сохранены"); // if ($scope.anketa.new_status) // { // $scope.anketa.status = $scope.anketa.new_status; // $scope.anketa.new_status = ''; // } } else { toastr.error("Ошибка сохранения"); } }); } $scope.CanViewKandidatHistory = function() { // нельзя видеть историю, если человек только Менеджер ОП // if ($scope.$_roles.manager_op && Object.keys($scope.$_roles).length == 1) return false; // else // return !($scope.$_roles.developer_op && Object.keys($scope.$_roles).length == 1); return true; } // История по Кандидату // AnketaCtrl $scope.ShowKandidatHistory = function() { ngDialog.open({ template: "history_kandidat.tpl.html" + "?" + getRandom(10000, 99999), scope: $scope, plain: false, disableAnimation: true, className: 'ngdialog-theme-default history' }); } $scope.GetPKU = function(for_pkg) { // CL('GetPKU'); if (for_pkg) { var pku_return = {}; // CL(for_pkg); angular.forEach($scope.sprav_tarif, function(pku_obj, pkg) { // CL(pkg); if (for_pkg == pkg) { // CL(pkg); // CL(pku_obj); pku_return = pku_obj; } }) // if (pku_return) CL(pku_return); return pku_return; } } $scope.ChangeType = function() { if ($scope.anketa.type == 'gph') { $scope.anketa.dolzhnost = 'Преподаватель'; $scope.anketa.stavka = ''; } } $scope.ChangeEducation = function() { if ($scope.anketa.education == 'spo' || $scope.anketa.education == 'mid') { $scope.anketa.stavka = '1'; } } $scope.PeriodMayBeEndless = function(anketa) { return anketa.konkurs != '1' && anketa.type == 'shtat' && (anketa.education == 'spo' || anketa.education == 'mid'); } }) // end AnketaCtrl .controller ('AcceptedCtrl', function($scope, $rootScope, LDialog, kandidats, $http, toastr) { CL('AcceptedCtrl'); if (!c_roles) window.location = '/'; $rootScope.page = 'predstavlenie'; $scope.kandidats = kandidats.data; $scope.$_education_levels = $_education_levels; // $scope.c_department_id = c_department_id; // $scope.c_roles = c_roles; // $scope.c_id = c_id; $scope.GetAccepted = function() { var accepted_arr = []; angular.forEach($scope.kandidats, function(kandidat) { if (kandidat.status == 'accepted') accepted_arr.push(kandidat); }); return accepted_arr; } $scope.GetForPredstavlenie = function() { var for_predstavlenie_arr = []; angular.forEach($scope.kandidats, function(kandidat) { if (kandidat.for_predstavlenie) for_predstavlenie_arr.push(kandidat); }); return for_predstavlenie_arr; } // AcceptedCtrl $scope.MakePredstavlenie = function() { $scope.progress = true; $http({url: 'ajax/post/make_predstavlenie.php', method: 'POST', data: {kandidats: $scope.kandidats, status: 'predstavlenie'}}) .then(function(result) { if (result.data.result == 'success') { angular.forEach($scope.kandidats, function(kandidat) { // -- TMP comment kandidat.status = 'predstavlenie'; }); toastr.success("Сформировано представление"); } else { toastr.error("Произошла ошибка. Попробуйте через несколько минут."); } $scope.progress = false; }); } // Не дадим выбрать чекбоксы кандидатам разных уровней образования // AcceptedCtrl $scope.ValidateCheckboxes = function(kandidat) { $scope.selected_education = kandidat.education; // CL($scope.selected_education); // return; var kandidats = $scope.GetAccepted(); // если ни одного чекбокса не стоит, нужно очистить selected_education var some_checkbox_true = false; if (kandidats) { angular.forEach(kandidats, function(_kand, key) { if (_kand.for_predstavlenie) some_checkbox_true = true; // if (_kand.education != kandidat.education) // { // } }); } if (!some_checkbox_true) $scope.selected_education = undefined; // CL($scope.selected_education); } }) .controller ('PredstavlenieCtrl', function($scope, $rootScope, LDialog, $http, toastr, spinnerService, system_start_year) { CL('PredstavlenieCtrl'); if (!c_roles) window.location = '/'; $scope.$_education_levels = $_education_levels; $rootScope.page = 'predstavlenie'; $scope.predstavlenia = []; $scope.data = {year_filter: String(CUR_YEAR)}; $scope.years = []; for (var y = system_start_year; y <= CUR_YEAR; y++) $scope.years.push(String(y)); // для избежания кеширования function makeRandForPredstavlenie(predstavlenie) { predstavlenie.rand = getRandom(10000, 99999); } // CL($scope.years); // CL($scope.data); $scope.LoadPredstavlenia = function() { $http({url: 'ajax/get/predstavlenie.php', method: 'GET', params: {year: $scope.data.year_filter}}) .then(function(result) { $scope.predstavlenia = result.data; angular.forEach($scope.predstavlenia, function(predstavlenie) { makeRandForPredstavlenie(predstavlenie); }); }); } $scope.LoadPredstavlenia(); // CL($scope.c_roles); // $scope.c_department_id = c_department_id; // $scope.c_roles = c_roles; // $scope.c_id = c_id; // после того как сняли одну из галочек, обновить представление, без "снятых" людей $scope.UpdatePredstavlenie = function(predstavlenie) { predstavlenie.progress = true; makeRandForPredstavlenie(predstavlenie); var updated_kandidats = []; // всем кандидатам, у которых сняли галочку, установить статус "согласовано" angular.forEach(predstavlenie.kandidats, function(kandidat) { if (!kandidat.for_predstavlenie) { $http({url: 'ajax/post/set_status.php', method: 'POST', data: {kandidat_id: kandidat.id, status: 'accepted', clear_predstavlenie: true}}) .then(function(result) { // if (result.data.new_status) // { // kandidat.status = result.data.new_status; // } }); kandidat.status = 'accepted'; } else { updated_kandidats.push(kandidat); } }); // оставим кандидатов, у которых не снимали галочку predstavlenie.kandidats = updated_kandidats; if (predstavlenie.kandidats.length) { // обновление представления, статус остаётся прежним! $http({url: 'ajax/post/make_predstavlenie.php', method: 'POST', data: {kandidats: predstavlenie.kandidats /*, status: 'predstavlenie' */}}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Сформировано представление"); predstavlenie.predstavlenie_id = result.data.predstavlenie_id; predstavlenie.predstavlenie_year = result.data.predstavlenie_year; } else { toastr.error("Произошла ошибка. Попробуйте через несколько минут."); } predstavlenie.progress = false; }); } else { // TODO удалить представление из таблиц БД $http({url: 'ajax/post/delete_predstavlenie.php', method: 'POST', data: {id: predstavlenie.predstavlenie_id, year: predstavlenie.predstavlenie_year}}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Представление удалено"); predstavlenie.progress = false; } else { toastr.error("Ошибка при удалении представления"); } }); } } // Декан подписывает представление $scope.DeanSignPredstavlenie = function(predstavlenie) { if (predstavlenie.kandidats.length) { predstavlenie.progress = true; // обновление представления, статус predstavlenie $http({url: 'ajax/post/make_predstavlenie.php', method: 'POST', data: {kandidats: predstavlenie.kandidats, status: 'predstavlenie_signed_dean'}}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Представление подписано деканом"); angular.forEach(predstavlenie.kandidats, function(kandidat) { kandidat.status = 'predstavlenie_signed_dean'; kandidat.dean_date = result.data.dean_date; kandidat.dean_fio = result.data.dean_fio; kandidat.dean_dolzhnost = result.data.dean_dolzhnost; }); } else { toastr.error("Произошла ошибка. Попробуйте через несколько минут."); } predstavlenie.progress = false; }); } } $scope.RectorAcceptPredstavlenie = function(predstavlenie) { CL('RectorAcceptPredstavlenie'); if (predstavlenie.kandidats.length) { // predstavlenie.progress = true; angular.forEach(predstavlenie.kandidats, function(kandidat) { $http({url: 'ajax/post/set_status.php', method: 'POST', data: {kandidat_id: kandidat.id, status: 'predstavlenie_signed_rector'}}) .then(function(result) { // if (result.data.new_status) // { // kandidat.status = result.data.new_status; // } kandidat.rector_date = result.data.rector_date; toastr.success("Представление согласовано ректором"); }); kandidat.status = 'predstavlenie_signed_rector'; }); } else { toastr.warning("Нет кандидатов") } } $scope.isEmptyObject = function(obj) { return isEmptyObject(obj) } // Не дадим выбрать чекбоксы кандидатам разных уровней образования // PredstavlenieCtrl $scope.ValidateCheckboxes = function(predstavlenie, kandidat) { predstavlenie.to_update = true; $scope.selected_education = kandidat.education; // CL($scope.selected_education); // return; var kandidats = predstavlenie.kandidats; // $scope.GetAccepted(); // если ни одного чекбокса не стоит, нужно очистить selected_education var some_checkbox_true = false; if (kandidats) { angular.forEach(kandidats, function(_kand, key) { if (_kand.for_predstavlenie) some_checkbox_true = true; }); } if (!some_checkbox_true) $scope.selected_education = undefined; } // Если в представлении есть удалённый человек, то обновлять представление нельзя $scope.MayUpdatePredstavlenie = function(predstavlenie) { var has_deleted_kandidat = false; angular.forEach(predstavlenie.kandidats, function(kandidat) { if (kandidat.deleted == '1') { has_deleted_kandidat = true; } }); return !has_deleted_kandidat; } $scope.GetPredstavleniaStatuses = function() { var uniq_statuses = []; if (!isEmptyObject($scope.predstavlenia)) { angular.forEach($scope.predstavlenia, function(predstavlenie) { if (!uniq_statuses.includes(predstavlenie.status)) { uniq_statuses.push(predstavlenie.status); } }); } return uniq_statuses; } $scope.GetPredstavleniaDepartments = function() { var uniq_departments = []; if (!isEmptyObject($scope.predstavlenia)) { angular.forEach($scope.predstavlenia, function(predstavlenie) { if (!uniq_departments.includes(predstavlenie.department.title)) { uniq_departments.push(predstavlenie.department.title); } }); } return uniq_departments; } // пройтись по всем людям в представлении, собрать все статусы, отсортировать по убыванию по алфавиту, // и взять первый. Эта задумка верна для след. списка статусов: // predstavlenie // predstavlenie_signed_dean // predstavlenie_signed_rector // done $scope.GetPredstavlenieStatus = function(predstavlenie) { var statuses = []; angular.forEach(predstavlenie.kandidats, function(kandidat) { statuses.push(kandidat.status) }); statuses.sort().reverse(); // CL(statuses); // CL(statuses[0]); predstavlenie.status = statuses[0]; return statuses[0]; } }) // END PredstavlenieCtrl .controller ('RegistrationCtrl', function($scope, $rootScope, $interval, toastr, $http, ngDialog, $templateCache, $timeout, spinnerService, LDialog, forgot) { CL('RegistrationCtrl'); $scope.rand = getRandom(10000, 99999); // признак, что забыл пароль, не нужен отказ в случае, если пользователь (телефон) в базе есть $scope.forgot = forgot; if (c_login) window.location = '/'; $scope.roles_titles = roles_titles; // $templateCache.put('confirm_delete', 'Вы уверены, что хотите удалить?
\ // '); $rootScope.page = 'registration'; $scope.c_roles = c_roles; // $scope.phone = ''; $scope.registration = {}; $scope.submode = 'input_phone'; $scope.data = {newpassword1: '', newpassword2: ''}; $scope.ShowPDN = function() { if ($scope.registration.phone.length < 11) { toastr.error("Некорректный ввод телефонного номера"); return; } $scope.submode = 'pdn'; } $scope.CancelPDN = function() { window.location = '/'; } $scope.SendCode = function() { spinnerService.show('spinner'); $http({url: 'ajax/post/send_code.php', method: 'POST', data: $scope.registration}) .then(function(result) { if (result.data.already_registered && !$scope.forgot) { LDialog.error("Вы уже зарегистрированы. Войдите в систему.", {'size': 'sm'}); } else if (result.data.result == 'success') { $scope.submode = 'input_code'; // TMP // $scope.code = result.data.code; $scope.start_timer(); } // else spinnerService.hide('spinner'); }); } $scope.code_time = 0; var timer; $scope.start_timer = function() { $scope.code_time = 30; timer = $interval(function() { $scope.code_time--; if ($scope.code_time == 0) // таймер окончен { $scope.stop_timer(); } }, 1000); }; $scope.stop_timer = function() { //$scope.where_sent_code.mobile = undefined; if (angular.isDefined(timer)) { $interval.cancel(timer); timer = undefined; } }; $scope.CheckCode = function() { $http({url: 'ajax/post/check_code.php', method: 'POST', data: {code: $scope.data.code}}) .then(function(result) { // после ||: так работает check_code.php, snils_exists возвращает, если код верен. это для смены забытого пароля, // когда снилс смотреть не надо if (result.data.result == 'success' || result.data.result == 'snils_exists' && $scope.forgot) { $scope.submode = 'input_password'; $scope.data.person = result.data.person; } else if (result.data.result == 'snils_exists' && !$scope.forgot) { toastr.error("Пользователь с данным СНИЛС уже существует. Запрещено создавать двойные учетные записи."); } else { toastr.error("Неверный код"); } }); } $scope.CheckPasswordRussian = function() { // есть русские буквы var russian_letters = $scope.data.newpassword1.match(/[а-яА-Я]/) != null; if (russian_letters) { $scope.russian_letters = true; } else { $scope.russian_letters = false; } } $scope.SetPassword = function(confirm_fio) { $scope.data.confirm_fio = confirm_fio; spinnerService.show('spinner'); $http({url: 'ajax/post/set_password.php', method: 'POST', data: $scope.data}) .then( function (data) { if (data.data.result != 'fail') { // TMP comment $scope.show_success_message = true; // TODO REMAKE // setTimeout(function() {window.location = '/'}, 3000); } else { LDialog.error("Ошибка сервера", {'size': 'sm'}); } spinnerService.hide('spinner'); }) ; } $scope.CheckPasswordAndFIO = function() { // CL($scope.data.newpassword1); if ($scope.data.newpassword1.length < 6 || $scope.data.newpassword2.length < 6) $scope.show_short_message = true; else $scope.show_short_message = false; if ($scope.data.newpassword1 != $scope.data.newpassword2) $scope.show_repeat_message = true; else $scope.show_repeat_message = false; // есть латинские буквы или цифры или спецсимволы (хотя бы из двух групп) var complexity = 0; if ($scope.data.newpassword1.match(/\d/) != null) complexity++; if ($scope.data.newpassword1.match(/[a-zA-Z]/) != null) complexity++; if ($scope.data.newpassword1.match(/[\'\{\}\[\]~`!@#\$%\^&\*\(\)_\+=:;\|\\/\?\.,-]/) != null) complexity++; // знак - д.б. последним if (complexity <= 1) $scope.simple = true; else $scope.simple = false; // задаём пароль if (!$scope.show_repeat_message && !$scope.show_short_message && !$scope.simple) { /*code: $scope.code,*/ // var data = {password: $scope.data.newpassword1 }; // code м.б. не нужен //if ($scope.person != undefined) data.login = $scope.person.cn; // м.б. не нужен // if ($scope.person.unnmobile) data.mobile = $scope.person.unnmobile; // if ($scope.person.unnmail) data.mail = $scope.person.unnmail; // по телефону был найден сотрудник, спросим, его ли ФИО if ($scope.data.person && !$scope.forgot) { $scope.submode = 'confirm_fio'; } else { $scope.SetPassword(); } } }; $scope.registrationRedirectRoot = function() { window.location = '/' } }) // END RegistrationCtrl .controller ('DocumentsCtrl', function($scope, $rootScope, $interval, toastr, $http, ngDialog, $templateCache, $timeout, spinnerService, LDialog) { CL('DocumentsCtrl'); $scope.rand = getRandom(10000, 99999); // признак, что забыл пароль, не нужен отказ в случае, если пользователь (телефон) в базе есть // $scope.forgot = forgot; // if (c_login) window.location = '/'; $scope.roles_titles = roles_titles; $scope.c_roles = c_roles; $rootScope.page = 'documents'; }) .controller ('UsersCtrl', function($scope, $rootScope, toastr, $http, Users, Departments, ngDialog, $templateCache, $timeout) { CL('UsersCtrl'); if (!c_roles) window.location = '/'; // CL($_roles); $scope.roles_titles = roles_titles; $templateCache.put('confirm_delete', 'Вы уверены, что хотите удалить?
\ '); $rootScope.page = 'users'; $scope.c_roles = c_roles; $scope.members_types = members_types; $scope.Users = Users.data; $scope.Departments = Departments.data; $scope.add_user = {roles: []}; $scope.params = {}; // $scope.AddUser = function() // { // if (!$scope.Users) // { // $scope.Users = []; // } // if (!findByColumn($scope.Users, 'login', $scope.add_user.login)) // { // $scope.Users.push($scope.add_user); // } // // $scope.onControllerChanged(); // $scope.$broadcast('angucomplete-alt:clearInput', 'add_user'); // SaveUsers(); // } // CL($_roles); // CL(Departments); $scope.CanEdit = function() { return c_roles.administrator; } $scope.SaveUser = function(user) { // CL($scope.add_user); // CL(user); if (!user.roles) user.roles = []; // CL(user); // признак нового пользователя if (!user.roles.length) { // CL(findByColumn($scope.Users, 'login', user.login)); if (findByColumn($scope.Users, 'login', user.login)) { toastr.warning("Такой администратор уже есть"); return; } if (user.role) { user.roles = [user.role]; } } $http({url: 'ajax/post/save_user.php', method: 'POST', data: user}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Пользователь сохранен"); if (!findByColumn($scope.Users, 'login', user.login)) { $scope.Users.push($scope.add_user); } // $scope.onControllerChanged(); $scope.$broadcast('angucomplete-alt:clearInput', 'fio'); $scope.add_user = {role: undefined}; $scope.params.show_add_user = false; } else { toastr.error("Ошибка добавления"); } }); } $scope.DeleteUser = function(user) { ngDialog.openConfirm({ template: 'confirm_delete', className: 'ngdialog-theme-default', disableAnimation: true }).then(function (value) { // да $http({url: 'ajax/get/delete_user.php', method: 'GET', params: {login: user.login, role: 'department'}}) .then(function(result) { if (result.data.result == 'success') { toastr.success("Пользователь удалён"); deleteByColumn($scope.Users, 'login', user.login); } }); }, function() {} ); } $scope.onSotrudnikSelect = function(data) { CL('onSotrudnikSelect'); // CL(data); if (data) { // CL(data); $scope.add_user.login = data.originalObject.login; $scope.add_user.person_id = data.originalObject.person_id; $scope.add_user.fio = data.originalObject.fio; } // CL($scope.add_user); } $scope.onSotrudnikChanged= function(data) { // $scope.add_user.login = $scope.add_user.fio = ''; CL('onSotrudnikChanged'); } $scope.focusOutSotrudnik = function() { CL('focusOutSotrudnik'); if (!$scope.add_user.login) { $scope.$broadcast('angucomplete-alt:clearInput', 'add_user'); } } $scope.ShowUserRoles = function(user) { var roles_titles_arr = []; angular.forEach(user.roles, function(role) { roles_titles_arr.push(roles_titles[role]); }) return roles_titles_arr.join(', '); } $scope.UserAddRole = function(user) { // CL(user.add_role); if (!user.roles.includes(user.add_role)) user.roles.push(user.add_role); user.add_role = undefined; user.show_add_role = false; $scope.SaveUser(user); } $scope.DeleteRole = function(user, role) { var key = findKeyByValue(user.roles, role); // CL(key); user.roles.splice(key, 1); // CL(user); $scope.SaveUser(user); } $scope.SetRoleFilter = function(role) { $scope.params.role_filter = role; } $scope.UserHasRole = function(user, role) { return user.roles.includes(role); } }) .factory('LDialog', function(ngDialog) { return { success: function(message) { ngDialog.open({ template: "" + message + "
", plain: true, // disableAnimation: true, className: 'ngdialog-theme-success' }); }, error: function(message) { ngDialog.open({ template: "" + message + "
", plain: true, // disableAnimation: true, className: 'ngdialog-theme-error' }); } }; }) .factory('dbNIR', function($http) { return { get: function(id) { return $http({url: 'ajax/get/get_project.php', method: 'GET', params: {id: id}}); } } }) .filter("nl2br", function($filter) { return function(data) { // CL(data.replace(/\\n/g, '" + message + "
", plain: true, disableAnimation: true, className: 'ngdialog-theme-success' }); }, error: function(message) { ngDialog.open({ template: "" + message + "
", plain: true, disableAnimation: true, className: 'ngdialog-theme-error' }); }, confirm_contact_approve: function(message, agree_confirm_contact_approve_fn) { $templateCache.put('confirm_contact_approve', '' + message + '
\ '); ngDialog.openConfirm({ template: 'confirm_contact_approve', className: 'ngdialog-theme-plain' }).then( agree_confirm_contact_approve_fn, //function (value) { // да // $http({url: 'ajax/delete_file.php', method: 'GET', params: {id:file_id}}) // .success( function (data) // { // if (data.result == 'success') // { // //window.location = '/?index'; // //toastr.success('ok'); // toastr.success('Файл удалён'); // $scope.anketa.files.splice(index, 1); // $scope.SaveRID(); // для сохранения валидности в БД // } // else if (data.result == 'fail') // { // toastr.error('Ошибка удаления файла'); // } // }) // .error( function(response) // { // toastr.error("Ошибка сети"); // }) // ; //}, // нет function(reason) { } ); } }; }) ;