From acb106249eb0f3888ef07f10e29c656170f884bf Mon Sep 17 00:00:00 2001 From: fomichev Date: Wed, 6 Nov 2024 18:18:12 +0300 Subject: [PATCH] =?utf8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BF?= =?utf8?q?=D0=BE=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8E=20?= =?utf8?q?=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D0=BD=D0=B5=D0=B0=D0=BA=D1=82?= =?utf8?q?=D0=B8=D0=B2=D0=BD=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81?= =?utf8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../crud/ClusterAdminController.php | 116 ++++++------------ erp24/views/crud/cluster-admin/_form.php | 99 +++++++++------ erp24/views/crud/cluster-admin/create.php | 2 +- erp24/views/crud/cluster-admin/update.php | 2 +- 4 files changed, 105 insertions(+), 114 deletions(-) diff --git a/erp24/controllers/crud/ClusterAdminController.php b/erp24/controllers/crud/ClusterAdminController.php index bf5f479b..eef87630 100644 --- a/erp24/controllers/crud/ClusterAdminController.php +++ b/erp24/controllers/crud/ClusterAdminController.php @@ -187,27 +187,22 @@ class ClusterAdminController extends Controller { $model = new ClusterAdmin(); - - $allAdmins = Admin::find() ->select(['id', 'name']) ->where(['IN', 'group_id', [7]]) + ->indexBy('id') ->asArray() ->all(); - $activeAdminIds = ClusterAdmin::find() ->select('admin_id') ->where(['active' => 1]) ->column(); - - $inactiveAdmins = array_filter($allAdmins, function($admin) use ($activeAdminIds) { return !in_array($admin['id'], $activeAdminIds); }); - $cluster = Cluster::findOne($cluster_id); if (!$cluster) { throw new NotFoundHttpException('Кластер не найден.'); @@ -216,93 +211,60 @@ 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', 'Этот пользователь ' . $allAdmins[$model->admin_id] . ' уже привязан к кластеру ' . $conflictCluster->cluster_id . ' с активным статусом.'); - return $this->redirect(['create', 'cluster_id' => $cluster_id]); - } + if ($model->admin_id) { + if ($model->active == 0) { - // Проверка на конфликт с неактивными записями - $existingInactiveRecords = ClusterAdmin::find() - ->where(['admin_id' => $model->admin_id, 'active' => 0]) - ->andWhere(['!=', 'cluster_id', $model->cluster_id]) - ->all(); + $activeRecord = ClusterAdmin::find() + ->where(['cluster_id' => $model->cluster_id, 'active' => 1]) + ->one(); - foreach ($existingInactiveRecords as $record) { + if ($activeRecord) { + $activeRecordStart = strtotime($activeRecord->date_start); $modelStart = strtotime($model->date_start); - $recordStart = strtotime($record->date_start); - $recordEnd = strtotime($record->date_end); + $modelEnd = strtotime($model->date_end); - if ($modelStart < $recordStart && $modelStart < $recordEnd) { - Yii::$app->session->setFlash('error', 'Ошибка: активная запись для ' . $allAdmins[$model->admin_id] . ' не может начинаться раньше, чем неактивная запись (' . $record->date_start . ' - ' . $record->date_end . ') для другого кластера.'); - return $this->redirect(['create', 'cluster_id' => $cluster_id]); + + if ($modelStart >= $activeRecordStart || $modelEnd >= $activeRecordStart) { + Yii::$app->session->setFlash('error', 'Ошибка: даты начала или окончания новой записи не могут быть позже даты начала существующей активной записи (' . $activeRecord->date_start . ').'); + + return $this->render('create', [ + 'model' => $model, + 'cluster' => $cluster, + 'inactiveAdmins' => $inactiveAdmins, + 'allAdmins' => $allAdmins, + 'user' => Yii::$app->user->identity, + ]); } } } - // Если активность = 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 ($model->active == 1) { + $existingRecord = ClusterAdmin::find() + ->where(['cluster_id' => $model->cluster_id, 'active' => 1]) + ->one(); - if ( - ($modelStart > $recordStart && $modelStart < $recordEnd) || // Начало новой записи внутри существующей - ($modelEnd > $recordStart && $modelEnd < $recordEnd) || // Конец новой записи внутри существующей - ($modelStart <= $recordStart && $modelEnd >= $recordEnd) // Новая запись полностью охватывает существующую - ) { - Yii::$app->session->setFlash('error', 'Пересечение дат с записью от ' . $record->date_start . ' до ' . $record->date_end . ' для другого кластера.'); + if ($existingRecord) { + $existingRecord->active = 0; + $existingRecord->date_end = date('Y-m-d'); + + if (!$existingRecord->save()) { + Yii::$app->session->setFlash('error', 'Ошибка при обновлении существующей записи.'); return $this->redirect(['create', 'cluster_id' => $cluster_id]); } } } - } - - // Ищем активную запись для данного кластера - $existingRecord = ClusterAdmin::find() - ->where(['cluster_id' => $model->cluster_id, 'active' => 1]) - ->one(); - - if ($existingRecord) { - // Отключаем активность у старой записи - $existingRecord->active = 0; - $existingRecord->date_end = date('Y-m-d'); - // ClusterManagerService::clearClusterManagerStores($existingRecord->cluster_id, $existingRecord->admin_id); - if (!$existingRecord->save()) { - Yii::$app->session->setFlash('error', 'Ошибка при обновлении существующей записи.'); - return $this->redirect(['create', 'cluster_id' => $cluster_id]); + if ($model->save()) { + Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.'); + return $this->redirect(['view', 'id' => $cluster_id]); + } else { + Yii::$app->session->setFlash('error', 'Ошибка при создании новой записи.'); } } - - // Сохраняем новую запись - if ($model->save()) { - // ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); - Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.'); - return $this->redirect(['view', 'id' => $cluster_id]); - } else { - Yii::$app->session->setFlash('error', 'Ошибка при создании новой записи.'); - } } - - $user = Yii::$app->user->identity; $model->active = 1; return $this->render('create', [ @@ -328,6 +290,7 @@ class ClusterAdminController extends Controller $allAdmins = Admin::find() ->select(['id', 'name']) ->where(['IN', 'group_id', [7]]) + ->indexBy('id') ->asArray() ->all(); @@ -360,7 +323,7 @@ class ClusterAdminController extends Controller if (!empty($existingActiveRecords)) { $conflictCluster = $existingActiveRecords[0]; - Yii::$app->session->setFlash('error', 'Этот пользователь ' . $allAdmins[$model->admin_id] . ' уже привязан к кластеру ' . $conflictCluster->cluster_id . ' с активным статусом.'); + Yii::$app->session->setFlash('error', 'Этот пользователь ' . $allAdmins[$model->admin_id]['name'] . ' уже привязан к кластеру ' . $conflictCluster->cluster_id . ' с активным статусом.'); return $this->redirect(['update', 'id' => $model->id]); } @@ -376,7 +339,7 @@ class ClusterAdminController extends Controller $recordEnd = strtotime($record->date_end); if ($modelStart < $recordStart && $modelStart < $recordEnd) { - Yii::$app->session->setFlash('error', 'Ошибка: активная запись для ' . $allAdmins[$model->admin_id] . 'не может начинаться раньше, чем неактивная запись (' . $record->date_start . ' - ' . $record->date_end . ') для другого кластера.'); + Yii::$app->session->setFlash('error', 'Ошибка: активная запись для ' . $allAdmins[$model->admin_id]['name'] . 'не может начинаться раньше, чем неактивная запись (' . $record->date_start . ' - ' . $record->date_end . ') для другого кластера.'); return $this->redirect(['update', 'id' => $model->id]); } } @@ -438,9 +401,10 @@ class ClusterAdminController extends Controller */ public function actionDelete($id) { + $model = $this->findModel($id); $this->findModel($id)->delete(); - return $this->redirect(['index']); + return $this->redirect(['view', 'id' => $model->cluster_id]); } /** diff --git a/erp24/views/crud/cluster-admin/_form.php b/erp24/views/crud/cluster-admin/_form.php index 234d02c1..a5211ba9 100644 --- a/erp24/views/crud/cluster-admin/_form.php +++ b/erp24/views/crud/cluster-admin/_form.php @@ -38,10 +38,11 @@ $allAdmins = ArrayHelper::map($allAdmins, 'id', 'name'); field($model, 'admin_id')->widget(Select2::class, [ - 'data' => $inactiveAdmins, // По умолчанию показываем неактивных админов + 'data' => $inactiveAdmins, 'options' => [ - 'id' => 'admin-select', // Присваиваем id для управления из JS + 'id' => 'admin-select', 'placeholder' => 'Выберите кустового...', + 'value' => $model->admin_id, ], 'pluginOptions' => [ 'allowClear' => true, @@ -69,7 +70,7 @@ $allAdmins = ArrayHelper::map($allAdmins, 'id', 'name');
'btn btn-success']) ?> - 'btn btn-danger my-2']) ?> + $cluster->id], ['class' => 'btn btn-danger my-2']) ?>
@@ -84,47 +85,73 @@ $inactiveAdminsJson = json_encode($inactiveAdmins, JSON_UNESCAPED_UNICODE); $allAdminsJson = json_encode($allAdmins, JSON_UNESCAPED_UNICODE); $js = <<admin_id; + populateAdminSelect(selectData, selectedValue); + if (isChecked) { - - $('label[for="date-end-field"]').hide(); - } else { - - $('label[for="date-end-field"]').show(); - } + $('label[for="date-end-field"]').hide(); + } else { + $('label[for="date-end-field"]').show(); } +} - - $('#active-checkbox').on('change', function() { - toggleDateEndField(); +function toggleDateEndField() { + var isChecked = $('#active-checkbox').is(':checked'); + var currentDate = new Date().toISOString().split('T')[0]; + var data = isChecked ? $inactiveAdminsJson : $allAdminsJson; + var selectData = Object.entries(data).map(function([id, text]) { + return { id: parseInt(id), text: text }; }); + var selectedValue = \$adminSelect.val(); + populateAdminSelect(selectData, selectedValue); + + if (isChecked) { + $('#date-end-field').val('2100-01-01'); + $('#date-end-field').hide(); + $('label[for="date-end-field"]').hide(); + } else { + $('#date-end-field').val(currentDate); + $('#date-end-field').show(); + $('label[for="date-end-field"]').show(); + } +} + + +$('#active-checkbox').on('change', function() { + toggleDateEndField(); +}); + - initDateEndField(); +initDateEndField(); JS; $this->registerJs($js); diff --git a/erp24/views/crud/cluster-admin/create.php b/erp24/views/crud/cluster-admin/create.php index b0e93d0b..a02755f9 100644 --- a/erp24/views/crud/cluster-admin/create.php +++ b/erp24/views/crud/cluster-admin/create.php @@ -15,7 +15,7 @@ $this->params['breadcrumbs'][] = ['label' => 'Cluster Admins', 'url' => ['index' $this->params['breadcrumbs'][] = $this->title; ?>
- 'btn btn-danger my-2']) ?> + $cluster->id], ['class' => 'btn btn-danger my-2']) ?>

title) ?>

render('_form', [ diff --git a/erp24/views/crud/cluster-admin/update.php b/erp24/views/crud/cluster-admin/update.php index e3b4085d..7973a502 100644 --- a/erp24/views/crud/cluster-admin/update.php +++ b/erp24/views/crud/cluster-admin/update.php @@ -16,7 +16,7 @@ $this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' $this->params['breadcrumbs'][] = 'Update'; ?>
- 'btn btn-danger my-2']) ?> + $cluster->id], ['class' => 'btn btn-danger my-2']) ?>

title) ?>

render('_form', [ -- 2.39.5