From: vladfo Date: Fri, 18 Oct 2024 14:47:38 +0000 (+0300) Subject: Изменение интерфейса и добавление миграции X-Git-Tag: 1.7~228^2~31 X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=4397aa4cdd33d2d3ccbcc27bcf0a32f4f0829091;p=erp24_rep%2Fyii-erp24%2F.git Изменение интерфейса и добавление миграции --- diff --git a/erp24/controllers/crud/ClusterAdminController.php b/erp24/controllers/crud/ClusterAdminController.php index d917c713..b0357be2 100644 --- a/erp24/controllers/crud/ClusterAdminController.php +++ b/erp24/controllers/crud/ClusterAdminController.php @@ -43,14 +43,48 @@ class ClusterAdminController extends Controller */ public function actionIndex() { - $searchModel = new ClusterAdminSearch(); - $dataProvider = $searchModel->search($this->request->queryParams); + // Получаем все кусты из таблицы Cluster + $clusters = Cluster::find()->asArray()->all(); + + // Получаем все записи из таблицы ClusterAdmin + $clusterAdmins = ClusterAdmin::find() + ->with(['admin', 'cluster']) + ->asArray() + ->all(); + + // Создаем массив для сопоставления кустов и их статуса + $clusterMapping = []; + foreach ($clusters as $cluster) { + $clusterMapping[$cluster['id']] = [ + 'name' => $cluster['name'], + 'admin' => null, + 'status' => 'Нет записей', + 'hasActive' => false, + 'hasAny' => false, + ]; + + // Проверяем наличие записей и активных записей для данного куста + foreach ($clusterAdmins as $adminRecord) { + if ($adminRecord['cluster_id'] == $cluster['id']) { + $clusterMapping[$cluster['id']]['hasAny'] = true; + + if ($adminRecord['active'] == 1) { + $clusterMapping[$cluster['id']]['admin'] = $adminRecord['admin']['name'] . ' (' . $adminRecord['admin_id'] . ')'; + $clusterMapping[$cluster['id']]['status'] = 'Активная запись'; + $clusterMapping[$cluster['id']]['hasActive'] = true; + break; + } + } + } + + + if (!$clusterMapping[$cluster['id']]['hasActive'] && $clusterMapping[$cluster['id']]['hasAny']) { + $clusterMapping[$cluster['id']]['status'] = 'Нет активных записей'; + } + } - $user = Yii::$app->user->identity; return $this->render('index', [ - 'searchModel' => $searchModel, - 'dataProvider' => $dataProvider, - 'user' => $user, + 'clusterMapping' => $clusterMapping, ]); } @@ -63,8 +97,22 @@ class ClusterAdminController extends Controller public function actionView($id) { $user = Yii::$app->user->identity; + + // Ищем кластер по его ID + $cluster = Cluster::findOne($id); + if (!$cluster) { + throw new NotFoundHttpException('Кластер не найден.'); + } + + // Находим все записи для данного кластера + $clusterAdmins = ClusterAdmin::find() + ->where(['cluster_id' => $id]) + ->with(['admin']) + ->all(); + return $this->render('view', [ - 'model' => $this->findModel($id), + 'cluster' => $cluster, + 'clusterAdmins' => $clusterAdmins, 'user' => $user, ]); } @@ -74,57 +122,59 @@ class ClusterAdminController extends Controller * If creation is successful, the browser will be redirected to the 'view' page. * @return string|\yii\web\Response */ - public function actionCreate() + public function actionCreate($cluster_id) { $model = new ClusterAdmin(); + // Проверяем, существует ли указанный кластер + $cluster = Cluster::findOne($cluster_id); + if (!$cluster) { + throw new NotFoundHttpException('Кластер не найден.'); + } + if ($this->request->isPost && $model->load($this->request->post())) { - // Проверка на существование записи с такими же cluster_id и date_end >= текущей даты или date_end = '2100-01-01' + $model->cluster_id = $cluster_id; // Устанавливаем cluster_id + + // Ищем активную запись для данного кластера $existingRecord = ClusterAdmin::find() - ->where(['cluster_id' => $model->cluster_id]) - ->andWhere(['or', ['>=', 'date_end', date('Y-m-d')], ['date_end' => '2100-01-01']]) + ->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']); + return $this->redirect(['create', 'cluster_id' => $cluster_id]); } + } - // Создаём новую запись для cluster_id и admin_id - $model->date_start = date('Y-m-d'); // Опционально установить текущую дату как начало новой привязки - if ($model->save()) { - ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); - Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.'); - return $this->redirect(['view', 'id' => $model->id]); - } else { - Yii::$app->session->setFlash('error', 'Ошибка при создании новой записи.'); - } + // Устанавливаем дату начала для новой записи и включаем активность + $model->date_start = date('Y-m-d'); + $model->active = 1; + + if ($model->save()) { + ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); + Yii::$app->session->setFlash('success', 'Новая запись успешно создана, предыдущая была закрыта.'); + return $this->redirect(['view', 'id' => $cluster_id]); } else { - // Если такой записи нет, просто создаем новую - if ($model->save()) { - ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); - return $this->redirect(['view', 'id' => $model->id]); - } + Yii::$app->session->setFlash('error', 'Ошибка при создании новой записи.'); } } - // Получение данных для выпадающих списков - $clusters = ArrayHelper::map(Cluster::find()->all(), 'id', 'name'); $admins = ArrayHelper::map(Admin::find() ->select(['id', 'name']) - ->where(['IN', 'group_id', [7]]) // Только кустовые директора + ->where(['IN', 'group_id', [7]]) ->all(), 'id', 'name'); $user = Yii::$app->user->identity; return $this->render('create', [ 'model' => $model, - 'clusters' => $clusters, + 'cluster' => $cluster, 'admins' => $admins, 'user' => $user, ]); @@ -142,41 +192,30 @@ class ClusterAdminController extends Controller $model = $this->findModel($id); - // Сохраним оригинальные значения до изменения - $originalClusterId = $model->cluster_id; - $originalAdminId = $model->admin_id; + $cluster = Cluster::findOne($model->cluster_id); + if (!$cluster) { + throw new NotFoundHttpException('Кластер не найден.'); + } if ($this->request->isPost && $model->load($this->request->post())) { - // Если запись успешно обновлена if ($model->save()) { - // Проверяем, изменились ли cluster_id или admin_id - if ($originalClusterId != $model->cluster_id || $originalAdminId != $model->admin_id) { - // Очищаем старую привязку менеджера к магазину - ClusterManagerService::clearClusterManagerStores($originalClusterId, $originalAdminId); - - // Синхронизируем новую привязку - ClusterManagerService::syncClusterManagers($model->cluster_id, $model->admin_id); - } - - // Перенаправляем на страницу просмотра - return $this->redirect(['view', 'id' => $model->id]); + Yii::$app->session->setFlash('success', 'Запись успешно обновлена.'); + return $this->redirect(['view', 'id' => $model->cluster_id]); } else { Yii::$app->session->setFlash('error', 'Ошибка при сохранении данных.'); } } - // Получение данных для выпадающих списков - $clusters = ArrayHelper::map(Cluster::find()->all(), 'id', 'name'); $admins = ArrayHelper::map(Admin::find() ->select(['id', 'name']) - ->where(['IN', 'group_id', [7]]) // Только кустовые директора + ->where(['IN', 'group_id', [7]]) ->all(), 'id', 'name'); $user = Yii::$app->user->identity; return $this->render('update', [ 'model' => $model, - 'clusters' => $clusters, + 'cluster' => $cluster, 'admins' => $admins, 'user' => $user, ]); diff --git a/erp24/migrations/m241018_114640_alter_table_cluster_admin_add_column_active.php b/erp24/migrations/m241018_114640_alter_table_cluster_admin_add_column_active.php new file mode 100644 index 00000000..c3e1a27e --- /dev/null +++ b/erp24/migrations/m241018_114640_alter_table_cluster_admin_add_column_active.php @@ -0,0 +1,42 @@ +addColumn(self::TABLE_NAME, 'active', $this->tinyInteger()->notNull()->defaultValue(0) + ->after('date_end')->comment('0 - запись не активная 1 - запись привязки активная')); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropColumn(self::TABLE_NAME, 'active'); + } + + /* + // Use up()/down() to run migration code without a transaction. + public function up() + { + + } + + public function down() + { + echo "m241018_114640_alter_table_cluster_admin_add_column_active cannot be reverted.\n"; + + return false; + } + */ +} diff --git a/erp24/records/ClusterAdmin.php b/erp24/records/ClusterAdmin.php index e43aa9b3..f5bd42ab 100644 --- a/erp24/records/ClusterAdmin.php +++ b/erp24/records/ClusterAdmin.php @@ -13,6 +13,7 @@ use yii\db\ActiveQuery; * @property int $admin_id ID пользователя * @property string $date_start Дата начала привязки * @property string $date_end Дата окончания привязки + * @property int $active Активность */ class ClusterAdmin extends \yii\db\ActiveRecord { @@ -31,7 +32,7 @@ class ClusterAdmin extends \yii\db\ActiveRecord { return [ [['cluster_id', 'admin_id', 'date_start'], 'required'], - [['cluster_id', 'admin_id'], 'integer'], + [['cluster_id', 'admin_id', 'active'], 'integer'], [['date_start', 'date_end'], 'date', 'format' => 'php:Y-m-d'], ['date_end', 'compare', 'compareAttribute' => 'date_start', 'operator' => '>=', 'type' => 'date', @@ -50,6 +51,7 @@ class ClusterAdmin extends \yii\db\ActiveRecord 'admin_id' => 'Кустовой', 'date_start' => 'Начало привязки', 'date_end' => 'Окончание привязки', + 'active' => 'Активность', ]; } @@ -63,4 +65,14 @@ class ClusterAdmin extends \yii\db\ActiveRecord return $this->hasOne(Admin::class, ['id' => 'admin_id']); } -} + /** + * Устанавливаем значение активности по умолчанию + */ + public function init() + { + parent::init(); + if ($this->isNewRecord) { + $this->active = 1; // По умолчанию активная запись + } + } +} \ No newline at end of file diff --git a/erp24/views/crud/cluster-admin/_form.php b/erp24/views/crud/cluster-admin/_form.php index 2b0feb00..e3b69bda 100644 --- a/erp24/views/crud/cluster-admin/_form.php +++ b/erp24/views/crud/cluster-admin/_form.php @@ -6,20 +6,17 @@ use yii\widgets\ActiveForm; use yii_app\records\ClusterAdmin; - /** @var yii\web\View $this */ /** @var ClusterAdmin $model */ /** @var yii\widgets\ActiveForm $form */ -/** @var array $clusters */ +/** @var yii_app\records\Cluster $cluster */ /** @var array $admins */ /** @var yii_app\records\Admin $user */ - - ?>
- session->hasFlash('error')) { ?> + session->hasFlash('error')) { ?> @@ -28,13 +25,12 @@ use yii_app\records\ClusterAdmin;
- field($model, 'cluster_id')->widget(Select2::class, [ - 'data' => $clusters, - 'options' => ['placeholder' => 'Выберите куст...'], - 'pluginOptions' => [ - 'allowClear' => true - ], - ]); ?> + +
+ + + field($model, 'cluster_id')->hiddenInput(['value' => $cluster->id])->label(false) ?> +
field($model, 'admin_id')->widget(Select2::class, [ 'data' => $admins, @@ -44,18 +40,18 @@ use yii_app\records\ClusterAdmin; ], ]); ?> - group_id , [81])): ?> - + + field($model, 'active')->checkbox([ + 'label' => 'Активность', + 'checked' => $model->isNewRecord ? true : boolval($model->active), + ]) ?> + + group_id, [81])): ?> field($model, 'date_start')->input('date', [ 'value' => $model->date_start ?? date('Y-m-d'), ]) ?> - - - field($model, 'date_start')->hiddenInput(['value' => date('Y-m-d')])->label(false) ?> - -
@@ -64,5 +60,7 @@ use yii_app\records\ClusterAdmin;
+ +
\ No newline at end of file diff --git a/erp24/views/crud/cluster-admin/create.php b/erp24/views/crud/cluster-admin/create.php index 9c5ed4f7..2611e804 100644 --- a/erp24/views/crud/cluster-admin/create.php +++ b/erp24/views/crud/cluster-admin/create.php @@ -5,11 +5,11 @@ use yii\helpers\Html; /** @var yii\web\View $this */ /** @var yii_app\records\ClusterAdmin $model */ -/** @var array $clusters */ +/** @var yii_app\records\Cluster $cluster */ /** @var array $admins */ /** @var yii_app\records\Admin $user */ -$this->title = 'Создание привязки Куста к Кустовому'; +$this->title = 'Создание привязки Куста к Кустовому для ' . $cluster->name; $this->params['breadcrumbs'][] = ['label' => 'Cluster Admins', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; ?> @@ -19,7 +19,7 @@ $this->params['breadcrumbs'][] = $this->title; render('_form', [ 'model' => $model, - 'clusters' => $clusters, + 'cluster' => $cluster, 'admins' => $admins, 'user' => $user, ]) ?> diff --git a/erp24/views/crud/cluster-admin/index.php b/erp24/views/crud/cluster-admin/index.php index e455c979..aacb358a 100644 --- a/erp24/views/crud/cluster-admin/index.php +++ b/erp24/views/crud/cluster-admin/index.php @@ -1,16 +1,10 @@ title = 'Привязка Куст-Кустовой'; $this->params['breadcrumbs'][] = $this->title; @@ -19,50 +13,53 @@ $this->params['breadcrumbs'][] = $this->title;

title) ?>

