diff --git a/Controller/TimelinePersonController.php b/Controller/TimelinePersonController.php new file mode 100644 index 000000000..7c95db68d --- /dev/null +++ b/Controller/TimelinePersonController.php @@ -0,0 +1,53 @@ + + * + * 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 Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Bundle\FrameworkBundle\Controller\Controller; + +/** + * + * + * @author Julien Fastré + */ +class TimelinePersonController extends Controller +{ + + public function personAction(Request $request, $person_id) + { + $person = $this->getDoctrine() + ->getRepository('ChillPersonBundle:Person') + ->find($person_id); + + if ($person === NULL) { + throw $this->createNotFoundException(); + } + + return $this->render('ChillPersonBundle:Timeline:index.html.twig', array + ( + 'timeline' => $this->get('chill.main.timeline_builder') + ->getTimelineHTML('person', array('person' => $person)), + 'person' => $person + ) + ); + } + +} diff --git a/Resources/config/routing.yml b/Resources/config/routing.yml index 2b1f45f15..8998434ba 100644 --- a/Resources/config/routing.yml +++ b/Resources/config/routing.yml @@ -78,4 +78,13 @@ chill_person_admin: admin: order: 100 label: menu.person.admin.index - helper: menu.person.admin.helper \ No newline at end of file + helper: menu.person.admin.helper + +chill_person_timeline: + pattern: /{_locale}/person/{person_id}/timeline + defaults: { _controller: ChillPersonBundle:TimelinePerson:person } + options: + menus: + person: + order: 60 + label: Timeline \ No newline at end of file diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 9cbcfad18..9f7f61f99 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -18,3 +18,17 @@ services: - ['setContainer', ["@service_container"]] tags: - { name: chill.search, alias: 'person_regular' } + + chill.person.timeline.accompanying_period_opening: + class: Chill\PersonBundle\Timeline\TimelineAccompanyingPeriodOpening + arguments: + - "@doctrine.orm.entity_manager" + tags: + - { name: chill.timeline, context: 'person' } + + chill.person.timeline.accompanying_period_closing: + class: Chill\PersonBundle\Timeline\TimelineAccompanyingPeriodClosing + arguments: + - "@doctrine.orm.entity_manager" + tags: + - { name: chill.timeline, context: 'person' } diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index f2df6bc20..f3daac047 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -67,3 +67,7 @@ Reset: 'Remise à zéro' 'Create accompanying period': 'Nouvel ouverture-fermeture à une autre date' 'Closing motive': 'Motif de clôture' 'Person details': 'Détails de la personne' + +#timeline +'An accompanying period is opened for %person% on %date%': Une période d'accompagnement a été ouverte le %date% pour %person% +'An accompanying period is closed for %person% on %date%': Une période d'accompagnement a été fermée le %date% pour %person% diff --git a/Resources/views/Timeline/closing_period.html.twig b/Resources/views/Timeline/closing_period.html.twig new file mode 100644 index 000000000..5fa180a9e --- /dev/null +++ b/Resources/views/Timeline/closing_period.html.twig @@ -0,0 +1 @@ +

 {{ 'An accompanying period is closed for %person% on %date%'|trans({'%person%': person, '%date%': period.dateClosing|localizeddate('long', 'none') } ) }}

