From e16f276b084b4a33c372b55a460bb935ca5b63f5 Mon Sep 17 00:00:00 2001 From: fomichev Date: Thu, 24 Oct 2024 18:04:41 +0300 Subject: [PATCH] =?utf8?q?=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80=20=D0=BF?= =?utf8?q?=D0=BE=20=D0=BA=D1=83=D1=81=D1=82=D0=BE=D0=B2=D1=8B=D0=BC=20?= =?utf8?q?=D0=BF=D1=80=D0=B8=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?utf8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../crud/ClusterAdminController.php | 84 +++++++++++++++++-- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/erp24/controllers/crud/ClusterAdminController.php b/erp24/controllers/crud/ClusterAdminController.php index 41d0b553..fbe70593 100644 --- a/erp24/controllers/crud/ClusterAdminController.php +++ b/erp24/controllers/crud/ClusterAdminController.php @@ -127,6 +127,19 @@ class ClusterAdminController extends Controller $model = new ClusterAdmin(); + $activeAdminIds = ClusterAdmin::find() + ->select('admin_id') + ->where(['active' => 1]) + ->column(); + + + $admins = ArrayHelper::map(Admin::find() + ->select(['id', 'name']) + ->where(['NOT IN', 'id', $activeAdminIds]) + ->andWhere(['IN', 'group_id', [7]]) + ->all(), 'id', 'name'); + + $cluster = Cluster::findOne($cluster_id); if (!$cluster) { throw new NotFoundHttpException('Кластер не найден.'); @@ -135,6 +148,64 @@ class ClusterAdminController extends Controller if ($this->request->isPost && $model->load($this->request->post())) { $model->cluster_id = $cluster_id; + // Проверка на активные записи для данного admin_id + if ($model->admin_id) { + // Если активность = 1 + if ($model->active == 1) { + $existingActiveRecords = ClusterAdmin::find() + ->where(['admin_id' => $model->admin_id, 'active' => 1]) + ->andWhere(['!=', 'cluster_id', $model->cluster_id]) + ->all(); + + if (!empty($existingActiveRecords)) { + $conflictCluster = $existingActiveRecords[0]; // Берем первую конфликтующую запись + Yii::$app->session->setFlash('error', 'Этот пользователь ' . $admins[$model->admin_id] . ' уже привязан к кластеру ' . $conflictCluster->cluster_id . ' с активным статусом.'); + return $this->redirect(['create', 'cluster_id' => $cluster_id]); + } + + // Проверка на конфликт с неактивными записями + $existingInactiveRecords = ClusterAdmin::find() + ->where(['admin_id' => $model->admin_id, 'active' => 0]) + ->andWhere(['!=', 'cluster_id', $model->cluster_id]) + ->all(); + + foreach ($existingInactiveRecords as $record) { + $modelStart = strtotime($model->date_start); + $recordStart = strtotime($record->date_start); + $recordEnd = strtotime($record->date_end); + + if ($modelStart < $recordStart && $modelStart < $recordEnd) { + Yii::$app->session->setFlash('error', 'Ошибка: активная запись для ' . $admins[$model->admin_id] . ' не может начинаться раньше, чем неактивная запись (' . $record->date_start . ' - ' . $record->date_end . ') для другого кластера.'); + return $this->redirect(['create', 'cluster_id' => $cluster_id]); + } + } + } + + // Если активность = 0 + if ($model->active == 0) { + $existingInactiveRecords = ClusterAdmin::find() + ->where(['admin_id' => $model->admin_id, 'active' => 0]) + ->andWhere(['!=', 'cluster_id', $model->cluster_id]) + ->all(); + + foreach ($existingInactiveRecords as $record) { + $modelStart = strtotime($model->date_start); + $modelEnd = strtotime($model->date_end); + $recordStart = strtotime($record->date_start); + $recordEnd = strtotime($record->date_end); + + if ( + ($modelStart > $recordStart && $modelStart < $recordEnd) || // Начало новой записи внутри существующей + ($modelEnd > $recordStart && $modelEnd < $recordEnd) || // Конец новой записи внутри существующей + ($modelStart <= $recordStart && $modelEnd >= $recordEnd) // Новая запись полностью охватывает существующую + ) { + Yii::$app->session->setFlash('error', 'Пересечение дат с записью от ' . $record->date_start . ' до ' . $record->date_end . ' для другого кластера.'); + return $this->redirect(['create', 'cluster_id' => $cluster_id]); + } + } + } + } + // Ищем активную запись для данного кластера $existingRecord = ClusterAdmin::find() ->where(['cluster_id' => $model->cluster_id, 'active' => 1]) @@ -152,9 +223,7 @@ class ClusterAdminController extends Controller } } - - - + // Сохраняем новую запись if ($model->save()) { ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.'); @@ -164,13 +233,10 @@ class ClusterAdminController extends Controller } } - $admins = ArrayHelper::map(Admin::find() - ->select(['id', 'name']) - ->where(['IN', 'group_id', [7]]) - ->all(), 'id', 'name'); - $user = Yii::$app->user->identity; + $user = Yii::$app->user->identity; + $model->active = 1; return $this->render('create', [ 'model' => $model, 'cluster' => $cluster, @@ -236,7 +302,7 @@ class ClusterAdminController extends Controller } - // Если активность = 0 + if ($model->active == 0) { $existingInactiveRecords = ClusterAdmin::find() ->where(['admin_id' => $model->admin_id,]) -- 2.39.5