]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Просмотр товаров по магазину учтенных в расчетах
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 27 May 2025 10:51:02 +0000 (13:51 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 27 May 2025 10:51:02 +0000 (13:51 +0300)
erp24/controllers/AutoPlannogrammaController.php
erp24/services/AutoPlannogrammaService.php
erp24/views/auto-plannogramma/1_2.php [new file with mode: 0644]

index 19530b0e19ec55b21c007edf28184631a20f6f99..e33f8b8f6273f8a43e4bc7ba6d74bd82221e8565 100644 (file)
@@ -9,6 +9,7 @@ use yii\db\Query;
 use yii\helpers\ArrayHelper;
 use yii_app\records\CityStore;
 use yii_app\records\MatrixBouquetForecast;
+use yii_app\records\Products1c;
 use yii_app\services\AutoPlannogrammaService;
 use yii_app\services\StorePlanService;
 
@@ -318,6 +319,130 @@ class AutoPlannogrammaController extends BaseController
         ]);
     }
 
+    public function action1_2()
+    {
+        $request = Yii::$app->request;
+
+        $filters = [
+            'category' => $request->get('category'),
+            'store_id' => $request->get('store_id'),
+            'year'     => $request->get('year'),
+            'month'    => $request->get('month'),
+            'type'     => $request->get('type'),
+        ];
+
+        $categoriesProvider = new ArrayDataProvider([
+            'allModels'  => [],
+            'pagination' => ['pageSize' => 50],
+        ]);
+        $productsProvider = new ArrayDataProvider([
+            'allModels'  => [],
+            'pagination' => ['pageSize' => 100],
+        ]);
+
+        if (!empty($filters['year']) && !empty($filters['month'])) {
+            $filters['plan_date'] = sprintf(
+                '%04d-%02d-01',
+                $filters['year'],
+                $filters['month']
+            );
+
+            $service = new AutoPlannogrammaService();
+            $data    = $service->getMonthCategoryShareOrWriteOff(
+                $filters['plan_date'],
+                $filters,
+                $filters['type']
+            );
+           // var_dump($data);die();
+            $categoryRows = [];
+            $allProdIds   = [];
+
+            foreach ($data as $storeId => $categories) {
+                $storeName = CityStore::findOne($storeId)->name ?? null;
+                foreach ($categories as $row) {
+                    $prodIds = array_filter(
+                        array_map('trim', explode(',', $row['products_list'] ?? '')),
+                        fn($v) => $v !== ''
+                    );
+                    $prodCompIds = array_filter(
+                        array_map('trim', explode(',', $row['products_components_list'] ?? '')),
+                        fn($v) => $v !== ''
+                    );
+                    $allProdIds = array_merge($allProdIds, $prodIds, $prodCompIds);
+
+                    $categoryRows[] = [
+                        'store_id'         => (string)$storeId,
+                        'store_name'       => $storeName,
+                        'category'         => $row['category'],
+                        'base_total_store' => $row['base_total_store'],
+                        'new_total_store'  => $row['new_total_store'],
+                        'total_sum'        => $row['total_sum'],
+                        'percent'          => $row['percent'],
+                        'product_ids'      => $allProdIds,
+                    ];
+                }
+            }
+
+            $allProdIds = array_values(array_unique($allProdIds));
+           // var_dump($allProdIds);die();
+            if (!empty($allProdIds)) {
+                $products = Products1c::find()
+                    ->select(['id', 'name', 'type', 'components'])
+                    ->andWhere(['id' => $allProdIds])
+                    ->asArray()
+                    ->indexBy('id')
+                    ->all();
+            } else {
+                $products = [];
+            }
+            //var_dump($products);die();
+            $productsRows = [];
+            foreach ($categoryRows as &$row) {
+                $rowProducts = [];
+                foreach ($row['product_ids'] as $pid) {
+                    if (isset($products[$pid])) {
+                        $prod = $products[$pid];
+
+                        $prod['category'] = $row['category'];
+                        $rowProducts[]    = $prod;
+                        $productsRows[$pid] = $prod;
+                    }
+                }
+                $row['products'] = $rowProducts;
+                unset($row['product_ids']);
+            }
+            unset($row);
+
+            $categoryRows = array_filter($categoryRows, function($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (!$value || !isset($row[$key])) {
+                        continue;
+                    }
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+
+            $categoriesProvider = new ArrayDataProvider([
+                'allModels'  => array_values($categoryRows),
+                'pagination' => ['pageSize' => 50],
+            ]);
+            $productsProvider = new ArrayDataProvider([
+                'allModels'  => array_values($productsRows),
+                'pagination' => ['pageSize' => 500],
+            ]);
+        }
+
+        return $this->render('1_2', [
+            'categoriesProvider' => $categoriesProvider,
+            'productsProvider'   => $productsProvider,
+            'filters'            => $filters,
+        ]);
+    }
+
     public function action2()
     {
         $request = Yii::$app->request;
@@ -737,6 +862,7 @@ class AutoPlannogrammaController extends BaseController
             //var_dump($filters); die();
             $service = new AutoPlannogrammaService();
             $monthCategoryShare = $service->getMonthCategoryShareOrWriteOff($filters['plan_date'], $filters);
+            var_dump($monthCategoryShare);die();
             $monthCategoryGoal = $service->getMonthCategoryGoal($monthCategoryShare, $filters['plan_date']);
             $monthSubcategoryShare = $service->getMonthSubcategoryShareOrWriteOff($filters['plan_date'], $filters);
             $monthSubcategoryGoal = $service->getMonthSubcategoryGoal($monthSubcategoryShare, $monthCategoryGoal);
index 92eaf45783582e4cb36fe27550f36c2c4bb19acc..e5b287027a58b0e19fdfdafac4c9d94230f95d7e 100644 (file)
@@ -117,7 +117,8 @@ class AutoPlannogrammaService
                 'total_sum' => 'main.total_sum',
                 'percent' => new Expression('ROUND(CAST(main.total_sum AS DECIMAL) / NULLIF(totals.total, 0), 4)'),
                 'type' => new Expression(':type', ['type' => $type]),
-                'totals_total' => 'totals.total'
+                'totals_total' => 'totals.total',
+                'products_list'=> 'main.products_list',
             ])
             ->from([
                 'main' => (new Query())
@@ -125,6 +126,7 @@ class AutoPlannogrammaService
                         'ex_entity_id' => 'ex.entity_id',
                         'category' => 'p1c.category',
                         'total_sum' => $weightedSumExpression,
+                        'products_list' => new Expression("string_agg(DISTINCT {$productAlias}.product_id::text, ',')"),
                     ])
                     ->from($fromTable)
                     ->leftJoin($productTableJoin, $productTableJoinCondition)
@@ -163,7 +165,7 @@ class AutoPlannogrammaService
 
         $componentAdds = [];
         $componentAddsSumAll = [];
-
+        $allComponentsProductIds = [];
         foreach ($storeIds as $storeId) {
             foreach ($months as $m => $weight) {
                 [$year, $mon] = explode('-', $m);
@@ -173,8 +175,11 @@ class AutoPlannogrammaService
                     (int)$year,
                     $type
                 );
+                foreach ($items as $it) {
+                    $allComponentsProductIds[$storeId][] = $it['product_id'];
+                }
                 $sums = $this->sumUnmarkedProductsComponentsByCategory($items, $type);
-
+                $allComponentsProductIds[$storeId] = array_values(array_unique($allComponentsProductIds[$storeId]));
                 foreach ($sums as $sumRow) {
                     $sid = $sumRow['store_id'];
                     $cat = $sumRow['category'];
@@ -186,6 +191,8 @@ class AutoPlannogrammaService
             }
         }
 
+
+       // var_dump($allComponentsProductIds); die();
         $result = [];
         foreach ($rows as $r) {
             $sid = $r['store_id'];
@@ -205,7 +212,9 @@ class AutoPlannogrammaService
                 'percent' => $percent,
                 'type' => $r['type'],
                 'new_total_store' => $newDenominator,
-                'base_total_store' => $baseTotal
+                'base_total_store' => $baseTotal,
+                'products_list' => $r['products_list'],
+                'products_components_list' => implode(',',$allComponentsProductIds[$sid]),
             ];
         }
 
