]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Исправление подсчета номенклатуры
authorfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 24 Jan 2025 11:37:46 +0000 (14:37 +0300)
committerfomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 24 Jan 2025 11:37:46 +0000 (14:37 +0300)
erp24/api3/core/services/ReportService.php

index 0d83a8661c4a1ef50c3ba0b2f93c6ff2ccc4b644..86462fdf32951b55482486d5f5ed96472b8b7e98 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace yii_app\api3\core\services;
 
+use Yii;
 use yii\db\Exception;
 use yii\db\Expression;
 use yii\helpers\ArrayHelper;
@@ -840,25 +841,30 @@ class ReportService
 
         $cond = ['or'];
         foreach ($days as $ind => $day) {
-            $cond[]= ['between', 'date',
+            $cond[] = [
+                'between',
+                'date',
                 date("Y-m-d 00:00:00", strtotime($day)),
-                date("Y-m-d 23:59:59", strtotime($day))];
+                date("Y-m-d 23:59:59", strtotime($day))
+            ];
         }
-        $employeesTotal = Sales::find()->select(["COUNT(*) as cnt", "admin_id"]) // , "DATA_FORMAT(date, '%Y-%m-%d') as day"
+        $employeesTotal = Sales::find()->select(["COUNT(*) as cnt", "admin_id"]
+        ) // , "DATA_FORMAT(date, '%Y-%m-%d') as day"
         ->where(['store_id' => $data->stores])
             ->andWhere($cond)
             ->groupBy(['admin_id'])->asArray()->all();
         $employeeCountTotal = count($employeesTotal);
 
         foreach ($days as $ind => $day) {
-
-
             $employeeCount = [];
             foreach ($data->stores as $store_id) {
                 $employees = Sales::find()->select(["COUNT(*) as cnt", "admin_id"])
-                    ->where(['between', 'date',
+                    ->where([
+                        'between',
+                        'date',
                         date("Y-m-d 00:00:00", strtotime($day)),
-                        date("Y-m-d 23:59:59", strtotime($day))])
+                        date("Y-m-d 23:59:59", strtotime($day))
+                    ])
                     ->andWhere(['store_id' => $store_id])
                     ->groupBy(['admin_id'])->asArray()->all();
                 $employeeCount[$store_id] = count($employees);
@@ -883,9 +889,11 @@ class ReportService
 
             $adminPayrollDaysMonth = AdminPayrollDays::find()->select(["FLOOR(SUM(day_payroll)) as total", 'store_id'])
                 ->where([
-                    'between', 'date',
+                    'between',
+                    'date',
                     date("Y-m-01", strtotime($day)),
-                    date("Y-m-d", strtotime($day))])
+                    date("Y-m-d", strtotime($day))
+                ])
                 ->andWhere(['store_id' => $data->stores])
                 ->groupBy(['store_id'])
                 ->indexBy('store_id')
@@ -893,9 +901,11 @@ class ReportService
 
             $writeOffsMonth = WriteOffs::find()->select(['sum(summ) as total', 'store_id'])
                 ->where([
-                    'between', 'date',
+                    'between',
+                    'date',
                     date("Y-m-01 00:00:00", strtotime($day)),
-                    date("Y-m-d 23:59:59", strtotime($day))])
+                    date("Y-m-d 23:59:59", strtotime($day))
+                ])
                 ->andWhere(['type' => WriteOffsErp::WRITE_OFFS_TYPE_BRAK])
                 ->andWhere(['store_id' => array_values($store_guids)])
                 ->groupBy(['store_id'])
@@ -907,9 +917,11 @@ class ReportService
                 'store_id_1c',
             ])
                 ->where([
-                    'between', 'date',
+                    'between',
+                    'date',
                     date("Y-m-01 00:00:00", strtotime($day)),
-                    date("Y-m-d 23:59:59", strtotime($day))])
+                    date("Y-m-d 23:59:59", strtotime($day))
+                ])
                 ->andWhere(['order_id' => ['', '0']])
                 ->andWhere(['s.store_id' => $data->stores])
                 ->groupBy(['store_id_1c'])
@@ -917,200 +929,207 @@ class ReportService
                 ->asArray()->all();
 
 
+            $adminPayrollDays = AdminPayrollDays::find()->select(["FLOOR(SUM(day_payroll)) as total", 'store_id'])
+                ->where(['date' => $day])
+                ->andWhere(['store_id' => $data->stores])
+                ->groupBy(['store_id'])
+                ->indexBy('store_id')
+                ->asArray()->all();
 