-

- 'btn btn-success']) ?> -

- - render('_search', ['model' => $searchModel]); ?> - $dataProvider, - 'filterModel' => $searchModel, + 'dataProvider' => new \yii\data\ArrayDataProvider([ + 'allModels' => $clusterMapping, + 'pagination' => [ + 'pageSize' => 20, + ], + ]), 'columns' => [ - ['class' => 'yii\grid\SerialColumn'], - - 'id', [ - 'attribute' => 'cluster_id', + 'attribute' => 'name', + 'label' => 'Куст', 'value' => function ($model) { - return $model->cluster ? $model->cluster->name . ' (' . $model->cluster_id . ')' : null; + return Html::encode($model['name']); }, + 'format' => 'raw', ], [ - 'attribute' => 'admin_id', + 'attribute' => 'admin', + 'label' => 'Кустовой', 'value' => function ($model) { - return $model->admin ? $model->admin->name . ' (' . $model->admin_id . ')' : null; + if ($model['status'] === 'Нет записей') { + return Html::tag('span', 'Нет записей', ['style' => 'color: red;']); + } elseif ($model['status'] === 'Нет активных записей') { + return Html::tag('span', 'Нет активных записей', ['style' => 'color: orange;']); + } else { + return Html::encode($model['admin']); + } }, + 'format' => 'raw', ], - 'date_start', - 'date_end', [ - 'class' => ActionColumn::class, - 'template' => '{view} {update} {delete}', // По умолчанию включаем все кнопки - 'visibleButtons' => [ - 'update' => function ($model) use ($user) { - return in_array($user->group_id, [81]); // Показывать кнопку 'update' только для группы 81 + 'class' => 'yii\grid\ActionColumn', + 'template' => '{view} {create}', + 'buttons' => [ + 'view' => function ($url, $model, $key) { + return Html::a('Просмотреть', ['view', 'id' => $key], ['class' => 'btn btn-primary']); }, - 'delete' => function ($model) use ($user) { - return in_array($user->group_id, [81]); // Показывать кнопку 'delete' только для группы 81 + 'create' => function ($url, $model, $key) { + // Показываем кнопку только если нет записей для кластера + if ($model['status'] === 'Нет записей') { + return Html::a('Создать новую привязку', ['create', 'cluster_id' => $key], ['class' => 'btn btn-success']); + } + return null; }, ], - 'urlCreator' => function ($action, ClusterAdmin $model, $key, $index, $column) { - return Url::toRoute([$action, 'id' => $model->id]); - } ], ], ]); ?> - - + \ No newline at end of file diff --git a/erp24/views/crud/cluster-admin/update.php b/erp24/views/crud/cluster-admin/update.php index 1d345309..73bccad9 100644 --- a/erp24/views/crud/cluster-admin/update.php +++ b/erp24/views/crud/cluster-admin/update.php @@ -5,11 +5,11 @@ use yii\helpers\Html; /** @var yii\web\View $this */ /** @var yii_app\records\ClusterAdmin $model */ -/** @var array $clusters */ +/** @var yii_app\records\Cluster $cluster */ /** @var array $admins */ /** @var yii_app\records\Admin $user */ -$this->title = 'Редактирование привязки куста к кустовому: ' . $model->id; +$this->title = 'Редактирование привязки куста к кустовому: ' . $cluster->name; $this->params['breadcrumbs'][] = ['label' => 'Cluster Admins', 'url' => ['index']]; $this->params['breadcrumbs'][] = ['label' => $model->id, 'url' => ['view', 'id' => $model->id]]; $this->params['breadcrumbs'][] = 'Update'; @@ -20,7 +20,7 @@ $this->params['breadcrumbs'][] = 'Update'; render('_form', [ 'model' => $model, - 'clusters' => $clusters, + 'cluster' => $cluster, 'admins' => $admins, 'user' => $user, ]) ?> diff --git a/erp24/views/crud/cluster-admin/view.php b/erp24/views/crud/cluster-admin/view.php index 3a41c278..e5778c92 100644 --- a/erp24/views/crud/cluster-admin/view.php +++ b/erp24/views/crud/cluster-admin/view.php @@ -2,53 +2,83 @@ use yii\helpers\Html; use yii\widgets\DetailView; +use yii\grid\GridView; +use yii\data\ArrayDataProvider; /** @var yii\web\View $this */ -/** @var yii_app\records\ClusterAdmin $model */ +/** @var yii_app\records\Cluster $cluster */ +/** @var array $clusterAdmins */ /** @var yii_app\records\Admin $user */ -$this->title = "Привязка кустового к кусту №" . $model->id . " от " . $model->date_start; +$this->title = "Детали кластера: " . $cluster->name; $this->params['breadcrumbs'][] = ['label' => 'Cluster Admins', 'url' => ['index']]; $this->params['breadcrumbs'][] = $this->title; \yii\web\YiiAsset::register($this); ?>
+ 'btn btn-danger my-2']) ?>

