From: Vladimir Fomichev Date: Fri, 5 Dec 2025 12:24:36 +0000 (+0300) Subject: корректировка дней X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=380198771869b1e9f7736402ca3e3abc13bf2d91;p=erp24_rep%2Fyii-erp24%2F.git корректировка дней --- diff --git a/erp24/api3/core/services/ReportService.php b/erp24/api3/core/services/ReportService.php index 06671c7c..0234afa1 100644 --- a/erp24/api3/core/services/ReportService.php +++ b/erp24/api3/core/services/ReportService.php @@ -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 = [];