addSelect($select); } public function selectCount(): self { return $this ->select('count(r.id) as total'); } public function filterByUser(UserInterface $user): self { return $this ->andWhere('.user = :user') ->setParameter('user', $user); } public function filterIsMerchantOnline(): self { $this->joinMerchant(); return $this ->andWhere('merchant.status = :status') ->setParameter(':status', 1); } public function filterByDateStart(string $dateField, DateTime $dateStart): self { return $this ->andWhere('.' . $dateField . ' >= :dateStart') ->setParameter('dateStart', $dateStart); } public function filterByDateEnd(string $dateField, DateTime $dateEnd): self { return $this ->andWhere('.' . $dateField . ' <= :dateEnd') ->setParameter('dateEnd', $dateEnd); } public function filterByVisitor(VisitorInterface $visitor): self { return $this ->andWhere('.visitor = :visitor') ->setParameter('visitor', $visitor); } public function filterByAddress(AddressInterface $address): self { return $this ->andWhere('.deliveryAddress = :address OR .invoiceAddress = :address') ->setParameter('address', $address); } public function filterByStatus(array $statusArray): self { $this->joinOrderStatus(); return $this ->andWhere('os.alias IN (:alias)') ->setParameter('alias', $statusArray); } public function filterByReductionCredit(ReductionCreditInterface $reductionCredit): self { $this->joinOrderReductionCredits(); return $this ->andWhere('orc.reductionCredit = :reductionCredit') ->setParameter('reductionCredit', $reductionCredit); } public function filterByReductionCart(ReductionCartInterface $reductionCart): self { $this->joinOrderReductionCarts(); return $this ->andWhere('orcart.reductionCart = :reductionCart') ->setParameter('reductionCart', $reductionCart); } public function filterByCycleNumber(int $cycleNumber): self { return $this ->andWhere('.cycleNumber = :cycleNumber') ->setParameter('cycleNumber', $cycleNumber); } public function filterIsNotComplementaryOrderShop(): self { return $this ->andWhere('.mainOrderShop = false OR .mainOrderShop IS NULL'); } public function filterIsNullMainOrderShop(): self { return $this ->andWhere('.mainOrderShop IS NULL'); } public function selectOrderReductionCarts(): self { $this->joinOrderReductionCarts(); return $this->addSelect('orcart'); } public function joinOrderReductionCredits(): self { if (!$this->isJoinOrderReductionCredits) { $this->isJoinOrderReductionCredits = true; return $this ->innerJoin('.orderReductionCredits', 'orc'); } return $this; } public function joinOrderStatus(): self { if (!$this->isJoinOrderStatus) { $this->isJoinOrderStatus = true; return $this ->leftJoin('.orderStatus', 'os'); } return $this; } public function joinOrderReductionCarts(): self { if (!$this->isJoinOrderReductionCarts) { $this->isJoinOrderReductionCarts = true; return $this ->leftJoin('.orderReductionCarts', 'orcart'); } return $this; } public function joinMerchant(): self { $this->joinSection(); if (!$this->isJoinMerchant) { $this->isJoinMerchant = true; return $this ->leftJoin('s.merchant', 'merchant'); } return $this; } public function joinSection(): self { if (!$this->isJoinSection) { $this->isJoinSection = true; return $this ->leftJoin('.section', 's'); } return $this; } public function joinComplementaryOrderShops(): self { if (!$this->isJoinComplementaryOrderShops) { $this->isJoinComplementaryOrderShops = true; return $this ->leftJoin('.complementaryOrderShops', 'complementaryOrderShops'); } return $this; } public function joinDeliveryPointSale(): self { if (!$this->isJoinDeliveryPointSale) { $this->isJoinDeliveryPointSale = true; return $this ->leftJoin('.deliveryPointSale', 'pointSale'); } return $this; } }