From c9f438319cea64ea0f6f1c32364a3e3c5472dab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 8 Nov 2023 10:21:03 +0100 Subject: [PATCH 01/84] update the description and screenshots for the configuration of calendar and absence synchronization --- .../source/installation/msgraph-configure.rst | 36 +++++++++++------- .../installation/oauth_api_autorisees.png | Bin 152785 -> 170350 bytes 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/docs/source/installation/msgraph-configure.rst b/docs/source/installation/msgraph-configure.rst index 2a0a17882..5655e9ff2 100644 --- a/docs/source/installation/msgraph-configure.rst +++ b/docs/source/installation/msgraph-configure.rst @@ -1,13 +1,15 @@ -Configure Chill for calendar sync and SSO with Microsoft Graph (Outlook) -======================================================================== +Configure Chill for calendar and absence synchronisation and SSO with Microsoft Graph (Outlook) +=============================================================================================== Chill offers the possibility to: * authenticate users using Microsoft Graph, with relatively small adaptations; * synchronize calendar in both ways (`see the user manual for a large description of the feature `_). -Both can be configured separately (synchronising calendars without SSO, or SSO without calendar). When calendar sync is configured without SSL, the user's email address is the key to associate Chill's users with Microsoft's ones. +Both can be configured separately (synchronising calendars without SSO, or SSO without calendar). + +Please note that the user's email address is the key to associate Chill's users with Microsoft's ones. Configure SSO ------------- @@ -46,7 +48,7 @@ Do not forget to provider user's accesses to your app, using the "Utilisateurs e You must know have gathered all the required variables for SSO: -.. code-block:: +.. code-block:: SAML_BASE_URL=https://test.chill.be # must be SAML_ENTITY_ID=https://test.chill.be # must match the one entered @@ -186,20 +188,27 @@ Configure chill app -Configure sync --------------- +Configure sync and calendar access +---------------------------------- -The sync processe might be configured in the same app, or into a different app. +The purpose of this configuration is the following: -The synchronization processes use Oauth2.0 for authentication and authorization. +- let user read their calendar and shared calendar within Chill (with the same permissions as the one configured in Outlook / Azure); +- allow chill instance to write appointment ("Rendez-vous") into their calendar, and invite other users to their appointment; +- allow chill instance to be notified if an appoint is added or removed by the user within another interface than Chill: if the appointment match another one created in the Chill interface, the date and time are updated in Chill; +- allow chill instance to read the absence of the user and, if set, mark the user as absent in Chill; + +The sync processe might be configured in the same app, or into a different app on the Azure side. + +The synchronization processes use Oauth 2.0 / OpenID Connect for authentication and authorization. .. note:: Two flows are in use: - * we authenticate "on behalf of a user", to allow users to see their own calendar or other user's calendar into the web interface. + * we authenticate "on behalf of a user", to allow users to see their own calendar or other user's calendar into the web interface. - Typically, when the page is loaded, Chill first check that an authorization token exists. If not, the user is redirected to Microsoft Azure for authentification and a new token is grabbed (most of the times, this is transparent for users). + Typically, when the page is loaded, Chill first check that an authorization token exists. If not, the user is redirected to Microsoft Azure for authentification and a new token is grabbed (most of the times, this is transparent for users). * Chill also acts "as a machine", to synchronize calendars with a daemon background. @@ -229,8 +238,9 @@ Some explanation: The sync daemon must have write access: * the daemon must be allowed to read all users and their profile, to establish a link between them and the Chill's users: (:code:`Users.Read.All`); -* it must also be allowed to read and write into the calendars (:code:`Calendars.ReadWrite.All`) -* for sending invitation to other users, the permission (:code:`Mail.Send`) must be granted. +* it must also be allowed to read and write into the calendars (:code:`Calendars.ReadWrite.All`); +* for sending invitation to other users, the permission (:code:`Mail.Send`) must be granted; +* and, for reading the absence status of the user and sync it with chill, it must be able to read the mailboxSettings (:code:`MailboxSettings.Read`). At this step, you might choose to accept those permissions for all users, or let them do it by yourself. @@ -301,7 +311,7 @@ The calendar synchronization is processed using symfony messenger. It seems to b The association between chill's users and Microsoft's users is done by this cli command: -.. code-block:: +.. code-block:: bin/console chill:calendar:msgraph-user-map-subscribe diff --git a/docs/source/installation/oauth_api_autorisees.png b/docs/source/installation/oauth_api_autorisees.png index 41222f971fec8ec2ccd707eb32a0392c009c1a3a..ef4136b1000e803b88d2ec7edc76ebdd99762cc7 100644 GIT binary patch literal 170350 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 JWt~$(69677jeP(B literal 152785 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≪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 Date: Thu, 9 Nov 2023 17:11:46 +0100 Subject: [PATCH 02/84] Export: add an ActivityPresenceAggregator --- .../unreleased/Feature-20231109-170655.yaml | 5 ++ .../Aggregator/ActivityPresenceAggregator.php | 72 +++++++++++++++++++ .../ActivityPresenceAggregatorTest.php | 62 ++++++++++++++++ .../config/services/export.yaml | 4 ++ .../translations/messages.fr.yml | 3 + 5 files changed, 146 insertions(+) create mode 100644 .changes/unreleased/Feature-20231109-170655.yaml create mode 100644 src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityPresenceAggregator.php create mode 100644 src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityPresenceAggregatorTest.php diff --git a/.changes/unreleased/Feature-20231109-170655.yaml b/.changes/unreleased/Feature-20231109-170655.yaml new file mode 100644 index 000000000..d4f793607 --- /dev/null +++ b/.changes/unreleased/Feature-20231109-170655.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: 'Export: add an aggregator "group activities by presence"' +time: 2023-11-09T17:06:55.876380883+01:00 +custom: + Issue: "199" diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityPresenceAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityPresenceAggregator.php new file mode 100644 index 000000000..17e16357a --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityPresenceAggregator.php @@ -0,0 +1,72 @@ +activityPresenceRepository->find($value)) { + return ''; + } + + return $this->translatableStringHelper->localize($presence->getName()); + }; + } + + public function getQueryKeys($data) + { + return ['activity_presence_aggregator_attendee']; + } + + public function getTitle(): string + { + return 'export.aggregator.activity.by_activity_presence.Group activity by presence'; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data): void + { + $qb->addSelect('IDENTITY(activity.attendee) AS activity_presence_aggregator_attendee'); + $qb->addGroupBy('activity_presence_aggregator_attendee'); + } + + public function applyOn() + { + return Declarations::ACTIVITY; + } +} diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityPresenceAggregatorTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityPresenceAggregatorTest.php new file mode 100644 index 000000000..ea2bafb0d --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/ActivityPresenceAggregatorTest.php @@ -0,0 +1,62 @@ +translatableStringHelper = self::$container->get(TranslatableStringHelperInterface::class); + $this->activityPresenceRepository = self::$container->get(ActivityPresenceRepositoryInterface::class); + } + + public function getAggregator() + { + return new ActivityPresenceAggregator($this->activityPresenceRepository, $this->translatableStringHelper); + } + + public function getFormData() + { + return [ + [], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(activity.id)') + ->from(Activity::class, 'activity'), + ]; + } +} diff --git a/src/Bundle/ChillActivityBundle/config/services/export.yaml b/src/Bundle/ChillActivityBundle/config/services/export.yaml index 29f7c2625..5b213cbee 100644 --- a/src/Bundle/ChillActivityBundle/config/services/export.yaml +++ b/src/Bundle/ChillActivityBundle/config/services/export.yaml @@ -218,3 +218,7 @@ services: Chill\ActivityBundle\Export\Aggregator\ACPAggregators\ByActivityTypeAggregator: tags: - { name: chill.export_aggregator, alias: acp_by_activity_type_aggregator } + + Chill\ActivityBundle\Export\Aggregator\ActivityPresenceAggregator: + tags: + - { name: chill.export_aggregator, alias: activity_presence_agg } diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index 759d222c1..f1ce1c681 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -421,6 +421,9 @@ export: by_persons: Group activity by persons: Grouper les échanges par usager participant Persons: Usagers participants + by_activity_presence: + Group activity by presence: Grouper les échanges par présence de l'usager + header: Présence de(s) usager(s) generic_doc: filter: From 27012d842dcae5153ee4dfea9827325f36169651 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 9 Nov 2023 17:35:24 +0100 Subject: [PATCH 03/84] Export: add an ActivityPresenceFilter --- .../unreleased/Feature-20231109-173500.yaml | 5 ++ .../Export/Filter/ActivityPresenceFilter.php | 82 +++++++++++++++++++ .../Filter/ActivityPresenceFilterTest.php | 76 +++++++++++++++++ .../config/services/export.yaml | 5 ++ .../translations/messages.fr.yml | 4 + 5 files changed, 172 insertions(+) create mode 100644 .changes/unreleased/Feature-20231109-173500.yaml create mode 100644 src/Bundle/ChillActivityBundle/Export/Filter/ActivityPresenceFilter.php create mode 100644 src/Bundle/ChillActivityBundle/Tests/Export/Filter/ActivityPresenceFilterTest.php diff --git a/.changes/unreleased/Feature-20231109-173500.yaml b/.changes/unreleased/Feature-20231109-173500.yaml new file mode 100644 index 000000000..e356259b4 --- /dev/null +++ b/.changes/unreleased/Feature-20231109-173500.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: 'Export: add a filter "filter activity by activity presence"' +time: 2023-11-09T17:35:00.158055832+01:00 +custom: + Issue: "199" diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityPresenceFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityPresenceFilter.php new file mode 100644 index 000000000..201b9f810 --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityPresenceFilter.php @@ -0,0 +1,82 @@ +add('presences', EntityType::class, [ + 'class' => ActivityPresence::class, + 'choice_label' => fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()) + .($presence->isActive() ? '' : ' ('.$this->translator->trans('inactive').')'), + 'multiple' => true, + 'expanded' => true, + 'label' => 'export.filter.activity.by_presence.presences', + ]); + } + + public function getFormDefaultData(): array + { + return []; + } + + public function describeAction($data, $format = 'string') + { + $presences = array_map( + fn (ActivityPresence $presence) => $this->translatableStringHelper->localize($presence->getName()), + $data['presences'] instanceof Collection ? $data['presences']->toArray() : $data['presences'] + ); + + return [ + 'export.filter.activity.by_presence.Filtered by activity presence: only %presences%', + ['%presences%' => implode(', ', $presences)], + ]; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data) + { + $qb + ->andWhere('activity.attendee IN (:activity_presence_filter_presences)') + ->setParameter('activity_presence_filter_presences', $data['presences']); + } + + public function applyOn() + { + return Declarations::ACTIVITY; + } +} diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ActivityPresenceFilterTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ActivityPresenceFilterTest.php new file mode 100644 index 000000000..6fc3d10d8 --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ActivityPresenceFilterTest.php @@ -0,0 +1,76 @@ +translator = self::$container->get(TranslatorInterface::class); + $this->translatableStringHelper = self::$container->get(TranslatableStringHelperInterface::class); + } + + public function getFilter() + { + return new ActivityPresenceFilter($this->translatableStringHelper, $this->translator); + } + + public function getFormData() + { + self::bootKernel(); + + $presences = self::$container->get(ActivityPresenceRepositoryInterface::class) + ->findAll(); + + return [ + [ + 'presences' => $presences, + ], + [ + 'presences' => new ArrayCollection($presences), + ], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + yield $em->createQueryBuilder() + ->select('count(activity.id)') + ->from(Activity::class, 'activity'); + + self::ensureKernelShutdown(); + } +} diff --git a/src/Bundle/ChillActivityBundle/config/services/export.yaml b/src/Bundle/ChillActivityBundle/config/services/export.yaml index 5b213cbee..ce219b82d 100644 --- a/src/Bundle/ChillActivityBundle/config/services/export.yaml +++ b/src/Bundle/ChillActivityBundle/config/services/export.yaml @@ -135,6 +135,11 @@ services: tags: - { name: chill.export_filter, alias: 'period_having_activity_betw_dates_filter' } + Chill\ActivityBundle\Export\Filter\ActivityPresenceFilter: + tags: + - { name: chill.export_filter, alias: 'activity_presence_filter' } + + ## Aggregators Chill\ActivityBundle\Export\Aggregator\PersonAggregators\ActivityReasonAggregator: tags: diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index f1ce1c681..ed4c1a5f4 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -389,6 +389,10 @@ export: Sent or received: Envoyé ou reçu is sent: envoyé is received: reçu + by_presence: + Filter activity by activity presence: Filtrer les échanges par présence de l'usager + presences: Présences + 'Filtered by activity presence: only %presences%': 'Filtré par présence de l''usager: seulement %presences%' aggregator: acp: From cbc83c0e63eed828d5baed885b3000474f0cb468 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 10 Nov 2023 14:41:58 +0100 Subject: [PATCH 04/84] Export: add grouping "group activity by person" (activites saved in person context) --- .../unreleased/Feature-20231110-144056.yaml | 6 ++ .../PersonAggregators/PersonAggregator.php | 65 +++++++++++++++++++ .../PersonAggregatorTest.php | 57 ++++++++++++++++ .../config/services/export.yaml | 4 ++ .../translations/messages.fr.yml | 4 ++ 5 files changed, 136 insertions(+) create mode 100644 .changes/unreleased/Feature-20231110-144056.yaml create mode 100644 src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/PersonAggregator.php create mode 100644 src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/PersonAggregators/PersonAggregatorTest.php diff --git a/.changes/unreleased/Feature-20231110-144056.yaml b/.changes/unreleased/Feature-20231110-144056.yaml new file mode 100644 index 000000000..f263d14c6 --- /dev/null +++ b/.changes/unreleased/Feature-20231110-144056.yaml @@ -0,0 +1,6 @@ +kind: Feature +body: 'Export: add an aggregator "group activities by person" (only for the activities + saved in a person context)' +time: 2023-11-10T14:40:56.93459414+01:00 +custom: + Issue: "199" diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/PersonAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/PersonAggregator.php new file mode 100644 index 000000000..c7a3bd6b5 --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/PersonAggregator.php @@ -0,0 +1,65 @@ +labelPersonHelper->getLabel($key, $values, 'export.aggregator.person.by_person.person'); + } + + public function getQueryKeys($data) + { + return ['activity_by_person_agg']; + } + + public function getTitle() + { + return 'export.aggregator.person.by_person.title'; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data) + { + $qb + ->addSelect('IDENTITY(activity.person) AS activity_by_person_agg') + ->addGroupBy('activity_by_person_agg'); + } + + public function applyOn() + { + return Declarations::ACTIVITY_PERSON; + } +} diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/PersonAggregators/PersonAggregatorTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/PersonAggregators/PersonAggregatorTest.php new file mode 100644 index 000000000..388f13793 --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Aggregator/PersonAggregators/PersonAggregatorTest.php @@ -0,0 +1,57 @@ +labelPersonHelper = self::$container->get(LabelPersonHelper::class); + } + + public function getAggregator() + { + return new PersonAggregator($this->labelPersonHelper); + } + + public function getFormData() + { + return [[]]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(activity.id)') + ->from(Activity::class, 'activity'), + ]; + } +} diff --git a/src/Bundle/ChillActivityBundle/config/services/export.yaml b/src/Bundle/ChillActivityBundle/config/services/export.yaml index ce219b82d..dcc6bec17 100644 --- a/src/Bundle/ChillActivityBundle/config/services/export.yaml +++ b/src/Bundle/ChillActivityBundle/config/services/export.yaml @@ -227,3 +227,7 @@ services: Chill\ActivityBundle\Export\Aggregator\ActivityPresenceAggregator: tags: - { name: chill.export_aggregator, alias: activity_presence_agg } + + Chill\ActivityBundle\Export\Aggregator\PersonAggregators\PersonAggregator: + tags: + - { name: chill.export_aggregator, alias: activity_person_agg } diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index ed4c1a5f4..52c5366a7 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -395,6 +395,10 @@ export: 'Filtered by activity presence: only %presences%': 'Filtré par présence de l''usager: seulement %presences%' aggregator: + person: + by_person: + title: Grouper les échanges par usager (dossier d'usager dans lequel l'échange est enregistré) + person: Usager acp: by_activity_type: title: Grouper les parcours par type d'échange From 88469dbe8e96ab318065026eb074ea44daa5f837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 14 Nov 2023 18:34:28 +0100 Subject: [PATCH 05/84] Fix serialization of accompangying period work referrers --- .changes/unreleased/Fixed-20231114-183343.yaml | 5 +++++ .../Entity/AccompanyingPeriod/AccompanyingPeriodWork.php | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231114-183343.yaml diff --git a/.changes/unreleased/Fixed-20231114-183343.yaml b/.changes/unreleased/Fixed-20231114-183343.yaml new file mode 100644 index 000000000..f34fe8a22 --- /dev/null +++ b/.changes/unreleased/Fixed-20231114-183343.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Fix loading of accompanying period work referrers ' +time: 2023-11-14T18:33:43.284236146+01:00 +custom: + Issue: "205" diff --git a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php index 8dfb9155a..a35dc3abf 100644 --- a/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Entity/AccompanyingPeriod/AccompanyingPeriodWork.php @@ -392,9 +392,13 @@ class AccompanyingPeriodWork implements AccompanyingPeriodLinkedWithSocialIssues */ public function getReferrers(): ReadableCollection { - return $this->referrersHistory + $users = $this->referrersHistory ->filter(fn (AccompanyingPeriodWorkReferrerHistory $h) => null === $h->getEndDate()) - ->map(fn (AccompanyingPeriodWorkReferrerHistory $h) => $h->getUser()); + ->map(fn (AccompanyingPeriodWorkReferrerHistory $h) => $h->getUser()) + ->getValues() + ; + + return new ArrayCollection(array_values($users)); } public function getReferrersHistory(): Collection From ac9897d9e7e87f3c7aa69f4319fa086c4b9c9d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 14 Nov 2023 20:33:18 +0100 Subject: [PATCH 06/84] DX: add a test to ensure that accompanyingPeriodWork::getReferrers is a list --- .../Entity/AccompanyingPeriod/AccompanyingPeriodWorkTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriod/AccompanyingPeriodWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriod/AccompanyingPeriodWorkTest.php index 45c2ed680..b0e82c99c 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriod/AccompanyingPeriodWorkTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Entity/AccompanyingPeriod/AccompanyingPeriodWorkTest.php @@ -55,6 +55,8 @@ class AccompanyingPeriodWorkTest extends TestCase self::assertNotContains($userA, $work->getReferrers()); self::assertNotContains($userB, $work->getReferrers()); self::assertContains($userC, $work->getReferrers()); + + self::assertTrue(array_is_list($work->getReferrers()->toArray())); } public function testReferrerHistoryOnDifferentDays(): void @@ -92,5 +94,7 @@ class AccompanyingPeriodWorkTest extends TestCase self::assertNotFalse($historyA); self::assertSame($userA, $historyA->getUser()); self::assertEquals((new \DateTimeImmutable())->format('Y-m-d'), $historyA->getEndDate()->format('Y-m-d')); + + self::assertTrue(array_is_list($work->getReferrers()->toArray())); } } From 0d741ab88636e6a3bca45fad8c510c41ea29c055 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 10 Nov 2023 17:17:51 +0100 Subject: [PATCH 07/84] Export: add grouping "group peoples by postal code" --- .../unreleased/Feature-20231110-171720.yaml | 5 + .../PostalCodeAggregator.php | 99 +++++++++++++++++++ .../PostalCodeAggregatorTest.php | 61 ++++++++++++ .../config/services/exports_person.yaml | 4 +- .../translations/messages.fr.yml | 4 + 5 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Feature-20231110-171720.yaml create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/PostalCodeAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/PersonAggregators/PostalCodeAggregatorTest.php diff --git a/.changes/unreleased/Feature-20231110-171720.yaml b/.changes/unreleased/Feature-20231110-171720.yaml new file mode 100644 index 000000000..69135e62c --- /dev/null +++ b/.changes/unreleased/Feature-20231110-171720.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: 'Export: add a new aggregator "group peoples by postal code"' +time: 2023-11-10T17:17:20.236876015+01:00 +custom: + Issue: "199" diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/PostalCodeAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/PostalCodeAggregator.php new file mode 100644 index 000000000..6f8978ad4 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/PersonAggregators/PostalCodeAggregator.php @@ -0,0 +1,99 @@ +add('calc_date', PickRollingDateType::class, [ + 'label' => 'export.aggregator.person.by_postal_code.at_date', + ]); + } + + public function getFormDefaultData(): array + { + return ['calc_date' => new RollingDate(RollingDate::T_TODAY)]; + } + + public function getLabels($key, array $values, mixed $data) + { + return function (null|int|string $value): string { + if ('_header' === $value) { + return 'export.aggregator.person.by_postal_code.header'; + } + + if (null === $value) { + return ''; + } + + return $value; + }; + } + + public function getQueryKeys($data) + { + return [self::PREFIX.'_postal_code_code', self::PREFIX.'_postal_code_label']; + } + + public function getTitle() + { + return 'export.aggregator.person.by_postal_code.title'; + } + + public function addRole(): ?string + { + return null; + } + + public function alterQuery(QueryBuilder $qb, $data) + { + $p = self::PREFIX; + + $qb + ->leftJoin( + 'person.householdAddresses', + "{$p}_household_addresses", + Join::WITH, + "{$p}_household_addresses.validFrom <= :{$p}_calc_date AND ({$p}_household_addresses.validTo IS NULL OR {$p}_household_addresses.validTo > :{$p}_calc_date)" + ) + ->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert($data['calc_date'])) + ->leftJoin("{$p}_household_addresses.address", "{$p}_address") + ->leftJoin("{$p}_address.postcode", "{$p}_postal_code") + ->addSelect("{$p}_postal_code.code AS {$p}_postal_code_code") + ->addSelect("{$p}_postal_code.name AS {$p}_postal_code_label") + ->addGroupBy("{$p}_postal_code_code") + ->addGroupBy("{$p}_postal_code_label") + ; + } + + public function applyOn() + { + return Declarations::PERSON_TYPE; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/PersonAggregators/PostalCodeAggregatorTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/PersonAggregators/PostalCodeAggregatorTest.php new file mode 100644 index 000000000..445f257b8 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/PersonAggregators/PostalCodeAggregatorTest.php @@ -0,0 +1,61 @@ +rollingDateConverter = self::$container->get(RollingDateConverterInterface::class); + } + + public function getAggregator() + { + return new PostalCodeAggregator($this->rollingDateConverter); + } + + public function getFormData() + { + return [ + ['calc_date' => new RollingDate(RollingDate::T_TODAY)], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container + ->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(person.id)') + ->from(Person::class, 'person'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_person.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_person.yaml index 43f5556cf..d25a3b9e6 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_person.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_person.yaml @@ -173,4 +173,6 @@ services: tags: - { name: chill.export_aggregator, alias: person_center_aggregator } - + Chill\PersonBundle\Export\Aggregator\PersonAggregators\PostalCodeAggregator: + tags: + - { name: chill.export_aggregator, alias: person_postal_code_aggregator } diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index f2a90c31f..87c0e3703 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1010,6 +1010,10 @@ export: title: Grouper les usagers par centre at_date: Date de calcul du centre center: Centre de l'usager + by_postal_code: + title: Grouper les usagers par code postal de l'adresse + at_date: Date de calcul de l'adresse + header: Code postal course: by_referrer: From 2cc5fa06ae238cea79777bb29cc45249d7f12d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 10 Nov 2023 18:01:13 +0100 Subject: [PATCH 08/84] Export: split export about person on accompanying period work: one with the people associated with the work, another one with the people associated with the accompanying period --- .../unreleased/Feature-20231110-175928.yaml | 7 + ...rkAssociatePersonOnAccompanyingPeriod.php} | 8 +- ...panyingPeriodWorkAssociatePersonOnWork.php | 139 +++++++ ...rkAssociatePersonOnAccompanyingPeriod.php} | 8 +- ...panyingPeriodWorkAssociatePersonOnWork.php | 348 ++++++++++++++++++ ...sociatePersonOnAccompanyingPeriodTest.php} | 12 +- ...ingPeriodWorkAssociatePersonOnWorkTest.php | 48 +++ ...ssociatePersonOnAccompanyingPeriodTest.php | 103 ++++++ ...ngPeriodWorkAssociatePersonOnWorkTest.php} | 8 +- .../services/exports_social_actions.yaml | 14 +- .../translations/messages.fr.yml | 20 +- 11 files changed, 691 insertions(+), 24 deletions(-) create mode 100644 .changes/unreleased/Feature-20231110-175928.yaml rename src/Bundle/ChillPersonBundle/Export/Export/{CountAccompanyingPeriodWork.php => CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php} (90%) create mode 100644 src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWork.php rename src/Bundle/ChillPersonBundle/Export/Export/{ListAccompanyingPeriodWork.php => ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php} (97%) create mode 100644 src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWork.php rename src/Bundle/ChillPersonBundle/Tests/Export/Export/{CountAccompanyingPeriodWorkTest.php => CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php} (69%) create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWorkTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php rename src/Bundle/ChillPersonBundle/Tests/Export/Export/{ListAccompanyingPeriodWorkTest.php => ListAccompanyingPeriodWorkAssociatePersonOnWorkTest.php} (91%) diff --git a/.changes/unreleased/Feature-20231110-175928.yaml b/.changes/unreleased/Feature-20231110-175928.yaml new file mode 100644 index 000000000..a42e1210d --- /dev/null +++ b/.changes/unreleased/Feature-20231110-175928.yaml @@ -0,0 +1,7 @@ +kind: Feature +body: 'Export: split export about person on accompanying period work: one with the + people associated with the work, another one with the people associated with the + accompanying period' +time: 2023-11-10T17:59:28.388361356+01:00 +custom: + Issue: "200" diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php similarity index 90% rename from src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php rename to src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php index e274ac5cd..a73e4f037 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php @@ -25,7 +25,7 @@ use Doctrine\ORM\QueryBuilder; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Form\FormBuilderInterface; -class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInterface +class CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod implements ExportInterface, GroupedExportInterface { private readonly bool $filterStatsByCenters; @@ -53,7 +53,7 @@ class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInter public function getDescription(): string { - return 'Count social work actions by various parameters'; + return 'export.export.count_accompanying_period_work_associate_person.description'; } public function getGroup(): string @@ -68,7 +68,7 @@ class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInter } $labels = array_combine($values, $values); - $labels['_header'] = $this->getTitle(); + $labels['_header'] = 'export.export.count_accompanying_period_work_associate_person.header'; return static fn ($value) => $labels[$value]; } @@ -85,7 +85,7 @@ class CountAccompanyingPeriodWork implements ExportInterface, GroupedExportInter public function getTitle(): string { - return 'Count social work actions'; + return 'export.export.count_accompanying_period_work_associate_person.title'; } public function getType(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWork.php b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWork.php new file mode 100644 index 000000000..4f43a78b0 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWork.php @@ -0,0 +1,139 @@ +filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder): void + { + // No form necessary? + } + + public function getFormDefaultData(): array + { + return []; + } + + public function getAllowedFormattersTypes(): array + { + return [FormatterInterface::TYPE_TABULAR]; + } + + public function getDescription(): string + { + return 'export.export.count_accompanying_period_work_associate_work.description'; + } + + public function getGroup(): string + { + return 'Exports of social work actions'; + } + + public function getLabels($key, array $values, $data) + { + if ('export_result' !== $key) { + throw new \LogicException("the key {$key} is not used by this export"); + } + + $labels = array_combine($values, $values); + $labels['_header'] = 'export.export.count_accompanying_period_work_associate_work.header'; + + return static fn ($value) => $labels[$value]; + } + + public function getQueryKeys($data): array + { + return ['export_result']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.export.count_accompanying_period_work_associate_work.title'; + } + + public function getType(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->em->createQueryBuilder(); + + $qb + ->from(AccompanyingPeriod\AccompanyingPeriodWork::class, 'acpw') + ->join('acpw.accompanyingPeriod', 'acp') + ->join('acpw.persons', 'person'); + + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person + AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + + $qb->select('COUNT(DISTINCT acpw.id) as export_result'); + + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); + + return $qb; + } + + public function requiredRole(): string + { + return AccompanyingPeriodVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php similarity index 97% rename from src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php rename to src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php index 81c60bae6..49b21ef69 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWork.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod.php @@ -47,7 +47,7 @@ use Doctrine\ORM\QueryBuilder; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Form\FormBuilderInterface; -class ListAccompanyingPeriodWork implements ListInterface, GroupedExportInterface +class ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod implements ListInterface, GroupedExportInterface { private const FIELDS = [ 'id', @@ -121,7 +121,7 @@ class ListAccompanyingPeriodWork implements ListInterface, GroupedExportInterfac public function getDescription(): string { - return 'export.list.acpw.List description'; + return 'export.list.acpw_associate_period.List description'; } public function getGroup(): string @@ -190,12 +190,12 @@ class ListAccompanyingPeriodWork implements ListInterface, GroupedExportInterfac public function getResult($query, $data) { - return dump($query->getQuery()->getResult(AbstractQuery::HYDRATE_SCALAR)); + return $query->getQuery()->getResult(AbstractQuery::HYDRATE_SCALAR); } public function getTitle(): string { - return 'export.list.acpw.List of accompanying period works'; + return 'export.list.acpw_associate_period.List of accompanying period works'; } public function getType(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWork.php b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWork.php new file mode 100644 index 000000000..4e68d5341 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWork.php @@ -0,0 +1,348 @@ +filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder) + { + $builder + ->add('calc_date', PickRollingDateType::class, [ + 'label' => 'export.list.acpw.Date of calculation for associated elements', + 'help' => 'export.list.acpw.help_description', + 'required' => true, + ]); + } + + public function getFormDefaultData(): array + { + return ['calc_date' => new RollingDate(RollingDate::T_TODAY)]; + } + + public function getAllowedFormattersTypes() + { + return [FormatterInterface::TYPE_LIST]; + } + + public function getDescription(): string + { + return 'export.list.acpw_associate_work.List description'; + } + + public function getGroup(): string + { + return 'Exports of social work actions'; + } + + public function getLabels($key, array $values, $data) + { + return match ($key) { + 'startDate', 'endDate', 'createdAt', 'updatedAt' => $this->dateTimeHelper->getLabel('export.list.acpw.'.$key), + 'socialAction' => function ($value) use ($key) { + if ('_header' === $value) { + return 'export.list.acpw.'.$key; + } + + if (null === $value) { + return ''; + } + + return $this->socialActionRender->renderString( + $this->socialActionRepository->find($value), + [] + ); + }, + 'socialIssue' => function ($value) use ($key) { + if ('_header' === $value) { + return 'export.list.acpw.'.$key; + } + + if (null === $value) { + return ''; + } + + return $this->socialIssueRender->renderString( + $this->socialIssueRepository->find($value), + [] + ); + }, + 'createdBy', 'updatedBy', 'acp_user' => $this->userHelper->getLabel($key, $values, 'export.list.acpw.'.$key), + 'referrers' => $this->userHelper->getLabel($key, $values, 'export.list.acpw.'.$key), + // 'acpwReferrers' => $this->userHelper->getLabelMulti($key, $values, 'export.list.acpw.' . $key), + 'personsName' => $this->personHelper->getLabelMulti($key, $values, 'export.list.acpw.'.$key), + 'handlingThierParty' => $this->thirdPartyHelper->getLabel($key, $values, 'export.list.acpw.'.$key), + 'thirdParties' => $this->thirdPartyHelper->getLabelMulti($key, $values, 'export.list.acpw.'.$key), + 'personsId', 'goalsId', 'goalResultsId', 'resultsId', 'evaluationsId' => $this->aggregateStringHelper->getLabelMulti($key, $values, 'export.list.acpw.'.$key), + 'goalsTitle', 'goalResultsTitle', 'resultsTitle', 'evaluationsTitle' => $this->translatableStringExportLabelHelper->getLabelMulti($key, $values, 'export.list.acpw.'.$key), + default => static function ($value) use ($key) { + if ('_header' === $value) { + return 'export.list.acpw.'.$key; + } + + if (null === $value) { + return ''; + } + + return $value; + }, + }; + } + + public function getQueryKeys($data) + { + return self::FIELDS; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(AbstractQuery::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.list.acpw_associate_work.List of accompanying period works'; + } + + public function getType(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->entityManager->createQueryBuilder(); + + $qb + ->from(AccompanyingPeriodWork::class, 'acpw') + ->distinct() + ->select('acpw.id AS id') + ->join('acpw.accompanyingPeriod', 'acp') + ->join('acpw.persons', 'person') + ; + + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person + AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); + + $this->addSelectClauses($qb, $this->rollingDateConverter->convert($data['calc_date'])); + + return $qb; + } + + public function requiredRole(): string + { + return AccompanyingPeriodVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]; + } + + private function addSelectClauses(QueryBuilder $qb, \DateTimeImmutable $calcDate): void + { + // add regular fields + foreach ([ + 'startDate', + 'endDate', + 'note', + 'createdAt', + 'updatedAt', + ] as $field) { + $qb->addSelect(sprintf('acpw.%s AS %s', $field, $field)); + } + + // those with identity + foreach ([ + 'createdBy', + 'updatedBy', + 'handlingThierParty', + ] as $field) { + $qb->addSelect(sprintf('IDENTITY(acpw.%s) AS %s', $field, $field)); + } + + // join socialaction + $qb + ->join('acpw.socialAction', 'sa') + ->addSelect('sa.id AS socialActionId') + ->addSelect('sa.id AS socialAction') + ->addSelect('IDENTITY(sa.issue) AS socialIssue'); + + // join acp + $qb + ->addSelect('acp.id AS acp_id') + ->addSelect('IDENTITY(acp.user) AS acp_user'); + + // persons + $qb + ->addSelect('(SELECT AGGREGATE(person_acpw_member.id) FROM '.Person::class.' person_acpw_member ' + .'WHERE person_acpw_member MEMBER OF acpw.persons) AS personsId') + ->addSelect('(SELECT AGGREGATE(person1_acpw_member.id) FROM '.Person::class.' person1_acpw_member ' + .'WHERE person1_acpw_member MEMBER OF acpw.persons) AS personsName'); + + // referrers => at date XXXX + $qb + ->addSelect('(SELECT JSON_BUILD_OBJECT(\'uid\', IDENTITY(history.user), \'d\', history.startDate) FROM '.UserHistory::class.' history '. + 'WHERE history.accompanyingPeriod = acp AND history.startDate <= :calcDate AND (history.endDate IS NULL OR history.endDate > :calcDate)) AS referrers'); + + /* + // acpwReferrers at date XXX + $qb + ->addSelect('( + SELECT IDENTITY(acpw_ref_history.accompanyingPeriodWork) AS acpw_ref_history_id, + JSON_BUILD_OBJECT(\'uid\', IDENTITY(acpw_ref_history.user), \'d\', acpw_ref_history.startDate) + FROM ' . AccompanyingPeriodWorkReferrerHistory::class . ' acpw_ref_history ' . + 'WHERE acpw_ref_history.accompanyingPeriodWork = acpw AND acpw_ref_history.startDate <= :calcDate AND (acpw_ref_history.endDate IS NULL or acpw_ref_history.endDate > :calcDate) GROUP BY acpw_ref_history_id) AS acpwReferrers' + ); + */ + + // thirdparties + $qb + ->addSelect('(SELECT AGGREGATE(tp.id) FROM '.ThirdParty::class.' tp ' + .'WHERE tp MEMBER OF acpw.thirdParties) AS thirdParties'); + + // goals + $qb + ->addSelect('(SELECT AGGREGATE(IDENTITY(goal.goal)) FROM '.AccompanyingPeriodWorkGoal::class.' goal ' + .'WHERE goal MEMBER OF acpw.goals) AS goalsId') + ->addSelect('(SELECT AGGREGATE(g.title) FROM '.AccompanyingPeriodWorkGoal::class.' goal1 ' + .'LEFT JOIN '.Goal::class.' g WITH goal1.goal = g.id WHERE goal1 MEMBER OF acpw.goals) AS goalsTitle'); + + // goals results + $qb + ->addSelect('(SELECT AGGREGATE(wr.id) FROM '.Result::class.' wr ' + .'JOIN '.AccompanyingPeriodWorkGoal::class.' wg WITH wr MEMBER OF wg.results ' + .'WHERE wg MEMBER OF acpw.goals) AS goalResultsId') + ->addSelect('(SELECT AGGREGATE(wr1.title) FROM '.Result::class.' wr1 ' + .'JOIN '.AccompanyingPeriodWorkGoal::class.' wg1 WITH wr1 MEMBER OF wg1.results ' + .'WHERE wg1 MEMBER OF acpw.goals) AS goalResultsTitle'); + + // results + $qb + ->addSelect('(SELECT AGGREGATE(result.id) FROM '.Result::class.' result ' + .'WHERE result MEMBER OF acpw.results ) AS resultsId ') + ->addSelect('(SELECT AGGREGATE (result1.title) FROM '.Result::class.' result1 ' + .'WHERE result1 MEMBER OF acpw.results ) AS resultsTitle '); + + // evaluations + $qb + ->addSelect('(SELECT AGGREGATE(IDENTITY(we.evaluation)) FROM '.AccompanyingPeriodWorkEvaluation::class.' we ' + .'WHERE we MEMBER OF acpw.accompanyingPeriodWorkEvaluations ) AS evaluationsId ') + ->addSelect('(SELECT AGGREGATE(ev.title) FROM '.AccompanyingPeriodWorkEvaluation::class.' we1 ' + .'LEFT JOIN '.Evaluation::class.' ev WITH we1.evaluation = ev.id ' + .'WHERE we1 MEMBER OF acpw.accompanyingPeriodWorkEvaluations ) AS evaluationsTitle '); + + $qb->setParameter('calcDate', $calcDate); + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php similarity index 69% rename from src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkTest.php rename to src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php index 271f448d6..5caabf351 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php @@ -13,7 +13,7 @@ namespace Export\Export; use Chill\MainBundle\Test\Export\AbstractExportTest; use Chill\PersonBundle\Export\Declarations; -use Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWork; +use Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod; use Doctrine\ORM\EntityManagerInterface; /** @@ -21,23 +21,19 @@ use Doctrine\ORM\EntityManagerInterface; * * @coversNothing */ -final class CountAccompanyingPeriodWorkTest extends AbstractExportTest +final class CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest extends AbstractExportTest { - private CountAccompanyingPeriodWork $export; - protected function setUp(): void { self::bootKernel(); - - $this->export = self::$container->get(CountAccompanyingPeriodWork::class); } public function getExport() { $em = self::$container->get(EntityManagerInterface::class); - yield new CountAccompanyingPeriodWork($em, $this->getParameters(true)); - yield new CountAccompanyingPeriodWork($em, $this->getParameters(false)); + yield new CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod($em, $this->getParameters(true)); + yield new CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod($em, $this->getParameters(false)); } public function getFormData(): array diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWorkTest.php new file mode 100644 index 000000000..6b6e7b7b4 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountAccompanyingPeriodWorkAssociatePersonOnWorkTest.php @@ -0,0 +1,48 @@ +get(EntityManagerInterface::class); + + yield new CountAccompanyingPeriodWorkAssociatePersonOnWork($em, $this->getParameters(true)); + yield new CountAccompanyingPeriodWorkAssociatePersonOnwork($em, $this->getParameters(false)); + } + + public function getFormData(): array + { + return [[]]; + } + + public function getModifiersCombination() + { + return [[Declarations::SOCIAL_WORK_ACTION_TYPE]]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php new file mode 100644 index 000000000..aacd1bf55 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriodTest.php @@ -0,0 +1,103 @@ +get(EntityManagerInterface::class); + $dateTimeHelper = self::$container->get(DateTimeHelper::class); + $userHelper = self::$container->get(UserHelper::class); + $personHelper = self::$container->get(LabelPersonHelper::class); + $thirdPartyHelper = self::$container->get(LabelThirdPartyHelper::class); + $translatableStringExportLabelHelper = self::$container->get(TranslatableStringExportLabelHelper::class); + $socialIssueRender = self::$container->get(SocialIssueRender::class); + $socialIssueRepository = self::$container->get(SocialIssueRepository::class); + $socialActionRender = self::$container->get(SocialActionRender::class); + $rollingDateConverter = self::$container->get(RollingDateConverterInterface::class); + $aggregateStringHelper = self::$container->get(AggregateStringHelper::class); + $socialActionRepository = self::$container->get(SocialActionRepository::class); + + yield new ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod( + $entityManager, + $dateTimeHelper, + $userHelper, + $personHelper, + $thirdPartyHelper, + $translatableStringExportLabelHelper, + $socialIssueRender, + $socialIssueRepository, + $socialActionRender, + $rollingDateConverter, + $aggregateStringHelper, + $socialActionRepository, + $this->getParameters(true), + ); + + yield new ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod( + $entityManager, + $dateTimeHelper, + $userHelper, + $personHelper, + $thirdPartyHelper, + $translatableStringExportLabelHelper, + $socialIssueRender, + $socialIssueRepository, + $socialActionRender, + $rollingDateConverter, + $aggregateStringHelper, + $socialActionRepository, + $this->getParameters(false), + ); + } + + public function getFormData() + { + return [ + ['calc_date' => new RollingDate(RollingDate::T_TODAY)], + ]; + } + + public function getModifiersCombination() + { + return [[Declarations::ACP_TYPE]]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWorkTest.php similarity index 91% rename from src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkTest.php rename to src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWorkTest.php index ab8ca7c38..2f65ac85b 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/ListAccompanyingPeriodWorkAssociatePersonOnWorkTest.php @@ -19,7 +19,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Test\Export\AbstractExportTest; use Chill\PersonBundle\Export\Declarations; -use Chill\PersonBundle\Export\Export\ListAccompanyingPeriodWork; +use Chill\PersonBundle\Export\Export\ListAccompanyingPeriodWorkAssociatePersonOnWork; use Chill\PersonBundle\Export\Helper\LabelPersonHelper; use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository; use Chill\PersonBundle\Repository\SocialWork\SocialIssueRepository; @@ -33,7 +33,7 @@ use Doctrine\ORM\EntityManagerInterface; * * @coversNothing */ -class ListAccompanyingPeriodWorkTest extends AbstractExportTest +class ListAccompanyingPeriodWorkAssociatePersonOnWorkTest extends AbstractExportTest { protected function setUp(): void { @@ -56,7 +56,7 @@ class ListAccompanyingPeriodWorkTest extends AbstractExportTest $aggregateStringHelper = self::$container->get(AggregateStringHelper::class); $socialActionRepository = self::$container->get(SocialActionRepository::class); - yield new ListAccompanyingPeriodWork( + yield new ListAccompanyingPeriodWorkAssociatePersonOnWork( $entityManager, $dateTimeHelper, $userHelper, @@ -72,7 +72,7 @@ class ListAccompanyingPeriodWorkTest extends AbstractExportTest $this->getParameters(true), ); - yield new ListAccompanyingPeriodWork( + yield new ListAccompanyingPeriodWorkAssociatePersonOnWork( $entityManager, $dateTimeHelper, $userHelper, diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml index 57be6bf40..f813455d8 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml @@ -4,14 +4,24 @@ services: autoconfigure: true ## Indicators - Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWork: + Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod: tags: + # the name is not matching the class name: it is kept for backward compatibility - { name: chill.export, alias: count_social_work_actions } - Chill\PersonBundle\Export\Export\ListAccompanyingPeriodWork: + Chill\PersonBundle\Export\Export\CountAccompanyingPeriodWorkAssociatePersonOnWork: tags: + - { name: chill.export, alias: count_social_work_actions_associate_person_work } + + Chill\PersonBundle\Export\Export\ListAccompanyingPeriodWorkAssociatePersonOnAccompanyingPeriod: + tags: + # the name is not matching the class name: it is kept for backward compatibility - { name: chill.export, alias: list_social_work_actions } + Chill\PersonBundle\Export\Export\ListAccompanyingPeriodWorkAssociatePersonOnWork: + tags: + - { name: chill.export, alias: list_social_work_actions_associate_person_work } + ## FILTERS chill.person.export.filter_social_work_type: class: Chill\PersonBundle\Export\Filter\SocialWorkFilters\SocialWorkTypeFilter diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 87c0e3703..ceebe7d1b 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -379,8 +379,6 @@ Create an average of accompanying courses duration of each person participation Closingdate to apply: Date de fin à prendre en compte lorsque le parcours n'est pas clotûré Exports of social work actions: Exports des actions d'accompagnement -Count social work actions: Nombre d'actions -Count social work actions by various parameters: Compte le nombre d'actions d'accompagnement en fonction de différents filtres. Exports of evaluations: Exports des évaluations @@ -1000,6 +998,16 @@ export: Count household with accompanying course by various parameters.: Compte le nombre de ménages impliqués dans un parcours selon différents filtres. Date of calculation of household members: Date à laquelle les membres du ménages sont comptabilisés + count_accompanying_period_work_associate_person: + title: Nombre d'actions, filtres et regroupements sur les usagers du parcours + description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par le parcours de l'action. + header: Nombre d'actions + + count_accompanying_period_work_associate_work: + title: Nombre d'actions, filtres et regroupements sur les usagers de l'action + description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. + header: Nombre d'actions + aggregator: person: by_household_composition: @@ -1272,6 +1280,14 @@ export: updatedBy: Modifié par timeSpent: Temps de rédaction (minutes) + acpw_associate_work: + List of accompanying period works: Liste des actions, filtres sur les usagers de l'action + List description: Compte le nombre d'actions d'accompagnement avec des filtres possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. + + acpw_associate_period: + List of accompanying period works: Liste des actions, filtres sur les usagers du parcours + List description: Génère une liste des actions d'accompagnement, avec des filtres possibles sur les usagers, les parcours et les actions. Les filtres des usagers agissent sur les usagers concernés par le parcours de l'action. + acpw: List of accompanying period works: Liste des actions List description: Génère une liste des actions d'accompagnement, filtrée sur différents paramètres. From 847c8238e8de5b6d3e2f3991aaf5ba9851ac4bcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 13 Nov 2023 12:09:18 +0100 Subject: [PATCH 09/84] Export: fix typo in filter "filter accompanying period work on end date --- .changes/unreleased/Fixed-20231113-120855.yaml | 5 +++++ .../AccompanyingPeriodWorkEndDateBetweenDateFilter.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Fixed-20231113-120855.yaml diff --git a/.changes/unreleased/Fixed-20231113-120855.yaml b/.changes/unreleased/Fixed-20231113-120855.yaml new file mode 100644 index 000000000..6a2003d3d --- /dev/null +++ b/.changes/unreleased/Fixed-20231113-120855.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix typo in filter "filter accompanying period work on end date"' +time: 2023-11-13T12:08:55.509927824+01:00 +custom: + Issue: "" diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/AccompanyingPeriodWorkEndDateBetweenDateFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/AccompanyingPeriodWorkEndDateBetweenDateFilter.php index 373572e54..32bbbaf6e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/AccompanyingPeriodWorkEndDateBetweenDateFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/AccompanyingPeriodWorkEndDateBetweenDateFilter.php @@ -54,7 +54,7 @@ final readonly class AccompanyingPeriodWorkEndDateBetweenDateFilter implements F public function describeAction($data, $format = 'string'): array { return [ - 'export.filter.work.end_between_dates.Only where end date is between %endDate% and %endDate%', + 'export.filter.work.end_between_dates.Only where start date is between %startDate% and %endDate%', [ '%startDate%' => null !== $data['start_date'] ? $this->rollingDateConverter->convert($data['start_date'])->format('d-m-Y') : '', '%endDate%' => null !== $data['end_date'] ? $this->rollingDateConverter->convert($data['end_date'])->format('d-m-Y') : '', From d01b6db5dc98367e69511e0597faf44bdc9207c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 13 Nov 2023 12:09:43 +0100 Subject: [PATCH 10/84] DX: remove unused property --- .../HouseholdAggregators/ChildrenNumberAggregator.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php index b73b2e600..cea3de7dd 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php @@ -19,11 +19,10 @@ use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Contracts\Translation\TranslatorInterface; class ChildrenNumberAggregator implements AggregatorInterface { - public function __construct(private readonly TranslatorInterface $translator, private readonly RollingDateConverterInterface $rollingDateConverter) {} + public function __construct(private readonly RollingDateConverterInterface $rollingDateConverter) {} public function addRole(): ?string { From 1663c6f7c7a42977cb872ef201bdf3ecb48cd4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 13 Nov 2023 12:56:59 +0100 Subject: [PATCH 11/84] DX: rename CountHousehold => CountHouseholdInPeriod.php + add test --- ...usehold.php => CountHouseholdInPeriod.php} | 4 +- .../Export/CountHouseholdInPeriodTest.php | 58 +++++++++++++++++++ .../config/services/exports_household.yaml | 16 ++--- 3 files changed, 64 insertions(+), 14 deletions(-) rename src/Bundle/ChillPersonBundle/Export/Export/{CountHousehold.php => CountHouseholdInPeriod.php} (95%) create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/CountHouseholdInPeriodTest.php diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php b/src/Bundle/ChillPersonBundle/Export/Export/CountHouseholdInPeriod.php similarity index 95% rename from src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php rename to src/Bundle/ChillPersonBundle/Export/Export/CountHouseholdInPeriod.php index 82a5c4aa4..8b56be371 100644 --- a/src/Bundle/ChillPersonBundle/Export/Export/CountHousehold.php +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountHouseholdInPeriod.php @@ -26,7 +26,7 @@ use Doctrine\ORM\Query; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; use Symfony\Component\Form\FormBuilderInterface; -class CountHousehold implements ExportInterface, GroupedExportInterface +class CountHouseholdInPeriod implements ExportInterface, GroupedExportInterface { private const TR_PREFIX = 'export.export.nb_household_with_course.'; private readonly bool $filterStatsByCenters; @@ -120,6 +120,7 @@ class CountHousehold implements ExportInterface, GroupedExportInterface ->join('person.accompanyingPeriodParticipations', 'acppart') ->join('acppart.accompanyingPeriod', 'acp') ->andWhere('acppart.startDate != acppart.endDate OR acppart.endDate IS NULL') + ->andWhere('hmember.startDate <= :count_household_at_date AND (hmember.endDate IS NULL OR hmember.endDate > :count_household_at_date)') ->setParameter('count_household_at_date', $this->rollingDateConverter->convert($data['calc_date'])); $qb @@ -135,7 +136,6 @@ class CountHousehold implements ExportInterface, GroupedExportInterface ' ) ) - ->andWhere('hmember.startDate <= :count_household_at_date AND (hmember.endDate IS NULL OR hmember.endDate > :count_household_at_date)') ->setParameter('authorized_centers', $centers); } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountHouseholdInPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountHouseholdInPeriodTest.php new file mode 100644 index 000000000..b29c9a1f9 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountHouseholdInPeriodTest.php @@ -0,0 +1,58 @@ +get(EntityManagerInterface::class); + $rollingDate = self::$container->get(RollingDateConverterInterface::class); + + yield new CountHouseholdInPeriod($em, $rollingDate, $this->getParameters(true)); + yield new CountHouseholdInPeriod($em, $rollingDate, $this->getParameters(false)); + } + + public function getFormData() + { + return [ + ['calc_date' => new RollingDate(RollingDate::T_TODAY)], + ]; + } + + public function getModifiersCombination() + { + return [ + [ + Declarations::HOUSEHOLD_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]]; + } +} diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_household.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_household.yaml index 1a12c1bc8..15386c2cd 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_household.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_household.yaml @@ -1,38 +1,30 @@ services: + _defaults: + autoconfigure: true + autowire: true ## Indicators - chill.person.export.count_household: - class: Chill\PersonBundle\Export\Export\CountHousehold - autowire: true - autoconfigure: true + Chill\PersonBundle\Export\Export\CountHouseholdInPeriod: tags: - { name: chill.export, alias: count_household } Chill\PersonBundle\Export\Export\ListHouseholdInPeriod: - autowire: true - autoconfigure: true tags: - { name: chill.export, alias: list_household_in_period } ## Filters chill.person.export.filter_household_composition: class: Chill\PersonBundle\Export\Filter\HouseholdFilters\CompositionFilter - autowire: true - autoconfigure: true tags: - { name: chill.export_filter, alias: household_composition_filter } ## Aggregators chill.person.export.aggregator_household_composition: class: Chill\PersonBundle\Export\Aggregator\HouseholdAggregators\CompositionAggregator - autowire: true - autoconfigure: true tags: - { name: chill.export_aggregator, alias: household_composition_aggregator } chill.person.export.aggregator_household_childrennumber: class: Chill\PersonBundle\Export\Aggregator\HouseholdAggregators\ChildrenNumberAggregator - autowire: true - autoconfigure: true tags: - { name: chill.export_aggregator, alias: household_childrennumber_aggregator } From 2e60ba31375c563dfd2db43d55490142c1c4b653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 13 Nov 2023 15:27:07 +0100 Subject: [PATCH 12/84] Export: fix infinite loop in HouseholdVoter --- .changes/unreleased/Fixed-20231113-152621.yaml | 5 +++++ .../Security/Authorization/HouseholdVoter.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Fixed-20231113-152621.yaml diff --git a/.changes/unreleased/Fixed-20231113-152621.yaml b/.changes/unreleased/Fixed-20231113-152621.yaml new file mode 100644 index 000000000..e897fec30 --- /dev/null +++ b/.changes/unreleased/Fixed-20231113-152621.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: Fix failure in export linked to household' +time: 2023-11-13T15:26:21.891117274+01:00 +custom: + Issue: "189" diff --git a/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php b/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php index 798ed853a..415154457 100644 --- a/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php +++ b/src/Bundle/ChillPersonBundle/Security/Authorization/HouseholdVoter.php @@ -78,7 +78,7 @@ class HouseholdVoter extends Voter implements ProvideRoleHierarchyInterface, Chi return match ($attribute) { self::SEE => $this->checkAssociatedMembersRole($subject, PersonVoter::SEE), self::EDIT => $this->checkAssociatedMembersRole($subject, PersonVoter::UPDATE), - self::STATS => $this->voteOnAttribute($attribute, $subject, $token), + self::STATS => $this->helper->voteOnAttribute($attribute, $subject, $token), default => throw new \UnexpectedValueException('attribute not supported'), }; } From 86e659edd44b735cf090df7e01919c08b04ef1b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 13 Nov 2023 15:28:29 +0100 Subject: [PATCH 13/84] DX: replace some string by constants --- .../ChillMainBundle/Controller/ExportController.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Controller/ExportController.php b/src/Bundle/ChillMainBundle/Controller/ExportController.php index 190d5f1bf..d318fcc58 100644 --- a/src/Bundle/ChillMainBundle/Controller/ExportController.php +++ b/src/Bundle/ChillMainBundle/Controller/ExportController.php @@ -304,7 +304,7 @@ class ExportController extends AbstractController FormType::class, $defaultFormData, [ - 'method' => $isGenerate ? 'GET' : 'POST', + 'method' => $isGenerate ? Request::METHOD_GET : Request::METHOD_POST, 'csrf_protection' => !$isGenerate, ] ); @@ -352,7 +352,7 @@ class ExportController extends AbstractController $form = $this->createCreateFormExport($alias, 'export', $data, $savedExport); - if ('POST' === $request->getMethod()) { + if (Request::METHOD_POST === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { @@ -406,7 +406,7 @@ class ExportController extends AbstractController $form = $this->createCreateFormExport($alias, 'formatter', $data, $savedExport); - if ('POST' === $request->getMethod()) { + if (Request::METHOD_POST === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { @@ -536,7 +536,7 @@ class ExportController extends AbstractController $form = $this->createCreateFormExport($alias, 'centers', [], $savedExport); - if ('POST' === $request->getMethod()) { + if (Request::METHOD_POST === $request->getMethod()) { $form->handleRequest($request); if ($form->isValid()) { From 3743b336a6f8aa90697500bc490cdfd17651183b Mon Sep 17 00:00:00 2001 From: LenaertsJ Date: Wed, 15 Nov 2023 11:42:34 +0000 Subject: [PATCH 14/84] Export: create an export which add the average duration of accompanying period work --- .../unreleased/Feature-20231114-143611.yaml | 5 + ...rkPersonAssociatedOnAccompanyingPeriod.php | 131 ++++++++++++++++++ ...vgDurationAPWorkPersonAssociatedOnWork.php | 130 +++++++++++++++++ ...rsonAssociatedOnAccompanyingPeriodTest.php | 53 +++++++ ...rationAPWorkPersonAssociatedOnWorkTest.php | 53 +++++++ .../services/exports_social_actions.yaml | 8 ++ .../translations/messages.fr.yml | 15 +- 7 files changed, 394 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Feature-20231114-143611.yaml create mode 100644 src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnWork.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriodTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnWorkTest.php diff --git a/.changes/unreleased/Feature-20231114-143611.yaml b/.changes/unreleased/Feature-20231114-143611.yaml new file mode 100644 index 000000000..1da6fd5c8 --- /dev/null +++ b/.changes/unreleased/Feature-20231114-143611.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: Create export for the average duration of social work actions +time: 2023-11-14T14:36:11.797238275+01:00 +custom: + Issue: "202" diff --git a/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod.php b/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod.php new file mode 100644 index 000000000..ad3f8f745 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod.php @@ -0,0 +1,131 @@ +filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder) {} + + public function getFormDefaultData(): array + { + return []; + } + + public function getAllowedFormattersTypes(): array + { + return [FormatterInterface::TYPE_TABULAR]; + } + + public function getDescription(): string + { + return 'export.export.avg_duration_acpw_associate_on_period.description'; + } + + public function getGroup(): string + { + return 'Exports of social work actions'; + } + + public function getLabels($key, array $values, $data) + { + if ('export_result' !== $key) { + throw new \LogicException("the key {$key} is not used by this export"); + } + + return static fn ($value) => '_header' === $value ? 'export.export.avg_duration_acpw_associate_on_period.header' : $value; + } + + public function getQueryKeys($data): array + { + return ['export_result']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.export.avg_duration_acpw_associate_on_period.title'; + } + + public function getType(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->accompanyingPeriodWorkRepository->createQueryBuilder('acpw'); + + $qb + ->join('acpw.accompanyingPeriod', 'acp') + ->join('acp.participations', 'acppart') + ->join('acppart.person', 'person'); + + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person + AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + + $qb->select('AVG(DATE_DIFF(COALESCE(acpw.endDate, CURRENT_DATE()), acpw.startDate)) AS export_result'); + + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); + + return $qb; + } + + public function requiredRole(): string + { + return AccompanyingPeriodVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnWork.php b/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnWork.php new file mode 100644 index 000000000..8d34837ae --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Export/AvgDurationAPWorkPersonAssociatedOnWork.php @@ -0,0 +1,130 @@ +filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder) {} + + public function getFormDefaultData(): array + { + return []; + } + + public function getAllowedFormattersTypes(): array + { + return [FormatterInterface::TYPE_TABULAR]; + } + + public function getDescription(): string + { + return 'export.export.avg_duration_acpw_associate_on_work.description'; + } + + public function getGroup(): string + { + return 'Exports of social work actions'; + } + + public function getLabels($key, array $values, $data) + { + if ('export_result' !== $key) { + throw new \LogicException("the key {$key} is not used by this export"); + } + + return static fn ($value) => '_header' === $value ? 'export.export.avg_duration_acpw_associate_on_work.header' : $value; + } + + public function getQueryKeys($data): array + { + return ['export_result']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.export.avg_duration_acpw_associate_on_work.title'; + } + + public function getType(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->accompanyingPeriodWorkRepository->createQueryBuilder('acpw'); + + $qb + ->join('acpw.accompanyingPeriod', 'acp') + ->join('acpw.persons', 'person'); + + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person + AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + + $qb->select('AVG(DATE_DIFF(COALESCE(acpw.endDate, CURRENT_DATE()), acpw.startDate)) AS export_result'); + + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); + + return $qb; + } + + public function requiredRole(): string + { + return AccompanyingPeriodVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriodTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriodTest.php new file mode 100644 index 000000000..bd1bbdfd4 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriodTest.php @@ -0,0 +1,53 @@ +get(AccompanyingPeriodWorkRepository::class); + + yield new AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod($this->getParameters(true), $repository); + yield new AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod($this->getParameters(false), $repository); + } + + public function getFormData() + { + return []; + } + + public function getModifiersCombination() + { + return [ + [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnWorkTest.php new file mode 100644 index 000000000..647026f8a --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/AvgDurationAPWorkPersonAssociatedOnWorkTest.php @@ -0,0 +1,53 @@ +get(AccompanyingPeriodWorkRepository::class); + + yield new AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod($this->getParameters(true), $repository); + yield new AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod($this->getParameters(false), $repository); + } + + public function getFormData() + { + return []; + } + + public function getModifiersCombination() + { + return [ + [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]]; + } +} diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml index f813455d8..3e6f12fe1 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml @@ -22,6 +22,14 @@ services: tags: - { name: chill.export, alias: list_social_work_actions_associate_person_work } + Chill\PersonBundle\Export\Export\AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod: + tags: + - { name: chill.export, alias: avg_duration_social_work_actions_person_associated_on_period } + + Chill\PersonBundle\Export\Export\AvgDurationAPWorkPersonAssociatedOnWork: + tags: + - { name: chill.export, alias: avg_duration_social_work_actions_person_associated_on_work } + ## FILTERS chill.person.export.filter_social_work_type: class: Chill\PersonBundle\Export\Filter\SocialWorkFilters\SocialWorkTypeFilter diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index ceebe7d1b..71b428920 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -379,7 +379,10 @@ Create an average of accompanying courses duration of each person participation Closingdate to apply: Date de fin à prendre en compte lorsque le parcours n'est pas clotûré Exports of social work actions: Exports des actions d'accompagnement - +Count social work actions: Nombre d'actions +Count social work actions by various parameters: Compte le nombre d'actions d'accompagnement en fonction de différents filtres. +Average duration of social work actions: Durée moyenne des actions +Calculate the average duration of social work actions: Moyenne de la durée des actions. Exports of evaluations: Exports des évaluations Count evaluations: Nombre d'évaluations @@ -1008,6 +1011,16 @@ export: description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. header: Nombre d'actions + avg_duration_acpw_associate_on_period: + title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers du parcours + header: Durée moyenne des actions d'accompagnements + description: Calcule la moyenne durée des actions d'accompagnements avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par le parcours de l'action. + + avg_duration_acpw_associate_on_work: + title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers de l'action + header: Durée moyenne des actions d'accompagnements + description: Calcule la moyenne durée des actions d'accompagnements avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. + aggregator: person: by_household_composition: From 694477386824e6999bb3572f51a65bc90b63bc05 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Mon, 13 Nov 2023 17:53:02 +0100 Subject: [PATCH 15/84] create 6 new filters/aggr files --- .../CreatorAggregator.php | 69 ++++++++++++++ .../CreatorJobAggregator.php | 69 ++++++++++++++ .../CreatorScopeAggregator.php | 69 ++++++++++++++ .../SocialWorkFilters/CreatorFilter.php | 85 +++++++++++++++++ .../SocialWorkFilters/CreatorJobFilter.php | 91 +++++++++++++++++++ .../SocialWorkFilters/CreatorScopeFilter.php | 91 +++++++++++++++++++ .../services/exports_social_actions.yaml | 25 +++++ .../translations/messages.fr.yml | 17 ++++ 8 files changed, 516 insertions(+) create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php create mode 100644 src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php new file mode 100644 index 000000000..afe416f9f --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php @@ -0,0 +1,69 @@ +add(); + } + + public function getFormDefaultData(): array + { + return []; + } + + public function getLabels($key, array $values, mixed $data) + { + return function ($value): string { + + }; + } + + public function getQueryKeys($data): array + { + return []; + } + + public function getTitle(): string + { + return 'export.aggregator.course_work.by_creator.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php new file mode 100644 index 000000000..ea53c4f80 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php @@ -0,0 +1,69 @@ +add(); + } + + public function getFormDefaultData(): array + { + return []; + } + + public function getLabels($key, array $values, mixed $data) + { + return function ($value): string { + + }; + } + + public function getQueryKeys($data): array + { + return []; + } + + public function getTitle(): string + { + return 'export.aggregator.course_work.by_creator_job.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php new file mode 100644 index 000000000..e8eab62d4 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php @@ -0,0 +1,69 @@ +add(); + } + + public function getFormDefaultData(): array + { + return []; + } + + public function getLabels($key, array $values, mixed $data) + { + return function ($value): string { + + }; + } + + public function getQueryKeys($data): array + { + return []; + } + + public function getTitle(): string + { + return 'export.aggregator.course_work.by_creator_scope.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php new file mode 100644 index 000000000..791b521af --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php @@ -0,0 +1,85 @@ +join('acpw.createdBy', "{$p}_creator") + ->andWhere($qb->expr()->in("{$p}_creator", ":{$p}_creators")) + ->setParameter("{$p}_creators", $data['creators']) + //->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert( + // $data['creator_at'] ?? new RollingDate(RollingDate::T_TODAY) + //)) + ; + + } + + public function applyOn(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function buildForm(FormBuilderInterface $builder) + { + $builder + ->add('creators', PickUserDynamicType::class, [ + 'multiple' => true, + 'label' => 'export.filter.work.by_creator.Creators', + ]) + //->add('creator_at', PickRollingDateType::class, [ + // 'label' => 'export.filter.work.by_creator.Calc date', + // 'help' => 'export.filter.work.by_creator.calc_date_help', + //]) + ; + } + + public function describeAction($data, $format = 'string'): array + { + return []; + } + + public function getFormDefaultData(): array + { + return [ + 'creators' => [], + //'creator_at' => new RollingDate(RollingDate::T_TODAY), + ]; + } + + public function getTitle(): string + { + return 'export.filter.work.by_creator.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php new file mode 100644 index 000000000..28d31920d --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php @@ -0,0 +1,91 @@ +setParameter("{$p}_jobs", $data['jobs']) + ; + + } + + public function applyOn(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function buildForm(FormBuilderInterface $builder) + { + $builder + ->add('jobs', EntityType::class, [ + 'class' => UserJob::class, + 'choices' => $this->userJobRepository->findAllActive(), + 'multiple' => true, + 'expanded' => true, + 'choice_label' => fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()), + 'label' => 'Job', + ]); + } + + public function describeAction($data, $format = 'string'): array + { + $creatorJobs = []; + + foreach ($data['jobs'] as $j) { + $creatorJobs[] = $this->translatableStringHelper->localize( + $j->getLabel() + ); + } + + return ['export.filter.work.by_creator_job.Filtered by creator job: only %jobs%', [ + '%jobs%' => implode(', ', $creatorJobs), + ]]; + } + + public function getFormDefaultData(): array + { + return [ + 'jobs' => [], + ]; + } + + public function getTitle(): string + { + return 'export.filter.work.by_creator_job.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php new file mode 100644 index 000000000..f21bf320e --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php @@ -0,0 +1,91 @@ +setParameter("{$p}_scopes", $data['scopes']) + ; + + } + + public function applyOn(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function buildForm(FormBuilderInterface $builder) + { + $builder + ->add('scopes', EntityType::class, [ + 'class' => Scope::class, + 'choices' => $this->scopeRepository->findAllActive(), + 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()), + 'multiple' => true, + 'expanded' => true, + 'label' => 'Scope', + ]); + } + + public function describeAction($data, $format = 'string'): array + { + $creatorScopes = []; + + foreach ($data['scopes'] as $s) { + $creatorScopes[] = $this->translatableStringHelper->localize( + $s->getName() + ); + } + + return ['export.filter.work.by_creator_scope.Filtered by creator scope: only %scopes%', [ + '%scopes%' => implode(', ', $creatorScopes), + ]]; + } + + public function getFormDefaultData(): array + { + return [ + 'scopes' => [], + ]; + } + + public function getTitle(): string + { + return 'export.filter.work.by_creator_scope.title'; + } +} diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml index 3e6f12fe1..7bdf0345b 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml @@ -63,6 +63,19 @@ services: tags: - { name: chill.export_filter, alias: social_work_actions_end_btw_dates_filter } + Chill\PersonBundle\Export\Filter\SocialWorkFilters\CreatorFilter: + tags: + - { name: chill.export_filter, alias: social_work_actions_creator_filter } + + Chill\PersonBundle\Export\Filter\SocialWorkFilters\CreatorJobFilter: + tags: + - { name: chill.export_filter, alias: social_work_actions_creator_job_filter } + + Chill\PersonBundle\Export\Filter\SocialWorkFilters\CreatorScopeFilter: + tags: + - { name: chill.export_filter, alias: social_work_actions_creator_scope_filter } + + ## AGGREGATORS chill.person.export.aggregator_action_type: class: Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\ActionTypeAggregator @@ -105,6 +118,18 @@ services: Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\HandlingThirdPartyAggregator: tags: - { name: chill.export_aggregator, alias: accompanyingcourse_handling3party_aggregator } +# +# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorAggregator: +# tags: +# - { name: chill.export_aggregator, alias: social_work_actions_creator_aggregator } +# +# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorJobAggregator: +# tags: +# - { name: chill.export_aggregator, alias: social_work_actions_creator_job_aggregator } +# +# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorScopeAggregator: +# tags: +# - { name: chill.export_aggregator, alias: social_work_actions_creator_scope_aggregator } Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters\HandlingThirdPartyFilter: tags: diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 71b428920..6ee525f8b 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1094,6 +1094,12 @@ export: by_handling_third_party: title: Grouper les actions par tiers traitant header: Tiers traitant + by_creator: + title: Grouper les actions par créateur + by_creator_job: + title: Grouper les actions par métier du créateur + by_creator_scope: + title: Grouper les actions par service du créateur eval: by_end_date: @@ -1214,6 +1220,17 @@ export: title: Filtrer les actions par tiers traitant Only 3 parties %3parties%: "Seulement les actions d'accompagnement qui ont pour tiers traitant: %3parties%" pick_3parties: Tiers traitants des actions + by_creator: + title: Filtrer les actions par créateur + Creators: Créateur de l'action + #Calc date: Date à laquelle le créateur ... + #calc_date_help: Il s'agit de la date à laquelle le créateur ... + by_creator_job: + title: Filtrer les actions par métier du créateur + "Filtered by creator job: only %jobs%'": "Filtré par métier du créateur: uniquement %jobs%" + by_creator_scope: + title: Filtrer les actions par service du créateur + "Filtered by creator scope: only %scopes%'": "Filtré par service du créateur: uniquement %scopes%" list: person_with_acp: From 3892d1e8770566abf84209b0fd80c1f356fe1090 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 13:21:33 +0100 Subject: [PATCH 16/84] remove date field --- .../SocialWorkFilters/CreatorFilter.php | 27 +++++++------------ .../translations/messages.fr.yml | 1 + 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php index 791b521af..1907edb57 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php @@ -11,9 +11,9 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters; +use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickUserDynamicType; -use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -22,9 +22,7 @@ class CreatorFilter implements FilterInterface { private const PREFIX = 'acpw_filter_creator'; - public function __construct( - private readonly TranslatableStringHelper $translatableStringHelper - ) {} + public function __construct() {} public function addRole(): ?string { @@ -38,12 +36,7 @@ class CreatorFilter implements FilterInterface $qb ->join('acpw.createdBy', "{$p}_creator") ->andWhere($qb->expr()->in("{$p}_creator", ":{$p}_creators")) - ->setParameter("{$p}_creators", $data['creators']) - //->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert( - // $data['creator_at'] ?? new RollingDate(RollingDate::T_TODAY) - //)) - ; - + ->setParameter("{$p}_creators", $data['creators']); } public function applyOn(): string @@ -57,24 +50,22 @@ class CreatorFilter implements FilterInterface ->add('creators', PickUserDynamicType::class, [ 'multiple' => true, 'label' => 'export.filter.work.by_creator.Creators', - ]) - //->add('creator_at', PickRollingDateType::class, [ - // 'label' => 'export.filter.work.by_creator.Calc date', - // 'help' => 'export.filter.work.by_creator.calc_date_help', - //]) - ; + ]); } public function describeAction($data, $format = 'string'): array { - return []; + return [ + 'export.filter.work.by_creator.Filtered by creator: only %creators%', [ + '%creators%' => implode(', ', array_map(static fn (User $u) => $u->getLabel(), $data['creators'])), + ], + ]; } public function getFormDefaultData(): array { return [ 'creators' => [], - //'creator_at' => new RollingDate(RollingDate::T_TODAY), ]; } diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 6ee525f8b..878ff7970 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1223,6 +1223,7 @@ export: by_creator: title: Filtrer les actions par créateur Creators: Créateur de l'action + "Filtered by creator: only %creators%": "Filtré par créateur de l'action: uniquement %creators%" #Calc date: Date à laquelle le créateur ... #calc_date_help: Il s'agit de la date à laquelle le créateur ... by_creator_job: From fde6000d0b05e8bcebe0ed951bbd2c0fdcc2a296 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 13:43:28 +0100 Subject: [PATCH 17/84] filters alterQuery --- .../SocialWorkFilters/CreatorFilter.php | 4 +--- .../SocialWorkFilters/CreatorJobFilter.php | 22 ++++++++++++++++--- .../SocialWorkFilters/CreatorScopeFilter.php | 22 ++++++++++++++++--- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php index 1907edb57..100bcfdc4 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php @@ -22,8 +22,6 @@ class CreatorFilter implements FilterInterface { private const PREFIX = 'acpw_filter_creator'; - public function __construct() {} - public function addRole(): ?string { return null; @@ -34,7 +32,7 @@ class CreatorFilter implements FilterInterface $p = self::PREFIX; $qb - ->join('acpw.createdBy', "{$p}_creator") + ->leftJoin('acpw.createdBy', "{$p}_creator") ->andWhere($qb->expr()->in("{$p}_creator", ":{$p}_creators")) ->setParameter("{$p}_creators", $data['creators']); } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php index 28d31920d..47b5f4c9c 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php @@ -11,11 +11,13 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters; +use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Repository\UserJobRepository; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Export\Declarations; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; @@ -39,9 +41,23 @@ class CreatorJobFilter implements FilterInterface $p = self::PREFIX; $qb - ->setParameter("{$p}_jobs", $data['jobs']) - ; - + ->leftJoin( + UserJobHistory::class, + "{$p}_history", + Join::WITH, + $qb->expr()->andX( + $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->andX( + $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->orX( + $qb->expr()->isNull("{$p}_history.endDate"), + $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + ) + ) + ) + ) + ->andWhere($qb->expr()->in("{$p}_history.job", ":{$p}_jobs")) + ->setParameter("{$p}_jobs", $data['jobs']); } public function applyOn(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php index f21bf320e..996aa5272 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php @@ -12,10 +12,12 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters; use Chill\MainBundle\Entity\Scope; +use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Repository\ScopeRepository; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Export\Declarations; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; @@ -39,9 +41,23 @@ class CreatorScopeFilter implements FilterInterface $p = self::PREFIX; $qb - ->setParameter("{$p}_scopes", $data['scopes']) - ; - + ->leftJoin( + UserScopeHistory::class, + "{$p}_history", + Join::WITH, + $qb->expr()->andX( + $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->andX( + $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->orX( + $qb->expr()->isNull("{$p}_history.endDate"), + $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + ) + ) + ) + ) + ->andWhere($qb->expr()->in("{$p}_history.scope", ":{$p}_scopes")) + ->setParameter("{$p}_scopes", $data['scopes']); } public function applyOn(): string From b790e2fcf199482faed7710fcae2f19197d0e703 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 14:18:50 +0100 Subject: [PATCH 18/84] complete aggregators --- .../CreatorAggregator.php | 29 +++++++++---- .../CreatorJobAggregator.php | 42 ++++++++++++++++--- .../CreatorScopeAggregator.php | 42 ++++++++++++++++--- .../translations/messages.fr.yml | 5 ++- 4 files changed, 96 insertions(+), 22 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php index afe416f9f..9d03e3ba1 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php @@ -12,7 +12,8 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; use Chill\MainBundle\Export\AggregatorInterface; -use Chill\MainBundle\Templating\TranslatableStringHelper; +use Chill\MainBundle\Repository\UserRepository; +use Chill\MainBundle\Templating\Entity\UserRender; use Chill\PersonBundle\Export\Declarations; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -22,7 +23,8 @@ class CreatorAggregator implements AggregatorInterface private const PREFIX = 'acpw_aggr_creator'; public function __construct( - private readonly TranslatableStringHelper $translatableStringHelper + private UserRepository $userRepository, + private UserRender $userRender ) {} public function addRole(): ?string @@ -32,7 +34,11 @@ class CreatorAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb; + $p = self::PREFIX; + + $qb + ->addSelect("IDENTITY(acpw.createdBy) AS {$p}_select") + ->addGroupBy("{$p}_select"); } public function applyOn(): string @@ -40,10 +46,7 @@ class CreatorAggregator implements AggregatorInterface return Declarations::SOCIAL_WORK_ACTION_TYPE; } - public function buildForm(FormBuilderInterface $builder) - { - $builder->add(); - } + public function buildForm(FormBuilderInterface $builder) {} public function getFormDefaultData(): array { @@ -53,13 +56,23 @@ class CreatorAggregator implements AggregatorInterface public function getLabels($key, array $values, mixed $data) { return function ($value): string { + if ('_header' === $value) { + return 'export.aggregator.course_work.by_creator.Creator'; + }; + if (null === $value || '' === $value) { + return ''; + } + + $r = $this->userRepository->find($value); + + return $this->userRender->renderString($r, ['absence' => false, 'user_job' => false, 'main_scope' => false]); }; } public function getQueryKeys($data): array { - return []; + return [self::PREFIX.'_select']; } public function getTitle(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php index ea53c4f80..fd5444b62 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php @@ -11,9 +11,12 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; +use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Export\AggregatorInterface; +use Chill\MainBundle\Repository\UserJobRepository; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Export\Declarations; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -22,6 +25,7 @@ class CreatorJobAggregator implements AggregatorInterface private const PREFIX = 'acpw_aggr_creator_job'; public function __construct( + private readonly UserJobRepository $jobRepository, private readonly TranslatableStringHelper $translatableStringHelper ) {} @@ -32,7 +36,26 @@ class CreatorJobAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb; + $p = self::PREFIX; + + $qb + ->leftJoin( + UserJobHistory::class, + "{$p}_history", + Join::WITH, + $qb->expr()->andX( + $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->andX( + $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->orX( + $qb->expr()->isNull("{$p}_history.endDate"), + $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + ) + ) + ) + ) + ->addSelect("IDENTITY({$p}_history.job) AS {$p}_select") + ->addGroupBy("{$p}_select"); } public function applyOn(): string @@ -40,10 +63,7 @@ class CreatorJobAggregator implements AggregatorInterface return Declarations::SOCIAL_WORK_ACTION_TYPE; } - public function buildForm(FormBuilderInterface $builder) - { - $builder->add(); - } + public function buildForm(FormBuilderInterface $builder) {} public function getFormDefaultData(): array { @@ -53,13 +73,23 @@ class CreatorJobAggregator implements AggregatorInterface public function getLabels($key, array $values, mixed $data) { return function ($value): string { + if ('_header' === $value) { + return 'export.aggregator.course_work.by_creator_job.Creator\'s job'; + } + if (null === $value || '' === $value || null === $j = $this->jobRepository->find($value)) { + return ''; + } + + return $this->translatableStringHelper->localize( + $j->getLabel() + ); }; } public function getQueryKeys($data): array { - return []; + return [self::PREFIX.'_select']; } public function getTitle(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php index e8eab62d4..fdbbf56a4 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php @@ -11,9 +11,12 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; +use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Export\AggregatorInterface; +use Chill\MainBundle\Repository\ScopeRepository; use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\PersonBundle\Export\Declarations; +use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -22,6 +25,7 @@ class CreatorScopeAggregator implements AggregatorInterface private const PREFIX = 'acpw_aggr_creator_scope'; public function __construct( + private readonly ScopeRepository $scopeRepository, private readonly TranslatableStringHelper $translatableStringHelper ) {} @@ -32,7 +36,26 @@ class CreatorScopeAggregator implements AggregatorInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb; + $p = self::PREFIX; + + $qb + ->leftJoin( + UserScopeHistory::class, + "{$p}_history", + Join::WITH, + $qb->expr()->andX( + $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->andX( + $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->orX( + $qb->expr()->isNull("{$p}_history.endDate"), + $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + ) + ) + ) + ) + ->addSelect("IDENTITY({$p}_history.scope) AS {$p}_select") + ->addGroupBy("{$p}_select"); } public function applyOn(): string @@ -40,10 +63,7 @@ class CreatorScopeAggregator implements AggregatorInterface return Declarations::SOCIAL_WORK_ACTION_TYPE; } - public function buildForm(FormBuilderInterface $builder) - { - $builder->add(); - } + public function buildForm(FormBuilderInterface $builder) {} public function getFormDefaultData(): array { @@ -53,13 +73,23 @@ class CreatorScopeAggregator implements AggregatorInterface public function getLabels($key, array $values, mixed $data) { return function ($value): string { + if ('_header' === $value) { + return 'export.aggregator.course_work.by_creator_scope.Creator\'s scope'; + } + if (null === $value || '' === $value || null === $s = $this->scopeRepository->find($value)) { + return ''; + } + + return $this->translatableStringHelper->localize( + $s->getName() + ); }; } public function getQueryKeys($data): array { - return []; + return [self::PREFIX.'_select']; } public function getTitle(): string diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 878ff7970..12705cb29 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1096,10 +1096,13 @@ export: header: Tiers traitant by_creator: title: Grouper les actions par créateur + Creator: Créateur de l'action by_creator_job: title: Grouper les actions par métier du créateur + Creator's job: Métier du créateur by_creator_scope: title: Grouper les actions par service du créateur + Creator's scope: Service du créateur eval: by_end_date: @@ -1224,8 +1227,6 @@ export: title: Filtrer les actions par créateur Creators: Créateur de l'action "Filtered by creator: only %creators%": "Filtré par créateur de l'action: uniquement %creators%" - #Calc date: Date à laquelle le créateur ... - #calc_date_help: Il s'agit de la date à laquelle le créateur ... by_creator_job: title: Filtrer les actions par métier du créateur "Filtered by creator job: only %jobs%'": "Filtré par métier du créateur: uniquement %jobs%" From 83c3621c26e68e2118e41a29c8e3b3f6b286f275 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 14:24:05 +0100 Subject: [PATCH 19/84] declare service --- .../services/exports_social_actions.yaml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml index 7bdf0345b..7bb735e48 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml @@ -118,18 +118,18 @@ services: Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\HandlingThirdPartyAggregator: tags: - { name: chill.export_aggregator, alias: accompanyingcourse_handling3party_aggregator } -# -# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorAggregator: -# tags: -# - { name: chill.export_aggregator, alias: social_work_actions_creator_aggregator } -# -# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorJobAggregator: -# tags: -# - { name: chill.export_aggregator, alias: social_work_actions_creator_job_aggregator } -# -# Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorScopeAggregator: -# tags: -# - { name: chill.export_aggregator, alias: social_work_actions_creator_scope_aggregator } + + Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorAggregator: + tags: + - { name: chill.export_aggregator, alias: social_work_actions_creator_aggregator } + + Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorJobAggregator: + tags: + - { name: chill.export_aggregator, alias: social_work_actions_creator_job_aggregator } + + Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators\CreatorScopeAggregator: + tags: + - { name: chill.export_aggregator, alias: social_work_actions_creator_scope_aggregator } Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters\HandlingThirdPartyFilter: tags: From 3e39c0ced7ea371dfaba42ad1b0431d8247581a1 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 14:33:50 +0100 Subject: [PATCH 20/84] rector and cs-fixer --- .changes/unreleased/Feature-20231114-143558.yaml | 7 +++++++ .../ChillActivityBundle/Controller/ActivityController.php | 4 ++-- .../Aggregator/SocialWorkAggregators/CreatorAggregator.php | 6 +++--- .../SocialWorkAggregators/CreatorJobAggregator.php | 6 +++--- .../SocialWorkAggregators/CreatorScopeAggregator.php | 6 +++--- .../Export/Filter/SocialWorkFilters/CreatorJobFilter.php | 6 +++--- .../Export/Filter/SocialWorkFilters/CreatorScopeFilter.php | 6 +++--- src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php | 2 +- 8 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 .changes/unreleased/Feature-20231114-143558.yaml diff --git a/.changes/unreleased/Feature-20231114-143558.yaml b/.changes/unreleased/Feature-20231114-143558.yaml new file mode 100644 index 000000000..edc72c027 --- /dev/null +++ b/.changes/unreleased/Feature-20231114-143558.yaml @@ -0,0 +1,7 @@ +kind: Feature +body: |+ + Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes) + +time: 2023-11-14T14:35:58.099418749+01:00 +custom: + Issue: "204" diff --git a/src/Bundle/ChillActivityBundle/Controller/ActivityController.php b/src/Bundle/ChillActivityBundle/Controller/ActivityController.php index 06489010c..43c0b13bb 100644 --- a/src/Bundle/ChillActivityBundle/Controller/ActivityController.php +++ b/src/Bundle/ChillActivityBundle/Controller/ActivityController.php @@ -673,8 +673,8 @@ final class ActivityController extends AbstractController throw $this->createNotFoundException('Accompanying Period not found'); } - // TODO Add permission - // $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); + // TODO Add permission + // $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); } else { throw $this->createNotFoundException('Person or Accompanying Period not found'); } diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php index 9d03e3ba1..f7c203a4e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorAggregator.php @@ -23,8 +23,8 @@ class CreatorAggregator implements AggregatorInterface private const PREFIX = 'acpw_aggr_creator'; public function __construct( - private UserRepository $userRepository, - private UserRender $userRender + private readonly UserRepository $userRepository, + private readonly UserRender $userRender ) {} public function addRole(): ?string @@ -58,7 +58,7 @@ class CreatorAggregator implements AggregatorInterface return function ($value): string { if ('_header' === $value) { return 'export.aggregator.course_work.by_creator.Creator'; - }; + } if (null === $value || '' === $value) { return ''; diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php index fd5444b62..1f7fdca5a 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregator.php @@ -44,12 +44,12 @@ class CreatorJobAggregator implements AggregatorInterface "{$p}_history", Join::WITH, $qb->expr()->andX( - $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->eq("{$p}_history.user", 'acpw.createdBy'), $qb->expr()->andX( - $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->lte("{$p}_history.startDate", 'acpw.createdAt'), $qb->expr()->orX( $qb->expr()->isNull("{$p}_history.endDate"), - $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + $qb->expr()->gt("{$p}_history.endDate", 'acpw.createdAt') ) ) ) diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php index fdbbf56a4..c57607693 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregator.php @@ -44,12 +44,12 @@ class CreatorScopeAggregator implements AggregatorInterface "{$p}_history", Join::WITH, $qb->expr()->andX( - $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->eq("{$p}_history.user", 'acpw.createdBy'), $qb->expr()->andX( - $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->lte("{$p}_history.startDate", 'acpw.createdAt'), $qb->expr()->orX( $qb->expr()->isNull("{$p}_history.endDate"), - $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + $qb->expr()->gt("{$p}_history.endDate", 'acpw.createdAt') ) ) ) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php index 47b5f4c9c..2b7a6ef07 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorJobFilter.php @@ -46,12 +46,12 @@ class CreatorJobFilter implements FilterInterface "{$p}_history", Join::WITH, $qb->expr()->andX( - $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->eq("{$p}_history.user", 'acpw.createdBy'), $qb->expr()->andX( - $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->lte("{$p}_history.startDate", 'acpw.createdAt'), $qb->expr()->orX( $qb->expr()->isNull("{$p}_history.endDate"), - $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + $qb->expr()->gt("{$p}_history.endDate", 'acpw.createdAt') ) ) ) diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php index 996aa5272..16ed52755 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorScopeFilter.php @@ -46,12 +46,12 @@ class CreatorScopeFilter implements FilterInterface "{$p}_history", Join::WITH, $qb->expr()->andX( - $qb->expr()->eq("{$p}_history.user", "acpw.createdBy"), + $qb->expr()->eq("{$p}_history.user", 'acpw.createdBy'), $qb->expr()->andX( - $qb->expr()->lte("{$p}_history.startDate", "acpw.createdAt"), + $qb->expr()->lte("{$p}_history.startDate", 'acpw.createdAt'), $qb->expr()->orX( $qb->expr()->isNull("{$p}_history.endDate"), - $qb->expr()->gt("{$p}_history.endDate", "acpw.createdAt") + $qb->expr()->gt("{$p}_history.endDate", 'acpw.createdAt') ) ) ) diff --git a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php index 41e0140c8..046d553e9 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php @@ -100,7 +100,7 @@ class ThirdPartyType extends AbstractType 'label' => 'thirdparty.Contact data are confidential', ]); - // Institutional ThirdParty (parent) + // Institutional ThirdParty (parent) } else { $builder ->add('nameCompany', TextType::class, [ From 200ab836c72134e92673b87ecc8c9705aa021c09 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 14:50:21 +0100 Subject: [PATCH 21/84] test cs-fixer --- .../ChillActivityBundle/Controller/ActivityController.php | 4 ++-- src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php | 2 +- tests/Kernel.php | 2 +- tests/app/config/bundles.php | 3 +-- tests/symfony-container.php | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Bundle/ChillActivityBundle/Controller/ActivityController.php b/src/Bundle/ChillActivityBundle/Controller/ActivityController.php index 43c0b13bb..06489010c 100644 --- a/src/Bundle/ChillActivityBundle/Controller/ActivityController.php +++ b/src/Bundle/ChillActivityBundle/Controller/ActivityController.php @@ -673,8 +673,8 @@ final class ActivityController extends AbstractController throw $this->createNotFoundException('Accompanying Period not found'); } - // TODO Add permission - // $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); + // TODO Add permission + // $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person); } else { throw $this->createNotFoundException('Person or Accompanying Period not found'); } diff --git a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php index 046d553e9..41e0140c8 100644 --- a/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php +++ b/src/Bundle/ChillThirdPartyBundle/Form/ThirdPartyType.php @@ -100,7 +100,7 @@ class ThirdPartyType extends AbstractType 'label' => 'thirdparty.Contact data are confidential', ]); - // Institutional ThirdParty (parent) + // Institutional ThirdParty (parent) } else { $builder ->add('nameCompany', TextType::class, [ diff --git a/tests/Kernel.php b/tests/Kernel.php index a0ede51ac..1b3d0de82 100644 --- a/tests/Kernel.php +++ b/tests/Kernel.php @@ -26,7 +26,7 @@ class Kernel extends BaseKernel public function registerBundles(): iterable { - $contents = require __DIR__ . '/app/config/bundles.php'; + $contents = require __DIR__.'/app/config/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { diff --git a/tests/app/config/bundles.php b/tests/app/config/bundles.php index 36e3bcf03..e728a729f 100644 --- a/tests/app/config/bundles.php +++ b/tests/app/config/bundles.php @@ -34,7 +34,7 @@ return [ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - //Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + // Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], Knp\Bundle\TimeBundle\KnpTimeBundle::class => ['all' => true], @@ -44,5 +44,4 @@ return [ ChampsLibres\WopiBundle\WopiBundle::class => ['all' => true], Chill\WopiBundle\ChillWopiBundle::class => ['all' => true], \Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], - ]; diff --git a/tests/symfony-container.php b/tests/symfony-container.php index fd093e94d..f4f494948 100644 --- a/tests/symfony-container.php +++ b/tests/symfony-container.php @@ -11,7 +11,7 @@ declare(strict_types=1); use App\Kernel; -require __DIR__ . '/bootstrap.php'; +require __DIR__.'/bootstrap.php'; $appKernel = new Kernel('test', false); $appKernel->boot(); From 3cdad6caff72e1e5b4d31d08fccf233a8dca1ef6 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 14:58:31 +0100 Subject: [PATCH 22/84] Revert "test cs-fixer" This reverts commit 9aa1d22d69e0f67333a8c39574fa2efed71c2bc8. --- tests/Kernel.php | 2 +- tests/app/config/bundles.php | 3 ++- tests/symfony-container.php | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Kernel.php b/tests/Kernel.php index 1b3d0de82..a0ede51ac 100644 --- a/tests/Kernel.php +++ b/tests/Kernel.php @@ -26,7 +26,7 @@ class Kernel extends BaseKernel public function registerBundles(): iterable { - $contents = require __DIR__.'/app/config/bundles.php'; + $contents = require __DIR__ . '/app/config/bundles.php'; foreach ($contents as $class => $envs) { if ($envs[$this->environment] ?? $envs['all'] ?? false) { diff --git a/tests/app/config/bundles.php b/tests/app/config/bundles.php index e728a729f..36e3bcf03 100644 --- a/tests/app/config/bundles.php +++ b/tests/app/config/bundles.php @@ -34,7 +34,7 @@ return [ Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], - // Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], + //Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], Knp\Bundle\TimeBundle\KnpTimeBundle::class => ['all' => true], @@ -44,4 +44,5 @@ return [ ChampsLibres\WopiBundle\WopiBundle::class => ['all' => true], Chill\WopiBundle\ChillWopiBundle::class => ['all' => true], \Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], + ]; diff --git a/tests/symfony-container.php b/tests/symfony-container.php index f4f494948..fd093e94d 100644 --- a/tests/symfony-container.php +++ b/tests/symfony-container.php @@ -11,7 +11,7 @@ declare(strict_types=1); use App\Kernel; -require __DIR__.'/bootstrap.php'; +require __DIR__ . '/bootstrap.php'; $appKernel = new Kernel('test', false); $appKernel->boot(); From 7f18a2fb7da07715d0b77094f457abe9f3584fe9 Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Tue, 14 Nov 2023 15:39:29 +0100 Subject: [PATCH 23/84] [export] better translation since filters are sorted --- src/Bundle/ChillPersonBundle/translations/messages.fr.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 12705cb29..459a75286 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -576,7 +576,7 @@ Group by number of actions: Grouper les parcours par nombre d’actions Filter by creator: Filtrer les parcours par créateur 'Filtered by creator: only %creators%': 'Filtré par créateur: uniquement %creators%' -Filter actions without end date: Filtre les actions sans date de fin (ouvertes) +Filter actions without end date: Filtrer les actions sans date de fin (ouvertes) Filtered actions without end date: 'Filtré: uniquement les actions sans date de fin (ouvertes)' Filter by start date evaluations: Filtrer les évaluations par date de début Filter by end date evaluations: Filtrer les évaluations par date de fin @@ -1192,14 +1192,14 @@ export: work: start_between_dates: - title: Filtre les actions d'accompagnement dont la date d'ouverture est entre deux dates + title: Filtrer les actions dont la date d'ouverture est entre deux dates start_date: Date de début end_date: Date de fin keep_null: Conserver les actions dont la date de début n'est pas indiquée keep_null_help: Si coché, les actions dont la date de début est vide seront prises en compte. Si non coché, elles ne seront pas comptabilisée. Only where start date is between %startDate% and %endDate%: Seulement les actions dont la date de début est entre le %startDate% et le %endDate% end_between_dates: - title: Filtre les actions d'accompagnement dont la date de clotûre est entre deux dates (ou l'action est toujours ouverte) + title: Filtrer les actions dont la date de clotûre est entre deux dates (ou l'action est toujours ouverte) start_date: Date de début end_date: Date de fin keep_null: Conserver les actions dont la date de fin n'est pas indiquée (actions en cours) From f9763b866d9744c93b95bfbaf9ef0cd30841158d Mon Sep 17 00:00:00 2001 From: Mathieu Jaumotte Date: Wed, 15 Nov 2023 11:59:55 +0100 Subject: [PATCH 24/84] add 6 new tests for filters/aggrs --- .../CreatorAggregatorTest.php | 60 ++++++++++++++++ .../CreatorJobAggregatorTest.php | 60 ++++++++++++++++ .../CreatorScopeAggregatorTest.php | 60 ++++++++++++++++ .../SocialWorkFilters/CreatorFilterTest.php | 70 +++++++++++++++++++ .../CreatorJobFilterTest.php | 70 +++++++++++++++++++ .../CreatorScopeFilterTest.php | 69 ++++++++++++++++++ .../translations/messages.fr.yml | 4 +- 7 files changed, 391 insertions(+), 2 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorAggregatorTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregatorTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregatorTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorJobFilterTest.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorScopeFilterTest.php diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorAggregatorTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorAggregatorTest.php new file mode 100644 index 000000000..18921db7b --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorAggregatorTest.php @@ -0,0 +1,60 @@ +aggregator = self::$container->get(CreatorAggregator::class); + } + + public function getAggregator() + { + return $this->aggregator; + } + + public function getFormData() + { + return [ + [], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(acp.id)') + ->from(AccompanyingPeriod::class, 'acp') + ->join('acp.works', 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregatorTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregatorTest.php new file mode 100644 index 000000000..98699db0e --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorJobAggregatorTest.php @@ -0,0 +1,60 @@ +aggregator = self::$container->get(CreatorJobAggregator::class); + } + + public function getAggregator() + { + return $this->aggregator; + } + + public function getFormData() + { + return [ + [], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(acp.id)') + ->from(AccompanyingPeriod::class, 'acp') + ->join('acp.works', 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregatorTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregatorTest.php new file mode 100644 index 000000000..df424792c --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Aggregator/SocialWorkAggregators/CreatorScopeAggregatorTest.php @@ -0,0 +1,60 @@ +aggregator = self::$container->get(CreatorScopeAggregator::class); + } + + public function getAggregator() + { + return $this->aggregator; + } + + public function getFormData() + { + return [ + [], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('count(acp.id)') + ->from(AccompanyingPeriod::class, 'acp') + ->join('acp.works', 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php new file mode 100644 index 000000000..a8ba33350 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php @@ -0,0 +1,70 @@ +filter = self::$container->get(CreatorFilter::class); + } + + public function getFilter() + { + return $this->filter; + } + + public function getFormData() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + $creators = $em->createQuery('SELECT u FROM '.User::class.' u') + ->setMaxResults(1) + ->getResult(); + + return [ + [ + 'creators' => $creators, + ], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('acpw.id') + ->from(AccompanyingPeriodWork::class, 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorJobFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorJobFilterTest.php new file mode 100644 index 000000000..51a4a288e --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorJobFilterTest.php @@ -0,0 +1,70 @@ +filter = self::$container->get(CreatorJobFilter::class); + } + + public function getFilter() + { + return $this->filter; + } + + public function getFormData() + { + self::bootKernel(); + $em = self::$container->get(EntityManagerInterface::class); + + $jobs = $em->createQuery('SELECT j FROM '.UserJob::class.' j') + ->setMaxResults(1) + ->getResult(); + + return [ + [ + 'jobs' => new ArrayCollection($jobs), + ], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('acpw.id') + ->from(AccompanyingPeriodWork::class, 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorScopeFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorScopeFilterTest.php new file mode 100644 index 000000000..cac5856bd --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorScopeFilterTest.php @@ -0,0 +1,69 @@ +filter = self::$container->get(CreatorScopeFilter::class); + } + + public function getFilter() + { + return $this->filter; + } + + public function getFormData() + { + self::bootKernel(); + $em = self::$container->get(EntityManagerInterface::class); + + $scopes = $em->createQuery('SELECT s FROM '.Scope::class.' s') + ->setMaxResults(1) + ->getResult(); + + return [ + [ + 'scopes' => $scopes, + ], + ]; + } + + public function getQueryBuilders() + { + self::bootKernel(); + + $em = self::$container->get(EntityManagerInterface::class); + + return [ + $em->createQueryBuilder() + ->select('acpw.id') + ->from(AccompanyingPeriodWork::class, 'acpw'), + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 459a75286..4768b8355 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1229,10 +1229,10 @@ export: "Filtered by creator: only %creators%": "Filtré par créateur de l'action: uniquement %creators%" by_creator_job: title: Filtrer les actions par métier du créateur - "Filtered by creator job: only %jobs%'": "Filtré par métier du créateur: uniquement %jobs%" + "Filtered by creator job: only %jobs%": "Filtré par métier du créateur: uniquement %jobs%" by_creator_scope: title: Filtrer les actions par service du créateur - "Filtered by creator scope: only %scopes%'": "Filtré par service du créateur: uniquement %scopes%" + "Filtered by creator scope: only %scopes%": "Filtré par service du créateur: uniquement %scopes%" list: person_with_acp: From af585bada37db7e898b083f185c9f6f036df50e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 11:56:49 +0100 Subject: [PATCH 25/84] Export: add a export which count persons on accompanying period work --- .../unreleased/Feature-20231115-114550.yaml | 5 + ...panyingPeriodWorkAssociatePersonOnWork.php | 139 ++++++++++++++++++ ...ingPeriodWorkAssociatePersonOnWorkTest.php | 50 +++++++ .../services/exports_social_actions.yaml | 4 + .../translations/messages.fr.yml | 8 +- 5 files changed, 204 insertions(+), 2 deletions(-) create mode 100644 .changes/unreleased/Feature-20231115-114550.yaml create mode 100644 src/Bundle/ChillPersonBundle/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork.php create mode 100644 src/Bundle/ChillPersonBundle/Tests/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWorkTest.php diff --git a/.changes/unreleased/Feature-20231115-114550.yaml b/.changes/unreleased/Feature-20231115-114550.yaml new file mode 100644 index 000000000..6678b19f6 --- /dev/null +++ b/.changes/unreleased/Feature-20231115-114550.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: 'Export: add a export which count persons on accompanying period work' +time: 2023-11-15T11:45:50.540277614+01:00 +custom: + Issue: "206" diff --git a/src/Bundle/ChillPersonBundle/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork.php b/src/Bundle/ChillPersonBundle/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork.php new file mode 100644 index 000000000..13dd0d512 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork.php @@ -0,0 +1,139 @@ +filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder): void + { + // No form necessary? + } + + public function getFormDefaultData(): array + { + return []; + } + + public function getAllowedFormattersTypes(): array + { + return [FormatterInterface::TYPE_TABULAR]; + } + + public function getDescription(): string + { + return 'export.export.count_person_on_acpw_associate_person_on_work.description'; + } + + public function getGroup(): string + { + return 'Exports of social work actions'; + } + + public function getLabels($key, array $values, $data) + { + if ('export_result' !== $key) { + throw new \LogicException("the key {$key} is not used by this export"); + } + + $labels = array_combine($values, $values); + $labels['_header'] = 'export.export.count_person_on_acpw_associate_person_on_work.header'; + + return static fn ($value) => $labels[$value]; + } + + public function getQueryKeys($data): array + { + return ['export_result']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.export.count_person_on_acpw_associate_person_on_work.title'; + } + + public function getType(): string + { + return Declarations::SOCIAL_WORK_ACTION_TYPE; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []): QueryBuilder + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->em->createQueryBuilder(); + + $qb + ->from(AccompanyingPeriod\AccompanyingPeriodWork::class, 'acpw') + ->join('acpw.accompanyingPeriod', 'acp') + ->join('acpw.persons', 'person'); + + if ($this->filterStatsByCenters) { + $qb + ->andWhere( + $qb->expr()->exists( + 'SELECT 1 FROM '.PersonCenterHistory::class.' acl_count_person_history WHERE acl_count_person_history.person = person + AND acl_count_person_history.center IN (:authorized_centers) + ' + ) + ) + ->setParameter('authorized_centers', $centers); + } + + $qb->select('COUNT(DISTINCT person.id) as export_result'); + + AccompanyingCourseExportHelper::addClosingMotiveExclusionClause($qb); + + return $qb; + } + + public function requiredRole(): string + { + return AccompanyingPeriodVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::SOCIAL_WORK_ACTION_TYPE, + Declarations::ACP_TYPE, + Declarations::PERSON_TYPE, + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWorkTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWorkTest.php new file mode 100644 index 000000000..04d2debe5 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Export/CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWorkTest.php @@ -0,0 +1,50 @@ +get(EntityManagerInterface::class); + + yield new CountAccompanyingPeriodWorkAssociatePersonOnWork($em, $this->getParameters(true)); + yield new CountAccompanyingPeriodWorkAssociatePersonOnWork($em, $this->getParameters(false)); + } + + public function getFormData() + { + return [[]]; + } + + public function getModifiersCombination() + { + return [ + [Declarations::SOCIAL_WORK_ACTION_TYPE, Declarations::PERSON_TYPE, Declarations::ACP_TYPE], + ]; + } +} diff --git a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml index 3e6f12fe1..bda76f4a7 100644 --- a/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml +++ b/src/Bundle/ChillPersonBundle/config/services/exports_social_actions.yaml @@ -22,6 +22,10 @@ services: tags: - { name: chill.export, alias: list_social_work_actions_associate_person_work } + Chill\PersonBundle\Export\Export\CountPersonOnAccompanyingPeriodWorkAssociatePersonOnWork: + tags: + - { name: chill.export, alias: count_person_on_acwp_associate_person_work } + Chill\PersonBundle\Export\Export\AvgDurationAPWorkPersonAssociatedOnAccompanyingPeriod: tags: - { name: chill.export, alias: avg_duration_social_work_actions_person_associated_on_period } diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 71b428920..f45a07c5d 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1003,13 +1003,17 @@ export: count_accompanying_period_work_associate_person: title: Nombre d'actions, filtres et regroupements sur les usagers du parcours - description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par le parcours de l'action. + description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par le parcours de l'action. header: Nombre d'actions count_accompanying_period_work_associate_work: title: Nombre d'actions, filtres et regroupements sur les usagers de l'action - description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. + description: Compte le nombre d'actions d'accompagnement avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par l'action. header: Nombre d'actions + count_person_on_acpw_associate_person_on_work: + title: Nombre d'usagers concernés par une action d'accompagnement, filtres et regroupements sur les usagers de l'action + description: Compte le nombre d'usager concernés par une action d'accompagnement, avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements relatifs aux usagers agissent sur les usagers concernés par l'action. Si un usager est concerné par plusieurs actions, il n'est comptabilisé qu'une fois. + header: Nombre d'usagers concernés par une action avg_duration_acpw_associate_on_period: title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers du parcours From af6bee249760b129c2fab4c34658e2f53cd7328e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 12:14:55 +0100 Subject: [PATCH 26/84] Export: add an export which count persons on activity --- .../unreleased/Feature-20231115-121431.yaml | 5 + .../LinkedToACP/CountPersonsOnActivity.php | 138 ++++++++++++++++++ .../CountPersonsOnActivityTest.php | 54 +++++++ .../config/services/export.yaml | 4 + .../translations/messages.fr.yml | 5 + 5 files changed, 206 insertions(+) create mode 100644 .changes/unreleased/Feature-20231115-121431.yaml create mode 100644 src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountPersonsOnActivity.php create mode 100644 src/Bundle/ChillActivityBundle/Tests/Export/Export/LinkedToACP/CountPersonsOnActivityTest.php diff --git a/.changes/unreleased/Feature-20231115-121431.yaml b/.changes/unreleased/Feature-20231115-121431.yaml new file mode 100644 index 000000000..6f7e5a33f --- /dev/null +++ b/.changes/unreleased/Feature-20231115-121431.yaml @@ -0,0 +1,5 @@ +kind: Feature +body: 'Export: add an export which count persons on activity' +time: 2023-11-15T12:14:31.515840946+01:00 +custom: + Issue: "206" diff --git a/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountPersonsOnActivity.php b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountPersonsOnActivity.php new file mode 100644 index 000000000..c49b9d4ad --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Export/Export/LinkedToACP/CountPersonsOnActivity.php @@ -0,0 +1,138 @@ +repository = $em->getRepository(Activity::class); + $this->filterStatsByCenters = $parameterBag->get('chill_main')['acl']['filter_stats_by_center']; + } + + public function buildForm(FormBuilderInterface $builder) {} + + public function getFormDefaultData(): array + { + return []; + } + + public function getAllowedFormattersTypes(): array + { + return [FormatterInterface::TYPE_TABULAR]; + } + + public function getDescription(): string + { + return 'export.export.count_person_on_activity.description'; + } + + public function getGroup(): string + { + return 'Exports of activities linked to an accompanying period'; + } + + public function getLabels($key, array $values, $data) + { + if ('export_count_activity' !== $key) { + throw new \LogicException("the key {$key} is not used by this export"); + } + + return static fn ($value) => '_header' === $value ? 'export.export.count_person_on_activity.header' : $value; + } + + public function getQueryKeys($data): array + { + return ['export_count_activity']; + } + + public function getResult($query, $data) + { + return $query->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getTitle(): string + { + return 'export.export.count_person_on_activity.title'; + } + + public function getType(): string + { + return Declarations::ACTIVITY; + } + + public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) + { + $centers = array_map(static fn ($el) => $el['center'], $acl); + + $qb = $this->repository + ->createQueryBuilder('activity') + ->join('activity.persons', 'person') + ->join('activity.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); + + $qb->select('COUNT(DISTINCT person.id) as export_count_activity'); + + return $qb; + } + + public function requiredRole(): string + { + return ActivityStatsVoter::STATS; + } + + public function supportsModifiers(): array + { + return [ + Declarations::ACTIVITY, + Declarations::ACTIVITY_ACP, + PersonDeclarations::ACP_TYPE, + PersonDeclarations::PERSON_TYPE, + ]; + } +} diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Export/LinkedToACP/CountPersonsOnActivityTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Export/LinkedToACP/CountPersonsOnActivityTest.php new file mode 100644 index 000000000..25d6643fb --- /dev/null +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Export/LinkedToACP/CountPersonsOnActivityTest.php @@ -0,0 +1,54 @@ +get(EntityManagerInterface::class); + + yield new CountPersonsOnActivity($em, $this->getParameters(true)); + yield new CountPersonsOnActivity($em, $this->getParameters(false)); + } + + public function getFormData() + { + return [[]]; + } + + public function getModifiersCombination() + { + return [[ + Declarations::ACTIVITY, + Declarations::ACTIVITY_ACP, + PersonDeclarations::ACP_TYPE, + PersonDeclarations::PERSON_TYPE, + ]]; + } +} diff --git a/src/Bundle/ChillActivityBundle/config/services/export.yaml b/src/Bundle/ChillActivityBundle/config/services/export.yaml index dcc6bec17..52294be40 100644 --- a/src/Bundle/ChillActivityBundle/config/services/export.yaml +++ b/src/Bundle/ChillActivityBundle/config/services/export.yaml @@ -16,6 +16,10 @@ services: tags: - { name: chill.export, alias: 'list_activity_linked_to_person' } + Chill\ActivityBundle\Export\Export\LinkedToACP\CountPersonsOnActivity: + tags: + - { name: chill.export, alias: 'count_person_on_activity' } + chill.activity.export.count_activity_linked_to_acp: class: Chill\ActivityBundle\Export\Export\LinkedToACP\CountActivity tags: diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index 52c5366a7..036f75ce3 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -332,6 +332,11 @@ docgen: myWorksOnly: Prendre en compte uniquement les actions d'accompagnement dont je suis référent export: + export: + count_person_on_activity: + title: Nombre d'usagers concernés par les échanges + description: Compte le nombre d'usagers concernés par les échanges. Si un usager est présent dans plusieurs échanges, il n'est comptabilisé qu'une seule fois. + header: Nombre d'usagers concernés par des échanges list: activity: users name: Nom des utilisateurs From e9df26c2f7f6a18d0579ad9e19321c49326776fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 13:23:05 +0100 Subject: [PATCH 27/84] Export: add clauses on the social work start date and end date within the filter "Filter accompanying period by accompanying period work"' --- .../unreleased/Feature-20231115-132233.yaml | 6 ++ .../Form/DataMapper/RollingDateDataMapper.php | 12 ++- .../Form/Type/PickRollingDateType.php | 6 +- .../SocialActionFilter.php | 100 +++++++++++++++--- .../SocialActionFilterTest.php | 32 +++++- .../translations/messages.fr.yml | 17 ++- 6 files changed, 147 insertions(+), 26 deletions(-) create mode 100644 .changes/unreleased/Feature-20231115-132233.yaml diff --git a/.changes/unreleased/Feature-20231115-132233.yaml b/.changes/unreleased/Feature-20231115-132233.yaml new file mode 100644 index 000000000..5d3accbd4 --- /dev/null +++ b/.changes/unreleased/Feature-20231115-132233.yaml @@ -0,0 +1,6 @@ +kind: Feature +body: 'Export: add clauses on the social work start date and end date within the filter + "Filter accompanying period by accompanying period work"' +time: 2023-11-15T13:22:33.19215851+01:00 +custom: + Issue: "203" diff --git a/src/Bundle/ChillMainBundle/Form/DataMapper/RollingDateDataMapper.php b/src/Bundle/ChillMainBundle/Form/DataMapper/RollingDateDataMapper.php index 7628d6aa3..6a139de7b 100644 --- a/src/Bundle/ChillMainBundle/Form/DataMapper/RollingDateDataMapper.php +++ b/src/Bundle/ChillMainBundle/Form/DataMapper/RollingDateDataMapper.php @@ -37,9 +37,13 @@ class RollingDateDataMapper implements DataMapperInterface { $forms = iterator_to_array($forms); - $viewData = new RollingDate( - $forms['roll']->getData() ?? RollingDate::T_TODAY, - $forms['fixedDate']->getData() - ); + if (null === $forms['roll']->getData()) { + $viewData = null; + } else { + $viewData = new RollingDate( + $forms['roll']->getData(), + $forms['fixedDate']->getData() + ); + } } } diff --git a/src/Bundle/ChillMainBundle/Form/Type/PickRollingDateType.php b/src/Bundle/ChillMainBundle/Form/Type/PickRollingDateType.php index 8ceb08578..ca10530e8 100644 --- a/src/Bundle/ChillMainBundle/Form/Type/PickRollingDateType.php +++ b/src/Bundle/ChillMainBundle/Form/Type/PickRollingDateType.php @@ -54,7 +54,7 @@ class PickRollingDateType extends AbstractType { $resolver->setDefaults([ 'class' => RollingDate::class, - 'empty_data' => new RollingDate(RollingDate::T_TODAY), + 'empty_data' => null, 'constraints' => [ new Callback($this->validate(...)), ], @@ -66,6 +66,10 @@ class PickRollingDateType extends AbstractType public function validate($data, ExecutionContextInterface $context, $payload): void { + if (null === $data) { + return; + } + /** @var RollingDate $data */ if (RollingDate::T_FIXED_DATE === $data->getRoll() && null === $data->getFixedDate()) { $context diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialActionFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialActionFilter.php index cba86c257..dc5ffa042 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialActionFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/SocialActionFilter.php @@ -12,6 +12,8 @@ declare(strict_types=1); namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters; use Chill\MainBundle\Export\FilterInterface; +use Chill\MainBundle\Form\Type\PickRollingDateType; +use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\SocialWork\SocialAction; use Chill\PersonBundle\Export\Declarations; @@ -19,10 +21,17 @@ use Chill\PersonBundle\Form\Type\PickSocialActionType; use Chill\PersonBundle\Templating\Entity\SocialActionRender; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Contracts\Translation\TranslatorInterface; final readonly class SocialActionFilter implements FilterInterface { - public function __construct(private SocialActionRender $actionRender) {} + private const PREFIX = 'acp_by_social_action_filter'; + + public function __construct( + private SocialActionRender $actionRender, + private RollingDateConverterInterface $rollingDateConverter, + private TranslatorInterface $translator + ) {} public function addRole(): ?string { @@ -31,17 +40,40 @@ final readonly class SocialActionFilter implements FilterInterface public function alterQuery(QueryBuilder $qb, $data) { - $qb->andWhere( - $qb->expr()->exists( - sprintf( - 'SELECT 1 FROM %s acp_by_social_action_filter WHERE acp_by_social_action_filter.socialAction ' - .'IN (:acp_by_social_action_filter_actions) AND acp_by_social_action_filter.accompanyingPeriod = acp', - AccompanyingPeriod\AccompanyingPeriodWork::class - ) - ) - ); + $p = self::PREFIX; - $qb->setParameter('acp_by_social_action_filter_actions', SocialAction::getDescendantsWithThisForActions($data['accepted_socialactions'])); + $dql = + sprintf( + 'SELECT 1 FROM %s acp_by_social_action_filter WHERE acp_by_social_action_filter.accompanyingPeriod = acp ', + AccompanyingPeriod\AccompanyingPeriodWork::class + ); + + if (0 < count($data['accepted_socialactions'])) { + $dql .= 'AND acp_by_social_action_filter.socialAction IN (:acp_by_social_action_filter_actions)'; + $qb->setParameter("{$p}_actions", SocialAction::getDescendantsWithThisForActions($data['accepted_socialactions'])); + } + + if (null !== ($data['start_date_after'] ?? null)) { + $dql .= " AND acp_by_social_action_filter.startDate > :{$p}_start_date_after"; + $qb->setParameter("{$p}_start_date_after", $this->rollingDateConverter->convert($data['start_date_after'])); + } + + if (null !== ($data['start_date_before'] ?? null)) { + $dql .= " AND acp_by_social_action_filter.startDate <= :{$p}_start_date_before"; + $qb->setParameter("{$p}_start_date_before", $this->rollingDateConverter->convert($data['start_date_before'])); + } + + if (null !== ($data['end_date_after'] ?? null)) { + $dql .= " AND acp_by_social_action_filter.endDate > :{$p}_end_date_after OR acp_by_social_action_filter.endDate IS NULL"; + $qb->setParameter("{$p}_end_date_after", $this->rollingDateConverter->convert($data['end_date_after'])); + } + + if (null !== ($data['end_date_before'] ?? null)) { + $dql .= " AND acp_by_social_action_filter.endDate <= :{$p}_end_date_before OR acp_by_social_action_filter.endDate IS NULL"; + $qb->setParameter("{$p}_end_date_before", $this->rollingDateConverter->convert($data['end_date_before'])); + } + + $qb->andWhere($qb->expr()->exists($dql)); } public function applyOn(): string @@ -51,14 +83,44 @@ final readonly class SocialActionFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder) { - $builder->add('accepted_socialactions', PickSocialActionType::class, [ - 'multiple' => true, - ]); + $builder + ->add('accepted_socialactions', PickSocialActionType::class, [ + 'multiple' => true, + 'label' => 'export.filter.course.by_social_action.Accepted socialactions', + 'help' => 'export.filter.course.by_social_action.accepted socialations help', + ]) + ->add('start_date_after', PickRollingDateType::class, [ + 'label' => 'export.filter.course.by_social_action.start date after', + 'help' => 'export.filter.course.by_social_action.start date after help', + 'required' => false, + ]) + ->add('start_date_before', PickRollingDateType::class, [ + 'label' => 'export.filter.course.by_social_action.start date before', + 'help' => 'export.filter.course.by_social_action.start date before help', + 'required' => false, + ]) + ->add('end_date_after', PickRollingDateType::class, [ + 'label' => 'export.filter.course.by_social_action.end date after', + 'help' => 'export.filter.course.by_social_action.end date after help', + 'required' => false, + ]) + ->add('end_date_before', PickRollingDateType::class, [ + 'label' => 'export.filter.course.by_social_action.end date before', + 'help' => 'export.filter.course.by_social_action.end date before help', + 'required' => false, + ]) + ; } public function getFormDefaultData(): array { - return []; + return [ + 'accepted_social_actions' => [], + 'start_date_after' => null, + 'start_date_before' => null, + 'end_date_after' => null, + 'end_date_before' => null, + ]; } public function describeAction($data, $format = 'string'): array @@ -73,13 +135,17 @@ final readonly class SocialActionFilter implements FilterInterface ]); } - return ['Filtered by socialactions: only %socialactions%', [ + return ['export.filter.course.by_social_action.Filtered by socialactions: only %socialactions%', [ '%socialactions%' => implode(', ', $actions), + '%start_date_after%' => null === ($data['start_date_after'] ?? null) ? '('.$this->translator->trans('export.filter.course.by_social_action.date ignored').')' : $this->rollingDateConverter->convert($data['start_date_after'])->format('d-m-Y'), + '%start_date_before%' => null === ($data['start_date_before'] ?? null) ? '('.$this->translator->trans('export.filter.course.by_social_action.date ignored').')' : $this->rollingDateConverter->convert($data['start_date_before'])->format('d-m-Y'), + '%end_date_after%' => null === ($data['end_date_after'] ?? null) ? '('.$this->translator->trans('export.filter.course.by_social_action.date ignored').')' : $this->rollingDateConverter->convert($data['end_date_after'])->format('d-m-Y'), + '%end_date_before%' => null === ($data['end_date_before'] ?? null) ? '('.$this->translator->trans('export.filter.course.by_social_action.date ignored').')' : $this->rollingDateConverter->convert($data['end_date_before'])->format('d-m-Y'), ]]; } public function getTitle(): string { - return 'Filter by socialaction'; + return 'export.filter.course.by_social_action.title'; } } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/SocialActionFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/SocialActionFilterTest.php index 66768d966..65078dad2 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/SocialActionFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/SocialActionFilterTest.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Chill\PersonBundle\Tests\Export\Filter\AccompanyingCourseFilters; +use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Test\Export\AbstractFilterTest; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\SocialWork\SocialAction; @@ -50,7 +51,36 @@ final class SocialActionFilterTest extends AbstractFilterTest ->setMaxResults(1) ->getResult(); - yield ['accepted_socialactions' => $array]; + return [ + [ + 'accepted_socialactions' => $array, + 'start_date_after' => null, + 'start_date_before' => null, + 'end_date_after' => null, + 'end_date_before' => null, + ], + [ + 'accepted_socialactions' => $array, + 'start_date_after' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), + 'start_date_before' => new RollingDate(RollingDate::T_TODAY), + 'end_date_after' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), + 'end_date_before' => new RollingDate(RollingDate::T_TODAY), + ], + [ + 'accepted_socialactions' => [], + 'start_date_after' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), + 'start_date_before' => new RollingDate(RollingDate::T_TODAY), + 'end_date_after' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), + 'end_date_before' => new RollingDate(RollingDate::T_TODAY), + ], + [ + 'accepted_socialactions' => [], + 'start_date_after' => null, + 'start_date_before' => null, + 'end_date_after' => null, + 'end_date_before' => null, + ], + ]; } public function getQueryBuilders(): array diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index f45a07c5d..d55ccdfaf 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -483,9 +483,6 @@ Select a geographical layer: Choisir une couche géographique Group people by geographical unit based on his address: Grouper les usagers par zone géographique (sur base de l'adresse) Filter by person's geographical unit (based on address): Filtrer les usagers par zone géographique (sur base de l'adresse) -Filter by socialaction: Filtrer les parcours par action d'accompagnement -Accepted socialactions: Actions d'accompagnement -"Filtered by socialactions: only %socialactions%": "Filtré par action d'accompagnement: uniquement %socialactions%" Group by social action: Grouper les parcours par action d'accompagnement Filter by type of action, goals and results: "Filtrer les actions par type, objectif et résultat" @@ -1184,6 +1181,20 @@ export: by_user_job: Filter by user job: Filtrer les parcours par métier du référent "Filtered by user job: only %job%": "Filtré par métier du référent: uniquement %job%" + by_social_action: + title: Filtrer les parcours par action d'accompagnement + Accepted socialactions: Actions d'accompagnement + accepted socialations help: Si laissé vide, tous les types d'action seront pris en compte + "Filtered by socialactions: only %socialactions%": "Filtré par action d'accompagnement: uniquement %socialactions%, date d'ouverture après le %start_date_after%, et avant le %start_date_before%, date de fermeture après le %end_date_after% et avant le %end_date_before%" + start date after: Date de début de l'action après le + start date after help: Sera ignoré si laissé vide + start date before: Date de début de l'action avant le + start date before help: Sera ignoré si laissé vide + end date after: Date de fin de l'action après le + end date after help: Sera ignoré si laissé vide. Les actions sans date de fin seront toujours prises en compte. + end date before: Date de fin de l'action avant le + end date before help: Sera ignoré si laissé vide. Les actions sans date de fin seront toujours prises en compte. + date ignored: clause de date ignorée work: start_between_dates: From f5f4d8fcdd85f3738b12b44533e6a7554ee9da87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 13:30:48 +0100 Subject: [PATCH 28/84] remove blank line in changie --- .changes/unreleased/Feature-20231114-143558.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.changes/unreleased/Feature-20231114-143558.yaml b/.changes/unreleased/Feature-20231114-143558.yaml index edc72c027..d95691b73 100644 --- a/.changes/unreleased/Feature-20231114-143558.yaml +++ b/.changes/unreleased/Feature-20231114-143558.yaml @@ -1,7 +1,6 @@ kind: Feature body: |+ Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes) - time: 2023-11-14T14:35:58.099418749+01:00 custom: Issue: "204" From e6cab938c8be55f66ce34f53f789e4a248ece239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 13:41:35 +0100 Subject: [PATCH 29/84] DX: increase max connection in postgres service --- .gitlab-ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 32b7e5221..dc3e39778 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,6 +11,10 @@ cache: services: - name: postgis/postgis:14-3.3-alpine alias: db + command: + - postgres + - "-c" + - max_connections=1000 - name: redis alias: redis From 5ab0d3f8da85d790e60d1ebf946264cff21e486d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 13:57:48 +0100 Subject: [PATCH 30/84] add units on the headers for avg duration of accompanying period work --- src/Bundle/ChillPersonBundle/translations/messages.fr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml index 08f76e485..619f4eb36 100644 --- a/src/Bundle/ChillPersonBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillPersonBundle/translations/messages.fr.yml @@ -1014,12 +1014,12 @@ export: avg_duration_acpw_associate_on_period: title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers du parcours - header: Durée moyenne des actions d'accompagnements + header: Durée moyenne des actions d'accompagnements (en jours) description: Calcule la moyenne durée des actions d'accompagnements avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par le parcours de l'action. avg_duration_acpw_associate_on_work: title: Durée moyenne des actions d'accompagnements, filtres et regroupement sur les usagers de l'action - header: Durée moyenne des actions d'accompagnements + header: Durée moyenne des actions d'accompagnements (en jours) description: Calcule la moyenne durée des actions d'accompagnements avec des filtres et regroupements possibles sur les usagers, les parcours et les actions. Les filtres et regroupements agissent sur les usagers concernés par l'action. aggregator: From 1f47f157ea9e7e0f60ee5301312de20d6c2659df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Wed, 15 Nov 2023 14:03:46 +0100 Subject: [PATCH 31/84] Release v2.12.0 --- .../unreleased/Feature-20231109-170655.yaml | 5 ---- .../unreleased/Feature-20231109-173500.yaml | 5 ---- .../unreleased/Feature-20231110-144056.yaml | 6 ----- .../unreleased/Feature-20231110-171720.yaml | 5 ---- .../unreleased/Feature-20231110-175928.yaml | 7 ----- .../unreleased/Feature-20231114-143558.yaml | 6 ----- .../unreleased/Feature-20231114-143611.yaml | 5 ---- .../unreleased/Feature-20231115-114550.yaml | 5 ---- .../unreleased/Feature-20231115-121431.yaml | 5 ---- .../unreleased/Feature-20231115-132233.yaml | 6 ----- .../unreleased/Fixed-20231113-120855.yaml | 5 ---- .../unreleased/Fixed-20231113-152621.yaml | 5 ---- .../unreleased/Fixed-20231114-183343.yaml | 5 ---- .changes/v2.12.0.md | 26 +++++++++++++++++++ 14 files changed, 26 insertions(+), 70 deletions(-) delete mode 100644 .changes/unreleased/Feature-20231109-170655.yaml delete mode 100644 .changes/unreleased/Feature-20231109-173500.yaml delete mode 100644 .changes/unreleased/Feature-20231110-144056.yaml delete mode 100644 .changes/unreleased/Feature-20231110-171720.yaml delete mode 100644 .changes/unreleased/Feature-20231110-175928.yaml delete mode 100644 .changes/unreleased/Feature-20231114-143558.yaml delete mode 100644 .changes/unreleased/Feature-20231114-143611.yaml delete mode 100644 .changes/unreleased/Feature-20231115-114550.yaml delete mode 100644 .changes/unreleased/Feature-20231115-121431.yaml delete mode 100644 .changes/unreleased/Feature-20231115-132233.yaml delete mode 100644 .changes/unreleased/Fixed-20231113-120855.yaml delete mode 100644 .changes/unreleased/Fixed-20231113-152621.yaml delete mode 100644 .changes/unreleased/Fixed-20231114-183343.yaml create mode 100644 .changes/v2.12.0.md diff --git a/.changes/unreleased/Feature-20231109-170655.yaml b/.changes/unreleased/Feature-20231109-170655.yaml deleted file mode 100644 index d4f793607..000000000 --- a/.changes/unreleased/Feature-20231109-170655.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: 'Export: add an aggregator "group activities by presence"' -time: 2023-11-09T17:06:55.876380883+01:00 -custom: - Issue: "199" diff --git a/.changes/unreleased/Feature-20231109-173500.yaml b/.changes/unreleased/Feature-20231109-173500.yaml deleted file mode 100644 index e356259b4..000000000 --- a/.changes/unreleased/Feature-20231109-173500.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: 'Export: add a filter "filter activity by activity presence"' -time: 2023-11-09T17:35:00.158055832+01:00 -custom: - Issue: "199" diff --git a/.changes/unreleased/Feature-20231110-144056.yaml b/.changes/unreleased/Feature-20231110-144056.yaml deleted file mode 100644 index f263d14c6..000000000 --- a/.changes/unreleased/Feature-20231110-144056.yaml +++ /dev/null @@ -1,6 +0,0 @@ -kind: Feature -body: 'Export: add an aggregator "group activities by person" (only for the activities - saved in a person context)' -time: 2023-11-10T14:40:56.93459414+01:00 -custom: - Issue: "199" diff --git a/.changes/unreleased/Feature-20231110-171720.yaml b/.changes/unreleased/Feature-20231110-171720.yaml deleted file mode 100644 index 69135e62c..000000000 --- a/.changes/unreleased/Feature-20231110-171720.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: 'Export: add a new aggregator "group peoples by postal code"' -time: 2023-11-10T17:17:20.236876015+01:00 -custom: - Issue: "199" diff --git a/.changes/unreleased/Feature-20231110-175928.yaml b/.changes/unreleased/Feature-20231110-175928.yaml deleted file mode 100644 index a42e1210d..000000000 --- a/.changes/unreleased/Feature-20231110-175928.yaml +++ /dev/null @@ -1,7 +0,0 @@ -kind: Feature -body: 'Export: split export about person on accompanying period work: one with the - people associated with the work, another one with the people associated with the - accompanying period' -time: 2023-11-10T17:59:28.388361356+01:00 -custom: - Issue: "200" diff --git a/.changes/unreleased/Feature-20231114-143558.yaml b/.changes/unreleased/Feature-20231114-143558.yaml deleted file mode 100644 index d95691b73..000000000 --- a/.changes/unreleased/Feature-20231114-143558.yaml +++ /dev/null @@ -1,6 +0,0 @@ -kind: Feature -body: |+ - Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes) -time: 2023-11-14T14:35:58.099418749+01:00 -custom: - Issue: "204" diff --git a/.changes/unreleased/Feature-20231114-143611.yaml b/.changes/unreleased/Feature-20231114-143611.yaml deleted file mode 100644 index 1da6fd5c8..000000000 --- a/.changes/unreleased/Feature-20231114-143611.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: Create export for the average duration of social work actions -time: 2023-11-14T14:36:11.797238275+01:00 -custom: - Issue: "202" diff --git a/.changes/unreleased/Feature-20231115-114550.yaml b/.changes/unreleased/Feature-20231115-114550.yaml deleted file mode 100644 index 6678b19f6..000000000 --- a/.changes/unreleased/Feature-20231115-114550.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: 'Export: add a export which count persons on accompanying period work' -time: 2023-11-15T11:45:50.540277614+01:00 -custom: - Issue: "206" diff --git a/.changes/unreleased/Feature-20231115-121431.yaml b/.changes/unreleased/Feature-20231115-121431.yaml deleted file mode 100644 index 6f7e5a33f..000000000 --- a/.changes/unreleased/Feature-20231115-121431.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Feature -body: 'Export: add an export which count persons on activity' -time: 2023-11-15T12:14:31.515840946+01:00 -custom: - Issue: "206" diff --git a/.changes/unreleased/Feature-20231115-132233.yaml b/.changes/unreleased/Feature-20231115-132233.yaml deleted file mode 100644 index 5d3accbd4..000000000 --- a/.changes/unreleased/Feature-20231115-132233.yaml +++ /dev/null @@ -1,6 +0,0 @@ -kind: Feature -body: 'Export: add clauses on the social work start date and end date within the filter - "Filter accompanying period by accompanying period work"' -time: 2023-11-15T13:22:33.19215851+01:00 -custom: - Issue: "203" diff --git a/.changes/unreleased/Fixed-20231113-120855.yaml b/.changes/unreleased/Fixed-20231113-120855.yaml deleted file mode 100644 index 6a2003d3d..000000000 --- a/.changes/unreleased/Fixed-20231113-120855.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Fixed -body: 'Export: fix typo in filter "filter accompanying period work on end date"' -time: 2023-11-13T12:08:55.509927824+01:00 -custom: - Issue: "" diff --git a/.changes/unreleased/Fixed-20231113-152621.yaml b/.changes/unreleased/Fixed-20231113-152621.yaml deleted file mode 100644 index e897fec30..000000000 --- a/.changes/unreleased/Fixed-20231113-152621.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Fixed -body: 'Export: Fix failure in export linked to household' -time: 2023-11-13T15:26:21.891117274+01:00 -custom: - Issue: "189" diff --git a/.changes/unreleased/Fixed-20231114-183343.yaml b/.changes/unreleased/Fixed-20231114-183343.yaml deleted file mode 100644 index f34fe8a22..000000000 --- a/.changes/unreleased/Fixed-20231114-183343.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Fixed -body: 'Fix loading of accompanying period work referrers ' -time: 2023-11-14T18:33:43.284236146+01:00 -custom: - Issue: "205" diff --git a/.changes/v2.12.0.md b/.changes/v2.12.0.md new file mode 100644 index 000000000..23fe92536 --- /dev/null +++ b/.changes/v2.12.0.md @@ -0,0 +1,26 @@ +## v2.12.0 - 2023-11-15 +### Feature +* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by presence" +* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a filter "filter activity by activity presence" +* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add an aggregator "group activities by person" (only for the activities saved in a person context) +* ([#199](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/199)) Export: add a new aggregator "group peoples by postal code" +* ([#200](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/200)) Export: split export about person on accompanying period work: one with the people associated with the work, another one with the people associated with the accompanying period +* ([#204](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/204)) Add 3 new filters and 3 new aggregators for work action creator (with jobs and scopes) + +* ([#202](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/202)) Create export for the average duration of social work actions +* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add a export which count persons on accompanying period work +* ([#206](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/206)) Export: add an export which count persons on activity +* ([#203](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/203)) Export: add clauses on the social work start date and end date within the filter "Filter accompanying period by accompanying period work" +### Fixed +* Export: fix typo in filter "filter accompanying period work on end date" +* ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household +* ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers +### Traduction francophone des différents changements +* export: ajout d'un regroupement "grouper les échanges par présence de l'usager"; +* export: ajout d'un filtre "filtre les échanges par présence de l'usager"; +* export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager); +* export: ajout d'un regroupement "grouper les usagers par codes postaux" +* export: séparation des exports sur les actions: dans l'un, les filtres des usagers portent sur les usagers concernés par l'action, dans l'autre, les filtres portent sur les usagers concernés par le parcours de l'action; +* export: ajout de 3 nouveaux filtres et regroupements sur le créateur de l'action, son métier et son service; +* export: correction de l'export sur les ménages liés aux parcours; +* correction du chargement des actions d'accompagnement From eaa40d67250413054b9e654e4d0989fe8dd7b328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 10:57:32 +0100 Subject: [PATCH 32/84] DX: remove some unnecessary console.log --- .../Resources/public/module/pick-rolling-date/index.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/Bundle/ChillMainBundle/Resources/public/module/pick-rolling-date/index.js b/src/Bundle/ChillMainBundle/Resources/public/module/pick-rolling-date/index.js index 2600ea40b..9f73c9bf8 100644 --- a/src/Bundle/ChillMainBundle/Resources/public/module/pick-rolling-date/index.js +++ b/src/Bundle/ChillMainBundle/Resources/public/module/pick-rolling-date/index.js @@ -1,7 +1,6 @@ import {ShowHide} from 'ChillMainAssets/lib/show_hide/index'; document.addEventListener('DOMContentLoaded', function(_e) { - console.log('pick-rolling-date'); document.querySelectorAll('div[data-rolling-date]').forEach( (picker) => { const roll_wrapper = picker.querySelector('div.roll-wrapper'), @@ -11,12 +10,8 @@ document.addEventListener('DOMContentLoaded', function(_e) { froms: [roll_wrapper], container: [fixed_wrapper], test: function (elems) { - console.log('testing'); - console.log('elems', elems); for (let el of elems) { for (let select_roll of el.querySelectorAll('select[data-roll-picker]')) { - console.log('select_roll', select_roll); - console.log('value', select_roll.value); return select_roll.value === 'fixed_date'; } } From d8fa743bc9c401c9a86041a99cb3f2d90900e79f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 10:57:59 +0100 Subject: [PATCH 33/84] Export: fix loading of form for "filter action by type, goal and result" --- .../unreleased/Fixed-20231116-105642.yaml | 5 ++ .../Resources/views/Export/new.html.twig | 4 +- .../vuejs/ExportFormActionGoalResult/App.vue | 70 +++++++++---------- .../vuejs/ExportFormActionGoalResult/index.js | 17 ++--- 4 files changed, 50 insertions(+), 46 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231116-105642.yaml diff --git a/.changes/unreleased/Fixed-20231116-105642.yaml b/.changes/unreleased/Fixed-20231116-105642.yaml new file mode 100644 index 000000000..b2409fbf5 --- /dev/null +++ b/.changes/unreleased/Fixed-20231116-105642.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix loading of form for "filter action by type, goal and result"' +time: 2023-11-16T10:56:42.771516508+01:00 +custom: + Issue: "208" diff --git a/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig b/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig index 82b3e0c0c..e739b871c 100644 --- a/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig +++ b/src/Bundle/ChillMainBundle/Resources/views/Export/new.html.twig @@ -28,9 +28,7 @@ {% block js %} {{ encore_entry_script_tags('mod_pickentity_type') }} {{ encore_entry_script_tags('page_export') }} - {% if export_alias == 'count_social_work_actions' %} - {{ encore_entry_script_tags('vue_export_action_goal_result') }} - {% endif %} + {{ encore_entry_script_tags('vue_export_action_goal_result') }} {{ encore_entry_script_tags('mod_pick_rolling_date') }} {% endblock js %} diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue index d4d1be1b6..322ee3750 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue @@ -1,11 +1,11 @@ @@ -152,18 +152,18 @@ export default { }, mounted() { this.getSocialActionsList(); - + this.actions.hiddenField.value = ''; this.goals.hiddenField.value = ''; this.results.hiddenField.value = ''; - + //console.log(this.actions.hiddenField, this.goals.hiddenField, this.results.hiddenField); }, methods: { async getSocialActionsList() { this.actions.options = await getSocialActions(); }, - + /** * Select/unselect in Action Multiselect * @param value @@ -172,7 +172,7 @@ export default { //console.log('----'); console.log('select action', value.id); let children = this.getChildrensFromParent(value); this.addSelectedElement('actions', children); - + let parentAndChildren = [...[value], ...children]; parentAndChildren.forEach(elem => { getGoalByAction(elem.id).then(response => new Promise((resolve, reject) => { @@ -185,7 +185,7 @@ export default { })).catch; }); }, - + unselectAction(value) { //console.log('----'); console.log('unselect action', value.id); getGoalByAction(value.id).then(response => new Promise((resolve, reject) => { @@ -197,7 +197,7 @@ export default { resolve(); })).catch; }, - + /** * Select/unselect in Goal Multiselect * @param value @@ -209,7 +209,7 @@ export default { resolve(); })).catch; }, - + unselectGoal(value) { //console.log('----'); console.log('unselect goal', value.id); getResultByGoal(value.id).then(response => new Promise((resolve, reject) => { @@ -217,7 +217,7 @@ export default { resolve(); })).catch; }, - + /** * Select/unselect in Result Multiselect * @param value @@ -225,11 +225,11 @@ export default { selectResult(value) { //console.log('----'); console.log('select result', value.id); }, - + unselectResult(value) { //console.log('----'); console.log('unselect result', value.id); }, - + /** * Choose parent action will involve retaining the "children" actions. * @param value @@ -244,7 +244,7 @@ export default { } return []; }, - + /** * Add response elements in data target * @param target string -> 'actions', 'goals' or 'results' @@ -264,7 +264,7 @@ export default { //console.log('push ' + dump.length + ' elems in', target, dump); } }, - + /** * Remove response elements from data target * @param target string -> 'actions', 'goals' or 'results' @@ -279,7 +279,7 @@ export default { if (found) { data.options = data.options.filter(e => e.id !== elem.id); dump.push(elem.id); - + this.removeSelectedElement(target, elem); } }) @@ -288,7 +288,7 @@ export default { } return [ data.options, data.value ]; }, - + /** * * @param target @@ -300,10 +300,10 @@ export default { elements.forEach(elem => { let selected = data.value.some(e => e.id === elem.id); if (!selected) { - + data.value.push(elem); dump.push(elem.id); - + // add in hiddenField this.rebuildHiddenFieldValues(target); } @@ -312,7 +312,7 @@ export default { //console.log('add ' + dump.length + ' selected elems in', target, dump); } }, - + /** * Remove element from selected and from hiddenField * @param target @@ -322,19 +322,19 @@ export default { let data = this[target]; let selected = data.value.some(e => e.id === elem.id); if (selected) { - + // remove from selected data.value = data.value.filter(e => e.id !== elem.id); //console.log('remove ' + elem.id + ' from selected ' + target); - + // remove from hiddenField this.rebuildHiddenFieldValues(target); - + // in any cases, remove should be recursive this.unselectToNextField(target, elem); } }, - + /** * When unselect Action, it could remove elements in goals multiselect. * In that case, we have to unselect Goal to remove elements in results too. @@ -348,7 +348,7 @@ export default { //console.log('!!!! done'); } }, - + /** * Rebuild values serie (string) in target HiddenField * @param target @@ -362,14 +362,14 @@ export default { }) //console.log(data.hiddenField); }, - + addIdToValue(string, id) { let array = string ? string.split(',') : []; array.push(id.toString()); let str = array.join(); return str; }, - + transTitle ({ title }) { return title.fr //TODO multilang }, @@ -378,4 +378,4 @@ export default { \ No newline at end of file + diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js index d838fb0be..4c34798cc 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/index.js @@ -2,12 +2,13 @@ import { createApp } from "vue"; import { _createI18n } from 'ChillMainAssets/vuejs/_js/i18n'; import App from './App.vue'; -const i18n = _createI18n({}); +if (null !== document.getElementById('export_filters_social_work_type_filter_enabled')) { + const i18n = _createI18n({}); -const app = createApp({ - template: ``, -}) -.use(i18n) -.component('app', App) -.mount('#export_export') -; \ No newline at end of file + const app = createApp({ + template: ``, + }) + .use(i18n) + .component('app', App) + .mount('#export_export'); +} From ff344dbb0c3fbbe37fbf13ed7ec2c74150d38943 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 11:07:34 +0100 Subject: [PATCH 34/84] Release 2.12.1 --- .changes/unreleased/Fixed-20231116-105642.yaml | 5 ----- .changes/v2.12.0.md | 2 +- .changes/v2.12.1.md | 3 +++ 3 files changed, 4 insertions(+), 6 deletions(-) delete mode 100644 .changes/unreleased/Fixed-20231116-105642.yaml create mode 100644 .changes/v2.12.1.md diff --git a/.changes/unreleased/Fixed-20231116-105642.yaml b/.changes/unreleased/Fixed-20231116-105642.yaml deleted file mode 100644 index b2409fbf5..000000000 --- a/.changes/unreleased/Fixed-20231116-105642.yaml +++ /dev/null @@ -1,5 +0,0 @@ -kind: Fixed -body: 'Export: fix loading of form for "filter action by type, goal and result"' -time: 2023-11-16T10:56:42.771516508+01:00 -custom: - Issue: "208" diff --git a/.changes/v2.12.0.md b/.changes/v2.12.0.md index 23fe92536..e4e02efa0 100644 --- a/.changes/v2.12.0.md +++ b/.changes/v2.12.0.md @@ -15,7 +15,7 @@ * Export: fix typo in filter "filter accompanying period work on end date" * ([#189](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/189)) Export: Fix failure in export linked to household * ([#205](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/205)) Fix loading of accompanying period work referrers -### Traduction francophone des différents changements +### Traduction francophone des principaux changements * export: ajout d'un regroupement "grouper les échanges par présence de l'usager"; * export: ajout d'un filtre "filtre les échanges par présence de l'usager"; * export: ajout d'un regroupement "regrouper les échanges par personne" (seulement pour les échanges enregistrés dans le contexte de l'usager); diff --git a/.changes/v2.12.1.md b/.changes/v2.12.1.md new file mode 100644 index 000000000..50788fb94 --- /dev/null +++ b/.changes/v2.12.1.md @@ -0,0 +1,3 @@ +## v2.12.1 - 2023-11-16 +### Fixed +* ([#208](https://gitlab.com/Chill-Projet/chill-bundles/-/issues/208)) Export: fix loading of form for "filter action by type, goal and result" From 89e19502d37f545e899d7ee2110f86ac1ddee8fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 11:53:57 +0100 Subject: [PATCH 35/84] Export: in filter "Filter accompanying period work (social action) by type, goal and result", order the items alphabetically or with the defined order --- .../unreleased/Feature-20231116-115315.yaml | 6 +++++ .../vuejs/ExportFormActionGoalResult/App.vue | 27 +++++++++++++++++-- .../Normalizer/SocialIssueNormalizer.php | 1 + 3 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 .changes/unreleased/Feature-20231116-115315.yaml diff --git a/.changes/unreleased/Feature-20231116-115315.yaml b/.changes/unreleased/Feature-20231116-115315.yaml new file mode 100644 index 000000000..c63dec5f8 --- /dev/null +++ b/.changes/unreleased/Feature-20231116-115315.yaml @@ -0,0 +1,6 @@ +kind: Feature +body: 'Export: in filter "Filter accompanying period work (social action) by type, + goal and result", order the items alphabetically or with the defined order' +time: 2023-11-16T11:53:15.32989153+01:00 +custom: + Issue: "161" diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue index 322ee3750..235fae90b 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue @@ -14,7 +14,7 @@ :multiple="true" :close-on-select="false" :placeholder="$t('action.placeholder')" - label="text" + :custom-label="formatSocialAction" track-by="id" :searchable="true" > @@ -161,9 +161,31 @@ export default { }, methods: { async getSocialActionsList() { - this.actions.options = await getSocialActions(); + let actions = await getSocialActions(); + this.actions.options = actions.toSorted(function (a, b) { + console.log(a, b); + if (a.issue.ordering === b.issue.ordering) { + if (a.ordering === b.ordering) { + return 0; + } + if (a.ordering < b.ordering) { + return -1; + } + return 1; + } + + if (a.issue.ordering < b.issue.ordering) { + return -1; + } + + return 1; + }) }, + formatSocialAction({text, issue}) { + return text + ' (' + issue.text + ')'; + }, + /** * Select/unselect in Action Multiselect * @param value @@ -263,6 +285,7 @@ export default { if (dump.length > 0) { //console.log('push ' + dump.length + ' elems in', target, dump); } + data.sort(); }, /** diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php index a2f69624d..778336d2b 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/SocialIssueNormalizer.php @@ -35,6 +35,7 @@ class SocialIssueNormalizer implements ContextAwareNormalizerInterface, Normaliz 'children_ids' => $socialIssue->getChildren()->map(static fn (SocialIssue $si) => $si->getId()), 'title' => $socialIssue->getTitle(), 'text' => $this->render->renderString($socialIssue, []), + 'ordering' => $socialIssue->getOrdering(), ]; case 'docgen': From 53b47476974e27123c42ec4e43abc14e04108c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 11:55:15 +0100 Subject: [PATCH 36/84] fixup! Export: in filter "Filter accompanying period work (social action) by type, goal and result", order the items alphabetically or with the defined order --- .../Resources/public/vuejs/ExportFormActionGoalResult/App.vue | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue index 235fae90b..0d91bbbf0 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue @@ -163,7 +163,6 @@ export default { async getSocialActionsList() { let actions = await getSocialActions(); this.actions.options = actions.toSorted(function (a, b) { - console.log(a, b); if (a.issue.ordering === b.issue.ordering) { if (a.ordering === b.ordering) { return 0; From eb01c7c203618913fed288d8261b87d48eea9f51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Thu, 16 Nov 2023 14:22:52 +0100 Subject: [PATCH 37/84] Export: on filter "action by type goals, and results", restore the fields when editing a saved export --- .../unreleased/Fixed-20231116-142207.yaml | 6 ++ .../vuejs/ExportFormActionGoalResult/App.vue | 97 ++++++++++++------- .../vuejs/ExportFormActionGoalResult/api.js | 20 +--- 3 files changed, 71 insertions(+), 52 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231116-142207.yaml diff --git a/.changes/unreleased/Fixed-20231116-142207.yaml b/.changes/unreleased/Fixed-20231116-142207.yaml new file mode 100644 index 000000000..9f3d927ef --- /dev/null +++ b/.changes/unreleased/Fixed-20231116-142207.yaml @@ -0,0 +1,6 @@ +kind: Fixed +body: 'Export: on filter "action by type goals, and results", restore the fields when + editing a saved export' +time: 2023-11-16T14:22:07.968973002+01:00 +custom: + Issue: "141" diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue index 0d91bbbf0..3c91a5f40 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/App.vue @@ -150,14 +150,40 @@ export default { } }, }, - mounted() { - this.getSocialActionsList(); + async mounted() { + await this.getSocialActionsList(); - this.actions.hiddenField.value = ''; - this.goals.hiddenField.value = ''; - this.results.hiddenField.value = ''; + if ('' !== this.actions.hiddenField.value) { + const actionIds = this.actions.hiddenField.value.split(','); + for (const aid of actionIds) { + let action = this.actions.options.find(a => Number.parseInt(aid) === a.id); + if (undefined !== action) { + this.action.push(action); + await this.selectAction(action); + } + } + } - //console.log(this.actions.hiddenField, this.goals.hiddenField, this.results.hiddenField); + if ('' !== this.goals.hiddenField.value) { + const goalsIds = this.goals.hiddenField.value.split(',').map(s => Number.parseInt(s)); + for (const gid of goalsIds) { + let goal = this.goals.options.find(g => gid === g.id); + if (undefined !== goal) { + this.goal.push(goal); + await this.selectGoal(goal); + } + } + } + + if ('' !== this.results.hiddenField.value) { + const resultsIds = this.results.hiddenField.value.split(',').map(s => Number.parseInt(s)); + for (const rid of resultsIds) { + let result = this.results.options.find(r => rid === r.id); + if (undefined !== result) { + this.result.push(result); + } + } + } }, methods: { async getSocialActionsList() { @@ -179,6 +205,8 @@ export default { return 1; }) + + return Promise.resolve(); }, formatSocialAction({text, issue}) { @@ -189,54 +217,51 @@ export default { * Select/unselect in Action Multiselect * @param value */ - selectAction(value) { + async selectAction(value) { //console.log('----'); console.log('select action', value.id); let children = this.getChildrensFromParent(value); this.addSelectedElement('actions', children); let parentAndChildren = [...[value], ...children]; + const promises = []; parentAndChildren.forEach(elem => { - getGoalByAction(elem.id).then(response => new Promise((resolve, reject) => { - this.addElementInData('goals', response.results); - resolve(); - })).catch; - getResultByAction(elem.id).then(response => new Promise((resolve, reject) => { - this.addElementInData('results', response.results); - resolve(); - })).catch; + promises.push(getGoalByAction(elem.id).then(goals => { + this.addElementInData('goals', goals); + return Promise.resolve(); + })); + promises.push(getResultByAction(elem.id).then(results => { + this.addElementInData('results', results); + return Promise.resolve(); + })); }); + + await Promise.all(promises); + return Promise.resolve(); }, unselectAction(value) { - //console.log('----'); console.log('unselect action', value.id); - getGoalByAction(value.id).then(response => new Promise((resolve, reject) => { - [ this.goals.options, this.goals.value ] = this.removeElementInData('goals', response.results); - resolve(); - })).catch; - getResultByAction(value.id).then(response => new Promise((resolve, reject) => { - [ this.results.options, this.results.value ] = this.removeElementInData('results', response.results); - resolve(); - })).catch; + getGoalByAction(value.id).then(goals => { + [this.results.options, this.results.value ] = this.removeElementInData('goals', goals); + }); + getResultByAction(value.id).then(results => { + [this.results.options, this.results.value ] = this.removeElementInData('results', results); + }); }, /** * Select/unselect in Goal Multiselect * @param value */ - selectGoal(value) { - //console.log('----'); console.log('select goal', value.id); - getResultByGoal(value.id).then(response => new Promise((resolve, reject) => { - this.addElementInData('results', response.results); - resolve(); - })).catch; + async selectGoal(value) { + return getResultByGoal(value.id).then(results => { + this.addElementInData('results', results); + }) }, unselectGoal(value) { - //console.log('----'); console.log('unselect goal', value.id); - getResultByGoal(value.id).then(response => new Promise((resolve, reject) => { - [ this.results.options, this.results.value ] = this.removeElementInData('results', response.results); - resolve(); - })).catch; + getResultByGoal(value.id).then(results => { + [ this.results.options, this.results.value ] = this.removeElementInData('results', results); + }).catch; }, /** @@ -284,7 +309,7 @@ export default { if (dump.length > 0) { //console.log('push ' + dump.length + ' elems in', target, dump); } - data.sort(); + data.options.sort(); }, /** diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/api.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/api.js index afcece4f4..0c02c21f0 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/api.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/ExportFormActionGoalResult/api.js @@ -8,29 +8,17 @@ const getSocialActions = () => fetchResults( const getGoalByAction = (id) => { let url = `/api/1.0/person/social-work/goal/by-social-action/${id}.json`; - return fetch(url) - .then(response => { - if (response.ok) { return response.json(); } - throw Error('Error with request resource response'); - }); + return fetchResults(url); }; const getResultByAction = (id) => { let url = `/api/1.0/person/social-work/result/by-social-action/${id}.json`; - return fetch(url) - .then(response => { - if (response.ok) { return response.json(); } - throw Error('Error with request resource response'); - }); + return fetchResults(url); }; const getResultByGoal = (id) => { let url = `/api/1.0/person/social-work/result/by-goal/${id}.json`; - return fetch(url) - .then(response => { - if (response.ok) { return response.json(); } - throw Error('Error with request resource response'); - }); + return fetchResults(url); }; export { @@ -38,4 +26,4 @@ export { getGoalByAction, getResultByAction, getResultByGoal, -} \ No newline at end of file +} From be57c96a2f23bee1ff1e31646a3b430973c33b42 Mon Sep 17 00:00:00 2001 From: LenaertsJ Date: Thu, 16 Nov 2023 15:12:12 +0000 Subject: [PATCH 38/84] Add phonenumber to user --- .../unreleased/Feature-20231116-150900.yaml | 6 + .../Controller/UserProfileController.php | 65 ++++++++ src/Bundle/ChillMainBundle/Entity/User.php | 23 +++ .../Form/UserPhonenumberType.php | 36 +++++ src/Bundle/ChillMainBundle/Form/UserType.php | 4 + .../Resources/views/User/profile.html.twig | 58 ++++++++ .../Routing/MenuBuilder/UserMenuBuilder.php | 8 + .../Serializer/Normalizer/UserNormalizer.php | 9 +- .../Controller/UserProfileControllerTest.php | 33 +++++ .../Normalizer/UserNormalizerTest.php | 140 ++++++++++++++++++ .../migrations/Version20231020075524.php | 37 +++++ .../translations/messages.fr.yml | 7 + .../translations/messages.nl.yml | 7 + 13 files changed, 432 insertions(+), 1 deletion(-) create mode 100644 .changes/unreleased/Feature-20231116-150900.yaml create mode 100644 src/Bundle/ChillMainBundle/Controller/UserProfileController.php create mode 100644 src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php create mode 100644 src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig create mode 100644 src/Bundle/ChillMainBundle/Tests/Controller/UserProfileControllerTest.php create mode 100644 src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/UserNormalizerTest.php create mode 100644 src/Bundle/ChillMainBundle/migrations/Version20231020075524.php diff --git a/.changes/unreleased/Feature-20231116-150900.yaml b/.changes/unreleased/Feature-20231116-150900.yaml new file mode 100644 index 000000000..9d4c134d6 --- /dev/null +++ b/.changes/unreleased/Feature-20231116-150900.yaml @@ -0,0 +1,6 @@ +kind: Feature +body: Allow user to add a phonenumber to their profile which will be included in automatically + generated documents +time: 2023-11-16T15:09:00.369359598+01:00 +custom: + Issue: "173" diff --git a/src/Bundle/ChillMainBundle/Controller/UserProfileController.php b/src/Bundle/ChillMainBundle/Controller/UserProfileController.php new file mode 100644 index 000000000..52aba1a48 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Controller/UserProfileController.php @@ -0,0 +1,65 @@ +getUser(); + $editForm = $this->createPhonenumberEditForm($user); + $editForm->handleRequest($request); + + if ($editForm->isSubmitted() && $editForm->isValid()) { + $phonenumber = $editForm->get('phonenumber')->getData(); + + $user->setPhonenumber($phonenumber); + + $this->getDoctrine()->getManager()->flush(); + $this->addFlash('success', $this->translator->trans('user.profile.Phonenumber successfully updated!')); + + return $this->redirectToRoute('chill_main_user_profile'); + } + + return $this->render('@ChillMain/User/profile.html.twig', [ + 'user' => $user, + 'form' => $editForm->createView(), + ]); + } + + private function createPhonenumberEditForm(UserInterface $user): FormInterface + { + return $this->createForm( + UserPhonenumberType::class, + $user, + ) + ->add('submit', SubmitType::class, ['label' => $this->translator->trans('Save')]); + } +} diff --git a/src/Bundle/ChillMainBundle/Entity/User.php b/src/Bundle/ChillMainBundle/Entity/User.php index 01655fa3d..23dfe6926 100644 --- a/src/Bundle/ChillMainBundle/Entity/User.php +++ b/src/Bundle/ChillMainBundle/Entity/User.php @@ -18,9 +18,11 @@ use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Criteria; use Doctrine\Common\Collections\Selectable; use Doctrine\ORM\Mapping as ORM; +use libphonenumber\PhoneNumber; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Serializer\Annotation as Serializer; use Symfony\Component\Validator\Context\ExecutionContextInterface; +use Chill\MainBundle\Validation\Constraint\PhonenumberConstraint; /** * User. @@ -161,6 +163,15 @@ class User implements UserInterface, \Stringable */ private ?string $usernameCanonical = null; + /** + * The user's mobile phone number. + * + * @ORM\Column(type="phone_number", nullable=true) + * + * @PhonenumberConstraint() + */ + private ?PhoneNumber $phonenumber = null; + /** * User constructor. */ @@ -419,6 +430,11 @@ class User implements UserInterface, \Stringable } } + public function getPhonenumber(): ?PhoneNumber + { + return $this->phonenumber; + } + /** * @throws \RuntimeException if the groupCenter is not in the collection */ @@ -639,4 +655,11 @@ class User implements UserInterface, \Stringable return $this; } + + public function setPhonenumber(?PhoneNumber $phonenumber): self + { + $this->phonenumber = $phonenumber; + + return $this; + } } diff --git a/src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php b/src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php new file mode 100644 index 000000000..579829b84 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Form/UserPhonenumberType.php @@ -0,0 +1,36 @@ +add('phonenumber', ChillPhoneNumberType::class, [ + 'required' => false, + ]); + } + + public function configureOptions(OptionsResolver $resolver) + { + $resolver->setDefaults([ + 'data_class' => User::class, + ]); + } +} diff --git a/src/Bundle/ChillMainBundle/Form/UserType.php b/src/Bundle/ChillMainBundle/Form/UserType.php index cb5e05c13..9d62fbc6a 100644 --- a/src/Bundle/ChillMainBundle/Form/UserType.php +++ b/src/Bundle/ChillMainBundle/Form/UserType.php @@ -16,6 +16,7 @@ use Chill\MainBundle\Entity\Location; use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Form\Type\ChillDateType; +use Chill\MainBundle\Form\Type\ChillPhoneNumberType; use Chill\MainBundle\Form\Type\PickCivilityType; use Chill\MainBundle\Templating\TranslatableStringHelper; use Doctrine\ORM\EntityRepository; @@ -44,6 +45,9 @@ class UserType extends AbstractType ->add('email', EmailType::class, [ 'required' => true, ]) + ->add('phonenumber', ChillPhoneNumberType::class, [ + 'required' => false, + ]) ->add('label', TextType::class) ->add('civility', PickCivilityType::class, [ 'required' => false, diff --git a/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig b/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig new file mode 100644 index 000000000..360d748a5 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Resources/views/User/profile.html.twig @@ -0,0 +1,58 @@ +{# +* Copyright (C) 2014-2015, 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 "@ChillMain/layout.html.twig" %} + + +{% block title %}{{"My profile"|trans}}{% endblock %} + +{% block content %} +
+

