From a14fe3b66b70793917d56e6ac9904d15f6b21a96 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Thu, 7 Aug 2025 13:05:22 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?utf8?q?=D0=B8=D0=B5=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=BE=D0=B2?= =?utf8?q?=20=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D0=BE=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- ...ducts1cNomenclatureActualityController.php | 119 +++++++++--------- erp24/records/Products1cNomenclature.php | 15 +++ .../index.php | 19 ++- 3 files changed, 94 insertions(+), 59 deletions(-) diff --git a/erp24/controllers/Products1cNomenclatureActualityController.php b/erp24/controllers/Products1cNomenclatureActualityController.php index 4ca22482..fd600e7c 100644 --- a/erp24/controllers/Products1cNomenclatureActualityController.php +++ b/erp24/controllers/Products1cNomenclatureActualityController.php @@ -54,6 +54,7 @@ class Products1cNomenclatureActualityController extends Controller 'type','color','sort','size', 'date_from','date_to', ], 'safe'); + $filter->addRule(['onlyActive','onlyInactive'], 'boolean'); $filter->load(Yii::$app->request->get()); @@ -70,8 +71,12 @@ class Products1cNomenclatureActualityController extends Controller 'pagination' => ['pageSize' => 50], 'sort' => ['defaultOrder'=>['name'=>SORT_ASC]], ]); - - + $attrMap = [ + 'type' => ['type', 'тип'], + 'color' => ['цвет', 'color'], + 'sort' => ['sort', 'сорт'], + 'size' => ['size', 'размер'], + ]; $filtersUsed = array_filter([ $filter->category, $filter->subcategory, @@ -82,80 +87,83 @@ class Products1cNomenclatureActualityController extends Controller $filter->size, $filter->date_from, $filter->date_to, + $filter->onlyActive, + $filter->onlyInactive ]); if ($filtersUsed) { $query = Products1cNomenclature::find()->alias('n'); - - foreach (['category','subcategory','species'] as $attr) { + foreach (['category', 'subcategory', 'species'] as $attr) { if ($filter->$attr) { $query->andWhere(["n.$attr" => $filter->$attr]); } } - - if ($filter->date_from || $filter->date_to) { - $query->innerJoin( - Products1cNomenclatureActuality::tableName().' a', - 'a.guid = n.id AND a.active = 1' - ); - - if ($filter->date_from && $filter->date_to) { - $dfObj = \DateTime::createFromFormat('Y-m', $filter->date_from); - $dtObj = \DateTime::createFromFormat('Y-m', $filter->date_to); - $dfObj->setTime(0,0,0); - $dtObj->modify('last day of this month')->setTime(23,59,59); - - $query->andWhere(['<=', 'a.date_from', $dtObj->format('Y-m-d H:i:s')]) - ->andWhere(['>=', 'a.date_to', $dfObj->format('Y-m-d H:i:s')]); - } - - elseif ($filter->date_from) { - $df = \DateTime::createFromFormat('Y-m', $filter->date_from) - ->format('Y-m-01 00:00:00'); - $query->andWhere(['>=', 'a.date_to', $df]); - } - - elseif ($filter->date_to) { - $dt = \DateTime::createFromFormat('Y-m', $filter->date_to); - $dt->modify('last day of this month')->setTime(23,59,59); - $query->andWhere(['<=', 'a.date_from', $dt->format('Y-m-d H:i:s')]); - } - } - - - - $attrMap = [ - 'type' => ['type','тип'], - 'color' => ['цвет','color'], - 'sort' => ['sort','сорт'], - 'size' => ['size','размер'], - ]; - foreach (['type','color','sort','size'] as $attr) { + foreach (['type', 'color', 'sort', 'size'] as $attr) { if ($filter->$attr) { - $propIds = Products1cPropType::find() ->select('id') ->andWhere(['name' => $attrMap[$attr]]) ->column(); - - $productIds = Products1cAdditionalCharacteristics::find() + $ids = Products1cAdditionalCharacteristics::find() ->select('product_id') ->distinct() - ->andWhere(['property_id' => $propIds, 'value' => $filter->$attr]) + ->where(['property_id' => $propIds, 'value' => $filter->$attr]) ->column(); - - - if (empty($productIds)) { + if (empty($ids)) { + // если нет подходящих свойств — сразу пустая выборка $query->andWhere('0=1'); break; } + $query->andWhere(['n.id' => $ids]); + } + } - $query->andWhere(['n.id' => $productIds]); + $needJoin = $filter->onlyActive || $filter->onlyInactive || $filter->date_from || $filter->date_to; + if ($needJoin) { + $query->innerJoin( + Products1cNomenclatureActuality::tableName() . ' a', + 'a.guid = n.id' + ); + + if ($filter->onlyActive) { + $query->andWhere(['a.active' => 1]); + } elseif ($filter->onlyInactive) { + $query->andWhere(['a.active' => 0]); + } + + if ($filter->date_from || $filter->date_to) { + if (!$filter->onlyActive && !$filter->onlyInactive) { + $query->andWhere(['a.active' => 1]); + } + + if ($filter->date_from && $filter->date_to) { + $df = (new \DateTime("{$filter->date_from}-01")) + ->setTime(0, 0, 0)->format('Y-m-d H:i:s'); + $dt = (new \DateTime("{$filter->date_to}-01")) + ->modify('last day of this month')->setTime(23, 59, 59) + ->format('Y-m-d H:i:s'); + $query->andWhere(['<=', 'a.date_from', $dt]) + ->andWhere(['>=', 'a.date_to', $df]); + } elseif ($filter->date_from) { + $df = (new \DateTime("{$filter->date_from}-01")) + ->setTime(0, 0, 0)->format('Y-m-d H:i:s'); + $query->andWhere(['>=', 'a.date_to', $df]); + } elseif ($filter->date_to) { + $dt = (new \DateTime("{$filter->date_to}-01")) + ->modify('last day of this month')->setTime(23, 59, 59) + ->format('Y-m-d H:i:s'); + $query->andWhere(['<=', 'a.date_from', $dt]); + } } } - $dataProvider->query = $query; + + $dataProvider = new \yii\data\ActiveDataProvider([ + 'query' => $query, + 'pagination' => ['pageSize' => 1000], + 'sort' => ['defaultOrder' => ['name' => SORT_ASC]], + ]); } $categories = Products1cNomenclature::find()->select('category')->distinct()->column(); @@ -180,12 +188,7 @@ class Products1cNomenclatureActualityController extends Controller $species = $species->column(); $lists = []; - $attrMap = [ - 'type' => ['type','тип'], - 'color' => ['цвет','color'], - 'sort' => ['sort','сорт'], - 'size' => ['size','размер'], - ]; + foreach (['type','color','sort','size'] as $attr) { $propIds = Products1cPropType::find() ->select('id') diff --git a/erp24/records/Products1cNomenclature.php b/erp24/records/Products1cNomenclature.php index 5342425f..34527570 100644 --- a/erp24/records/Products1cNomenclature.php +++ b/erp24/records/Products1cNomenclature.php @@ -97,4 +97,19 @@ class Products1cNomenclature extends \yii\db\ActiveRecord { return (bool)$this->getActiveActuality()->exists(); } + + /** + * Проверяет, есть ли для этой номенклатуры запись актуальности с active = 0 + * + * @return bool + */ + public function hasInactiveActuality(): bool + { + return (bool) Products1cNomenclatureActuality::find() + ->where([ + 'guid' => $this->id, + 'active' => 0, + ]) + ->exists(); + } } diff --git a/erp24/views/products1c-nomenclature-actuality/index.php b/erp24/views/products1c-nomenclature-actuality/index.php index e3d7a499..8491d178 100644 --- a/erp24/views/products1c-nomenclature-actuality/index.php +++ b/erp24/views/products1c-nomenclature-actuality/index.php @@ -178,6 +178,18 @@ $months = monthList(); +
+ field($filter, 'onlyActive')->checkbox([ + 'label' => 'Только активные', + 'uncheck' => 0, + 'checked' => (bool)$filter->onlyActive, + ])->label(false) ?> + field($filter, 'onlyInactive')->checkbox([ + 'label' => 'Только неактивные', + 'uncheck' => 0, + 'checked' => (bool)$filter->onlyInactive, + ])->label(false) ?> +
@@ -229,7 +241,12 @@ $months = monthList(); 'tableOptions' => ['class' => 'table table-bordered'], 'containerOptions' => ['style' => 'overflow:auto; max-height:500px;'], 'rowOptions' => function($model) { - return $model->hasActiveActuality() ? ['class' => 'table-success'] : []; + if ($model->hasActiveActuality()) { + return ['class' => 'table-success']; + } + if ($model->hasInactiveActuality()) { + return ['class' => 'table-danger']; + } }, 'columns' => [ [ -- 2.39.5