From: Aleksey Filippov Date: Thu, 30 Apr 2026 08:04:00 +0000 (+0300) Subject: fix(ERP-372): синхронизировать фильтры getSalesCountSum с getSalesSum X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;ds=inline;p=erp24_rep%2Fyii-erp24%2F.git fix(ERP-372): синхронизировать фильтры getSalesCountSum с getSalesSum На дашборде /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 в транзакции), проверяющие исключение маркетплейс- и доставочно-связанных продаж. --- 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