Refactor filters to support "me" as a user option.

Replaced `PickUserDynamicType` with `PickUserOrMeDynamicType` across filters to enable handling of the "me" option. Introduced normalization and denormalization methods for "me" and adjusted all relevant queries and test cases to accommodate this enhancement.
This commit is contained in:
Julien Fastré 2025-04-25 11:24:33 +02:00
parent e1404bf16d
commit 3f5ce5f841
Signed by: julienfastre
GPG Key ID: BDE2190974723FCB
15 changed files with 155 additions and 55 deletions

View File

@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; 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\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@ -31,11 +31,11 @@ final readonly class ActivityUsersFilter implements FilterInterface
return null; 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(); $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')); $orX->add($qb->expr()->isMemberOf(':activity_users_filter_u'.$key, 'activity.users'));
$qb->setParameter('activity_users_filter_u'.$key, $user); $qb->setParameter('activity_users_filter_u'.$key, $user);
} }
@ -50,7 +50,7 @@ final readonly class ActivityUsersFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder->add('accepted_users', PickUserDynamicType::class, [ $builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'Users', 'label' => 'Users',
]); ]);
@ -63,12 +63,12 @@ final readonly class ActivityUsersFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -80,7 +80,7 @@ final readonly class ActivityUsersFilter implements FilterInterface
{ {
$users = []; $users = [];
foreach ($data['accepted_users'] as $u) { foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@ -37,7 +37,7 @@ class ByCreatorFilter implements FilterInterface
->andWhere( ->andWhere(
$qb->expr()->in('activity.createdBy', ':users') $qb->expr()->in('activity.createdBy', ':users')
) )
->setParameter('users', $data['accepted_users']); ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext));
} }
public function applyOn(): string public function applyOn(): string
@ -47,7 +47,7 @@ class ByCreatorFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder->add('accepted_users', PickUserDynamicType::class, [ $builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
]); ]);
} }
@ -59,12 +59,12 @@ class ByCreatorFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -76,7 +76,7 @@ class ByCreatorFilter implements FilterInterface
{ {
$users = []; $users = [];
foreach ($data['accepted_users'] as $u) { foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@ -14,7 +14,7 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; 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\Repository\UserRepositoryInterface;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\Query\Expr\Andx; use Doctrine\ORM\Query\Expr\Andx;
@ -32,7 +32,7 @@ final readonly class UserFilter implements FilterInterface
return null; 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'); $where = $qb->getDQLPart('where');
@ -45,7 +45,7 @@ final readonly class UserFilter implements FilterInterface
} }
$qb->add('where', $where); $qb->add('where', $where);
$qb->setParameter('users', $data['accepted_users']); $qb->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext));
} }
public function applyOn(): string public function applyOn(): string
@ -55,7 +55,7 @@ final readonly class UserFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder->add('accepted_users', PickUserDynamicType::class, [ $builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'Creators', 'label' => 'Creators',
]); ]);
@ -68,12 +68,12 @@ final readonly class UserFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -85,7 +85,7 @@ final readonly class UserFilter implements FilterInterface
{ {
$users = []; $users = [];
foreach ($data['accepted_users'] as $u) { foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@ -45,14 +45,20 @@ final class ByCreatorFilterTest extends AbstractFilterTest
->from(User::class, 'u') ->from(User::class, 'u')
->select('u') ->select('u')
->getQuery() ->getQuery()
->setMaxResults(1)
->getResult(); ->getResult();
$data = []; $data = [];
foreach ($array as $a) { foreach ($array as $a) {
$data[] = [ $data[] = [
'accepted_users' => $a, 'accepted_users' => $a,
]; ];
} }
$data[] = [
'accepted_users' => 'me',
];
return $data; return $data;
} }

View File

@ -55,6 +55,10 @@ final class UserFilterTest extends AbstractFilterTest
]; ];
} }
$data[] = [
'accepted_users' => 'me',
];
return $data; return $data;
} }

View File

