]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
корректировка дней
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 5 Dec 2025 12:24:36 +0000 (15:24 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Fri, 5 Dec 2025 12:24:36 +0000 (15:24 +0300)
erp24/api3/core/services/ReportService.php

index 06671c7c160d20eea3e617a25bcafd098f9fad18..0234afa174e43ec768167dbe9d4727f7f7cd3f3b 100644 (file)
@@ -1400,8 +1400,14 @@ class ReportService
      * ВАЖНО: При расчете количества сотрудников на смене учитывается тип смены:
      * - shift_type = 1 (дневная): учитываются только сотрудники с shift_id = 1
      * - shift_type = 2 (ночная): учитываются только сотрудники с shift_id = 2
-     * - shift_type = 0 (обе смены): учитываются все смены, причем если сотрудник
-     *   работает и в дневную, и в ночную смену, он учитывается как 2 человека (дважды)
+     * - shift_type = 0 (обе смены): учитываются уникальные комбинации (admin_id, shift_id).
+     *   Если сотрудник работает и в дневную, и в ночную смену, он учитывается дважды.
+     *   Если сотрудник имеет несколько записей на одной смене в один день, 
+     *   он учитывается один раз на эту смену.
+     * 
+     * При наличии одного магазина, данные в stores[0].data и total идентичны.
+     * При нескольких магазинах, в total дедуплицируются сотрудники, работающие 
+     * в нескольких магазинах одновременно.
      * 
      * @param object $data Параметры запроса:
      *   - date: дата окончания периода (начало = первое число месяца)
@@ -1454,9 +1460,10 @@ class ReportService
 
         // Для типа смены 0 (обе смены) считаем каждую смену отдельно
         if ($data->shift_type == 0) {
-            // Для обеих смен нужны все записи смен
+            // Для обеих смен нужны уникальные комбинации admin_id и shift_id
             $allAdminsInPeriod = $allAdminsInPeriodQuery
                 ->select(['admin_id', 'shift_id'])
+                ->distinct()
                 ->asArray()
                 ->all();
             $employeeCountTotal = count($allAdminsInPeriod);
@@ -1510,6 +1517,7 @@ class ReportService
                 if ($data->shift_type == 0) {
                     $employees = $employeesQuery
                         ->select(['admin_id', 'shift_id'])
+                        ->distinct()
                         ->asArray()
                         ->all();
                 } else {
@@ -1528,17 +1536,27 @@ class ReportService
 
                 // Добавляем сотрудников этого магазина в общий массив за день
                 foreach ($employees as $employee) {
-                    if ($data->shift_type == 0) {
-                        // Для обеих смен создаем уникальный ключ с учетом shift_id
-                        $key = $employee['admin_id'] . '_' . $employee['shift_id'];
-                        $allDayEmployees[$key] = $employee;
-                    } else {
-                        // Для одной смены используем только admin_id
-                        $allDayEmployees[$employee['admin_id']] = $employee;
-                    }
+                    $allDayEmployees[] = $employee;
                 }
             }
 
+            // Дедупликация $allDayEmployees для корректного подсчета total
+            // Для shift_type == 0 дедуплицируем по (admin_id, shift_id)
+            // Для других типов дедуплицируем по admin_id
+            $uniqueEmployees = [];
+            foreach ($allDayEmployees as $employee) {
+                if ($data->shift_type == 0) {
+                    $key = $employee['admin_id'] . '_' . $employee['shift_id'];
+                } else {
+                    $key = $employee['admin_id'];
+                }
+                if (!isset($uniqueEmployees[$key])) {
+                    $uniqueEmployees[$key] = $employee;
+                }
+            }
+            $allDayEmployees = array_values($uniqueEmployees);
+
+
             $storeVisitorsQuantityTotal = [];
             $storeSaleQuantityTotal = [];
             $storeSaleTotalTotal = [];