Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

174 lines
6.3KB

  1. <?php
  2. namespace Lc\CaracoleBundle\Repository\Product;
  3. use Knp\Component\Pager\PaginatorInterface;
  4. use Lc\CaracoleBundle\Model\Merchant\MerchantInterface;
  5. use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface;
  6. use Lc\CaracoleBundle\Model\Product\ProductFamilyModel;
  7. use Lc\CaracoleBundle\Model\Section\SectionInterface;
  8. use Lc\SovBundle\Repository\AbstractRepositoryQuery;
  9. use Lc\SovBundle\Repository\RepositoryQueryInterface;
  10. class ProductRepositoryQuery extends AbstractRepositoryQuery
  11. {
  12. protected bool $isJoinProductFamily =false;
  13. protected bool $isJoinSections =false;
  14. protected bool $isJoinProductFamilySectionProperties =false;
  15. public function __construct(ProductRepository $repository, PaginatorInterface $paginator)
  16. {
  17. parent::__construct($repository, 'product', $paginator);
  18. }
  19. public function orderByDefault(): \Lc\SovBundle\Repository\AbstractRepositoryQuery
  20. {
  21. return $this->orderBy('position', 'ASC');
  22. }
  23. public function joinProductFamily():self
  24. {
  25. if (!$this->isJoinProductFamily) {
  26. $this->isJoinProductFamily = true;
  27. return $this
  28. ->innerJoin('.productFamily', 'productFamily')
  29. ->addSelect('productFamily');
  30. }
  31. return $this;
  32. }
  33. public function filterBySection(SectionInterface $section):self
  34. {
  35. $this->joinProductFamilySectionProperties(false);
  36. $this->andWhereSection('productFamilySectionProperties', $section);
  37. $this->andWhere('productFamilySectionProperties.status = 1');
  38. return $this;
  39. }
  40. public function filterByMerchantViaSection(MerchantInterface $merchant)
  41. {
  42. $this->joinProductFamilySectionProperties(false);
  43. $this->joinSections(false);
  44. $this->andWhereMerchant('section', $merchant);
  45. $this->andWhere('productFamilySectionProperties.status = 1');
  46. }
  47. public function joinSections(bool $addSelect = true): self
  48. {
  49. if (!$this->isJoinSections) {
  50. $this->isJoinSections = true;
  51. $this->leftJoin('productFamilySectionProperties.section', 'section');
  52. if ($addSelect) {
  53. $this->addSelect('section');
  54. }
  55. }
  56. return $this;
  57. }
  58. public function joinProductFamilySectionProperties(bool $addSelect = true): self
  59. {
  60. $this->joinProductFamily();
  61. if (!$this->isJoinProductFamilySectionProperties) {
  62. $this->isJoinProductFamilySectionProperties = true;
  63. $this->leftJoin('productFamily.productFamilySectionProperties', 'productFamilySectionProperties');
  64. if ($addSelect) {
  65. //NB : Ici le select est en commentaire car si il est actif doctrine n'hydrate pas correectement ProductFamilySectionProperties (si filtre sur section les ProductFamilySectionProperties des autres sections ne sont pas chargé et ça peut être problématique pr la gestion des stocks)
  66. //$this->addSelect('productFamilySectionProperties');
  67. }
  68. }
  69. return $this;
  70. }
  71. public function filterIsOnline():self
  72. {
  73. $this->joinProductFamily();
  74. $this->andWhereStatus('productFamily', 1);
  75. $this->andWhereStatus($this->id, 1);
  76. return $this;
  77. }
  78. public function filterIsOriginProduct():self
  79. {
  80. $this->andWhere('.originProduct = 1');
  81. return $this;
  82. }
  83. public function filterByProductFamily(ProductFamilyInterface $productFamily): self
  84. {
  85. return $this->andWhereEqual('productFamily', $productFamily);
  86. }
  87. public function filterIsNotAvailableQuantitySupplierUnlimited():self
  88. {
  89. $this->andWhere('productFamily.availableQuantitySupplierUnlimited != 1');
  90. return $this;
  91. }
  92. public function filterAvailableQuantityNegative() :self
  93. {
  94. $this->andWhere(
  95. $this->query->expr()->orX(
  96. $this->query->expr()->andX(
  97. $this->query->expr()->orX(
  98. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByProductFamily',
  99. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByMeasure'
  100. ),
  101. 'productFamily.availableQuantity < 0 '
  102. ),
  103. $this->query->expr()->andX(
  104. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByProduct',
  105. 'product.availableQuantity < 0 '
  106. )
  107. )
  108. );
  109. $this->setParameter(
  110. 'behaviorCountStockByProductFamily',
  111. ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY
  112. );
  113. $this->setParameter('behaviorCountStockByMeasure', ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE);
  114. $this->setParameter('behaviorCountStockByProduct', ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT);
  115. return $this;
  116. }
  117. public function filterAvailableQuantitySupplierNegative() :self
  118. {
  119. $this->andWhere(
  120. $this->query->expr()->orX(
  121. $this->query->expr()->andX(
  122. $this->query->expr()->orX(
  123. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByProductFamily',
  124. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByMeasure'
  125. ),
  126. 'productFamily.availableQuantitySupplier < 0 '
  127. ),
  128. $this->query->expr()->andX(
  129. 'productFamily.behaviorCountStock LIKE :behaviorCountStockByProduct',
  130. 'product.availableQuantitySupplier < 0 '
  131. )
  132. )
  133. );
  134. $this->setParameter(
  135. 'behaviorCountStockByProductFamily',
  136. ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY
  137. );
  138. $this->setParameter('behaviorCountStockByMeasure', ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE);
  139. $this->setParameter('behaviorCountStockByProduct', ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT);
  140. return $this;
  141. }
  142. }