vendor/af/ph-database/src/Repository/PriceListCommodityRepository.php line 40

Open in your IDE?
  1. <?php
  2. namespace AF\PHDatabase\Repository;
  3. use App\Controller\CalendarController;
  4. use AF\PHDatabase\Entity\PriceListCommodity;
  5. use App\Enum\PriceListPeopleEnum;
  6. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  7. use Doctrine\ORM\Query\Expr\Join;
  8. use Doctrine\Persistence\ManagerRegistry;
  9. /**
  10.  * @method PriceListCommodity|null find($id, $lockMode = null, $lockVersion = null)
  11.  * @method PriceListCommodity|null findOneBy(array $criteria, array $orderBy = null)
  12.  * @method PriceListCommodity[]    findAll()
  13.  * @method PriceListCommodity[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  14.  */
  15. class PriceListCommodityRepository extends ServiceEntityRepository
  16. {
  17.     // Po tym polu rozróżniamy, czy cennik jest dla osoby dorosłej czy dziecka
  18.     private $searchField 'seatsNumber'//peopleNumber
  19.     public function __construct(ManagerRegistry $registry)
  20.     {
  21.         parent::__construct($registryPriceListCommodity::class);
  22.     }
  23.     /**
  24.      * Zwraca kwoty z podanego standardu w wyznaczonym okresie czasu. Zawiera duplikaty (ten sam okres czasu).
  25.      * Kwoty są pobierane dla całego pokoju.
  26.      *
  27.      * Brak zdefiniowania daty końca oznacza, że pobiera wszystkie cenniki do końca.
  28.      *
  29.      * @param \DateTime $dateStart
  30.      * @param \DateTime|null $dateEnd
  31.      * @param int $roomStandard
  32.      * @return array
  33.      */
  34.     public function getLowestPrice(\DateTime $dateStart, ?\DateTime $dateEndint $roomStandard): array
  35.     {
  36.         $parameters = [
  37.             'name' => 'www_%',
  38.             'peopleNumber' => PriceListPeopleEnum::ADULT,  // Nie możemy używać cennika "Cały pokój", musimy mnożyć cenę za osobę dorosłą
  39.             'roomStandard' => $roomStandard,
  40.             'dateStart' => $dateStart->format('Y-m-d'),
  41.         ];
  42.         $dateEndAvailable false;
  43.         if ( $dateEnd !== null && $dateEnd->getTimestamp() > $dateStart->getTimestamp() ) {
  44.             $dateEndAvailable true;
  45.             $parameters['dateEnd'] = $dateEnd->format('Y-m-d');
  46.         }
  47.         return $this->getEntityManager()
  48.             ->createQuery('SELECT c, p FROM AF\PHDatabase\Entity\PriceListCommodity c
  49.                 INNER JOIN c.priceList p WITH p.isAvailableForWebsite = true
  50.                 WHERE p.name LIKE :name AND c.'.$this->searchField.' = :peopleNumber AND c.roomStandard = :roomStandard
  51.                     AND ( 
  52.                         (p.availableFrom >= :dateStart'.($dateEndAvailable ' AND p.availableUntil <= :dateEnd' '').')
  53.                         OR (p.availableFrom <= :dateStart AND p.availableUntil >= :dateStart)
  54.                         '.($dateEndAvailable 'OR (p.availableFrom <= :dateEnd AND p.availableUntil >= :dateEnd)' '').'
  55.                     )
  56.                 ORDER BY p.availableFrom, c.price')
  57.             ->setParameters($parameters)
  58.             ->getResult();
  59.     }
  60.     /**
  61.      * Zwraca wpis, który zawiera maksymalny dzień, do którego został wprowadzony cennik (obowiązuje do...)
  62.      *
  63.      * @param int $roomStandard
  64.      * @return int|mixed|string|null
  65.      * @throws \Doctrine\ORM\NonUniqueResultException
  66.      */
  67.     public function getMaxDate(int $roomStandard)
  68.     {
  69.         return $this->getEntityManager()
  70.             ->createQuery('SELECT c, p FROM AF\PHDatabase\Entity\PriceListCommodity c
  71.                 INNER JOIN c.priceList p WITH p.isAvailableForWebsite = true
  72.                 WHERE p.name LIKE :name AND c.'.$this->searchField.' = :peopleNumber AND c.roomStandard = :roomStandard
  73.                 ORDER BY p.availableUntil DESC, c.price')
  74.             ->setParameters([
  75.                 'peopleNumber' => PriceListPeopleEnum::ADULT,
  76.                 'roomStandard' => $roomStandard,
  77.                 'name' => 'www_%'
  78.             ])
  79.             ->setMaxResults(1)
  80.             ->getOneOrNullResult();
  81.     }
  82.     /**
  83.      * Zwraca cenniki do podanych standardów w określonym przedziale czasu
  84.      *
  85.      * @param string $dateStart
  86.      * @param string $dateEnd
  87.      * @param array $roomStandards
  88.      * @return array
  89.      */
  90.     public function getPricesByStandards(string $dateStartstring $dateEnd, array $roomStandards): array
  91.     {
  92.         return $this->getEntityManager()
  93.             ->createQuery('SELECT c, p FROM AF\PHDatabase\Entity\PriceListCommodity c
  94.                 INNER JOIN c.priceList p WITH p.isAvailableForWebsite = true
  95.                 WHERE c.roomStandard IN (:roomStandards) AND p.name LIKE :name
  96.                     AND ( 
  97.                         (p.availableFrom >= :dateStart AND p.availableUntil <= :dateEnd)
  98.                         OR (p.availableFrom <= :dateStart AND p.availableUntil >= :dateStart)
  99.                         OR (p.availableFrom <= :dateEnd AND p.availableUntil >= :dateEnd)
  100.                     )
  101.                 ORDER BY p.availableFrom, c.roomStandard, c.'.$this->searchField)
  102.             ->setParameters([
  103.                 'roomStandards' => $roomStandards,
  104.                 'dateStart' => $dateStart,
  105.                 'dateEnd' => $dateEnd,
  106.                 'name' => 'www_%'
  107.             ])
  108.             ->getResult();
  109.     }
  110. }