-                $adminPayrollDays = AdminPayrollDays::find()->select(["FLOOR(SUM(day_payroll)) as total", 'store_id'])
-                    ->where(['date' => $day])
-                    ->andWhere(['store_id' => $data->stores])
-                    ->groupBy(['store_id'])
-                    ->indexBy('store_id')
-                    ->asArray()->all();
-
-                $date_start = $data->shift_type == 2 ?
-                    date("Y-m-d 20:00:00", strtotime($day)) :
-                    ($data->shift_type == 1 ?
-                        date("Y-m-d 08:00:00", strtotime($day)) :
-                        date("Y-m-d 00:00:00", strtotime($day)));
-                $date_end = $data->shift_type == 1 ?
-                    date("Y-m-d 20:00:00", strtotime($day)) :
-                    ($data->shift_type == 2 ?
-                        date("Y-m-d 08:00:00", strtotime("+1 day", strtotime($day))) :
-                        date("Y-m-d 00:00:00", strtotime("+1 day", strtotime($day))));
+            if ($data->shift_type == 2) {
+                // Ночная смена
+                $date_start = date("Y-m-d 20:00:00", strtotime($day));
+                $date_end = date("Y-m-d 08:00:00", strtotime("+1 day", strtotime($day)));
+            } elseif ($data->shift_type == 1) {
+                // Дневная смена
+                $date_start = date("Y-m-d 08:00:00", strtotime($day));
+                $date_end = date("Y-m-d 20:00:00", strtotime($day));
+            } else {
+                // Полная смена
+                $date_start = date("Y-m-d 00:00:00", strtotime($day));
+                $date_end = date("Y-m-d 00:00:00", strtotime("+1 day", strtotime($day)));
+            }
 
 //                return [$adminPayrollDaysMonth, $adminPayrollDays];
-                $storeVisitorsQuery = StoreVisitors::find()
-                    ->select([
-                        'counter' => new \yii\db\Expression("SUM(counter)"),
-                        'store_id'
-                    ]);
+            $storeVisitorsQuery = StoreVisitors::find()
+                ->select([
+                    'counter' => new \yii\db\Expression("SUM(counter)"),
+                    'store_id'
+                ]);
 
-                if ($data->shift_type == 1) {
-                    $storeVisitorsQuery->andWhere(['>=', 'date_hour', 8])->andWhere(['<=', 'date_hour', 20])
-                        ->andWhere(['date' => date("Y-m-d", strtotime($day))]);
-                }
-                if ($data->shift_type == 2) {
-                    $storeVisitorsQuery->andWhere([
-                        'or',
-                        [
-                            'and',
-                            ['>=', 'date_hour', 20],
-                            ['<=', 'date_hour', 23],
-                            ['date' => date("Y-m-d", strtotime($day))]
-                        ],
-                        [
-                            'and',
-                            ['>=', 'date_hour', 0],
-                            ['<=', 'date_hour', 7],
-                            ['date' => date("Y-m-d", strtotime("+1 day", strtotime($day)))]
-                        ],
-                    ]);
-                }
-                if ($data->shift_type == 0) {
-                    $storeVisitorsQuery->andWhere([
-                        'or',
-                        [
-                            'and',
-                            ['>=', 'date_hour', 8],
-                            ['<=', 'date_hour', 23],
-                            ['date' => date("Y-m-d", strtotime($day))]
-                        ],
-                        [
-                            'and',
-                            ['>=', 'date_hour', 0],
-                            ['<=', 'date_hour', 7],
-                            ['date' => date("Y-m-d", strtotime("+1 day", strtotime($day)))]
-                        ],
-                    ]);
-                }
+            if ($data->shift_type == 1) {
+                $storeVisitorsQuery->andWhere(['>=', 'date_hour', 8])->andWhere(['<=', 'date_hour', 20])
+                    ->andWhere(['date' => date("Y-m-d", strtotime($day))]);
+            }
+            if ($data->shift_type == 2) {
+                $storeVisitorsQuery->andWhere([
+                    'or',
+                    [
+                        'and',
+                        ['>=', 'date_hour', 20],
+                        ['<=', 'date_hour', 23],
+                        ['date' => date("Y-m-d", strtotime($day))]
+                    ],
+                    [
+                        'and',
+                        ['>=', 'date_hour', 0],
+                        ['<=', 'date_hour', 7],
+                        ['date' => date("Y-m-d", strtotime("+1 day", strtotime($day)))]
+                    ],
+                ]);
+            }
+            if ($data->shift_type == 0) {
+                $storeVisitorsQuery->andWhere([
+                    'or',
+                    [
+                        'and',
+                        ['>=', 'date_hour', 8],
+                        ['<=', 'date_hour', 23],
+                        ['date' => date("Y-m-d", strtotime($day))]
+                    ],
+                    [
+                        'and',
+                        ['>=', 'date_hour', 0],
+                        ['<=', 'date_hour', 7],
+                        ['date' => date("Y-m-d", strtotime("+1 day", strtotime($day)))]
+                    ],
+                ]);
+            }
 
-                $storeVisitors = $storeVisitorsQuery->andWhere(['store_id' => $data->stores])
-                    ->groupBy(['store_id'])
-                    ->indexBy('store_id')->asArray()->all();
+            $storeVisitors = $storeVisitorsQuery->andWhere(['store_id' => $data->stores])
+                ->groupBy(['store_id'])
+                ->indexBy('store_id')->asArray()->all();
 //                return [$storeVisitors];
 