diff --git a/Resources/views/Timeline/index.html.twig b/Resources/views/Timeline/index.html.twig new file mode 100644 index 000000000..0733e3174 --- /dev/null +++ b/Resources/views/Timeline/index.html.twig @@ -0,0 +1,32 @@ +{# + * Copyright (C) 2014, Champs Libres Cooperative SCRLFS, + * + * 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 . +#} +{% extends "ChillPersonBundle::layout.html.twig" %} + +{% set activeRouteKey = 'chill_person_timeline' %} + +{# +This view should receive those arguments: +- person +#} + +{% block title %}{{ 'Timeline for %name%'|trans({'%name%': person }) }}{% endblock %} + + +{% block personcontent %} + {{ timeline|raw }} + +{% endblock personcontent %} diff --git a/Resources/views/Timeline/opening_period.html.twig b/Resources/views/Timeline/opening_period.html.twig new file mode 100644 index 000000000..12f8489a7 --- /dev/null +++ b/Resources/views/Timeline/opening_period.html.twig @@ -0,0 +1 @@ +

 {{ 'An accompanying period is opened for %person% on %date%'|trans({'%person%': person, '%date%': period.dateOpening|localizeddate('long', 'none') } ) }}

diff --git a/Timeline/AbstractTimelineAccompanyingPeriod.php b/Timeline/AbstractTimelineAccompanyingPeriod.php new file mode 100644 index 000000000..d7d08ea11 --- /dev/null +++ b/Timeline/AbstractTimelineAccompanyingPeriod.php @@ -0,0 +1,107 @@ + + * + * 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\Timeline; + +use Chill\MainBundle\Timeline\TimelineProviderInterface; +use Doctrine\ORM\EntityManager; + +/** + * Provide method to build timeline for accompanying periods + * + * This class is resued by TimelineAccompanyingPeriodOpening (for opening) + * and TimelineAccompanyingPeriodClosing (for closing) + * + * @author Julien Fastré + */ +abstract class AbstractTimelineAccompanyingPeriod implements TimelineProviderInterface +{ + /** + * + * @var EntityManager + */ + protected $em; + + public function __construct(EntityManager $em) + { + $this->em = $em; + } + + /** + * + * {@inheritDoc} + */ + public function getEntities(array $ids) + { + $periods = $this->em + ->getRepository('ChillPersonBundle:AccompanyingPeriod') + ->findBy(array('id' => $ids)); + + //set results in an associative array with id as indexes + $results = array(); + foreach($periods as $period) { + $results[$period->getId()] = $period; + } + + return $results; + } + + /** + * prepare fetchQuery without `WHERE` and `TYPE` clause + * + * @param string $context + * @param array $args + * @return array + * @throws \LogicException + */ + protected function basicFetchQuery($context, array $args) + { + if ($context !== 'person') { + throw new \LogicException('TimelineAccompanyingPeriod is not able ' + . 'to render context '.$context); + } + + $metadata = $this->em + ->getClassMetadata('ChillPersonBundle:AccompanyingPeriod') + ; + + return array( + 'id' => $metadata->getColumnName('id'), + 'date' => $metadata->getColumnName('date_opening'), + 'FROM' => $metadata->getTableName(), + ); + } + + /** + * return the expected response for TimelineProviderInterface::getEntityTemplate + * + * @param string $template the template for rendering + * @param mixed $entity + * @param string $context + * @param array $args + * @return array + */ + protected function getBasicEntityTemplate($template, $entity, $context, array $args) + { + return array( + 'template' => $template, + 'template_data' => ['person' => $args['person'], 'period' => $entity] + ); + } +} diff --git a/Timeline/TimelineAccompanyingPeriodClosing.php b/Timeline/TimelineAccompanyingPeriodClosing.php new file mode 100644 index 000000000..bb2534034 --- /dev/null +++ b/Timeline/TimelineAccompanyingPeriodClosing.php @@ -0,0 +1,78 @@ + + * + * 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\Timeline; + +use Chill\MainBundle\Timeline\TimelineProviderInterface; +use Doctrine\ORM\EntityManager; + +/** + * Provide information for opening periods to timeline + * + * @author Julien Fastré + */ +class TimelineAccompanyingPeriodClosing extends AbstractTimelineAccompanyingPeriod +{ + + /** + * + * {@inheritDoc} + */ + public function supportsType($type) + { + return $type === 'accompanying_period_closing'; + } + + /** + * + * {@inheritDoc} + */ + public function fetchQuery($context, array $args) + { + $metadata = $this->em + ->getClassMetadata('ChillPersonBundle:AccompanyingPeriod'); + + $data = $this->basicFetchQuery($context, $args); + + $data['type'] = 'accompanying_period_closing'; + $data['WHERE'] = sprintf('%s = %d AND %s IS NOT NULL', + $metadata + ->getAssociationMapping('person')['joinColumns'][0]['name'], + $args['person']->getId(), + $metadata + ->getColumnName('date_closing') + ); + + return $data; + } + + /** + * + * {@inheritDoc} + */ + public function getEntityTemplate($entity, $context, array $args) + { + return $this->getBasicEntityTemplate( + 'ChillPersonBundle:Timeline:closing_period.html.twig', + $entity, + $context, + $args + ); + } +} diff --git a/Timeline/TimelineAccompanyingPeriodOpening.php b/Timeline/TimelineAccompanyingPeriodOpening.php new file mode 100644 index 000000000..0ce0de527 --- /dev/null +++ b/Timeline/TimelineAccompanyingPeriodOpening.php @@ -0,0 +1,74 @@ + + * + * 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\Timeline; + +use Chill\MainBundle\Timeline\TimelineProviderInterface; +use Doctrine\ORM\EntityManager; + +/** + * Provide information for opening periods to timeline + * + * @author Julien Fastré + */ +class TimelineAccompanyingPeriodOpening extends AbstractTimelineAccompanyingPeriod +{ + + /** + * + * {@inheritDoc} + */ + public function supportsType($type) + { + return $type === 'accompanying_period_opening'; + } + + /** + * + * {@inheritDoc} + */ + public function fetchQuery($context, array $args) + { + + $data = $this->basicFetchQuery($context, $args); + + $data['type'] = 'accompanying_period_opening'; + $data['WHERE'] = sprintf('%s = %d', + $this->em + ->getClassMetadata('ChillPersonBundle:AccompanyingPeriod') + ->getAssociationMapping('person')['joinColumns'][0]['name'], + $args['person']->getId()); + + return $data; + } + + /** + * + * {@inheritDoc} + */ + public function getEntityTemplate($entity, $context, array $args) + { + return $this->getBasicEntityTemplate( + 'ChillPersonBundle:Timeline:opening_period.html.twig', + $entity, + $context, + $args + ); + } +}