public function actionChangestatus() { if (Yii::$app->request->isAjax) { $status_id = $_POST['status']; $selected_issues = $_POST['selected_issues']; $user_cant_permissions_on = []; $user_have_permission_and_status_changed_on = []; foreach (json_decode($selected_issues) as $issue) { $pers_tasks_this = \app\models\PersTasks::find()->where(['TASK_ID' => $issue, 'TN' => \Yii::$app->user->id, 'DEL_TRACT_ID' => 0])->one(); //проверяем имеет ли доступ пользователь к заданию и входит ли вообще в него if ($pers_tasks_this) { $task_state = \app\models\TaskStates::find()->where(['PERS_TASKS_ID' => $pers_tasks_this->ID, 'IS_CURRENT' => 1])->one(); if ($task_state) { // проверяем есть ли статус $last_state = $task_state->STATE_ID; } else { // иначе устанавливаем значние даты null $last_state = null; } if ($last_state != $status_id) { $transactions = \app\models\Transactions::find()->where(['TN' => \Yii::$app->user->id])->orderBy('ID DESC')->one(); $new_state = new \app\models\TaskStates(); $new_state->TASK_ID = $issue; $new_state->STATE_ID = $status_id; $new_state->TRACT_ID = $transactions->ID; $new_state->IS_CURRENT = 1; $pers_tasks_this = \app\models\PersTasks::find()->where(['TASK_ID' => $issue, 'TN' => \Yii::$app->user->id, 'DEL_TRACT_ID' => 0])->one(); $new_state->PERS_TASKS_ID = $pers_tasks_this->ID; $new_state->save(); $user_have_permission_and_status_changed_on[] = $issue; //обновление поля IS_CURRENT для предыдущего состояния if ($last_state != null) { $task_state->IS_CURRENT = 0; $task_state->save(); } } } else { $user_cant_permissions_on[] = $issue; } } $string_status_changed = ''; if (!empty($user_have_permission_and_status_changed_on)) { foreach ($user_have_permission_and_status_changed_on as $issue) { $task = \app\models\Tasks::findOne($issue); $string_status_changed .= 'Задание №' . $task->TASK_NUMBER . ','; } } $string_status_not_changed = ''; if (!empty($user_cant_permissions_on)) { foreach ($user_cant_permissions_on as $issue) { $task = \app\models\Tasks::findOne($issue); $string_status_not_changed .= 'Задание №' . $task->TASK_NUMBER . ','; } } Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; return ['string_status_changed' => $string_status_changed, 'string_status_not_changed' => $string_status_not_changed]; } }
public function _checkPermissions($action, $task_id) { switch ($action) { case 'open_issue_modal': //проверка прав на просмотр задания (в модальном окне) $permissions_for_open_issue_modal = \app\models\Permissions::find()->where('(SUBJECT_TYPE = :subject_type and SUBJECT_ID = :user_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and PERM_TYPE = :perm_type) or (SUBJECT_TYPE = :subject_type_dolg and SUBJECT_ID = :dolg_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and PERM_TYPE = :perm_type)', ['subject_type_dolg' => 1, 'dolg_id' => \Yii::$app->session->get('user.user_iddolg'), 'perm_type' => 1, 'subject_type' => 2, 'user_id' => \Yii::$app->user->id, 'del_tract' => 0, 'perm_level' => 0, 'action' => 3])->one(); if ($permissions_for_open_issue_modal) { //в случае если есть доступ на просмотр данных о задании $user_in_persons_or_podr_list = false; //получаем массив подразделений задания $podr_tasks = \app\models\PodrTasks::find()->where(['TASK_ID' => $task_id, 'DEL_TRACT_ID' => 0])->all(); if ($podr_tasks) { // если существуют подразделения, то формируем их список $podr_list_kodzifr_array = []; foreach ($podr_tasks as $task) { //обходим список подразделений $query = new \yii\db\Query(); $query->select('*')->from('STIGIT.V_F_PODR')->where('KODZIFR = \'' . trim($task->KODZIFR) . '\''); $command = $query->createCommand(); $data = $command->queryOne(); if (isset($data['KODZIFR'])) { // проверяем на существование названия подразделения (на момент разработки не для всех были названия) $podr_list_kodzifr_array[] = $data['KODZIFR']; } } } //проверяем входит ли данный пользователь в список исполнителей задания //получаем список пользователей, кому назначено задание $pers_tasks = \app\models\PersTasks::find()->where(['TASK_ID' => $task_id, 'DEL_TRACT_ID' => 0])->all(); if ($pers_tasks) { // если существуют исполнители, то формируем их список $persons_array = []; foreach ($pers_tasks as $task) { $query = new \yii\db\Query(); $query->select('*')->from('STIGIT.V_F_PERS')->where('TN = \'' . $task->TN . '\''); $command = $query->createCommand(); $data = $command->queryOne(); $persons_array[] = $data['TN']; } //проверяем, входит ли пользователь в этот список if (in_array(\Yii::$app->user->id, $persons_array)) { //пользователь входит в список исполнителей $user_in_persons_or_podr_list = true; } } else { //в этом случае, задания назначено всем исполнителям из списка подразделений задания $persons_array = []; //обходим массив подразделений для проверки, входит ли в него текущий пользователь $ids = join(',', $podr_list_kodzifr_array); $query = new \yii\db\Query(); $query->select('*')->from('STIGIT.V_F_PERS')->where('TN = \'' . \Yii::$app->user->id . '\' and KODZIFR in (' . $ids . ')'); $command = $query->createCommand(); $data = $command->queryAll(); if (!empty($data)) { // проверяем вхождение пользователя в список исполнителей подразделений задания $user_in_persons_or_podr_list = true; // текущий пользователь входит в подразделения, указанные в задании } } //проверяем, является ли пользователь начальником подразделений, указанных в задании //получаем список подчиненных подразделений $user_boss_of = \Yii::$app->session->get('user.user_boss_of'); if (!empty($user_boss_of) && !$user_in_persons_or_podr_list) { //проверяем, является ли пользователь начальником подразделений, указанных в задании if (in_array($user_boss_of, $podr_list_kodzifr_array)) { //пользователь является руководителем, но не входит в спиок исполнителей или указанных подразделений //осуществляем проверку прав на 'podr_tasks_my_edit' $permissions_for_open_issue_modal_for_boss = \app\models\Permissions::find()->where('(SUBJECT_TYPE = :subject_type and SUBJECT_ID = :user_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and PERM_TYPE = :perm_type) or (SUBJECT_TYPE = :subject_type_dolg and SUBJECT_ID = :dolg_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and PERM_TYPE = :perm_type)', ['subject_type_dolg' => 1, 'dolg_id' => \Yii::$app->session->get('user.user_iddolg'), 'perm_type' => 1, 'subject_type' => 2, 'user_id' => \Yii::$app->user->id, 'del_tract' => 0, 'perm_level' => 0, 'action' => 101])->one(); if ($permissions_for_open_issue_modal_for_boss) { //пользователю разрешен просмотр и редактирование заданий своего подразделения $user_in_persons_or_podr_list = true; } } } if ($user_in_persons_or_podr_list) { //пользователь имеет доступ к заданию, так как входит в список исполнителей выбранного задания, либо находится в составе подразделей задания, //либо является руководителем подразделений, указанных в задании return true; } } else { return false; } break; case 'open_issue_modal_in_current_status': //проверка прав на просмотр задания (в модальном окне) в текущем статусе задания //получаем текущий статус задания для данного пользователя $current_status = self::_getCurrentTaskStatusForCurrentUser($task_id); if ($current_status != 'empty_status' && $current_status != 'user_not_in_persons_list') { //проверяем есть ли доступ у пользователя к заданию в текущем статусе $permissions_for_open_issue_modal_in_current_status = \app\models\Permissions::find()->where('(SUBJECT_TYPE = :subject_type and SUBJECT_ID = :user_id and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and ACTION_ID = :action and PERM_TYPE = :perm_type) or (SUBJECT_TYPE = :subject_type_dolg and SUBJECT_ID = :id_dolg and DEL_TRACT_ID = :del_tract and PERM_LEVEL != :perm_level and ACTION_ID = :action and PERM_TYPE = :perm_type)', ['subject_type_dolg' => 1, 'id_dolg' => \Yii::$app->session->get('user.user_iddolg'), 'perm_type' => 2, 'subject_type' => 2, 'user_id' => \Yii::$app->user->id, 'del_tract' => 0, 'perm_level' => 0, 'action' => $current_status])->one(); if ($permissions_for_open_issue_modal_in_current_status) { //досутп на просмотр в текущем статусе разрешен return 'true'; } else { $state = \app\models\States::findOne($current_status); return 'У Вас нет прав на "Форма свойств задания" в статусе "' . $state->STATE_NAME . '"'; } } elseif ($current_status == 'empty_status') { //устанавливаем статус "Принято при первом открытии задания" $pers_tasks = \app\models\PersTasks::find()->where(['TASK_ID' => $task_id, 'TN' => \Yii::$app->user->id, 'DEL_TRACT_ID' => 0])->one(); $transactions = \app\models\Transactions::find()->where(['TN' => \Yii::$app->user->id])->orderBy('ID DESC')->one(); //пишем первый статус в БД $task_states = new \app\models\TaskStates(); $task_states->TASK_ID = $task_id; $task_states->STATE_ID = 1; $task_states->TRACT_ID = $transactions->ID; $task_states->IS_CURRENT = 1; if ($pers_tasks->ID) { // устанавливаем pers_tasks id $task_states->PERS_TASKS_ID = $pers_tasks->ID; } $task_states->save(); //разрешаем пользователю смотреть информацию по заданию return 'true'; } elseif ($current_status == 'user_not_in_persons_list') { //пользователь не стоит в списке исполнителей задания //проверяем, если он руководитель показываем информацию по заданию (остальные пользователи сбда не попадут из-за проверки выше) return 'true_for_boss'; } break; case 'update_issue': //проверяем, есть ли доступ на редактирование задания для исполнителей $permissions_for_update_issue = \app\models\Permissions::find()->where('(SUBJECT_TYPE = :subject_type and SUBJECT_ID = :user_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL = :perm_level and PERM_TYPE = :perm_type) or (SUBJECT_TYPE = :subject_type_dolg and SUBJECT_ID = :dolg_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL = :perm_level and PERM_TYPE = :perm_type)', ['subject_type_dolg' => 1, 'dolg_id' => \Yii::$app->session->get('user.user_iddolg'), 'perm_type' => 1, 'subject_type' => 2, 'user_id' => \Yii::$app->user->id, 'del_tract' => 0, 'perm_level' => 2, 'action' => 3])->one(); //проверка доступа на редактирование для руководителей $permissions_for_update_issue_boss = \app\models\Permissions::find()->where('(SUBJECT_TYPE = :subject_type and SUBJECT_ID = :user_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL = :perm_level and PERM_TYPE = :perm_type) or (SUBJECT_TYPE = :subject_type_dolg and SUBJECT_ID = :dolg_id and ACTION_ID = :action and DEL_TRACT_ID = :del_tract and PERM_LEVEL = :perm_level and PERM_TYPE = :perm_type)', ['subject_type_dolg' => 1, 'dolg_id' => \Yii::$app->session->get('user.user_iddolg'), 'perm_type' => 1, 'subject_type' => 2, 'user_id' => \Yii::$app->user->id, 'del_tract' => 0, 'perm_level' => 2, 'action' => 101])->one(); //проверяем кто редактирует задание $pers_tasks = \app\models\PersTasks::find()->where(['TASK_ID' => $task_id, 'DEL_TRACT_ID' => 0])->all(); if ($pers_tasks) { // если существуют исполнители, то формируем их список $persons_array = []; foreach ($pers_tasks as $task) { $query = new \yii\db\Query(); $query->select('*')->from('STIGIT.V_F_PERS')->where('TN = \'' . $task->TN . '\''); $command = $query->createCommand(); $data = $command->queryOne(); $persons_array[] = $data['TN']; } //проверяем, входит ли пользователь в этот список if (in_array(\Yii::$app->user->id, $persons_array)) { //пользователь входит в список исполнителей $user_is_person = 1; } else { $user_is_person = 0; } } if ($permissions_for_update_issue && $user_is_person == 1) { return 'update_issue_for_person'; } elseif ($permissions_for_update_issue_boss && $user_is_person == 0) { return 'update_issue_for_boss'; } else { return false; } break; } }