-                $salesPhones = Sales::find()->select(["DISTINCT(phone)"])
-                    ->where(['between', 'date', $date_start, $date_end])
-                    ->andWhere(['IS NOT', 'phone', new Expression('NULL')])
-                    ->andWhere(['store_id' => $data->stores])
-                    ->asArray()->all();
+            $salesPhones = Sales::find()->select(["DISTINCT(phone)"])
+                ->where(['between', 'date', $date_start, $date_end])
+                ->andWhere(['IS NOT', 'phone', new Expression('NULL')])
+                ->andWhere(['store_id' => $data->stores])
+                ->asArray()->all();
 
 //                return [$salesPhones];
 
-                $sales = Sales::find()->alias('s')->select(["COUNT(*) as cnt",
-                    "sum(CASE WHEN operation='Продажа' THEN s.summ ELSE (CASE WHEN operation='Возврат' THEN -s.summ ELSE 0 END) END) as total",
-                    "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) THEN 1 ELSE 0 END) as bonusUserCount",
-                    "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) AND ((u.date_first_sale IS NOT NULL) AND (TO_CHAR(u.date_first_sale, 'YYYY-MM-DD') = TO_CHAR(s.date, 'YYYY-MM-DD'))) THEN 1 ELSE 0 END) as newBonusUserCount",
-                    "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) AND ((u.date_first_sale IS NULL) OR (TO_CHAR(u.date_first_sale, 'YYYY-MM-DD') < TO_CHAR(s.date, 'YYYY-MM-DD'))) THEN 1 ELSE 0 END) as repeatBonusUserCount",
-                    'store_id_1c',
-                ])
-                    ->leftJoin('users u', 'u.phone = s.phone::varchar(20) AND u.phone IN (\''
-                        . implode('\',\'', ArrayHelper::getColumn($salesPhones, 'phone')) .'\')')
-                    ->where(['between', 's.date', $date_start, $date_end])
-                    ->andWhere(['order_id' => ['', '0']])
-                    ->andWhere(['s.store_id' => $data->stores])
-                    ->groupBy(['store_id_1c'])
-                    ->indexBy('store_id_1c')
-                    ->asArray()->all();
+            $sales = Sales::find()->alias('s')->select([
+                "COUNT(*) as cnt",
+                "sum(CASE WHEN operation='Продажа' THEN s.summ ELSE (CASE WHEN operation='Возврат' THEN -s.summ ELSE 0 END) END) as total",
+                "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) THEN 1 ELSE 0 END) as bonusUserCount",
+                "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) AND ((u.date_first_sale IS NOT NULL) AND (TO_CHAR(u.date_first_sale, 'YYYY-MM-DD') = TO_CHAR(s.date, 'YYYY-MM-DD'))) THEN 1 ELSE 0 END) as newBonusUserCount",
+                "sum(CASE WHEN (s.phone != 0) AND (u.telegram_is_subscribed = 1) AND ((u.date_first_sale IS NULL) OR (TO_CHAR(u.date_first_sale, 'YYYY-MM-DD') < TO_CHAR(s.date, 'YYYY-MM-DD'))) THEN 1 ELSE 0 END) as repeatBonusUserCount",
+                'store_id_1c',
+            ])
+                ->leftJoin(
+                    'users u',
+                    'u.phone = s.phone::varchar(20) AND u.phone IN (\''
+                    . implode('\',\'', ArrayHelper::getColumn($salesPhones, 'phone')) . '\')'
+                )
+                ->where(['between', 's.date', $date_start, $date_end])
+                ->andWhere(['order_id' => ['', '0']])
+                ->andWhere(['s.store_id' => $data->stores])
+                ->groupBy(['store_id_1c'])
+                ->indexBy('store_id_1c')
+                ->asArray()->all();
 
 //                return [$sales];
 
-                $salesReturn = Sales::find()->alias('s')->select(["COUNT(*) as cnt", "sum(s.summ) as total", "store_id_1c"])
-                    ->where(['operation' => Sales::OPERATION_RETURN])
-                    ->andWhere(['order_id' => ['', '0']])
-                    ->andWhere(['between', 's.date', $date_start, $date_end])
-                    ->andWhere(['s.store_id' => $data->stores])
-                    ->groupBy(['store_id_1c'])
-                    ->indexBy('store_id_1c')
-                    ->asArray()->all();
+            $salesReturn = Sales::find()->alias('s')->select(["COUNT(*) as cnt", "sum(s.summ) as total", "store_id_1c"])
+                ->where(['operation' => Sales::OPERATION_RETURN])
+                ->andWhere(['order_id' => ['', '0']])
+                ->andWhere(['between', 's.date', $date_start, $date_end])
+                ->andWhere(['s.store_id' => $data->stores])
+                ->groupBy(['store_id_1c'])
+                ->indexBy('store_id_1c')
+                ->asArray()->all();
 
 //                return [$salesReturn];
 
