]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-282 Нужно сделать интерфейс настройки магазина
authormarina <m.zozirova@gmail.com>
Thu, 23 Jan 2025 17:48:14 +0000 (20:48 +0300)
committermarina <m.zozirova@gmail.com>
Thu, 23 Jan 2025 17:48:14 +0000 (20:48 +0300)
erp24/controllers/CityStoreParamsController.php
erp24/migrations/m250123_164600_update_column_name.php [new file with mode: 0644]
erp24/records/CityStoreParams.php
erp24/views/city-store-params/_form.php [deleted file]
erp24/views/city-store-params/create.php [deleted file]
erp24/views/city-store-params/index.php
erp24/views/city-store-params/update.php
erp24/views/city-store-params/view.php
erp24/web/js/city-store-params/city-store-params.js

index b0565ef7b384ce23b85bd407a07d82996da0ea9a..d87fe8c314f5d64453cc59c23207dd76ec6097bf 100644 (file)
@@ -3,6 +3,7 @@
 namespace app\controllers;
 
 use Yii;
+use yii\data\ActiveDataProvider;
 use yii\helpers\ArrayHelper;
 use yii\web\Controller;
 use yii\web\NotFoundHttpException;
@@ -12,6 +13,7 @@ use yii_app\records\Admin;
 use yii_app\records\AdminGroup;
 use yii_app\records\CityStore;
 use yii_app\records\CityStoreParams;
+use yii_app\records\Cluster;
 use yii_app\records\ClusterAdmin;
 use yii_app\records\MatrixType;
 use yii_app\records\StoreCityList;
@@ -44,24 +46,16 @@ class CityStoreParamsController extends Controller
      */
     public function actionIndex()
     {
-        $model = !empty(Yii::$app->request->post('id'))
-            ? $this->findModel(Yii::$app->request->post('id'))
-            : new CityStoreParams();
-
-        if ($model->load(Yii::$app->request->post())) {
-            if (is_array($model->matrix_type)) {
-                $model->matrix_type = implode(',', $model->matrix_type);
-            }
-            if ($model->validate()) {
-                $model->save();
-                return $this->redirect(['view', 'id' => $model->id]);
-            } else {
+        $dataProvider = new ActiveDataProvider([
+            'query' => CityStoreParams::find(),
+            'pagination' => [
+                'pageSize' => 20,
+            ],
+        ]);
 
-            var_dump($model->getErrors(), $model->matrix_type);
-            die();
-            }
-        }
-        return $this->render('index');
+        return $this->render('index', [
+            'dataProvider' => $dataProvider,
+        ]);
     }
 
     /**
@@ -70,50 +64,30 @@ class CityStoreParamsController extends Controller
      * @return mixed
      * @throws NotFoundHttpException
      */
-    public
-    function actionView($id)
+    public function actionView($id)
     {
         return $this->render('view', [
             'model' => $this->findModel($id),
         ]);
     }
 
-    /**
-     * Создание новой записи
-     * @return mixed
-     */
-    public
-    function actionCreate()
-    {
-        $model = new CityStoreParams();
-
-        if ($model->load(Yii::$app->request->post()) && $model->save()) {
-            return $this->redirect(['view', 'id' => $model->id]);
-        }
 
-        return $this->render('create', [
-            'model' => $model,
-        ]);
-    }
-
-    /**
-     * Обновление существующей записи
-     * @param int $id
-     * @return mixed
-     * @throws NotFoundHttpException
-     */
-    public
-    function actionUpdate($id)
+    public function actionUpdate()
     {
-        $model = $this->findModel($id);
+        $model = !empty(Yii::$app->request->post()['CityStoreParams']['id'])
+            ? $this->findModel(Yii::$app->request->post()['CityStoreParams']['id'])
+            : new CityStoreParams();
+
 
-        if ($model->load(Yii::$app->request->post()) && $model->save()) {
-            return $this->redirect(['view', 'id' => $model->id]);
+        if ($model->load(Yii::$app->request->post())) {
+            $model->matrix_type = is_array($model->matrix_type) ? implode(',', $model->matrix_type) : $model->matrix_type;
+            if ($model->validate()) {
+                $model->save();
+                return $this->redirect(['view', 'id' => $model->id]);
+            }
         }
 
-        return $this->render('update', [
-            'model' => $model,
-        ]);
+        return $this->render('update');
     }
 
     /**
@@ -122,8 +96,7 @@ class CityStoreParamsController extends Controller
      * @return CityStoreParams
      * @throws NotFoundHttpException
      */
-    protected
-    function findModel($id)
+    protected function findModel($id)
     {
         if (($model = CityStoreParams::findOne($id)) !== null) {
             return $model;
@@ -132,19 +105,45 @@ class CityStoreParamsController extends Controller
         throw new NotFoundHttpException('The requested page does not exist.');
     }
 
-    public
-    function actionEdit()
+    public function actionEdit()
     {
         Yii::$app->response->format = Response::FORMAT_JSON;
 
-        $data = Yii::$app->request->post(); // Используем POST
+        $data = Yii::$app->request->post();
         $addressCity = $data['address_city'] ?? '';
         $addressRegion = $data['address_region'] ?? '';
         $addressDistrict = $data['address_district'] ?? '';
         $storeType = $data['store_type'] ?? '';
+        $territorialManager = $data['territorial_manager'] ?? '';
+        $bushChefFlorist = $data['bush_chef_florist'] ?? '';
+
+        $territorialManagerQuery = StoreDynamic::find()->andFilterWhere(['category' => 1, 'active' => 1]);
+        $bushChefFloristQuery = StoreDynamic::find()->andFilterWhere(['category' => 2, 'active' => 1]);
+
+        if ($territorialManager) {
+            $territorialManagerQuery->andFilterWhere(['value_int' => ClusterAdmin::find()
+                ->andFilterWhere(['admin_id' => $territorialManager, 'active' => 1])
+                ->select('cluster_id')
+                ->column()]);
+        }
+
+        if ($bushChefFlorist) {
+            $bushChefFloristQuery->andWhere(['value_int' => $bushChefFlorist]);
+        }
+
+        $territorialManagerStoreIds = $territorialManagerQuery->select('store_id')->column();
+        $bushChefFloristStoreIds = $bushChefFloristQuery->select('store_id')->column();
 
         $stores = CityStore::find()
-            ->andWhere(['=', 'visible', CityStore::IS_VISIBLE])
+            ->andFilterWhere([
+                'visible' => CityStore::IS_VISIBLE,
+                'city' => $addressCity,
+                'district' => $addressRegion,
+                'type' => $addressDistrict,
+                'type' => $storeType,
+            ])
+            ->andFilterWhere(['in', 'id', $bushChefFloristStoreIds])
+            ->andFilterWhere(['in', 'id', $territorialManagerStoreIds])
             ->all();
 
         return [
@@ -185,8 +184,10 @@ class CityStoreParamsController extends Controller
                 'showcaseVolume' => $params->showcase_volume ?? null,
                 'freezeArea' => $params->freeze_area ?? null,
                 'freezeVolume' => $params->freeze_volume ?? null,
-                'matrixType' => $params->matrix_type ?? null,
+                'matrixType' => !empty($params->matrix_type) ? explode(',', $params->matrix_type) : null,
+                'bushId' => $bushId,
                 'storeTypeArray' => ArrayHelper::map(StoreType::find()->all(), 'id', 'name'),
+                'bushArray' => ArrayHelper::map(Cluster::find()->all(), 'id', 'name'),
                 'regionArray' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_REGION]), 'id', 'name'),
                 'cityArray' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_CITY]), 'id', 'name'),
                 'districtArray' => ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_DISTRICT]), 'id', 'name'),
