[export] fix 2 job/scope filters aside activity

This commit is contained in:
Mathieu Jaumotte 2023-09-28 15:46:46 +02:00
parent 1973a4b849
commit 8c44e92079
3 changed files with 97 additions and 42 deletions

View File

@ -13,8 +13,12 @@ namespace Chill\AsideActivityBundle\Export\Filter;
use Chill\AsideActivityBundle\Entity\AsideActivity; use Chill\AsideActivityBundle\Entity\AsideActivity;
use Chill\AsideActivityBundle\Export\Declarations; use Chill\AsideActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob; use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\FilterInterface; 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 Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@ -22,7 +26,12 @@ use Symfony\Component\Form\FormBuilderInterface;
class ByUserJobFilter implements FilterInterface 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 public function addRole(): ?string
{ {
@ -31,38 +40,49 @@ class ByUserJobFilter implements FilterInterface
public function alterQuery(QueryBuilder $qb, $data) public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX;
$qb $qb
->andWhere( ->andWhere(
$qb->expr()->exists( $qb->expr()->exists(
'SELECT 1 FROM ' . AsideActivity::class . ' aside_activity_user_job_filter_act "SELECT 1 FROM " . AsideActivity::class . " {$p}_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' . "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; return Declarations::ASIDE_ACTIVITY_TYPE;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('jobs', EntityType::class, [ $builder
'class' => UserJob::class, ->add('jobs', EntityType::class, [
'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize($j->getLabel()), 'class' => UserJob::class,
'multiple' => true, 'choice_label' => fn (UserJob $j) => $this->translatableStringHelper->localize($j->getLabel()),
'expanded' => true, 'multiple' => true,
]); 'expanded' => true,
} ])
public function getFormDefaultData(): array ->add('job_at', PickRollingDateType::class, [
{ 'label' => 'export.filter.by_user_job.Calc date',
return []; '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( '%jobs%' => implode(
', ', ', ',
array_map( 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';
} }
} }

View File

@ -14,8 +14,12 @@ namespace Chill\AsideActivityBundle\Export\Filter;
use Chill\AsideActivityBundle\Entity\AsideActivity; use Chill\AsideActivityBundle\Entity\AsideActivity;
use Chill\AsideActivityBundle\Export\Declarations; use Chill\AsideActivityBundle\Export\Declarations;
use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Entity\Scope;
use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\FilterInterface; use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Repository\ScopeRepositoryInterface; use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Service\RollingDate\RollingDate;
use Chill\MainBundle\Service\RollingDate\RollingDateConverter;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface; use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@ -23,7 +27,13 @@ use Symfony\Component\Form\FormBuilderInterface;
class ByUserScopeFilter implements FilterInterface 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 public function addRole(): ?string
{ {
@ -32,39 +42,50 @@ class ByUserScopeFilter implements FilterInterface
public function alterQuery(QueryBuilder $qb, $data) public function alterQuery(QueryBuilder $qb, $data)
{ {
$p = self::PREFIX;
$qb $qb
->andWhere( ->andWhere(
$qb->expr()->exists( $qb->expr()->exists(
'SELECT 1 FROM ' . AsideActivity::class . ' aside_activity_user_scope_filter_act "SELECT 1 FROM " . AsideActivity::class . " {$p}_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 ' . "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; return Declarations::ASIDE_ACTIVITY_TYPE;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add('scopes', EntityType::class, [ $builder
'class' => Scope::class, ->add('scopes', EntityType::class, [
'choices' => $this->scopeRepository->findAllActive(), 'class' => Scope::class,
'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()), 'choices' => $this->scopeRepository->findAllActive(),
'multiple' => true, 'choice_label' => fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()),
'expanded' => true, 'multiple' => true,
]); 'expanded' => true,
} ])
public function getFormDefaultData(): array ->add('scope_at', PickRollingDateType::class, [
{ 'label' => 'export.filter.by_user_scope.Calc date',
return []; 'required' => true,
]);
} }
public function describeAction($data, $format = 'string') 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( '%scopes%' => implode(
', ', ', ',
array_map( 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';
} }
} }

View File

@ -200,10 +200,14 @@ export:
Aside activities before this date: Actvitités annexes avant cette date Aside activities before this date: Actvitités annexes avant cette date
'Filtered aside activity by user: only %users%': "Filtré par utilisateur: uniquement %users%" 'Filtered aside activity by user: only %users%': "Filtré par utilisateur: uniquement %users%"
Filter aside activity by user: Filtrer par utilisateur Filter aside activity by user: Filtrer par utilisateur
'Filtered aside activities by user jobs: only %jobs%': "Filtré par métier des utilisateurs: uniquement %jobs%" by_user_job:
Filter by user jobs: Filtrer les activités annexes par métier des utilisateurs 'Filtered aside activities by user jobs: only %jobs%': "Filtré par métier des utilisateurs: uniquement %jobs%"
'Filtered aside activities by user scope: only %scopes%': "Filtré par service des utilisateur: uniquement %scopes%" Filter by user jobs: Filtrer les activités annexes par métier des utilisateurs
Filter by user scope: Filtrer les activités annexes par service d'utilisateur 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 Filter by aside activity location: Filtrer les activités annexes par localisation
'Filtered by aside activity location: only %location%': "Filtré par localisation: uniquement %location%" 'Filtered by aside activity location: only %location%': "Filtré par localisation: uniquement %location%"
aggregator: aggregator: