chill-bundles/src/Bundle/ChillPersonBundle/Repository/AccompanyingPeriod/AccompanyingPeriodWorkEvaluationRepository.php

96 lines
2.8 KiB
PHP

<?php
namespace Chill\PersonBundle\Repository\AccompanyingPeriod;
use Chill\MainBundle\Entity\User;
use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWorkEvaluation;
use DateTimeImmutable;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ObjectRepository;
use UnexpectedValueException;
class AccompanyingPeriodWorkEvaluationRepository implements ObjectRepository
{
private EntityRepository $repository;
public function __construct(EntityManagerInterface $entityManager)
{
$this->repository = $entityManager->getRepository(AccompanyingPeriodWorkEvaluation::class);
}
public function find($id): ?AccompanyingPeriodWorkEvaluation
{
return $this->repository->find($id);
}
/**
* @return array|object[]|AccompanyingPeriodWorkEvaluation[]
*/
public function findAll(): array
{
return $this->repository->findAll();
}
/**
* @param array $criteria
* @param array|null $orderBy
* @param int $limit
* @param int $offset
* @return array|AccompanyingPeriodWorkEvaluation[]|object[]
*/
public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null): array
{
return $this->repository->findBy($criteria, $orderBy, $limit, $offset);
}
public function findOneBy(array $criteria): ?AccompanyingPeriodWorkEvaluation
{
return $this->repository->findOneBy($criteria);
}
public function getClassName(): string
{
return AccompanyingPeriodWorkEvaluation::class;
}
public function countNearMaxDateByUser(User $user): int
{
return $this->buildQueryNearMaxDateByUser($user)
->select('count(e)')->getQuery()->getSingleScalarResult();
}
public function findNearMaxDateByUser(User $user, int $limit = 20, int $offset = 0): array
{
return $this->buildQueryNearMaxDateByUser($user)
->select('e')
->setFirstResult($offset)
->setMaxResults($limit)
->getQuery()
->getResult();
}
private function buildQueryNearMaxDateByUser(User $user): QueryBuilder
{
$qb = $this->repository->createQueryBuilder('e');
$qb
->join('e.accompanyingPeriodWork', 'work')
->join('work.accompanyingPeriod', 'period')
->where(
$qb->expr()->andX(
$qb->expr()->eq('period.user', ':user'),
$qb->expr()->isNull('e.endDate'),
$qb->expr()->gte(':now', $qb->expr()->diff('e.maxDate', 'e.warningInterval'))
)
)
->setParameters([
'user' => $user,
'now' => new \DateTimeImmutable('now')
]);
return $qb;
}
}