123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- <?php
- /**
- * Copyright 2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License").
- * You may not use this file except in compliance with the License.
- * A copy of the License is located at
- *
- * http://aws.amazon.com/apache2.0
- *
- * or in the "license" file accompanying this file. This file is distributed
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
- namespace Amazon\Payment\Model;
- use Amazon\Core\Client\ClientFactoryInterface;
- use Amazon\Payment\Api\Data\PendingRefundInterface;
- use Amazon\Payment\Api\Data\PendingRefundInterfaceFactory;
- use Amazon\Payment\Domain\AmazonRefundDetailsResponseFactory;
- use Amazon\Payment\Domain\AmazonRefundStatus;
- use Amazon\Payment\Domain\Details\AmazonRefundDetails;
- use Magento\Framework\Notification\NotifierInterface;
- use Magento\Sales\Api\OrderPaymentRepositoryInterface;
- use Magento\Sales\Api\OrderRepositoryInterface;
- use Magento\Store\Model\StoreManagerInterface;
- use Psr\Log\LoggerInterface;
- class QueuedRefundUpdater
- {
- /**
- * @var OrderRepositoryInterface
- */
- private $orderRepository;
- /**
- * @var OrderPaymentRepositoryInterface
- */
- private $orderPaymentRepository;
- /**
- * @var ClientFactoryInterface
- */
- private $amazonHttpClientFactory;
- /**
- * @var AmazonRefundDetailsResponseFactory
- */
- private $amazonRefundDetailsResponseFactory;
- /**
- * @var NotifierInterface
- */
- private $adminNotifier;
- /**
- * @var PendingRefundInterfaceFactory
- */
- private $pendingRefundFactory;
- /**
- * @var StoreManagerInterface
- */
- private $storeManager;
- /**
- * @var LoggerInterface
- */
- private $logger;
- /**
- * @var bool
- */
- private $throwExceptions = false;
- /**
- * @param OrderRepositoryInterface $orderRepository
- * @param OrderPaymentRepositoryInterface $orderPaymentRepository
- * @param ClientFactoryInterface $amazonHttpClientFactory
- * @param AmazonRefundDetailsResponseFactory $amazonRefundDetailsResponseFactory
- * @param NotifierInterface $adminNotifier
- * @param PendingRefundInterfaceFactory $pendingRefundFactory
- * @param StoreManagerInterface $storeManager
- * @param LoggerInterface $logger
- */
- public function __construct(
- OrderRepositoryInterface $orderRepository,
- OrderPaymentRepositoryInterface $orderPaymentRepository,
- ClientFactoryInterface $amazonHttpClientFactory,
- AmazonRefundDetailsResponseFactory $amazonRefundDetailsResponseFactory,
- NotifierInterface $adminNotifier,
- PendingRefundInterfaceFactory $pendingRefundFactory,
- StoreManagerInterface $storeManager,
- LoggerInterface $logger
- ) {
- $this->orderRepository = $orderRepository;
- $this->orderPaymentRepository = $orderPaymentRepository;
- $this->amazonHttpClientFactory = $amazonHttpClientFactory;
- $this->amazonRefundDetailsResponseFactory = $amazonRefundDetailsResponseFactory;
- $this->adminNotifier = $adminNotifier;
- $this->pendingRefundFactory = $pendingRefundFactory;
- $this->storeManager = $storeManager;
- $this->logger = $logger;
- }
- /**
- * {@inheritdoc}
- */
- public function setThrowExceptions($throwExceptions)
- {
- $this->throwExceptions = $throwExceptions;
- return $this;
- }
- /**
- * @param int $pendingRefundId
- *
- * @return void
- */
- public function checkAndUpdateRefund($pendingRefundId, AmazonRefundDetails $refundDetails = null)
- {
- try {
- $pendingRefund = $this->pendingRefundFactory->create();
- $pendingRefund->getResource()->beginTransaction();
- $pendingRefund->setLockOnLoad(true);
- $pendingRefund->load($pendingRefundId);
- if ($pendingRefund->getRefundId()) {
- $order = $this->orderRepository->get($pendingRefund->getOrderId());
- $storeId = $order->getStoreId();
- $this->storeManager->setCurrentStore($storeId);
- if (null === $refundDetails) {
- $responseParser = $this->amazonHttpClientFactory->create($storeId)->getRefundDetails([
- 'amazon_refund_id' => $pendingRefund->getRefundId()
- ]);
- $response = $this->amazonRefundDetailsResponseFactory->create(['response' => $responseParser]);
- $refundDetails = $response->getDetails();
- }
- $status = $refundDetails->getRefundStatus();
- switch ($status->getState()) {
- case AmazonRefundStatus::STATE_COMPLETED:
- $pendingRefund->delete();
- break;
- case AmazonRefundStatus::STATE_DECLINED:
- $this->triggerAdminNotificationForDeclinedRefund($pendingRefund);
- $pendingRefund->delete();
- break;
- }
- }
- $pendingRefund->getResource()->commit();
- } catch (\Exception $e) {
- $this->logger->error($e);
- $pendingRefund->getResource()->rollBack();
- if ($this->throwExceptions) {
- throw $e;
- }
- }
- }
- /**
- * @param PendingRefundInterface $pendingRefund
- *
- * @return void
- */
- protected function triggerAdminNotificationForDeclinedRefund(PendingRefundInterface $pendingRefund)
- {
- $this->adminNotifier->addMajor(
- 'Amazon Pay has declined a refund',
- "Refund ID {$pendingRefund->getRefundId()} for Order ID {$pendingRefund->getOrderId()} " .
- "has been declined by Amazon Pay."
- );
- }
- }
|