new user-year reporting and data-type chooser (#3155)

This commit is contained in:
Kevin Papst
2022-02-16 12:18:04 +01:00
committed by GitHub
parent 1852d71974
commit 85a63c4b78
58 changed files with 1862 additions and 683 deletions

View File

@@ -0,0 +1,121 @@
<?php
/*
* This file is part of the Kimai time-tracking app.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace App\Controller\Reporting;
use App\Controller\AbstractController;
use App\Entity\User;
use App\Model\DailyStatistic;
use App\Model\DateStatisticInterface;
use App\Model\Statistic\StatisticDate;
use App\Repository\ActivityRepository;
use App\Repository\ProjectRepository;
use App\Timesheet\TimesheetStatisticService;
use DateTime;
abstract class AbstractUserReportController extends AbstractController
{
protected $statisticService;
private $projectRepository;
private $activityRepository;
public function __construct(TimesheetStatisticService $statisticService, ProjectRepository $projectRepository, ActivityRepository $activityRepository)
{
$this->statisticService = $statisticService;
$this->projectRepository = $projectRepository;
$this->activityRepository = $activityRepository;
}
protected function canSelectUser(): bool
{
// also found in App\EventSubscriber\Actions\UserSubscriber
if (!$this->isGranted('view_other_timesheet') || !$this->isGranted('view_other_reporting')) {
return false;
}
return true;
}
protected function getStatisticDataRaw(DateTime $begin, DateTime $end, User $user): array
{
return $this->statisticService->getDailyStatisticsGrouped($begin, $end, [$user]);
}
protected function createStatisticModel(DateTime $begin, DateTime $end, User $user): DateStatisticInterface
{
return new DailyStatistic($begin, $end, $user);
}
protected function prepareReport(DateTime $begin, DateTime $end, User $user): array
{
$data = $this->getStatisticDataRaw($begin, $end, $user);
$data = array_pop($data);
$projectIds = [];
$activityIds = [];
foreach ($data as $projectId => $projectValues) {
$projectIds[$projectId] = $projectId;
$dailyProjectStatistic = $this->createStatisticModel($begin, $end, $user);
foreach ($projectValues['activities'] as $activityId => $activityValues) {
$activityIds[$activityId] = $activityId;
if (!isset($data[$projectId]['duration'])) {
$data[$projectId]['duration'] = 0;
}
if (!isset($data[$projectId]['rate'])) {
$data[$projectId]['rate'] = 0.0;
}
if (!isset($data[$projectId]['internalRate'])) {
$data[$projectId]['internalRate'] = 0.0;
}
if (!isset($data[$projectId]['activities'][$activityId]['duration'])) {
$data[$projectId]['activities'][$activityId]['duration'] = 0;
}
if (!isset($data[$projectId]['activities'][$activityId]['rate'])) {
$data[$projectId]['activities'][$activityId]['rate'] = 0.0;
}
if (!isset($data[$projectId]['activities'][$activityId]['internalRate'])) {
$data[$projectId]['activities'][$activityId]['internalRate'] = 0.0;
}
/** @var StatisticDate $date */
foreach ($activityValues['data']->getData() as $date) {
$statisticDate = $dailyProjectStatistic->getByDateTime($date->getDate());
$statisticDate->setTotalDuration($statisticDate->getTotalDuration() + $date->getTotalDuration());
$statisticDate->setTotalRate($statisticDate->getTotalRate() + $date->getTotalRate());
$statisticDate->setTotalInternalRate($statisticDate->getTotalInternalRate() + $date->getTotalInternalRate());
$data[$projectId]['duration'] = $data[$projectId]['duration'] + $date->getTotalDuration();
$data[$projectId]['rate'] = $data[$projectId]['rate'] + $date->getTotalRate();
$data[$projectId]['internalRate'] = $data[$projectId]['internalRate'] + $date->getTotalInternalRate();
$data[$projectId]['activities'][$activityId]['duration'] = $data[$projectId]['activities'][$activityId]['duration'] + $date->getTotalDuration();
$data[$projectId]['activities'][$activityId]['rate'] = $data[$projectId]['activities'][$activityId]['rate'] + $date->getTotalRate();
$data[$projectId]['activities'][$activityId]['internalRate'] = $data[$projectId]['activities'][$activityId]['internalRate'] + $date->getTotalInternalRate();
}
}
$data[$projectId]['data'] = $dailyProjectStatistic;
}
$activities = $this->activityRepository->findByIds($activityIds);
foreach ($activities as $activity) {
$activityIds[$activity->getId()] = $activity;
}
foreach ($data as $projectId => $projectValues) {
foreach ($projectValues['activities'] as $activityId => $activityValues) {
$data[$projectId]['activities'][$activityId]['activity'] = $activityIds[$activityId];
}
}
$projects = $this->projectRepository->findByIds($projectIds);
foreach ($projects as $project) {
$data[$project->getId()]['project'] = $project;
}
return $data;
}
}