* @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @link https://www.temando.com/ */ class CollectionPointSearchProcessor implements RatesProcessorInterface { /** * @var CollectionPointSearchResultInterfaceFactory */ private $searchResultFactory; /** * CollectionPointSearchProcessor constructor. * @param CollectionPointSearchResultInterfaceFactory $searchResultFactory */ public function __construct(CollectionPointSearchResultInterfaceFactory $searchResultFactory) { $this->searchResultFactory = $searchResultFactory; } /** * Persist collection points from rates response. * * @param RateRequest $rateRequest * @param OrderInterface $requestType * @param QualificationResponseType $responseType * @return ShippingExperienceInterface[] * @throws LocalizedException */ public function postProcess( RateRequest $rateRequest, OrderInterface $requestType, QualificationResponseType $responseType ) { $searchRequest = $requestType->getCollectionPointSearchRequest(); $collectionPoint = $requestType->getCollectionPoint(); if ($searchRequest === null) { // no search, no collection points to persist return []; } if ($searchRequest->isPending()) { // no search parameters submitted yet, no collection points to persist return []; } if ($collectionPoint && $collectionPoint->getCollectionPointId()) { // delivery location was selected, no need to update collection points return []; } // persist collection points for a given search request $shippingAddressId = $searchRequest->getShippingAddressId(); $collectionPoints = $responseType->getCollectionPoints(); /** @var QuoteCollectionPoint $collectionPoint */ foreach ($collectionPoints as $collectionPoint) { $collectionPoint->setData(QuoteCollectionPointInterface::RECIPIENT_ADDRESS_ID, $shippingAddressId); } /** @var CollectionPointSearchResult $collection */ $collection = $this->searchResultFactory->create(); $collection->addFilter(QuoteCollectionPointInterface::RECIPIENT_ADDRESS_ID, $shippingAddressId); $collection->walk('delete'); $collection->setItems($collectionPoints); $collection->save(); return []; } }