]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
ERP-413 Обработка ОС Планограмма (месяц)
authormarina <m.zozirova@gmail.com>
Wed, 7 May 2025 05:39:30 +0000 (08:39 +0300)
committermarina <m.zozirova@gmail.com>
Wed, 7 May 2025 05:39:30 +0000 (08:39 +0300)
erp24/controllers/AutoPlannogrammaController.php
erp24/services/AutoPlannogrammaService.php
erp24/views/auto-plannogramma/1.php
erp24/views/auto-plannogramma/2.php
erp24/views/auto-plannogramma/3.php [new file with mode: 0644]
erp24/views/auto-plannogramma/4.php [new file with mode: 0644]
erp24/views/auto-plannogramma/5.php [new file with mode: 0644]
erp24/views/auto-plannogramma/6.php [new file with mode: 0644]

index 0f5d6dee588b4623d1f4ab4c15ac70f05ffd5c95..26ee35b929ab623aeb9320ad661ae23510fed58f 100644 (file)
@@ -212,13 +212,11 @@ class AutoPlannogrammaController extends BaseController
 
         $filters = [
             'category' => $request->get('category'),
-            'subcategory' => $request->get('subcategory'),
-            'product_name' => $request->get('product_name'),
             'store_id' => $request->get('store_id'),
             'plan_date' => $request->get('plan_date'),
             'type' => $request->get('type'),
         ];
