diff --git a/Export/Aggregator/ActivityReasonAggregator.php b/Export/Aggregator/ActivityReasonAggregator.php index a0d01baf2..b33c321ee 100644 --- a/Export/Aggregator/ActivityReasonAggregator.php +++ b/Export/Aggregator/ActivityReasonAggregator.php @@ -26,6 +26,7 @@ use Symfony\Component\Security\Core\Role\Role; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Doctrine\ORM\EntityRepository; use Chill\MainBundle\Templating\TranslatableStringHelper; +use Doctrine\ORM\Query\Expr\Join; /** * @@ -76,15 +77,23 @@ class ActivityReasonAggregator implements AggregatorInterface } $qb->addSelect($elem.' as '.$alias); + // make a jointure only if needed - // add a join to reasons only if needed - if (array_key_exists('activity', $qb->getDQLPart('join'))) { - // we want to avoid multiple join on same object - if (!$this->checkJoinAlreadyDefined($qb->getDQLPart('join')['activity'], 'reasons')) { - $qb->add('join', new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')); - } - } else { - $qb->join('activity.reasons', 'reasons'); + $join = $qb->getDQLPart('join'); + if ( + (array_key_exists('activity', $join) + && + !$this->checkJoinAlreadyDefined($join['activity'], 'reasons') + ) + OR + (! array_key_exists('activity', $join)) + ) { + $qb->add( + 'join', + array('activity' => + new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons') + ), + true); } // join category if necessary @@ -178,19 +187,21 @@ class ActivityReasonAggregator implements AggregatorInterface switch ($data['level']) { case 'reasons': - $n = $this->reasonRepository->find($value) - ->getName() + /* @var $r \Chill\ActivityBundle\Entity\ActivityReason */ + $r = $this->reasonRepository->find($value); + + return $this->stringHelper->localize($r->getCategory()->getName()) + ." > " + . $this->stringHelper->localize($r->getName()); ; break; case 'categories': - $n = $this->categoryRepository->find($value) - ->getName() - ; + $c = $this->categoryRepository->find($value); + + return $this->stringHelper->localize($c->getName()); break; // no need for a default : the default was already set above } - - return $this->stringHelper->localize($n); }; } diff --git a/Export/Export/ListActivity.php b/Export/Export/ListActivity.php new file mode 100644 index 000000000..394d16df8 --- /dev/null +++ b/Export/Export/ListActivity.php @@ -0,0 +1,287 @@ + + * + * 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\ActivityBundle\Export\Export; + +use Chill\MainBundle\Export\ListInterface; +use Chill\ActivityBundle\Entity\ActivityReason; +use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Entity\Scope; +use Chill\ActivityBundle\Entity\ActivityType; +use Doctrine\ORM\Query\Expr; +use Chill\MainBundle\Templating\TranslatableStringHelper; +use Symfony\Component\Security\Core\Role\Role; +use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; +use Symfony\Component\Form\FormBuilderInterface; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Component\Translation\TranslatorInterface; +use Symfony\Component\Validator\Constraints\Callback; +use Doctrine\ORM\Query; +use Chill\MainBundle\Export\FormatterInterface; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\Validator\Context\ExecutionContextInterface; + +/** + * Create a list for all activities + * + * @author Julien Fastré + */ +class ListActivity implements ListInterface +{ + + /** + * + * @var EntityManagerInterface + */ + protected $entityManager; + + /** + * + * @var TranslatorInterface + */ + protected $translator; + + /** + * + * @var TranslatableStringHelper + */ + protected $translatableStringHelper; + + protected $fields = array( + 'id', + 'date', + 'durationTime', + 'attendee', + 'list_reasons', + 'user_username', + 'circle_name', + 'type_name', + 'person_firstname', + 'person_lastname', + 'person_id' + ); + + public function __construct( + EntityManagerInterface $em, + TranslatorInterface $translator, + TranslatableStringHelper $translatableStringHelper + ) + { + $this->entityManager = $em; + $this->translator = $translator; + $this->translatableStringHelper = $translatableStringHelper; + } + + /** + * {@inheritDoc} + * + * @param FormBuilderInterface $builder + */ + public function buildForm(FormBuilderInterface $builder) + { + $builder->add('fields', ChoiceType::class, array( + 'multiple' => true, + 'expanded' => true, + 'choices' => array_combine($this->fields, $this->fields), + 'label' => 'Fields to include in export', + 'constraints' => [new Callback(array( + 'callback' => function($selected, ExecutionContextInterface $context) { + if (count($selected) === 0) { + $context->buildViolation('You must select at least one element') + ->atPath('fields') + ->addViolation(); + } + } + ))] + )); + + } + + /** + * {@inheritDoc} + * + * @return type + */ + public function getAllowedFormattersTypes() + { + return array(FormatterInterface::TYPE_LIST); + } + + public function getDescription() + { + return "List activities"; + } + + public function getLabels($key, array $values, $data) + { + switch ($key) + { + case 'date' : + return function($value) { + if ($value === '_header') return 'date'; + + $date = \DateTime::createFromFormat('Y-m-d H:i:s', $value); + + return $date->format('d-m-Y'); + }; + case 'attendee': + return function($value) { + if ($value === '_header') return 'attendee'; + + return $value ? 1 : 0; + }; + case 'list_reasons' : + /* @var $activityReasonsRepository EntityRepository */ + $activityRepository = $this->entityManager + ->getRepository('ChillActivityBundle:Activity'); + + return function($value) use ($activityRepository) { + if ($value === '_header') return 'activity reasons'; + + $activity = $activityRepository + ->find($value); + + return implode(", ", array_map(function(ActivityReason $r) { + + return '"'. + $this->translatableStringHelper->localize($r->getCategory()->getName()) + .' > '. + $this->translatableStringHelper->localize($r->getName()) + .'"'; + }, $activity->getReasons()->toArray())); + }; + case 'circle_name' : + return function($value) { + if ($value === '_header') return 'circle'; + + return $this->translatableStringHelper + ->localize(json_decode($value, true)); + }; + case 'type_name' : + return function($value) { + if ($value === '_header') return 'activity type'; + + return $this->translatableStringHelper + ->localize(json_decode($value, true)); + }; + default: + return function($value) use ($key) { + if ($value === '_header') return $key; + + return $value; + }; + } + } + + public function getQueryKeys($data) + { + return $data['fields']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle() + { + return 'List activities'; + } + + public function getType() + { + return 'activity'; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = array()) + { + $centers = array_map(function($el) { return $el['center']; }, $acl); + + // throw an error if any fields are present + if (!\array_key_exists('fields', $data)) { + throw new \Doctrine\DBAL\Exception\InvalidArgumentException("any fields " + . "have been checked"); + } + + $qb = $this->entityManager->createQueryBuilder(); + + $qb + ->from('ChillActivityBundle:Activity', 'activity') + ->join('activity.person', 'person') + ->join('person.center', 'center') + ->andWhere('center IN (:authorized_centers)') + ->setParameter('authorized_centers', $centers); + ; + + foreach ($this->fields as $f) { + if (in_array($f, $data['fields'])) { + switch ($f) { + case 'id': + $qb->addSelect('activity.id AS id'); + break; + case 'person_firstname': + $qb->addSelect('person.firstName AS person_firstname'); + break; + case 'person_lastname': + $qb->addSelect('person.lastName AS person_lastname'); + break; + case 'person_id': + $qb->addSelect('person.id AS person_id'); + break; + case 'user_username': + $qb->join('activity.user', 'user'); + $qb->addSelect('user.username AS user_username'); + break; + case 'circle_name': + $qb->join('activity.scope', 'circle'); + $qb->addSelect('circle.name AS circle_name'); + break; + case 'type_name': + $qb->join('activity.type', 'type'); + $qb->addSelect('type.name AS type_name'); + break; + case 'list_reasons': + // this is a trick... The reasons is filled with the + // activity id which will be used to load reasons + $qb->addSelect('activity.id AS list_reasons'); + break; + default: + $qb->addSelect(sprintf('activity.%s as %s', $f, $f)); + break; + } + + } + } + + + + return $qb; + } + + public function requiredRole() + { + return new Role(ActivityStatsVoter::LISTS); + } + + public function supportsModifiers() + { + return array('activity', 'person'); + } + +} diff --git a/Export/Filter/ActivityDateFilter.php b/Export/Filter/ActivityDateFilter.php new file mode 100644 index 000000000..50b7ce6db --- /dev/null +++ b/Export/Filter/ActivityDateFilter.php @@ -0,0 +1,132 @@ + + * + * 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\ActivityBundle\Export\Filter; + +use Chill\MainBundle\Export\FilterInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\Extension\Core\Type\DateType; +use Symfony\Component\Form\FormError; +use Chill\MainBundle\Form\Type\Export\FilterType; +use Doctrine\ORM\Query\Expr; + +/** + * + * + * @author Julien Fastré + */ +class ActivityDateFilter implements FilterInterface +{ + + public function addRole() + { + return null; + } + + public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data) + { + $where = $qb->getDQLPart('where'); + $clause = $qb->expr()->between('activity.date', ':date_from', + ':date_to'); + + if ($where instanceof Expr\Andx) { + $where->add($clause); + } else { + $where = $qb->expr()->andX($clause); + } + + $qb->add('where', $where); + $qb->setParameter('date_from', $data['date_from']); + $qb->setParameter('date_to', $data['date_to']); + } + + public function applyOn() + { + return 'activity'; + } + + public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) + { + $builder->add('date_from', DateType::class, array( + 'label' => "Activities after this date", + 'data' => new \DateTime(), + 'attr' => array('class' => 'datepicker'), + 'widget'=> 'single_text', + 'format' => 'dd-MM-yyyy', + )); + + $builder->add('date_to', DateType::class, array( + 'label' => "Activities before this date", + 'data' => new \DateTime(), + 'attr' => array('class' => 'datepicker'), + 'widget'=> 'single_text', + 'format' => 'dd-MM-yyyy', + )); + + $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) { + /* @var $filterForm \Symfony\Component\Form\FormInterface */ + $filterForm = $event->getForm()->getParent(); + $enabled = $filterForm->get(FilterType::ENABLED_FIELD)->getData(); + + if ($enabled === true) { + // if the filter is enabled, add some validation + $form = $event->getForm(); + $date_from = $form->get('date_from')->getData(); + $date_to = $form->get('date_to')->getData(); + + // check that fields are not empty + if ($date_from === null) { + $form->get('date_from')->addError(new FormError('This field ' + . 'should not be empty')); + } + if ($date_to === null) { + $form->get('date_to')->addError(new FormError('This field ' + . 'should not be empty')); + } + + // check that date_from is before date_to + if ( + ($date_from !== null && $date_to !== null) + && + $date_from >= $date_to + ) { + $form->get('date_to')->addError(new FormError('This date ' + . 'should be after the date given in "activities after" field')); + } + } + }); + } + + public function describeAction($data, $format = 'string') + { + return array( + "Filtered by date of activity: only between %date_from% and %date_to%", + array( + "%date_from%" => $data['date_from']->format('d-m-Y'), + '%date_to%' => $data['date_to']->format('d-m-Y') + )); + } + + public function getTitle() + { + return "Filtered by date activity"; + } + +} diff --git a/Export/Filter/ActivityReasonFilter.php b/Export/Filter/ActivityReasonFilter.php index 32b05b01e..1dc1b1854 100644 --- a/Export/Filter/ActivityReasonFilter.php +++ b/Export/Filter/ActivityReasonFilter.php @@ -27,7 +27,7 @@ use Chill\ActivityBundle\Entity\ActivityReason; use Chill\MainBundle\Templating\TranslatableStringHelper; use Doctrine\ORM\Query\Expr; use Symfony\Component\Security\Core\Role\Role; -use Chill\ActivityBundle\Security\Authorization\ActivityVoter; +use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\Expr\Join; @@ -65,16 +65,23 @@ class ActivityReasonFilter implements FilterInterface $where = $qb->getDQLPart('where'); $join = $qb->getDQLPart('join'); $clause = $qb->expr()->in('reasons', ':selected_activity_reasons'); + //dump($join); // add a join to reasons only if needed - if (array_key_exists('activity', $join)) { - // we want to avoid multiple join on same object - if (!$this->checkJoinAlreadyDefined($join['activity'])) { - $qb->add('join', new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')); - } - } else { - $qb->join('activity.reasons', 'reasons'); + if ( + (array_key_exists('activity', $join) + && + !$this->checkJoinAlreadyDefined($join['activity'], 'reasons') + ) + OR + (! array_key_exists('activity', $join)) + ) { + $qb->add( + 'join', + array('activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')), + true + ); } - + if ($where instanceof Expr\Andx) { $where->add($clause); } else { @@ -91,10 +98,10 @@ class ActivityReasonFilter implements FilterInterface * @param Join[] $joins * @return boolean */ - private function checkJoinAlreadyDefined(array $joins) + private function checkJoinAlreadyDefined(array $joins, $alias) { foreach ($joins as $join) { - if ($join->getAlias() === 'reasons') { + if ($join->getAlias() === $alias) { return true; } } @@ -132,7 +139,7 @@ class ActivityReasonFilter implements FilterInterface public function addRole() { - return new Role(ActivityVoter::SEE); + return new Role(ActivityStatsVoter::STATS); } public function describeAction($data, $format = 'string') diff --git a/Export/Filter/PersonHavingActivityBetweenDateFilter.php b/Export/Filter/PersonHavingActivityBetweenDateFilter.php new file mode 100644 index 000000000..23e353c11 --- /dev/null +++ b/Export/Filter/PersonHavingActivityBetweenDateFilter.php @@ -0,0 +1,205 @@ + + * + * 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\ActivityBundle\Export\Filter; + +use Chill\MainBundle\Export\FilterInterface; +use Symfony\Component\Form\FormEvent; +use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\Extension\Core\Type\DateType; +use Symfony\Component\Form\FormError; +use Chill\MainBundle\Form\Type\Export\FilterType; +use Doctrine\ORM\Query\Expr; +use Chill\MainBundle\Templating\TranslatableStringHelper; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; +use Chill\ActivityBundle\Entity\ActivityReason; +use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\EntityManager; +use Chill\PersonBundle\Export\Declarations; + +/** + * + * + * @author Julien Fastré + */ +class PersonHavingActivityBetweenDateFilter implements FilterInterface +{ + + /** + * + * @var TranslatableStringHelper + */ + protected $translatableStringHelper; + + /** + * + * @var EntityRepository + */ + protected $activityReasonRepository; + + public function __construct( + TranslatableStringHelper $translatableStringHelper, + EntityRepository $activityReasonRepository + ) { + $this->translatableStringHelper = $translatableStringHelper; + $this->activityReasonRepository = $activityReasonRepository; + } + + + public function addRole() + { + return null; + } + + public function alterQuery(\Doctrine\ORM\QueryBuilder $qb, $data) + { + // create a query for activity + $sqb = $qb->getEntityManager()->createQueryBuilder(); + $sqb->select("person_person_having_activity.id") + ->from("ChillActivityBundle:Activity", "activity_person_having_activity") + ->join("activity_person_having_activity.person", "person_person_having_activity") + ; + // add clause between date + $sqb->where("activity_person_having_activity.date BETWEEN " + . ":person_having_activity_between_date_from" + . " AND " + . ":person_having_activity_between_date_to"); + // add clause activity reason + $sqb->join('activity_person_having_activity.reasons', + 'reasons_person_having_activity'); + $sqb->andWhere( + $sqb->expr()->in( + 'reasons_person_having_activity', + ":person_having_activity_reasons") + ); + + $where = $qb->getDQLPart('where'); + $clause = $qb->expr()->in('person.id', $sqb->getDQL()); + + if ($where instanceof Expr\Andx) { + $where->add($clause); + } else { + $where = $qb->expr()->andX($clause); + } + + $qb->add('where', $where); + $qb->setParameter('person_having_activity_between_date_from', + $data['date_from']); + $qb->setParameter('person_having_activity_between_date_to', + $data['date_to']); + $qb->setParameter('person_having_activity_reasons', $data['reasons']); + } + + public function applyOn() + { + return Declarations::PERSON_IMPLIED_IN; + } + + public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) + { + $builder->add('date_from', DateType::class, array( + 'label' => "Implied in an activity after this date", + 'data' => new \DateTime(), + 'attr' => array('class' => 'datepicker'), + 'widget'=> 'single_text', + 'format' => 'dd-MM-yyyy', + )); + + $builder->add('date_to', DateType::class, array( + 'label' => "Implied in an activity before this date", + 'data' => new \DateTime(), + 'attr' => array('class' => 'datepicker'), + 'widget'=> 'single_text', + 'format' => 'dd-MM-yyyy', + )); + + $builder->add('reasons', EntityType::class, array( + 'class' => 'ChillActivityBundle:ActivityReason', + 'choice_label' => function (ActivityReason $reason) { + return $this->translatableStringHelper + ->localize($reason->getName()); + }, + 'group_by' => function(ActivityReason $reason) { + return $this->translatableStringHelper + ->localize($reason->getCategory()->getName()); + }, + 'data' => $this->activityReasonRepository->findAll(), + 'multiple' => true, + 'expanded' => false, + 'label' => "Activity reasons for those activities" + )); + + $builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) { + /* @var $filterForm \Symfony\Component\Form\FormInterface */ + $filterForm = $event->getForm()->getParent(); + $enabled = $filterForm->get(FilterType::ENABLED_FIELD)->getData(); + + if ($enabled === true) { + // if the filter is enabled, add some validation + $form = $event->getForm(); + $date_from = $form->get('date_from')->getData(); + $date_to = $form->get('date_to')->getData(); + + // check that fields are not empty + if ($date_from === null) { + $form->get('date_from')->addError(new FormError('This field ' + . 'should not be empty')); + } + if ($date_to === null) { + $form->get('date_to')->addError(new FormError('This field ' + . 'should not be empty')); + } + + // check that date_from is before date_to + if ( + ($date_from !== null && $date_to !== null) + && + $date_from >= $date_to + ) { + $form->get('date_to')->addError(new FormError('This date ' + . 'should be after the date given in "Implied in an ' + . 'activity after this date" field')); + } + } + }); + } + + public function describeAction($data, $format = 'string') + { + return array( + "Filtered by person having an activity between %date_from% and " + . "%date_to% with reasons %reasons_name%", + array( + "%date_from%" => $data['date_from']->format('d-m-Y'), + '%date_to%' => $data['date_to']->format('d-m-Y'), + "%reasons_name%" => implode(", ", array_map( + function (ActivityReason $r) { + return '"'.$this->translatableStringHelper-> + localize($r->getName()).'"'; + }, + $data['reasons'])) + )); + } + + public function getTitle() + { + return "Filtered by person having an activity in a period"; + } + +} diff --git a/Resources/config/services/export.yml b/Resources/config/services/export.yml index 3221a4ab5..daf4fef57 100644 --- a/Resources/config/services/export.yml +++ b/Resources/config/services/export.yml @@ -6,6 +6,15 @@ services: tags: - { name: chill.export, alias: 'count_activity' } + chill.activity.export.list_activity: + class: Chill\ActivityBundle\Export\Export\ListActivity + arguments: + - "@doctrine.orm.entity_manager" + - "@translator" + - "@chill.main.helper.translatable_string" + tags: + - { name: chill.export, alias: 'list_activity' } + chill.activity.export.reason_filter: class: Chill\ActivityBundle\Export\Filter\ActivityReasonFilter arguments: @@ -14,6 +23,21 @@ services: tags: - { name: chill.export_filter, alias: 'activity_reason_filter' } + chill.activity.export.date_filter: + class: Chill\ActivityBundle\Export\Filter\ActivityDateFilter + tags: + - { name: chill.export_filter, alias: 'activity_date_filter' } + + chill.activity.export.person_having_an_activity_between_date_filter: + class: Chill\ActivityBundle\Export\Filter\PersonHavingActivityBetweenDateFilter + arguments: + - "@chill.main.helper.translatable_string" + - "@chill_activity.repository.reason" + tags: + - #0 register as a filter + name: chill.export_filter + alias: 'activity_person_having_ac_bw_date_filter' + chill.activity.export.reason_aggregator: class: Chill\ActivityBundle\Export\Aggregator\ActivityReasonAggregator arguments: @@ -21,4 +45,4 @@ services: - "@chill_activity.repository.reason" - "@chill.main.helper.translatable_string" tags: - - { name: chill.export_aggregator, alias: activity_reason } + - { name: chill.export_aggregator, alias: activity_reason_aggregator } diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index dfa72bb7a..b426463dc 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -103,6 +103,12 @@ Count activities by various parameters.: Compte le nombre d'activités enregistr Filter by reason: Filtrer par sujet d'activité 'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%' + +"Filtered by date of activity: only between %date_from% and %date_to%": "Filtré par date de l'activité: uniquement entre %date_from% et %date_to%" + +Filtered by person having an activity between %date_from% and %date_to% with reasons %reasons_name%: Filtré par personnes associées à une activité entre %date_from% et %date_to% avec les sujets %reasons_name% +Activity reasons for those activities: Sujets de ces activités + #aggregators Aggregate by activity reason: Aggréger par sujet de l'activité By reason: Par sujet diff --git a/Tests/Export/Export/ListActivityTest.php b/Tests/Export/Export/ListActivityTest.php new file mode 100644 index 000000000..dbb660e55 --- /dev/null +++ b/Tests/Export/Export/ListActivityTest.php @@ -0,0 +1,93 @@ + + * + * 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\ActivityBundle\Tests\Export\Export; + +use Chill\MainBundle\Test\Export\AbstractExportTest; + +/** + * + * + * @author Julien Fastré + */ +class ListActivityTest extends AbstractExportTest +{ + /** + * + * @var \Chill\ActivityBundle\Export\Export\ListActivity + */ + private $export; + + public function setUp() + { + static::bootKernel(); + + /* @var $container \Symfony\Component\DependencyInjection\ContainerInterface */ + $container = self::$kernel->getContainer(); + + $this->export = $container->get('chill.activity.export.list_activity'); + + // add a fake request with a default locale (used in translatable string) + $prophet = new \Prophecy\Prophet; + $request = $prophet->prophesize(); + $request->willExtend(\Symfony\Component\HttpFoundation\Request::class); + $request->getLocale()->willReturn('fr'); + + $container->get('request_stack') + ->push($request->reveal()); + } + + + + public function getFormData() + { + return array( + array('fields' => array( + 'id', + 'date', + 'durationTime', + 'attendee', + 'user_username', + 'circle_name', + 'type_name', + 'person_firstname', + 'person_lastname', + 'person_id' + )), + array('fields' => array( + 'id', + 'list_reasons' + )), + ); + } + + public function getModifiersCombination() + { + return array( + array('activity'), + array('activity', 'person') + ); + } + + public function getExport() + { + return $this->export; + } + +}