-                $writeOffs = WriteOffs::find()->select(['sum(summ) as total', 'store_id'])
-                    ->where(['between', 'date', $date_start, $date_end])
-                    ->andWhere(['type' => WriteOffsErp::WRITE_OFFS_TYPE_BRAK])
-                    ->andWhere(['store_id' => array_values($store_guids)])
-                    ->groupBy(['store_id'])
-                    ->indexBy('store_id')
-                    ->asArray()->all();
+            $writeOffs = WriteOffs::find()->select(['sum(summ) as total', 'store_id'])
+                ->where(['between', 'date', $date_start, $date_end])
+                ->andWhere(['type' => WriteOffsErp::WRITE_OFFS_TYPE_BRAK])
+                ->andWhere(['store_id' => array_values($store_guids)])
+                ->groupBy(['store_id'])
+                ->indexBy('store_id')
+                ->asArray()->all();
 
 //                return [$writeOffsMonth, $writeOffs];
 
-                $specificSales = [];
-                foreach (['matrix', 'wrap', 'services', 'potted'] as $productTip) {
-                    $productsClass = ProductsClass::find()->select(['category_id', 'tip'])
-                        ->where(['tip' => $productTip])
-                        ->indexBy('category_id')
-                        ->asArray()->all();
-
-                    $products1c = Products1c::find()->select(['id', 'parent_id', 'name'])
-                        ->where(['parent_id' => array_keys($productsClass), 'tip' => 'products'])
-                        ->indexBy(['id'])
-                        ->asArray()->all();
-
-                    $salesMatrix = Sales::find()->alias('s')->select([
-                        "sum(CASE WHEN operation='Продажа' THEN p.summ ELSE (CASE WHEN operation='Возврат' THEN -p.summ ELSE 0 END) END) as total",
-                        'store_id'
-                    ])                        ->leftJoin('sales_products p', 'p.check_id = s.id')
-                        ->where(['between', 's.date', $date_start, $date_end])
-                        ->andWhere(['order_id' => ['', '0']])
-                        ->andWhere(['p.product_id' => array_keys($products1c)])
-                        ->andWhere(['store_id' => $data->stores])
-                        ->groupBy(['store_id'])
-                        ->indexBy('store_id')
-                        ->asArray()->all();
+            $specificSales = [];
+            foreach (['matrix', 'wrap', 'services', 'potted'] as $productTip) {
+                $productsClass = ProductsClass::find()->select(['category_id', 'tip'])
+                    ->where(['tip' => $productTip])
+                    ->indexBy('category_id')
+                    ->asArray()->all();
 
-                    $specificSales[$productTip] = $salesMatrix;
-                }
+                $products1c = Products1c::find()->select(['id', 'parent_id', 'name'])
+                    ->where(['parent_id' => array_keys($productsClass), 'tip' => 'products'])
+                    ->indexBy(['id'])
+                    ->asArray()->all();
 
-//                return [$specificSales];
+                $salesMatrix = Sales::find()->alias('s')->select([
+                    "sum(CASE WHEN operation='Продажа' THEN p.summ ELSE (CASE WHEN operation='Возврат' THEN -p.summ ELSE 0 END) END) as total",
+                    'store_id'
+                ])->leftJoin('sales_products p', 'p.check_id = s.id')
+                    ->where(['between', 's.date', $date_start, $date_end])
+                    ->andWhere(['order_id' => ['', '0']])
+                    ->andWhere(['p.product_id' => array_keys($products1c)])
+                    ->andWhere(['store_id' => $data->stores])
+                    ->groupBy(['store_id'])
+                    ->indexBy('store_id')
+                    ->asArray()->all();
 
-                $storeVisitorsQuantity = [];
-                $storeSaleQuantity = [];
-                $storeSaleTotal = [];
-                $storeSaleReturnQuantity = [];
-                $storeSaleReturnTotal = [];
-                $storeSaleBonusCount = [];
-                $storeSaleNewBonusCount = [];
-                $storeSaleRepeatBonusCount = [];
-                foreach ($data->stores as $store_id) {
-                    $storeVisitorsQuantity[$store_id] = (int)($storeVisitors[$store_id]['counter'] ?? 0);
-                    $storeSaleQuantity[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['cnt'] ?? 0);
-                    $storeSaleTotal[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['total'] ?? 0);
-                    $storeSaleReturnQuantity[$store_id] = (int)($salesReturn[$eitStores[$store_id]['export_val']]['cnt'] ?? 0);
-                    $storeSaleReturnTotal[$store_id] = (int)($salesReturn[$eitStores[$store_id]['export_val']]['total'] ?? 0);
-                    $storeSaleBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['bonusUserCount'] ?? 0);
-                    $storeSaleNewBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['newBonusUserCount'] ?? 0);
-                    $storeSaleRepeatBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['repeatBonusUserCount'] ?? 0);
+                $specificSales[$productTip] = $salesMatrix;
+            }
 
