eventDispatcher = $eventDispatcher; $this->authorizationHelper = $authorizationHelper; $this->paginator = $paginator; } /** * Create a new report for a given person and of a given type. * * @param int $person_id The id of the person. * @param int $cf_group_id The id of the report type. * @param Request $request The request containing the form data (from the newAction) * * @return Response The web page. */ public function createAction($person_id, $cf_group_id, Request $request) { $em = $this->getDoctrine()->getManager(); $entity = new Report(); $cFGroup = $em->getRepository('ChillCustomFieldsBundle:CustomFieldsGroup') ->find($cf_group_id); $person = $em->getRepository('ChillPersonBundle:Person') ->find($person_id); if (null === $person || null === $cFGroup) { throw $this->createNotFoundException(); } $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); $form = $this->createCreateForm($entity, $person, $cFGroup); $form->handleRequest($request); if ($form->isValid()) { $entity->setCFGroup($cFGroup); $entity->setPerson($person); $this->denyAccessUnlessGranted('CHILL_REPORT_CREATE', $entity); $em->persist($entity); $em->flush(); $this->get('session') ->getFlashBag() ->add( 'success', $this->get('translator') ->trans('Success : report created!') ); return $this->redirect($this->generateUrl( 'report_view', ['person_id' => $person_id, 'report_id' => $entity->getId()] )); } $this->get('session') ->getFlashBag()->add( 'error', $this->get('translator') ->trans('The form is not valid. The report has not been created !') ); return $this->render('ChillReportBundle:Report:new.html.twig', [ 'entity' => $entity, 'form' => $form->createView(), 'person' => $person, ]); } /** * Display a form to edit an existing Report entity. * * @param int|string $person_id The id of the person. * @param int|string $report_id The id of the report. * * @return Response The web page. */ public function editAction($person_id, $report_id) { $em = $this->getDoctrine()->getManager(); /** @var Report $report */ $report = $em->getRepository('ChillReportBundle:Report')->find($report_id); if (!$report) { throw $this->createNotFoundException( $this->get('translator')->trans('Unable to find this report.') ); } if ((int) $person_id !== (int) $report->getPerson()->getId()) { throw new RuntimeException( $this->get('translator')->trans('This is not the report of the person.'), 1 ); } $this->denyAccessUnlessGranted('CHILL_REPORT_UPDATE', $report); $person = $report->getPerson(); $editForm = $this->createEditForm($report); $event = new PrivacyEvent($person, [ 'element_class' => Report::class, 'element_id' => $report->getId(), 'action' => 'edit', ]); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); return $this->render('ChillReportBundle:Report:edit.html.twig', [ 'edit_form' => $editForm->createView(), 'person' => $person, ]); } /** * Return a csv file with all the reports of a given type. * * @param int $cf_group_id The id of the report type to export * @param Request $request The request * * @return A csv file with all the reports of the selected type */ public function exportAction($cf_group_id, Request $request) { $em = $this->getDoctrine()->getManager(); $cFGroup = $em->getRepository('ChillCustomFieldsBundle:CustomFieldsGroup')->find($cf_group_id); $reports = $em->getRepository('ChillReportBundle:Report')->findByCFGroup($cFGroup); $response = $this->render('ChillReportBundle:Report:export.csv.twig', [ 'reports' => $reports, 'cf_group' => $cFGroup, ]); $response->headers->set('Content-Type', 'text/csv; charset=utf-8'); $response->headers->set('Content-Disposition', 'attachment; filename="export.csv"'); return $response; } /** * List all the report entities for a given person. * * @param int $person_id The id of the person. * @param Request $request The request * * @return Response The web page. */ public function listAction($person_id, Request $request) { $em = $this->getDoctrine()->getManager(); $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id); $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); $reachableScopes = $this->authorizationHelper ->getReachableScopes( $this->getUser(), new Role('CHILL_REPORT_SEE'), $person->getCenter() ); $total = $em ->createQuery('SELECT COUNT(r.id) FROM ChillReportBundle:Report r ' . 'WHERE r.person = :person AND r.scope IN (:scopes) ') ->setParameter('person', $person) ->setParameter('scopes', $reachableScopes) ->getSingleScalarResult(); // get the PaginatorFactory $paginator = $this->paginator->create($total); $reports = $em->createQuery('SELECT r FROM ChillReportBundle:Report r WHERE r.person = :person AND r.scope IN (:scopes) ORDER BY r.date DESC') ->setParameter('person', $person) ->setParameter('scopes', $reachableScopes) ->setFirstResult($paginator->getCurrentPage()->getFirstItemNumber()) ->setMaxResults($paginator->getItemsPerPage()) ->getResult(); $event = new PrivacyEvent($person, [ 'element_class' => Report::class, 'action' => 'list', ]); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); return $this->render('ChillReportBundle:Report:list.html.twig', [ 'reports' => $reports, 'person' => $person, 'paginator' => $paginator, ]); } /** * Display a form for creating a new report for a given person and of a given type. * * @param int $person_id The id of the person. * @param int $cf_group_id The id of the report type. * @param Request $request The request * * @return Response The web page. */ public function newAction($person_id, $cf_group_id, Request $request) { $em = $this->getDoctrine()->getManager(); $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id); $cFGroup = $em ->getRepository('ChillCustomFieldsBundle:CustomFieldsGroup') ->find($cf_group_id); if (null === $person) { throw $this->createNotFoundException('Person not found'); } $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); // check access on report creation for a dummy report $this->denyAccessUnlessGranted( 'CHILL_REPORT_CREATE', (new Report())->setPerson($person), 'access denied for report creation' ); if (null === $cFGroup) { throw $this->createNotFoundException('custom fields group not found'); } $entity = new Report(); $entity->setUser($this->get('security.token_storage')->getToken()->getUser()); $entity->setDate(new DateTime('now')); $entity->setCFGroup($cFGroup); $form = $this->createCreateForm($entity, $person, $cFGroup); return $this->render('ChillReportBundle:Report:new.html.twig', [ 'entity' => $entity, 'form' => $form->createView(), 'person' => $person, ]); } /** * Display a form for selecting which type of report to add for a given person. * * @param int $person_id The id of the person. * @param Request $request The request * * @return Response The web page. */ public function selectReportTypeAction($person_id, Request $request) { $em = $this->getDoctrine()->getManager(); $person = $em->getRepository('ChillPersonBundle:Person') ->find($person_id); if (null === $person) { throw $this->createNotFoundException('Person not found!'); } $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person, 'access denied for person view'); // check access on report creation for a dummy report $this->denyAccessUnlessGranted( 'CHILL_REPORT_CREATE', (new Report())->setPerson($person), 'access denied for report creation' ); $cFGroupId = $request->query->get('cFGroup'); if ($request->query->has('cFGroup')) { return $this->redirect( $this->generateUrl( 'report_new', ['person_id' => $person_id, 'cf_group_id' => $cFGroupId] ) ); } $cFGroups = $em->getRepository('ChillCustomFieldsBundle:CustomFieldsGroup') ->findByEntity('Chill\ReportBundle\Entity\Report'); if (count($cFGroups) === 1) { return $this->redirect( $this->generateUrl( 'report_new', ['person_id' => $person_id, 'cf_group_id' => $cFGroups[0]->getId()] ) ); } $cFGroupsChoice = []; foreach ($cFGroups as $cFGroup) { $cFGroupsChoice[$cFGroup->getId()] = $cFGroup->getName($request->getLocale()); } $form = $this->get('form.factory') ->createNamedBuilder(null, FormType::class, null, [ 'method' => 'GET', 'csrf_protection' => false, ]) ->add('cFGroup', ChoiceType::class, [ 'choices' => array_combine(array_values($cFGroupsChoice), array_keys($cFGroupsChoice)), ]) ->getForm(); $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id); return $this->render('ChillReportBundle:Report:select_report_type.html.twig', [ 'form' => $form->createView(), 'person' => $person, ]); } /** * Display a form for selecting which type of report to export * (a csv file with all the report of this type). * * @param Request $request The request * * @return Response The web page. */ public function selectReportTypeForExportAction(Request $request) { $cFGroupId = $request->query->get('cFGroup'); if ($request->query->has('cFGroup')) { return $this->redirect( $this->generateUrl( 'report_export_list', ['cf_group_id' => $cFGroupId] ) ); } $em = $this->getDoctrine()->getManager(); $cFGroups = $em->getRepository('ChillCustomFieldsBundle:CustomFieldsGroup') ->findByEntity('Chill\ReportBundle\Entity\Report'); if (count($cFGroups) === 1) { return $this->redirect( $this->generateUrl( 'report_export_list', ['cf_group_id' => $cFGroups[0]->getId()] ) ); } $cFGroupsChoice = []; foreach ($cFGroups as $cFGroup) { $cFGroupsChoice[$cFGroup->getId()] = $cFGroup->getName($request->getLocale()); } $form = $this->get('form.factory') ->createNamedBuilder(null, FormType::class, null, [ 'method' => 'GET', 'csrf_protection' => false, ]) ->add('cFGroup', ChoiceType::class, [ 'choices' => array_combine(array_values($cFGroupsChoice), array_keys($cFGroupsChoice)), ]) ->getForm(); return $this->render('ChillReportBundle:Report:select_report_type_for_export.html.twig', [ 'form' => $form->createView(), 'layout_name' => '@ChillMain/Export/layout.html.twig', ]); } /** * Web page for editing an existing report. * * @param int $person_id The id of the person. * @param int $report_id The id of the report. * * @return Response The web page. */ public function updateAction($person_id, $report_id, Request $request) { $em = $this->getDoctrine()->getManager(); $report = $em->getRepository('ChillReportBundle:Report')->find($report_id); if (!$report) { throw $this->createNotFoundException( $this->get('translator')->trans('Unable to find this report.') ); } $this->denyAccessUnlessGranted('CHILL_REPORT_UPDATE', $report); $editForm = $this->createEditForm($report); $editForm->handleRequest($request); if ($editForm->isValid()) { $em->flush(); $this->get('session') ->getFlashBag() ->add( 'success', $this->get('translator') ->trans('Success : report updated!') ); $person = $report->getPerson(); $event = new PrivacyEvent($person, [ 'element_class' => Report::class, 'element_id' => $report->getId(), 'action' => 'update', ]); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); return $this->redirect($this->generateUrl( 'report_view', ['person_id' => $report->getPerson()->getId(), 'report_id' => $report_id] )); } $this->get('session') ->getFlashBag() ->add( 'error', $this->get('translator') ->trans('The form is not valid. The report has not been updated !') ); return $this->render('ChillReportBundle:Report:edit.html.twig', [ 'edit_form' => $editForm->createView(), 'person' => $report->getPerson(), ]); } /** * Find and display a report. * * @param int $report_id The id of the report. * @param int $person_id The id of the person. * * @return Response The web page. */ public function viewAction($report_id, $person_id) { $em = $this->getDoctrine()->getManager(); $person = $em->getRepository('ChillPersonBundle:Person')->find($person_id); $entity = $em->getRepository('ChillReportBundle:Report')->find($report_id); if (!$entity || !$person) { throw $this->createNotFoundException( $this->get('translator')->trans('Unable to find this report.') ); } $this->denyAccessUnlessGranted('CHILL_REPORT_SEE', $entity); $event = new PrivacyEvent($person, [ 'element_class' => Report::class, 'element_id' => $entity->getId(), 'action' => 'view', ]); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); return $this->render('ChillReportBundle:Report:view.html.twig', [ 'entity' => $entity, 'person' => $person, ]); } /** * Creates a form to create a Report entity. * * @param Report $entity The entity * @param mixed $cFGroup * * @return \Symfony\Component\Form\Form The form */ private function createCreateForm(Report $entity, Person $person, $cFGroup) { return $this->createForm(ReportType::class, $entity, [ 'action' => $this->generateUrl( 'report_create', ['person_id' => $person->getId(), 'cf_group_id' => $cFGroup->getId(), ] ), 'method' => 'POST', 'cFGroup' => $cFGroup, 'role' => new Role('CHILL_REPORT_CREATE'), 'center' => $person->getCenter(), ]); } /** * Creates a form to edit a Report entity. * * @param Report $entity The report to edit. * * @return \Symfony\Component\Form\Form The form */ private function createEditForm(Report $entity) { return $this->createForm(ReportType::class, $entity, [ 'action' => $this->generateUrl( 'report_update', ['person_id' => $entity->getPerson()->getId(), 'report_id' => $entity->getId(), ] ), 'method' => 'PUT', 'cFGroup' => $entity->getCFGroup(), 'role' => new Role('CHILL_REPORT_UPDATE'), 'center' => $entity->getPerson()->getCenter(), ]); } }