setPage($page); $form = $this->getToolbarForm($query); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { /** @var TimesheetQuery $query */ $query = $form->getData(); if (null !== $query->getBegin()) { $query->getBegin()->setTime(0, 0, 0); } if (null !== $query->getEnd()) { $query->getEnd()->setTime(23, 59, 59); } } $query->setUser($this->getUser()); if ($query->hasTags()) { $query->setTags( new ArrayCollection( $this->getDoctrine()->getRepository(Tag::class)->findIdsByTagNameList(implode(',', $query->getTags()->toArray())) ) ); } /* @var $entries Pagerfanta */ $entries = $this->getRepository()->findByQuery($query); return $this->render('timesheet/index.html.twig', [ 'entries' => $entries, 'page' => $query->getPage(), 'query' => $query, 'showFilter' => $form->isSubmitted(), 'toolbarForm' => $form->createView(), 'showSummary' => $this->getUser()->getPreferenceValue('timesheet.daily_stats', false), ]); } /** * @Route(path="/export", name="timesheet_export", methods={"GET"}) * @Security("is_granted('export_own_timesheet')") * * @param Request $request * @return \Symfony\Component\HttpFoundation\Response */ public function exportAction(Request $request) { $query = new TimesheetQuery(); $query->setResultType(TimesheetQuery::RESULT_TYPE_OBJECTS); $form = $this->getToolbarForm($query); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { /** @var TimesheetQuery $query */ $query = $form->getData(); } // by default the current month is exported, but it can be overwritten if (null === $query->getBegin()) { $query->setBegin($this->dateTime->createDateTime('first day of this month')); } $query->getBegin()->setTime(0, 0, 0); if (null === $query->getEnd()) { $query->setEnd($this->dateTime->createDateTime('last day of this month')); } $query->getEnd()->setTime(23, 59, 59); // user timesheet always export for the session user $query->setUser($this->getUser()); /* @var $entries Pagerfanta */ $entries = $this->getRepository()->findByQuery($query); return $this->render('timesheet/export.html.twig', [ 'entries' => $entries, 'query' => $query, ]); } /** * @return \Symfony\Component\HttpFoundation\Response */ public function activeEntriesAction() { $user = $this->getUser(); $activeEntries = $this->getRepository()->getActiveEntries($user); return $this->render( 'navbar/active-entries.html.twig', [ 'entries' => $activeEntries, 'soft_limit' => $this->getSoftLimit(), ] ); } /** * @Route(path="/start/{id}", name="timesheet_start", requirements={"id" = "\d+"}, methods={"GET", "POST"}) * @Security("is_granted('start', timesheet)") * * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response */ public function startAction(ValidatorInterface $validator, Timesheet $timesheet) { $user = $this->getUser(); try { $entry = new Timesheet(); $entry ->setBegin($this->dateTime->createDateTime()) ->setUser($user) ->setActivity($timesheet->getActivity()) ->setProject($timesheet->getProject()); $errors = $validator->validate($entry); if (count($errors) > 0) { $this->flashError('timesheet.start.error', ['%reason%' => $errors[0]->getPropertyPath() . ' = ' . $errors[0]->getMessage()]); } else { $this->stopActiveEntries($user); $entityManager = $this->getDoctrine()->getManager(); $entityManager->persist($entry); $entityManager->flush(); $this->flashSuccess('timesheet.start.success'); } } catch (\Exception $ex) { $this->flashError('timesheet.start.error', ['%reason%' => $ex->getMessage()]); } return $this->redirectToRoute('timesheet'); } /** * @Route(path="/{id}/edit", name="timesheet_edit", methods={"GET", "POST"}) * @Security("is_granted('edit', entry)") * * @param Timesheet $entry * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response */ public function editAction(Timesheet $entry, Request $request) { $route = 'timesheet'; if ('calendar' === $request->get('origin')) { $route = 'calendar'; } return $this->edit($entry, $request, $route, 'timesheet/edit.html.twig'); } /** * @Route(path="/create", name="timesheet_create", methods={"GET", "POST"}) * @Security("is_granted('create_own_timesheet')") * * @param Request $request * @param ProjectRepository $projectRepository * @param ActivityRepository $activityRepository * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response */ public function createAction(Request $request, ProjectRepository $projectRepository, ActivityRepository $activityRepository) { $route = 'timesheet'; if ('calendar' === $request->get('origin')) { $route = 'calendar'; } return $this->create($request, $route, 'timesheet/edit.html.twig', $projectRepository, $activityRepository); } /** * @param Timesheet $entry * @param string $redirectRoute * @return \Symfony\Component\Form\FormInterface */ protected function getCreateForm(Timesheet $entry, string $redirectRoute) { return $this->createForm(TimesheetEditForm::class, $entry, [ 'action' => $this->generateUrl('timesheet_create', ['origin' => $redirectRoute]), 'include_rate' => $this->isGranted('edit_rate', $entry), 'customer' => true, ]); } /** * @param Timesheet $entry * @param int $page * @param string $redirectRoute * @return \Symfony\Component\Form\FormInterface */ protected function getEditForm(Timesheet $entry, $page, string $redirectRoute) { return $this->createForm(TimesheetEditForm::class, $entry, [ 'action' => $this->generateUrl('timesheet_edit', [ 'id' => $entry->getId(), 'page' => $page, 'origin' => $redirectRoute, ]), 'include_rate' => $this->isGranted('edit_rate', $entry), 'include_exported' => $this->isGranted('edit_export', $entry), 'customer' => true, ]); } /** * @param TimesheetQuery $query * @return \Symfony\Component\Form\FormInterface */ protected function getToolbarForm(TimesheetQuery $query) { return $this->createForm(TimesheetToolbarForm::class, $query, [ 'action' => $this->generateUrl('timesheet', [ 'page' => $query->getPage(), ]), 'method' => 'GET', ]); } }