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;
     }
 }