-                    $storeVisitorsQuantityTotal[$store_id] = ($storeVisitorsQuantityTotal[$store_id] ?? 0) + $storeVisitorsQuantity[$store_id];
-                    $storeSaleQuantityTotal[$store_id] = ($storeSaleQuantityTotal[$store_id] ?? 0) + $storeSaleQuantity[$store_id];
-                    $storeSaleTotalTotal[$store_id] = ($storeSaleTotalTotal[$store_id] ?? 0) + $storeSaleTotal[$store_id];
-                    $storeSaleReturnQuantityTotal[$store_id] = ($storeSaleReturnQuantityTotal[$store_id] ?? 0) + $storeSaleReturnQuantity[$store_id];
-                    $storeSaleReturnTotalTotal[$store_id] = ($storeSaleReturnTotalTotal[$store_id] ?? 0) + $storeSaleReturnTotal[$store_id];
-                    $storeSaleBonusCountTotal[$store_id] = ($storeSaleBonusCountTotal[$store_id] ?? 0) + $storeSaleBonusCount[$store_id];
-                    $storeSaleNewBonusCountTotal[$store_id] = ($storeSaleNewBonusCountTotal[$store_id] ?? 0) + $storeSaleNewBonusCount[$store_id];
-                    $storeSaleRepeatBonusCountTotal[$store_id] = ($storeSaleRepeatBonusCountTotal[$store_id] ?? 0) + $storeSaleRepeatBonusCount[$store_id];
+          //    return [$specificSales];
 
-                    $totalWriteOffsPerDateTotal[$store_id] = ($totalWriteOffsPerDateTotal[$store_id] ?? 0) + (int)($writeOffs[$store_guids[$store_id]]["total"] ?? 0);
-                    $totalPayrollDaysTotal[$store_id] = ($totalPayrollDaysTotal[$store_id] ?? 0) + (int)($adminPayrollDays[$store_id]['total'] ?? 0);
+            $storeVisitorsQuantity = [];
+            $storeSaleQuantity = [];
+            $storeSaleTotal = [];
+            $storeSaleReturnQuantity = [];
+            $storeSaleReturnTotal = [];
+            $storeSaleBonusCount = [];
+            $storeSaleNewBonusCount = [];
+            $storeSaleRepeatBonusCount = [];
+            foreach ($data->stores as $store_id) {
+                $storeVisitorsQuantity[$store_id] = (int)($storeVisitors[$store_id]['counter'] ?? 0);
+                $storeSaleQuantity[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['cnt'] ?? 0);
+                $storeSaleTotal[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['total'] ?? 0);
+                $storeSaleReturnQuantity[$store_id] = (int)($salesReturn[$eitStores[$store_id]['export_val']]['cnt'] ?? 0);
+                $storeSaleReturnTotal[$store_id] = (int)($salesReturn[$eitStores[$store_id]['export_val']]['total'] ?? 0);
+                $storeSaleBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['bonusUserCount'] ?? 0);
+                $storeSaleNewBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['newBonusUserCount'] ?? 0);
+                $storeSaleRepeatBonusCount[$store_id] = (int)($sales[$eitStores[$store_id]['export_val']]['repeatBonusUserCount'] ?? 0);
+
+                $storeVisitorsQuantityTotal[$store_id] = ($storeVisitorsQuantityTotal[$store_id] ?? 0) + $storeVisitorsQuantity[$store_id];
+                $storeSaleQuantityTotal[$store_id] = ($storeSaleQuantityTotal[$store_id] ?? 0) + $storeSaleQuantity[$store_id];
+                $storeSaleTotalTotal[$store_id] = ($storeSaleTotalTotal[$store_id] ?? 0) + $storeSaleTotal[$store_id];
+                $storeSaleReturnQuantityTotal[$store_id] = ($storeSaleReturnQuantityTotal[$store_id] ?? 0) + $storeSaleReturnQuantity[$store_id];
+                $storeSaleReturnTotalTotal[$store_id] = ($storeSaleReturnTotalTotal[$store_id] ?? 0) + $storeSaleReturnTotal[$store_id];
+                $storeSaleBonusCountTotal[$store_id] = ($storeSaleBonusCountTotal[$store_id] ?? 0) + $storeSaleBonusCount[$store_id];
+                $storeSaleNewBonusCountTotal[$store_id] = ($storeSaleNewBonusCountTotal[$store_id] ?? 0) + $storeSaleNewBonusCount[$store_id];
+                $storeSaleRepeatBonusCountTotal[$store_id] = ($storeSaleRepeatBonusCountTotal[$store_id] ?? 0) + $storeSaleRepeatBonusCount[$store_id];
+
+                $totalWriteOffsPerDateTotal[$store_id] = ($totalWriteOffsPerDateTotal[$store_id] ?? 0) + (int)($writeOffs[$store_guids[$store_id]]["total"] ?? 0);
+                $totalPayrollDaysTotal[$store_id] = ($totalPayrollDaysTotal[$store_id] ?? 0) + (int)($adminPayrollDays[$store_id]['total'] ?? 0);
 
