denyAccessUnlessGranted(AccompanyingPeriodWorkVoter::CREATE, $period); if ($period->getSocialIssues()->count() === 0) { $this->addFlash( 'error', $this->trans->trans( 'accompanying_work.You must add at least ' . 'one social issue on accompanying period' ) ); return $this->redirectToRoute('chill_person_accompanying_course_index', [ 'accompanying_period_id' => $period->getId(), ]); } $json = $this->serializer->normalize($period, 'json', ['groups' => ['read']]); return $this->render('@ChillPerson/AccompanyingCourseWork/create.html.twig', [ 'accompanyingCourse' => $period, 'json' => $json, ]); } /** * @Route( * "{_locale}/person/accompanying-period/work/{id}/delete", * name="chill_person_accompanying_period_work_delete", * methods={"GET", "POST", "DELETE"} * ) */ public function deleteWork(AccompanyingPeriodWork $work, Request $request): Response { $this->denyAccessUnlessGranted(AccompanyingPeriodWorkVoter::UPDATE, $work); $em = $this->getDoctrine()->getManager(); $form = $this->createDeleteForm($work->getId()); if ($request->getMethod() === Request::METHOD_DELETE) { $form->handleRequest($request); if ($form->isValid()) { $this->chillLogger->notice('An accompanying period work has been removed', [ 'by_user' => $this->getUser()->getUsername(), 'work_id' => $work->getId(), 'accompanying_period_id' => $work->getAccompanyingPeriod()->getId(), ]); $em->remove($work); $em->flush(); $this->addFlash( 'success', $this->trans->trans('The accompanying period work has been successfully removed.') ); return $this->redirectToRoute('chill_person_accompanying_period_work_list', [ 'id' => $work->getAccompanyingPeriod()->getId(), ]); } } return $this->render('@ChillPerson/AccompanyingCourseWork/delete.html.twig', [ 'accompanyingCourse' => $work->getAccompanyingPeriod(), 'work' => $work, 'delete_form' => $form->createView(), ]); } /** * @Route( * "{_locale}/person/accompanying-period/work/{id}/edit", * name="chill_person_accompanying_period_work_edit", * methods={"GET"} * ) */ public function editWork(AccompanyingPeriodWork $work): Response { $this->denyAccessUnlessGranted(AccompanyingPeriodWorkVoter::UPDATE, $work); $json = $this->serializer->normalize($work, 'json', ['groups' => ['read']]); return $this->render('@ChillPerson/AccompanyingCourseWork/edit.html.twig', [ 'accompanyingCourse' => $work->getAccompanyingPeriod(), 'work' => $work, 'json' => $json, ]); } /** * @Route( * "{_locale}/person/accompanying-period/{id}/work", * name="chill_person_accompanying_period_work_list", * methods={"GET"} * ) */ public function listWorkByAccompanyingPeriod(AccompanyingPeriod $period): Response { $this->denyAccessUnlessGranted(AccompanyingPeriodWorkVoter::SEE, $period); $filter = $this->buildFilterOrder($period); $filterData = [ 'types' => $filter->getEntityChoiceData('typesFilter'), 'before' => $filter->getDateRangeData('dateFilter')['to'], 'after' => $filter->getDateRangeData('dateFilter')['from'], 'user' => $filter->getUserPickerData('userFilter') ]; $totalItems = $this->workRepository->countByAccompanyingPeriod($period); $paginator = $this->paginator->create($totalItems); $works = $this->workRepository->findByAccompanyingPeriodOpenFirst( $period, $filterData, $paginator->getItemsPerPage(), $paginator->getCurrentPageFirstItemNumber() ); return $this->render('@ChillPerson/AccompanyingCourseWork/index.html.twig', [ 'accompanyingCourse' => $period, 'works' => $works, 'paginator' => $paginator, 'filter' => $filter ]); } /** * @Route( * "{_locale}/person/accompanying-period/work/{id}/show", * name="chill_person_accompanying_period_work_show", * methods={"GET"} * ) */ public function showWork(AccompanyingPeriodWork $work): Response { if (null === $work) { throw $this->createNotFoundException('Unable to find Work entity.'); } $this->denyAccessUnlessGranted(AccompanyingPeriodWorkVoter::SEE, $work); return $this->render('@ChillPerson/AccompanyingCourseWork/show.html.twig', [ 'accompanyingCourse' => $work->getAccompanyingPeriod(), 'work' => $work, ]); } private function createDeleteForm(int $id): Form { $params = []; $params['id'] = $id; return $this->createFormBuilder() ->setAction($this->generateUrl('chill_person_accompanying_period_work_delete', $params)) ->setMethod('DELETE') ->add('submit', SubmitType::class, ['label' => 'Delete']) ->getForm(); } private function buildFilterOrder($associatedPeriod): FilterOrderHelper { $filterBuilder = $this->filterOrderHelperFactory->create(self::class); $types = $this->workRepository->findByAccompanyingPeriod($associatedPeriod); $filterBuilder ->addDateRange('dateFilter', 'accompanying_course_work.date_filter') ->addEntityChoice('typesFilter', 'accompanying_course_work.types_filter', \Chill\PersonBundle\Entity\SocialWork\SocialAction::class, $types, [ 'choice_label' => fn (SocialAction $sa) => $this->translatableStringHelper->localize($sa->getTitle()) ]) ->addUserPicker('userFilter', 'accompanying_course_work.user_filter', ['required' => false]) ; return $filterBuilder->build(); } }