]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-282 Нужно сделать интерфейс настройки магазина
authormarina <m.zozirova@gmail.com>
Mon, 27 Jan 2025 12:03:52 +0000 (15:03 +0300)
committermarina <m.zozirova@gmail.com>
Mon, 27 Jan 2025 12:03:52 +0000 (15:03 +0300)
erp24/controllers/CityStoreParamsController.php
erp24/records/CityStoreParams.php
erp24/views/city-store-params/index.php
erp24/web/js/city-store-params/city-store-params.js

index a0ed126c007605b499e9015d0b1ced7f1ae5e5db..6f72e37667bd46835cdf5111fa007e8744db0bad 100644 (file)
@@ -57,20 +57,38 @@ class CityStoreParamsController extends Controller
 
     public function actionIndex()
     {
-        $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->matrix_type = is_array($model->matrix_type) ? implode(',', $model->matrix_type) : $model->matrix_type;
+        $flash = 'info';
+        $value = 'Для редактирования необходимо выбрать магазин!';
+        if (Yii::$app->request->post()) {
+            $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->matrix_type = is_array($model->matrix_type) ? implode(',', $model->matrix_type) : $model->matrix_type;
+            }
+
+            if ($model->validate()) {
+                if ($model->save()) {
+                    $flash = 'success';
+                    $value = 'Новая запись успешно создана.';
+                    $selected_store = $model->id;
+                }
+            } else {
+                $flash = 'danger';
+                $value = 'Ошибка при сохранении: ' . implode('. ', array_map(function ($error) {
+                        return is_array($error) ? implode(', ', $error) : $error;
+                    }, $model->getErrors()));
+
+            }
         }
 
-        if ($model->validate()) {
-            $model->save();
-            return $this->redirect(['view', 'id' => $model->id]);
-        }
+        Yii::$app->session->setFlash($flash, $value);
 
