]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
fix(ERP-372): синхронизировать фильтры getSalesCountSum с getSalesSum fix_filippov_ERP-372_avg_check_dashboard origin/fix_filippov_ERP-372_avg_check_dashboard
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 30 Apr 2026 08:04:00 +0000 (11:04 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Thu, 30 Apr 2026 08:04:00 +0000 (11:04 +0300)
На дашборде /dashboard/sales для магазинов с большой долей доставки
(например, 07 Аэродромная 28) средний чек расходился с суммой продаж:
avg = sum_count_query / cnt_count_query, при этом колонка «сумма продаж»
показывала результат другого запроса (getSalesSum) с более узким
фильтром.

Привожу getSalesCountSum к тем же условиям:
- LEFT JOIN sales sc ON sc.id = s.sales_check
- sc.order_id IS NULL OR IN ('','0')   — отбрасываем строки, привязанные
  через sales_check к доставочной продаже;
- s.marketplace_order_id IS NULL OR =''  — отбрасываем продажи маркетплейсов.

После фикса avg = sum / cnt совпадает с тем, что выводится в колонке
«сумма продаж».

Тесты (9/9 GREEN): unit на структуру SQL и биндинг параметров +
интеграционные на реальной БД (insert/rollback в транзакции),
проверяющие исключение маркетплейс- и доставочно-связанных продаж.

erp24/services/SalesService.php

index c446c17192a6e9b382f3f3da1ca3336a3a675db9..ecf4d1297e97f493717ea1eaeae6120ebc2f7118 100755 (executable)
@@ -386,35 +386,55 @@ class SalesService
     {
         $connection = Yii::$app->getDb();
 
-
+        // ERP-372: фильтры синхронизированы с getSalesSum(), чтобы счётчик чеков
+        // и сумма совпадали со значениями в колонке «сумма продаж» на дашборде.
+        // Без JOIN sales sc и условия по marketplace_order_id средний чек
+        // расходился с суммой продаж для магазинов с большой долей доставки
+        // (например, 07 Аэродромная 28).
         $orderCondition = "
             AND
                 (
-                    \"order_id\" = ''
+                    s.\"order_id\" = ''
                 OR
-                    \"order_id\" = '0'
-                )  
+                    s.\"order_id\" = '0'
+                )
+            AND
+                (
+                    sc.\"order_id\" IS NULL
+                OR
+                    sc.\"order_id\" = ''
+                OR
+                    sc.\"order_id\" = '0'
+                )
+            AND
+                (
+                    s.\"marketplace_order_id\" IS NULL
+                OR
+                    s.\"marketplace_order_id\" = ''
+                )
             ";
 
 
         $queryRow = "
-            SELECT 
+            SELECT
                 count(*) as cnt,
-                sum(case when phone is distinct from NULL THEN 1 ELSE 0 END) as bonus_clients_cnt,
-                sum(summ-skidka) as summ,
-                store_id,
-                to_char(date,'YYYY-MM-DD') as date_t
-            FROM 
-                sales
+                sum(case when s.phone is distinct from NULL THEN 1 ELSE 0 END) as bonus_clients_cnt,
+                sum(s.summ - s.skidka) as summ,
+                s.store_id,
+                to_char(s.date,'YYYY-MM-DD') as date_t
+            FROM
+                sales s
+            LEFT JOIN
+                sales sc ON sc.id = s.sales_check
             WHERE
-                date>=:date_from
+                s.date>=:date_from
             AND
-                date<=:date_to
+                s.date<=:date_to
             AND
-                operation=:operation
-            
+                s.operation=:operation
+
             " . $orderCondition . "
-            
+
             ";
 
 
@@ -427,8 +447,8 @@ class SalesService
             }
             $payArrCondition = "
             AND
-            
-               \"pay_arr\" IN (" . $payType . ")
+
+               s.\"pay_arr\" IN (" . $payType . ")
 
             ";
         }
@@ -439,7 +459,7 @@ class SalesService
 
             GROUP BY
                 date_t,
-                store_id
+                s.store_id
             ORDER BY
                 date_t DESC,
                 cnt DESC