fix timezone for timesheets created by other users (#1509)
This commit is contained in:
@@ -572,7 +572,7 @@ class Timesheet implements EntityWithMetaFields, ExportItemInterface
|
|||||||
/**
|
/**
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function getTimezone(): string
|
public function getTimezone(): ?string
|
||||||
{
|
{
|
||||||
return $this->timezone;
|
return $this->timezone;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ final class TimesheetService
|
|||||||
$this->repository->begin();
|
$this->repository->begin();
|
||||||
try {
|
try {
|
||||||
$this->validateTimesheet($timesheet);
|
$this->validateTimesheet($timesheet);
|
||||||
|
$this->fixTimezone($timesheet);
|
||||||
|
|
||||||
$this->dispatcher->dispatch(new TimesheetCreatePreEvent($timesheet));
|
$this->dispatcher->dispatch(new TimesheetCreatePreEvent($timesheet));
|
||||||
$this->repository->save($timesheet);
|
$this->repository->save($timesheet);
|
||||||
@@ -187,6 +188,8 @@ final class TimesheetService
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
$this->fixTimezone($timesheet);
|
||||||
|
|
||||||
$this->dispatcher->dispatch(new TimesheetUpdatePreEvent($timesheet));
|
$this->dispatcher->dispatch(new TimesheetUpdatePreEvent($timesheet));
|
||||||
$this->repository->save($timesheet);
|
$this->repository->save($timesheet);
|
||||||
$this->dispatcher->dispatch(new TimesheetUpdatePostEvent($timesheet));
|
$this->dispatcher->dispatch(new TimesheetUpdatePostEvent($timesheet));
|
||||||
@@ -263,6 +266,21 @@ final class TimesheetService
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Makes sure, that the timesheet record has the timezone of the user.
|
||||||
|
*
|
||||||
|
* This fixes #1442 and prevents a wrong time if a teamlead edits the
|
||||||
|
* timesheet for an employee living in another timezone.
|
||||||
|
*
|
||||||
|
* @param Timesheet $timesheet
|
||||||
|
*/
|
||||||
|
private function fixTimezone(Timesheet $timesheet)
|
||||||
|
{
|
||||||
|
if (null !== ($timezone = $timesheet->getTimezone()) && $timezone !== $timesheet->getUser()->getTimezone()) {
|
||||||
|
$timesheet->setTimezone($timesheet->getUser()->getTimezone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stops active records if more than allowed are running for the timesheet user.
|
* Stops active records if more than allowed are running for the timesheet user.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ namespace App\Tests\Timesheet;
|
|||||||
|
|
||||||
use App\Configuration\TimesheetConfiguration;
|
use App\Configuration\TimesheetConfiguration;
|
||||||
use App\Entity\Timesheet;
|
use App\Entity\Timesheet;
|
||||||
|
use App\Entity\User;
|
||||||
use App\Event\TimesheetCreatePostEvent;
|
use App\Event\TimesheetCreatePostEvent;
|
||||||
use App\Event\TimesheetCreatePreEvent;
|
use App\Event\TimesheetCreatePreEvent;
|
||||||
use App\Event\TimesheetDeleteMultiplePreEvent;
|
use App\Event\TimesheetDeleteMultiplePreEvent;
|
||||||
@@ -138,6 +139,50 @@ class TimesheetServiceTest extends TestCase
|
|||||||
$sut->saveNewTimesheet($newTimesheet);
|
$sut->saveNewTimesheet($newTimesheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testSaveNewTimesheetFixesTimezone()
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$user->setTimezone('Europe/Paris');
|
||||||
|
|
||||||
|
$begin = new \DateTime('now', new \DateTimeZone('Africa/Casablanca'));
|
||||||
|
$timesheet = new Timesheet();
|
||||||
|
|
||||||
|
$timesheet->setBegin($begin);
|
||||||
|
self::assertEquals('Africa/Casablanca', $timesheet->getTimezone());
|
||||||
|
|
||||||
|
$timesheet->setUser($user);
|
||||||
|
self::assertEquals('Africa/Casablanca', $timesheet->getTimezone());
|
||||||
|
|
||||||
|
$authorizationChecker = $this->createMock(AuthorizationCheckerInterface::class);
|
||||||
|
$authorizationChecker->expects($this->once())->method('isGranted')->willReturn(true);
|
||||||
|
$sut = $this->getSut($authorizationChecker);
|
||||||
|
|
||||||
|
$sut->saveNewTimesheet($timesheet);
|
||||||
|
|
||||||
|
self::assertEquals('Europe/Paris', $timesheet->getTimezone());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUpdateTimesheetFixesTimezone()
|
||||||
|
{
|
||||||
|
$user = new User();
|
||||||
|
$user->setTimezone('Europe/Paris');
|
||||||
|
|
||||||
|
$begin = new \DateTime('now', new \DateTimeZone('Africa/Casablanca'));
|
||||||
|
$timesheet = new Timesheet();
|
||||||
|
|
||||||
|
$timesheet->setBegin($begin);
|
||||||
|
self::assertEquals('Africa/Casablanca', $timesheet->getTimezone());
|
||||||
|
|
||||||
|
$timesheet->setUser($user);
|
||||||
|
self::assertEquals('Africa/Casablanca', $timesheet->getTimezone());
|
||||||
|
|
||||||
|
$sut = $this->getSut();
|
||||||
|
|
||||||
|
$sut->updateTimesheet($timesheet);
|
||||||
|
|
||||||
|
self::assertEquals('Europe/Paris', $timesheet->getTimezone());
|
||||||
|
}
|
||||||
|
|
||||||
public function testCannotRestartedPersistedTimesheet()
|
public function testCannotRestartedPersistedTimesheet()
|
||||||
{
|
{
|
||||||
$timesheet = $this->createMock(Timesheet::class);
|
$timesheet = $this->createMock(Timesheet::class);
|
||||||
|
|||||||
Reference in New Issue
Block a user