ExperienceRepository.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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\Experience;
  6. use Magento\Framework\Exception\CouldNotSaveException;
  7. use Psr\Log\LoggerInterface;
  8. use Temando\Shipping\Model\OrderInterface;
  9. use Temando\Shipping\Model\ResourceModel\Repository\ExperienceRepositoryInterface;
  10. use Temando\Shipping\Rest\Adapter\ExperienceApiInterface;
  11. use Temando\Shipping\Rest\EntityMapper\ExperienceResponseMapper;
  12. use Temando\Shipping\Rest\EntityMapper\QualificationRequestTypeBuilder;
  13. use Temando\Shipping\Rest\EntityMapper\QualificationResponseMapper;
  14. use Temando\Shipping\Rest\Exception\AdapterException;
  15. use Temando\Shipping\Rest\Request\ListRequestInterfaceFactory;
  16. use Temando\Shipping\Rest\Request\QualifyRequestFactory;
  17. use Temando\Shipping\Rest\Response\DataObject\Experience;
  18. use Temando\Shipping\Webservice\Response\Type\QualificationResponseType;
  19. /**
  20. * Temando Experience Repository
  21. *
  22. * @package Temando\Shipping\Model
  23. * @author Christoph Aßmann <christoph.assmann@netresearch.de>
  24. * @author Sebastian Ertner <sebastian.ertner@netresearch.de>
  25. * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
  26. * @link http://www.temando.com/
  27. */
  28. class ExperienceRepository implements ExperienceRepositoryInterface
  29. {
  30. /**
  31. * @var QualificationRequestTypeBuilder
  32. */
  33. private $requestBuilder;
  34. /**
  35. * @var QualifyRequestFactory
  36. */
  37. private $qualifyRequestFactory;
  38. /**
  39. * @var ListRequestInterfaceFactory
  40. */
  41. private $listRequestFactory;
  42. /**
  43. * @var ExperienceApiInterface
  44. */
  45. private $apiAdapter;
  46. /**
  47. * @var QualificationResponseMapper
  48. */
  49. private $qualificationResponseMapper;
  50. /**
  51. * @var ExperienceResponseMapper
  52. */
  53. private $experienceMapper;
  54. /**
  55. * @var LoggerInterface
  56. */
  57. private $logger;
  58. /**
  59. * ExperienceRepository constructor.
  60. * @param QualificationRequestTypeBuilder $requestBuilder
  61. * @param QualifyRequestFactory $qualifyRequestFactory
  62. * @param ListRequestInterfaceFactory $listRequestFactory
  63. * @param ExperienceApiInterface $apiAdapter
  64. * @param QualificationResponseMapper $qualificationResponseMapper
  65. * @param ExperienceResponseMapper $experienceMapper
  66. * @param LoggerInterface $logger
  67. */
  68. public function __construct(
  69. QualificationRequestTypeBuilder $requestBuilder,
  70. QualifyRequestFactory $qualifyRequestFactory,
  71. ListRequestInterfaceFactory $listRequestFactory,
  72. ExperienceApiInterface $apiAdapter,
  73. QualificationResponseMapper $qualificationResponseMapper,
  74. ExperienceResponseMapper $experienceMapper,
  75. LoggerInterface $logger
  76. ) {
  77. $this->requestBuilder = $requestBuilder;
  78. $this->qualifyRequestFactory = $qualifyRequestFactory;
  79. $this->listRequestFactory = $listRequestFactory;
  80. $this->apiAdapter = $apiAdapter;
  81. $this->qualificationResponseMapper = $qualificationResponseMapper;
  82. $this->experienceMapper = $experienceMapper;
  83. $this->logger = $logger;
  84. }
  85. /**
  86. * Check whether order qualification call should be triggered or not.
  87. *
  88. * @param OrderInterface $order
  89. * @return bool
  90. */
  91. private function canQualify(OrderInterface $order)
  92. {
  93. $isCollectionPointSelected = (bool) $order->getCollectionPoint();
  94. $isPickupLocationSelected = (bool) $order->getPickupLocation();
  95. if ($isCollectionPointSelected || $isPickupLocationSelected) {
  96. // a delivery location was selected for quoting, rates already exist in database
  97. return false;
  98. }
  99. $searchRequest = $order->getCollectionPointSearchRequest();
  100. $isSearchPending = $searchRequest && $searchRequest->isPending();
  101. if ($isSearchPending) {
  102. // collection point search not triggered yet, no rates to display
  103. return false;
  104. }
  105. $isSearchPerformed = $searchRequest && $searchRequest->getPostcode() && $searchRequest->getCountryId();
  106. if ($isSearchPerformed) {
  107. // collection point search triggered, request applicable locations
  108. return true;
  109. }
  110. $searchRequest = $order->getPickupLocationSearchRequest();
  111. $isSearchPerformed = $searchRequest && $searchRequest->isActive();
  112. if ($isSearchPerformed) {
  113. // pickup location search triggered, request applicable locations
  114. return true;
  115. }
  116. // regular address quoting
  117. return true;
  118. }
  119. /**
  120. * Fetch order qualifications from platform.
  121. *
  122. * Under certain circumstances, platform invocation is not desired:
  123. * - quoting data incomplete, user input pending
  124. * - qualifications already available locally
  125. *
  126. * @param OrderInterface $order
  127. * @return QualificationResponseType
  128. * @throws CouldNotSaveException
  129. */
  130. public function getExperiencesForOrder(OrderInterface $order)
  131. {
  132. if (!$this->canQualify($order)) {
  133. return $this->qualificationResponseMapper->map([]);
  134. }
  135. // build qualification request type
  136. $qualificationType = $this->requestBuilder->build($order);
  137. // create qualification request
  138. $qualifyRequest = $this->qualifyRequestFactory->create([
  139. 'requestType' => $qualificationType,
  140. ]);
  141. try {
  142. $qualifications = $this->apiAdapter->qualify($qualifyRequest);
  143. } catch (AdapterException $e) {
  144. throw new CouldNotSaveException(__('Unable to qualify order.'), $e);
  145. }
  146. return $this->qualificationResponseMapper->map($qualifications);
  147. }
  148. /**
  149. * Obtain shipping experiences from platform.
  150. *
  151. * @return \Temando\Shipping\Model\ExperienceInterface[]
  152. */
  153. public function getExperiences()
  154. {
  155. try {
  156. $request = $this->listRequestFactory->create();
  157. $apiExperiences = $this->apiAdapter->getExperiences($request);
  158. $experiences = array_map(function (Experience $apiExperience) {
  159. return $this->experienceMapper->map($apiExperience);
  160. }, $apiExperiences);
  161. } catch (AdapterException $e) {
  162. $this->logger->critical($e->getMessage(), ['exception' => $e]);
  163. $experiences = [];
  164. }
  165. return $experiences;
  166. }
  167. }