respect users timezone when populating working-time dashboard widget (#988)

This commit is contained in:
Kevin Papst
2019-07-30 23:57:20 +02:00
committed by GitHub
parent 3f51437569
commit 654ffda454
4 changed files with 92 additions and 32 deletions

View File

@@ -275,37 +275,86 @@ class TimesheetRepository extends EntityRepository
* @param User|null $user
* @return mixed
*/
public function getDailyData(DateTime $begin, DateTime $end, ?User $user = null)
protected function getDailyData(DateTime $begin, DateTime $end, ?User $user = null)
{
$qb = $this->getEntityManager()->createQueryBuilder();
$query = new TimesheetQuery();
$query
->setBegin($begin)
->setEnd($end)
->setUser($user)
->setState(TimesheetQuery::STATE_STOPPED)
;
$timesheets = $this->getTimesheetsForQuery($query);
$qb
->addSelect('SUM(t.rate) as rate')
->addSelect('SUM(t.duration) as duration')
->addSelect('MONTH(t.begin) as month')
->addSelect('YEAR(t.begin) as year')
->addSelect('DAY(t.begin) as day')
->from(Timesheet::class, 't')
->andWhere($qb->expr()->gte('t.begin', ':from'))
->setParameter('from', $begin, Type::DATETIME)
->andWhere($qb->expr()->lte('t.end', ':to'))
->setParameter('to', $end, Type::DATETIME);
$results = [];
/** @var Timesheet $result */
foreach ($timesheets as $result) {
$timezone = new \DateTimeZone($result->getTimezone());
/** @var \DateTime $beginTmp */
$beginTmp = $result->getBegin();
$beginTmp->setTimezone($timezone);
/** @var DateTime $endTmp */
$endTmp = $result->getEnd();
$endTmp->setTimezone($timezone);
$dateKeyEnd = $endTmp->format('Ymd');
if (null !== $user) {
$qb->andWhere('t.user = :user')
->setParameter('user', $user);
do {
$dateKey = $beginTmp->format('Ymd');
if (!isset($results[$dateKey])) {
$results[$dateKey] = [
'rate' => 0,
'duration' => 0,
'month' => $beginTmp->format('n'),
'year' => $beginTmp->format('Y'),
'day' => $beginTmp->format('j'),
'details' => []
];
}
if ($dateKey !== $dateKeyEnd) {
$newDateBegin = clone $beginTmp;
$newDateBegin->add(new \DateInterval('P1D'));
$newDateBegin->setTime(0, 0, 0);
} else {
$newDateBegin = clone $endTmp;
}
$duration = $newDateBegin->getTimestamp() - $beginTmp->getTimestamp();
$durationPercent = $duration / $result->getDuration();
$rate = $result->getRate() * $durationPercent;
$results[$dateKey]['rate'] += $rate;
$results[$dateKey]['duration'] += $duration;
$detailsId = $result->getProject()->getCustomer()->getId() . '_' . $result->getProject()->getId();
if (!isset($results[$dateKey]['details'][$detailsId])) {
$results[$dateKey]['details'][$detailsId] = [
'project' => $result->getProject(),
'activity' => $result->getActivity(),
'duration' => 0,
'rate' => 0,
];
$results[$dateKey]['details'][$detailsId]['duration'] += $duration;
$results[$dateKey]['details'][$detailsId]['rate'] += $rate;
}
$beginTmp = $newDateBegin;
if ((int) $end->format('Ymd') < (int) $newDateBegin->format('Ymd')) {
break 1;
}
} while ($dateKey !== $dateKeyEnd);
}
$qb
->addGroupBy('year')
->addGroupBy('month')
->addGroupBy('day')
->addOrderBy('year', 'DESC')
->addOrderBy('month', 'ASC')
->addOrderBy('day', 'ASC')
;
ksort($results);
return $qb->getQuery()->execute();
foreach ($results as $key => $value) {
$results[$key]['details'] = array_values($results[$key]['details']);
}
$results = array_values($results);
return $results;
}
/**
@@ -334,7 +383,9 @@ class TimesheetRepository extends EntityRepository
foreach ($results as $statRow) {
$dateTime = new DateTime();
$dateTime->setDate($statRow['year'], $statRow['month'], $statRow['day']);
$days[$dateTime->format('Ymd')] = new Day($dateTime, (int) $statRow['duration'], (float) $statRow['rate']);
$dateTime->setTime(0, 0, 0);
$day = new Day($dateTime, (int) $statRow['duration'], (float) $statRow['rate']);
$days[$dateTime->format('Ymd')] = $day;
}
ksort($days);