title) ?>

-

group_id, [81])): ?> - $model->id], ['class' => 'btn btn-primary']) ?> - $model->id], [ - 'class' => 'btn btn-danger', - 'data' => [ - 'confirm' => 'Вы уверены что хотите удалить запись?', - 'method' => 'post', - ], - ]) ?> + $cluster->id], ['class' => 'btn btn-success']) ?>

- $model, - 'attributes' => [ - 'id', + + +

Привязки кустового к кусту

+ + new ArrayDataProvider([ + 'allModels' => $clusterAdmins, + 'pagination' => [ + 'pageSize' => 10, + ], + ]), + 'columns' => [ [ - 'attribute' => 'cluster_id', + 'attribute' => 'admin_id', + 'label' => 'Кустовой', 'value' => function ($model) { - return $model->cluster ? $model->cluster->name . ' (' . $model->cluster_id . ')' : null; + return $model->admin ? $model->admin->name . ' (' . $model->admin_id . ')' : 'Не назначен'; }, ], [ - 'attribute' => 'admin_id', + 'attribute' => 'active', + 'label' => 'Активность', + 'format' => 'raw', 'value' => function ($model) { - return $model->admin ? $model->admin->name . ' (' . $model->admin_id . ')' : null; + return $model->active == 1 + ? Html::tag('span', 'Активен', ['style' => 'color: green;']) + : Html::tag('span', 'Неактивен', ['style' => 'color: red;']); }, ], 'date_start', - 'date_end', + [ + 'attribute' => 'date_end', + 'label' => 'Дата окончания', + 'value' => function ($model) { + return $model->active == 0 ? $model->date_end : '-'; + }, + ], + [ + 'class' => 'yii\grid\ActionColumn', + 'template' => '{update} {delete}', + 'visibleButtons' => [ + 'update' => function ($model) use ($user) { + return in_array($user->group_id, [81]); + }, + 'delete' => function ($model) use ($user) { + return in_array($user->group_id, [81]); + }, + ], + 'urlCreator' => function ($action, $model, $key, $index) { + return [$action, 'id' => $model->id]; + }, + ], ], - ]) ?> + ]); ?> -
+ \ No newline at end of file