@@ -195,4 +196,21 @@ class CityStoreParamsController extends Controller
             ]
         ];
     }
+
+    public function actionGetTerritorialManager($bushId)
+    {
+        Yii::$app->response->format = Response::FORMAT_JSON;
+
+        // Используем POST для получения bushId
+        $territorialManagerId = ClusterAdmin::findOne(['cluster_id' => $bushId])->admin_id ?? null;
+        $territorialManager = Admin::findOne($territorialManagerId)->name_full ?? null;
+
+        return [
+            'success' => true,
+            'data' => [
+                'territorialManagerId' => $territorialManagerId,
+                'territorialManager' => $territorialManager,
+            ]
+        ];
+    }
 }
diff --git a/erp24/migrations/m250123_164600_update_column_name.php b/erp24/migrations/m250123_164600_update_column_name.php
new file mode 100644 (file)
index 0000000..8c98187
--- /dev/null
@@ -0,0 +1,25 @@
+<?php
+
+use yii\db\Migration;
+
+/**
+ * Class m250123_164600_update_column_name
+ */
+class m250123_164600_update_column_name extends Migration
+{
+    /**
+     * {@inheritdoc}
+     */
+    public function safeUp()
+    {
+        $this->renameColumn('city_store_params', 'stores_type', 'store_type');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function safeDown()
+    {
+        $this->renameColumn('city_store_params', 'store_type', 'stores_type');
+    }
+}
index c6a1ba5fd70bf23778b340ba15735af46eac8fdb..56d1b3770e2dad2ab6db5b3634502fa27c4b9d3b 100644 (file)
@@ -14,7 +14,7 @@ use yii\filters\VerbFilter;
  *
  * @property int $id
  * @property int $store_id
- * @property int|null $stores_type
+ * @property int|null $store_type
  * @property string|null $address_city
  * @property string|null $address_region
  * @property string|null $address_district
@@ -65,7 +65,7 @@ class CityStoreParams extends ActiveRecord
     {
         return [
             [['store_id'], 'required'],
-            [['store_id', 'stores_type', 'territorial_manager', 'bush_chef_florist', 'created_by', 'updated_by', 'bush_id'], 'integer'],
+            [['store_id', 'store_type', 'territorial_manager', 'bush_chef_florist', 'created_by', 'updated_by', 'bush_id'], 'integer'],
             [['store_area', 'showcase_volume', 'freeze_area', 'freeze_volume'], 'number'],
             [['created_at', 'updated_at'], 'safe'],
             [['address_city', 'address_region', 'address_district', 'matrix_type'], 'string'],
@@ -80,7 +80,7 @@ class CityStoreParams extends ActiveRecord
         return [
             'id' => 'ID',
             'store_id' => 'ИД Магазина',
-            'stores_type' => 'Тип магазина',
+            'store_type' => 'Тип магазина',
             'address_city' => 'Город, где расположен магазин',
             'address_region' => 'Регион, где расположен магазин',
             'address_district' => 'Район, где расположен магазин',
@@ -102,4 +102,40 @@ class CityStoreParams extends ActiveRecord
     public function getStore() {
         return $this->hasOne(CityStore::class, ['id' => 'store_id']);
     }
+
+    public function getUpdatedBy() {
+        return $this->hasOne(Admin::class, ['id' => 'updated_by']);
+    }
+
+    public function getCreatedBy() {
+        return $this->hasOne(Admin::class, ['id' => 'created_by']);
+    }
+
+    public function getTerritorialManager() {
+        return $this->hasOne(Admin::class, ['id' => 'territorial_manager']);
+    }
+
+    public function getBushChefFlorist() {
+        return $this->hasOne(Admin::class, ['id' => 'bush_chef_florist']);
+    }
+
+    public function getMatrixType() {
+        return $this->hasOne(MatrixType::class, ['id' => 'matrix_type']);
+    }
+
+    public function getStoreType() {
+        return $this->hasOne(StoreType::class, ['id' => 'store_type']);
+    }
+
+    public function getAddressRegion() {
+        return $this->hasOne(StoreCityList::class, ['id' => 'address_region']);
+    }
+
+    public function getAddressDistrict() {
+        return $this->hasOne(StoreCityList::class, ['id' => 'address_district']);
+    }
+
+    public function getAddressCity() {
+        return $this->hasOne(StoreCityList::class, ['id' => 'address_city']);
+    }
 }
diff --git a/erp24/views/city-store-params/_form.php b/erp24/views/city-store-params/_form.php
deleted file mode 100644 (file)
index 659e299..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-use yii\helpers\Html;
-use yii\widgets\ActiveForm;
-
-/* @var $this yii\web\View */
-/* @var $model app\models\CityStoreParams */
-/* @var $form yii\widgets\ActiveForm */
-?>
-
-<div class="city-store-params-form">
-
-    <?php $form = ActiveForm::begin(); ?>
-
-    <?= $form->field($model, 'store_id')->textInput() ?>
-
-    <?= $form->field($model, 'stores_type')->textInput() ?>
-
-    <?= $form->field($model, 'address_city')->textInput() ?>
-
-    <?= $form->field($model, 'address_region')->textInput() ?>
-
-    <?= $form->field($model, 'address_district')->textInput() ?>
-
-    <?= $form->field($model, 'territorial_manager')->textInput() ?>
-
-    <?= $form->field($model, 'bush_chef_florist')->textInput() ?>
-
-    <?= $form->field($model, 'store_area')->textInput() ?>
-
-    <?= $form->field($model, 'showcase_volume')->textInput() ?>
-
-    <?= $form->field($model, 'freeze_area')->textInput() ?>
-
-    <?= $form->field($model, 'freeze_volume')->textInput() ?>
-
-    <?= $form->field($model, 'matrix_type')->textInput() ?>
-
-    <div class="form-group">
-        <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Save', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
-    </div>
-
-    <?php ActiveForm::end(); ?>
-
-</div>
diff --git a/erp24/views/city-store-params/create.php b/erp24/views/city-store-params/create.php
deleted file mode 100644 (file)
index d205694..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-use yii\helpers\Html;
-
-/* @var $this yii\web\View */
-/* @var $model app\models\CityStoreParams */
-
-$this->title = 'Create City Store Param';
-$this->params['breadcrumbs'][] = ['label' => 'City Store Params', 'url' => ['index']];
-$this->params['breadcrumbs'][] = $this->title;
-?>
-<div class="city-store-params-create">
-
-    <h1><?= Html::encode($this->title) ?></h1>
-
-    <?= $this->render('_form', [
-        'model' => $model,
-    ]) ?>
-
-</div>
index fc19d56b528b2edec1473c18625c305aed746376..03b8699d95846ddc213f240519d90c499b2982ff 100644 (file)
 <?php
 
-use softark\duallistbox\DualListbox;
-use yii\helpers\ArrayHelper;
+use yii\grid\GridView;
 use yii\helpers\Html;
-use yii\helpers\Url;
-use yii_app\records\Admin;
-use yii_app\records\AdminGroup;
-use yii_app\records\MatrixType;
-use yii_app\records\StoreCityList;
-use yii_app\records\StoreType;
 
 /* @var $this yii\web\View */
 /* @var $dataProvider yii\data\ActiveDataProvider */
 
-$this->title = 'City Store Params';
+$this->title = 'Список магазинов с настройками';
 $this->params['breadcrumbs'][] = $this->title;
-
-$this->registerJsFile('/js/city-store-params/city-store-params.js', ['position' => \yii\web\View::POS_END]);
 ?>
-<div class="container mt-4 border-bottom">
-    <div class="row">
-        <div class="col-md-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('address_region', null,
-                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_REGION]), 'id', 'name'),
-                    ['prompt' => 'Выберите регион', 'class' => 'form-select', 'id' => 'address_region']);
-                ?>
-                <?= Html::a('Редактировать', [
-                    Url::to('/store-city-list')], ['class' => 'd-block mt-2 text-decoration-none']);
-                ?>
-            </div>
-        </div>
-        <div class="col-md-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('address_city', null,
-                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_CITY]), 'id', 'name'),
-                    ['prompt' => 'Выберите город', 'class' => 'form-select', 'id' => 'address_city']);
-                ?>
-            </div>
-        </div>
-        <div class="col-md-2 border-end border-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('address_district', null,
-                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_DISTRICT]), 'id', 'name'),
-                    ['prompt' => 'Выберите район', 'class' => 'form-select', 'id' => 'address_district']);
-                ?>
-            </div>
-        </div>
-        <div class="col-md-2 border-end border-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('store_type', null,
-                    ArrayHelper::map(StoreType::find()->all(), 'id', 'name'),
-                    ['prompt' => 'Выберите тип магазина', 'class' => 'form-select', 'id' => 'store_type']);
-                ?>
-                <?= Html::a('Редактировать', [\yii\helpers\Url::to('/store-type')], ['class' => 'd-block mt-2 text-decoration-none']); ?>
-            </div>
-        </div>
-        <div class="col-md-2 border-end border-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('territorial_manager', null,
-                    ArrayHelper::map(Admin::findAll(['group_id' => AdminGroup::GROUP_BUSH_DIRECTOR]), 'id', 'name_full'),
-                    ['prompt' => 'Выберите территориального управляющего', 'class' => 'form-select', 'id' => 'territorial_manager']);
-                ?>
-            </div>
-        </div>
-    </div>
-    <div class="row mt-3">
-        <div class="col-md-2"></div>
-        <div class="col-md-2"></div>
-        <div class="col-md-2"></div>
-        <div class="col-md-2 border-end border-2">
-            <div class="card p-3 bg-light shadow-sm">
-                <?= Html::dropDownList('bush_chef_florist', null,
-                    ArrayHelper::map(Admin::findAll(['group_id' => \yii_app\records\AdminGroup::GROUP_BUSH_CHEF_FLORIST]), 'id', 'name_full'),
-                    ['prompt' => 'Выберите кустового шеф флориста', 'class' => 'form-select', 'id' => 'bush_chef_florist']);
-                ?>
-            </div>
-        </div>
-        <div class="col-md-2"></div>
-        <div class="col-md-2 d-flex justify-content-center align-items-center">
-            <div class="card p-45 bg-light shadow-sm w-100">
-                <?= Html::button('Применить', ['class' => 'btn btn-primary w-100', 'id' => 'apply-button']); ?>
-            </div>
-        </div>
-    </div>
-</div>
-<?php $form = \yii\widgets\ActiveForm::begin(); ?>
-<div class="container mt-4">
-    <div class="row">
-        <div class="col-md-3">
-            <?= Html::dropDownList('CityStoreParams[selected_store]', null, [], [
-                'multiple' => true,
-                'size' => 16,
-                'class' => 'form-control',
-                'id' => 'selected-store',
-            ]) ?>
-            <?= Html::button('Редактировать', ['class' => 'btn btn-primary w-100 mt-2 py-1', 'id' => 'edit-button']); ?>
-        </div>
-        <div class="col-md-9">
-            <div class="form-group">
-                <div class="row">
-                    <div class="col-md-4 d-flex align-items-center gap-3">
-                        <?= Html::hiddenInput('CityStoreParams[id]') ?>
-                        <?= Html::hiddenInput('CityStoreParams[store_id]') ?>
-                        <?= Html::hiddenInput('CityStoreParams[territorial_manager]') ?>
-                        <?= Html::label('Название', null); ?>
-                        <?= Html::tag('span', null, ['id' => 'store-name', 'class' => 'h5']); ?>
-                    </div>
-                    <div class="col-md-4">
-                        <?= Html::dropDownList('CityStoreParams[store_type]', null, [], ['prompt' => 'Тип магазина', 'class' => 'form-select', 'id' => 'store-type']); ?>
-                        <?= Html::a('Редактировать', [Url::to('/store-type')], ['class' => 'd-block mt-2 text-decoration-none']); ?>
-                    </div>
-                    <div class="col-md-3">
-                        <?= Html::dropDownList('CityStoreParams[bush_id]', null, [], ['prompt' => 'Номер куста', 'class' => 'form-select', 'id' => 'store-type']); ?>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-2 py-6">
-                        <?= Html::label('Адрес', null) ?>
-                    </div>
-                    <div class="col-md-3">
-                        <?= Html::label('Регион'); ?>
-                        <?= Html::dropDownList('CityStoreParams[address_region]', null, [], ['prompt' => 'Регион', 'class' => 'form-select', 'id' => 'region']); ?>
-                    </div>
-                    <div class="col-md-3">
-                        <?= Html::label('Город'); ?>
-                        <?= Html::dropDownList('CityStoreParams[address_city]', null, [], ['prompt' => 'Город', 'class' => 'form-select', 'id' => 'city']); ?>
-                    </div>
-                    <div class="col-md-3">
-                        <?= Html::label('Район'); ?>
-                        <?= Html::dropDownList('CityStoreParams[address_district]', null, [], ['prompt' => 'Район', 'class' => 'form-select', 'id' => 'district']); ?>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-2">
-                        <?= Html::label('Территориально управляющий', null); ?>
-                        <?= Html::a('Редактировать', [Url::to('/crud/cluster-admin/')], ['class' => 'd-block mb-5 text-decoration-none']); ?>
-                    </div>
-                    <div class="col-md-9">
-                        <?= Html::tag('span', null, ['id' => 'territorial-manager', 'class' => 'h5']); ?>
-                    </div>
-                </div>
-                <div class="row border-bottom">
-                    <div class="col-md-2">
-                        <?= Html::label('КШФ') ?>
-                    </div>
-                    <div class="col-md-9">
-                        <?= Html::dropDownList('CityStoreParams[bush_chef_florist]', null, [], ['prompt' => 'Кустовой шеф-флорист', 'class' => 'form-select', 'id' => 'bush-chef-florist']); ?>
-                    </div>
-                </div>
-                <div class="row">
-                    <div class="col-md-4">
-                        <?= Html::label('Площадь (M2)', null, ['class' => 'form-label']); ?>
-                        <?= Html::input('text', 'CityStoreParams[store_area]', null, [
-                            'id' => 'store-area',
-                            'class' => 'form-control',
-                            'placeholder' => 'Введите число',
-                            'oninput' => 'validateDecimal(this)'
-                        ]); ?>
-                        <?= Html::label('Витрина (M3)', null, ['class' => 'form-label']); ?>
-                        <?= Html::input('text', 'CityStoreParams[showcase_volume]', null, [
-                            'id' => 'showcase-volume',
-                            'class' => 'form-control',
-                            'placeholder' => 'Введите число',
-                            'oninput' => 'validateDecimal(this)'
-                        ]); ?>
-                        <?= Html::label('Холодильник (M2)', null, ['class' => 'form-label']); ?>
-                        <?= Html::input('text', 'CityStoreParams[freeze_area]', null, [
-                            'id' => 'freeze-area',
-                            'class' => 'form-control',
-                            'placeholder' => 'Введите число',
-                            'oninput' => 'validateDecimal(this)'
-                        ]); ?>
-                        <?= Html::label('Холодильник (M3)', null, ['class' => 'form-label']); ?>
-                        <?= Html::input('text', 'CityStoreParams[freeze_volume]', null, [
-                            'id' => 'freeze-volume',
-                            'class' => 'form-control',
-                            'placeholder' => 'Введите число',
-                            'oninput' => 'validateDecimal(this)'
-                        ]); ?>
-                    </div>
-                    <div class="col-md-8">
-                        <div class="container mt-5">
-                            <?= DualListbox::widget([
-                                'name' => 'CityStoreParams[matrix_type]',
-                                'items' => [],
-                                'options' => [
-                                    'size' => false
-                                ],
-                                'clientOptions' => [
-                                    'id' => 'matrix-type',
-                                    'moveOnSelect' => false,
-                                    'nonSelectedListLabel' => "Тип матрицы <br>" . Html::a('Редактировать', [Url::to('/matrix-type')]),
-                                    'selectedListLabel' => "&nbsp;<br><br>",
-                                    'showFilterInputs' => false,
-                                    'clearButton' => false,
-                                ],
-                            ]); ?>
-                        </div>
-                    </div>
-                    <div class="d-flex justify-content-end">
-                        <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success btn']) ?>
-                    </div>
-                </div>
-            </div>
-        </div>
-        <?php \yii\widgets\ActiveForm::end(); ?>
-    </div>
+<div class="store-index px-3">
+
+    <h1><?= Html::encode($this->title) ?></h1>
+    <?= Html::a('Создать', ['update'], ['class' => 'btn btn-success']) ?>
+
+    <?= GridView::widget([
+        'dataProvider' => $dataProvider,
+        'columns' => [
+            ['class' => 'yii\grid\SerialColumn'],
+            [
+                'attribute' => 'store_id',
+                'value' => function ($data) {
+                    return $data->store->name ?? '';
+                }
+            ],
+            [
+                'attribute' => 'store_type',
+                'value' => function ($data) {
+                    return $data->storeType->name ?? '';
+                }
+            ],
+            [
+                'attribute' => 'address_region',
+                'value' => function ($data) {
+                    return $data->addressRegion->name ?? '';
+                }
+            ],
+            [
+                'attribute' => 'created_by',
+                'value' => function ($data) {
+                    return $data->updatedBy->name_full ?? '';
+                }
+            ],
+            'created_at',
+            [
+                'class' => 'yii\grid\ActionColumn',
+                'template' => '{view} {delete}',
+            ]
+        ],
+        'layout' => '{items}',
+    ]); ?>
 </div>