-                    $totalSpecificPerDay = [];
-                    foreach (['matrix', 'wrap', 'services', 'potted'] as $spec) {
-                        $totalSpecificPerDay[$store_id][$spec] = 0;
-                        foreach ($specificSales[$spec][$store_id] ?? [] as $specificSale) {
-                            $totalSpecificPerDay[$store_id][$spec] += (float)($specificSale ?? 0);
-                        }
+                $totalSpecificPerDay = [];
+                foreach (['matrix', 'wrap', 'services', 'potted'] as $spec) {
+                    $totalSpecificPerDay[$store_id][$spec] = 0.0;
+                    if (isset($specificSales[$spec][$store_id])) {
+                        $totalSpecificPerDay[$store_id][$spec] += (float)$specificSales[$spec][$store_id]['total'];
                     }
-                    $totalMatrixPerDay[$store_id] = $totalSpecificPerDay[$store_id]['matrix'];
-                    $totalWrapPerDay[$store_id] = $totalSpecificPerDay[$store_id]['wrap'];
-                    $totalServicePerDay[$store_id] = $totalSpecificPerDay[$store_id]['services'];
-                    $totalPottedPerDay[$store_id] = $totalSpecificPerDay[$store_id]['potted'];
-
-                    $totalMatrixPerDayTotal[$store_id] = ($totalMatrixPerDayTotal[$store_id] ?? 0) + $totalMatrixPerDay[$store_id];
-                    $totalWrapPerDayTotal[$store_id] = ($totalWrapPerDayTotal[$store_id] ?? 0) + $totalWrapPerDay[$store_id];
-                    $totalServicePerDayTotal[$store_id] = ($totalServicePerDayTotal[$store_id] ?? 0) + $totalServicePerDay[$store_id];
-                    $totalPottedPerDayTotal[$store_id] = ($totalPottedPerDayTotal[$store_id] ?? 0) + $totalPottedPerDay[$store_id];
+                    Yii::warning($totalSpecificPerDay[$store_id][$spec], 'specificSales');
                 }
 
+                $totalMatrixPerDay[$store_id] = $totalSpecificPerDay[$store_id]['matrix'];
+                $totalWrapPerDay[$store_id] = $totalSpecificPerDay[$store_id]['wrap'];
+                $totalServicePerDay[$store_id] = $totalSpecificPerDay[$store_id]['services'];
+                $totalPottedPerDay[$store_id] = $totalSpecificPerDay[$store_id]['potted'];
+
+                $totalMatrixPerDayTotal[$store_id] = ($totalMatrixPerDayTotal[$store_id] ?? 0) + $totalMatrixPerDay[$store_id];
+                $totalWrapPerDayTotal[$store_id] = ($totalWrapPerDayTotal[$store_id] ?? 0) + $totalWrapPerDay[$store_id];
+                $totalServicePerDayTotal[$store_id] = ($totalServicePerDayTotal[$store_id] ?? 0) + $totalServicePerDay[$store_id];
+                $totalPottedPerDayTotal[$store_id] = ($totalPottedPerDayTotal[$store_id] ?? 0) + $totalPottedPerDay[$store_id];
+            }
 
 
             $stores = [];
@@ -1121,34 +1140,58 @@ class ReportService
                     "sale_month_total" => ($salesMonth[$store_guids[$store_id]]["total"] ?? 0),
                     "sale_total" => $storeSaleTotalTotal[$store_id] ?? 0,
                     "sale_quantity" => $storeSaleQuantityTotal[$store_id] ?? 0,
-                    "sale_avg" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor($storeSaleTotalTotal[$store_id] / $storeSaleQuantityTotal[$store_id]) : 0,
+                    "sale_avg" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor(
+                        $storeSaleTotalTotal[$store_id] / $storeSaleQuantityTotal[$store_id]
+                    ) : 0,
                     "total_write_offs_per_date" => $totalWriteOffsPerDateTotal[$store_id] ?? 0,
-                    "total_write_offs_per_date_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor($totalWriteOffsPerDateTotal[$store_id] / $storeSaleTotalTotal[$store_id] * 100) : 0,
-                    "total_write_offs_per_month" => (int)($writeOffsMonth[$store_guids[$store_id]]["total"] ?? 0),//$totalWriteOffsPerMonthTotal[$store_id] ?? 0,
+                    "total_write_offs_per_date_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor(
+                        $totalWriteOffsPerDateTotal[$store_id] / $storeSaleTotalTotal[$store_id] * 100
+                    ) : 0,
+                    "total_write_offs_per_month" => (int)($writeOffsMonth[$store_guids[$store_id]]["total"] ?? 0),
+                    //$totalWriteOffsPerMonthTotal[$store_id] ?? 0,
 //                    "total_write_offs_per_month_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor((int)($writeOffsMonth[$store_guids[$store_id]]["total"] ?? 0) / $storeSaleTotalTotal[$store_id] * 100) : 0,
