diff --git a/src/Controller/QuickEntryController.php b/src/Controller/QuickEntryController.php index 0efd95b2..9f775458 100644 --- a/src/Controller/QuickEntryController.php +++ b/src/Controller/QuickEntryController.php @@ -118,7 +118,7 @@ class QuickEntryController extends AbstractController ]; } - $beginTime = $this->configuration->getTimesheetDefaultBeginTime(); + $beginTime = $factory->createDateTime($this->configuration->getTimesheetDefaultBeginTime())->format('H:i:s'); // fill all rows and columns to make sure we do not have missing records /** @var QuickEntryModel[] $models */ diff --git a/src/Timesheet/TrackingMode/DurationFixedBeginMode.php b/src/Timesheet/TrackingMode/DurationFixedBeginMode.php index 279935bf..eb04c5c4 100644 --- a/src/Timesheet/TrackingMode/DurationFixedBeginMode.php +++ b/src/Timesheet/TrackingMode/DurationFixedBeginMode.php @@ -55,7 +55,11 @@ final class DurationFixedBeginMode implements TrackingModeInterface } $newBegin = clone $timesheet->getBegin(); - $newBegin->modify($this->configuration->getTimesheetDefaultBeginTime()); + + // this prevents the problem that "now" is being ignored in modify() + $beginTime = (new DateTime($this->configuration->getTimesheetDefaultBeginTime(), $newBegin->getTimezone()))->format('H:i:s'); + $newBegin->modify($beginTime); + $timesheet->setBegin($newBegin); } diff --git a/src/Timesheet/TrackingMode/DurationOnlyMode.php b/src/Timesheet/TrackingMode/DurationOnlyMode.php index 742b269f..ab6a5ca4 100644 --- a/src/Timesheet/TrackingMode/DurationOnlyMode.php +++ b/src/Timesheet/TrackingMode/DurationOnlyMode.php @@ -63,7 +63,12 @@ final class DurationOnlyMode extends AbstractTrackingMode } $newBegin = clone $timesheet->getBegin(); - $newBegin->modify($this->configuration->getTimesheetDefaultBeginTime()); + + // this prevents the problem that "now" is being ignored in modify() + $beginTime = $this->configuration->getTimesheetDefaultBeginTime(); + $beginTime = (new DateTime($this->configuration->getTimesheetDefaultBeginTime(), $newBegin->getTimezone()))->format('H:i:s'); + $newBegin->modify($beginTime); + $timesheet->setBegin($newBegin); parent::create($timesheet, $request); diff --git a/tests/Timesheet/TrackingMode/DurationFixedBeginModeTest.php b/tests/Timesheet/TrackingMode/DurationFixedBeginModeTest.php index 2e34e450..522fc565 100644 --- a/tests/Timesheet/TrackingMode/DurationFixedBeginModeTest.php +++ b/tests/Timesheet/TrackingMode/DurationFixedBeginModeTest.php @@ -22,10 +22,10 @@ use Symfony\Component\HttpFoundation\Request; */ class DurationFixedBeginModeTest extends TestCase { - protected function createSut() + protected function createSut($default = '13:47') { $loader = new TestConfigLoader([]); - $configuration = new SystemConfiguration($loader, ['timesheet' => ['default_begin' => '13:47']]); + $configuration = new SystemConfiguration($loader, ['timesheet' => ['default_begin' => $default]]); return new DurationFixedBeginMode($configuration); } @@ -42,6 +42,18 @@ class DurationFixedBeginModeTest extends TestCase self::assertEquals('duration_fixed_begin', $sut->getId()); } + public function testNow() + { + $seconds = (new \DateTime())->getTimestamp(); + $timesheet = new Timesheet(); + $timesheet->setBegin(new \DateTime('18:50:32')); + $mode = $this->createSut('now'); + $mode->create($timesheet); + $diff = $timesheet->getBegin()->getTimestamp() - $seconds; + // amount of seconds doesn't really matter, it must only be near "now" + self::assertLessThanOrEqual(2, $diff); + } + public function testCreate() { $timesheet = new Timesheet(); diff --git a/tests/Timesheet/TrackingMode/DurationOnlyModeTest.php b/tests/Timesheet/TrackingMode/DurationOnlyModeTest.php index fe1278a4..e57f4b0e 100644 --- a/tests/Timesheet/TrackingMode/DurationOnlyModeTest.php +++ b/tests/Timesheet/TrackingMode/DurationOnlyModeTest.php @@ -25,14 +25,26 @@ class DurationOnlyModeTest extends AbstractTrackingModeTest self::assertEquals('13:45:37', $timesheet->getBegin()->format('H:i:s')); } - protected function createSut() + protected function createSut($default = '13:45:37') { $loader = new TestConfigLoader([]); - $configuration = new SystemConfiguration($loader, ['timesheet' => ['default_begin' => '13:45:37']]); + $configuration = new SystemConfiguration($loader, ['timesheet' => ['default_begin' => $default]]); return new DurationOnlyMode($configuration); } + public function testNow() + { + $seconds = (new \DateTime())->getTimestamp(); + $timesheet = new Timesheet(); + $timesheet->setBegin(new \DateTime('18:50:32')); + $mode = $this->createSut('now'); + $mode->create($timesheet); + $diff = $timesheet->getBegin()->getTimestamp() - $seconds; + // amount of seconds doesn't really matter, it must only be near "now" + self::assertLessThanOrEqual(2, $diff); + } + public function testDefaultValues() { $sut = $this->createSut();