index 50aedbfe0597face9e7eb19987067df9070dae1b..5a828fbaf0d71fcbcc093f2f56c3a35430cecdca 100644 (file)
 <?php
 
+use kartik\select2\Select2;
+use softark\duallistbox\DualListbox;
+use yii\helpers\ArrayHelper;
 use yii\helpers\Html;
+use yii\helpers\Url;
+use yii_app\records\Admin;
+use yii_app\records\AdminGroup;
+use yii_app\records\MatrixType;
+use yii_app\records\StoreCityList;
+use yii_app\records\StoreType;
 
 /* @var $this yii\web\View */
-/* @var $model app\models\CityStoreParams */
+/* @var $dataProvider yii\data\ActiveDataProvider */
 
-$this->title = 'Update City Store Param: ' . $model->id;
-$this->params['breadcrumbs'][] = ['label' => 'City Store Params', 'url' => ['index']];
+$this->title = 'City Store Params';
 $this->params['breadcrumbs'][] = $this->title;
+
+$this->title = "Настройка параметров магазина";
+$this->params['breadcrumbs'][] = $this->title;
+
+$this->registerJsFile('/js/city-store-params/city-store-params.js', ['position' => \yii\web\View::POS_END]);
 ?>
-<div class="city-store-params-update">
 
+<div class="container mt-4 border-bottom">
     <h1><?= Html::encode($this->title) ?></h1>
