]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Метод вычисления недельной доли вида
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 5 May 2025 15:01:36 +0000 (18:01 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Mon, 5 May 2025 15:01:36 +0000 (18:01 +0300)
erp24/controllers/AutoPlannogrammaController.php
erp24/services/AutoPlannogrammaService.php

index bf1d674abb437c3a62e10d941eca3040f4f29f32..2ba5a77566e2502a46d4a3c17d2e5ef15faa6c62 100644 (file)
@@ -316,6 +316,10 @@ class AutoPlannogrammaController extends BaseController
 
             }
 
+            $weeksShareResult = $service->getWeeksSpeciesShare($dateFrom, $dateTo, $filters, null, 'writeOffs');
+            $weeksData = $weeksShareResult['weeksData'];
+            $weeksShareResult = $weeksShareResult['weeksShare'];
+
         }
 
         return $this->render('control-species', [
@@ -330,53 +334,5 @@ class AutoPlannogrammaController extends BaseController
         ]);
     }
 
-    /**
-     * Возвращает список подкатегорий для выбранной категории.
-     * @param string $category
-     * @return array JSON-ответ со списком подкатегорий
-     */
-    public function actionGetSubcategories($category)
-    {
-        Yii::$app->response->format = Response::FORMAT_JSON;
-        $subcategories = Products1cNomenclature::find()
-            ->select('subcategory')
-            ->distinct()
-            ->where(['category' => $category])
-            ->orderBy('subcategory')
-            ->asArray()
-            ->all();
-
-        $out = [];
-        foreach ($subcategories as $item) {
-            if (!empty($item['subcategory'])) {
-                $out[] = ['id' => $item['subcategory'], 'name' => $item['subcategory']];
-            }
-        }
-        return $out;
-    }
 
-    /**
-     * Возвращает список видов для выбранной подкатегории.
-     * @param string $subcategory
-     * @return array JSON-ответ со списком видов
-     */
-    public function actionGetSpecies($subcategory)
-    {
-        \Yii::$app->response->format = Response::FORMAT_JSON;
-        $species = Products1cNomenclature::find()
-            ->select('species')
-            ->distinct()
-            ->where(['subcategory' => $subcategory])
-            ->orderBy('species')
-            ->asArray()
-            ->all();
-
-        $out = [];
-        foreach ($species as $item) {
-            if (!empty($item['species'])) {
-                $out[] = ['id' => $item['species'], 'name' => $item['species']];
-            }
-        }
-        return $out;
-    }
 }
index 79c5de6b7cff7f14e1ec87e9cff5ae2343bab733..0cf0498f3605bd00c321b2929de980ce978b4d7a 100644 (file)
@@ -495,4 +495,86 @@ class AutoPlannogrammaService
         return $result;
     }
 
+    /**
+     * Для заданного магазина/фильтров получает по 1–5 неделям внутри месяца
+     * и рассчитывает для каждого вида (species) долю недельного объёма
+     * от месячного итога.
+     *
+     * @param string      $dateFrom       начало месяца (Y-m-d H:i:s)
+     * @param string      $dateTo         конец месяца  (Y-m-d H:i:s)
+     * @param array       $filters        ['store_id'=>..., 'category'=>..., ...]
+     * @param array|null  $productFilter  опц. фильтр по product_id
+     * @param string      $type           'sales' или 'writeOffs'
+     * @return array{
+     *     weeksData: array<int, array>,      // сырые данные по каждой неделе
+     *     weeksShare: array<int, array>      // доля недели от месячного итога
+     * }
+     */
+    public function getWeeksSpeciesShare(
+        string $dateFrom,
+        string $dateTo,
+        array  $filters,
+        ?array $productFilter,
+        string $type = 'writeOffs'
+    ): array
+    {
+        $monthResult = $this->getMonthSpeciesShareOrWriteOffDate(
+            $dateFrom, $dateTo, $filters, $productFilter, $type
+        );
+
+        $speciesMonthTotals = [];
+        foreach ($monthResult as $r) {
+            $speciesMonthTotals
+            [$r['store_id']]
+            [$r['category']]
+            [$r['subcategory']]
+            [$r['species']] = $r['total_sum'];
+        }
+
+        $weeksData = [];
+        $weeksShareResult = [];
+        foreach (range(1, 5) as $ind) {
+            $weekStart = date("Y-m-d 00:00:00", strtotime("+" . (($ind - 1) * 7) . ' days', strtotime($dateFrom)));
+            $weekEnd = date("Y-m-d 23:59:59", strtotime("+" . ($ind * 7 - 1) . ' days', strtotime($dateFrom)));
+            if ($weekEnd > $dateTo) {
+                $weekEnd = $dateTo;
+            }
+            if ($weekStart > $dateTo) {
+                continue;
+            }
+            $weekResult = $this->getMonthSpeciesShareOrWriteOffDate(
+                $weekStart,
+                $weekEnd,
+                $filters,
+                null,
+                $type
+            );
+            $weeksData[$ind] = $weekResult;
+            if (!$weekResult) {
+                continue;
+            }
+            $weeksShareResult[$ind] = [];
+            foreach ($weekResult as $weekRow) {
+                $monthSum = $speciesMonthTotals
+                [$weekRow['store_id']]
+                [$weekRow['category']]
+                [$weekRow['subcategory']]
+                [$weekRow['species']] ?? null;
+
+                if ($monthSum) {
+                    $weeksShareResult[$ind]
+                    [$weekRow['category']]
+                    [$weekRow['subcategory']]
+                    [$weekRow['species']] = $weekRow['total_sum'] / $monthSum;
+                }
+
+            }
+
+        }
+        return [
+            'weeksData'  => $weeksData,
+            'weeksShare' => $weeksShareResult,
+        ];
+    }
+
 }