No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

174 líneas
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. }