From 4ceefc03b235e9ae22f51fc6d0783595283f8257 Mon Sep 17 00:00:00 2001 From: Bram Gerritsen Date: Fri, 20 Aug 2021 12:35:38 +0200 Subject: [PATCH] Implement support for RMA items --- composer.json | 2 +- .../DetailView/ReturnsProvider.php | 111 ++++++++++++++++++ src/etc/di.xml | 1 + 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/DataProvider/DetailView/ReturnsProvider.php diff --git a/composer.json b/composer.json index 1bed28d..207fcf3 100644 --- a/composer.json +++ b/composer.json @@ -3,7 +3,7 @@ "license": "OSL-3.0", "description": "Magento 2 module for RobinHQ integration. Provides API endpoints for RobinHQ dynamic API", "require": { - "php": "^7.1.0", + "php": "^7.2", "emico/robinhq-lib": "^1.0.6", "magento/module-customer": "101.*|102.*|103.*", "magento/module-catalog": "102.*|103.*|104.*", diff --git a/src/DataProvider/DetailView/ReturnsProvider.php b/src/DataProvider/DetailView/ReturnsProvider.php new file mode 100644 index 0000000..68deeb4 --- /dev/null +++ b/src/DataProvider/DetailView/ReturnsProvider.php @@ -0,0 +1,111 @@ + + * @copyright (c) Emico B.V. 2017 + */ + +namespace Emico\RobinHq\DataProvider\DetailView; + +use Emico\RobinHqLib\Model\Order\DetailsView; +use Magento\Framework\Api\SearchCriteriaBuilder; +use Magento\Rma\Api\Data\ItemInterface; +use Magento\Rma\Api\Data\RmaInterface; +use Magento\Rma\Api\Data\TrackInterface; +use Magento\Rma\Api\RmaRepositoryInterface; +use Magento\Rma\Helper\Eav; +use Magento\Rma\Model\Item; +use Magento\Rma\Model\Rma; +use Magento\Sales\Api\Data\OrderInterface; + +class ReturnsProvider implements DetailViewProviderInterface +{ + /** @var RmaRepositoryInterface */ + private $rmaRepository; + + /** @var SearchCriteriaBuilder */ + private $searchCriteriaBuilder; + + /** @var Eav */ + private $rmaEav; + + /** @var array */ + private $attributeOptionValues; + + /** + * ReturnsProvider constructor. + * @param RmaRepositoryInterface $rmaRepository + * @param SearchCriteriaBuilder $searchCriteriaBuilder + * @param Eav $rmaEav + */ + public function __construct( + RmaRepositoryInterface $rmaRepository, + SearchCriteriaBuilder $searchCriteriaBuilder, + Eav $rmaEav + ) { + $this->rmaRepository = $rmaRepository; + $this->searchCriteriaBuilder = $searchCriteriaBuilder; + $this->rmaEav = $rmaEav; + } + + /** + * @param OrderInterface $order + * @return array + * @throws \Exception + */ + public function getItems(OrderInterface $order): array + { + $this->searchCriteriaBuilder->addFilter(Rma::ORDER_ID, $order->getEntityId()); + $searchResults = $this->rmaRepository->getList($this->searchCriteriaBuilder->create()); + if ($searchResults->getTotalCount() === 0) { + return []; + } + + $returnItems = []; + foreach ($searchResults->getItems() as $rma) { + $trackNumbers = $this->getTrackingNumbers($rma); + + /** @var Item $rmaItem */ + foreach ($rma->getItems() as $rmaItem) { + $itemData = [ + __('return_reason')->render() => $this->getReasonLabel($rmaItem), + __('return_track_trace')->render() => implode(', ', $trackNumbers), + __('artikelnr_(SKU)')->render() => $rmaItem->getData('product_sku'), + __('article name')->render() => $rmaItem->getData('product_name'), + __('quantity')->render() => $rmaItem->getQtyRequested() + ]; + + $returnItems[] = $itemData; + } + } + $detailView = new DetailsView(DetailsView::DISPLAY_MODE_ROWS, $returnItems); + $detailView->setCaption(__('Returns')); + return [$detailView]; + } + + /** + * @param RmaInterface $rma + * @return array + */ + protected function getTrackingNumbers(RmaInterface $rma): array + { + return array_map( + static function (TrackInterface $track) { + return $track->getTrackNumber(); + }, + $rma->getTrackingNumbers()->getItems() + ); + } + + /** + * @param ItemInterface $rmaItem + * @return string + */ + protected function getReasonLabel(ItemInterface $rmaItem): string + { + if ($this->attributeOptionValues === null) { + $this->attributeOptionValues = $this->rmaEav->getAttributeOptionStringValues(); + } + $reason = $rmaItem->getReason(); + return $this->attributeOptionValues[$reason] ?? $reason; + } +} diff --git a/src/etc/di.xml b/src/etc/di.xml index 9b16704..ddfffaa 100644 --- a/src/etc/di.xml +++ b/src/etc/di.xml @@ -66,6 +66,7 @@ Emico\RobinHq\DataProvider\DetailView\ProductDetailViewProvider Emico\RobinHq\DataProvider\DetailView\TotalDetailViewProvider Emico\RobinHq\DataProvider\DetailView\TrackTraceProvider + Emico\RobinHq\DataProvider\DetailView\ReturnsProvider