*/ final class WorkHourRepository extends ServiceEntityRepository implements WorkHourReadRepositoryInterface { public function __construct(ManagerRegistry $registry) { parent::__construct($registry, WorkHour::class); } /** * @param list $employees * * @return array */ public function findByDateAndEmployeesIndexedByEmployeeId(DateTimeImmutable $workDate, array $employees): array { if ([] === $employees) { return []; } $qb = $this->createQueryBuilder('w') ->leftJoin('w.employee', 'e') ->addSelect('e') ->andWhere('w.workDate = :workDate') ->andWhere('w.employee IN (:employees)') ->setParameter('workDate', $workDate) ->setParameter('employees', $employees) ; /** @var list $workHours */ $workHours = $qb->getQuery()->getResult(); $byEmployeeId = []; foreach ($workHours as $workHour) { $employeeId = $workHour->getEmployee()?->getId(); if ($employeeId) { $byEmployeeId[$employeeId] = $workHour; } } return $byEmployeeId; } /** * @param list $employees * * @return list */ public function findByDateRangeAndEmployees(DateTimeImmutable $from, DateTimeImmutable $to, array $employees): array { if ([] === $employees) { return []; } $qb = $this->createQueryBuilder('w') ->leftJoin('w.employee', 'e') ->addSelect('e') ->andWhere('w.workDate >= :from') ->andWhere('w.workDate <= :to') ->andWhere('w.employee IN (:employees)') ->setParameter('from', $from) ->setParameter('to', $to) ->setParameter('employees', $employees) ; // @var list $workHours return $qb->getQuery()->getResult(); } public function hasValidatedInRange(Employee $employee, DateTimeInterface $from, DateTimeInterface $to): bool { $fromDate = DateTimeImmutable::createFromInterface($from); $toDate = DateTimeImmutable::createFromInterface($to); $qb = $this->createQueryBuilder('w') ->select('COUNT(w.id)') ->andWhere('w.employee = :employee') ->andWhere('w.workDate >= :from') ->andWhere('w.workDate <= :to') ->andWhere('w.isValid = :isValid') ->setParameter('employee', $employee) ->setParameter('from', $fromDate) ->setParameter('to', $toDate) ->setParameter('isValid', true) ; return ((int) $qb->getQuery()->getSingleScalarResult()) > 0; } public function hasSiteValidatedInRange(Employee $employee, DateTimeInterface $from, DateTimeInterface $to): bool { $fromDate = DateTimeImmutable::createFromInterface($from); $toDate = DateTimeImmutable::createFromInterface($to); $qb = $this->createQueryBuilder('w') ->select('COUNT(w.id)') ->andWhere('w.employee = :employee') ->andWhere('w.workDate >= :from') ->andWhere('w.workDate <= :to') ->andWhere('w.isSiteValid = :isSiteValid') ->setParameter('employee', $employee) ->setParameter('from', $fromDate) ->setParameter('to', $toDate) ->setParameter('isSiteValid', true) ; return ((int) $qb->getQuery()->getSingleScalarResult()) > 0; } public function findOneByEmployeeAndDate(Employee $employee, DateTimeInterface $date): ?WorkHour { $workDate = DateTimeImmutable::createFromInterface($date); $qb = $this->createQueryBuilder('w') ->andWhere('w.employee = :employee') ->andWhere('w.workDate = :workDate') ->setParameter('employee', $employee) ->setParameter('workDate', $workDate) ->setMaxResults(1) ; // @var null|WorkHour $workHour return $qb->getQuery()->getOneOrNullResult(); } public function hasPendingSiteValidationForSiteAndDate(int $siteId, DateTimeInterface $date): bool { $workDate = DateTimeImmutable::createFromInterface($date); $qb = $this->createQueryBuilder('w') ->select('COUNT(w.id)') ->leftJoin('w.employee', 'e') ->leftJoin('e.site', 's') ->andWhere('s.id = :siteId') ->andWhere('w.workDate = :workDate') ->andWhere('w.isSiteValid = :isSiteValid') ->setParameter('siteId', $siteId) ->setParameter('workDate', $workDate) ->setParameter('isSiteValid', false) ; return ((int) $qb->getQuery()->getSingleScalarResult()) > 0; } }