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.

175 lines
7.4KB

  1. <?php
  2. namespace domain\Order\Order;
  3. use domain\_\AbstractService;
  4. use domain\_\ManagerInterface;
  5. use domain\Distribution\Distribution\DistributionRepository;
  6. use domain\Distribution\Distribution\DistributionSolver;
  7. use domain\Order\Order\Event\OrderDeleteEvent;
  8. use domain\Order\OrderStatus\OrderStatus;
  9. use domain\Order\OrderStatus\OrderStatusRepository;
  10. use domain\Order\OrderStatusHistory\OrderStatusHistoryManager;
  11. use domain\Producer\Producer\Producer;
  12. use domain\Producer\Producer\ProducerSolver;
  13. use domain\Subscription\Subscription\Subscription;
  14. use domain\Subscription\Subscription\SubscriptionRepository;
  15. use domain\Subscription\Subscription\SubscriptionSolver;
  16. use domain\User\User\User;
  17. class OrderManager extends AbstractService implements ManagerInterface
  18. {
  19. protected ProducerSolver $producerSolver;
  20. protected OrderBuilder $orderBuilder;
  21. protected OrderStatusRepository $orderStatusRepository;
  22. protected OrderStatusHistoryManager $orderStatusHistoryManager;
  23. protected DistributionRepository $distributionRepository;
  24. protected \domain\Subscription\Subscription\OrderManager $subscriptionOrderManager;
  25. protected OrderRepository $orderRepository;
  26. protected DistributionSolver $distributionSolver;
  27. protected OrderSolver $orderSolver;
  28. protected SubscriptionSolver $subscriptionSolver;
  29. protected SubscriptionRepository $subscriptionRepository;
  30. public function loadDependencies(): void
  31. {
  32. $this->producerSolver = $this->loadService(ProducerSolver::class);
  33. $this->orderBuilder = $this->loadService(OrderBuilder::class);
  34. $this->orderStatusRepository = $this->loadService(OrderStatusRepository::class);
  35. $this->orderStatusHistoryManager = $this->loadService(OrderStatusHistoryManager::class);
  36. $this->distributionRepository = $this->loadService(DistributionRepository::class);
  37. $this->subscriptionOrderManager = $this->loadService(\domain\Subscription\Subscription\OrderManager::class);
  38. $this->orderRepository = $this->loadService(OrderRepository::class);
  39. $this->distributionSolver = $this->loadService(DistributionSolver::class);
  40. $this->orderSolver = $this->loadService(OrderSolver::class);
  41. $this->subscriptionSolver = $this->loadService(SubscriptionSolver::class);
  42. $this->subscriptionRepository = $this->loadService(SubscriptionRepository::class);
  43. }
  44. public function changeOrderStatus(Order $order, string $orderStatusAlias, User $user, \DateTime $date = null)
  45. {
  46. $orderStatus = $this->orderStatusRepository->getOrderStatusByAlias($orderStatusAlias);
  47. $order->setOrderStatus($orderStatus);
  48. if(!$order->isOrderStatusOrdered()) {
  49. $this->orderBuilder->initDateUpdate($order);
  50. }
  51. $this->orderBuilder->update($order);
  52. $this->orderStatusHistoryManager->create(
  53. $order,
  54. $orderStatus,
  55. is_null($date) ? new \DateTime() : $date,
  56. $user
  57. );
  58. }
  59. public function deleteOrder(Order $order, User $user, bool $force = false): bool
  60. {
  61. $return = false;
  62. $this->orderBuilder->initOrder($order);
  63. // delete
  64. if ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_DELETE ||
  65. ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_STATUS
  66. && $order->isOrderStatusCanceled())
  67. || $force) {
  68. $this->changeOrderStatus($order, OrderStatus::ALIAS_DELETED, $user);
  69. $return = true;
  70. }
  71. // cancel
  72. elseif ($this->producerSolver->getConfig('option_behavior_cancel_order') == Producer::BEHAVIOR_DELETE_ORDER_STATUS) {
  73. $this->changeOrderStatus($order, OrderStatus::ALIAS_CANCELED, $user);
  74. $return = true;
  75. }
  76. if($return) {
  77. $orderDeleteEvent = new OrderDeleteEvent();
  78. $orderDeleteEvent->order = $order;
  79. $order->trigger(Order::EVENT_DELETE, $orderDeleteEvent);
  80. }
  81. return $return;
  82. }
  83. public function updateOrdersIncomingDistributionsFromSubscription(Subscription $subscription, User $userAction, $update = false): array
  84. {
  85. $orderArray = [];
  86. $matchedDistributionsArray = $this->distributionRepository->findDistributionsIncomingMatchWithSubscrtiption($subscription, true);
  87. if ($update) {
  88. $this->deleteOrdersIncomingDistributionsFromSubscription($subscription, $userAction);
  89. }
  90. if (count($matchedDistributionsArray)) {
  91. foreach ($matchedDistributionsArray as $distribution) {
  92. $orderArray[] = $this->createOrderFromSubscription($subscription, $distribution->date, $userAction);
  93. }
  94. }
  95. return $orderArray;
  96. }
  97. public function deleteOrdersIncomingDistributionsFromSubscription(Subscription $subscription, User $userAction, bool $deleteAfterDateEnd = false): int
  98. {
  99. $ordersArray = $this->orderRepository->findOrdersIncomingBySubscription($subscription, !$deleteAfterDateEnd);
  100. $countOrdersDeleted = 0;
  101. if ($ordersArray && count($ordersArray)) {
  102. foreach ($ordersArray as $order) {
  103. if ($this->distributionSolver->isDistributionAvailable($order->distribution)) {
  104. $theOrder = $this->orderRepository->findOneOrderById($order->id);
  105. $this->orderBuilder->initOrder($theOrder);
  106. $this->deleteOrder($order, $userAction, true);
  107. $countOrdersDeleted++;
  108. }
  109. }
  110. }
  111. return $countOrdersDeleted;
  112. }
  113. public function createOrderFromSubscription(Subscription $subscription, string $date, User $userAction, bool $force = false): ?Order
  114. {
  115. $now = date('Y-m-d');
  116. $distributionDate = date('Y-m-d', strtotime($date));
  117. $distribution = $this->distributionRepository->findOneDistribution($distributionDate);
  118. if ($distribution
  119. && $distribution->active
  120. && ($distributionDate > $now || $force)
  121. && count($subscription->productSubscription)
  122. && $subscription->pointSale) {
  123. $order = $this->orderBuilder->createOrder($distribution);
  124. $this->orderBuilder->updateOrderFromSubscription($order, $subscription);
  125. $this->changeOrderStatus($order, OrderStatus::ALIAS_ORDERED, $userAction);
  126. return $order;
  127. }
  128. return null;
  129. }
  130. public function createAllOrdersFromSubscriptions(string $date, User $userAction, bool $force = false): array
  131. {
  132. $ordersSubscriptionsArray = [];
  133. $distribution = $this->distributionRepository->findOneDistribution(date('Y-m-d', strtotime($date)));
  134. if ($distribution) {
  135. $orderArray = $this->orderRepository->findOrdersByDistribution($distribution);
  136. $subscriptionArray = $this->subscriptionRepository->findSubscriptionsByDate($date);
  137. foreach ($subscriptionArray as $subscription) {
  138. if (!$this->subscriptionSolver->hasOrderAlreadyExist($subscription, $orderArray)) {
  139. $order = $this->createOrderFromSubscription($subscription, $date, $userAction, $force);
  140. if ($order) {
  141. $ordersSubscriptionsArray[] = $order;
  142. }
  143. }
  144. }
  145. }
  146. return $ordersSubscriptionsArray;
  147. }
  148. }