$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('Кластер не найден.');
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])
}
}
-
-
-
+ // Сохраняем новую запись
if ($model->save()) {
ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id);
Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.');
}
}
- $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,
}
- // Если активность = 0
+
if ($model->active == 0) {
$existingInactiveRecords = ClusterAdmin::find()
->where(['admin_id' => $model->admin_id,])