name; } //Временные интервалы $twelveHour = new DateInterval('PT12H'); $threeHour = new DateInterval('PT3H'); //Установка времени начала смены $date->add($threeHour);//Смена начинается в 3 ночи if ($shift) { $date->add($twelveHour);//Вторая смена через 12 часов } //Даты начала и конца смены $startShift = clone $date; $date->add($twelveHour); $endShift = clone $date; $endShift->add($oneHour);//Захватываем лишний час по просьбам *** //Получаем проекты компании company, созданные в $date, во время смены $shift $projects = ProjectsLocotech::find() ->where(['company' => $company]) ->andWhere(['between', 'created', $startShift->format(DATE_FORMAT), $endShift->format(DATE_FORMAT)]) ->all() ; //Получаем массив где ключ это идентификатор локомотива, а значение является массивом задач //['locoId => ['A' = [tasks], 'Б' => [tasks]]] $tasksByLocoId = []; //Массив букв секций локомотива $lettersByLocoId = []; //Количество задач для каждого пользователя, для каждого локомотива, для секций к которым привязаны задачи $counts = []; //Статусы задач, для подсчёта выполненных $statuses = []; foreach ($projects as $project) { $locoId = $project->loco_type . '-' . $project->loco_number; //Фильтруем задачи: $tasks = Tasks::find() // ->where(['id' => explode(',', $project->tasks)]) ->where(['input_id' => $project->id]) //Задача должна иметь пользователя ->andWhere(['not', ['assignees_arr' => null]]) //Задача должна попадать во временной интервал ->andWhere(['between', 'created', $startShift->format(DATE_FORMAT), $endShift->format(DATE_FORMAT)]) ->all() ; //Пользователь должен иметь в списке должностей хотябы одну из $positions foreach ($tasks as $key => $task) { /** @var Accounts $user */ if ($user = $task->getAccounts()->one()) { $positionFound = false; foreach ($user->getPositionIds() as $positionId) { if (in_array($positionId, $positionIds)) $positionFound = true; } } if ($positionFound) { $taskType = Tasktypes::findOne($task->type); $letter = $taskType->letter ? $taskType->letter : '?'; $tasksByLocoId[$locoId][$user->name][$letter][] = $task; //Сохраняем существующие буквы секции у каждого локомотива if (!in_array($letter, $lettersByLocoId[$locoId])) { $lettersByLocoId[$locoId][] = $letter; } if (isset($counts[$locoId][$user->name][$letter])) { $counts[$locoId][$user->name][$letter]++; } else { $counts[$locoId][$user->name][$letter] = 1; } $statuses[$locoId][$user->name][$letter][] = $task->status; } } } //Подсчитываем статистику [locoId => [userName => [letter => 50%]]] $dataForTable = []; foreach ($tasksByLocoId as $locoId => $tasksByUser) { foreach ($tasksByUser as $userName => $tasksByLetter) { foreach ($lettersByLocoId[$locoId] as $letter) { if (isset($tasksByLocoId[$locoId][$userName][$letter])) { //Подсчитываем процент выполненных работ для пользователя и секции $taskCount = $counts[$locoId][$userName][$letter];//Всего задач в секции для пользователя $taskFinishedCount = 0; foreach ($tasksByLocoId[$locoId][$userName][$letter] as $task) { if ($task->status == 5) $taskFinishedCount++; } //Процент выполненных задач пользователя от всех задач пользователя по секции $dataForTable[$locoId][$userName][$letter] = round($taskFinishedCount / $taskCount * 100) . '%'; } else { $dataForTable[$locoId][$userName][$letter] = '0%'; } } } } ?>

Дата: format('d.m.Y') ?>. Смена:

Должности:

$letters): sort($letters); //Не выводим пустые таблицы if (!isset($dataForTable[$locoId])) continue; list($locoSeries, $locoNumber) = explode('-', $locoId) ?> $statistics): ?>

Локомотив серии с номером

Сотрудник