@ -14,7 +14,7 @@ namespace Chill\AsideActivityBundle\Export\Filter;
use Chill\AsideActivityBundle\Export\Declarations; use Chill\AsideActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; 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\Repository\UserRepository;
use Chill\MainBundle\Templating\Entity\UserRender; use Chill\MainBundle\Templating\Entity\UserRender;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
@ -37,7 +37,7 @@ final readonly class ByUserFilter implements FilterInterface
$qb $qb
->andWhere($clause) ->andWhere($clause)
->setParameter('users', $data['accepted_users']); ->setParameter('users', $this->userOrMe($data['accepted_users'], $exportGenerationContext));
} }
public function applyOn(): string public function applyOn(): string
@ -47,7 +47,7 @@ final readonly class ByUserFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder->add('accepted_users', PickUserDynamicType::class, [ $builder->add('accepted_users', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'Creators', 'label' => 'Creators',
]); ]);
@ -60,12 +60,12 @@ final readonly class ByUserFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -77,7 +77,7 @@ final readonly class ByUserFilter implements FilterInterface
{ {
$users = []; $users = [];
foreach ($data['accepted_users'] as $u) { foreach ($this->userOrMe($data['accepted_users'], $context) as $u) {
$users[] = $this->userRender->renderString($u, []); $users[] = $this->userRender->renderString($u, []);
} }

View File

@ -11,6 +11,8 @@ declare(strict_types=1);
namespace Chill\MainBundle\Export; namespace Chill\MainBundle\Export;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Repository\UserRepositoryInterface;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
use Doctrine\Persistence\ObjectRepository; use Doctrine\Persistence\ObjectRepository;
@ -63,6 +65,79 @@ trait ExportDataNormalizerTrait
return $object; 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<User>
*/
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. * Normalizes a provided date into a specific string format.
* *

View File

@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters;
use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; 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\Repository\UserRepositoryInterface;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@ -40,7 +40,7 @@ final readonly class CreatorFilter implements FilterInterface
$qb $qb
->andWhere($qb->expr()->in('acp_creator', ':creators')) ->andWhere($qb->expr()->in('acp_creator', ':creators'))
->setParameter('creators', $data['accepted_creators']); ->setParameter('creators', $this->userOrMe($data['accepted_creators'], $exportGenerationContext));
} }
public function applyOn(): string public function applyOn(): string
@ -51,7 +51,7 @@ final readonly class CreatorFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder $builder
->add('accepted_creators', PickUserDynamicType::class, [ ->add('accepted_creators', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => false, 'label' => false,
]); ]);
@ -64,12 +64,12 @@ final readonly class CreatorFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -85,7 +85,7 @@ final readonly class CreatorFilter implements FilterInterface
', ', ', ',
array_map( array_map(
static fn (User $u) => $u->getLabel(), 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)
) )
), ),
], ]; ], ];

View File