{{ 'user.profile.title'|trans }}

+ + +
+
{{ 'Job'|trans }}
+ {% if user.getUserJob is not null %} +
{{ user.getUserJob.label|localize_translatable_string }}
+ {% else %} +
{{ 'user.profile.no job'|trans }}
+ {% endif %} +
{{ 'Scope'|trans }}
+ {% if user.getMainScope is not null %} +
{{ user.getMainScope.name|localize_translatable_string }}
+ {% else %} +
{{ 'user.profile.no scope'|trans }}
+ {% endif %} +
+
+ {{ form_start(form) }} + {{ form_row(form.phonenumber) }} + +
    +
  • + {{ form_widget(form.submit, { 'attr': { 'class': 'btn btn-save' } } ) }} +
  • +
+ + {{ form_end(form) }} +
+
+ +{% endblock %} diff --git a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php index 2c28ff2e8..3427face3 100644 --- a/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php +++ b/src/Bundle/ChillMainBundle/Routing/MenuBuilder/UserMenuBuilder.php @@ -29,6 +29,14 @@ class UserMenuBuilder implements LocalMenuBuilderInterface $user = $this->security->getUser(); if ($user instanceof User) { + $menu->addChild($this->translator->trans('user.profile.title'), [ + 'route' => 'chill_main_user_profile', + ]) + ->setExtras([ + 'order' => -11_111_111, + 'icon' => 'user', + ]); + if (null !== $user->getCurrentLocation()) { $locationTextMenu = $user->getCurrentLocation()->getName(); } else { diff --git a/src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php b/src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php index 8a80f1492..55a887001 100644 --- a/src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php +++ b/src/Bundle/ChillMainBundle/Serializer/Normalizer/UserNormalizer.php @@ -18,6 +18,7 @@ use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Templating\Entity\UserRender; +use libphonenumber\PhoneNumber; use Symfony\Component\Serializer\Normalizer\ContextAwareNormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; @@ -34,6 +35,7 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware 'text_without_absent' => '', 'label' => '', 'email' => '', + 'isAbsent' => false, ]; public function __construct(private readonly UserRender $userRender) {} @@ -61,9 +63,13 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware $context, ['docgen:expects' => Civility::class, 'groups' => 'docgen:read'] ); + $phonenumberContext = array_merge( + $context, + ['docgen:expects' => PhoneNumber::class, 'groups' => 'docgen:read'] + ); if (null === $object && 'docgen' === $format) { - return [...self::NULL_USER, 'civility' => $this->normalizer->normalize(null, $format, $civilityContext), 'user_job' => $this->normalizer->normalize(null, $format, $userJobContext), 'main_center' => $this->normalizer->normalize(null, $format, $centerContext), 'main_scope' => $this->normalizer->normalize(null, $format, $scopeContext), 'current_location' => $this->normalizer->normalize(null, $format, $locationContext), 'main_location' => $this->normalizer->normalize(null, $format, $locationContext)]; + return [...self::NULL_USER, 'phonenumber' => $this->normalizer->normalize(null, $format, $phonenumberContext), 'civility' => $this->normalizer->normalize(null, $format, $civilityContext), 'user_job' => $this->normalizer->normalize(null, $format, $userJobContext), 'main_center' => $this->normalizer->normalize(null, $format, $centerContext), 'main_scope' => $this->normalizer->normalize(null, $format, $scopeContext), 'current_location' => $this->normalizer->normalize(null, $format, $locationContext), 'main_location' => $this->normalizer->normalize(null, $format, $locationContext)]; } $data = [ @@ -74,6 +80,7 @@ class UserNormalizer implements ContextAwareNormalizerInterface, NormalizerAware 'text_without_absent' => $this->userRender->renderString($object, ['absence' => false]), 'label' => $object->getLabel(), 'email' => (string) $object->getEmail(), + 'phonenumber' => $this->normalizer->normalize($object->getPhonenumber(), $format, $phonenumberContext), 'user_job' => $this->normalizer->normalize($object->getUserJob(), $format, $userJobContext), 'main_center' => $this->normalizer->normalize($object->getMainCenter(), $format, $centerContext), 'main_scope' => $this->normalizer->normalize($object->getMainScope(), $format, $scopeContext), diff --git a/src/Bundle/ChillMainBundle/Tests/Controller/UserProfileControllerTest.php b/src/Bundle/ChillMainBundle/Tests/Controller/UserProfileControllerTest.php new file mode 100644 index 000000000..fd7fd6028 --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Controller/UserProfileControllerTest.php @@ -0,0 +1,33 @@ +getClientAuthenticated(); + + $client->request('GET', '/fr/main/user/my-profile'); + $this->assertResponseIsSuccessful('Request GET /main/user/my-profile was successful'); + } +} diff --git a/src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/UserNormalizerTest.php b/src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/UserNormalizerTest.php new file mode 100644 index 000000000..123f1c3ae --- /dev/null +++ b/src/Bundle/ChillMainBundle/Tests/Serializer/Normalizer/UserNormalizerTest.php @@ -0,0 +1,140 @@ +setUsername('SomeUser') + ->setLabel('SomeUser') + ->setPhonenumber(PhoneNumberUtil::getInstance()->parse('+32475928635')) + ->setEmail('some.user@chill.com'); + + $userNoPhone + ->setUsername('AnotherUser') + ->setLabel('AnotherUser'); + + yield [$user, 'docgen', ['docgen:expects' => User::class], + [ + 'id' => $user->getId(), // id + 'type' => 'user', // type + 'username' => 'SomeUser', // username + 'email' => 'some.user@chill.com', // email + 'text' => 'SomeUser', // text + 'label' => 'SomeUser', // label + 'phonenumber' => ['context' => PhoneNumber::class], // phonenumber + 'main_scope' => ['context' => Scope::class], // scope + 'user_job' => ['context' => UserJob::class], // user job + 'current_location' => ['context' => Location::class], // curent location + 'main_location' => ['context' => Location::class], // main location + 'civility' => ['context' => Civility::class], // civility + 'text_without_absent' => 'SomeUser', + 'isAbsent' => false, + 'main_center' => ['context' => Center::class], + ]]; + + yield [$userNoPhone, 'docgen', ['docgen:expects' => User::class], + [ + 'id' => $user->getId(), // id + 'type' => 'user', // type + 'username' => 'AnotherUser', // username + 'email' => '', // email + 'text' => 'AnotherUser', // text + 'label' => 'AnotherUser', // label + 'phonenumber' => ['context' => PhoneNumber::class], // phonenumber + 'main_scope' => ['context' => Scope::class], // scope + 'user_job' => ['context' => UserJob::class], // user job + 'current_location' => ['context' => Location::class], // curent location + 'main_location' => ['context' => Location::class], // main location + 'civility' => ['context' => Civility::class], // civility + 'text_without_absent' => 'AnotherUser', + 'isAbsent' => false, + 'main_center' => ['context' => Center::class], + ]]; + + yield [null, 'docgen', ['docgen:expects' => User::class], [ + 'id' => '', // id + 'type' => 'user', // type + 'username' => '', // username + 'email' => '', // email + 'text' => '', // text + 'label' => '', // label + 'phonenumber' => ['context' => PhoneNumber::class], // phonenumber + 'main_scope' => ['context' => Scope::class], // scope + 'user_job' => ['context' => UserJob::class], // user job + 'current_location' => ['context' => Location::class], // curent location + 'main_location' => ['context' => Location::class], // main location + 'civility' => ['context' => Civility::class], // civility + 'text_without_absent' => '', + 'isAbsent' => false, + 'main_center' => ['context' => Center::class], + ]]; + } + + /** + * @dataProvider dataProviderUserNormalizer + * + * @throws ExceptionInterface + */ + public function testNormalize(null|User $user, mixed $format, mixed $context, mixed $expected) + { + $userRender = $this->prophesize(UserRender::class); + $userRender->renderString(Argument::type(User::class), Argument::type('array'))->willReturn($user ? $user->getLabel() : ''); + + $normalizer = new UserNormalizer($userRender->reveal()); + $normalizer->setNormalizer(new class () implements NormalizerInterface { + public function normalize($object, string $format = null, array $context = []) + { + return ['context' => $context['docgen:expects'] ?? null]; + } + + public function supportsNormalization($data, string $format = null) + { + return true; + } + }); + + $this->assertEquals($expected, $normalizer->normalize($user, $format, $context)); + } +} diff --git a/src/Bundle/ChillMainBundle/migrations/Version20231020075524.php b/src/Bundle/ChillMainBundle/migrations/Version20231020075524.php new file mode 100644 index 000000000..5ae44d9bd --- /dev/null +++ b/src/Bundle/ChillMainBundle/migrations/Version20231020075524.php @@ -0,0 +1,37 @@ +addSql('ALTER TABLE users ADD phonenumber VARCHAR(35) DEFAULT NULL'); + $this->addSql('COMMENT ON COLUMN users.phonenumber IS \'(DC2Type:phone_number)\''); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE users DROP phonenumber'); + } +} diff --git a/src/Bundle/ChillMainBundle/translations/messages.fr.yml b/src/Bundle/ChillMainBundle/translations/messages.fr.yml index 28615bc75..91068275f 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.fr.yml @@ -44,6 +44,13 @@ address_fields: Données liées à l'adresse Datas: Données No title: Aucun titre +user: + profile: + title: Mon profil + Phonenumber successfully updated!: Numéro de téléphone mis à jour! + no job: Pas de métier assigné + no scope: Pas de cercle assigné + inactive: inactif Edit: Modifier diff --git a/src/Bundle/ChillMainBundle/translations/messages.nl.yml b/src/Bundle/ChillMainBundle/translations/messages.nl.yml index 2e4ee5a88..cd6cbc6a4 100644 --- a/src/Bundle/ChillMainBundle/translations/messages.nl.yml +++ b/src/Bundle/ChillMainBundle/translations/messages.nl.yml @@ -39,6 +39,13 @@ Last updated by: Laatste update door on: "op " Last updated on: Laatste update op by_user: "door " +lifecycleUpdate: Updates en creatie gebeurtenissen +address_fields: Gegevens gelinked aan het adres +Datas: Gegevens +No title: Geen titel +User profile: Mijn gebruikersprofiel +Phonenumber successfully updated!: Telefoonnummer bijgewerkt! + Edit: Bewerken Update: Updaten From b05ed86d1e04bb12bbb8a0c9fbe46cc93e575f69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 20 Nov 2023 18:06:55 +0100 Subject: [PATCH 39/84] DX: Fix aggregator: "group activity by type" --- .changes/unreleased/Fixed-20231120-174603.yaml | 5 +++++ .../Export/Aggregator/ActivityTypeAggregator.php | 9 ++------- 2 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231120-174603.yaml diff --git a/.changes/unreleased/Fixed-20231120-174603.yaml b/.changes/unreleased/Fixed-20231120-174603.yaml new file mode 100644 index 000000000..0d8b80652 --- /dev/null +++ b/.changes/unreleased/Fixed-20231120-174603.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix loading of "Group activity by type"' +time: 2023-11-20T17:46:03.999758401+01:00 +custom: + Issue: "211" diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php index fa658635b..2c7891dd6 100644 --- a/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/ActivityTypeAggregator.php @@ -56,20 +56,15 @@ class ActivityTypeAggregator implements AggregatorInterface public function getLabels($key, array $values, $data): \Closure { - // for performance reason, we load data from db only once - $this->activityTypeRepository->findBy(['id' => $values]); - - return function ($value): string { + return function (null|int|string $value): string { if ('_header' === $value) { return 'Activity type'; } - if (null === $value || '' === $value) { + if (null === $value || '' === $value || null === $t = $this->activityTypeRepository->find($value)) { return ''; } - $t = $this->activityTypeRepository->find($value); - return $this->translatableStringHelper->localize($t->getName()); }; } From 2883e085edad1be325e31106eb44f61022e3d588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 20 Nov 2023 18:07:06 +0100 Subject: [PATCH 40/84] DX: Fix aggregator: "group activity by reason" --- .changes/unreleased/Fixed-20231120-174952.yaml | 5 +++++ .../PersonAggregators/ActivityReasonAggregator.php | 6 ------ 2 files changed, 5 insertions(+), 6 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231120-174952.yaml diff --git a/.changes/unreleased/Fixed-20231120-174952.yaml b/.changes/unreleased/Fixed-20231120-174952.yaml new file mode 100644 index 000000000..a10817f0f --- /dev/null +++ b/.changes/unreleased/Fixed-20231120-174952.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix loading of "group activity by reasons"' +time: 2023-11-20T17:49:52.416508936+01:00 +custom: + Issue: "190" diff --git a/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php index 4b1f4894e..f0364bf8e 100644 --- a/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php +++ b/src/Bundle/ChillActivityBundle/Export/Aggregator/PersonAggregators/ActivityReasonAggregator.php @@ -99,12 +99,6 @@ class ActivityReasonAggregator implements AggregatorInterface, ExportElementVali public function getLabels($key, array $values, $data) { - match ($data['level']) { - 'reasons' => $this->activityReasonRepository->findBy(['id' => $values]), - 'categories' => $this->activityReasonCategoryRepository->findBy(['id' => $values]), - default => throw new \RuntimeException(sprintf("The level data '%s' is invalid.", $data['level'])), - }; - return function ($value) use ($data) { if ('_header' === $value) { return 'reasons' === $data['level'] ? 'Group by reasons' : 'Group by categories of reason'; From d0bceb59dcc116cabbec9564343837a6e2048daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 20 Nov 2023 18:15:53 +0100 Subject: [PATCH 41/84] Export: fix usage of some Collection returned instead of array in export filters --- .changes/unreleased/Fixed-20231120-181130.yaml | 5 +++++ .../HouseholdAggregators/ChildrenNumberAggregator.php | 4 ++-- .../Filter/AccompanyingCourseFilters/CreatorFilter.php | 9 ++++++++- .../GeographicalUnitStatFilter.php | 6 +++++- .../HandlingThirdPartyFilter.php | 6 +++++- .../JobWorkingOnCourseFilter.php | 3 ++- .../ScopeWorkingOnCourseFilter.php | 3 ++- .../AccompanyingCourseFilters/StepFilterBetweenDates.php | 6 +++++- .../AccompanyingCourseFilters/StepFilterOnDate.php | 6 +++++- .../UserWorkingOnCourseFilter.php | 3 ++- .../PersonFilters/ByHouseholdCompositionFilter.php | 3 ++- .../Filter/PersonFilters/GeographicalUnitFilter.php | 3 ++- .../Export/Filter/SocialWorkFilters/CreatorFilter.php | 9 ++++++++- 13 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 .changes/unreleased/Fixed-20231120-181130.yaml diff --git a/.changes/unreleased/Fixed-20231120-181130.yaml b/.changes/unreleased/Fixed-20231120-181130.yaml new file mode 100644 index 000000000..2d79fecbc --- /dev/null +++ b/.changes/unreleased/Fixed-20231120-181130.yaml @@ -0,0 +1,5 @@ +kind: Fixed +body: 'Export: fix usage of some Collection returned instead of array in export filters' +time: 2023-11-20T18:11:30.290242917+01:00 +custom: + Issue: "213" diff --git a/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php b/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php index cea3de7dd..e013c2f0f 100644 --- a/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php +++ b/src/Bundle/ChillPersonBundle/Export/Aggregator/HouseholdAggregators/ChildrenNumberAggregator.php @@ -70,7 +70,7 @@ class ChildrenNumberAggregator implements AggregatorInterface public function getLabels($key, array $values, $data) { - return static function ($value): string { + return static function (int|string|null $value): string { if ('_header' === $value) { return 'Number of children'; } @@ -79,7 +79,7 @@ class ChildrenNumberAggregator implements AggregatorInterface return ''; } - return $value; + return (string) $value; }; } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php index a73f82f69..4fa2c2d1d 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php @@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickUserDynamicType; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -59,7 +60,13 @@ class CreatorFilter implements FilterInterface { return [ 'Filtered by creator: only %creators%', [ - '%creators%' => implode(', ', array_map(static fn (User $u) => $u->getLabel(), $data['accepted_creators'])), + '%creators%' => implode( + ', ', + array_map( + static fn (User $u) => $u->getLabel(), + $data['accepted_creators'] instanceof Collection ? $data['accepted_creators']->toArray() : $data['accepted_creators'] + ) + ), ], ]; } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php index 695831f9c..3b1183c99 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/GeographicalUnitStatFilter.php @@ -23,6 +23,7 @@ use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; @@ -68,7 +69,10 @@ class GeographicalUnitStatFilter implements FilterInterface 'acp_geog_filter_date', $this->rollingDateConverter->convert($data['date_calc']) ) - ->setParameter('acp_geog_filter_units', array_map(static fn (SimpleGeographicalUnitDTO $unitDTO) => $unitDTO->id, $data['units'])); + ->setParameter('acp_geog_filter_units', array_map( + static fn (SimpleGeographicalUnitDTO $unitDTO) => $unitDTO->id, + $data['units'] instanceof Collection ? $data['units']->toArray() : $data['units'] + )); } public function applyOn(): string diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HandlingThirdPartyFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HandlingThirdPartyFilter.php index 80bc7b04a..8a9f734aa 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HandlingThirdPartyFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/HandlingThirdPartyFilter.php @@ -16,6 +16,7 @@ use Chill\PersonBundle\Export\Declarations; use Chill\ThirdPartyBundle\Entity\ThirdParty; use Chill\ThirdPartyBundle\Form\Type\PickThirdpartyDynamicType; use Chill\ThirdPartyBundle\Templating\Entity\ThirdPartyRender; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -52,7 +53,10 @@ final readonly class HandlingThirdPartyFilter implements FilterInterface [ '%3parties%' => implode( ', ', - array_map(fn (ThirdParty $thirdParty) => $this->thirdPartyRender->renderString($thirdParty, []), $data['handling_3parties']) + array_map( + fn (ThirdParty $thirdParty) => $this->thirdPartyRender->renderString($thirdParty, []), + $data['handling_3parties'] instanceof Collection ? $data['handling_3parties']->toArray() : $data['handling_3parties'] + ) ), ], ]; diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/JobWorkingOnCourseFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/JobWorkingOnCourseFilter.php index 5f0cf373b..099320c95 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/JobWorkingOnCourseFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/JobWorkingOnCourseFilter.php @@ -21,6 +21,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; @@ -115,7 +116,7 @@ readonly class JobWorkingOnCourseFilter implements FilterInterface ', ', array_map( fn (UserJob $userJob) => $this->translatableStringHelper->localize($userJob->getLabel()), - $data['jobs'] + $data['jobs'] instanceof Collection ? $data['jobs']->toArray() : $data['jobs'] ) ), '%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ScopeWorkingOnCourseFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ScopeWorkingOnCourseFilter.php index 36ec27357..403ddd0b5 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ScopeWorkingOnCourseFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ScopeWorkingOnCourseFilter.php @@ -21,6 +21,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodInfo; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormBuilderInterface; @@ -110,7 +111,7 @@ readonly class ScopeWorkingOnCourseFilter implements FilterInterface ', ', array_map( fn (Scope $scope) => $this->translatableStringHelper->localize($scope->getName()), - $data['scopes'] + $data['scopes'] instanceof Collection ? $data['scopes']->toArray() : $data['scopes'] ) ), '%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterBetweenDates.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterBetweenDates.php index 9d49f820b..dfd627eda 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterBetweenDates.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterBetweenDates.php @@ -17,6 +17,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; @@ -98,7 +99,10 @@ class StepFilterBetweenDates implements FilterInterface public function describeAction($data, $format = 'string') { - $steps = array_map(fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), $data['accepted_steps_multi']); + $steps = array_map( + fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), + $data['accepted_steps_multi'] instanceof Collection ? $data['accepted_steps_multi']->toArray() : $data['accepted_steps_multi'] + ); return ['export.filter.course.by_step.Filtered by steps: only %step% and between %date_from% and %date_to%', [ '%step%' => implode(', ', $steps), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterOnDate.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterOnDate.php index 66355e44d..8b36b1b5b 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterOnDate.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/StepFilterOnDate.php @@ -17,6 +17,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; @@ -101,7 +102,10 @@ class StepFilterOnDate implements FilterInterface public function describeAction($data, $format = 'string') { - $steps = array_map(fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), $data['accepted_steps_multi']); + $steps = array_map( + fn (string $step) => $this->translator->trans(array_flip(self::STEPS)[$step]), + $data['accepted_steps_multi'] instanceof Collection ? $data['accepted_steps_multi']->toArray() : $data['accepted_steps_multi'] + ); return ['Filtered by steps: only %step%', [ '%step%' => implode(', ', $steps), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php index 42bb7dea3..85d5db9d6 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php @@ -20,6 +20,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Templating\Entity\UserRender; use Chill\PersonBundle\Entity\AccompanyingPeriod; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -72,7 +73,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface ', ', array_map( fn (User $u) => $this->userRender->renderString($u, []), - $data['users'] + $data['users'] instanceof Collection ? $data['users']->toArray() : $data['users'] ) ), '%start_date%' => $this->rollingDateConverter->convert($data['start_date'])?->format('d-m-Y'), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ByHouseholdCompositionFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ByHouseholdCompositionFilter.php index fdd799ab9..e873a6598 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ByHouseholdCompositionFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/ByHouseholdCompositionFilter.php @@ -21,6 +21,7 @@ use Chill\PersonBundle\Entity\Household\HouseholdCompositionType; use Chill\PersonBundle\Entity\Household\HouseholdMember; use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Repository\Household\HouseholdCompositionTypeRepositoryInterface; +use Doctrine\Common\Collections\Collection; use Doctrine\DBAL\Types\Types; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; @@ -84,7 +85,7 @@ class ByHouseholdCompositionFilter implements FilterInterface { $compos = array_map( fn (HouseholdCompositionType $compositionType) => $this->translatableStringHelper->localize($compositionType->getLabel()), - $data['compositions']->toArray() + $data['compositions'] instanceof Collection ? $data['compositions']->toArray() : $data['compositions'] ); return ['export.filter.person.by_composition.Filtered by composition at %date%: only %compositions%', [ diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php index d54842b47..e2041c3fa 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/PersonFilters/GeographicalUnitFilter.php @@ -20,6 +20,7 @@ use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\PersonBundle\Entity\Household\PersonHouseholdAddress; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\FormBuilderInterface; @@ -102,7 +103,7 @@ class GeographicalUnitFilter implements \Chill\MainBundle\Export\FilterInterface ', ', array_map( fn (SimpleGeographicalUnitDTO $item) => $this->translatableStringHelper->localize($this->geographicalUnitLayerRepository->find($item->layerId)->getName()).' > '.$item->unitName, - $data['units'] + $data['units'] instanceof Collection ? $data['units']->toArray() : $data['units'] ) ), ], diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php index 100bcfdc4..c990e658e 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php @@ -15,6 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickUserDynamicType; use Chill\PersonBundle\Export\Declarations; +use Doctrine\Common\Collections\Collection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; @@ -55,7 +56,13 @@ class CreatorFilter implements FilterInterface { return [ 'export.filter.work.by_creator.Filtered by creator: only %creators%', [ - '%creators%' => implode(', ', array_map(static fn (User $u) => $u->getLabel(), $data['creators'])), + '%creators%' => implode( + ', ', + array_map( + static fn (User $u) => $u->getLabel(), + $data['creators'] instanceof Collection ? $data['creators']->toArray() : $data['creators'] + ) + ), ], ]; } From f609ddb315a5baf0bab8fb4b14489a29744a6f53 Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Tue, 21 Nov 2023 07:58:45 +0100 Subject: [PATCH 42/84] change all instances of neuter to both --- .../Resources/public/vuejs/VisGraph/i18n.js | 2 +- .../public/vuejs/_components/Entity/PersonRenderBox.vue | 6 +++--- .../public/vuejs/_components/OnTheFly/Person.vue | 8 ++++---- .../ChillPersonBundle/Resources/public/vuejs/_js/i18n.js | 2 +- .../Resources/views/Entity/person.html.twig | 4 ++-- src/Bundle/ChillPersonBundle/translations/messages.fr.yml | 4 ++-- src/Bundle/ChillPersonBundle/translations/messages.nl.yml | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/i18n.js b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/i18n.js index cee841d0c..962a2f97d 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/i18n.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/VisGraph/i18n.js @@ -64,7 +64,7 @@ const visMessages = { placeholder: "Choisissez le genre de l'usager", woman: "Féminin", man: "Masculin", - neuter: "Neutre, non binaire", + both: "Neutre, non binaire", undefined: "Non renseigné" } }, diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue index ca9385990..100dc9caf 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/Entity/PersonRenderBox.vue @@ -81,7 +81,7 @@
  • {{ $t('renderbox.no_data') }}

  • - +