From d341e1e98719dd2f579bca8c4379729ec8013f51 Mon Sep 17 00:00:00 2001 From: Aleksey Filippov Date: Thu, 30 Apr 2026 11:04:00 +0300 Subject: [PATCH] =?utf8?q?fix(ERP-372):=20=D1=81=D0=B8=D0=BD=D1=85=D1=80?= =?utf8?q?=D0=BE=D0=BD=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82?= =?utf8?q?=D1=8C=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D1=8B=20getSalesCo?= =?utf8?q?untSum=20=D1=81=20getSalesSum?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit На дашборде /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 | 58 ++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/erp24/services/SalesService.php b/erp24/services/SalesService.php index c446c171..ecf4d129 100755 --- a/erp24/services/SalesService.php +++ b/erp24/services/SalesService.php @@ -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 -- 2.39.5