$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],
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,
];
return true;
});
-
$dataProvider = new ArrayDataProvider([
'allModels' => array_values($flatData),
'pagination' => ['pageSize' => 100],
$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'),
$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],
]);
}
'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,
+ ]);
+ }
}
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');
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]);
}
'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')
$query->andWhere(['sp.product_id' => $productFilter]);
}
}
-
$rows = $query->all();
$result = [];
'category' => $row['category'],
'total_sum' => $row['total_sum'],
'share_of_total' => round($row['total_sum'] / $total, 4),
+ 'type' => $type,
];
}
-
return $result;
}
'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'])
'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', ''])
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'];
$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),
];
}
'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(
<?= 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]],
'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(
<?= 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' => 'Сумма план'],
],
--- /dev/null
+<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]],
+ ],
+]); ?>
--- /dev/null
+<?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]],
+ ],
+]); ?>
+
--- /dev/null
+<?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]],
+ ],
+]); ?>
--- /dev/null
+<?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]],
+ ],
+]); ?>