@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\AccompanyingCourseFilters;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; 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\Repository\UserRepository;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
@ -68,7 +68,7 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface
->andWhere( ->andWhere(
"{$history}.user IN (:{$users})", "{$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($start, $this->rollingDateConverter->convert($data['start_date']))
->setParameter($end, $this->rollingDateConverter->convert($data['end_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 public function buildForm(FormBuilderInterface $builder): void
{ {
$builder $builder
->add('accepted_referrers', PickUserDynamicType::class, [ ->add('accepted_referrers', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
]) ])
->add('start_date', PickRollingDateType::class, [ ->add('start_date', PickRollingDateType::class, [
@ -101,12 +101,14 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -122,7 +124,7 @@ final readonly class ReferrerFilterBetweenDates implements FilterInterface
{ {
$users = []; $users = [];
foreach ($data['accepted_referrers'] as $r) { foreach ($this->userOrMe($data['accepted_referrers'], $context) as $r) {
$users[] = $this->userRender->renderString($r, []); $users[] = $this->userRender->renderString($r, []);
} }

View File

@ -15,7 +15,7 @@ use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; 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\Repository\UserRepositoryInterface;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
@ -44,7 +44,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder $builder
->add('users', PickUserDynamicType::class, [ ->add('users', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
]) ])
->add('start_date', PickRollingDateType::class, [ ->add('start_date', PickRollingDateType::class, [
@ -63,12 +63,12 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function getFormDefaultData(): array
@ -92,7 +92,7 @@ final readonly class UserWorkingOnCourseFilter implements FilterInterface
'%users%' => implode( '%users%' => implode(
', ', ', ',
array_map( 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'] $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}" "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($start, $this->rollingDateConverter->convert($data['start_date']))
->setParameter($end, $this->rollingDateConverter->convert($data['end_date'])) ->setParameter($end, $this->rollingDateConverter->convert($data['end_date']))
; ;

View File

@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters;
use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; 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\Repository\UserRepositoryInterface;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\Common\Collections\Collection; use Doctrine\Common\Collections\Collection;
@ -40,7 +40,7 @@ final readonly class CreatorFilter implements FilterInterface
$qb $qb
->leftJoin('acpw.createdBy', "{$p}_creator") ->leftJoin('acpw.createdBy', "{$p}_creator")
->andWhere($qb->expr()->in("{$p}_creator", ":{$p}_creators")) ->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 public function applyOn(): string
@ -51,7 +51,7 @@ final readonly class CreatorFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder $builder
->add('creators', PickUserDynamicType::class, [ ->add('creators', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'export.filter.work.by_creator.Creators', 'label' => 'export.filter.work.by_creator.Creators',
]); ]);
@ -64,12 +64,12 @@ final readonly class CreatorFilter implements FilterInterface
public function normalizeFormData(array $formData): array 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 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 public function describeAction($data, ExportGenerationContext $context): array
@ -79,7 +79,7 @@ final readonly class CreatorFilter implements FilterInterface
'%creators%' => implode( '%creators%' => implode(
', ', ', ',
array_map( 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'] $data['creators'] instanceof Collection ? $data['creators']->toArray() : $data['creators']
) )
), ),

View File

@ -14,7 +14,7 @@ namespace Chill\PersonBundle\Export\Filter\SocialWorkFilters;
use Chill\MainBundle\Export\ExportGenerationContext; use Chill\MainBundle\Export\ExportGenerationContext;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType; 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\Repository\UserRepositoryInterface;
use Chill\MainBundle\Service\RollingDate\RollingDate; use Chill\MainBundle\Service\RollingDate\RollingDate;
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface; use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
@ -44,7 +44,7 @@ final readonly class ReferrerFilter implements FilterInterface
->andWhere("{$p}_acpwusers_history.user IN (:{$p}_agents)"); ->andWhere("{$p}_acpwusers_history.user IN (:{$p}_agents)");
$qb $qb
->setParameter("{$p}_agents", $data['accepted_agents']) ->setParameter("{$p}_agents", $this->userOrMe($data['accepted_agents'], $exportGenerationContext))
->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert( ->setParameter("{$p}_calc_date", $this->rollingDateConverter->convert(
$data['agent_at'] ?? new RollingDate(RollingDate::T_TODAY) $data['agent_at'] ?? new RollingDate(RollingDate::T_TODAY)
)) ))
@ -59,7 +59,7 @@ final readonly class ReferrerFilter implements FilterInterface
public function buildForm(FormBuilderInterface $builder): void public function buildForm(FormBuilderInterface $builder): void
{ {
$builder $builder
->add('accepted_agents', PickUserDynamicType::class, [ ->add('accepted_agents', PickUserOrMeDynamicType::class, [
'multiple' => true, 'multiple' => true,
'label' => 'export.filter.work.by_treating_agent.Accepted agents', '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 public function normalizeFormData(array $formData): array
{ {
return [ 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(), '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 public function denormalizeFormData(array $formData, int $fromVersion): array
{ {
return [ 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), '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 = []; $users = [];
foreach ($data['accepted_agents'] as $r) { foreach ($this->userOrMe($data['accepted_agents'], $context) as $r) {
$users[] = $r; $users[] = $r;
} }

View File

@ -65,6 +65,11 @@ class ReferrerFilterBetweenDatesTest extends AbstractFilterTest
'start_date' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START), 'start_date' => new RollingDate(RollingDate::T_YEAR_PREVIOUS_START),
'end_date' => new RollingDate(RollingDate::T_TODAY), '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),
],
]; ];
} }

View File

@ -50,6 +50,9 @@ class CreatorFilterTest extends AbstractFilterTest
[ [
'creators' => $creators, 'creators' => $creators,
], ],
[
'creators' => [...$creators, 'me'],
],
]; ];
} }

View File

@ -56,6 +56,11 @@ final class ReferrerFilterTest extends AbstractFilterTest
]; ];
} }
$data[] = [
'accepted_agents' => 'me',
'agent_at' => new RollingDate(RollingDate::T_TODAY),
];
return $data; return $data;
} }