-        return $this->render('index');
+        return $this->render('index', [
+            'select_store' => $selected_store ?? null,
+            'flash' => $flash
+        ]);
     }
 
     /**
@@ -149,7 +167,6 @@ class CityStoreParamsController extends Controller
         if (!$store) return ['success' => false, 'message' => 'Магазин не найден'];
 
         $bushId = StoreDynamic::findOne(['store_id' => $storeId, 'category' => 1, 'active' => 1])->value_int ?? null;
-        $territorialManagerId = ClusterAdmin::findOne(['active' => 1, 'cluster_id' => $bushId])->admin_id ?? null;
 
         return [
             'success' => true,
@@ -161,17 +178,15 @@ class CityStoreParamsController extends Controller
                 'region' => $params->address_region ?? $store->region ?? null,
                 'city' => $params->address_city ?? $store->city ?? null,
                 'district' => $params->address_district ?? $store->district ?? null,
-                'territorialManagerId' => $territorialManagerId,
-                'territorialManager' => !empty($territorialManagerId) ? Admin::findOne($territorialManagerId)->name_full : null,
+                'territorialManager' => $params->territorial_manager ?? StoreDynamic::findOne(['active' => 1, 'category' => 3])->value_int ?? null,
                 'bushChefFloristId' => $params->bush_chef_florist ?? StoreDynamic::findOne(['store_id' => $storeId, 'active' => 1, 'category' => 2])->value_int ?? null,
                 'storeArea' => $params->store_area ?? null,
                 'showcaseVolume' => $params->showcase_volume ?? null,
                 'freezeArea' => $params->freeze_area ?? null,
                 'freezeVolume' => $params->freeze_volume ?? null,
                 'matrixType' => !empty($params->matrix_type) ? explode(',', $params->matrix_type) : null,
-                'bushId' => $bushId,
+                'territorialManagerArray' => ArrayHelper::map(Admin::findAll(['id' => StoreDynamic::find()->andWhere(['category' => 3, 'active' => 1])->select('value_int')->column()]), 'id', 'name'),
                 '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'),
@@ -185,7 +200,6 @@ class CityStoreParamsController extends Controller
     {
         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;
 
index 3c991112178af31795574cdcff958ae925eb1630..ec16b3c7c7a81a246ac388ca8df7bc05068a7c04 100644 (file)
@@ -29,7 +29,6 @@ use yii\filters\VerbFilter;
  * @property string $created_at
  * @property int|null $updated_by
  * @property string|null $updated_at
- * @property int $bush_id
  */
 class CityStoreParams extends ActiveRecord
 {
@@ -65,7 +64,7 @@ class CityStoreParams extends ActiveRecord
     {
         return [
             [['store_id'], 'required'],
-            [['store_id', 'store_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'], 'integer'],
             [['store_area', 'showcase_volume', 'freeze_area', 'freeze_volume'], 'number'],
             [['created_at', 'updated_at'], 'safe'],
             [['address_city', 'address_region', 'address_district', 'matrix_type'], 'string'],
@@ -91,7 +90,6 @@ class CityStoreParams extends ActiveRecord
             'freeze_area' => 'Площадь холодильника',
             'freeze_volume' => 'Объем холодильника',
             'matrix_type' => 'Тип матрицы',
-            'bush_id' => 'ИД куста',
             'created_by' => 'ИД создателя',
             'created_at' => 'Дата создания',
             'updated_by' => 'ИД редактировавшего',
@@ -138,8 +136,4 @@ class CityStoreParams extends ActiveRecord
     public function getAddressCity() {
         return $this->hasOne(StoreCityList::class, ['id' => 'address_city']);
     }
-
-    public function getBush() {
-        return $this->hasOne(ClusterAdmin::class, ['id' => 'bush_id']);
-    }
 }
index b923ae26132f03a71dac22347489b22bc6ead1b8..bfe23c8aeef03f93d728897514b59f3e8f5e9e32 100644 (file)
@@ -75,6 +75,7 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
         <div class="col-md-2"></div>
         <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,
@@ -83,7 +84,6 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
                 ?>
             </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']); ?>
@@ -95,7 +95,7 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
 <div class="container mt-4">
     <div class="row">
         <div class="col-md-3">
-            <?= Html::dropDownList('CityStoreParams[selected_store]', null,
+            <?= Html::dropDownList('selected_store', $select_store,
                 ArrayHelper::map(CityStore::find()->where(['visible' => CityStore::IS_VISIBLE])->orderBy('id')->all(), 'id', function ($store) {
                     return $store->id . ' ' . $store->name;
                 }),
@@ -108,22 +108,24 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
             <?= Html::button('Редактировать', ['class' => 'btn btn-primary w-100 mt-2 py-1', 'id' => 'edit-button']); ?>
         </div>
         <div class="col-md-9">
+            <?php if (Yii::$app->session->hasFlash($flash)): ?>
+                <?= Html::tag('div', Yii::$app->session->getFlash($flash), [
+                    'class' => 'alert text-center alert-' . Html::encode($flash),
+                ]) ?>
+            <?php endif; ?>
             <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::label('Тип магазина', null); ?>
                         <?= 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">
@@ -148,10 +150,10 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
                         <?= 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']); ?>
+                        <?= Html::dropDownList('CityStoreParams[territorial_manager]', null, [], ['prompt' => 'Территориально управляющий', 'class' => 'form-select', 'id' => 'territorial-manager']); ?>
                     </div>
                 </div>
-                <div class="row border-bottom">
+                <div class="row border-bottom pb-2">
                     <div class="col-md-2">
                         <?= Html::label('КШФ') ?>
                     </div>
@@ -160,61 +162,87 @@ $this->registerJsFile('/js/city-store-params/city-store-params.js', ['position'
                     </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 class="col-md-6">
+                        <?= Html::label('Параметры', null, ['class' => 'fs-6 pt-3']); ?>
+                    </div>
+                    <div class="col-md-6">
+                        <?= Html::label('Тип матрицы', null, ['class' => 'fs-6 pt-3 mb-1']); ?>
+                        <?= Html::a('Редактировать', [Url::to('/matrix-type')], ['class' => 'd-block text-decoration-none']); ?>
                     </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 class="row">
+                    <div class="col-md-6">
+                        <div class="row py-1">
+                            <div class="col-md-4">
+                                <?= Html::label('Площадь (M2)', null, ['class' => ['pt-2']]); ?>
+                            </div>
+                            <div class="col-md-5">
+                                <?= Html::input('text', 'CityStoreParams[store_area]', null, [
+                                    'id' => 'store-area',
+                                    'class' => 'form-control',
+                                    'placeholder' => 'Введите число',
+                                    'oninput' => 'validateDecimal(this)'
+                                ]); ?>
+                            </div>
+                        </div>
+                        <div class="row py-1">
+                            <div class="col-md-4">
+                                <?= Html::label('Витрина (M3)', null, ['class' => ['pt-2']]); ?>
+                            </div>
+                            <div class="col-md-5">
+                                <?= Html::input('text', 'CityStoreParams[showcase_volume]', null, [
+                                    'id' => 'showcase-volume',
+                                    'class' => 'form-control',
+                                    'placeholder' => 'Введите число',
+                                    'oninput' => 'validateDecimal(this)'
+                                ]); ?>
+                            </div>
+                        </div>
+                        <div class="row py-1">
+                            <div class="col-md-4">
+                                <?= Html::label('Холодильник (M2)', null, ['class' => ['pt-2']]); ?>
+                            </div>
+                            <div class="col-md-5">
+                                <?= Html::input('text', 'CityStoreParams[freeze_area]', null, [
+                                    'id' => 'freeze-area',
+                                    'class' => 'form-control',
+                                    'placeholder' => 'Введите число',
+                                    'oninput' => 'validateDecimal(this)'
+                                ]); ?>
+                            </div>
+                        </div>
+                        <div class="row py-1">
+                            <div class="col-md-4">
+                                <?= Html::label('Холодильник (M3)', null, ['class' => ['pt-2']]); ?>
+                            </div>
+                            <div class="col-md-5">
+                                <?= Html::input('text', 'CityStoreParams[freeze_volume]', null, [
+                                    'id' => 'freeze-volume',
+                                    'class' => 'form-control',
+                                    'placeholder' => 'Введите число',
+                                    'oninput' => 'validateDecimal(this)'
+                                ]); ?>
+                            </div>
                         </div>
                     </div>
-                    <div class="d-flex justify-content-end">
-                        <?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
+                    <div class="col-md-4">
+                        <?= 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 d-none px-8', 'id' => 'save-button']) ?>
+                </div>
             </div>
         </div>
-        <?php \yii\widgets\ActiveForm::end(); ?>
     </div>
+    <?php \yii\widgets\ActiveForm::end(); ?>
 </div>
index 158c80140387a91993ff953cf07b01d650cf3531..fa0a55a5864121094b5b34636a4faafe83937e78 100644 (file)
@@ -32,26 +32,6 @@ $('#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(),
@@ -68,23 +48,24 @@ function getData() {
             $('#showcase-volume').val(data.showcaseVolume);
             $('#freeze-area').val(data.freezeArea);
             $('#freeze-volume').val(data.freezeVolume);
-            $('#store-name').text(data.name);$('#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);
             $('#region').val(data.region);
             $('#city').val(data.city);
             $('#district').val(data.district);
             $('#territorial-manager').text(data.territorialManager);
 
-            populateSelect('#store-type', data.storeTypeArray, data.type);
-            populateSelect('#region', data.regionArray, data.region);
-            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);
+            populateSelect('#store-type', data.storeTypeArray, data.type, 'Тип магазина');
+            populateSelect('#region', data.regionArray, data.region, 'Регион');
+            populateSelect('#city', data.cityArray, data.city, 'Город');
+            populateSelect('#district', data.districtArray, data.district, 'Район');
+            populateSelect('#bush-chef-florist', data.bushChefFloristArray, data.bushChefFloristId, 'Кустовой шеф-флорист');
+            populateSelect('#territorial-manager', data.territorialManagerArray, data.territorialManager, 'Территориально управляющий');
+            populateDualListbox(data.matrixTypeArray, data.matrixType);
 
-            populateDualListbox(data.matrixTypeArray, data.matrixType); // matrixTypeArray и matrixType передаются с сервера
+            $('#save-button').removeClass('d-none');
         },
         error: function (xhr, status, error) {
             console.error("Ошибка AJAX: " + error);
@@ -97,13 +78,13 @@ function getNameFromArray(id, array) {
     return array[id] || '';
 }
 
-function populateSelect(selector, values, selectedValue = null) {
+function populateSelect(selector, values, selectedValue = null, defaultText = 'Выберите значение') {
     var select = $(selector);
     select.empty();
 
     select.append($('<option>', {
         value: '',
-        text: 'Выберите значение',
+        text: defaultText,
     }));
 
     $.each(values, function (key, value) {
@@ -122,7 +103,7 @@ function populateDualListbox(matrixTypeArray, matrixType) {
     var select = $('#matrix-type');
     if (!select.hasClass('select2-hidden-accessible')) {
         select.select2({
-            placeholder: 'Ð\92Ñ\8bбеÑ\80иÑ\82е Ñ\82ип матрицы',
+            placeholder: 'Тип матрицы',
             multiple: true
         });
     }
@@ -133,8 +114,7 @@ function populateDualListbox(matrixTypeArray, matrixType) {
         };
     });
 
-    select.empty().select2({ data: selectData });
-
+    select.empty().select2({data: selectData});
     select.val(matrixType).trigger('change');
 }
 
@@ -148,6 +128,13 @@ function validateDecimal(input) {
 }
 
 
+$(document).ready(function () {
+    var selectedValues = $('#selected-store').val();
+    if (selectedValues && selectedValues.length > 0) {
+        $('#edit-button').click();
+    }
+    $('#text-info').text('Для редактирования выберите магазин!').addClass('text-danger')
+})