+ */
+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
+ );
+ }
+}