Collection.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. <?php
  2. /**
  3. * Refer to LICENSE.txt distributed with the Temando Shipping module for notice of license
  4. */
  5. namespace Temando\Shipping\Model\ResourceModel\Pickup\Grid;
  6. use Magento\Framework\Api\FilterBuilder;
  7. use Magento\Framework\Api\SearchCriteriaBuilder;
  8. use Magento\Framework\Api\SearchCriteriaInterface;
  9. use Magento\Framework\Data\Collection\EntityFactoryInterface;
  10. use Magento\Framework\Message\ManagerInterface;
  11. use Magento\Sales\Api\Data\OrderInterface;
  12. use Magento\Sales\Api\OrderRepositoryInterface;
  13. use Temando\Shipping\Model\PickupInterface;
  14. use Temando\Shipping\Model\ResourceModel\Pickup\PickupCompositeFactory;
  15. use Temando\Shipping\Model\ResourceModel\Order\OrderReference as OrderReferenceResource;
  16. use Temando\Shipping\Model\ResourceModel\Repository\PickupRepositoryInterface;
  17. use Temando\Shipping\Model\ResourceModel\Webservice\Collection as ApiCollection;
  18. /**
  19. * Temando Pickup Fulfillment Resource Collection
  20. *
  21. * @package Temando\Shipping\Model
  22. * @author Sebastian Ertner <sebastian.ertner@netresearch.de>
  23. * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  24. * @link https://www.temando.com/
  25. */
  26. class Collection extends ApiCollection
  27. {
  28. /**
  29. * @var PickupRepositoryInterface
  30. */
  31. private $pickupRepository;
  32. /**
  33. * @var OrderReferenceResource
  34. */
  35. private $orderReferenceResource;
  36. /**
  37. * @var OrderRepositoryInterface
  38. */
  39. private $orderRepository;
  40. /**
  41. * @var SearchCriteriaBuilder
  42. */
  43. private $searchCriteriaBuilder;
  44. /**
  45. * @var PickupCompositeFactory
  46. */
  47. private $pickupCompositeFactory;
  48. /**
  49. * Collection constructor.
  50. * @param EntityFactoryInterface $entityFactory
  51. * @param ManagerInterface $messageManager
  52. * @param FilterBuilder $filterBuilder
  53. * @param SearchCriteriaBuilder $searchCriteriaBuilder
  54. * @param PickupRepositoryInterface $pickupRepository
  55. * @param OrderReferenceResource $orderReferenceResource
  56. * @param OrderRepositoryInterface $orderRepository
  57. * @param PickupCompositeFactory $pickupCompositeFactory
  58. */
  59. public function __construct(
  60. EntityFactoryInterface $entityFactory,
  61. ManagerInterface $messageManager,
  62. FilterBuilder $filterBuilder,
  63. SearchCriteriaBuilder $searchCriteriaBuilder,
  64. PickupRepositoryInterface $pickupRepository,
  65. OrderReferenceResource $orderReferenceResource,
  66. OrderRepositoryInterface $orderRepository,
  67. PickupCompositeFactory $pickupCompositeFactory
  68. ) {
  69. $this->pickupRepository = $pickupRepository;
  70. $this->orderReferenceResource = $orderReferenceResource;
  71. $this->orderRepository = $orderRepository;
  72. $this->searchCriteriaBuilder = $searchCriteriaBuilder;
  73. $this->pickupCompositeFactory = $pickupCompositeFactory;
  74. parent::__construct($entityFactory, $messageManager, $filterBuilder, $searchCriteriaBuilder);
  75. }
  76. /**
  77. * @param SearchCriteriaInterface $criteria
  78. * @return PickupInterface[]
  79. */
  80. public function fetchData(SearchCriteriaInterface $criteria)
  81. {
  82. $pickups = $this->pickupRepository->getList($criteria);
  83. // join local order data with platform data
  84. $orderIds = [];
  85. foreach ($pickups as $pickup) {
  86. $pickupId = $pickup->getPickupId();
  87. $orderId = $this->orderReferenceResource->getOrderIdByExtOrderId($pickup->getOrderId());
  88. $orderIds[$pickupId] = $orderId;
  89. }
  90. $searchCriteria = $this->searchCriteriaBuilder
  91. ->addFilter(OrderInterface::ENTITY_ID, $orderIds, 'in')
  92. ->create();
  93. $orders = $this->orderRepository->getList($searchCriteria);
  94. $pickupComposite = $this->pickupCompositeFactory->create(['orderSearchResult' => $orders]);
  95. $pickups = array_map(function (PickupInterface $pickup) use ($pickupComposite, $orderIds) {
  96. return $pickupComposite->aggregate($pickup, $orderIds[$pickup->getPickupId()]);
  97. }, $pickups);
  98. // remove all pickups which do not exist locally
  99. $pickups = array_filter($pickups, function (PickupInterface $pickup) {
  100. return $pickup->getSalesOrderId();
  101. });
  102. return $pickups;
  103. }
  104. }