-                    "total_write_offs_per_month_percent" => ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) > 0 ? floor((int)($writeOffsMonth[$store_guids[$store_id]]["total"] ?? 0) / ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) * 100) : 0,
+                    "total_write_offs_per_month_percent" => ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) > 0 ? floor(
+                        (int)($writeOffsMonth[$store_guids[$store_id]]["total"] ?? 0) / ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) * 100
+                    ) : 0,
                     "total_payroll_days" => $totalPayrollDaysTotal[$store_id] ?? 0,
-                    "total_payroll_days_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor($totalPayrollDaysTotal[$store_id] / $storeSaleTotalTotal[$store_id] * 100) : 0,
-                    "total_payroll_month" => (int)($adminPayrollDaysMonth[$store_id]['total'] ?? 0),//$totalPayrollMonthTotal[$store_id] ?? 0,
+                    "total_payroll_days_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor(
+                        $totalPayrollDaysTotal[$store_id] / $storeSaleTotalTotal[$store_id] * 100
+                    ) : 0,
+                    "total_payroll_month" => (int)($adminPayrollDaysMonth[$store_id]['total'] ?? 0),
+                    //$totalPayrollMonthTotal[$store_id] ?? 0,
 //                    "total_payroll_month_percent" => $storeSaleTotalTotal[$store_id] ?? 0 > 0 ? floor(($adminPayrollDaysMonth[$store_id]['total'] ?? 0) / $storeSaleTotalTotal[$store_id] * 100) : 0,
-                    "total_payroll_month_percent" => ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) > 0 ? floor(($adminPayrollDaysMonth[$store_id]['total'] ?? 0) / ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) * 100) : 0,
-                    "employee_sale_avg" => $employeeCount[$store_id] ?? 0 > 0 ? floor($storeSaleTotalTotal[$store_id] / $employeeCount[$store_id]) : 0,
+                    "total_payroll_month_percent" => ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) > 0 ? floor(
+                        ($adminPayrollDaysMonth[$store_id]['total'] ?? 0) / ($salesMonth[$store_guids[$store_id]]["total"] ?? 0) * 100
+                    ) : 0,
+                    "employee_sale_avg" => $employeeCount[$store_id] ?? 0 > 0 ? floor(
+                        $storeSaleTotalTotal[$store_id] / $employeeCount[$store_id]
+                    ) : 0,
                     "visitors_quantity" => $storeVisitorsQuantityTotal[$store_id] ?? 0,
-                    "conversion" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor($storeVisitorsQuantityTotal[$store_id] / $storeSaleQuantityTotal[$store_id] * 100) : 0,
+                    "conversion" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor(
+                        $storeVisitorsQuantityTotal[$store_id] / $storeSaleQuantityTotal[$store_id] * 100
+                    ) : 0,
                     "bonus_user_count" => $storeSaleBonusCountTotal[$store_id] ?? 0,
-                    "bonus_user_per_sale_percent" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor($storeSaleBonusCountTotal[$store_id] / $storeSaleQuantityTotal[$store_id] * 100) : 0,
+                    "bonus_user_per_sale_percent" => $storeSaleQuantityTotal[$store_id] ?? 0 > 0 ? floor(
+                        $storeSaleBonusCountTotal[$store_id] / $storeSaleQuantityTotal[$store_id] * 100
+                    ) : 0,
                     "bonus_new_user_count" => $storeSaleNewBonusCountTotal[$store_id] ?? 0,
                     "bonus_repeat_user_count" => $storeSaleRepeatBonusCountTotal[$store_id] ?? 0,
                     "sale_return_quantity" => $storeSaleReturnQuantityTotal[$store_id] ?? 0,
                     "sale_return_total" => $storeSaleReturnTotalTotal[$store_id] ?? 0,
                     "total_matrix_per_day" => $totalMatrixPerDayTotal[$store_id] ?? 0,
-                    "total_matrix_per_day_percent" => ($storeSaleTotalTotal[$store_id] ?? 0) > 0 ? floor(($totalMatrixPerDayTotal[$store_id] ?? 0) / $storeSaleTotalTotal[$store_id] * 100) : 0,
+                    "total_matrix_per_day_percent" => ($storeSaleTotalTotal[$store_id] ?? 0) > 0 ? floor(
+                        ($totalMatrixPerDayTotal[$store_id] ?? 0) / $storeSaleTotalTotal[$store_id] * 100
+                    ) : 0,
                     "total_wrap_per_day" => $totalWrapPerDayTotal[$store_id] ?? 0,
                     "total_services_per_day" => $totalServicePerDayTotal[$store_id] ?? 0,
                     "total_potted_per_day" => $totalPottedPerDayTotal[$store_id] ?? 0,
                 ];
