diff --git a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserJobFilter.php b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserJobFilter.php index 5cff1b0e3..a97fcb1c1 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserJobFilter.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserJobFilter.php @@ -13,8 +13,12 @@ namespace Chill\AsideActivityBundle\Export\Filter; use Chill\AsideActivityBundle\Entity\AsideActivity; use Chill\AsideActivityBundle\Export\Declarations; +use Chill\MainBundle\Entity\User\UserJobHistory; use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Export\FilterInterface; +use Chill\MainBundle\Form\Type\PickRollingDateType; +use Chill\MainBundle\Service\RollingDate\RollingDate; +use Chill\MainBundle\Service\RollingDate\RollingDateConverter; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; @@ -22,7 +26,12 @@ use Symfony\Component\Form\FormBuilderInterface; class ByUserJobFilter implements FilterInterface { - public function __construct(private readonly TranslatableStringHelperInterface $translatableStringHelper) {} + private const PREFIX = 'aside_act_filter_user_job'; + + public function __construct( + private readonly RollingDateConverter $rollingDateConverter, + private readonly TranslatableStringHelperInterface $translatableStringHelper + ) {} public function addRole(): ?string { @@ -31,38 +40,49 @@ class ByUserJobFilter implements FilterInterface public function alterQuery(QueryBuilder $qb, $data) { + $p = self::PREFIX; + $qb ->andWhere( $qb->expr()->exists( - 'SELECT 1 FROM ' . AsideActivity::class . ' aside_activity_user_job_filter_act - JOIN aside_activity_user_job_filter_act.agent aside_activity_user_job_filter_user WHERE aside_activity_user_job_filter_user.userJob IN (:aside_activity_user_job_filter_jobs) AND aside_activity_user_job_filter_act = aside' + "SELECT 1 FROM " . AsideActivity::class . " {$p}_act " + . "JOIN {$p}_act.agent {$p}_user " + . "JOIN " . UserJobHistory::class . " {$p}_history WITH {$p}_history.user = {$p}_user " + . "WHERE {$p}_act = aside " + . "AND {$p}_history.startDate <= :{$p}_at " + . "AND ({$p}_history.endDate IS NULL OR {$p}_history.endDate > :{$p}_at) " + . "AND {$p}_history.job IN ( :{$p}_jobs )" ) ) - ->setParameter('aside_activity_user_job_filter_jobs', $data['jobs']); + ->setParameters([ + "{$p}_jobs" => $data["jobs"], + "{$p}_at" => $this->rollingDateConverter->convert($data["job_at"]) + ]); } - public function applyOn() + public function applyOn(): string { return Declarations::ASIDE_ACTIVITY_TYPE; } public function buildForm(FormBuilderInterface $builder) { - $builder->add('jobs', EntityType::class, [ - 'class' => UserJob::class, - 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize($j->getLabel()), - 'multiple' => true, - 'expanded' => true, - ]); - } - public function getFormDefaultData(): array - { - return []; + $builder + ->add('jobs', EntityType::class, [ + 'class' => UserJob::class, + 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize($j->getLabel()), + 'multiple' => true, + 'expanded' => true, + ]) + ->add('job_at', PickRollingDateType::class, [ + 'label' => 'export.filter.by_user_job.Calc date', + 'required' => true + ]); } - public function describeAction($data, $format = 'string') + public function describeAction($data, $format = 'string'): array { - return ['export.filter.Filtered aside activities by user jobs: only %jobs%', [ + return ['export.filter.by_user_job.Filtered aside activities by user jobs: only %jobs%', [ '%jobs%' => implode( ', ', array_map( @@ -73,8 +93,13 @@ class ByUserJobFilter implements FilterInterface ]]; } - public function getTitle() + public function getFormDefaultData(): array { - return 'export.filter.Filter by user jobs'; + return ['job_at' => new RollingDate(RollingDate::T_TODAY)]; + } + + public function getTitle(): string + { + return 'export.filter.by_user_job.Filter by user jobs'; } } diff --git a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserScopeFilter.php b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserScopeFilter.php index 22930183e..9c75d0ed8 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserScopeFilter.php +++ b/src/Bundle/ChillAsideActivityBundle/src/Export/Filter/ByUserScopeFilter.php @@ -14,8 +14,12 @@ namespace Chill\AsideActivityBundle\Export\Filter; use Chill\AsideActivityBundle\Entity\AsideActivity; use Chill\AsideActivityBundle\Export\Declarations; use Chill\MainBundle\Entity\Scope; +use Chill\MainBundle\Entity\User\UserScopeHistory; use Chill\MainBundle\Export\FilterInterface; +use Chill\MainBundle\Form\Type\PickRollingDateType; use Chill\MainBundle\Repository\ScopeRepositoryInterface; +use Chill\MainBundle\Service\RollingDate\RollingDate; +use Chill\MainBundle\Service\RollingDate\RollingDateConverter; use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Doctrine\ORM\QueryBuilder; use Symfony\Bridge\Doctrine\Form\Type\EntityType; @@ -23,7 +27,13 @@ use Symfony\Component\Form\FormBuilderInterface; class ByUserScopeFilter implements FilterInterface { - public function __construct(private readonly ScopeRepositoryInterface $scopeRepository, private readonly TranslatableStringHelperInterface $translatableStringHelper) {} + private const PREFIX = 'aside_act_filter_user_scope'; + + public function __construct( + private readonly RollingDateConverter $rollingDateConverter, + private readonly ScopeRepositoryInterface $scopeRepository, + private readonly TranslatableStringHelperInterface $translatableStringHelper + ) {} public function addRole(): ?string { @@ -32,39 +42,50 @@ class ByUserScopeFilter implements FilterInterface public function alterQuery(QueryBuilder $qb, $data) { + $p = self::PREFIX; + $qb ->andWhere( $qb->expr()->exists( - 'SELECT 1 FROM ' . AsideActivity::class . ' aside_activity_user_scope_filter_act - JOIN aside_activity_user_scope_filter_act.agent aside_activity_user_scope_filter_user WHERE aside_activity_user_scope_filter_user.mainScope IN (:aside_activity_user_scope_filter_scopes) AND aside_activity_user_scope_filter_act = aside ' + "SELECT 1 FROM " . AsideActivity::class . " {$p}_act " + . "JOIN {$p}_act.agent {$p}_user " + . "JOIN " . UserScopeHistory::class . " {$p}_history WITH {$p}_history.user = {$p}_user " + . "WHERE {$p}_act = aside " + . "AND {$p}_history.startDate <= :{$p}_at " + . "AND ({$p}_history.endDate IS NULL OR {$p}_history.endDate > :{$p}_at) " + . "AND {$p}_history.scope IN ( :{$p}_scopes )" ) ) - ->setParameter('aside_activity_user_scope_filter_scopes', $data['scopes']); + ->setParameters([ + "{$p}_scopes" => $data["scopes"], + "{$p}_at" => $this->rollingDateConverter->convert($data["scope_at"]) + ]); } - public function applyOn() + public function applyOn(): string { return Declarations::ASIDE_ACTIVITY_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, - ]); - } - public function getFormDefaultData(): array - { - return []; + $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, + ]) + ->add('scope_at', PickRollingDateType::class, [ + 'label' => 'export.filter.by_user_scope.Calc date', + 'required' => true, + ]); } public function describeAction($data, $format = 'string') { - return ['export.filter.Filtered aside activities by user scope: only %scopes%', [ + return ['export.filter.by_user_scope.Filtered aside activities by user scope: only %scopes%', [ '%scopes%' => implode( ', ', array_map( @@ -75,8 +96,13 @@ class ByUserScopeFilter implements FilterInterface ]]; } - public function getTitle() + public function getFormDefaultData(): array { - return 'export.filter.Filter by user scope'; + return ['scope_at' => new RollingDate(RollingDate::T_TODAY)]; + } + + public function getTitle(): string + { + return 'export.filter.by_user_scope.Filter by user scope'; } } diff --git a/src/Bundle/ChillAsideActivityBundle/src/translations/messages.fr.yml b/src/Bundle/ChillAsideActivityBundle/src/translations/messages.fr.yml index 69f4e8736..fe895e223 100644 --- a/src/Bundle/ChillAsideActivityBundle/src/translations/messages.fr.yml +++ b/src/Bundle/ChillAsideActivityBundle/src/translations/messages.fr.yml @@ -200,10 +200,14 @@ export: Aside activities before this date: Actvitités annexes avant cette date 'Filtered aside activity by user: only %users%': "Filtré par utilisateur: uniquement %users%" Filter aside activity by user: Filtrer par utilisateur - 'Filtered aside activities by user jobs: only %jobs%': "Filtré par métier des utilisateurs: uniquement %jobs%" - Filter by user jobs: Filtrer les activités annexes par métier des utilisateurs - 'Filtered aside activities by user scope: only %scopes%': "Filtré par service des utilisateur: uniquement %scopes%" - Filter by user scope: Filtrer les activités annexes par service d'utilisateur + by_user_job: + 'Filtered aside activities by user jobs: only %jobs%': "Filtré par métier des utilisateurs: uniquement %jobs%" + Filter by user jobs: Filtrer les activités annexes par métier des utilisateurs + Calc date: Date de calcul du métier des utilisateurs + by_user_scope: + 'Filtered aside activities by user scope: only %scopes%': "Filtré par service des utilisateurs: uniquement %scopes%" + Filter by user scope: Filtrer les activités annexes par service d'utilisateur + Calc date: Date de calcul du service des utilisateurs Filter by aside activity location: Filtrer les activités annexes par localisation 'Filtered by aside activity location: only %location%': "Filtré par localisation: uniquement %location%" aggregator: