fix: exclude unavailable assignments from teamer bookmarks

This commit is contained in:
Björn Fromme
2024-08-23 18:42:02 +02:00
parent 3202fe81ea
commit 21ed817a63
+38 -28
View File
@@ -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');
}
}