Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
RefundOperation.php
Go to the documentation of this file.
1 <?php
7 
11 
13 {
17  private $eventManager;
18 
22  private $priceCurrency;
23 
28  public function __construct(
29  \Magento\Framework\Model\Context $context,
30  \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency
31  ) {
32  $this->eventManager = $context->getEventDispatcher();
33  $this->priceCurrency = $priceCurrency;
34  }
35 
42  public function execute(CreditmemoInterface $creditmemo, OrderInterface $order, $online = false)
43  {
44  if ($creditmemo->getState() == Creditmemo::STATE_REFUNDED
45  && $creditmemo->getOrderId() == $order->getEntityId()
46  ) {
47  foreach ($creditmemo->getItems() as $item) {
48  if ($item->isDeleted()) {
49  continue;
50  }
51  $item->setCreditMemo($creditmemo);
52  if ($item->getQty() > 0) {
53  $item->register();
54  } else {
55  $item->isDeleted(true);
56  }
57  }
58 
59  $baseOrderRefund = $this->priceCurrency->round(
60  $order->getBaseTotalRefunded() + $creditmemo->getBaseGrandTotal()
61  );
62  $orderRefund = $this->priceCurrency->round(
63  $order->getTotalRefunded() + $creditmemo->getGrandTotal()
64  );
65  $order->setBaseTotalRefunded($baseOrderRefund);
66  $order->setTotalRefunded($orderRefund);
67 
68  $order->setBaseSubtotalRefunded($order->getBaseSubtotalRefunded() + $creditmemo->getBaseSubtotal());
69  $order->setSubtotalRefunded($order->getSubtotalRefunded() + $creditmemo->getSubtotal());
70 
71  $order->setBaseTaxRefunded($order->getBaseTaxRefunded() + $creditmemo->getBaseTaxAmount());
72  $order->setTaxRefunded($order->getTaxRefunded() + $creditmemo->getTaxAmount());
73  $order->setBaseDiscountTaxCompensationRefunded(
74  $order->getBaseDiscountTaxCompensationRefunded() + $creditmemo->getBaseDiscountTaxCompensationAmount()
75  );
76  $order->setDiscountTaxCompensationRefunded(
77  $order->getDiscountTaxCompensationRefunded() + $creditmemo->getDiscountTaxCompensationAmount()
78  );
79 
80  $order->setBaseShippingRefunded($order->getBaseShippingRefunded() + $creditmemo->getBaseShippingAmount());
81  $order->setShippingRefunded($order->getShippingRefunded() + $creditmemo->getShippingAmount());
82 
83  $order->setBaseShippingTaxRefunded(
84  $order->getBaseShippingTaxRefunded() + $creditmemo->getBaseShippingTaxAmount()
85  );
86  $order->setShippingTaxRefunded($order->getShippingTaxRefunded() + $creditmemo->getShippingTaxAmount());
87 
88  $order->setAdjustmentPositive($order->getAdjustmentPositive() + $creditmemo->getAdjustmentPositive());
89  $order->setBaseAdjustmentPositive(
90  $order->getBaseAdjustmentPositive() + $creditmemo->getBaseAdjustmentPositive()
91  );
92 
93  $order->setAdjustmentNegative($order->getAdjustmentNegative() + $creditmemo->getAdjustmentNegative());
94  $order->setBaseAdjustmentNegative(
95  $order->getBaseAdjustmentNegative() + $creditmemo->getBaseAdjustmentNegative()
96  );
97 
98  $order->setDiscountRefunded($order->getDiscountRefunded() + $creditmemo->getDiscountAmount());
99  $order->setBaseDiscountRefunded($order->getBaseDiscountRefunded() + $creditmemo->getBaseDiscountAmount());
100 
101  if ($online) {
102  $order->setTotalOnlineRefunded($order->getTotalOnlineRefunded() + $creditmemo->getGrandTotal());
103  $order->setBaseTotalOnlineRefunded(
104  $order->getBaseTotalOnlineRefunded() + $creditmemo->getBaseGrandTotal()
105  );
106  } else {
107  $order->setTotalOfflineRefunded($order->getTotalOfflineRefunded() + $creditmemo->getGrandTotal());
108  $order->setBaseTotalOfflineRefunded(
109  $order->getBaseTotalOfflineRefunded() + $creditmemo->getBaseGrandTotal()
110  );
111  }
112 
113  $order->setBaseTotalInvoicedCost(
114  $order->getBaseTotalInvoicedCost() - $creditmemo->getBaseCost()
115  );
116 
117  $creditmemo->setDoTransaction(!$creditmemo->getPaymentRefundDisallowed() && $online);
118  $order->getPayment()->refund($creditmemo);
119 
120  $this->eventManager->dispatch('sales_order_creditmemo_refund', ['creditmemo' => $creditmemo]);
121  }
122 
123  return $order;
124  }
125 }
$order
Definition: order.php:55
__construct(\Magento\Framework\Model\Context $context, \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency)
execute(CreditmemoInterface $creditmemo, OrderInterface $order, $online=false)