-//var_dump($filters);die();
+
         $dataProvider = new ArrayDataProvider([
             'allModels' => [],
             'pagination' => ['pageSize' => 100],
@@ -227,19 +225,13 @@ class AutoPlannogrammaController extends BaseController
         if (!empty($filters['plan_date'])) {
             $service = new AutoPlannogrammaService();
 
-            $data = $service->getMonthCategoryShareOrWriteOff($filters['plan_date'], $filters);
+            $data = $service->getMonthCategoryShareOrWriteOff($filters['plan_date'], $filters, null, $filters['type']);
             $flatData = [];
-
             foreach ($data as $storeId => $categories) {
                 foreach ($categories as $row) {
                     $flatData[] = [
                         'store_id' => (string)$storeId, // фильтрация по ID, а не имени
-                        'store_name' => CityStore::findOne($storeId)->name ?? null,
                         'category' => $row['category'] ?? null,
-                        'subcategory' => $row['subcategory'] ?? null,
-                        'product_name' => $row['product_name'] ?? null,
-                        'plan_date' => $filters['plan_date'], // или $row['plan_date'], если есть
-                        'type' => $row['type'] ?? null,
                         'total_sum' => $row['total_sum'] ?? null,
                         'share_of_total' => $row['share_of_total'] ?? null,
                     ];
@@ -258,7 +250,6 @@ class AutoPlannogrammaController extends BaseController
                 return true;
             });
 
-
             $dataProvider = new ArrayDataProvider([
                 'allModels' => array_values($flatData),
                 'pagination' => ['pageSize' => 100],
@@ -277,8 +268,6 @@ class AutoPlannogrammaController extends BaseController
 
         $filters = [
             'category' => $request->get('category'),
-            'subcategory' => $request->get('subcategory'),
-            'product_name' => $request->get('product_name'),
             'store_id' => $request->get('store_id'),
             'plan_date' => $request->get('plan_date'),
             'type' => $request->get('type'),
@@ -297,8 +286,21 @@ class AutoPlannogrammaController extends BaseController
             $data = $service->getMonthCategoryGoal($monthCategoryShare, $filters['plan_date'], $filters);;
 
 
+            $flatData = array_filter($data, function ($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (empty($value)) continue;
+                    if (!isset($row[$key])) continue;
+
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+
             $dataProvider = new ArrayDataProvider([
-                'allModels' => $data,
+                'allModels' => $flatData,
                 'pagination' => ['pageSize' => 100],
             ]);
         }
@@ -307,4 +309,222 @@ class AutoPlannogrammaController extends BaseController
             'filters' => $filters,
         ]);
     }
+
+    public function action3()
+    {
+        $request = Yii::$app->request;
+
+        $filters = [
+            'category' => $request->get('category'),
+            'subcategory' => $request->get('subcategory'),
+            'store_id' => $request->get('store_id'),
+            'plan_date' => $request->get('plan_date'),
+            'type' => $request->get('type'),
+        ];
+
+        $dataProvider = new ArrayDataProvider([
+            'allModels' => [],
+            'pagination' => ['pageSize' => 100],
+        ]);
+
+
+        if (!empty($filters['plan_date'])) {
+            $service = new AutoPlannogrammaService();
+
+            $data = $service->getMonthSubcategoryShareOrWriteOff($filters['plan_date'], $filters, null, $filters['type']);
+
+            $flatData = array_filter($data, function ($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (empty($value)) continue;
+                    if (!isset($row[$key])) continue;
+
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+            $dataProvider = new ArrayDataProvider([
+                'allModels' => $flatData,
+                'pagination' => ['pageSize' => 100],
+            ]);
+        }
+        return $this->render('3', [
+            'dataProvider' => $dataProvider,
+            'filters' => $filters,
+        ]);
+    }
+
+    public function action4()
+    {
+        $request = Yii::$app->request;
+
+        $filters = [
+            'category' => $request->get('category'),
+            'subcategory' => $request->get('subcategory'),
+            'store_id' => $request->get('store_id'),
+            'plan_date' => $request->get('plan_date'),
+            'type' => $request->get('type'),
+        ];
+
+        $dataProvider = new ArrayDataProvider([
+            'allModels' => [],
+            'pagination' => ['pageSize' => 100],
+        ]);
+
+
+        if (!empty($filters['plan_date'])) {
+            $service = new AutoPlannogrammaService();
+            $monthCategoryShare = $service->getMonthCategoryShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -12 months')),
+                $filters
+            );
+            $monthCategoryGoal = $service->getMonthCategoryGoal($monthCategoryShare, $filters['plan_date'], $filters);
+
+            $monthSubcategoryShare = $service->getMonthSubcategoryShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -3 months')),
+                $filters
+            );
+            $data = $service->getMonthSubcategoryGoal($monthSubcategoryShare, $monthCategoryGoal);
+
+            $flatData = array_filter($data, function ($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (empty($value)) continue;
+                    if (!isset($row[$key])) continue;
+
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+            $dataProvider = new ArrayDataProvider([
+                'allModels' => $flatData,
+                'pagination' => ['pageSize' => 100],
+            ]);
+        }
+        return $this->render('4', [
+            'dataProvider' => $dataProvider,
+            'filters' => $filters,
+        ]);
+    }
+
+    public function action5()
+    {
+        $request = Yii::$app->request;
+
+        $filters = [
+            'category' => $request->get('category'),
+            'subcategory' => $request->get('subcategory'),
+            'species' => $request->get('species'),
+            'store_id' => $request->get('store_id'),
+            'plan_date' => $request->get('plan_date'),
+            'type' => $request->get('type'),
+        ];
+
+        $dataProvider = new ArrayDataProvider([
+            'allModels' => [],
+            'pagination' => ['pageSize' => 100],
+        ]);
+
+
+        if (!empty($filters['plan_date'])) {
+            $service = new AutoPlannogrammaService();
+            $data = $service->getMonthSpeciesShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -3 months')),
+                $filters,
+                null,
+                $filters['type']
+            );
+
+
+            $flatData = array_filter($data, function ($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (empty($value)) continue;
+                    if (!isset($row[$key])) continue;
+
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+
+            $dataProvider = new ArrayDataProvider([
+                'allModels' => $flatData,
+                'pagination' => ['pageSize' => 100],
+            ]);
+        }
+        return $this->render('5', [
+            'dataProvider' => $dataProvider,
+            'filters' => $filters,
+        ]);
+    }
+
+    public function action6()
+    {
+        $request = Yii::$app->request;
+
+        $filters = [
+            'category' => $request->get('category'),
+            'subcategory' => $request->get('subcategory'),
+            'species' => $request->get('species'),
+            'store_id' => $request->get('store_id'),
+            'plan_date' => $request->get('plan_date'),
+            'type' => $request->get('type'),
+        ];
+
+        $dataProvider = new ArrayDataProvider([
+            'allModels' => [],
+            'pagination' => ['pageSize' => 100],
+        ]);
+
+
+        if (!empty($filters['plan_date'])) {
+            $service = new AutoPlannogrammaService();
+            $monthCategoryShare = $service->getMonthCategoryShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -12 months')),
+                $filters
+            );
+            $monthCategoryGoal = $service->getMonthCategoryGoal($monthCategoryShare, $filters['plan_date'], $filters);
+
+            $monthSubcategoryShare = $service->getMonthSubcategoryShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -3 months')),
+                $filters
+            );
+            $monthSubcategoryGoal = $service->getMonthSubcategoryGoal($monthSubcategoryShare, $monthCategoryGoal);
+
+            $monthSpeciesShare = $service->getMonthSpeciesShareOrWriteOff(
+                date('Y-m-d', strtotime($filters['plan_date'] . ' -3 months')),
+                $filters
+            );
+            $data = $service->getMonthSpeciesGoalDirty($monthSpeciesShare, $monthSubcategoryGoal);
+
+            $flatData = array_filter($data, function ($row) use ($filters) {
+                foreach ($filters as $key => $value) {
+                    if (empty($value)) continue;
+                    if (!isset($row[$key])) continue;
+
+                    if (stripos((string)$row[$key], (string)$value) === false) {
+                        return false;
+                    }
+                }
+                return true;
+            });
+
+
+
+            $dataProvider = new ArrayDataProvider([
+                'allModels' => $flatData,
+                'pagination' => ['pageSize' => 100],
+            ]);
+        }
+        return $this->render('6', [
+            'dataProvider' => $dataProvider,
+            'filters' => $filters,
+        ]);
+    }
 }
index 188a2eb12776e8e4e531f989e3e300907e42675d..6a5468805627fb5b0b73732c92d4a33a8247b72f 100644 (file)
@@ -17,20 +17,22 @@ class AutoPlannogrammaService
 
     public function getStoreTotals(array $storeIds, string $dateFrom, ?array $productFilter = null, string $type = 'sales', ?string $dateTo = null): array
     {
+
         $query = (new Query())
             ->select([
                 'store_id' => 'ex.entity_id',
                 'total_sum' => new Expression(
                     $type === 'writeOffs'
-                        ? 'SUM(CAST(item ->> \'summ\' AS NUMERIC))'
+                        ? 'SUM(wp.summ)'
                         : 'SUM(sp.summ)'
                 )
             ])
-            ->from(['w' => $type === 'writeOffs' ? 'write_offs' : 'sales']);
+            ->from(['w' => $type == 'writeOffs' ? 'write_offs' : 'sales']);
+
+        if ($type == 'writeOffs') {
+                $query->leftJoin('export_import_table ex', 'ex.export_val = w.store_id')
+                ->leftJoin('write_offs_products wp', 'wp.write_offs_id = w.id');
 
-        if ($type === 'writeOffs') {
-            $query->leftJoin('export_import_table ex', 'ex.export_val = w.store_id')
-                ->join('JOIN', new Expression('LATERAL jsonb_array_elements(w.items::jsonb) AS item'), 'true');
         } else {
             $query->leftJoin('sales_products sp', 'sp.check_id = w.id')
                 ->leftJoin('export_import_table ex', 'ex.export_val = w.store_id_1c');
@@ -41,7 +43,7 @@ class AutoPlannogrammaService
 
         if ($productFilter !== null) {
             if ($type === 'writeOffs') {
-                $query->andWhere(['item ->> \'product_id\'' => $productFilter]);
+                $query->andWhere(['w.product_id'=> $productFilter]);
             } else {
                 $query->andWhere(['sp.product_id' => $productFilter]);
             }
@@ -76,22 +78,22 @@ class AutoPlannogrammaService
                 'store_id' => 'ex.entity_id',
                 'category' => 'p1c.category',
                 'total_sum' => new Expression(
-                    $type === 'writeOffs' ? 'SUM(CAST(item ->> \'summ\' AS NUMERIC))' : 'SUM(sp.summ)'
+                    $type === 'writeOffs' ? 'SUM(wp.summ)' : 'SUM(sp.summ)'
                 ),
             ])
             ->from($type === 'writeOffs' ? ['w' => 'write_offs'] : ['s' => 'sales']);
 
         if ($type === 'writeOffs') {
             $query->join('LEFT JOIN', 'export_import_table ex', 'ex.export_val = w.store_id')
-                ->join('JOIN', new Expression('LATERAL jsonb_array_elements(w.items::jsonb) AS item'), 'true')
-                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = item ->> \'product_id\'')
+                ->leftJoin('write_offs_products wp', 'wp.write_offs_id = w.id')
+                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = wp.product_id')
                 ->where(['>=', 'w.date', $dateFrom])
                 ->andWhere(['ex.entity_id' => $storeIds])
                 ->andWhere(['<>', 'p1c.category', ''])
                 ->groupBy(['ex.entity_id', 'p1c.category']);
 
             if ($productFilter !== null) {
-                $query->andWhere(['item ->> \'product_id\'' => $productFilter]);
+                $query->andWhere(['wp.product_id' => $productFilter]);
             }
         } else {
             $query->leftJoin('sales_products sp', 'sp.check_id = s.id')
@@ -106,7 +108,6 @@ class AutoPlannogrammaService
                 $query->andWhere(['sp.product_id' => $productFilter]);
             }
         }
-
         $rows = $query->all();
         $result = [];
 
@@ -117,9 +118,9 @@ class AutoPlannogrammaService
                 'category' => $row['category'],
                 'total_sum' => $row['total_sum'],
                 'share_of_total' => round($row['total_sum'] / $total, 4),
+                'type' => $type,
             ];
         }
-
         return $result;
     }
 
@@ -171,22 +172,22 @@ class AutoPlannogrammaService
                 'subcategory' => 'p1c.subcategory',
                 'category' => 'p1c.category',
                 'total_sum' => new Expression(
-                    $type === 'writeOffs' ? 'SUM(CAST(item ->> \'summ\' AS NUMERIC))' : 'SUM(sp.summ)'
+                    $type === 'writeOffs' ? 'SUM(wp.summ)' : 'SUM(sp.summ)'
                 ),
             ]);
 
         if ($type === 'writeOffs') {
             $query->from(['w' => 'write_offs'])
                 ->join('LEFT JOIN', 'export_import_table ex', 'ex.export_val = w.store_id')
-                ->join('JOIN', new Expression('LATERAL jsonb_array_elements(w.items::jsonb) AS item'), 'true')
-                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = item ->> \'product_id\'')
+                ->leftJoin('write_offs_products wp', 'wp.write_offs_id = w.id')
+                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = wp.product_id')
                 ->where(['>=', 'w.date', $dateFrom])
                 ->andWhere(['ex.entity_id' => $storeIds])
                 ->andWhere(['<>', 'p1c.subcategory', ''])
                 ->groupBy(['ex.entity_id', 'p1c.subcategory', 'p1c.category']);
 
             if ($productFilter !== null) {
-                $query->andWhere(['item ->> \'product_id\'' => $productFilter]);
+                $query->andWhere(['wp.product_id' => $productFilter]);
             }
         } else {
             $query->from(['s' => 'sales'])
@@ -263,15 +264,15 @@ class AutoPlannogrammaService
                 'category' => 'p1c.category',
                 'subcategory' => 'p1c.subcategory',
                 'total_sum' => new Expression(
-                    $type === 'writeOffs' ? 'SUM(CAST(item ->> \'summ\' AS NUMERIC))' : 'SUM(sp.summ)'
+                    $type === 'writeOffs' ?  'SUM(wp.summ)' : 'SUM(sp.summ)'
                 ),
             ]);
 
         if ($type === 'writeOffs') {
             $query->from(['w' => 'write_offs'])
                 ->join('LEFT JOIN', 'export_import_table ex', 'ex.export_val = w.store_id')
-                ->join('JOIN', new Expression('LATERAL jsonb_array_elements(w.items::jsonb) AS item'), 'true')
-                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = item ->> \'product_id\'')
+                ->leftJoin('write_offs_products wp', 'wp.write_offs_id = w.id')
+                ->leftJoin('products_1c_nomenclature p1c', 'p1c.id = wp.product_id')
                 ->where(['>=', 'w.date', $dateFrom])
                 ->andWhere(['ex.entity_id' => $storeIds])
                 ->andWhere(['<>', 'p1c.name', ''])
