Fix: last fixes for accompanying period work filters

- avoid errors when the user inverse date from and date to (we correct them)
- allow the user to filter by multiple users
- do not show filter by types if only one action type
- more type-hinting in the $filter argument for AccompanyingPeriodWorkRepository::findByAccompanyingPeriodOpenFirst
This commit is contained in:
2023-07-14 09:23:23 +02:00
parent f2673d6c83
commit a21cefab31
3 changed files with 42 additions and 27 deletions

View File

@@ -95,9 +95,9 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
* * then, closed works
*
* @return AccompanyingPeriodWork[]
* @param mixed $filters
* @param array{types?: list<SocialAction>, user?: list<User>, after?: null|\DateTimeImmutable, before?: null|\DateTimeImmutable} $filters
*/
public function findByAccompanyingPeriodOpenFirst(AccompanyingPeriod $period, $filters, int $limit = 10, int $offset = 0): array
public function findByAccompanyingPeriodOpenFirst(AccompanyingPeriod $period, array $filters, int $limit = 10, int $offset = 0): array
{
$rsm = new ResultSetMappingBuilder($this->em);
$rsm->addRootEntityFromClassMetadata(AccompanyingPeriodWork::class, 'w');
@@ -108,18 +108,32 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
// implement filters
if([] !== ($filters['types'] ?? [])) {
if ([] !== ($filters['types'] ?? [])) {
$sql .= " AND w.socialaction_id IN (:types)";
}
if([] !== ($filters['user'] ?? [])) {
$sql .= " AND rw.user_id = :user";
if ([] !== ($filters['user'] ?? [])) {
$sql .= " AND rw.user_id IN ("
. implode(
', ',
// we add a user_xx for each key of the 'user' list
array_map(fn (User $u, int $idx) => ':user_' . $idx, $filters['user'], array_keys($filters['user']))
)
. ")";
}
$sql .= " AND daterange(:after::date, :before::date) && daterange(w.startDate, w.endDate)";
// set limit and offset
// if the start and end date were inversed, we inverse the order to avoid an error
if (null !== ($filters['after'] ?? null) && null !== ($filters['before']) && $filters['after'] > $filters['before']) {
$before = $filters['after'];
$after = $filters['before'];
} else {
$before = $filters['before'];
$after = $filters['after'];
}
// set limit and offset
$sql .= " ORDER BY
CASE WHEN enddate IS NULL THEN '-infinity'::timestamp ELSE 'infinity'::timestamp END ASC,
startdate DESC,
@@ -136,12 +150,15 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
$nq = $this->em->createNativeQuery($sql, $rsm)
->setParameter('periodId', $period->getId(), Types::INTEGER)
->setParameter('types', $typeIds)
->setParameter('user', null !== $filters['user'] ? $filters['user']->getId() : null)
->setParameter('after', ($filters['after'] ?? null))
->setParameter('before', ($filters['before'] ?? null))
->setParameter('after', $after)
->setParameter('before', $before)
->setParameter('limit', $limit, Types::INTEGER)
->setParameter('offset', $offset, Types::INTEGER);
foreach ($filters['user'] as $key => $user) {
$nq->setParameter('user_' . $key, $user);
}
return $nq->getResult();
}