]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Добавление кнопок архивации
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 9 Sep 2025 13:21:08 +0000 (16:21 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 9 Sep 2025 13:21:08 +0000 (16:21 +0300)
erp24/controllers/MatrixBouquetActualityController.php
erp24/views/matrix-bouquet-actuality/index.php

index 4256f036abffc3d6946993908784a5909c463381..6468a78f98269177fe4181f68a0fd99335534ded 100644 (file)
@@ -13,10 +13,7 @@ use yii\web\Controller;
 use yii\web\NotFoundHttpException;
 use yii\filters\VerbFilter;
 use yii_app\records\MatrixType;
-use yii_app\records\Products1cAdditionalCharacteristics;
-use yii_app\records\Products1cNomenclature;
-use yii_app\records\Products1cNomenclatureActuality;
-use yii_app\records\Products1cPropType;
+
 
 /**
  * MatrixBouquetActualityController implements the CRUD actions for MatrixBouquetActuality model.
@@ -198,22 +195,38 @@ class MatrixBouquetActualityController extends Controller
                 }]);
             }
 
+            $bouquets = $query->orderBy(['bc.name' => SORT_ASC])->all();
+
+            $rows = [];
+            foreach ($bouquets as $bouquet) {
+                $acts = $bouquet->actualities;
+                if ($acts) {
+                    foreach ($acts as $act) {
+                        $rows[] = [
+                            'product' => $bouquet,
+                            'actuality' => $act,
+                        ];
+                    }
+                } else {
+                    $rows[] = [
+                        'product' => $bouquet,
+                        'actuality' => null,
+                    ];
+                }
+            }
+
 
-            $dataProvider = new ActiveDataProvider([
-                'query' => $query->orderBy(['bc.name' => SORT_ASC]),
-                'pagination' => ['pageSize' => 100],
+            $dataProvider = new \yii\data\ArrayDataProvider([
+                'allModels' => $rows,
+                'pagination' => ['pageSize' => 1000],
                 'sort' => [
                     'attributes' => [
-                        'name' => [
-                            'asc'  => ['bc.name' => SORT_ASC],
-                            'desc' => ['bc.name' => SORT_DESC],
-                        ],
-                        'price' => [
-                            'asc'  => ['price' => SORT_ASC],
-                            'desc' => ['price' => SORT_DESC],
-                        ],
+                        'product.name',
+                        'product.price',
+                        'actuality.date_from',
+                        'actuality.date_to'
                     ],
-                    'defaultOrder' => ['name' => SORT_ASC],
+                    'defaultOrder' => ['product.name' => SORT_ASC],
                 ],
             ]);
         }
@@ -232,7 +245,7 @@ class MatrixBouquetActualityController extends Controller
             ->andWhere(['<>', 'deleted', 1])
             ->orderBy(['name' => SORT_ASC])
             ->asArray()->all();
-        var_dump($dataProvider);die();
+
         return $this->render('index', [
             'filter'       => $filter,
             'dataProvider' => $dataProvider,
index db2dfaccf31524e73c5cea0a8ddb91ade2fa855f..26c733a63bb0399243ab31381941caedcdd35295 100644 (file)
@@ -10,6 +10,8 @@ use yii_app\records\Products1cNomenclatureActuality;
 /* @var $this yii\web\View */
 /* @var $filter yii\base\DynamicModel */
 /* @var $dataProvider yii\data\ActiveDataProvider */
+/* @var $groups array */
+/* @var $subgroups array */
 
 
 $this->title = 'Актуализация букетов';
@@ -36,9 +38,17 @@ $monthOptions = '';
 foreach ($months as $k => $v) {
     $monthOptions .= "<option value=\"$k\">$v</option>";
 }
+
+$subgroupItems = [];
+$subgroupOptionAttrs = [];
+foreach ($subgroups as $sg) {
+    $id = (string)$sg['id'];
+    $subgroupItems[$id] = $sg['name'];
+    $subgroupOptionAttrs[$id] = ['data-parent' => (string)$sg['parent_id']];
+}
 ?>
 
-<div class="products1c-nomenclature-actuality-index p-4">
+<div class="matrix-bouquet-actuality-index p-4">
 
     <h1><?= Html::encode($this->title) ?></h1>
 
@@ -57,8 +67,8 @@ foreach ($months as $k => $v) {
             <div class="row mb-3">
                 <div class="col">
                     <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'category', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $categories,
+                        <?= $formFilter->field($filter, 'group_id', ['options' => ['class' => 'w-90']])->dropDownList(
+                            $groups,
                             ['prompt' => 'Категория', 'id' => 'filter-category']
                         )->label(false) ?>
 
@@ -67,37 +77,21 @@ foreach ($months as $k => $v) {
                         </div>
                     </div>
                 </div>
-                <div class="col">
-                    <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'type', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $types,
-                            ['prompt' => 'Тип', 'id' => 'filter-type']
-                        )->label(false) ?>
 
-                        <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-type" >
-                            <i class="fa fa-times"></i>
-                        </div>
-                    </div>
-                </div>
-                <div class="col">
-                    <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'color', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $colors,
-                            ['prompt' => 'Цвет', 'id' => 'filter-color']
-                        )->label(false) ?>
 
-                        <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-color" >
-                            <i class="fa fa-times"></i>
-                        </div>
-                    </div>
-                </div>
             </div>
             <div class="row mb-3">
                 <div class="col">
                     <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'subcategory', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $subcategories,
-                            ['prompt' => 'Подкатегория', 'id' => 'filter-subcategory', 'class' => 'w-100']
+                        <?= $formFilter->field($filter, 'subgroup_id', ['options' => ['class' => 'w-90']])
+                            ->dropDownList(
+                            $subgroupItems,
+                            [
+                                'prompt'  => 'Подкатегория',
+                                'id'      => 'filter-subcategory',
+                                'class'   => 'w-100',
+                                'options' => $subgroupOptionAttrs,
+                            ]
                         )->label(false) ?>
 
                         <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-subcategory" >
@@ -105,42 +99,12 @@ foreach ($months as $k => $v) {
                         </div>
                     </div>
                 </div>
-                <div class="col">
-                    <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'sort', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $sorts,
-                            ['prompt' => 'Сорт', 'id' => 'filter-sort']
-                        )->label(false) ?>
-                        <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-sort" >
-                            <i class="fa fa-times"></i>
-                        </div>
-                    </div>
-                </div>
+
                 <div class="col"></div>
             </div>
             <div class="row">
-                <div class="col">
-                    <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'species', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $species,
-                            ['prompt' => 'Вид', 'id' => 'filter-species']
-                        )->label(false) ?>
-                        <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-species" >
-                            <i class="fa fa-times"></i>
-                        </div>
-                    </div>
-                </div>
-                <div class="col">
-                    <div class="d-flex justify-content-between">
-                        <?= $formFilter->field($filter, 'size', ['options' => ['class' => 'w-90']])->dropDownList(
-                            $sizes,
-                            ['prompt' => 'Размер', 'id' => 'filter-size']
-                        )->label(false) ?>
-                        <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-size" >
-                            <i class="fa fa-times"></i>
-                        </div>
-                    </div>
-                </div>
+
+
                 <div class="col"></div>
             </div>
         </div>