@@ -316,8 +317,6 @@ class AutoPlannogrammaService
 
     public function getMonthSpeciesGoalDirty(array $speciesShare, array $subcategoryGoals): array
     {
-        $storeNamesMap = ArrayHelper::map($this->getVisibleStores(), 'id', 'name');
-
         $indexedGoals = [];
         foreach ($subcategoryGoals as $goal) {
             $indexedGoals[$goal['store_id']][$goal['category']][$goal['subcategory']] = $goal['goal'];
@@ -330,9 +329,8 @@ class AutoPlannogrammaService
                 $result[] = [
                     'category' => $species['category'],
                     'subcategory' => $species['subcategory'],
-                    'product_name' => $species['species'],
+                    'species' => $species['species'],
                     'store_id' => $species['store_id'],
-                    'store_name' => $storeNamesMap[$species['store_id']] ?? 'Неизвестный магазин', // Добавляем название магазина
                     'goal' => round($species['percent_of_month'] * $goal, 2),
                 ];
             }
index fc4b06033fcee37a0c14590f859cf48b0bec4da5..120fc959aab6fac347f1c7bf0c0b9b281b3eb6eb 100644 (file)
                 'pluginOptions' => ['allowClear' => true],
             ])->label('Категория') ?>
         </div>
-        <div class="col-md">
-            <?= $form->field(new \yii\base\DynamicModel(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
-                'data' => ArrayHelper::map(
-                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
-                    'subcategory',
-                    'subcategory'
-                ),
-                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
-                'pluginOptions' => ['allowClear' => true],
-            ])->label('Подкатегория') ?>
-        </div>
-        <div class="col-md">
-            <?= $form->field(new \yii\base\DynamicModel(['product_name' => $filters['product_name'] ?? '']), 'product_name')->widget(Select2::class, [
-                'data' => ArrayHelper::map(
-                    Products1cNomenclature::find()->select('name')->distinct()->asArray()->all(),
-                    'name',
-                    'name'
-                ),
-                'options' => ['placeholder' => 'Название товара', 'name' => 'product_name'],
-                '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(
@@ -93,7 +71,9 @@
 <?= GridView::widget([
     'dataProvider' => $dataProvider,
     'columns' => [
-        ['attribute' => 'store_id', 'label' => 'Магазин'],
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
         ['attribute' => 'category', 'label' => 'Категория'],
         ['attribute' => 'total_sum', 'label' => 'Сумма', 'format' => ['decimal', 2]],
         ['attribute' => 'share_of_total', 'label' => 'Доля', 'format' => ['percent', 2]],
index c96991292290747c98a8c5963de6aaccb0632173..28d4460e35cda47f2f1d6f39028bff4c334bd2ee 100644 (file)
                 'pluginOptions' => ['allowClear' => true],
             ])->label('Категория') ?>
         </div>
-        <div class="col-md">
-            <?= $form->field(new \yii\base\DynamicModel(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
-                'data' => ArrayHelper::map(
-                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
-                    'subcategory',
-                    'subcategory'
-                ),
-                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
-                'pluginOptions' => ['allowClear' => true],
-            ])->label('Подкатегория') ?>
-        </div>
-        <div class="col-md">
-            <?= $form->field(new \yii\base\DynamicModel(['product_name' => $filters['product_name'] ?? '']), 'product_name')->widget(Select2::class, [
-                'data' => ArrayHelper::map(
-                    Products1cNomenclature::find()->select('name')->distinct()->asArray()->all(),
-                    'name',
-                    'name'
-                ),
-                'options' => ['placeholder' => 'Название товара', 'name' => 'product_name'],
-                '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(
@@ -93,7 +71,9 @@
 <?= GridView::widget([
     'dataProvider' => $dataProvider,
     'columns' => [
-        ['attribute' => 'store_name', 'label' => 'Магазин'],
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
         ['attribute' => 'category', 'label' => 'Категория'],
         ['attribute' => 'goal', 'label' => 'Сумма план'],
     ],
diff --git a/erp24/views/auto-plannogramma/3.php b/erp24/views/auto-plannogramma/3.php
new file mode 100644 (file)
index 0000000..7d2fcb2
--- /dev/null
@@ -0,0 +1,91 @@
+<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;
+
+    $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(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
+                    'subcategory',
+                    'subcategory'
+                ),
+                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
+                '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(['plan_date' => $filters['plan_date'] ?? '']), 'plan_date')->widget(DatePicker::class, [
+                'pluginOptions' => [
+                    'autoclose' => true,
+                    'format' => 'dd-mm-yyyy',
+                ],
+                'options' => [
+                    'class' => 'form-control',
+                    'placeholder' => 'Плановая дата',
+                    'name' => 'plan_date',
+                ],
+            ])->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-planogramma/test-sales'], ['class' => 'btn btn-default']) ?>
+        </div>
+    </div>
+
+    <?php ActiveForm::end(); ?>
+</div>
+
+<?= GridView::widget([
+    'dataProvider' => $dataProvider,
+    'columns' => [
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
+        ['attribute' => 'category', 'label' => 'Категория'],
+        ['attribute' => 'subcategory', 'label' => 'Подкатегория'],
+        ['attribute' => 'total_sum', 'label' => 'Сумма', 'format' => ['decimal', 2]],
+        ['attribute' => 'percent_of_month', 'label' => 'Доля', 'format' => ['decimal', 2]],
+    ],
+]); ?>
diff --git a/erp24/views/auto-plannogramma/4.php b/erp24/views/auto-plannogramma/4.php
new file mode 100644 (file)
index 0000000..1e6f7aa
--- /dev/null
@@ -0,0 +1,93 @@
+<?php
+?>
+<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;
+
+    $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(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
+                    'subcategory',
+                    'subcategory'
+                ),
+                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
+                '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(['plan_date' => $filters['plan_date'] ?? '']), 'plan_date')->widget(DatePicker::class, [
+                'pluginOptions' => [
+                    'autoclose' => true,
+                    'format' => 'dd-mm-yyyy',
+                ],
+                'options' => [
+                    'class' => 'form-control',
+                    'placeholder' => 'Плановая дата',
+                    'name' => 'plan_date',
+                ],
+            ])->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-planogramma/test-sales'], ['class' => 'btn btn-default']) ?>
+        </div>
+    </div>
+
+    <?php ActiveForm::end(); ?>
+</div>
+
+<?= GridView::widget([
+    'dataProvider' => $dataProvider,
+    'columns' => [
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
+        ['attribute' => 'category', 'label' => 'Категория'],
+        ['attribute' => 'subcategory', 'label' => 'Подкатегория'],
+        ['attribute' => 'goal', 'label' => 'Сумма План', 'format' => ['decimal', 2]],
+    ],
+]); ?>
+
diff --git a/erp24/views/auto-plannogramma/5.php b/erp24/views/auto-plannogramma/5.php
new file mode 100644 (file)
index 0000000..3ab8cf4
--- /dev/null
@@ -0,0 +1,105 @@
+<?php
+?>
+<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;
+
+    $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(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
+                    'subcategory',
+                    'subcategory'
+                ),
+                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
+                'pluginOptions' => ['allowClear' => true],
+            ])->label('Подкатегория') ?>
+        </div>
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['species' => $filters['species'] ?? '']), 'species')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('name')->distinct()->asArray()->all(),
+                    'name',
+                    'name'
+                ),
+                'options' => ['placeholder' => 'Название товара', 'name' => 'species'],
+                '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(['plan_date' => $filters['plan_date'] ?? '']), 'plan_date')->widget(DatePicker::class, [
+                'pluginOptions' => [
+                    'autoclose' => true,
+                    'format' => 'dd-mm-yyyy',
+                ],
+                'options' => [
+                    'class' => 'form-control',
+                    'placeholder' => 'Плановая дата',
+                    'name' => 'plan_date',
+                ],
+            ])->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-planogramma/test-sales'], ['class' => 'btn btn-default']) ?>
+        </div>
+    </div>
+
+    <?php ActiveForm::end(); ?>
+</div>
+
+<?= GridView::widget([
+    'dataProvider' => $dataProvider,
+    'columns' => [
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
+        ['attribute' => 'category', 'label' => 'Категория'],
+        ['attribute' => 'subcategory', 'label' => 'Подкатегория'],
+        ['attribute' => 'species', 'label' => 'Тип'],
+        ['attribute' => 'total_sum', 'label' => 'Сумма', 'format' => ['decimal', 2]],
+        ['attribute' => 'percent_of_month', 'label' => 'Доля', 'format' => ['percent', 2]],
+    ],
+]); ?>
diff --git a/erp24/views/auto-plannogramma/6.php b/erp24/views/auto-plannogramma/6.php
new file mode 100644 (file)
index 0000000..b63cad8
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+?>
+<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;
+
+    $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(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(),
+                    'subcategory',
+                    'subcategory'
+                ),
+                'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'],
+                'pluginOptions' => ['allowClear' => true],
+            ])->label('Подкатегория') ?>
+        </div>
+        <div class="col-md">
+            <?= $form->field(new \yii\base\DynamicModel(['species' => $filters['species'] ?? '']), 'species')->widget(Select2::class, [
+                'data' => ArrayHelper::map(
+                    Products1cNomenclature::find()->select('name')->distinct()->asArray()->all(),
+                    'name',
+                    'name'
+                ),
+                'options' => ['placeholder' => 'Название товара', 'name' => 'species'],
+                '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(['plan_date' => $filters['plan_date'] ?? '']), 'plan_date')->widget(DatePicker::class, [
+                'pluginOptions' => [
+                    'autoclose' => true,
+                    'format' => 'dd-mm-yyyy',
+                ],
+                'options' => [
+                    'class' => 'form-control',
+                    'placeholder' => 'Плановая дата',
+                    'name' => 'plan_date',
+                ],
+            ])->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-planogramma/test-sales'], ['class' => 'btn btn-default']) ?>
+        </div>
+    </div>
+
+    <?php ActiveForm::end(); ?>
+</div>
+
+<?= GridView::widget([
+    'dataProvider' => $dataProvider,
+    'columns' => [
+        ['attribute' => 'store_id', 'label' => 'Магазин', 'value' => function ($data) {
+            return CityStore::findOne($data['store_id'])->name ?? null;
+        }],
+        ['attribute' => 'category', 'label' => 'Категория'],
+        ['attribute' => 'subcategory', 'label' => 'Подкатегория'],
+        ['attribute' => 'species', 'label' => 'Тип'],
+        ['attribute' => 'goal', 'label' => 'Сумма План', 'format' => ['decimal', 2]],
+    ],
+]); ?>