complete aggregators

This commit is contained in:
Mathieu Jaumotte 2023-11-14 14:18:50 +01:00
parent fde6000d0b
commit b790e2fcf1
4 changed files with 96 additions and 22 deletions

View File

@ -12,7 +12,8 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators;
use Chill\MainBundle\Export\AggregatorInterface; 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 Chill\PersonBundle\Export\Declarations;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
@ -22,7 +23,8 @@ class CreatorAggregator implements AggregatorInterface
private const PREFIX = 'acpw_aggr_creator'; private const PREFIX = 'acpw_aggr_creator';
public function __construct( public function __construct(
private readonly TranslatableStringHelper $translatableStringHelper private UserRepository $userRepository,
private UserRender $userRender
) {} ) {}
public function addRole(): ?string public function addRole(): ?string
@ -32,7 +34,11 @@ class CreatorAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data) 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 public function applyOn(): string
@ -40,10 +46,7 @@ class CreatorAggregator implements AggregatorInterface
return Declarations::SOCIAL_WORK_ACTION_TYPE; return Declarations::SOCIAL_WORK_ACTION_TYPE;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder) {}
{
$builder->add();
}
public function getFormDefaultData(): array public function getFormDefaultData(): array
{ {
@ -53,13 +56,23 @@ class CreatorAggregator implements AggregatorInterface
public function getLabels($key, array $values, mixed $data) public function getLabels($key, array $values, mixed $data)
{ {
return function ($value): string { 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 public function getQueryKeys($data): array
{ {
return []; return [self::PREFIX.'_select'];
} }
public function getTitle(): string public function getTitle(): string

View File

@ -11,9 +11,12 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators;
use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Export\AggregatorInterface; use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Repository\UserJobRepository;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
@ -22,6 +25,7 @@ class CreatorJobAggregator implements AggregatorInterface
private const PREFIX = 'acpw_aggr_creator_job'; private const PREFIX = 'acpw_aggr_creator_job';
public function __construct( public function __construct(
private readonly UserJobRepository $jobRepository,
private readonly TranslatableStringHelper $translatableStringHelper private readonly TranslatableStringHelper $translatableStringHelper
) {} ) {}
@ -32,7 +36,26 @@ class CreatorJobAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data) 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 public function applyOn(): string
@ -40,10 +63,7 @@ class CreatorJobAggregator implements AggregatorInterface
return Declarations::SOCIAL_WORK_ACTION_TYPE; return Declarations::SOCIAL_WORK_ACTION_TYPE;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder) {}
{
$builder->add();
}
public function getFormDefaultData(): array public function getFormDefaultData(): array
{ {
@ -53,13 +73,23 @@ class CreatorJobAggregator implements AggregatorInterface
public function getLabels($key, array $values, mixed $data) public function getLabels($key, array $values, mixed $data)
{ {
return function ($value): string { 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 public function getQueryKeys($data): array
{ {
return []; return [self::PREFIX.'_select'];
} }
public function getTitle(): string public function getTitle(): string

View File

@ -11,9 +11,12 @@ declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators; namespace Chill\PersonBundle\Export\Aggregator\SocialWorkAggregators;
use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\AggregatorInterface; use Chill\MainBundle\Export\AggregatorInterface;
use Chill\MainBundle\Repository\ScopeRepository;
use Chill\MainBundle\Templating\TranslatableStringHelper; use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations; use Chill\PersonBundle\Export\Declarations;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder; use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
@ -22,6 +25,7 @@ class CreatorScopeAggregator implements AggregatorInterface
private const PREFIX = 'acpw_aggr_creator_scope'; private const PREFIX = 'acpw_aggr_creator_scope';
public function __construct( public function __construct(
private readonly ScopeRepository $scopeRepository,
private readonly TranslatableStringHelper $translatableStringHelper private readonly TranslatableStringHelper $translatableStringHelper
) {} ) {}
@ -32,7 +36,26 @@ class CreatorScopeAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data) 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 public function applyOn(): string
@ -40,10 +63,7 @@ class CreatorScopeAggregator implements AggregatorInterface
return Declarations::SOCIAL_WORK_ACTION_TYPE; return Declarations::SOCIAL_WORK_ACTION_TYPE;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder) {}
{
$builder->add();
}
public function getFormDefaultData(): array public function getFormDefaultData(): array
{ {
@ -53,13 +73,23 @@ class CreatorScopeAggregator implements AggregatorInterface
public function getLabels($key, array $values, mixed $data) public function getLabels($key, array $values, mixed $data)
{ {
return function ($value): string { 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 public function getQueryKeys($data): array
{ {
return []; return [self::PREFIX.'_select'];
} }
public function getTitle(): string public function getTitle(): string

View File

@ -1096,10 +1096,13 @@ export:
header: Tiers traitant header: Tiers traitant
by_creator: by_creator:
title: Grouper les actions par créateur title: Grouper les actions par créateur
Creator: Créateur de l'action
by_creator_job: by_creator_job:
title: Grouper les actions par métier du créateur title: Grouper les actions par métier du créateur
Creator's job: Métier du créateur
by_creator_scope: by_creator_scope:
title: Grouper les actions par service du créateur title: Grouper les actions par service du créateur
Creator's scope: Service du créateur
eval: eval:
by_end_date: by_end_date:
@ -1224,8 +1227,6 @@ export:
title: Filtrer les actions par créateur title: Filtrer les actions par créateur
Creators: Créateur de l'action Creators: Créateur de l'action
"Filtered by creator: only %creators%": "Filtré par créateur de l'action: uniquement %creators%" "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: by_creator_job:
title: Filtrer les actions par métier du créateur 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%"