diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityReasonAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityReasonAggregator.php index 6614caace..3e5cab378 100644 --- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityReasonAggregator.php +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityReasonAggregator.php @@ -1,70 +1,39 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Aggregator; +use Chill\ActivityBundle\Repository\ActivityReasonCategoryRepository; +use Chill\ActivityBundle\Repository\ActivityReasonRepository; +use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Symfony\Component\Form\FormBuilderInterface; use Doctrine\ORM\QueryBuilder; use Chill\MainBundle\Export\AggregatorInterface; 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; use Chill\MainBundle\Export\ExportElementValidatedInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; -/** - * - * - * @author Julien Fastré - */ -class ActivityReasonAggregator implements AggregatorInterface, - ExportElementValidatedInterface +class ActivityReasonAggregator implements AggregatorInterface, ExportElementValidatedInterface { - /** - * - * @var EntityRepository - */ - protected $categoryRepository; + protected ActivityReasonCategoryRepository $activityReasonCategoryRepository; - /** - * - * @var EntityRepository - */ - protected $reasonRepository; + protected ActivityReasonRepository $activityReasonRepository; - /** - * - * @var TranslatableStringHelper - */ - protected $stringHelper; + protected TranslatableStringHelperInterface $translatableStringHelper; public function __construct( - EntityRepository $categoryRepository, - EntityRepository $reasonRepository, - TranslatableStringHelper $stringHelper + ActivityReasonCategoryRepository $activityReasonCategoryRepository, + ActivityReasonRepository $activityReasonRepository, + TranslatableStringHelper $translatableStringHelper ) { - $this->categoryRepository = $categoryRepository; - $this->reasonRepository = $reasonRepository; - $this->stringHelper = $stringHelper; + $this->activityReasonCategoryRepository = $activityReasonCategoryRepository; + $this->activityReasonRepository = $activityReasonRepository; + $this->translatableStringHelper = $translatableStringHelper; } public function alterQuery(QueryBuilder $qb, $data) @@ -77,7 +46,7 @@ class ActivityReasonAggregator implements AggregatorInterface, $elem = 'category.id'; $alias = 'activity_categories_id'; } else { - throw new \RuntimeException('the data provided are not recognized'); + throw new \RuntimeException('The data provided are not recognized.'); } $qb->addSelect($elem.' as '.$alias); @@ -93,11 +62,12 @@ class ActivityReasonAggregator implements AggregatorInterface, (! array_key_exists('activity', $join)) ) { $qb->add( - 'join', - array('activity' => - new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons') - ), - true); + 'join', + [ + 'activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons') + ], + true + ); } // join category if necessary @@ -143,28 +113,33 @@ class ActivityReasonAggregator implements AggregatorInterface, public function buildForm(FormBuilderInterface $builder) { - $builder->add('level', ChoiceType::class, array( - 'choices' => array( - 'By reason' => 'reasons', - 'By category of reason' => 'categories' - ), - 'multiple' => false, - 'expanded' => true, - 'label' => 'Reason\'s level' - )); + $builder->add( + 'level', + ChoiceType::class, + [ + 'choices' => [ + 'By reason' => 'reasons', + 'By category of reason' => 'categories' + ], + 'multiple' => false, + 'expanded' => true, + 'label' => "Reason's level" + ] + ); } public function validateForm($data, ExecutionContextInterface $context) { if ($data['level'] === null) { - $context->buildViolation("The reasons's level should not be empty") + $context + ->buildViolation("The reasons's level should not be empty.") ->addViolation(); } } - public function getTitle() + public function getTitle() { - return "Aggregate by activity reason"; + return 'Aggregate by activity reason'; } public function addRole() @@ -177,41 +152,33 @@ class ActivityReasonAggregator implements AggregatorInterface, // for performance reason, we load data from db only once switch ($data['level']) { case 'reasons': - $this->reasonRepository->findBy(array('id' => $values)); + $this->activityReasonRepository->findBy(['id' => $values]); break; case 'categories': - $this->categoryRepository->findBy(array('id' => $values)); + $this->activityReasonCategoryRepository->findBy(['id' => $values]); break; default: - throw new \RuntimeException(sprintf("the level data '%s' is invalid", - $data['level'])); + throw new \RuntimeException(sprintf("The level data '%s' is invalid.", $data['level'])); } return function($value) use ($data) { if ($value === '_header') { - return $data['level'] === 'reasons' ? - 'Group by reasons' - : - 'Group by categories of reason' - ; + return $data['level'] === 'reasons' ? 'Group by reasons' : 'Group by categories of reason'; } switch ($data['level']) { case 'reasons': - /* @var $r \Chill\ActivityBundle\Entity\ActivityReason */ - $r = $this->reasonRepository->find($value); + $r = $this->activityReasonRepository->find($value); - return $this->stringHelper->localize($r->getCategory()->getName()) - ." > " - . $this->stringHelper->localize($r->getName()); - ; - break; + return sprintf( + "%s > %s", + $this->translatableStringHelper->localize($r->getCategory()->getName()), + $this->translatableStringHelper->localize($r->getName()) + ); case 'categories': - $c = $this->categoryRepository->find($value); + $c = $this->activityReasonCategoryRepository->find($value); - return $this->stringHelper->localize($c->getName()); - break; - // no need for a default : the default was already set above + return $this->translatableStringHelper->localize($c->getName()); } }; @@ -222,12 +189,14 @@ class ActivityReasonAggregator implements AggregatorInterface, // add select element if ($data['level'] === 'reasons') { return array('activity_reasons_id'); - } elseif ($data['level'] === 'categories') { - return array ('activity_categories_id'); - } else { - throw new \RuntimeException('the data provided are not recognised'); } + if ($data['level'] === 'categories') { + return array ('activity_categories_id'); + } + + throw new \RuntimeException('The data provided are not recognised.'); + } } diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php index a0e6d3966..bd90e8eb6 100644 --- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php @@ -1,61 +1,32 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Aggregator; +use Chill\ActivityBundle\Repository\ActivityTypeRepository; +use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Symfony\Component\Form\FormBuilderInterface; use Doctrine\ORM\QueryBuilder; use Chill\MainBundle\Export\AggregatorInterface; 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; -/** - * - * - * @author Julien Fastré - */ class ActivityTypeAggregator implements AggregatorInterface { + protected ActivityTypeRepository $activityTypeRepository; - /** - * - * @var EntityRepository - */ - protected $typeRepository; + protected TranslatableStringHelperInterface $translatableStringHelper; - /** - * - * @var TranslatableStringHelper - */ - protected $stringHelper; - - const KEY = 'activity_type_aggregator'; + public const KEY = 'activity_type_aggregator'; public function __construct( - EntityRepository $typeRepository, - TranslatableStringHelper $stringHelper + ActivityTypeRepository $activityTypeRepository, + TranslatableStringHelperInterface $translatableStringHelper ) { - $this->typeRepository = $typeRepository; - $this->stringHelper = $stringHelper; + $this->activityTypeRepository = $activityTypeRepository; + $this->translatableStringHelper = $translatableStringHelper; } public function alterQuery(QueryBuilder $qb, $data) @@ -64,7 +35,7 @@ class ActivityTypeAggregator implements AggregatorInterface $qb->addSelect(sprintf('IDENTITY(activity.type) AS %s', self::KEY)); // add the "group by" part - $groupBy = $qb->addGroupBy(self::KEY); + $qb->addGroupBy(self::KEY); } /** @@ -97,7 +68,7 @@ class ActivityTypeAggregator implements AggregatorInterface public function getTitle() { - return "Aggregate by activity type"; + return 'Aggregate by activity type'; } public function addRole() @@ -108,17 +79,16 @@ class ActivityTypeAggregator implements AggregatorInterface public function getLabels($key, array $values, $data): \Closure { // for performance reason, we load data from db only once - $this->typeRepository->findBy(array('id' => $values)); + $this->activityTypeRepository->findBy(['id' => $values]); return function($value): string { if ($value === '_header') { return 'Activity type'; } - /* @var $r \Chill\ActivityBundle\Entity\ActivityType */ - $t = $this->typeRepository->find($value); + $t = $this->activityTypeRepository->find($value); - return $this->stringHelper->localize($t->getName()); + return $this->translatableStringHelper->localize($t->getName()); }; } diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php index ca01e0ae5..8e4635ef2 100644 --- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityUserAggregator.php @@ -1,51 +1,26 @@ - * - * 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\Aggregator; +use Chill\MainBundle\Repository\UserRepository; use Symfony\Component\Form\FormBuilderInterface; use Doctrine\ORM\QueryBuilder; use Chill\MainBundle\Export\AggregatorInterface; use Symfony\Component\Security\Core\Role\Role; -use Doctrine\ORM\Query\Expr\Join; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; -use Doctrine\ORM\EntityManagerInterface; -use Chill\MainBundle\Entity\User; -/** - * - * - * @author Julien Fastré - */ class ActivityUserAggregator implements AggregatorInterface { - /** - * - * @var EntityManagerInterface - */ - protected $em; - - const KEY = 'activity_user_id'; - - function __construct(EntityManagerInterface $em) - { - $this->em = $em; + public const KEY = 'activity_user_id'; + + private UserRepository $userRepository; + + public function __construct( + UserRepository $userRepository + ) { + $this->userRepository = $userRepository; } - + public function addRole() { return new Role(ActivityStatsVoter::STATS); @@ -53,9 +28,9 @@ class ActivityUserAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - // add select element + // add select element $qb->addSelect(sprintf('IDENTITY(activity.user) AS %s', self::KEY)); - + // add the "group by" part $qb->addGroupBy(self::KEY); } @@ -73,17 +48,14 @@ class ActivityUserAggregator implements AggregatorInterface public function getLabels($key, $values, $data): \Closure { // preload users at once - $this->em->getRepository(User::class) - ->findBy(['id' => $values]); - + $this->userRepository->findBy(['id' => $values]); + return function($value) { - switch ($value) { - case '_header': - return 'activity user'; - default: - return $this->em->getRepository(User::class)->find($value) - ->getUsername(); + if ($value === '_header') { + return 'activity user'; } + + return $this->userRepository->find($value)->getUsername(); }; } @@ -94,6 +66,6 @@ class ActivityUserAggregator implements AggregatorInterface public function getTitle(): string { - return "Aggregate by activity user"; + return 'Aggregate by activity user'; } } diff --git a/src/Bundle/ChillActivityBundle/Export/Export/CountActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/CountActivity.php index 3498d7a13..3d5d798f8 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/CountActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/CountActivity.php @@ -1,64 +1,40 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Export; +use Chill\ActivityBundle\Repository\ActivityRepository; use Chill\MainBundle\Export\ExportInterface; -use Doctrine\ORM\QueryBuilder; +use Chill\MainBundle\Export\FormatterInterface; +use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Security\Core\Role\Role; use Doctrine\ORM\Query; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; -use Doctrine\ORM\EntityManagerInterface; -/** - * - * - * @author Julien Fastré - */ class CountActivity implements ExportInterface { - /** - * - * @var EntityManagerInterface - */ - protected $entityManager; - + protected ActivityRepository $activityRepository; + public function __construct( - EntityManagerInterface $em - ) - { - $this->entityManager = $em; + ActivityRepository $activityRepository + ) { + $this->activityRepository = $activityRepository; } - - public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) + + public function buildForm(FormBuilderInterface $builder) { - + } public function getDescription() { - return "Count activities by various parameters."; + return 'Count activities by various parameters.'; } public function getTitle() { - return "Count activities"; + return 'Count activities'; } public function getType() @@ -68,26 +44,26 @@ class CountActivity implements ExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = array()) { - $qb = $this->entityManager->createQueryBuilder(); - $centers = array_map(function($el) { return $el['center']; }, $acl); - - $qb->select('COUNT(activity.id) as export_count_activity') - ->from('ChillActivityBundle:Activity', 'activity') - ->join('activity.person', 'person') - ; - - $qb->where($qb->expr()->in('person.center', ':centers')) - ->setParameter('centers', $centers) - ; - + $centers = array_map(static fn($el) => $el['center'], $acl); + + $qb = $this + ->activityRepository + ->createQueryBuilder('activity') + ->select('COUNT(activity.id) as export_count_activity') + ->join('activity.person', 'person'); + + $qb + ->where($qb->expr()->in('person.center', ':centers')) + ->setParameter('centers', $centers); + return $qb; } - + public function supportsModifiers() { - return array('person', 'activity'); + return ['person', 'activity']; } - + public function requiredRole() { return new Role(ActivityStatsVoter::STATS); @@ -95,7 +71,7 @@ class CountActivity implements ExportInterface public function getAllowedFormattersTypes() { - return array(\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR); + return [FormatterInterface::TYPE_TABULAR]; } public function getLabels($key, array $values, $data) @@ -103,19 +79,13 @@ class CountActivity implements ExportInterface if ($key !== 'export_count_activity') { throw new \LogicException("the key $key is not used by this export"); } - - return function($value) { - return $value === '_header' ? - 'Number of activities' - : - $value - ; - }; + + return static fn($value) => $value === '_header' ? 'Number of activities' : $value; } public function getQueryKeys($data) { - return array('export_count_activity'); + return ['export_count_activity']; } public function getResult($qb, $data) diff --git a/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php index 6e5d7b0b8..12338e225 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/ListActivity.php @@ -1,31 +1,14 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Export; +use Chill\ActivityBundle\Repository\ActivityRepository; 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 Chill\MainBundle\Templating\TranslatableStringHelperInterface; +use Doctrine\DBAL\Exception\InvalidArgumentException; use Symfony\Component\Security\Core\Role\Role; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Symfony\Component\Form\FormBuilderInterface; @@ -37,33 +20,17 @@ 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 { + private ActivityRepository $activityRepository; - /** - * - * @var EntityManagerInterface - */ - protected $entityManager; + protected EntityManagerInterface $entityManager; - /** - * - * @var TranslatorInterface - */ - protected $translator; + protected TranslatorInterface $translator; - /** - * - * @var TranslatableStringHelper - */ - protected $translatableStringHelper; + protected TranslatableStringHelperInterface $translatableStringHelper; - protected $fields = array( + protected array $fields = [ 'id', 'date', 'durationTime', @@ -75,32 +42,28 @@ class ListActivity implements ListInterface 'person_firstname', 'person_lastname', 'person_id' - ); + ]; public function __construct( - EntityManagerInterface $em, - TranslatorInterface $translator, - TranslatableStringHelper $translatableStringHelper - ) - { + EntityManagerInterface $em, + TranslatorInterface $translator, + TranslatableStringHelperInterface $translatableStringHelper, + ActivityRepository $activityRepository + ) { $this->entityManager = $em; $this->translator = $translator; $this->translatableStringHelper = $translatableStringHelper; + $this->activityRepository = $activityRepository; } - /** - * {@inheritDoc} - * - * @param FormBuilderInterface $builder - */ public function buildForm(FormBuilderInterface $builder) { - $builder->add('fields', ChoiceType::class, array( + $builder->add('fields', ChoiceType::class, [ 'multiple' => true, 'expanded' => true, 'choices' => array_combine($this->fields, $this->fields), 'label' => 'Fields to include in export', - 'constraints' => [new Callback(array( + 'constraints' => [new Callback([ 'callback' => function($selected, ExecutionContextInterface $context) { if (count($selected) === 0) { $context->buildViolation('You must select at least one element') @@ -108,19 +71,14 @@ class ListActivity implements ListInterface ->addViolation(); } } - ))] - )); + ])] + ]); } - /** - * {@inheritDoc} - * - * @return type - */ public function getAllowedFormattersTypes() { - return array(FormatterInterface::TYPE_LIST); + return [FormatterInterface::TYPE_LIST]; } public function getDescription() @@ -133,29 +91,32 @@ class ListActivity implements ListInterface switch ($key) { case 'date' : - return function($value) { - if ($value === '_header') return 'date'; + return static 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 static function($value) { + if ($value === '_header') { + return 'attendee'; + } return $value ? 1 : 0; }; case 'list_reasons' : - /* @var $activityReasonsRepository EntityRepository */ - $activityRepository = $this->entityManager - ->getRepository('ChillActivityBundle:Activity'); + $activityRepository = $this->activityRepository; - return function($value) use ($activityRepository) { - if ($value === '_header') return 'activity reasons'; + return function($value) use ($activityRepository): string { + if ($value === '_header') { + return 'activity reasons'; + } - $activity = $activityRepository - ->find($value); + $activity = $activityRepository->find($value); return implode(", ", array_map(function(ActivityReason $r) { @@ -168,21 +129,25 @@ class ListActivity implements ListInterface }; case 'circle_name' : return function($value) { - if ($value === '_header') return 'circle'; + if ($value === '_header') { + return 'circle'; + } - return $this->translatableStringHelper - ->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true)); }; case 'type_name' : return function($value) { - if ($value === '_header') return 'activity type'; + if ($value === '_header') { + return 'activity type'; + } - return $this->translatableStringHelper - ->localize(json_decode($value, true)); + return $this->translatableStringHelper->localize(json_decode($value, true)); }; default: - return function($value) use ($key) { - if ($value === '_header') return $key; + return static function($value) use ($key) { + if ($value === '_header') { + return $key; + } return $value; }; @@ -209,14 +174,13 @@ class ListActivity implements ListInterface return 'activity'; } - public function initiateQuery(array $requiredModifiers, array $acl, array $data = array()) + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) { $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"); + throw new InvalidArgumentException('Any fields have been checked.'); } $qb = $this->entityManager->createQueryBuilder(); @@ -227,7 +191,6 @@ class ListActivity implements ListInterface ->join('person.center', 'center') ->andWhere('center IN (:authorized_centers)') ->setParameter('authorized_centers', $centers); - ; foreach ($this->fields as $f) { if (in_array($f, $data['fields'])) { @@ -269,8 +232,6 @@ class ListActivity implements ListInterface } } - - return $qb; } @@ -281,7 +242,7 @@ class ListActivity implements ListInterface public function supportsModifiers() { - return array('activity', 'person'); + return ['activity', 'person']; } } diff --git a/src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php b/src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php index 0d48130b6..f22623d9f 100644 --- a/src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php +++ b/src/Bundle/ChillActivityBundle/Export/Export/StatActivityDuration.php @@ -4,12 +4,13 @@ declare(strict_types=1); namespace Chill\ActivityBundle\Export\Export; +use Chill\ActivityBundle\Repository\ActivityRepository; use Chill\MainBundle\Export\ExportInterface; -use Doctrine\ORM\QueryBuilder; +use Chill\MainBundle\Export\FormatterInterface; +use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Security\Core\Role\Role; use Doctrine\ORM\Query; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; -use Doctrine\ORM\EntityManagerInterface; /** * This export allow to compute stats on activity duration. @@ -18,7 +19,7 @@ use Doctrine\ORM\EntityManagerInterface; */ class StatActivityDuration implements ExportInterface { - protected EntityManagerInterface $entityManager; + private ActivityRepository $activityRepository; public const SUM = 'sum'; @@ -30,13 +31,15 @@ class StatActivityDuration implements ExportInterface /** * @param string $action the stat to perform */ - public function __construct(EntityManagerInterface $em, string $action = 'sum') - { - $this->entityManager = $em; + public function __construct( + ActivityRepository $activityRepository, + string $action = 'sum' + ) { $this->action = $action; + $this->activityRepository = $activityRepository; } - public function buildForm(\Symfony\Component\Form\FormBuilderInterface $builder) + public function buildForm(FormBuilderInterface $builder) { } @@ -68,7 +71,7 @@ class StatActivityDuration implements ExportInterface $acl ); - $qb = $this->entityManager->createQueryBuilder(); + $qb = $this->activityRepository->createQueryBuilder('activity'); $select = null; @@ -77,7 +80,6 @@ class StatActivityDuration implements ExportInterface } return $qb->select($select) - ->from('ChillActivityBundle:Activity', 'activity') ->join('activity.person', 'person') ->join('person.center', 'center') ->where($qb->expr()->in('center', ':centers')) @@ -96,7 +98,7 @@ class StatActivityDuration implements ExportInterface public function getAllowedFormattersTypes() { - return array(\Chill\MainBundle\Export\FormatterInterface::TYPE_TABULAR); + return [FormatterInterface::TYPE_TABULAR]; } public function getLabels($key, array $values, $data) diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityReasonFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityReasonFilter.php index 37157af60..f63178077 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityReasonFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityReasonFilter.php @@ -1,25 +1,12 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Filter; +use Chill\ActivityBundle\Repository\ActivityReasonRepository; use Chill\MainBundle\Export\FilterInterface; +use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Bridge\Doctrine\Form\Type\EntityType; @@ -28,41 +15,24 @@ use Chill\MainBundle\Templating\TranslatableStringHelper; use Doctrine\ORM\Query\Expr; use Symfony\Component\Security\Core\Role\Role; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; -use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\Expr\Join; use Symfony\Component\Validator\Context\ExecutionContextInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface; -/** - * - * - * @author Julien Fastré - */ -class ActivityReasonFilter implements FilterInterface, - ExportElementValidatedInterface +class ActivityReasonFilter implements FilterInterface, ExportElementValidatedInterface { - /** - * - * @var TranslatableStringHelper - */ - protected $translatableStringHelper; - - /** - * The repository for activity reasons - * - * @var EntityRepository - */ - protected $reasonRepository; - + protected TranslatableStringHelperInterface $translatableStringHelper; + + protected ActivityReasonRepository $activityReasonRepository; + public function __construct( - TranslatableStringHelper $helper, - EntityRepository $reasonRepository + TranslatableStringHelper $helper, + ActivityReasonRepository $activityReasonRepository ) { $this->translatableStringHelper = $helper; - $this->reasonRepository = $reasonRepository; + $this->activityReasonRepository = $activityReasonRepository; } - - + public function alterQuery(QueryBuilder $qb, $data) { $where = $qb->getDQLPart('where'); @@ -75,12 +45,12 @@ class ActivityReasonFilter implements FilterInterface, && !$this->checkJoinAlreadyDefined($join['activity'], 'reasons') ) - OR + || (! array_key_exists('activity', $join)) ) { $qb->add( - 'join', - array('activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')), + 'join', + array('activity' => new Join(Join::INNER_JOIN, 'activity.reasons', 'reasons')), true ); } @@ -90,25 +60,25 @@ class ActivityReasonFilter implements FilterInterface, } else { $where = $qb->expr()->andX($clause); } - + $qb->add('where', $where); $qb->setParameter('selected_activity_reasons', $data['reasons']); } - + /** * Check if a join between Activity and Reason is already defined - * + * * @param Join[] $joins * @return boolean */ - private function checkJoinAlreadyDefined(array $joins, $alias) + private function checkJoinAlreadyDefined(array $joins, $alias): bool { foreach ($joins as $join) { if ($join->getAlias() === $alias) { return true; } } - + return false; } @@ -119,51 +89,47 @@ class ActivityReasonFilter implements FilterInterface, public function buildForm(FormBuilderInterface $builder) { - //create a local copy of translatableStringHelper - $helper = $this->translatableStringHelper; - - $builder->add('reasons', EntityType::class, array( - 'class' => 'ChillActivityBundle:ActivityReason', - 'choice_label' => function (ActivityReason $reason) use ($helper) { - return $helper->localize($reason->getName()); - }, - 'group_by' => function(ActivityReason $reason) use ($helper) { - return $helper->localize($reason->getCategory()->getName()); - }, + $builder->add('reasons', EntityType::class, [ + 'class' => ActivityReason::class, + 'choice_label' => static fn(ActivityReason $reason) => $this->translatableStringHelper->localize($reason->getName()), + 'group_by' => static fn(ActivityReason $reason) => $this->translatableStringHelper->localize($reason->getCategory()->getName()), 'multiple' => true, 'expanded' => false - )); + ]); } - + public function validateForm($data, ExecutionContextInterface $context) { if ($data['reasons'] === null || count($data['reasons']) === 0) { - $context->buildViolation("At least one reason must be choosen") + $context + ->buildViolation('At least one reason must be chosen') ->addViolation(); } } - public function getTitle() + public function getTitle() { return 'Filter by reason'; } - + public function addRole() { return new Role(ActivityStatsVoter::STATS); } - + public function describeAction($data, $format = 'string') { // collect all the reasons'name used in this filter in one array $reasonsNames = array_map( - function(ActivityReason $r) { - return "\"".$this->translatableStringHelper->localize($r->getName())."\""; - }, - $this->reasonRepository->findBy(array('id' => $data['reasons']->toArray())) - ); - - return array("Filtered by reasons: only %list%", - ["%list%" => implode(", ", $reasonsNames)]); + static fn(ActivityReason $r): string => '"' . $this->translatableStringHelper->localize($r->getName()) . '"', + $this->activityReasonRepository->findBy(array('id' => $data['reasons']->toArray())) + ); + + return [ + 'Filtered by reasons: only %list%', + [ + '%list%' => implode(", ", $reasonsNames), + ] + ]; } } diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php index b3616da10..2d45d32c1 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityTypeFilter.php @@ -1,67 +1,37 @@ - * - * 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 . - */ +declare(strict_types=1); namespace Chill\ActivityBundle\Export\Filter; +use Chill\ActivityBundle\Repository\ActivityTypeRepository; use Chill\MainBundle\Export\FilterInterface; +use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Bridge\Doctrine\Form\Type\EntityType; -use Chill\MainBundle\Templating\TranslatableStringHelper; use Doctrine\ORM\Query\Expr; use Symfony\Component\Security\Core\Role\Role; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; -use Doctrine\ORM\EntityRepository; use Doctrine\ORM\Query\Expr\Join; use Symfony\Component\Validator\Context\ExecutionContextInterface; use Chill\MainBundle\Export\ExportElementValidatedInterface; use Chill\ActivityBundle\Entity\ActivityType; -/** - * - * - */ -class ActivityTypeFilter implements FilterInterface, - ExportElementValidatedInterface +class ActivityTypeFilter implements FilterInterface, ExportElementValidatedInterface { - /** - * - * @var TranslatableStringHelper - */ - protected $translatableStringHelper; - - /** - * The repository for activity reasons - * - * @var EntityRepository - */ - protected $typeRepository; - + protected TranslatableStringHelperInterface $translatableStringHelper; + + protected ActivityTypeRepository $activityTypeRepository; + public function __construct( - TranslatableStringHelper $helper, - EntityRepository $typeRepository + TranslatableStringHelperInterface $translatableStringHelper, + ActivityTypeRepository $activityTypeRepository ) { - $this->translatableStringHelper = $helper; - $this->typeRepository = $typeRepository; + $this->translatableStringHelper = $translatableStringHelper; + $this->activityTypeRepository = $activityTypeRepository; } - - + public function alterQuery(QueryBuilder $qb, $data) { $where = $qb->getDQLPart('where'); @@ -72,14 +42,14 @@ class ActivityTypeFilter implements FilterInterface, } else { $where = $qb->expr()->andX($clause); } - + $qb->add('where', $where); $qb->setParameter('selected_activity_types', $data['types']); } - + /** * Check if a join between Activity and Reason is already defined - * + * * @param Join[] $joins * @return boolean */ @@ -90,7 +60,7 @@ class ActivityTypeFilter implements FilterInterface, return true; } } - + return false; } @@ -101,48 +71,50 @@ class ActivityTypeFilter implements FilterInterface, public function buildForm(FormBuilderInterface $builder) { - //create a local copy of translatableStringHelper - $helper = $this->translatableStringHelper; - - $builder->add('types', EntityType::class, array( - 'class' => ActivityType::class, - 'choice_label' => function (ActivityType $type) use ($helper) { - return $helper->localize($type->getName()); - }, - 'multiple' => true, - 'expanded' => false - )); + $builder->add( + 'types', + EntityType::class, + [ + 'class' => ActivityType::class, + 'choice_label' => static fn(ActivityType $type) => $this->translatableStringHelper->localize($type->getName()), + 'multiple' => true, + 'expanded' => false + ] + ); } - + public function validateForm($data, ExecutionContextInterface $context) { if ($data['types'] === null || count($data['types']) === 0) { - $context->buildViolation("At least one type must be choosen") + $context + ->buildViolation('At least one type must be chosen') ->addViolation(); } } - public function getTitle() + public function getTitle() { return 'Filter by activity type'; } - + public function addRole() { return new Role(ActivityStatsVoter::STATS); } - + public function describeAction($data, $format = 'string') { // collect all the reasons'name used in this filter in one array $reasonsNames = array_map( - function(ActivityType $t) { - return "\"".$this->translatableStringHelper->localize($t->getName())."\""; - }, - $this->typeRepository->findBy(array('id' => $data['types']->toArray())) - ); - - return array("Filtered by activity type: only %list%", - ["%list%" => implode(", ", $reasonsNames)]); + static fn(ActivityType $t): string => '"' . $this->translatableStringHelper->localize($t->getName()) . '"', + $this->activityTypeRepository->findBy(['id' => $data['types']->toArray()]) + ); + + return [ + 'Filtered by activity type: only %list%', + [ + '%list%' => implode(", ", $reasonsNames), + ] + ]; } } diff --git a/src/Bundle/ChillActivityBundle/config/services/export.yaml b/src/Bundle/ChillActivityBundle/config/services/export.yaml index 222e8b5e0..d8aa13098 100644 --- a/src/Bundle/ChillActivityBundle/config/services/export.yaml +++ b/src/Bundle/ChillActivityBundle/config/services/export.yaml @@ -1,82 +1,56 @@ services: + _defaults: + autowire: true + autoconfigure: true + chill.activity.export.count_activity: class: Chill\ActivityBundle\Export\Export\CountActivity - arguments: - - "@doctrine.orm.entity_manager" tags: - { name: chill.export, alias: 'count_activity' } - + chill.activity.export.sum_activity_duration: class: Chill\ActivityBundle\Export\Export\StatActivityDuration - arguments: - - "@doctrine.orm.entity_manager" - - "sum" tags: - { name: chill.export, alias: 'sum_activity_duration' } - + 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: - - "@chill.main.helper.translatable_string" - - "@chill_activity.repository.reason" tags: - { name: chill.export_filter, alias: 'activity_reason_filter' } - + chill.activity.export.type_filter: class: Chill\ActivityBundle\Export\Filter\ActivityTypeFilter - arguments: - - "@chill.main.helper.translatable_string" - - "@chill_activity.repository.activity_type" tags: - { name: chill.export_filter, alias: 'activity_type_filter' } - + chill.activity.export.date_filter: class: Chill\ActivityBundle\Export\Filter\ActivityDateFilter - arguments: - - "@translator" 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" - - "@translator" 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: - - "@chill_activity.repository.reason_category" - - "@chill_activity.repository.reason" - - "@chill.main.helper.translatable_string" tags: - { name: chill.export_aggregator, alias: activity_reason_aggregator } - + chill.activity.export.type_aggregator: class: Chill\ActivityBundle\Export\Aggregator\ActivityTypeAggregator - arguments: - - "@chill_activity.repository.activity_type" - - "@chill.main.helper.translatable_string" tags: - { name: chill.export_aggregator, alias: activity_type_aggregator } - + chill.activity.export.user_aggregator: class: Chill\ActivityBundle\Export\Aggregator\ActivityUserAggregator - arguments: - $em: "@doctrine.orm.entity_manager" tags: - { name: chill.export_aggregator, alias: activity_user_aggregator }