FEATURE [repository] implement filter logic

This commit is contained in:
Julie Lenaerts 2023-07-12 15:17:03 +02:00
parent cc97199c5d
commit e0758215ba
4 changed files with 32 additions and 18 deletions

View File

@ -255,6 +255,7 @@ class Address implements TrackCreationInterface, TrackUpdateInterface
public function syncWithReference(AddressReference $addressReference): Address public function syncWithReference(AddressReference $addressReference): Address
{ {
dump($addressReference);
$this $this
->setPoint($addressReference->getPoint()) ->setPoint($addressReference->getPoint())
->setPostcode($addressReference->getPostcode()) ->setPostcode($addressReference->getPostcode())

View File

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\MainBundle\Templating\Listing; namespace Chill\MainBundle\Templating\Listing;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Form\Type\Listing\FilterOrderType; use Chill\MainBundle\Form\Type\Listing\FilterOrderType;
use DateTimeImmutable; use DateTimeImmutable;
use Symfony\Component\Form\Extension\Core\Type\FormType; use Symfony\Component\Form\Extension\Core\Type\FormType;
@ -134,7 +135,7 @@ class FilterOrderHelper
return $this->userPickers; return $this->userPickers;
} }
public function getUserPickerData(string $name): array public function getUserPickerData(string $name)
{ {
return $this->getFormData()['user_pickers'][$name]; return $this->getFormData()['user_pickers'][$name];
} }

View File

@ -161,7 +161,7 @@ class AccompanyingCourseWorkController extends AbstractController
'types' => $filter->getEntityChoiceData('typesFilter'), 'types' => $filter->getEntityChoiceData('typesFilter'),
'before' => $filter->getDateRangeData('dateFilter')['to'], 'before' => $filter->getDateRangeData('dateFilter')['to'],
'after' => $filter->getDateRangeData('dateFilter')['from'], 'after' => $filter->getDateRangeData('dateFilter')['from'],
'users' => $filter->getUserPickerData('userFilter') 'user' => $filter->getUserPickerData('userFilter')
]; ];
$totalItems = $this->workRepository->countByAccompanyingPeriod($period); $totalItems = $this->workRepository->countByAccompanyingPeriod($period);
@ -226,7 +226,7 @@ class AccompanyingCourseWorkController extends AbstractController
->addEntityChoice('typesFilter', 'accompanying_course_work.types_filter', \Chill\PersonBundle\Entity\SocialWork\SocialAction::class, $types, [ ->addEntityChoice('typesFilter', 'accompanying_course_work.types_filter', \Chill\PersonBundle\Entity\SocialWork\SocialAction::class, $types, [
'choice_label' => fn (SocialAction $sa) => $this->translatableStringHelper->localize($sa->getTitle()) 'choice_label' => fn (SocialAction $sa) => $this->translatableStringHelper->localize($sa->getTitle())
]) ])
->addUserPicker('userFilter', 'accompanying_course_work.user_filter', ['required' => false]) ->addUserPicker('userFilter', 'accompanying_course_work.user_filter', ['required' => false, 'multiple' => false])
; ;
return $filterBuilder->build(); return $filterBuilder->build();

View File

@ -103,40 +103,52 @@ final class AccompanyingPeriodWorkRepository implements ObjectRepository
$rsm->addRootEntityFromClassMetadata(AccompanyingPeriodWork::class, 'w'); $rsm->addRootEntityFromClassMetadata(AccompanyingPeriodWork::class, 'w');
$sql = "SELECT {$rsm} FROM chill_person_accompanying_period_work w $sql = "SELECT {$rsm} FROM chill_person_accompanying_period_work w
WHERE accompanyingPeriod_id = :periodId WHERE accompanyingPeriod_id = :periodId";
ORDER BY
CASE WHEN enddate IS NULL THEN '-infinity'::timestamp ELSE 'infinity'::timestamp END ASC,
startdate DESC,
enddate DESC,
id DESC";
// implement filters // implement filters
if([] !== ($filters['types'] ?? [])) if([] !== ($filters['types'] ?? []))
{ {
$sql .= "AND WHERE w.socialAction IN (:types)"; $sql .= " AND w.socialaction_id IN (:types)";
} }
if([] !== ($filters['users'] ?? [])) if([] !== ($filters['users'] ?? []))
{ {
$sql .= "AND WHERE w.createdBy IN (:users)"; $sql .= " AND w.createdBy = (:userCreated)";
foreach ($filters['users'] as $key => $user) { $sql .= " OR :userReferrer IN (w.referrers)";
$sql .= "OR :user_" . $key . " IN w.referrers)"; }
$nq = $this->em->createNativeQuery($sql, $rsm) if (null !== ($after = $filters['after'] ?? null) && null === $filters['before']) {
->setParameter(':user_' . $key); $sql .= " AND w.startdate::date >= :after";
} } elseif (null !== ($before = $filters['before'] ?? null) && null === $filters['after']) {
$sql .= " AND COALESCE(w.enddate::date, 'infinity'::date) <= :before";
// ... to be continued } elseif (null !== ($after = $filters['after'] ?? null) && null !== ($before = $filters['before'] ?? null)) {
$sql .= " AND w.startdate::date >= :after AND COALESCE(w.enddate::date, 'now'::date) <= :before";
} }
// set limit and offset // set limit and offset
$sql .= " ORDER BY
CASE WHEN enddate IS NULL THEN '-infinity'::timestamp ELSE 'infinity'::timestamp END ASC,
startdate DESC,
enddate DESC,
id DESC";
$sql .= " LIMIT :limit OFFSET :offset"; $sql .= " LIMIT :limit OFFSET :offset";
$typeIds = [];
foreach ($filters['types'] as $type) {
$typeIds[] = $type->getId();
}
$nq = $this->em->createNativeQuery($sql, $rsm) $nq = $this->em->createNativeQuery($sql, $rsm)
->setParameter('periodId', $period->getId(), Types::INTEGER) ->setParameter('periodId', $period->getId(), Types::INTEGER)
->setParameter('types', $typeIds)
->setParameter('userCreated', $filters['user'])
->setParameter('userReferrer', $filters['user'])
->setParameter('after', $filters['after'])
->setParameter('before', $filters['before'])
->setParameter('limit', $limit, Types::INTEGER) ->setParameter('limit', $limit, Types::INTEGER)
->setParameter('offset', $offset, Types::INTEGER); ->setParameter('offset', $offset, Types::INTEGER);