fix: use correct database query to find overlapping applications
addresses #869aug4uz
This commit is contained in:
@@ -38,6 +38,7 @@ class InvalidateApplicationsListener
|
||||
// - Complete containment in either direction
|
||||
// - Exact date matches
|
||||
// Note: Periods that only touch at boundaries (e.g., Jan 1-7 and Jan 7-12) are NOT considered overlapping
|
||||
// The effective dates are determined by checking assignment dates first, falling back to destination dates if null
|
||||
$qb = $this
|
||||
->entityManager
|
||||
->getRepository(Application::class)
|
||||
@@ -46,10 +47,29 @@ class InvalidateApplicationsListener
|
||||
/** @var array<Application> $applications */
|
||||
$applications = $qb
|
||||
->innerJoin('application.assignment', 'assignment')
|
||||
->innerJoin('assignment.destination', 'destination')
|
||||
->where($qb->expr()->andX(
|
||||
$qb->expr()->eq('application.teamer', ':teamer'),
|
||||
$qb->expr()->lt('assignment.dateFrom', ':dateTo'),
|
||||
$qb->expr()->gt('assignment.dateTo', ':dateFrom'),
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->isNull('assignment.dateFrom'),
|
||||
$qb->expr()->lt('destination.dateFrom', ':dateTo')
|
||||
),
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->isNotNull('assignment.dateFrom'),
|
||||
$qb->expr()->lt('assignment.dateFrom', ':dateTo')
|
||||
)
|
||||
),
|
||||
$qb->expr()->orX(
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->isNull('assignment.dateTo'),
|
||||
$qb->expr()->gt('destination.dateTo', ':dateFrom')
|
||||
),
|
||||
$qb->expr()->andX(
|
||||
$qb->expr()->isNotNull('assignment.dateTo'),
|
||||
$qb->expr()->gt('assignment.dateTo', ':dateFrom')
|
||||
)
|
||||
),
|
||||
$qb->expr()->neq('application.status', ':status')
|
||||
))
|
||||
->setParameter('teamer', $teamer)
|
||||
|
||||
@@ -306,10 +306,13 @@ class InvalidateApplicationsListenerTest extends TestCase
|
||||
|
||||
$expr = $this->createMock(Expr::class);
|
||||
$expr->method('andX')->willReturnSelf();
|
||||
$expr->method('orX')->willReturnSelf();
|
||||
$expr->method('eq')->willReturnSelf();
|
||||
$expr->method('lte')->willReturnSelf();
|
||||
$expr->method('gte')->willReturnSelf();
|
||||
$expr->method('lt')->willReturnSelf();
|
||||
$expr->method('gt')->willReturnSelf();
|
||||
$expr->method('neq')->willReturnSelf();
|
||||
$expr->method('isNull')->willReturnSelf();
|
||||
$expr->method('isNotNull')->willReturnSelf();
|
||||
|
||||
$queryBuilder = $this->createMock(QueryBuilder::class);
|
||||
$queryBuilder->method('expr')->willReturn($expr);
|
||||
|
||||
Reference in New Issue
Block a user