+    <?= Html::a('Назад', ['index'], ['class' => 'btn btn-primary mb-3']) ?>
 
-    <?= $this->render('_form', [
-        'model' => $model,
-    ]) ?>
-
+    <div class="row">
+        <div class="col-md-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('address_region', null,
+                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_REGION]), 'id', 'name'),
+                    ['prompt' => 'Выберите регион', 'class' => 'form-select', 'id' => 'address_region']);
+                ?>
+                <?= Html::a('Редактировать', [
+                    Url::to('/store-city-list')], ['class' => 'd-block mt-2 text-decoration-none']);
+                ?>
+            </div>
+        </div>
+        <div class="col-md-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('address_city', null,
+                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_CITY]), 'id', 'name'),
+                    ['prompt' => 'Выберите город', 'class' => 'form-select', 'id' => 'address_city']);
+                ?>
+            </div>
+        </div>
+        <div class="col-md-2 border-end border-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('address_district', null,
+                    ArrayHelper::map(StoreCityList::findAll(['type' => StoreCityList::TYPE_DISTRICT]), 'id', 'name'),
+                    ['prompt' => 'Выберите район', 'class' => 'form-select', 'id' => 'address_district']);
+                ?>
+            </div>
+        </div>
+        <div class="col-md-2 border-end border-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('store_type', null,
+                    ArrayHelper::map(StoreType::find()->all(), 'id', 'name'),
+                    ['prompt' => 'Выберите тип магазина', 'class' => 'form-select', 'id' => 'store_type']);
+                ?>
+                <?= Html::a('Редактировать', [\yii\helpers\Url::to('/store-type')], ['class' => 'd-block mt-2 text-decoration-none']); ?>
+            </div>
+        </div>
+        <div class="col-md-2 border-end border-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('territorial_manager', null,
+                    ArrayHelper::map(Admin::findAll(['group_id' => AdminGroup::GROUP_BUSH_DIRECTOR]), 'id', 'name_full'),
+                    ['prompt' => 'Выберите территориального управляющего', 'class' => 'form-select', 'id' => 'territorial_manager']);
+                ?>
+            </div>
+        </div>
+    </div>
+    <div class="row mt-3">
+        <div class="col-md-2"></div>
+        <div class="col-md-2"></div>
+        <div class="col-md-2"></div>
+        <div class="col-md-2 border-end border-2">
+            <div class="card p-3 bg-light shadow-sm">
+                <?= Html::dropDownList('bush_chef_florist', null,
+                    ArrayHelper::map(Admin::findAll(['group_id' => \yii_app\records\AdminGroup::GROUP_BUSH_CHEF_FLORIST]), 'id', 'name_full'),
+                    ['prompt' => 'Выберите кустового шеф флориста', 'class' => 'form-select', 'id' => 'bush_chef_florist']);
+                ?>
+            </div>
+        </div>
+        <div class="col-md-2"></div>
+        <div class="col-md-2 d-flex justify-content-center align-items-center">
+            <div class="card p-45 bg-light shadow-sm w-100">
+                <?= Html::button('Применить', ['class' => 'btn btn-primary w-100', 'id' => 'apply-button']); ?>
+            </div>
+        </div>
+    </div>
+</div>
+<?php $form = \yii\widgets\ActiveForm::begin(); ?>
+<div class="container mt-4">
+    <div class="row">
+        <div class="col-md-3">
+            <?= Html::dropDownList('CityStoreParams[selected_store]', null, [], [
+                'multiple' => true,
+                'size' => 16,
+                'class' => 'form-control',
+                'id' => 'selected-store',
+            ]) ?>
+            <?= Html::button('Редактировать', ['class' => 'btn btn-primary w-100 mt-2 py-1', 'id' => 'edit-button']); ?>
+        </div>
+        <div class="col-md-9">
+            <div class="form-group">
+                <div class="row">
+                    <div class="col-md-4 d-flex align-items-center gap-3">
+                        <?= Html::hiddenInput('CityStoreParams[id]') ?>
+                        <?= Html::hiddenInput('CityStoreParams[store_id]') ?>
+                        <?= Html::hiddenInput('CityStoreParams[territorial_manager]') ?>
+                        <?= Html::label('Название', null); ?>
+                        <?= Html::tag('span', null, ['id' => 'store-name', 'class' => 'h5']); ?>
+                    </div>
+                    <div class="col-md-4">
+                        <?= Html::dropDownList('CityStoreParams[store_type]', null, [], ['prompt' => 'Тип магазина', 'class' => 'form-select', 'id' => 'store-type']); ?>
+                        <?= Html::a('Редактировать', [Url::to('/store-type')], ['class' => 'd-block mt-2 text-decoration-none']); ?>
+                    </div>
+                    <div class="col-md-3">
+                        <?= Html::dropDownList('CityStoreParams[bush_id]', null, [], ['prompt' => 'Номер куста', 'class' => 'form-select', 'id' => 'bush-id']); ?>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-2 py-6">
+                        <?= Html::label('Адрес', null) ?>
+                    </div>
+                    <div class="col-md-3">
+                        <?= Html::label('Регион'); ?>
+                        <?= Html::dropDownList('CityStoreParams[address_region]', null, [], ['prompt' => 'Регион', 'class' => 'form-select', 'id' => 'region']); ?>
+                    </div>
+                    <div class="col-md-3">
+                        <?= Html::label('Город'); ?>
+                        <?= Html::dropDownList('CityStoreParams[address_city]', null, [], ['prompt' => 'Город', 'class' => 'form-select', 'id' => 'city']); ?>
+                    </div>
+                    <div class="col-md-3">
+                        <?= Html::label('Район'); ?>
+                        <?= Html::dropDownList('CityStoreParams[address_district]', null, [], ['prompt' => 'Район', 'class' => 'form-select', 'id' => 'district']); ?>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-2">
+                        <?= Html::label('Территориально управляющий', null); ?>
+                        <?= Html::a('Редактировать', [Url::to('/crud/cluster-admin/')], ['class' => 'd-block mb-5 text-decoration-none']); ?>
+                    </div>
+                    <div class="col-md-9">
+                        <?= Html::tag('span', null, ['id' => 'territorial-manager', 'class' => 'h5']); ?>
+                    </div>
+                </div>
+                <div class="row border-bottom">
+                    <div class="col-md-2">
+                        <?= Html::label('КШФ') ?>
+                    </div>
+                    <div class="col-md-9">
+                        <?= Html::dropDownList('CityStoreParams[bush_chef_florist]', null, [], ['prompt' => 'Кустовой шеф-флорист', 'class' => 'form-select', 'id' => 'bush-chef-florist']); ?>
+                    </div>
+                </div>
+                <div class="row">
+                    <div class="col-md-4">
+                        <?= Html::label('Площадь (M2)', null, ['class' => 'form-label']); ?>
+                        <?= Html::input('text', 'CityStoreParams[store_area]', null, [
+                            'id' => 'store-area',
+                            'class' => 'form-control',
+                            'placeholder' => 'Введите число',
+                            'oninput' => 'validateDecimal(this)'
+                        ]); ?>
+                        <?= Html::label('Витрина (M3)', null, ['class' => 'form-label']); ?>
+                        <?= Html::input('text', 'CityStoreParams[showcase_volume]', null, [
+                            'id' => 'showcase-volume',
+                            'class' => 'form-control',
+                            'placeholder' => 'Введите число',
+                            'oninput' => 'validateDecimal(this)'
+                        ]); ?>
+                        <?= Html::label('Холодильник (M2)', null, ['class' => 'form-label']); ?>
+                        <?= Html::input('text', 'CityStoreParams[freeze_area]', null, [
+                            'id' => 'freeze-area',
+                            'class' => 'form-control',
+                            'placeholder' => 'Введите число',
+                            'oninput' => 'validateDecimal(this)'
+                        ]); ?>
+                        <?= Html::label('Холодильник (M3)', null, ['class' => 'form-label']); ?>
+                        <?= Html::input('text', 'CityStoreParams[freeze_volume]', null, [
+                            'id' => 'freeze-volume',
+                            'class' => 'form-control',
+                            'placeholder' => 'Введите число',
+                            'oninput' => 'validateDecimal(this)'
+                        ]); ?>
+                    </div>
+                    <div class="col-md-8">
+                        <div class="container mt-5">
+                            <?= Html::label('Тип матрицы')?>
+                            <?= Html::a('Редактировать', [Url::to('/matrix-type')], ['class' => 'd-block mb-5 text-decoration-none']); ?>
+                            <?= Select2::widget([
+                                'name' => 'CityStoreParams[matrix_type]',
+                                'data' => [],
+                                'language' => 'ru-RU',
+                                'options' => [
+                                        'id' => 'matrix-type',
+                                    'placeholder' => 'Выберите тип матрицы',
+                                    'multiple' => true,
+                                ],
+                            ]); ?>
+                        </div>
+                    </div>
+                    <div class="d-flex justify-content-end">
+                       <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <?php \yii\widgets\ActiveForm::end(); ?>
+    </div>
 </div>