diff --git a/erp24/views/auto-plannogramma/1_2.php b/erp24/views/auto-plannogramma/1_2.php
new file mode 100644 (file)
index 0000000..49f5cf4
--- /dev/null
@@ -0,0 +1,117 @@
+<div class="filter-form" style="margin-bottom: 20px;">
+    <?php use kartik\date\DatePicker;
+    use kartik\grid\GridView;
+    use kartik\select2\Select2;
+    use yii\helpers\ArrayHelper;
+    use yii\helpers\Html;
+    use yii\widgets\ActiveForm;
+    use yii_app\records\CityStore;
+    use yii_app\records\Products1cNomenclature;?>
+    <h1 class="ms-3 mb-4"><?= Html::encode("Расчет доли месяца для категорий (month_category_share)") ?></h1>
+    <?php $form = ActiveForm::begin(['method' => 'get']); ?>
+    <div class="row p-3">
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['category' => $filters['category'] ?? '']), 'category')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('category')->distinct()->asArray()->all(),
+                    'category',
+                    'category'
+                ),
+                'options' => ['placeholder' => 'Категория', 'name' => 'category'],
+                'pluginOptions' => ['allowClear' => true],
+            ])->label('Категория') ?>
+        </div>
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['store_id' => $filters['store_id'] ?? '']), 'store_id')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    CityStore::findAll(['visible' => CityStore::IS_VISIBLE]),
+                    'id',
+                    'name'
+                ),
+                'options' => ['placeholder' => 'Магазин', 'name' => 'store_id'],
+                'pluginOptions' => ['allowClear' => true],
+            ])->label('Магазин') ?>
+        </div>
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['month' => $filters['month'] ?? '']), 'month')->dropDownList(\yii_app\helpers\DateHelper::MONTH_NUMBER_NAMES, [
+                'prompt' => 'Месяц',
+                'name' => 'month',
+            ])->label('Плановый месяц') ?>
+        </div>
+
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['year' => $filters['year'] ?? '']), 'year')->dropDownList(['2025' => 2025, '2026' => 2026], [
+                'prompt' => 'Год',
+                'name' => 'year',
+            ])->label('Плановый год') ?>
+        </div>
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['type' => $filters['type'] ?? '']), 'type')->widget(Select2::class, [
+                'data' => [
+                    'writeOffs' => 'Списания',
+                    'sales' => 'Продажи'
+                ],
+                'options' => ['placeholder' => 'Тип', 'name' => 'type'],
+                'pluginOptions' => ['allowClear' => true],
+            ])->label('По дефолту продажи!') ?>
+        </div>
+        <div class="col-md">
+            <?= Html::submitButton('Фильтровать', ['class' => 'btn btn-primary']) ?>
+        </div>
+        <div class="col-md">
+            <?= Html::a('Сбросить', ['auto-plannogramma/1'], ['class' => 'btn btn-default']) ?>
+        </div>
+    </div>
+
+    <?php ActiveForm::end(); ?>
+</div>
+
+<h2>Категории и показатели</h2>
+<?= GridView::widget([
+    'dataProvider' => $categoriesProvider,
+    'columns' => [
+        [
+            'attribute'=>'store_name',
+            'label'=>'Магазин',
+        ],
+        [
+            'attribute'=>'category',
+            'label'=>'Категория',
+        ],
+        [
+            'attribute'=>'base_total_store',
+            'label'=>'Базовая сумма',
+            'format'=>['decimal',2],
+        ],
+        [
+            'attribute'=>'new_total_store',
+            'label'=>'Новая сумма',
+            'format'=>['decimal',2],
+        ],
+        [
+            'attribute'=>'total_sum',
+            'label'=>'Сумма категории',
+            'format'=>['decimal',2],
+        ],
+        [
+            'attribute'=>'percent',
+            'label'=>'Доля',
+            'format'=>['percent',2],
+        ],
+    ],
+]); ?>
+
+
+<h2>Список товаров по категориям</h2>
+<?= GridView::widget([
+    'dataProvider' => $productsProvider,
+    'columns' => [
+        ['class' => 'yii\grid\SerialColumn'],
+        ['attribute'=>'id',          'label'=>'ID товара'],
+        ['attribute'=>'name',        'label'=>'Название'],
+        ['attribute'=>'components',  'label'=>'Components'],
+        ['attribute'=>'type',        'label'=>'Type'],
+        ['attribute'=>'category',    'label'=>'Категория'],
+    ],
+]); ?>
+