RefundOperation.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Sales\Model\Order\Creditmemo;
  7. use Magento\Sales\Api\Data\CreditmemoInterface;
  8. use Magento\Sales\Api\Data\OrderInterface;
  9. use Magento\Sales\Model\Order\Creditmemo;
  10. class RefundOperation
  11. {
  12. /**
  13. * @var \Magento\Framework\Event\ManagerInterface
  14. */
  15. private $eventManager;
  16. /**
  17. * @var \Magento\Framework\Pricing\PriceCurrencyInterface
  18. */
  19. private $priceCurrency;
  20. /**
  21. * @param \Magento\Framework\Model\Context $context
  22. * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
  23. */
  24. public function __construct(
  25. \Magento\Framework\Model\Context $context,
  26. \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
  27. ) {
  28. $this->eventManager = $context->getEventDispatcher();
  29. $this->priceCurrency = $priceCurrency;
  30. }
  31. /**
  32. * @param CreditmemoInterface $creditmemo
  33. * @param OrderInterface $order
  34. * @param bool $online
  35. * @return OrderInterface
  36. */
  37. public function execute(CreditmemoInterface $creditmemo, OrderInterface $order, $online = false)
  38. {
  39. if ($creditmemo->getState() == Creditmemo::STATE_REFUNDED
  40. && $creditmemo->getOrderId() == $order->getEntityId()
  41. ) {
  42. foreach ($creditmemo->getItems() as $item) {
  43. if ($item->isDeleted()) {
  44. continue;
  45. }
  46. $item->setCreditMemo($creditmemo);
  47. if ($item->getQty() > 0) {
  48. $item->register();
  49. } else {
  50. $item->isDeleted(true);
  51. }
  52. }
  53. $baseOrderRefund = $this->priceCurrency->round(
  54. $order->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
  55. );
  56. $orderRefund = $this->priceCurrency->round(
  57. $order->getTotalRefunded() + $creditmemo->getGrandTotal()
  58. );
  59. $order->setBaseTotalRefunded($baseOrderRefund);
  60. $order->setTotalRefunded($orderRefund);
  61. $order->setBaseSubtotalRefunded($order->getBaseSubtotalRefunded() + $creditmemo->getBaseSubtotal());
  62. $order->setSubtotalRefunded($order->getSubtotalRefunded() + $creditmemo->getSubtotal());
  63. $order->setBaseTaxRefunded($order->getBaseTaxRefunded() + $creditmemo->getBaseTaxAmount());
  64. $order->setTaxRefunded($order->getTaxRefunded() + $creditmemo->getTaxAmount());
  65. $order->setBaseDiscountTaxCompensationRefunded(
  66. $order->getBaseDiscountTaxCompensationRefunded() + $creditmemo->getBaseDiscountTaxCompensationAmount()
  67. );
  68. $order->setDiscountTaxCompensationRefunded(
  69. $order->getDiscountTaxCompensationRefunded() + $creditmemo->getDiscountTaxCompensationAmount()
  70. );
  71. $order->setBaseShippingRefunded($order->getBaseShippingRefunded() + $creditmemo->getBaseShippingAmount());
  72. $order->setShippingRefunded($order->getShippingRefunded() + $creditmemo->getShippingAmount());
  73. $order->setBaseShippingTaxRefunded(
  74. $order->getBaseShippingTaxRefunded() + $creditmemo->getBaseShippingTaxAmount()
  75. );
  76. $order->setShippingTaxRefunded($order->getShippingTaxRefunded() + $creditmemo->getShippingTaxAmount());
  77. $order->setAdjustmentPositive($order->getAdjustmentPositive() + $creditmemo->getAdjustmentPositive());
  78. $order->setBaseAdjustmentPositive(
  79. $order->getBaseAdjustmentPositive() + $creditmemo->getBaseAdjustmentPositive()
  80. );
  81. $order->setAdjustmentNegative($order->getAdjustmentNegative() + $creditmemo->getAdjustmentNegative());
  82. $order->setBaseAdjustmentNegative(
  83. $order->getBaseAdjustmentNegative() + $creditmemo->getBaseAdjustmentNegative()
  84. );
  85. $order->setDiscountRefunded($order->getDiscountRefunded() + $creditmemo->getDiscountAmount());
  86. $order->setBaseDiscountRefunded($order->getBaseDiscountRefunded() + $creditmemo->getBaseDiscountAmount());
  87. if ($online) {
  88. $order->setTotalOnlineRefunded($order->getTotalOnlineRefunded() + $creditmemo->getGrandTotal());
  89. $order->setBaseTotalOnlineRefunded(
  90. $order->getBaseTotalOnlineRefunded() + $creditmemo->getBaseGrandTotal()
  91. );
  92. } else {
  93. $order->setTotalOfflineRefunded($order->getTotalOfflineRefunded() + $creditmemo->getGrandTotal());
  94. $order->setBaseTotalOfflineRefunded(
  95. $order->getBaseTotalOfflineRefunded() + $creditmemo->getBaseGrandTotal()
  96. );
  97. }
  98. $order->setBaseTotalInvoicedCost(
  99. $order->getBaseTotalInvoicedCost() - $creditmemo->getBaseCost()
  100. );
  101. $creditmemo->setDoTransaction(!$creditmemo->getPaymentRefundDisallowed() && $online);
  102. $order->getPayment()->refund($creditmemo);
  103. $this->eventManager->dispatch('sales_order_creditmemo_refund', ['creditmemo' => $creditmemo]);
  104. }
  105. return $order;
  106. }
  107. }