-                $stores []= ['id' => $store_id, 'guid' => $eitStores[$store_id]['export_val'],
-                    'name' => $cityStoreNames[$store_id], 'data' => $store];
+                $stores [] = [
+                    'id' => $store_id,
+                    'guid' => $eitStores[$store_id]['export_val'],
+                    'name' => $cityStoreNames[$store_id],
+                    'data' => $store
+                ];
 
                 $total["sale_month_total"] = ($total["sale_month_total"] ?? 0) + ($salesMonth[$store_guids[$store_id]]["total"] ?? 0);
                 $total["sale_total"] = ($total["sale_total"] ?? 0) + ($storeSaleTotalTotal[$store_id] ?? 0);
@@ -1172,26 +1215,44 @@ class ReportService
                 $total["sale_return_quantity"] = ($total["sale_return_quantity"] ?? 0) + ($storeSaleReturnQuantityTotal[$store_id] ?? 0);
                 $total["sale_return_total"] = ($total["sale_return_total"] ?? 0) + ($storeSaleReturnTotalTotal[$store_id] ?? 0);
                 $total["total_matrix_per_day"] = ($total["total_matrix_per_day"] ?? 0) + ($totalMatrixPerDayTotal[$store_id] ?? 0);
-                $total["total_matrix_per_day_percent"] = $total["sale_total"] > 0 ? floor($total["total_matrix_per_day"] / $total["sale_total"] * 100) : 0;
+                $total["total_matrix_per_day_percent"] = $total["sale_total"] > 0 ? floor(
+                    $total["total_matrix_per_day"] / $total["sale_total"] * 100
+                ) : 0;
                 $total["total_wrap_per_day"] = ($total["total_wrap_per_day"] ?? 0) + ($totalWrapPerDayTotal[$store_id] ?? 0);
                 $total["total_services_per_day"] = ($total["total_services_per_day"] ?? 0) + ($totalServicePerDayTotal[$store_id] ?? 0);
                 $total["total_potted_per_day"] = ($total["total_potted_per_day"] ?? 0) + ($totalPottedPerDayTotal[$store_id] ?? 0);
             }
-            $total["sale_avg"] = $total["sale_quantity"] > 0 ? floor($total["sale_total"] / $total["sale_quantity"]) : 0;
-            $total["total_write_offs_per_date_percent"] = $total["sale_total"] > 0 ? floor($total["total_write_offs_per_date"] / $total["sale_total"] * 100) : 0;
-            $total["total_write_offs_per_month_percent"] = $total["sale_month_total"] > 0 ? floor($total["total_write_offs_per_month"] / $total["sale_month_total"] * 100) : 0;
-            $total["total_payroll_days_percent"] = $total["sale_total"] > 0 ? floor($total["total_payroll_days"] / $total["sale_total"] * 100) : 0;
-            $total["total_payroll_month_percent"] = $total["sale_month_total"] > 0 ? floor($total["total_payroll_month"] / $total["sale_month_total"] * 100) : 0;
-            $total["employee_sale_avg"] = $employeeCountTotal > 0 ? floor($total["sale_total"] / $employeeCountTotal) : 0;
-            $total["conversion"] = $total["visitors_quantity"] > 0 ? floor($total["sale_quantity"] / $total["visitors_quantity"] * 100) : 0;;
-            $total["bonus_user_per_sale_percent"] = $total["sale_quantity"] > 0 ? floor($total["bonus_user_count"] / $total["sale_quantity"] * 100) : 0;
+            $total["sale_avg"] = $total["sale_quantity"] > 0 ? floor(
+                $total["sale_total"] / $total["sale_quantity"]
+            ) : 0;
+            $total["total_write_offs_per_date_percent"] = $total["sale_total"] > 0 ? floor(
+                $total["total_write_offs_per_date"] / $total["sale_total"] * 100
+            ) : 0;
+            $total["total_write_offs_per_month_percent"] = $total["sale_month_total"] > 0 ? floor(
+                $total["total_write_offs_per_month"] / $total["sale_month_total"] * 100
+            ) : 0;
+            $total["total_payroll_days_percent"] = $total["sale_total"] > 0 ? floor(
+                $total["total_payroll_days"] / $total["sale_total"] * 100
+            ) : 0;
+            $total["total_payroll_month_percent"] = $total["sale_month_total"] > 0 ? floor(
+                $total["total_payroll_month"] / $total["sale_month_total"] * 100
+            ) : 0;
+            $total["employee_sale_avg"] = $employeeCountTotal > 0 ? floor(
+                $total["sale_total"] / $employeeCountTotal
+            ) : 0;
+            $total["conversion"] = $total["visitors_quantity"] > 0 ? floor(
+                $total["sale_quantity"] / $total["visitors_quantity"] * 100
+            ) : 0;;
+            $total["bonus_user_per_sale_percent"] = $total["sale_quantity"] > 0 ? floor(
+                $total["bonus_user_count"] / $total["sale_quantity"] * 100
+            ) : 0;
 
             $report = [
                 "date" => $day,
                 "stores" => $stores,
                 "total" => $total,
             ];
-            $reports []= $report;
+            $reports [] = $report;
         }
         return $reports;
     }