選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

302 行
13KB

  1. <?php
  2. namespace Lc\ShopBundle\Repository;
  3. use App\Entity\DeliveryAvailabilityPointSale;
  4. use App\Entity\DeliveryAvailabilityZone;
  5. use Doctrine\ORM\QueryBuilder;
  6. use Lc\ShopBundle\Context\DefaultRepositoryInterface;
  7. use Lc\ShopBundle\Context\OrderShopInterface;
  8. use Lc\ShopBundle\Model\OrderStatus;
  9. /**
  10. * @method OrderShopInterface|null find($id, $lockMode = null, $lockVersion = null)
  11. * @method OrderShopInterface|null findOneBy(array $criteria, array $orderBy = null)
  12. * @method OrderShopInterface[] findAll()
  13. * @method OrderShopInterface[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  14. */
  15. class OrderShopRepository extends BaseRepository implements DefaultRepositoryInterface
  16. {
  17. public function getInterfaceClass()
  18. {
  19. return OrderShopInterface::class;
  20. }
  21. public function countValidOrderWithReductionCredit($reductionCredit, $user)
  22. {
  23. $query = $this->findByMerchantQuery();
  24. $query = $this->filterOrderValid($query);
  25. $query->select('count(e.id)');
  26. $query->andWhere('e.user = :user');
  27. $query->innerJoin('e.orderReductionCredits', 'orc');
  28. $query->andWhere('orc.reductionCredit = :reductionCredit');
  29. $query->setParameter('reductionCredit', $reductionCredit);
  30. $query->setParameter('user', $user);
  31. return $query->getQuery()->getSingleScalarResult();
  32. }
  33. public function countValidOrderWithReductionCart($reductionCart)
  34. {
  35. $query = $this->findByMerchantQuery();
  36. $query = $this->filterOrderValid($query);
  37. $query->select('count(e.id)');
  38. $query->join('e.orderReductionCarts', 'orc');
  39. $query->andWhere('orc.reductionCart = :reductionCart');
  40. $query->setParameter('reductionCart', $reductionCart);
  41. return $query->getQuery()->getSingleScalarResult();
  42. }
  43. public function countValidOrderWithReductionCartPerUser($reductionCart, $user)
  44. {
  45. $query = $this->findByMerchantQuery();
  46. $query = $this->filterOrderValid($query);
  47. $query->select('count(e.id)');
  48. $query->andWhere('e.user = :user');
  49. $query->join('e.orderReductionCarts', 'orc');
  50. $query->andWhere('orc.reductionCart = :reductionCart');
  51. $query->setParameter('reductionCart', $reductionCart);
  52. $query->setParameter('user', $user);
  53. return $query->getQuery()->getSingleScalarResult();
  54. }
  55. public function filterOrderValid(?QueryBuilder $query): QueryBuilder
  56. {
  57. return $this->_filterOrderStatus($query, OrderStatus::$statusAliasAsValid) ;
  58. }
  59. public function filterOrderWaitingDelivery($query)
  60. {
  61. return $this->_filterOrderStatus($query, OrderStatus::$statusAliasWaitingDelivery) ;
  62. }
  63. public function filterOrderCart($query)
  64. {
  65. return $this->_filterOrderStatus($query, OrderStatus::$statusAliasAsCart) ;
  66. }
  67. private function _filterOrderStatus($query, $statusArray) {
  68. $query->leftJoin('e.orderStatus', 'os');
  69. $query->andWhere('os.alias IN (:alias)');
  70. $query->setParameter('alias',$statusArray);
  71. return $query ;
  72. }
  73. public function findCartCurrent($params)
  74. {
  75. $query = $this->findByMerchantQuery();
  76. if (isset($params['user'])) {
  77. $query->andWhere('e.user = :user')->setParameter('user', $params['user']);
  78. }
  79. if (isset($params['visitor'])) {
  80. $query->andWhere('e.visitor = :visitor')->setParameter('visitor', $params['visitor']);
  81. }
  82. $query = $this->filterOrderCart($query);
  83. $query->leftJoin('e.orderReductionCarts', 'orderReductionCarts')
  84. ->addSelect('orderReductionCarts');
  85. $results = $query->getQuery()->getResult();
  86. if ($results) {
  87. return $results[0];
  88. }
  89. return null;
  90. }
  91. public function findAllBy($params = [])
  92. {
  93. $query = $this->findByMerchantQuery();
  94. if (isset($params['count']) && $params['count']) {
  95. $query->select('count(e.id)');
  96. }
  97. if (isset($params['select'])) {
  98. $query->select( $params['select']);
  99. }
  100. if (isset($params['dateStart']) || isset($params['dateEnd'])) {
  101. $params['dateField'] = isset($params['dateField']) ? $params['dateField'] : 'validationDate';
  102. }
  103. if (isset($params['dateStart'])) {
  104. $query->andWhere('e.' . $params['dateField'] . ' >= :dateStart')->setParameter('dateStart', $params['dateStart']);
  105. }
  106. if (isset($params['dateEnd'])) {
  107. $query->andWhere('e.' . $params['dateField'] . ' <= :dateEnd')->setParameter('dateEnd', $params['dateEnd']);
  108. }
  109. if (isset($params['weekNumber'])) {
  110. $query->andWhere('e.weekNumber = :weekNumber')->setParameter('weekNumber', $params['weekNumber']);
  111. }
  112. if (isset($params['isCart'])) {
  113. $query = $this->filterOrderCart($query);
  114. }
  115. if (isset($params['isValid'])) {
  116. $query = $this->filterOrderValid($query);
  117. }
  118. if (isset($params['isWaitingDelivery'])) {
  119. $query = $this->filterOrderWaitingDelivery($query);
  120. }
  121. if (isset($params['orderStatus'])) {
  122. $query->leftJoin('e.orderStatus', 'os');
  123. $query->andWhere('os.alias LIKE :alias');
  124. $query->setParameter('alias', $params['orderStatus']);
  125. }
  126. if (isset($params['user'])) {
  127. $query->andWhere('e.user = :user')->setParameter('user', $params['user']);
  128. }
  129. if(isset($params['address'])) {
  130. $query->andWhere('e.deliveryAddress = :address OR e.invoiceAddress = :address')->setParameter('address', $params['address']);
  131. }
  132. if(isset($params['weekDeliveryTruck'])) {
  133. $query->andWhere('e.weekDeliveryTruck = :weekDeliveryTruck')->setParameter('weekDeliveryTruck', $params['weekDeliveryTruck']);
  134. }
  135. if(isset($params['estimatedDeliveryDateTime'])) {
  136. $query->andWhere('e.estimatedDeliveryDateTime >= :deliveryDateStart');
  137. $query->andWhere('e.estimatedDeliveryDateTime < :deliveryDateEnd');
  138. $date = clone $params['estimatedDeliveryDateTime'];
  139. $query->setParameter('deliveryDateStart', $date->format('Y-m-d 00:00:00'));
  140. $query->setParameter('deliveryDateEnd', $date->modify('+1 day')->format('Y-m-d 00:00:00'));
  141. }
  142. if (isset($params['mergeComplementaryOrderShops'])) {
  143. $query->andWhere('e.mainOrderShop IS NULL');
  144. $query->leftJoin('e.complementaryOrderShops', 'complementaryOrderShops');
  145. $query->leftJoin('complementaryOrderShops.orderStatus', 'complementaryOrderStatus');
  146. $query->andWhere('complementaryOrderShops IS NULL OR complementaryOrderStatus.alias IN (:statusAliasValid)');
  147. $query->setParameter('statusAliasValid', OrderStatus::$statusAliasAsValid);
  148. }
  149. if (isset($params['excludeComplementaryOrderShops'])) {
  150. $query->andWhere('e.mainOrderShop IS NULL');
  151. }
  152. $setParameterHorsTournee = false ;
  153. if (isset($params['isCircuit'])) {
  154. $query->leftJoin('e.deliveryPointSale', 'pointSale');
  155. $query->andWhere('e.deliveryPointSale IS NULL OR (pointSale.isDepository = 0 AND (pointSale.devAlias IS NULL OR pointSale.devAlias != :devAliasHorsTournee))');
  156. $setParameterHorsTournee = true ;
  157. }
  158. if (isset($params['isDepository'])) {
  159. $query->innerJoin('e.deliveryPointSale', 'pointSale');
  160. $query->andWhere('pointSale IS NOT NULL AND pointSale.isDepository = 1 AND (pointSale.devAlias IS NULL OR pointSale.devAlias != :devAliasHorsTournee)');
  161. $setParameterHorsTournee = true ;
  162. }
  163. if (isset($params['isOffCircuit'])) {
  164. $query->innerJoin('e.deliveryPointSale', 'pointSale');
  165. $query->andWhere('pointSale IS NOT NULL AND pointSale.devAlias = :devAliasHorsTournee');
  166. $setParameterHorsTournee = true ;
  167. }
  168. if($setParameterHorsTournee) {
  169. $query->setParameter('devAliasHorsTournee', 'horstournee') ;
  170. }
  171. if (isset($params['deliveryAvailability'])) {
  172. $deliveryAvailability = $params['deliveryAvailability'] ;
  173. $deliveryAvailabilityZone = ($deliveryAvailability instanceof DeliveryAvailabilityZone) ? $deliveryAvailability : false;
  174. $deliveryAvailabilityPointSale = ($deliveryAvailability instanceof DeliveryAvailabilityPointSale) ? $deliveryAvailability : false;
  175. if($deliveryAvailabilityZone){
  176. $query->andWhere('e.deliveryAvailabilityZone = :deliveryAvailabilityZone');
  177. $query->setParameter('deliveryAvailabilityZone', $deliveryAvailabilityZone);
  178. }
  179. if($deliveryAvailabilityPointSale) {
  180. $query->andWhere('e.deliveryAvailabilityPointSale = :deliveryAvailabilityPointSale');
  181. $query->setParameter('deliveryAvailabilityPointSale', $deliveryAvailabilityPointSale);
  182. }
  183. }
  184. else{
  185. $query->leftJoin('e.deliveryAvailabilityZone', 'deliveryAvailabilityZone');
  186. $query->leftJoin('deliveryAvailabilityZone.deliverySlot', 'deliverySlotZone');
  187. $query->leftJoin('e.deliveryAvailabilityPointSale', 'deliveryAvailabilityPointSale');
  188. $query->leftJoin('deliveryAvailabilityPointSale.deliverySlot', 'deliverySlotPointSale');
  189. }
  190. if (isset($params['orderBy'])) {
  191. $query->orderBy('e.' . $params['orderBy'], isset($params['orderByDirection']) ? $params['orderByDirection'] : 'DESC');
  192. } else {
  193. $query->orderBy('e.id', 'DESC');
  194. }
  195. if (isset($params['groupBy'])) {
  196. $query->groupBy( $params['groupBy']);
  197. }
  198. if (isset($params['count']) && $params['count']) {
  199. return $query->getQuery()->getSingleScalarResult();
  200. } else {
  201. return $query->getQuery()->getResult();
  202. }
  203. }
  204. public function findLastOrderValidOfWeek($weekNumber)
  205. {
  206. $query = $this->findByMerchantQuery();
  207. $query = $this->filterOrderValid($query);
  208. $query->andWhere('e.weekNumber = :weekNumber');
  209. $query->andWhere('e.mainOrderShop = false OR e.mainOrderShop IS NULL');
  210. $query->setParameter('weekNumber', $weekNumber);
  211. $query->orderBy('e.weekId', 'DESC');
  212. $query->setMaxResults(1);
  213. return $query->getQuery()->getOneOrNullResult();
  214. }
  215. public function findLastOrderValid()
  216. {
  217. $query = $this->findByMerchantQuery();
  218. $query = $this->filterOrderValid($query);
  219. $query->andWhere('e.mainOrderShop = false OR e.mainOrderShop IS NULL');
  220. $query->orderBy('e.idValidOrder', 'DESC');
  221. $query->setMaxResults(1);
  222. return $query->getQuery()->getOneOrNullResult();
  223. }
  224. public function countValidOrderProductsOfWeekByProduct($weekNumber, $productId)
  225. {
  226. $query = $this->findByMerchantQuery();
  227. $query = $this->filterOrderValid($query);
  228. $query->andWhere('e.weekNumber = :weekNumber');
  229. $query->setParameter('weekNumber', $weekNumber);
  230. $query->leftJoin('e.orderProducts', 'orderProduct');
  231. $query->andWhere('orderProduct.product = :product');
  232. $query->setParameter('product', $productId);
  233. $query->select('SUM(orderProduct.quantityOrder) as quantity');
  234. $result = $query->getQuery()->getOneOrNullResult();
  235. return $result['quantity'];
  236. }
  237. }