From 9c04212c45733017a6466639362c11a6673238b0 Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Wed, 15 Nov 2023 15:40:36 +0100 Subject: [PATCH] add center filter to calendar exports linked to acp --- .../Export/LinkedToAcp/CountCalendars.php | 20 ++++++++++++- .../LinkedToAcp/StatCalendarAvgDuration.php | 28 ++++++++++++++++++- .../LinkedToAcp/StatCalendarSumDuration.php | 27 +++++++++++++++++- 3 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/CountCalendars.php b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/CountCalendars.php index 669926ef6..fb2065889 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/CountCalendars.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/CountCalendars.php @@ -28,9 +28,14 @@ use Symfony\Component\Validator\Exception\LogicException; class CountCalendars implements ExportInterface, GroupedExportInterface { + private readonly bool $filterStatsByCenters; + public function __construct( private readonly CalendarRepository $calendarRepository, - ) {} + ParameterBagInterface $parameterBag, + ) { + $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } public function buildForm(FormBuilderInterface $builder) { @@ -101,6 +106,19 @@ class CountCalendars implements ExportInterface, GroupedExportInterface $qb->select('COUNT(cal.id) AS export_result'); $qb->leftJoin('cal.accompanyingPeriod', 'acp'); + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.AccompanyingPeriodParticipation::class.' acl_count_part + JOIN '.PersonCenterHistory::class.' acl_count_person_history WITH IDENTITY(acl_count_person_history.person) = IDENTITY(acl_count_part.person) + WHERE acl_count_part.accompanyingPeriod = acp.id AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); return $qb; diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarAvgDuration.php b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarAvgDuration.php index e6d27cee7..9e4107fcc 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarAvgDuration.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarAvgDuration.php @@ -17,14 +17,25 @@ use Chill\MainBundle\Export\AccompanyingCourseExportHelper; use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\FormatterInterface; use Chill\MainBundle\Export\GroupedExportInterface; +use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; +use Chill\PersonBundle\Entity\Person\PersonCenterHistory; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Form\FormBuilderInterface; class StatCalendarAvgDuration implements ExportInterface, GroupedExportInterface { - public function __construct(private readonly CalendarRepository $calendarRepository) {} + private readonly bool $filterStatsByCenters; + + public function __construct( + private readonly CalendarRepository $calendarRepository, + ParameterBagInterface $parameterBag, + + ) { + $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } public function buildForm(FormBuilderInterface $builder): void { @@ -85,11 +96,26 @@ class StatCalendarAvgDuration implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { + $centers = array_map(static fn ($el) => $el['center'], $acl); + $qb = $this->calendarRepository->createQueryBuilder('cal'); $qb->select('AVG(cal.endDate - cal.startDate) AS export_result'); $qb->join('cal.accompanyingPeriod', 'acp'); + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.AccompanyingPeriodParticipation::class.' acl_count_part + JOIN '.PersonCenterHistory::class.' acl_count_person_history WITH IDENTITY(acl_count_person_history.person) = IDENTITY(acl_count_part.person) + WHERE acl_count_part.accompanyingPeriod = acp.id AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); return $qb; diff --git a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarSumDuration.php b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarSumDuration.php index e16d0185c..f9e7a3150 100644 --- a/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarSumDuration.php +++ b/src/Bundle/ChillCalendarBundle/Export/Export/LinkedToAcp/StatCalendarSumDuration.php @@ -17,14 +17,24 @@ use Chill\MainBundle\Export\AccompanyingCourseExportHelper; use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\FormatterInterface; use Chill\MainBundle\Export\GroupedExportInterface; +use Chill\PersonBundle\Entity\AccompanyingPeriodParticipation; +use Chill\PersonBundle\Entity\Person\PersonCenterHistory; use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; use Doctrine\ORM\Query; use Doctrine\ORM\QueryBuilder; +use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Form\FormBuilderInterface; class StatCalendarSumDuration implements ExportInterface, GroupedExportInterface { - public function __construct(private readonly CalendarRepository $calendarRepository) {} + private readonly bool $filterStatsByCenters; + + public function __construct( + private readonly CalendarRepository $calendarRepository, + ParameterBagInterface $parameterBag, + ) { + $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } public function buildForm(FormBuilderInterface $builder): void { @@ -85,11 +95,26 @@ class StatCalendarSumDuration implements ExportInterface, GroupedExportInterface public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder { + $centers = array_map(static fn ($el) => $el['center'], $acl); + $qb = $this->calendarRepository->createQueryBuilder('cal'); $qb->select('SUM(cal.endDate - cal.startDate) AS export_result'); $qb->join('cal.accompanyingPeriod', 'acp'); + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.AccompanyingPeriodParticipation::class.' acl_count_part + JOIN '.PersonCenterHistory::class.' acl_count_person_history WITH IDENTITY(acl_count_person_history.person) = IDENTITY(acl_count_part.person) + WHERE acl_count_part.accompanyingPeriod = acp.id AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); return $qb;