src/Repository/Offer/OfferRepository.php line 17

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\Repository\Offer;
  4. use DateTimeImmutable;
  5. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use Slivki\Entity\Offer;
  8. use Slivki\Exception\OfferNotFoundException;
  9. use function sprintf;
  10. final class OfferRepository extends ServiceEntityRepository implements OfferRepositoryInterface
  11. {
  12.     public function __construct(ManagerRegistry $registry)
  13.     {
  14.         parent::__construct($registryOffer::class);
  15.     }
  16.     public function findById(int $id): ?Offer
  17.     {
  18.         $queryBuilder $this->createQueryBuilder('offer');
  19.         $expr $queryBuilder->expr();
  20.         return $queryBuilder
  21.             ->andWhere($expr->eq('offer.ID'':id'))
  22.             ->setParameter('id'$id)
  23.             ->getQuery()
  24.             ->getOneOrNullResult();
  25.     }
  26.     public function getById(int $id): Offer
  27.     {
  28.         $offer $this->findById($id);
  29.         if (!$offer instanceof Offer) {
  30.             throw OfferNotFoundException::missingId($id);
  31.         }
  32.         return $offer;
  33.     }
  34.     public function getByIdAndDirector(int $idint $directorId): Offer
  35.     {
  36.         $qb $this->createQueryBuilder('offer');
  37.         $expr $qb->expr();
  38.         $offer $qb
  39.             ->innerJoin('offer.directors''director')
  40.             ->andWhere($expr->eq('offer.ID'':id'))
  41.             ->andWhere($expr->eq('director.ID'':directorId'))
  42.             ->setParameters([
  43.                 'id' => $id,
  44.                 'directorId' => $directorId,
  45.             ])
  46.             ->getQuery()
  47.             ->getOneOrNullResult();
  48.         if (!$offer instanceof Offer) {
  49.             throw OfferNotFoundException::missingId($id);
  50.         }
  51.         return $offer;
  52.     }
  53.     public function findActiveOffersByIds(array $offerIds): array
  54.     {
  55.         $queryBuilder $this->createQueryBuilder('offer');
  56.         $expr $queryBuilder->expr();
  57.         return $queryBuilder
  58.             ->andWhere($expr->in('offer.ID'':offerIds'))
  59.             ->andWhere($expr->eq('offer.active'':active'))
  60.             ->andWhere($expr->eq('offer.hidden'':hidden'))
  61.             ->andWhere($expr->between('current_timestamp()''offer.activeSince''offer.activeTill'))
  62.             ->setParameters([
  63.                 'offerIds' => $offerIds,
  64.                 'active' => true,
  65.                 'hidden' => false,
  66.             ])
  67.             ->getQuery()
  68.             ->getResult();
  69.     }
  70.     public function clear(): void
  71.     {
  72.         $this->_em->clear(Offer::class);
  73.     }
  74.     public function findAllActiveByDirector(int $directorId): array
  75.     {
  76.         $qb $this->createQueryBuilder('offer');
  77.         $expr $qb->expr();
  78.         return $qb
  79.             ->innerJoin('offer.directors''director')
  80.             ->andWhere($expr->eq('director.ID'':directorId'))
  81.             ->andWhere($expr->eq('offer.active'':active'))
  82.             ->andWhere($expr->eq('offer.hidden'':hidden'))
  83.             ->andWhere($expr->between('current_timestamp()''offer.activeSince''offer.activeTill'))
  84.             ->setParameters([
  85.                 'active' => true,
  86.                 'hidden' => false,
  87.                 'directorId' => $directorId,
  88.             ])
  89.             ->getQuery()
  90.             ->getResult();
  91.     }
  92.     public function findWithOnlineOrderAllowed(int $onlineOrderAllowedRemovedAtDaysBefore): array
  93.     {
  94.         $qb $this->createQueryBuilder('offer');
  95.         $expr $qb->expr();
  96.         return $qb
  97.             ->andWhere(
  98.                 $expr->orX(
  99.                     $expr->isNotNull('offer.allowedOnlineOrderTypes'),
  100.                     $expr->gt('offer.onlineOrderAllowedRemovedAt'':onlineOrderAllowedRemovedAt'),
  101.                 )
  102.             )
  103.             ->setParameters([
  104.                 'onlineOrderAllowedRemovedAt' => (new DateTimeImmutable())
  105.                     ->modify(sprintf('-%d days'$onlineOrderAllowedRemovedAtDaysBefore))
  106.                     ->format('Y-m-d H:i:s'),
  107.             ])
  108.             ->getQuery()
  109.             ->getResult();
  110.     }
  111. }