PickupLoader.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Model\Pickup;
  6. use Magento\Framework\Api\SearchCriteriaBuilder;
  7. use Magento\Framework\Exception\LocalizedException;
  8. use Magento\Sales\Api\Data\OrderInterface;
  9. use Magento\Sales\Api\OrderRepositoryInterface as SalesOrderRepositoryInterface;
  10. use Temando\Shipping\Model\PickupInterface;
  11. use Temando\Shipping\Model\PickupProviderInterface;
  12. use Temando\Shipping\Model\ResourceModel\Repository\OrderRepositoryInterface;
  13. use Temando\Shipping\Model\ResourceModel\Repository\PickupRepositoryInterface;
  14. /**
  15. * Temando Pickup Loader
  16. *
  17. * Load pickup fulfillments by their ID or the associated order ID.
  18. * Convenience wrapper around the pickup and order repositories.
  19. *
  20. * @package Temando\Shipping\Model
  21. * @author Benjamin Heuer <benjamin.heuer@netresearch.de>
  22. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  23. * @link https://www.temando.com/
  24. */
  25. class PickupLoader
  26. {
  27. /**
  28. * @var PickupRepositoryInterface
  29. */
  30. private $pickupRepository;
  31. /**
  32. * @var PickupProviderInterface
  33. */
  34. private $pickupProvider;
  35. /**
  36. * @var OrderRepositoryInterface
  37. */
  38. private $orderRepository;
  39. /**
  40. * @var SalesOrderRepositoryInterface
  41. */
  42. private $salesOrderRepository;
  43. /**
  44. * @var SearchCriteriaBuilder
  45. */
  46. private $searchCriteriaBuilder;
  47. /**
  48. * @param PickupRepositoryInterface $pickupRepository
  49. * @param PickupProviderInterface $pickupProvider
  50. * @param OrderRepositoryInterface $orderRepository
  51. * @param SalesOrderRepositoryInterface $salesOrderRepository
  52. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  53. */
  54. public function __construct(
  55. PickupRepositoryInterface $pickupRepository,
  56. PickupProviderInterface $pickupProvider,
  57. OrderRepositoryInterface $orderRepository,
  58. SalesOrderRepositoryInterface $salesOrderRepository,
  59. SearchCriteriaBuilder $searchCriteriaBuilder
  60. ) {
  61. $this->pickupRepository = $pickupRepository;
  62. $this->pickupProvider = $pickupProvider;
  63. $this->orderRepository = $orderRepository;
  64. $this->salesOrderRepository = $salesOrderRepository;
  65. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  66. }
  67. /**
  68. * @param int $salesOrderId
  69. * @return OrderInterface|null
  70. */
  71. private function loadOrderById(int $salesOrderId): ?OrderInterface
  72. {
  73. try {
  74. $order = $this->salesOrderRepository->get($salesOrderId);
  75. return $order;
  76. } catch (LocalizedException $exception) {
  77. return null;
  78. }
  79. }
  80. /**
  81. * @param string $extOrderId
  82. * @return OrderInterface|null
  83. */
  84. private function loadOrderByExtOrderId(string $extOrderId): ?OrderInterface
  85. {
  86. try {
  87. $orderReference = $this->orderRepository->getReferenceByExtOrderId($extOrderId);
  88. $order = $this->salesOrderRepository->get($orderReference->getOrderId());
  89. return $order;
  90. } catch (LocalizedException $exception) {
  91. return null;
  92. }
  93. }
  94. /**
  95. * @param string $pickupId
  96. * @return PickupInterface|null
  97. */
  98. private function loadPickupById(string $pickupId): ?PickupInterface
  99. {
  100. try {
  101. return $this->pickupRepository->getById($pickupId);
  102. } catch (LocalizedException $e) {
  103. return null;
  104. }
  105. }
  106. /**
  107. * @param int $salesOrderId
  108. * @return PickupInterface[]
  109. */
  110. private function loadPickupsByOrderId(int $salesOrderId): array
  111. {
  112. $this->searchCriteriaBuilder->addFilter(PickupInterface::ORDER_ID, $salesOrderId);
  113. $searchCriteria = $this->searchCriteriaBuilder->create();
  114. $pickups = $this->pickupRepository->getList($searchCriteria);
  115. $keys = array_map(function (PickupInterface $pickup) {
  116. return $pickup->getPickupId();
  117. }, $pickups);
  118. return array_combine($keys, $pickups);
  119. }
  120. /**
  121. * Returns Pickup List for a specific order or pickup id
  122. *
  123. * @param int $salesOrderId
  124. * @param string $pickupId
  125. * @return PickupInterface[]
  126. */
  127. public function load(int $salesOrderId = 0, string $pickupId = ''): array
  128. {
  129. $pickups = [];
  130. if ($salesOrderId) {
  131. // load all pickup fulfillments associated to a given order
  132. $pickups = $this->loadPickupsByOrderId($salesOrderId);
  133. }
  134. if ($pickupId && !$salesOrderId) {
  135. // load one pickup by given ID
  136. $pickup = $this->loadPickupById($pickupId);
  137. $pickups = [$pickupId => $pickup];
  138. }
  139. return $pickups;
  140. }
  141. /**
  142. * @param PickupInterface[] $pickups
  143. * @param int $salesOrderId
  144. * @param string $pickupId
  145. */
  146. public function register(array $pickups, int $salesOrderId = 0, string $pickupId = ''): void
  147. {
  148. // register loaded pickups
  149. if (!empty($pickups)) {
  150. $this->pickupProvider->setPickups($pickups);
  151. if ($pickupId && isset($pickups[$pickupId])) {
  152. // add primary pickup if one was requested via ID
  153. $this->pickupProvider->setPickup($pickups[$pickupId]);
  154. }
  155. }
  156. // register loaded order
  157. if ($salesOrderId) {
  158. $order = $this->loadOrderById($salesOrderId);
  159. $this->pickupProvider->setOrder($order);
  160. } elseif ($pickupId && isset($pickups[$pickupId])) {
  161. $order = $this->loadOrderByExtOrderId($pickups[$pickupId]->getOrderId());
  162. $this->pickupProvider->setOrder($order);
  163. }
  164. }
  165. }