diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityUsersFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityUsersFilter.php index ec6b5e3ee..a3c70f9fe 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ActivityUsersFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ActivityUsersFilter.php @@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; use Chill\ActivityBundle\Export\Declarations; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\MainBundle\Templating\Entity\UserRender; use Doctrine\ORM\QueryBuilder; @@ -31,11 +31,11 @@ final readonly class ActivityUsersFilter implements FilterInterface return null; } - public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void + public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void { $orX = $qb->expr()->orX(); - foreach ($data['accepted_users'] as $key => $user) { + foreach ($this->userOrMe($data['accepted_users'], $exportGenerationContext) as $key => $user) { $orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users')); $qb->setParameter('activity_users_filter_u'.$key, $user); } @@ -50,7 +50,7 @@ final readonly class ActivityUsersFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { - $builder->add('accepted_users', PickUserDynamicType::class, [ + $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => 'Users', ]); @@ -63,12 +63,12 @@ final readonly class ActivityUsersFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])]; + return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)]; + return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; } public function getFormDefaultData(): array @@ -80,7 +80,7 @@ final readonly class ActivityUsersFilter implements FilterInterface { $users = []; - foreach ($data['accepted_users'] as $u) { + foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { $users[] = $this->userRender->renderString($u, []); } diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/ByCreatorFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/ByCreatorFilter.php index 184b520c5..bdad045c8 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/ByCreatorFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/ByCreatorFilter.php @@ -37,7 +37,7 @@ class ByCreatorFilter implements FilterInterface ->andWhere( $qb->expr()->in('activity.createdBy', ':users') ) - ->setParameter('users', $data['accepted_users']); + ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); } public function applyOn(): string @@ -47,7 +47,7 @@ class ByCreatorFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { - $builder->add('accepted_users', PickUserDynamicType::class, [ + $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ 'multiple' => true, ]); } @@ -59,12 +59,12 @@ class ByCreatorFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])]; + return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)]; + return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; } public function getFormDefaultData(): array @@ -76,7 +76,7 @@ class ByCreatorFilter implements FilterInterface { $users = []; - foreach ($data['accepted_users'] as $u) { + foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { $users[] = $this->userRender->renderString($u, []); } diff --git a/src/Bundle/ChillActivityBundle/Export/Filter/UserFilter.php b/src/Bundle/ChillActivityBundle/Export/Filter/UserFilter.php index ec4b5ee09..2a63be54a 100644 --- a/src/Bundle/ChillActivityBundle/Export/Filter/UserFilter.php +++ b/src/Bundle/ChillActivityBundle/Export/Filter/UserFilter.php @@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter; use Chill\ActivityBundle\Export\Declarations; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\MainBundle\Templating\Entity\UserRender; use Doctrine\ORM\Query\Expr\Andx; @@ -32,7 +32,7 @@ final readonly class UserFilter implements FilterInterface return null; } - public function alterQuery(QueryBuilder $qb, $data, \Chill\MainBundle\Export\ExportGenerationContext $exportGenerationContext): void + public function alterQuery(QueryBuilder $qb, $data, ExportGenerationContext $exportGenerationContext): void { $where = $qb->getDQLPart('where'); @@ -45,7 +45,7 @@ final readonly class UserFilter implements FilterInterface } $qb->add('where', $where); - $qb->setParameter('users', $data['accepted_users']); + $qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); } public function applyOn(): string @@ -55,7 +55,7 @@ final readonly class UserFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { - $builder->add('accepted_users', PickUserDynamicType::class, [ + $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => 'Creators', ]); @@ -68,12 +68,12 @@ final readonly class UserFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])]; + return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)]; + return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; } public function getFormDefaultData(): array @@ -85,7 +85,7 @@ final readonly class UserFilter implements FilterInterface { $users = []; - foreach ($data['accepted_users'] as $u) { + foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { $users[] = $this->userRender->renderString($u, []); } diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ByCreatorFilterTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ByCreatorFilterTest.php index cbd168ce8..670492695 100644 --- a/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ByCreatorFilterTest.php +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/ByCreatorFilterTest.php @@ -45,14 +45,20 @@ final class ByCreatorFilterTest extends AbstractFilterTest ->from(User::class, 'u') ->select('u') ->getQuery() + ->setMaxResults(1) ->getResult(); $data = []; + foreach ($array as $a) { $data[] = [ 'accepted_users' => $a, ]; } + $data[] = [ + 'accepted_users' => 'me', + ]; + return $data; } diff --git a/src/Bundle/ChillActivityBundle/Tests/Export/Filter/UserFilterTest.php b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/UserFilterTest.php index 569fb5403..976ab97e6 100644 --- a/src/Bundle/ChillActivityBundle/Tests/Export/Filter/UserFilterTest.php +++ b/src/Bundle/ChillActivityBundle/Tests/Export/Filter/UserFilterTest.php @@ -55,6 +55,10 @@ final class UserFilterTest extends AbstractFilterTest ]; } + $data[] = [ + 'accepted_users' => 'me', + ]; + return $data; } diff --git a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserFilter.php b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserFilter.php index 8ab5d103a..04e02d3ff 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserFilter.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserFilter.php @@ -14,7 +14,7 @@ namespace Chill\AsideActivityBundle\Export\Filter; use Chill\AsideActivityBundle\Export\Declarations; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepository; use Chill\MainBundle\Templating\Entity\UserRender; use Doctrine\ORM\QueryBuilder; @@ -37,7 +37,7 @@ final readonly class ByUserFilter implements FilterInterface $qb ->andWhere($clause) - ->setParameter('users', $data['accepted_users']); + ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext)); } public function applyOn(): string @@ -47,7 +47,7 @@ final readonly class ByUserFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { - $builder->add('accepted_users', PickUserDynamicType::class, [ + $builder->add('accepted_users', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => 'Creators', ]); @@ -60,12 +60,12 @@ final readonly class ByUserFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_users' => $this->normalizeDoctrineEntity($formData['accepted_users'])]; + return ['accepted_users' => $this->normalizeUserOrMe($formData['accepted_users'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_users' => $this->denormalizeDoctrineEntity($formData['accepted_users'], $this->userRepository)]; + return ['accepted_users' => $this->denormalizeUserOrMe($formData['accepted_users'], $this->userRepository)]; } public function getFormDefaultData(): array @@ -77,7 +77,7 @@ final readonly class ByUserFilter implements FilterInterface { $users = []; - foreach ($data['accepted_users'] as $u) { + foreach ($this->userOrMe($data['accepted_users'], $context) as $u) { $users[] = $this->userRender->renderString($u, []); } diff --git a/src/Bundle/ChillMainBundle/Export/ExportDataNormalizerTrait.php b/src/Bundle/ChillMainBundle/Export/ExportDataNormalizerTrait.php index 3ff902795..ee9ad2aa9 100644 --- a/src/Bundle/ChillMainBundle/Export/ExportDataNormalizerTrait.php +++ b/src/Bundle/ChillMainBundle/Export/ExportDataNormalizerTrait.php @@ -11,6 +11,8 @@ declare(strict_types=1); namespace Chill\MainBundle\Export; +use Chill\MainBundle\Entity\User; +use Chill\MainBundle\Repository\UserRepositoryInterface; use Doctrine\Common\Collections\Collection; use Doctrine\Persistence\ObjectRepository; @@ -63,6 +65,79 @@ trait ExportDataNormalizerTrait return $object; } + /** + * Normalizer the "user or me" values. + * + * @param 'me'|User|iterable<'me'|User> $user + * + * @return int|'me'|list<'me'|int> + */ + private function normalizeUserOrMe(string|User|iterable $user): int|string|array + { + if (is_iterable($user)) { + $users = []; + foreach ($user as $u) { + $users[] = $this->normalizeUserOrMe($u); + } + + return $users; + } + + if ('me' === $user) { + return $user; + } + + return $user->getId(); + } + + /** + * @param 'me'|int|iterable<'me'|int> $userId + * + * @return 'me'|User|array|null + */ + private function denormalizeUserOrMe(string|int|iterable $userId, UserRepositoryInterface $userRepository): string|User|array|null + { + if (is_iterable($userId)) { + $users = []; + foreach ($userId as $id) { + $users[] = $this->denormalizeUserOrMe($id, $userRepository); + } + + return $users; + } + + if ('me' === $userId) { + return 'me'; + } + + return $userRepository->find($userId); + } + + /** + * @param 'me'|User|iterable<'me'|User> $user + * + * @return User|list + */ + private function userOrMe(string|User|iterable $user, ExportGenerationContext $context): User|array + { + if (is_iterable($user)) { + $users = []; + foreach ($user as $u) { + $users[] = $this->userOrMe($u, $context); + } + + return array_values( + array_filter($users, static fn (?User $user) => null !== $user) + ); + } + + if ('me' === $user) { + return $context->byUser; + } + + return $user; + } + /** * Normalizes a provided date into a specific string format. * diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php index 9a0095ac0..8dc10381a 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/CreatorFilter.php @@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\PersonBundle\Export\Declarations; use Doctrine\Common\Collections\Collection; @@ -40,7 +40,7 @@ final readonly class CreatorFilter implements FilterInterface $qb ->andWhere($qb->expr()->in('acp_creator', ':creators')) - ->setParameter('creators', $data['accepted_creators']); + ->setParameter('creators', $this->userOrMe($data['accepted_creators'], $exportGenerationContext)); } public function applyOn(): string @@ -51,7 +51,7 @@ final readonly class CreatorFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { $builder - ->add('accepted_creators', PickUserDynamicType::class, [ + ->add('accepted_creators', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => false, ]); @@ -64,12 +64,12 @@ final readonly class CreatorFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_creators' => $this->normalizeDoctrineEntity($formData['accepted_creators'])]; + return ['accepted_creators' => $this->normalizeUserOrMe($formData['accepted_creators'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_creators' => $this->denormalizeDoctrineEntity($formData['accepted_creators'], $this->userRepository)]; + return ['accepted_creators' => $this->denormalizeUserOrMe($formData['accepted_creators'], $this->userRepository)]; } public function getFormDefaultData(): array @@ -85,7 +85,7 @@ final readonly class CreatorFilter implements FilterInterface ', ', array_map( static fn (User $u) => $u->getLabel(), - $data['accepted_creators'] instanceof Collection ? $data['accepted_creators']->toArray() : $data['accepted_creators'] + $data['accepted_creators'] instanceof Collection ? $this->userOrMe($data['accepted_creators']->toArray(), $context) : $this->userOrMe($data['accepted_creators'], $context) ) ), ], ]; diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDates.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDates.php index bd2b423c1..929336feb 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDates.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDates.php @@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickRollingDateType; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepository; use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; @@ -68,7 +68,7 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface ->andWhere( "{$history}.user IN (:{$users})", ) - ->setParameter($users, $data['accepted_referrers']) + ->setParameter($users, $this->userOrMe($data['accepted_referrers'], $exportGenerationContext)) ->setParameter($start, $this->rollingDateConverter->convert($data['start_date'])) ->setParameter($end, $this->rollingDateConverter->convert($data['end_date'])); } @@ -81,7 +81,7 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { $builder - ->add('accepted_referrers', PickUserDynamicType::class, [ + ->add('accepted_referrers', PickUserOrMeDynamicType::class, [ 'multiple' => true, ]) ->add('start_date', PickRollingDateType::class, [ @@ -101,12 +101,14 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface public function normalizeFormData(array $formData): array { - return ['accepted_referrers' => $this->normalizeDoctrineEntity($formData['accepted_referrers']), 'start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; + return ['accepted_referrers' => $this->normalizeUserOrMe($formData['accepted_referrers']), + 'start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['accepted_referrers' => $this->denormalizeDoctrineEntity($formData['accepted_referrers'], $this->userRepository), 'start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; + return ['accepted_referrers' => $this->denormalizeUserOrMe($formData['accepted_referrers'], $this->userRepository), + 'start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; } public function getFormDefaultData(): array @@ -122,7 +124,7 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface { $users = []; - foreach ($data['accepted_referrers'] as $r) { + foreach ($this->userOrMe($data['accepted_referrers'], $context) as $r) { $users[] = $this->userRender->renderString($r, []); } diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php index 49227950c..c9ff7adcb 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/AccompanyingCourseFilters/UserWorkingOnCourseFilter.php @@ -15,7 +15,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickRollingDateType; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; @@ -44,7 +44,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { $builder - ->add('users', PickUserDynamicType::class, [ + ->add('users', PickUserOrMeDynamicType::class, [ 'multiple' => true, ]) ->add('start_date', PickRollingDateType::class, [ @@ -63,12 +63,12 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['users' => $this->normalizeDoctrineEntity($formData['users']), 'start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; + return ['users' => $this->normalizeUserOrMe($formData['users']), 'start_date' => $formData['start_date']->normalize(), 'end_date' => $formData['end_date']->normalize()]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['users' => $this->denormalizeDoctrineEntity($formData['users'], $this->userRepository), 'start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; + return ['users' => $this->denormalizeUserOrMe($formData['users'], $this->userRepository), 'start_date' => RollingDate::fromNormalized($formData['start_date']), 'end_date' => RollingDate::fromNormalized($formData['end_date'])]; } public function getFormDefaultData(): array @@ -92,7 +92,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface '%users%' => implode( ', ', array_map( - fn (User $u) => $this->userRender->renderString($u, []), + fn (User $u) => $this->userRender->renderString($this->userOrMe($u, $context), []), $data['users'] instanceof Collection ? $data['users']->toArray() : $data['users'] ) ), @@ -121,7 +121,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface "WHERE {$ai_alias}.user IN (:{$ai_users}) AND IDENTITY({$ai_alias}.accompanyingPeriod) = acp.id AND {$ai_alias}.infoDate >= :{$start} and {$ai_alias}.infoDate < :{$end}" ) ) - ->setParameter($ai_users, $data['users']) + ->setParameter($ai_users, $this->userOrMe($data['users'], $exportGenerationContext)) ->setParameter($start, $this->rollingDateConverter->convert($data['start_date'])) ->setParameter($end, $this->rollingDateConverter->convert($data['end_date'])) ; diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php index 728a9948a..36f7989cc 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/CreatorFilter.php @@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters; use Chill\MainBundle\Entity\User; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\PersonBundle\Export\Declarations; use Doctrine\Common\Collections\Collection; @@ -40,7 +40,7 @@ final readonly class CreatorFilter implements FilterInterface $qb ->leftJoin('acpw.createdBy', "{$p}_creator") ->andWhere($qb->expr()->in("{$p}_creator", ":{$p}_creators")) - ->setParameter("{$p}_creators", $data['creators']); + ->setParameter("{$p}_creators", $this->userOrMe($data['creators'], $exportGenerationContext)); } public function applyOn(): string @@ -51,7 +51,7 @@ final readonly class CreatorFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { $builder - ->add('creators', PickUserDynamicType::class, [ + ->add('creators', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => 'export.filter.work.by_creator.Creators', ]); @@ -64,12 +64,12 @@ final readonly class CreatorFilter implements FilterInterface public function normalizeFormData(array $formData): array { - return ['creators' => $this->normalizeDoctrineEntity($formData['creators'])]; + return ['creators' => $this->normalizeUserOrMe($formData['creators'])]; } public function denormalizeFormData(array $formData, int $fromVersion): array { - return ['creators' => $this->denormalizeDoctrineEntity($formData['creators'], $this->userRepository)]; + return ['creators' => $this->denormalizeUserOrMe($formData['creators'], $this->userRepository)]; } public function describeAction($data, ExportGenerationContext $context): array @@ -79,7 +79,7 @@ final readonly class CreatorFilter implements FilterInterface '%creators%' => implode( ', ', array_map( - static fn (User $u) => $u->getLabel(), + fn (User|string $u) => $this->userOrMe($u, $context)->getLabel(), $data['creators'] instanceof Collection ? $data['creators']->toArray() : $data['creators'] ) ), diff --git a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ReferrerFilter.php b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ReferrerFilter.php index 7f63ba28a..1b3b3a6c6 100644 --- a/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ReferrerFilter.php +++ b/src/Bundle/ChillPersonBundle/Export/Filter/SocialWorkFilters/ReferrerFilter.php @@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters; use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Form\Type\PickRollingDateType; -use Chill\MainBundle\Form\Type\PickUserDynamicType; +use Chill\MainBundle\Form\Type\PickUserOrMeDynamicType; use Chill\MainBundle\Repository\UserRepositoryInterface; use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; @@ -44,7 +44,7 @@ final readonly class ReferrerFilter implements FilterInterface ->andWhere("{$p}_acpwusers_history.user IN (:{$p}_agents)"); $qb - ->setParameter("{$p}_agents", $data['accepted_agents']) + ->setParameter("{$p}_agents", $this->userOrMe($data['accepted_agents'], $exportGenerationContext)) ->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert( $data['agent_at'] ?? new RollingDate(RollingDate::T_TODAY) )) @@ -59,7 +59,7 @@ final readonly class ReferrerFilter implements FilterInterface public function buildForm(FormBuilderInterface $builder): void { $builder - ->add('accepted_agents', PickUserDynamicType::class, [ + ->add('accepted_agents', PickUserOrMeDynamicType::class, [ 'multiple' => true, 'label' => 'export.filter.work.by_treating_agent.Accepted agents', ]) @@ -78,7 +78,7 @@ final readonly class ReferrerFilter implements FilterInterface public function normalizeFormData(array $formData): array { return [ - 'accepted_agents' => $this->normalizeDoctrineEntity($formData['accepted_agents']), + 'accepted_agents' => $this->normalizeUserOrMe($formData['accepted_agents']), 'agent_at' => array_key_exists('agent_at', $formData) ? $formData['agent_at']?->normalize() : (new RollingDate(RollingDate::T_TODAY))->normalize(), ]; } @@ -86,7 +86,7 @@ final readonly class ReferrerFilter implements FilterInterface public function denormalizeFormData(array $formData, int $fromVersion): array { return [ - 'accepted_agents' => $this->denormalizeDoctrineEntity($formData['accepted_agents'], $this->userRepository), + 'accepted_agents' => $this->denormalizeUserOrMe($formData['accepted_agents'], $this->userRepository), 'agent_at' => array_key_exists('agent_at', $formData) ? RollingDate::fromNormalized($formData['agent_at']) : new RollingDate(RollingDate::T_TODAY), ]; } @@ -103,7 +103,7 @@ final readonly class ReferrerFilter implements FilterInterface { $users = []; - foreach ($data['accepted_agents'] as $r) { + foreach ($this->userOrMe($data['accepted_agents'], $context) as $r) { $users[] = $r; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDatesTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDatesTest.php index cb8bbecd4..ae74c6fca 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDatesTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/AccompanyingCourseFilters/ReferrerFilterBetweenDatesTest.php @@ -65,6 +65,11 @@ class ReferrerFilterBetweenDatesTest extends AbstractFilterTest 'start_date' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'end_date' => new RollingDate(RollingDate::T_TODAY), ], + [ + 'accepted_referrers' => 'me', + 'start_date' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), + 'end_date' => new RollingDate(RollingDate::T_TODAY), + ], ]; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php index e7c4ee8e6..ae7a6c244 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/CreatorFilterTest.php @@ -50,6 +50,9 @@ class CreatorFilterTest extends AbstractFilterTest [ 'creators' => $creators, ], + [ + 'creators' => [...$creators, 'me'], + ], ]; } diff --git a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/ReferrerFilterTest.php b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/ReferrerFilterTest.php index 0a1583cf5..f298dea79 100644 --- a/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/ReferrerFilterTest.php +++ b/src/Bundle/ChillPersonBundle/Tests/Export/Filter/SocialWorkFilters/ReferrerFilterTest.php @@ -56,6 +56,11 @@ final class ReferrerFilterTest extends AbstractFilterTest ]; } + $data[] = [ + 'accepted_agents' => 'me', + 'agent_at' => new RollingDate(RollingDate::T_TODAY), + ]; + return $data; }