@@ -201,26 +165,17 @@ foreach ($months as $k => $v) {
         <div class="col-2 ps-4" style="border-left: #ccc solid 1px">
             <div class="mb-2 fw-bold">Поставщики</div>
             <div class="mb-3">
+                <?= $formFilter->field($filter, 'is_archive')->checkbox([
+                    'label' => 'Архивные',
+                    'uncheck' => 0,
+                    'checked' => (bool)$filter->is_archive,
+                    'id' => 'isArchiveCheckbox'
+                ])->label(false) ?>
 
-                <div class="input-group">
-                    <?= Html::dropDownList('supplier', null,
-                        ['Астра','Бифлористика'],
-                        ['class' => 'form-select', 'id' => 'filter-supplier', 'prompt' => 'Поставщик']) ?>
-                    <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-supplier" >
-                        <i class="fa fa-times"></i>
-                    </div>
-                </div>
             </div>
             <div class="mb-4">
 
-                <div class="input-group">
-                    <?= Html::dropDownList('plantation', null,
-                        ['Плантация1','Плантация2'],
-                        ['class' => 'form-select', 'id' => 'filter-plantation', 'prompt' => 'Плантация']) ?>
-                    <div class="mb-4 ms-1 d-flex justify-content-center align-items-center  clear-btn" data-target="filter-plantation" >
-                        <i class="fa fa-times"></i>
-                    </div>
-                </div>
+
             </div>
 
         </div>
@@ -259,16 +214,16 @@ foreach ($months as $k => $v) {
                 'value' => function ($row, $key, $index) {
                     $product = $row['product'];
                     $name = Html::encode($product->name . ' (' . $product->id . ')');
-                    $btn = Html::button('+ Добавить интервал', [
-                        'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
-                        'type' => 'button',
-                        'title' => 'Добавить интервал',
-                        'data-guid' => $product->id,
-                        'data-name' => $product->name,
-                    ]);
-                    return '<div class="d-flex justify-content-between">' . $name . $btn . '</div>';
+
+                    return '<div class="d-flex justify-content-between">' . $name . '</div>';
                 }
             ],
+            [
+                'attribute' => 'price',
+                'label' => 'Цена',
+                'value' => function($row) { return $row['price']; },
+                'format' => ['decimal', 2],
+            ],
             [
                 'label' => 'Актуальность ассортимента',
                 'format' => 'raw',
@@ -306,33 +261,29 @@ foreach ($months as $k => $v) {
                 }
             ],
             [
-                'label' => 'Склад NN',
+                'label' => 'УпÑ\80авление',
                 'format' => 'raw',
-                'contentOptions' => ['style'=>'width:60px; text-align:center;'],
-                'value' => function ($m, $k, $i) use ($filter){
-                    return Html::checkbox("actuality[$i][warehouse_nn]", false, [
-
+                'contentOptions' => ['style'=>'width:160px; text-align:center;'],
+                'value' => function ($row, $key, $index) {
+                    $product = $row['product'];
+                    $btnArchOn = Html::button('+ Добавить интервал', [
+                        'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
+                        'type' => 'button',
+                        'title' => 'Добавить интервал',
+                        'data-guid' => $product->id,
+                        'data-name' => $product->name,
                     ]);
-                }
-            ],
-            [
-                'label' => 'Склад MSK',
-                'format' => 'raw',
-                'contentOptions' => ['style'=>'width:60px; text-align:center;'],
-                'value' => function ($m, $k, $i) use ($filter){
-                    return Html::checkbox("actuality[$i][warehouse_msk]", false, [
-
+                    $btnArchOff = Html::button('+ Добавить интервал', [
+                        'class' => 'btn btn-xs btn-outline-primary ms-2 add-actuality-row',
+                        'type' => 'button',
+                        'title' => 'Добавить интервал',
+                        'data-guid' => $product->id,
+                        'data-name' => $product->name,
                     ]);
+                    return '<div class="d-flex justify-content-between">' . $btnArchOn . $btnArchOff . '</div>';
                 }
             ],
-            [
-                'label' => 'Поставщик/Плантация',
-                'format' => 'text',
-                'contentOptions' => ['style'=>'min-width:150px;'],
-                'value' => function ($m) {
-                    return '–';
-                }
-            ],
+
         ],
     ]); ?>
 
@@ -347,3 +298,58 @@ foreach ($months as $k => $v) {
 
 </div>
 
+<?php
+$js = <<<JS
+(function() {
+  const group = document.getElementById('filter-category');
+  const sub   = document.getElementById('filter-subcategory');
+
+  function filterSubgroups() {
+    const gid = group.value; 
+    const keepSelected = sub.value;
+    let hasVisibleSelected = false;
+
+
+    for (const opt of sub.options) {
+      if (!opt.value) { opt.hidden = false; continue; }
+      const parentId = opt.getAttribute('data-parent');
+      const visible = !gid || parentId === gid; 
+      opt.hidden = !visible;
+      if (visible && opt.value === keepSelected) hasVisibleSelected = true;
+    }
+
+
+    if (!hasVisibleSelected) {
+      sub.value = '';
+    }
+  }
+
+
+  document.querySelectorAll('.clear-btn[data-target]').forEach(btn => {
+    btn.addEventListener('click', () => {
+      const targetId = btn.getAttribute('data-target');
+      const el = document.getElementById(targetId);
+      if (!el) return;
+      el.value = '';
+      el.dispatchEvent(new Event('change'));
+    });
+  });
+
+  // Мьютекс для чекбоксов "Только активные/неактивные" (необязательно, но удобно)
+  const onlyActive    = document.getElementById('onlyActiveCheckbox');
+  const onlyInactive  = document.getElementById('onlyInactiveCheckbox');
+  if (onlyActive && onlyInactive) {
+    onlyActive.addEventListener('change', () => { if (onlyActive.checked) { onlyInactive.checked = false; } });
+    onlyInactive.addEventListener('change', () => { if (onlyInactive.checked) { onlyActive.checked = false; } });
+  }
+
+  group.addEventListener('change', filterSubgroups);
+
+  // Первый проход (на случай когда значения уже выбраны в GET)
+  filterSubgroups();
+})();
+JS;
+
+$this->registerJs($js);
+?>
+