fix: exclude unavailable assignments from teamer bookmarks
This commit is contained in:
@@ -51,33 +51,7 @@ class AssignmentRepository extends ServiceEntityRepository
|
|||||||
public function getListQueryForTeamer(Teamer $teamer, AssignmentFilterDto $filterDto): Query
|
public function getListQueryForTeamer(Teamer $teamer, AssignmentFilterDto $filterDto): Query
|
||||||
{
|
{
|
||||||
// Find ids of assignments with available slots first
|
// Find ids of assignments with available slots first
|
||||||
$qb = $this->createQueryBuilder('assignment');
|
$availableAssignmentsIds = $this->getAvailableAssignmentsIds();
|
||||||
|
|
||||||
$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');
|
|
||||||
|
|
||||||
$qb = $this->createQueryBuilder('assignment');
|
$qb = $this->createQueryBuilder('assignment');
|
||||||
|
|
||||||
@@ -178,6 +152,9 @@ class AssignmentRepository extends ServiceEntityRepository
|
|||||||
|
|
||||||
public function getBookmarkQueryForTeamer(Teamer $teamer): Query
|
public function getBookmarkQueryForTeamer(Teamer $teamer): Query
|
||||||
{
|
{
|
||||||
|
// Find ids of assignments with available slots first
|
||||||
|
$availableAssignmentsIds = $this->getAvailableAssignmentsIds();
|
||||||
|
|
||||||
$qb = $this->createQueryBuilder('assignment');
|
$qb = $this->createQueryBuilder('assignment');
|
||||||
|
|
||||||
$qb
|
$qb
|
||||||
@@ -187,7 +164,10 @@ class AssignmentRepository extends ServiceEntityRepository
|
|||||||
->innerJoin('assignment.teamers', 'teamer', Join::WITH, $qb->expr()->eq('teamer', ':teamer'))
|
->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.applications', 'application', Join::WITH, $qb->expr()->eq('application.teamer', ':teamer'))
|
||||||
->leftJoin('assignment.dispositions', 'disposition', Join::WITH, $qb->expr()->eq('disposition.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)
|
->setParameter('teamer', $teamer)
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -292,4 +272,34 @@ class AssignmentRepository extends ServiceEntityRepository
|
|||||||
->getResult()
|
->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');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user