, * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ namespace Chill\PersonBundle\Controller; use Chill\PersonBundle\Privacy\PrivacyEvent; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Chill\PersonBundle\Entity\Person; use Chill\PersonBundle\Form\AccompanyingPeriodType; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Doctrine\Common\Collections\Criteria; use Chill\PersonBundle\Security\Authorization\PersonVoter; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; /** * Class AccompanyingPeriodController * * @package Chill\PersonBundle\Controller */ class AccompanyingPeriodController extends AbstractController { /** * @var EventDispatcherInterface */ protected $eventDispatcher; /** * ReportController constructor. * * @param EventDispatcherInterface $eventDispatcher */ public function __construct(EventDispatcherInterface $eventDispatcher) { $this->eventDispatcher = $eventDispatcher; } /** * @param $person_id * @return Response */ public function listAction($person_id){ $person = $this->_getPerson($person_id); $event = new PrivacyEvent($person, array( 'element_class' => AccompanyingPeriod::class, 'action' => 'list' )); $this->eventDispatcher->dispatch(PrivacyEvent::PERSON_PRIVACY_EVENT, $event); return $this->render('ChillPersonBundle:AccompanyingPeriod:list.html.twig', array('accompanying_periods' => $person->getAccompanyingPeriodsOrdered(), 'person' => $person)); } /** * @param $person_id * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function createAction($person_id, Request $request) { $person = $this->_getPerson($person_id); $this->denyAccessUnlessGranted(PersonVoter::UPDATE, $person, 'You are not allowed to update this person'); $accompanyingPeriod = new AccompanyingPeriod(new \DateTime()); $accompanyingPeriod->setClosingDate(new \DateTime()); $person->addAccompanyingPeriod( $accompanyingPeriod); $form = $this->createForm( AccompanyingPeriodType::class, $accompanyingPeriod, [ 'period_action' => 'create', 'center' => $person->getCenter() ]); if ($request->getMethod() === 'POST') { $form->handleRequest($request); $errors = $this->_validatePerson($person); $flashBag = $this->get('session')->getFlashBag(); if ($form->isValid(array('Default', 'closed')) && count($errors) === 0) { $em = $this->getDoctrine()->getManager(); $em->persist($accompanyingPeriod); $em->flush(); $flashBag->add('success', $this->get('translator')->trans( 'A period has been created.')); return $this->redirect($this->generateUrl('chill_person_accompanying_period_list', array('person_id' => $person->getId()))); } else { $flashBag->add('error', $this->get('translator') ->trans('Error! Period not created!')); foreach($errors as $error) { $flashBag->add('info', $error->getMessage()); } } } return $this->render('ChillPersonBundle:AccompanyingPeriod:form.html.twig', array( 'form' => $form->createView(), 'person' => $person, 'accompanying_period' => $accompanyingPeriod ) ); } /** * @param $person_id * @param $period_id * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response|\Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public function updateAction($person_id, $period_id, Request $request){ $em = $this->getDoctrine()->getManager(); $accompanyingPeriod = $em->getRepository('ChillPersonBundle:AccompanyingPeriod') ->find($period_id); if ($accompanyingPeriod === null) { return $this->createNotFoundException("Period with id ".$period_id. " is not found"); } $person = $accompanyingPeriod->getPerson(); $this->denyAccessUnlessGranted(PersonVoter::UPDATE, $person, 'You are not allowed to update this person'); $form = $this->createForm(AccompanyingPeriodType::class, $accompanyingPeriod, array('period_action' => 'update', 'center' => $person->getCenter())); if ($request->getMethod() === 'POST') { $form->handleRequest($request); $errors = $this->_validatePerson($person); $flashBag = $this->get('session')->getFlashBag(); if ($form->isValid(array('Default', 'closed')) && count($errors) === 0) { $em->flush(); $flashBag->add('success', $this->get('translator')->trans( 'An accompanying period has been updated.')); return $this->redirect($this->generateUrl('chill_person_accompanying_period_list', array('person_id' => $person->getId()))); } else { $flashBag->add('error', $this->get('translator') ->trans('Error when updating the period')); foreach($errors as $error) { $flashBag->add('info', $error->getMessage()); } } } return $this->render('ChillPersonBundle:AccompanyingPeriod:form.html.twig', array( 'form' => $form->createView(), 'person' => $person, 'accompanying_period' => $accompanyingPeriod ) ); } /** * @param $person_id * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response * @throws \Exception */ public function closeAction($person_id, Request $request) { $person = $this->_getPerson($person_id); $this->denyAccessUnlessGranted(PersonVoter::UPDATE, $person, 'You are not allowed to update this person'); if ($person->isOpen() === false) { $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Beware period is closed', array('%name%' => $person->__toString()))); return $this->redirect( $this->generateUrl('chill_person_accompanying_period_list', array( 'person_id' => $person->getId() ))); } $current = $person->getCurrentAccompanyingPeriod(); $form = $this->createForm(AccompanyingPeriodType::class, $current, array( 'period_action' => 'close', 'center' => $person->getCenter() )); if ($request->getMethod() === 'POST') { $form->handleRequest($request); if ($form->isValid()){ $person->close($current); $errors = $this->_validatePerson($person); if (count($errors) === 0) { $this->get('session')->getFlashBag() ->add('success', $this->get('translator') ->trans('An accompanying period has been closed.', array('%name%' => $person->__toString()))); $this->getDoctrine()->getManager()->flush(); return $this->redirect( $this->generateUrl('chill_person_accompanying_period_list', array( 'person_id' => $person->getId() )) ); } else { $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Error! Period not closed!')); foreach ($errors as $error) { $this->get('session')->getFlashBag() ->add('info', $error->getMessage()); } } } else { //if form is not valid $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Pediod closing form is not valid') ); foreach ($form->getErrors() as $error) { $this->get('session')->getFlashBag() ->add('info', $error->getMessage()); } } } return $this->render('ChillPersonBundle:AccompanyingPeriod:form.html.twig', array( 'form' => $form->createView(), 'person' => $person, 'accompanying_period' => $current )); } /** * @param Person $person * @return \Symfony\Component\Validator\ConstraintViolationListInterface */ private function _validatePerson(Person $person) { $errors = $this->get('validator')->validate($person, null, array('Default')); $errors_accompanying_period = $this->get('validator')->validate($person, null, array('accompanying_period_consistent')); foreach($errors_accompanying_period as $error ) { $errors->add($error); } return $errors; } /** * @param $person_id * @param Request $request * @return \Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function openAction($person_id, Request $request) { $person = $this->_getPerson($person_id); $this->denyAccessUnlessGranted(PersonVoter::UPDATE, $person, 'You are not allowed to update this person'); //in case the person is already open if ($person->isOpen()) { $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Error! Period %name% is not closed ; it can be open', array('%name%' => $person->__toString()))); return $this->redirect( $this->generateUrl('chill_person_accompanying_period_list', array( 'person_id' => $person->getId() ))); } $accompanyingPeriod = new AccompanyingPeriod(new \DateTime()); $form = $this->createForm(AccompanyingPeriodType::class, $accompanyingPeriod, array('period_action' => 'open', 'center' => $person->getCenter())); if ($request->getMethod() === 'POST') { $form->handleRequest($request); if ($form->isValid()) { $person->open($accompanyingPeriod); $errors = $this->_validatePerson($person); if (count($errors) <= 0) { $this->get('session')->getFlashBag() ->add('success', $this->get('translator') ->trans('An accompanying period has been opened.', array('%name%' => $person->__toString()))); $this->getDoctrine()->getManager()->flush(); return $this->redirect( $this->generateUrl('chill_person_accompanying_period_list', array( 'person_id' => $person->getId() ))); } else { $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Period not opened')); foreach ($errors as $error) { $this->get('session')->getFlashBag() ->add('info', $error->getMessage()); } } } else { // if errors in forms $this->get('session')->getFlashBag() ->add('error', $this->get('translator') ->trans('Period not opened : form is invalid')); } } return $this->render('ChillPersonBundle:AccompanyingPeriod:form.html.twig', array('form' => $form->createView(), 'person' => $person, 'accompanying_period' => $accompanyingPeriod)); } /** * @param $person_id * @param $period_id * @param Request $request * @return object|\Symfony\Component\HttpFoundation\RedirectResponse|Response */ public function reOpenAction($person_id, $period_id, Request $request) { $person = $this->_getPerson($person_id); $criteria = Criteria::create(); $criteria->where($criteria->expr()->eq('id', $period_id)); /* @var $period AccompanyingPeriod */ $period = $person->getAccompanyingPeriods() ->matching($criteria) ->first(); if ($period === NULL) { throw $this->createNotFoundException('period not found'); } $confirm = $request->query->getBoolean('confirm', false); if ($confirm === true && $period->canBeReOpened()) { $period->reOpen(); $this->_validatePerson($person); $this->getDoctrine()->getManager()->flush(); $this->addFlash('success', $this->get('translator')->trans( 'The period has been re-opened')); return $this->redirectToRoute('chill_person_accompanying_period_list', array('person_id' => $person->getId())); } elseif ($confirm === false && $period->canBeReOpened()) { return $this->render('ChillPersonBundle:AccompanyingPeriod:re_open.html.twig', array( 'period' => $period, 'person' => $person )); } else { return (new Response()) ->setStatusCode(Response::HTTP_BAD_REQUEST) ->setContent("You cannot re-open this period"); } } /** * * @param int $id * @return Person * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException if the person is not found */ private function _getPerson($id) { $person = $this->getDoctrine()->getManager() ->getRepository('ChillPersonBundle:Person')->find($id); if ($person === null) { throw $this->createNotFoundException('Person not found'); } $this->denyAccessUnlessGranted(PersonVoter::SEE, $person, "You are not allowed to see this person"); return $person; } }