{
$model = new ClusterAdmin();
- // Проверяем, существует ли указанный кластер
+
$cluster = Cluster::findOne($cluster_id);
if (!$cluster) {
throw new NotFoundHttpException('Кластер не найден.');
}
if ($this->request->isPost && $model->load($this->request->post())) {
- $model->cluster_id = $cluster_id; // Устанавливаем cluster_id
+ $model->cluster_id = $cluster_id;
// Ищем активную запись для данного кластера
$existingRecord = ClusterAdmin::find()
{
$model = $this->findModel($id);
+ $admins = ArrayHelper::map(Admin::find()
+ ->select(['id', 'name'])
+ ->where(['IN', 'group_id', [7]])
+ ->all(), 'id', 'name');
$cluster = Cluster::findOne($model->cluster_id);
if (!$cluster) {
}
if ($this->request->isPost && $model->load($this->request->post())) {
+
+ // Проверяем изменение 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(['update', 'id' => $model->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(['update', 'id' => $model->id]);
+ }
+ }
+
+ }
+
+ // Если активность = 0
+ if ($model->active == 0) {
+ $existingInactiveRecords = ClusterAdmin::find()
+ ->where(['admin_id' => $model->admin_id,])
+ // ->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(['update', 'id' => $model->id]);
+ }
+ }
+ }
+ }
+
+ // Сохраняем модель, если нет ошибок
if ($model->save()) {
Yii::$app->session->setFlash('success', 'Запись успешно обновлена.');
return $this->redirect(['view', 'id' => $model->cluster_id]);
}
}
- $admins = ArrayHelper::map(Admin::find()
- ->select(['id', 'name'])
- ->where(['IN', 'group_id', [7]])
- ->all(), 'id', 'name');
+
$user = Yii::$app->user->identity;
'user' => $user,
]);
}
-
/**
* Deletes an existing ClusterAdmin model.
* If deletion is successful, the browser will be redirected to the 'index' page.
?>
-<div class="cluster-admin-form">
- <?php if (Yii::$app->session->hasFlash('error')) { ?>
- <div class="alert alert-danger" role="alert">
- <?= Yii::$app->session->getFlash('error') ?>
- </div>
- <?php } ?>
+ <div class="cluster-admin-form">
+ <?php if (Yii::$app->session->hasFlash('error')) { ?>
+ <div class="alert alert-danger" role="alert">
+ <?= Yii::$app->session->getFlash('error') ?>
+ </div>
+ <?php } ?>
- <div class="col-6">
- <?php $form = ActiveForm::begin(); ?>
+ <div class="col-6">
+ <?php $form = ActiveForm::begin(); ?>
+
+
+ <div class="form-group">
+ <label>Куст</label>
+ <input type="text" class="form-control" value="<?= Html::encode($cluster->name) ?>" readonly>
+ <?= $form->field($model, 'cluster_id')->hiddenInput(['value' => $cluster->id])->label(false) ?>
+ </div>
+
+ <?= $form->field($model, 'admin_id')->widget(Select2::class, [
+ 'data' => $admins,
+ 'options' => ['placeholder' => 'Выберите кустового...'],
+ 'pluginOptions' => [
+ 'allowClear' => true
+ ],
+ ]); ?>
+
+
+ <?= $form->field($model, 'active')->checkbox([
+ 'label' => 'Активность',
+ 'checked' => $model->isNewRecord ? true : boolval($model->active),
+ 'id' => 'active-checkbox',
+ ]) ?>
- <!-- Отображаем только имя кластера и скрытое поле для передачи cluster_id -->
- <div class="form-group">
- <label>Куст</label>
- <input type="text" class="form-control" value="<?= Html::encode($cluster->name) ?>" readonly>
- <?= $form->field($model, 'cluster_id')->hiddenInput(['value' => $cluster->id])->label(false) ?>
- </div>
- <?= $form->field($model, 'admin_id')->widget(Select2::class, [
- 'data' => $admins,
- 'options' => ['placeholder' => 'Выберите кустового...'],
- 'pluginOptions' => [
- 'allowClear' => true
- ],
- ]); ?>
-
- <!-- Чекбокс для активности -->
- <?= $form->field($model, 'active')->checkbox([
- 'label' => 'Активность',
- 'checked' => $model->isNewRecord ? true : boolval($model->active),
- ]) ?>
-
- <!-- <?php /*if (in_array($user->group_id, [81])): */?>
- <?php /*= $form->field($model, 'date_start')->input('date', [
+ <?= $form->field($model, 'date_start')->input('date', [
'value' => $model->date_start ?? date('Y-m-d'),
- ]) */?>
- <?php /*else: */?>
- <?php /*= $form->field($model, 'date_start')->hiddenInput(['value' => date('Y-m-d')])->label(false) */?>
- --><?php /*endif; */?>
-
- <?= $form->field($model, 'date_start')->input('date', [
- 'value' => $model->date_start ?? date('Y-m-d'),
- ]) ?>
-
- <?= $form->field($model, 'date_end')->input('date', [
- 'value' => $model->date_end ?? date('Y-m-d'),
- ]) ?>
-
- <div class="form-group">
- <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
- <?= Html::a('Отмена', ['index'], ['class' => 'btn btn-danger my-2']) ?>
- </div>
+ ]) ?>
+
- <?php ActiveForm::end(); ?>
+ <?= $form->field($model, 'date_end')->input('date', [
+ 'value' => $model->date_end ?? date('Y-m-d'),
+ 'id' => 'date-end-field',
+ 'style' => $model->active ? 'display: none;' : '',
+ ]) ?>
+ <div class="form-group">
+ <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
+ <?= Html::a('Отмена', ['index'], ['class' => 'btn btn-danger my-2']) ?>
+ </div>
+ <?php ActiveForm::end(); ?>
+
+ </div>
</div>
-</div>
\ No newline at end of file
+
+<?php
+
+$js = <<<JS
+ function toggleDateEndField() {
+ var isChecked = $('#active-checkbox').is(':checked');
+ var currentDate = new Date().toISOString().split('T')[0];
+
+ 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();
+ }
+ }
+
+ function initDateEndField() {
+ var isChecked = $('#active-checkbox').is(':checked');
+ if (isChecked) {
+
+ $('label[for="date-end-field"]').hide();
+ } else {
+
+ $('label[for="date-end-field"]').show();
+ }
+ }
+
+
+ $('#active-checkbox').on('change', function() {
+ toggleDateEndField();
+ });
+
+ initDateEndField();
+JS;
+
+$this->registerJs($js);
+?>
\ No newline at end of file