123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Sales\Model\Service;
- /**
- * Class CreditmemoService
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class CreditmemoService implements \Magento\Sales\Api\CreditmemoManagementInterface
- {
- /**
- * @var \Magento\Sales\Api\CreditmemoRepositoryInterface
- */
- protected $creditmemoRepository;
- /**
- * @var \Magento\Sales\Api\CreditmemoCommentRepositoryInterface
- */
- protected $commentRepository;
- /**
- * @var \Magento\Framework\Api\SearchCriteriaBuilder
- */
- protected $searchCriteriaBuilder;
- /**
- * @var \Magento\Framework\Api\FilterBuilder
- */
- protected $filterBuilder;
- /**
- * @var \Magento\Sales\Model\Order\CreditmemoNotifier
- */
- protected $creditmemoNotifier;
- /**
- * @var \Magento\Framework\Pricing\PriceCurrencyInterface
- */
- protected $priceCurrency;
- /**
- * @var \Magento\Framework\Event\ManagerInterface
- */
- protected $eventManager;
- /**
- * @var \Magento\Framework\App\ResourceConnection
- */
- private $resource;
- /**
- * @var \Magento\Sales\Model\Order\RefundAdapterInterface
- */
- private $refundAdapter;
- /**
- * @var \Magento\Sales\Api\OrderRepositoryInterface
- */
- private $orderRepository;
- /**
- * @var \Magento\Sales\Api\InvoiceRepositoryInterface
- */
- private $invoiceRepository;
- /**
- * @param \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository
- * @param \Magento\Sales\Api\CreditmemoCommentRepositoryInterface $creditmemoCommentRepository
- * @param \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
- * @param \Magento\Framework\Api\FilterBuilder $filterBuilder
- * @param \Magento\Sales\Model\Order\CreditmemoNotifier $creditmemoNotifier
- * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
- * @param \Magento\Framework\Event\ManagerInterface $eventManager
- */
- public function __construct(
- \Magento\Sales\Api\CreditmemoRepositoryInterface $creditmemoRepository,
- \Magento\Sales\Api\CreditmemoCommentRepositoryInterface $creditmemoCommentRepository,
- \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
- \Magento\Framework\Api\FilterBuilder $filterBuilder,
- \Magento\Sales\Model\Order\CreditmemoNotifier $creditmemoNotifier,
- \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency,
- \Magento\Framework\Event\ManagerInterface $eventManager
- ) {
- $this->creditmemoRepository = $creditmemoRepository;
- $this->commentRepository = $creditmemoCommentRepository;
- $this->searchCriteriaBuilder = $searchCriteriaBuilder;
- $this->filterBuilder = $filterBuilder;
- $this->creditmemoNotifier = $creditmemoNotifier;
- $this->priceCurrency = $priceCurrency;
- $this->eventManager = $eventManager;
- }
- /**
- * Cancel an existing creditmemo
- *
- * @param int $id Credit Memo Id
- * @return void
- * @throws \Magento\Framework\Exception\LocalizedException
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
- */
- public function cancel($id)
- {
- throw new \Magento\Framework\Exception\LocalizedException(__('You can not cancel Credit Memo'));
- }
- /**
- * Returns list of comments attached to creditmemo
- *
- * @param int $id
- * @return \Magento\Sales\Api\Data\CreditmemoCommentSearchResultInterface
- */
- public function getCommentsList($id)
- {
- $this->searchCriteriaBuilder->addFilters(
- [$this->filterBuilder->setField('parent_id')->setValue($id)->setConditionType('eq')->create()]
- );
- $searchCriteria = $this->searchCriteriaBuilder->create();
- return $this->commentRepository->getList($searchCriteria);
- }
- /**
- * Notify user
- *
- * @param int $id
- * @return bool
- */
- public function notify($id)
- {
- $creditmemo = $this->creditmemoRepository->get($id);
- return $this->creditmemoNotifier->notify($creditmemo);
- }
- /**
- * Prepare creditmemo to refund and save it.
- *
- * @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
- * @param bool $offlineRequested
- * @return \Magento\Sales\Api\Data\CreditmemoInterface
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- public function refund(
- \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo,
- $offlineRequested = false
- ) {
- $this->validateForRefund($creditmemo);
- $creditmemo->setState(\Magento\Sales\Model\Order\Creditmemo::STATE_REFUNDED);
- $connection = $this->getResource()->getConnection('sales');
- $connection->beginTransaction();
- try {
- $invoice = $creditmemo->getInvoice();
- if ($invoice && !$offlineRequested) {
- $invoice->setIsUsedForRefund(true);
- $invoice->setBaseTotalRefunded(
- $invoice->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
- );
- $creditmemo->setInvoiceId($invoice->getId());
- $this->getInvoiceRepository()->save($creditmemo->getInvoice());
- }
- $order = $this->getRefundAdapter()->refund(
- $creditmemo,
- $creditmemo->getOrder(),
- !$offlineRequested
- );
- $this->creditmemoRepository->save($creditmemo);
- $this->getOrderRepository()->save($order);
- $connection->commit();
- } catch (\Exception $e) {
- $connection->rollBack();
- throw new \Magento\Framework\Exception\LocalizedException(__($e->getMessage()));
- }
- return $creditmemo;
- }
- /**
- * Validates if credit memo is available for refund.
- *
- * @param \Magento\Sales\Api\Data\CreditmemoInterface $creditmemo
- * @return bool
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function validateForRefund(\Magento\Sales\Api\Data\CreditmemoInterface $creditmemo)
- {
- if ($creditmemo->getId() && $creditmemo->getState() != \Magento\Sales\Model\Order\Creditmemo::STATE_OPEN) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __('We cannot register an existing credit memo.')
- );
- }
- $baseOrderRefund = $this->priceCurrency->round(
- $creditmemo->getOrder()->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
- );
- if ($baseOrderRefund > $this->priceCurrency->round($creditmemo->getOrder()->getBaseTotalPaid())) {
- $baseAvailableRefund = $creditmemo->getOrder()->getBaseTotalPaid()
- - $creditmemo->getOrder()->getBaseTotalRefunded();
- throw new \Magento\Framework\Exception\LocalizedException(
- __(
- 'The most money available to refund is %1.',
- $creditmemo->getOrder()->formatPriceTxt($baseAvailableRefund)
- )
- );
- }
- return true;
- }
- /**
- * Initializes RefundAdapterInterface dependency.
- *
- * @return \Magento\Sales\Model\Order\RefundAdapterInterface
- * @deprecated 100.1.3
- */
- private function getRefundAdapter()
- {
- if ($this->refundAdapter === null) {
- $this->refundAdapter = \Magento\Framework\App\ObjectManager::getInstance()
- ->get(\Magento\Sales\Model\Order\RefundAdapterInterface::class);
- }
- return $this->refundAdapter;
- }
- /**
- * Initializes ResourceConnection dependency.
- *
- * @return \Magento\Framework\App\ResourceConnection|mixed
- * @deprecated 100.1.3
- */
- private function getResource()
- {
- if ($this->resource === null) {
- $this->resource = \Magento\Framework\App\ObjectManager::getInstance()
- ->get(\Magento\Framework\App\ResourceConnection::class);
- }
- return $this->resource;
- }
- /**
- * Initializes OrderRepositoryInterface dependency.
- *
- * @return \Magento\Sales\Api\OrderRepositoryInterface
- * @deprecated 100.1.3
- */
- private function getOrderRepository()
- {
- if ($this->orderRepository === null) {
- $this->orderRepository = \Magento\Framework\App\ObjectManager::getInstance()
- ->get(\Magento\Sales\Api\OrderRepositoryInterface::class);
- }
- return $this->orderRepository;
- }
- /**
- * Initializes InvoiceRepositoryInterface dependency.
- *
- * @return \Magento\Sales\Api\InvoiceRepositoryInterface
- * @deprecated 100.1.3
- */
- private function getInvoiceRepository()
- {
- if ($this->invoiceRepository === null) {
- $this->invoiceRepository = \Magento\Framework\App\ObjectManager::getInstance()
- ->get(\Magento\Sales\Api\InvoiceRepositoryInterface::class);
- }
- return $this->invoiceRepository;
- }
- }
|