index dbf9c58e373e6691ebac88745d65901185b5de07..b1827c0411465d6f2747412eade7207c5e335cdb 100644 (file)
 use yii\helpers\Html;
 use yii\widgets\DetailView;
 use yii\widgets\ActiveForm;
+use yii_app\records\MatrixType;
 
 /* @var $this yii\web\View */
 /* @var $model yii_app\records\CityStoreParams */
 
-$this->title = "Параметры магазина: " . $model->store_id;
+$this->title = "Параметры магазина# " . $model->store_id;
 $this->params['breadcrumbs'][] = ['label' => 'Параметры магазинов', 'url' => ['index']];
 $this->params['breadcrumbs'][] = $this->title;
 ?>
 
-<div class="city-store-params-view">
+<div class="city-store-params-view px-2">
 
     <h1><?= Html::encode($this->title) ?></h1>
+    <?= Html::a('Назад', ['index'], ['class' => 'btn btn-primary']) ?>
+    <?= Html::a('Редактировать', ['update'], ['class' => 'btn btn-warning']) ?>
 
-    <!-- Данные о параметрах магазина -->
-    <div class="panel panel-default">
+    <div class="panel panel-default mt-3">
         <div class="panel-heading">Детали параметров магазина</div>
         <div class="panel-body">
             <?= DetailView::widget([
                 'model' => $model,
                 'attributes' => [
                     'id',
-                    'store_id',
-                    'stores_type',
-                    'address_city',
-                    'address_region',
-                    'address_district',
-                    'territorial_manager',
-                    'bush_chef_florist',
+                    [
+                        'attribute' => 'store_id',
+                        'value' => function ($data) {
+                            return $data->store->name ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'store_type',
+                        'value' => function ($data) {
+                            return $data->storeType->name ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'address_city',
+                        'value' => function ($data) {
+                            return $data->addressCity->name ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'address_region',
+                        'value' => function ($data) {
+                            return $data->addressRegion->name ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'address_district',
+                        'value' => function ($data) {
+                            return $data->addressDistrict->name ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'territorial_manager',
+                        'value' => function ($data) {
+                            return $data->territorialManager->name_full ?? '';
+                        }
+                    ],
+                    [
+                        'attribute' => 'bush_chef_florist',
+                        'value' => function ($data) {
+                            return $data->bushChefFlorist->name_full ?? '';
+                        }
+                    ],
                     'store_area',
                     'showcase_volume',
                     'freeze_area',
                     'freeze_volume',
-                    'matrix_type',
-                    'created_by',
+                    [
+                        'attribute' => 'matrix_type',
+                        'value' => function ($data) {
+                            return implode(', ', MatrixType::find()
+                                ->select('name')
+                                ->where(['id' => explode(',', $data->matrix_type)])
+                                ->column());
+                        }
+                    ],
+                    [
+                        'attribute' => 'created_by',
+                        'value' => function ($data) {
+                            return $data->updatedBy->name_full ?? '';
+                        }
+                    ],
                     'created_at',
-                    'updated_by',
+                    [
+                        'attribute' => 'updated_by',
+                        'value' => function ($data) {
+                            return $data->updatedBy->name_full ?? '';
+                        }
+                    ],
                     'updated_at',
                 ],
             ]) ?>
         </div>
     </div>
-
-    <p>
-        <?= Html::a('Редактировать', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
-        <?= Html::a('Удалить', ['delete', 'id' => $model->id], [
-            'class' => 'btn btn-danger',
-            'data' => [
-                'confirm' => 'Вы уверены, что хотите удалить этот параметр магазина?',
-                'method' => 'post',
-            ],
-        ]) ?>
-    </p>
-
 </div>
index df5ec9c9cc5fe27353607cecb6c49b538fbc37d4..f68a1a7906202943ac3470d1c371258dba8f28c9 100644 (file)
@@ -31,6 +31,27 @@ $('#apply-button').on('click', function () {
 $('#edit-button').on('click', function () {
     getData()
 });
+
+$('#bush-id').on('change', function () {
+    var bushId = $(this).val();  // Получаем значение выбранного bushId
+
+    $.ajax({
+        url: '/city-store-params/get-territorial-manager',
+        type: 'GET',
+        data: { bushId: bushId },  // Передаем bushId как часть массива
+        success: function (response) {
+            var data = response.data;
+
+            $('#territorial-manager').text(data.territorialManager);
+            $('input[name="CityStoreParams[territorial_manager]"]').val(data.territorialManagerId);
+        },
+        error: function (xhr, status, error) {
+            console.error("Ошибка AJAX: " + error);
+            alert("Произошла ошибка при отправке данных.");
+        }
+    });
+});
+
 function getData() {
     var formData = {
         selected_store: $('#selected-store').val(),
@@ -43,19 +64,14 @@ function getData() {
         success: function (response) {
             var data = response.data;
 
-            // Заполнение других полей
             $('#store-area').val(data.storeArea);
             $('#showcase-volume').val(data.showcaseVolume);
             $('#freeze-area').val(data.freezeArea);
             $('#freeze-volume').val(data.freezeVolume);
-            $('#store-name').text(data.name);
-            $('#territorial-manager').text(data.territorialManagerId ? getNameFromArray(data.territorialManagerId, data.bushChefFloristArray) : '');
-            $('#bush-chef-florist').text(data.bushChefFloristId ? getNameFromArray(data.bushChefFloristId, data.bushChefFloristArray) : '');
+            $('#store-name').text(data.name);$('#bush-chef-florist').text(data.bushChefFloristId ? getNameFromArray(data.bushChefFloristId, data.bushChefFloristArray) : '');
             $('input[name="CityStoreParams[id]"]').val(data.id);
             $('input[name="CityStoreParams[store_id]"]').val(data.storeId);
             $('input[name="CityStoreParams[territorial_manager]"]').val(data.territorialManagerId);
-
-            $('#store_type').val(data.type);
             $('#region').val(data.region);
             $('#city').val(data.city);
             $('#district').val(data.district);
@@ -66,8 +82,8 @@ function getData() {
             populateSelect('#city', data.cityArray, data.city);
             populateSelect('#district', data.districtArray, data.district);
             populateSelect('#bush-chef-florist', data.bushChefFloristArray, data.bushChefFloristId);
+            populateSelect('#bush-id', data.bushArray, data.bushId);
 
-            // Заполнение DualListbox
             populateDualListbox(data.matrixTypeArray, data.matrixType); // matrixTypeArray и matrixType передаются с сервера
         },
         error: function (xhr, status, error) {
@@ -102,36 +118,32 @@ function populateSelect(selector, values, selectedValue = null) {
     }
 }
 
-// Функция для заполнения DualListbox
-function populateDualListbox(matrixTypeArray, selectedValues) {
-    var $nonSelectedList = $('#bootstrap-duallistbox-nonselected-list_CityStoreParams\\[matrix_type\\]');
-    var $selectedList = $('#bootstrap-duallistbox-selected-list_CityStoreParams\\[matrix_type\\]');
+function populateDualListbox(matrixTypeArray, matrixType) {
+    var select = $('#matrix-type');
+    if (!select.hasClass('select2-hidden-accessible')) {
+        select.select2({
+            placeholder: 'Выберите тип матрицы',
+            multiple: true
+        });
+    }
+    var selectData = Object.keys(matrixTypeArray).map(function (key) {
+        return {
+            id: key,
+            text: matrixTypeArray[key]
+        };
+    });
+
+    select.empty().select2({ data: selectData });
+
+    select.val(matrixType).trigger('change');
+}
+
+
+
+
 
-    console.log("Matrix Type Array:", matrixTypeArray); // Отладка
-    console.log("Selected Values:", selectedValues); // Отладка
 
-    // Очистить оба списка
-    $nonSelectedList.empty();
-    $selectedList.empty();
 
-    // Заполняем список невыбранных значений (non-selected list)
-    $.each(matrixTypeArray, function (key, value) {
-        $nonSelectedList.append('<option value="' + key + '">' + value + '</option>');
-    });
 
-    // Если есть выбранные значения, добавляем их в список выбранных (selected list)
-    if (selectedValues && selectedValues.length > 0) {
-        selectedValues.forEach(function (selectedId) {
-            $selectedList.append('<option value="' + selectedId + '">' + matrixTypeArray[selectedId] + '</option>');
-        });
-    }
 
-    // Обновляем состояние виджета, вызываем trigger и возможно init для перерисовки
-    $nonSelectedList.trigger('change');
-    $selectedList.trigger('change');
 
-    // Повторно инициализируем виджет DualListbox, если это необходимо
-    if (typeof $('#matrix-type').bootstrapDualListbox === 'function') {
-        $('#matrix-type').bootstrapDualListbox('refresh'); // или аналогичная функция обновления
-    }
-}