From 21ed817a6305efd3528a7671b809fb6756e6bbe2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Fri, 23 Aug 2024 18:42:02 +0200 Subject: [PATCH] fix: exclude unavailable assignments from teamer bookmarks --- src/Repository/AssignmentRepository.php | 66 ++++++++++++++----------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/src/Repository/AssignmentRepository.php b/src/Repository/AssignmentRepository.php index 17af212..ee3ea3a 100644 --- a/src/Repository/AssignmentRepository.php +++ b/src/Repository/AssignmentRepository.php @@ -51,33 +51,7 @@ class AssignmentRepository extends ServiceEntityRepository public function getListQueryForTeamer(Teamer $teamer, AssignmentFilterDto $filterDto): Query { // Find ids of assignments with available slots first - $qb = $this->createQueryBuilder('assignment'); - - $availableAssignments = $qb - ->select('assignment.id') - ->leftJoin('assignment.dispositions', 'disposition') - ->innerJoin('assignment.destination', 'destination') - ->where($qb->expr()->andX( - $qb->expr()->orX( - $qb->expr()->gt('destination.dateFrom', ':now'), - $qb->expr()->andX( - $qb->expr()->isNotNull('assignment.dateFrom'), - $qb->expr()->gt('assignment.dateFrom', ':now') - ) - ), - $qb->expr()->neq('assignment.status', ':status'), - $qb->expr()->isNull('assignment.deletedAt') - )) - ->groupBy('assignment') - ->having($qb->expr()->gt('assignment.availableDispositions', $qb->expr()->count('disposition.id'))) - ->setParameter('status', Assignment::STATUS_DRAFT) - ->setParameter('now', new \DateTimeImmutable()) - ->getQuery() - ->getArrayResult() - ; - - // Extract ids of available assignments for the following query - $availableAssignmentsIds = array_column($availableAssignments, 'id'); + $availableAssignmentsIds = $this->getAvailableAssignmentsIds(); $qb = $this->createQueryBuilder('assignment'); @@ -178,6 +152,9 @@ class AssignmentRepository extends ServiceEntityRepository public function getBookmarkQueryForTeamer(Teamer $teamer): Query { + // Find ids of assignments with available slots first + $availableAssignmentsIds = $this->getAvailableAssignmentsIds(); + $qb = $this->createQueryBuilder('assignment'); $qb @@ -187,7 +164,10 @@ class AssignmentRepository extends ServiceEntityRepository ->innerJoin('assignment.teamers', 'teamer', Join::WITH, $qb->expr()->eq('teamer', ':teamer')) ->leftJoin('assignment.applications', 'application', Join::WITH, $qb->expr()->eq('application.teamer', ':teamer')) ->leftJoin('assignment.dispositions', 'disposition', Join::WITH, $qb->expr()->eq('disposition.teamer', ':teamer')) - ->where($qb->expr()->isNull('assignment.deletedAt')) + ->where($qb->expr()->andX( + $qb->expr()->isNull('assignment.deletedAt'), + $qb->expr()->in('assignment.id', $availableAssignmentsIds) + )) ->setParameter('teamer', $teamer) ; @@ -292,4 +272,34 @@ class AssignmentRepository extends ServiceEntityRepository ->getResult() ; } + + private function getAvailableAssignmentsIds(): array + { + $qb = $this->createQueryBuilder('assignment'); + + $availableAssignments = $qb + ->select('assignment.id') + ->leftJoin('assignment.dispositions', 'disposition') + ->innerJoin('assignment.destination', 'destination') + ->where($qb->expr()->andX( + $qb->expr()->orX( + $qb->expr()->gt('destination.dateFrom', ':now'), + $qb->expr()->andX( + $qb->expr()->isNotNull('assignment.dateFrom'), + $qb->expr()->gt('assignment.dateFrom', ':now') + ) + ), + $qb->expr()->neq('assignment.status', ':status'), + $qb->expr()->isNull('assignment.deletedAt') + )) + ->groupBy('assignment') + ->having($qb->expr()->gt('assignment.availableDispositions', $qb->expr()->count('disposition.id'))) + ->setParameter('status', Assignment::STATUS_DRAFT) + ->setParameter('now', new \DateTimeImmutable()) + ->getQuery() + ->getArrayResult() + ; + + return array_column($availableAssignments, 'id'); + } }