You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

152 line
5.7KB

  1. <?php
  2. namespace domain\Product\Rotating;
  3. use domain\_\AbstractResolver;
  4. use domain\Distribution\Distribution\Distribution;
  5. use domain\Distribution\Distribution\DistributionRepository;
  6. use domain\Distribution\DistributionRotating\DistributionRotatingRepository;
  7. use domain\Product\Product\Product;
  8. use domain\Product\RotatingProduct\RotatingProduct;
  9. use domain\Product\RotatingProduct\RotatingProductRepository;
  10. use yii\base\ErrorException;
  11. use yii\helpers\Html;
  12. class RotatingResolver extends AbstractResolver
  13. {
  14. protected DistributionRepository $distributionRepository;
  15. protected DistributionRotatingRepository $distributionRotatingRepository;
  16. protected RotatingProductRepository $rotatingProductRepository;
  17. public function loadDependencies(): void
  18. {
  19. $this->distributionRepository = $this->loadService(DistributionRepository::class);
  20. $this->distributionRotatingRepository = $this->loadService(DistributionRotatingRepository::class);
  21. $this->rotatingProductRepository = $this->loadService(RotatingProductRepository::class);
  22. }
  23. public function getPreviousDistribution(Rotating $rotating, \DateTime $date): ?Distribution
  24. {
  25. $date = $date->modify('previous '.$rotating->getDayAsString('en'));
  26. return $this->distributionRepository->findOneDistributionByDateTime($date);
  27. }
  28. public function getNextDistribution(Rotating $rotating, \DateTime $date): ?Distribution
  29. {
  30. $date = $date->modify('next '.$rotating->getDayAsString('en'));
  31. return $this->distributionRepository->findOneDistributionByDateTime($date);
  32. }
  33. /**
  34. * @throws ErrorException
  35. */
  36. public function deductRotatingProductOfDistribution(Rotating $rotating, Distribution $distribution): RotatingProduct
  37. {
  38. $date = clone $distribution->getDate();
  39. $previousDistribution = $this->getPreviousDistribution($rotating, $date);
  40. if($previousDistribution) {
  41. $previousDistributionRotating = $this->distributionRotatingRepository->findOneDistributionRotating($previousDistribution, $rotating);
  42. if($previousDistributionRotating) {
  43. $rotatingProductPreviousDistribution = $previousDistributionRotating->getRotatingProduct();
  44. $nextRotatingProduct = $this->getNextRotatingProduct($rotating, $rotatingProductPreviousDistribution);
  45. return $nextRotatingProduct;
  46. }
  47. }
  48. return $this->getFirstRotatingProduct($rotating);
  49. }
  50. /**
  51. * @throws ErrorException
  52. */
  53. public function getNextRotatingProduct(Rotating $rotating, RotatingProduct $currentRotatingProduct = null): RotatingProduct
  54. {
  55. if(is_null($currentRotatingProduct)) {
  56. return $this->getFirstRotatingProduct($rotating);
  57. }
  58. $rotatingProductReturn = null;
  59. $nextIsTheOne = false;
  60. foreach($rotating->getRotatingProducts() as $rotatingProduct) {
  61. if($nextIsTheOne) {
  62. return $rotatingProduct;
  63. }
  64. if($rotatingProduct->getId() == $currentRotatingProduct->getId()) {
  65. $nextIsTheOne = true;
  66. }
  67. }
  68. if($nextIsTheOne) {
  69. $rotatingProductReturn = $this->getFirstRotatingProduct($rotating);
  70. }
  71. if($rotatingProductReturn) {
  72. return $rotatingProductReturn;
  73. }
  74. else {
  75. throw new ErrorException("Le produit tournant suivant n'a pas été trouvé");
  76. }
  77. }
  78. /**
  79. * @throws ErrorException
  80. */
  81. public function getFirstRotatingProduct(Rotating $rotating): RotatingProduct
  82. {
  83. $rotatingProductReturn = null;
  84. foreach($rotating->getRotatingProducts() as $rotatingProduct) {
  85. $rotatingProductReturn = $rotatingProduct;
  86. break;
  87. }
  88. if($rotatingProductReturn) {
  89. return $rotatingProductReturn;
  90. }
  91. else {
  92. throw new ErrorException("Le produit tournant doit contenir au moins un produit");
  93. }
  94. }
  95. public function getRotatingOfProductInDistribution(Product $product, Distribution $distribution): ?Rotating
  96. {
  97. $distributionRotatingsArray = $this->distributionRotatingRepository->findDistributionRotatingsByDistribution($distribution);
  98. foreach($distributionRotatingsArray as $distributionRotating) {
  99. if($distributionRotating->getRotatingProduct()->getProduct()->equal($product)) {
  100. return $distributionRotating->getRotating();
  101. }
  102. }
  103. return null;
  104. }
  105. public function isRotatingOfProductInDistribution(Product $product, Distribution $distribution): bool
  106. {
  107. return (bool) $this->getRotatingOfProductInDistribution($product, $distribution);
  108. }
  109. public function getRotatingProductsOfIncomingDistributionsAsHtml(Rotating $rotating): string
  110. {
  111. $html = '';
  112. $countDistributionsDisplayed = 0;
  113. $numberDistributionsDisplayed = count($rotating->getRotatingProducts());
  114. $incomingDistributionsArray = $this->distributionRepository->findDistributionsIncoming();
  115. foreach($incomingDistributionsArray as $distribution) {
  116. foreach($distribution->getDistributionRotatings() as $distributionRotating) {
  117. if($distributionRotating->getRotating()->equal($rotating)) {
  118. $html .= $distribution->getDate()->format('d/m/Y'). ' : '
  119. .Html::encode($distributionRotating->getRotatingProduct()->getProduct()->name).'<br />';
  120. $countDistributionsDisplayed ++;
  121. }
  122. }
  123. if($countDistributionsDisplayed >= $numberDistributionsDisplayed) {
  124. break;
  125. }
  126. }
  127. return $html;
  128. }
  129. }