* ВАЖНО: При расчете количества сотрудников на смене учитывается тип смены:
* - 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: дата окончания периода (начало = первое число месяца)
// Для типа смены 0 (обе смены) считаем каждую смену отдельно
if ($data->shift_type == 0) {
- // Для обеих смен нужны все записи смен
+ // Для обеих смен нужны уникальные комбинации admin_id и shift_id
$allAdminsInPeriod = $allAdminsInPeriodQuery
->select(['admin_id', 'shift_id'])
+ ->distinct()
->asArray()
->all();
$employeeCountTotal = count($allAdminsInPeriod);
if ($data->shift_type == 0) {
$employees = $employeesQuery
->select(['admin_id', 'shift_id'])
+ ->distinct()
->asArray()
->all();
} else {
// Добавляем сотрудников этого магазина в общий массив за день
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 = [];