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;
]);
}
+ 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;
//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);
'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())
'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)
$componentAdds = [];
$componentAddsSumAll = [];
-
+ $allComponentsProductIds = [];
foreach ($storeIds as $storeId) {
foreach ($months as $m => $weight) {
[$year, $mon] = explode('-', $m);
(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'];
}
}
+
+ // var_dump($allComponentsProductIds); die();
$result = [];
foreach ($rows as $r) {
$sid = $r['store_id'];
'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]),
];
}
--- /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;?>
+ <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'=>'Категория'],
+ ],
+]); ?>
+