Some checks failed
Auto Tag Develop / tag (push) Has been cancelled
| Numéro du ticket | Titre du ticket | |------------------|-----------------| | | | ## Description de la PR ## Modification du .env ## Check list - [ ] Pas de régression - [ ] TU/TI/TF rédigée - [ ] TU/TI/TF OK - [ ] CHANGELOG modifié Reviewed-on: #6 Co-authored-by: tristan <tristan@yuno.malio.fr> Co-committed-by: tristan <tristan@yuno.malio.fr>
160 lines
5.2 KiB
PHP
160 lines
5.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Repository;
|
|
|
|
use App\Entity\Employee;
|
|
use App\Entity\WorkHour;
|
|
use App\Repository\Contract\WorkHourReadRepositoryInterface;
|
|
use DateTimeImmutable;
|
|
use DateTimeInterface;
|
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
|
use Doctrine\Persistence\ManagerRegistry;
|
|
|
|
/**
|
|
* @extends ServiceEntityRepository<WorkHour>
|
|
*/
|
|
final class WorkHourRepository extends ServiceEntityRepository implements WorkHourReadRepositoryInterface
|
|
{
|
|
public function __construct(ManagerRegistry $registry)
|
|
{
|
|
parent::__construct($registry, WorkHour::class);
|
|
}
|
|
|
|
/**
|
|
* @param list<Employee> $employees
|
|
*
|
|
* @return array<int, WorkHour>
|
|
*/
|
|
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<WorkHour> $workHours */
|
|
$workHours = $qb->getQuery()->getResult();
|
|
|
|
$byEmployeeId = [];
|
|
foreach ($workHours as $workHour) {
|
|
$employeeId = $workHour->getEmployee()?->getId();
|
|
if ($employeeId) {
|
|
$byEmployeeId[$employeeId] = $workHour;
|
|
}
|
|
}
|
|
|
|
return $byEmployeeId;
|
|
}
|
|
|
|
/**
|
|
* @param list<Employee> $employees
|
|
*
|
|
* @return list<WorkHour>
|
|
*/
|
|
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<WorkHour> $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;
|
|
}
|
|
}
|