]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Правки по созданию новой неактивной записи
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 6 Nov 2024 15:18:12 +0000 (18:18 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Wed, 6 Nov 2024 15:18:12 +0000 (18:18 +0300)
erp24/controllers/crud/ClusterAdminController.php
erp24/views/crud/cluster-admin/_form.php
erp24/views/crud/cluster-admin/create.php
erp24/views/crud/cluster-admin/update.php

index bf5f479b2a81d34bb1ee164e29342edf8cfe3059..eef876304b7813896bdb86bcb52bcccd910a98e6 100644 (file)
@@ -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', 'Ð\9fеÑ\80еÑ\81еÑ\87ение Ð´Ð°Ñ\82 Ñ\81 Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8cÑ\8e Ð¾Ñ\82 ' . $record->date_start . ' Ð´Ð¾ ' . $record->date_end . ' Ð´Ð»Ñ\8f Ð´Ñ\80Ñ\83гого ÐºÐ»Ð°Ñ\81Ñ\82еÑ\80а.');
+                    if ($existingRecord) {
+                        $existingRecord->active = 0;
+                        $existingRecord->date_end = date('Y-m-d');
+
+                        if (!$existingRecord->save()) {
+                            Yii::$app->session->setFlash('error', 'Ð\9eÑ\88ибка Ð¿Ñ\80и Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ð¸ Ñ\81Ñ\83Ñ\89еÑ\81Ñ\82вÑ\83Ñ\8eÑ\89ей Ð·Ð°Ð¿Ð¸Ñ\81и.');
                             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]);
     }
 
     /**
index 234d02c1c9b27aa6e850e595004653dc5eed6780..a5211ba93262a32da1264dc090ab7741633214e5 100644 (file)
@@ -38,10 +38,11 @@ $allAdmins = ArrayHelper::map($allAdmins, 'id', 'name');
             </div>
 
             <?= $form->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');
 
             <div class="form-group">
                 <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
-                <?= Html::a('Отмена', ['index'], ['class' => 'btn btn-danger my-2']) ?>
+                <?= Html::a('Отмена', ['view', 'id' => $cluster->id], ['class' => 'btn btn-danger my-2']) ?>
             </div>
 
             <?php ActiveForm::end(); ?>
@@ -84,47 +85,73 @@ $inactiveAdminsJson = json_encode($inactiveAdmins, JSON_UNESCAPED_UNICODE);
 
 $allAdminsJson = json_encode($allAdmins, JSON_UNESCAPED_UNICODE);
 $js = <<<JS
-    function toggleDateEndField() {
-        var isChecked = $('#active-checkbox').is(':checked');
-        var currentDate = new Date().toISOString().split('T')[0]; 
-        var data = isChecked ? $inactiveAdminsJson : $allAdminsJson;
-
-        // Обновляем данные в Select2
-        $('#admin-select').empty().select2({
-             data: Object.entries(data).map(function([id, text]) {
-                return { id: parseInt(id), text: text };  // Преобразуем ключи (id) в числа
-            }),
-            placeholder: 'Выберите кустового...',
-             allowClear: true
-        });
-        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(); 
-        }
+    var \$adminSelect = $('#admin-select');
+
+function populateAdminSelect(data, selectedValue) {
+    
+    \$adminSelect.empty();
+    data.forEach(function(item) {
+        \$adminSelect.append(new Option(item.text, item.id, false, false));
+    });
+
+    
+    if (selectedValue && data.some(function(item) { return item.id == selectedValue; })) {
+        \$adminSelect.val(selectedValue).trigger('change');
+    } else {
+        \$adminSelect.val(null).trigger('change');
     }
+
     
-    function initDateEndField() {
+    \$adminSelect.select2({
+        placeholder: 'Выберите кустового...',
+        allowClear: true,
+    });
+}
+
+function initDateEndField() {
     var isChecked = $('#active-checkbox').is(':checked');
+    var data = isChecked ? $inactiveAdminsJson : $allAdminsJson;
+    var selectData = Object.entries(data).map(function([id, text]) {
+        return { id: parseInt(id), text: text };
+    });
+    var selectedValue = $model->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);
index b0e93d0b930b441d74cf1b9045784dc91906ae08..a02755f9d07c3b9fd041ef742341d6ff9ca7562d 100644 (file)
@@ -15,7 +15,7 @@ $this->params['breadcrumbs'][] = ['label' => 'Cluster Admins', 'url' => ['index'
 $this->params['breadcrumbs'][] = $this->title;
 ?>
 <div class="cluster-admin-create p-4">
-    <?= Html::a('Назад', ['index'], ['class' => 'btn btn-danger my-2']) ?>
+    <?= Html::a('Назад', ['view', 'id' => $cluster->id], ['class' => 'btn btn-danger my-2']) ?>
     <h1><?= Html::encode($this->title) ?></h1>
 
     <?= $this->render('_form', [
index e3b4085d75cd3280aea06372bd63fd8d40591e82..7973a5029ce69c03d6b4be1efcf2eeb80f8f37b4 100644 (file)
@@ -16,7 +16,7 @@ $this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id'
 $this->params['breadcrumbs'][] = 'Update';
 ?>
 <div class="cluster-admin-update p-4">
-    <?= Html::a('Назад', ['index'], ['class' => 'btn btn-danger my-2']) ?>
+    <?= Html::a('Назад', ['view', 'id' => $cluster->id], ['class' => 'btn btn-danger my-2']) ?>
     <h1><?= Html::encode($this->title) ?></h1>
 
     <?= $this->render('_form', [