From 215d4fc8bf67f23a9b03b89a69ab582f47e423b2 Mon Sep 17 00:00:00 2001 From: Kevin Papst Date: Mon, 22 Apr 2019 16:21:22 +0200 Subject: [PATCH] apply users timezone to toolbar queries (#716) --- .travis.yml | 1 + src/Controller/CalendarController.php | 38 +++++---------------- src/Controller/ExportController.php | 12 +++++-- src/Controller/InvoiceController.php | 27 ++++++++------- src/Controller/NavbarController.php | 30 +++------------- src/Controller/TimesheetController.php | 4 +-- src/Controller/TimesheetControllerTrait.php | 8 ++--- src/Controller/TimesheetTeamController.php | 4 +-- src/Doctrine/UTCDateTimeType.php | 1 + src/Form/Type/DateRangeType.php | 13 +++++-- src/Timesheet/UserDateTimeFactory.php | 12 +++++++ 11 files changed, 69 insertions(+), 81 deletions(-) diff --git a/.travis.yml b/.travis.yml index c58d7a17..a3906cdc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,6 +27,7 @@ install: - composer install script: + - php -r "echo date(DATE_RFC850);" - vendor/bin/phpunit tests/ - cp tests/.env.dist.sqlite .env - bin/console doctrine:database:create -n diff --git a/src/Controller/CalendarController.php b/src/Controller/CalendarController.php index 3bdf5e0d..76de553d 100644 --- a/src/Controller/CalendarController.php +++ b/src/Controller/CalendarController.php @@ -13,6 +13,7 @@ use App\Calendar\Service; use App\Calendar\TimesheetEntity; use App\Entity\Timesheet; use App\Repository\Query\TimesheetQuery; +use App\Repository\TimesheetRepository; use App\Timesheet\UserDateTimeFactory; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; @@ -27,35 +28,16 @@ use Symfony\Component\Routing\Annotation\Route; */ class CalendarController extends AbstractController { - /** - * @var Service - */ - protected $calendar; - /** - * @var UserDateTimeFactory - */ - protected $dateTime; - - /** - * @param Service $calendar - * @param UserDateTimeFactory $dateTime - */ - public function __construct(Service $calendar, UserDateTimeFactory $dateTime) - { - $this->calendar = $calendar; - $this->dateTime = $dateTime; - } - /** * @Route(path="/", name="calendar", methods={"GET"}) * @Cache(smaxage="10") */ - public function userCalendar() + public function userCalendar(Service $calendar, UserDateTimeFactory $dateTime) { return $this->render('calendar/user.html.twig', [ - 'config' => $this->calendar->getConfig(), - 'google' => $this->calendar->getGoogle(), - 'now' => $this->dateTime->createDateTime(), + 'config' => $calendar->getConfig(), + 'google' => $calendar->getGoogle(), + 'now' => $dateTime->createDateTime(), ]); } @@ -63,18 +45,18 @@ class CalendarController extends AbstractController * @Route(path="/user", name="calendar_entries", methods={"GET"}) * @Cache(smaxage="10") */ - public function calendarEntries(Request $request) + public function calendarEntries(Request $request, UserDateTimeFactory $dateTime, TimesheetRepository $repository) { $start = $request->get('start'); $end = $request->get('end'); - $start = \DateTime::createFromFormat('Y-m-d', $start); + $start = $dateTime->createDateTimeFromFormat('Y-m-d', $start); if ($start === false) { - $start = new \DateTime('first day of this month'); + $start = $dateTime->createDateTime('first day of this month'); } $start->setTime(0, 0, 0); - $end = \DateTime::createFromFormat('Y-m-d', $end); + $end = $dateTime->createDateTimeFromFormat('Y-m-d', $end); if ($end === false) { $end = clone $start; $end = $end->modify('last day of this month'); @@ -90,8 +72,6 @@ class CalendarController extends AbstractController ->setEnd($end) ; - $repository = $this->getDoctrine()->getRepository(Timesheet::class); - /* @var $entries Timesheet[] */ $entries = $repository->findByQuery($query)->getQuery()->execute(); $result = []; diff --git a/src/Controller/ExportController.php b/src/Controller/ExportController.php index 6c499ec5..9af0cfeb 100644 --- a/src/Controller/ExportController.php +++ b/src/Controller/ExportController.php @@ -14,6 +14,7 @@ use App\Export\ServiceExport; use App\Form\Toolbar\ExportToolbarForm; use App\Repository\Query\ExportQuery; use App\Repository\TimesheetRepository; +use App\Timesheet\UserDateTimeFactory; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; @@ -35,15 +36,20 @@ class ExportController extends AbstractController * @var ServiceExport */ protected $export; + /** + * @var UserDateTimeFactory + */ + protected $dateFactory; /** * @param TimesheetRepository $timesheet * @param ServiceExport $export */ - public function __construct(TimesheetRepository $timesheet, ServiceExport $export) + public function __construct(TimesheetRepository $timesheet, ServiceExport $export, UserDateTimeFactory $dateTime) { $this->timesheetRepository = $timesheet; $this->export = $export; + $this->dateFactory = $dateTime; } /** @@ -52,8 +58,8 @@ class ExportController extends AbstractController */ protected function getDefaultQuery() { - $begin = new \DateTime('first day of this month'); - $end = new \DateTime('last day of this month'); + $begin = $this->dateFactory->createDateTime('first day of this month 00:00:00'); + $end = $this->dateFactory->createDateTime('last day of this month 23:59:59'); $query = new ExportQuery(); $query->setOrder(ExportQuery::ORDER_ASC); diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index 56d971ef..77dd2f1e 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -20,6 +20,7 @@ use App\Repository\Query\BaseQuery; use App\Repository\Query\InvoiceQuery; use App\Repository\Query\TimesheetQuery; use App\Repository\TimesheetRepository; +use App\Timesheet\UserDateTimeFactory; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; @@ -44,17 +45,17 @@ class InvoiceController extends AbstractController * @var TimesheetRepository */ protected $timesheetRepository; + protected $dateTimeFactory; /** * @param ServiceInvoice $service * @param InvoiceTemplateRepository $invoice - * @param TimesheetRepository $timesheet */ - public function __construct(ServiceInvoice $service, InvoiceTemplateRepository $invoice, TimesheetRepository $timesheet) + public function __construct(ServiceInvoice $service, InvoiceTemplateRepository $invoice, UserDateTimeFactory $dateTimeFactory) { $this->service = $service; $this->invoiceRepository = $invoice; - $this->timesheetRepository = $timesheet; + $this->dateTimeFactory = $dateTimeFactory; } /** @@ -63,8 +64,8 @@ class InvoiceController extends AbstractController */ protected function getDefaultQuery() { - $begin = new \DateTime('first day of this month'); - $end = new \DateTime('last day of this month'); + $begin = $this->dateTimeFactory->createDateTime('first day of this month'); + $end = $this->dateTimeFactory->createDateTime('last day of this month'); $query = new InvoiceQuery(); $query->setOrder(InvoiceQuery::ORDER_ASC); @@ -83,7 +84,7 @@ class InvoiceController extends AbstractController * @return \Symfony\Component\HttpFoundation\Response * @throws \Exception */ - public function indexAction(Request $request) + public function indexAction(Request $request, TimesheetRepository $repository) { if (!$this->invoiceRepository->hasTemplate()) { return $this->redirectToRoute('admin_invoice_template_create'); @@ -98,7 +99,7 @@ class InvoiceController extends AbstractController if ($form->isSubmitted() && $form->isValid()) { /** @var InvoiceQuery $query */ $query = $form->getData(); - $entries = $this->getEntries($query); + $entries = $this->getEntries($query, $repository); } $model = $this->prepareModel($query, $entries); @@ -117,7 +118,7 @@ class InvoiceController extends AbstractController * @return \Symfony\Component\HttpFoundation\Response * @throws \Exception */ - public function printAction(Request $request) + public function printAction(Request $request, TimesheetRepository $repository) { if (!$this->invoiceRepository->hasTemplate()) { return $this->redirectToRoute('admin_invoice_template_create'); @@ -133,7 +134,7 @@ class InvoiceController extends AbstractController /** @var InvoiceQuery $query */ $query = $form->getData(); - $entries = $this->getEntries($query); + $entries = $this->getEntries($query, $repository); $model = $this->prepareModel($query, $entries); $document = $this->service->getDocumentByName($model->getTemplate()->getRenderer()); @@ -159,7 +160,7 @@ class InvoiceController extends AbstractController * @param InvoiceQuery $query * @return Timesheet[] */ - protected function getEntries(InvoiceQuery $query) + protected function getEntries(InvoiceQuery $query, TimesheetRepository $repository) { // customer needs to be defined, as we need the currency for the invoice if (null === $query->getCustomer()) { @@ -169,15 +170,15 @@ class InvoiceController extends AbstractController $query->setResultType(TimesheetQuery::RESULT_TYPE_QUERYBUILDER); if (null === $query->getBegin()) { - $query->setBegin(new \DateTime('first day of this month')); + $query->setBegin($this->dateTimeFactory->createDateTime('first day of this month')); } if (null === $query->getEnd()) { - $query->setEnd(new \DateTime('last day of this month')); + $query->setEnd($this->dateTimeFactory->createDateTime('last day of this month')); } $query->getBegin()->setTime(0, 0, 0); $query->getEnd()->setTime(23, 59, 59); - $queryBuilder = $this->timesheetRepository->findByQuery($query); + $queryBuilder = $repository->findByQuery($query); return $queryBuilder->getQuery()->getResult(); } diff --git a/src/Controller/NavbarController.php b/src/Controller/NavbarController.php index 567e7773..8e45370b 100644 --- a/src/Controller/NavbarController.php +++ b/src/Controller/NavbarController.php @@ -10,47 +10,27 @@ namespace App\Controller; use App\Repository\ActivityRepository; +use App\Timesheet\UserDateTimeFactory; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security; use Symfony\Component\HttpFoundation\Response; /** - * Controller used to manage navigation-bar contents. + * Controller used to render recent activities and quick-start new recordings in the navigation-bar. * * @Security("is_granted('ROLE_USER')") */ class NavbarController extends AbstractController { - /** - * @var ActivityRepository - */ - private $repository; - /** * @param ActivityRepository $repository - */ - public function __construct(ActivityRepository $repository) - { - $this->repository = $repository; - } - - /** - * @return ActivityRepository - */ - protected function getRepository() - { - return $this->repository; - } - - /** - * The flyout to render recent activities and quick-start new recordings. - * + * @param UserDateTimeFactory $dateTimeFactory * @return Response * @throws \Doctrine\ORM\Query\QueryException */ - public function recentActivitiesAction() + public function recentActivitiesAction(ActivityRepository $repository, UserDateTimeFactory $dateTimeFactory) { $user = $this->getUser(); - $entries = $this->getRepository()->getRecentActivities($user, new \DateTime('-1 year')); + $entries = $repository->getRecentActivities($user, $dateTimeFactory->createDateTime('-1 year')); return $this->render( 'navbar/recent-activities.html.twig', diff --git a/src/Controller/TimesheetController.php b/src/Controller/TimesheetController.php index ed83237d..f3fabe56 100644 --- a/src/Controller/TimesheetController.php +++ b/src/Controller/TimesheetController.php @@ -94,12 +94,12 @@ class TimesheetController extends AbstractController // by default the current month is exported, but it can be overwritten if (null === $query->getBegin()) { - $query->setBegin(new \DateTime('first day of this month')); + $query->setBegin($this->dateTime->createDateTime('first day of this month')); } $query->getBegin()->setTime(0, 0, 0); if (null === $query->getEnd()) { - $query->setEnd(new \DateTime('last day of this month')); + $query->setEnd($this->dateTime->createDateTime('last day of this month')); } $query->getEnd()->setTime(23, 59, 59); diff --git a/src/Controller/TimesheetControllerTrait.php b/src/Controller/TimesheetControllerTrait.php index 5f6c964b..7e918b85 100644 --- a/src/Controller/TimesheetControllerTrait.php +++ b/src/Controller/TimesheetControllerTrait.php @@ -126,7 +126,7 @@ trait TimesheetControllerTrait $start = $request->get('begin'); if ($start !== null) { - $start = \DateTime::createFromFormat('Y-m-d', $start); + $start = $this->dateTime->createDateTimeFromFormat('Y-m-d', $start); if ($start !== false) { $start->setTime(10, 0, 0); // TODO make me configurable $entry->setBegin($start); @@ -135,7 +135,7 @@ trait TimesheetControllerTrait $end = $request->get('end'); if ($end !== null) { - $end = \DateTime::createFromFormat('Y-m-d', $end); + $end = $this->dateTime->createDateTimeFromFormat('Y-m-d', $end); if ($end !== false) { $end->setTime(18, 0, 0); // TODO make me configurable $entry->setEnd($end); @@ -144,7 +144,7 @@ trait TimesheetControllerTrait $from = $request->get('from'); if ($from !== null) { - $from = new \DateTime($from); + $from = $this->dateTime->createDateTime($from); if ($from !== false) { $entry->setBegin($from); } @@ -152,7 +152,7 @@ trait TimesheetControllerTrait $to = $request->get('to'); if ($to !== null) { - $to = new \DateTime($to); + $to = $this->dateTime->createDateTime($to); if ($to !== false) { $entry->setEnd($to); } diff --git a/src/Controller/TimesheetTeamController.php b/src/Controller/TimesheetTeamController.php index 4e3b7b06..7fe2ad8c 100644 --- a/src/Controller/TimesheetTeamController.php +++ b/src/Controller/TimesheetTeamController.php @@ -89,12 +89,12 @@ class TimesheetTeamController extends AbstractController // by default the current month is exported, but it can be overwritten if (null === $query->getBegin()) { - $query->setBegin(new \DateTime('first day of this month')); + $query->setBegin($this->dateTime->createDateTime('first day of this month')); } $query->getBegin()->setTime(0, 0, 0); if (null === $query->getEnd()) { - $query->setEnd(new \DateTime('last day of this month')); + $query->setEnd($this->dateTime->createDateTime('last day of this month')); } $query->getEnd()->setTime(23, 59, 59); diff --git a/src/Doctrine/UTCDateTimeType.php b/src/Doctrine/UTCDateTimeType.php index 4add2675..61b12126 100644 --- a/src/Doctrine/UTCDateTimeType.php +++ b/src/Doctrine/UTCDateTimeType.php @@ -29,6 +29,7 @@ class UTCDateTimeType extends DateTimeType public function convertToDatabaseValue($value, AbstractPlatform $platform) { if ($value instanceof \DateTime) { + $value = clone $value; $value->setTimezone(self::getUtc()); } diff --git a/src/Form/Type/DateRangeType.php b/src/Form/Type/DateRangeType.php index eb6c80b5..198d14ae 100644 --- a/src/Form/Type/DateRangeType.php +++ b/src/Form/Type/DateRangeType.php @@ -10,6 +10,7 @@ namespace App\Form\Type; use App\Form\Model\DateRange; +use App\Timesheet\UserDateTimeFactory; use App\Utils\LocaleSettings; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\CallbackTransformer; @@ -30,13 +31,19 @@ class DateRangeType extends AbstractType * @var LocaleSettings */ protected $localeSettings; + /** + * @var UserDateTimeFactory + */ + protected $dateFactory; /** * @param LocaleSettings $localeSettings + * @param UserDateTimeFactory $dateTime */ - public function __construct(LocaleSettings $localeSettings) + public function __construct(LocaleSettings $localeSettings, UserDateTimeFactory $dateTime) { $this->localeSettings = $localeSettings; + $this->dateFactory = $dateTime; } /** @@ -164,13 +171,13 @@ class DateRangeType extends AbstractType throw new TransformationFailedException('Invalid date range given'); } - $begin = \DateTime::createFromFormat($formatDate, $values[0]); + $begin = \DateTime::createFromFormat($formatDate, $values[0], $this->dateFactory->getTimezone()); if ($begin === false) { throw new TransformationFailedException('Invalid begin date given'); } $range->setBegin($begin); - $end = \DateTime::createFromFormat($formatDate, $values[1]); + $end = \DateTime::createFromFormat($formatDate, $values[1], $this->dateFactory->getTimezone()); if ($end === false) { throw new TransformationFailedException('Invalid end date given'); } diff --git a/src/Timesheet/UserDateTimeFactory.php b/src/Timesheet/UserDateTimeFactory.php index b719fa5c..a99a041f 100644 --- a/src/Timesheet/UserDateTimeFactory.php +++ b/src/Timesheet/UserDateTimeFactory.php @@ -74,4 +74,16 @@ class UserDateTimeFactory return $date; } + + /** + * @param string $format + * @param null|string $datetime + * @return bool|\DateTime + */ + public function createDateTimeFromFormat(string $format, ?string $datetime = 'now') + { + $date = \DateTime::createFromFormat($format, $datetime, $this->timezone); + + return $date; + } }