Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
GetItemsToCancelFromOrderItem.php
Go to the documentation of this file.
1 <?php
7 declare(strict_types=1);
8 
10 
12 use Magento\Sales\Model\Order\Item as OrderItem;
14 use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory;
16 
18 {
22  private $getSkuFromOrderItem;
23 
27  private $itemsToSellFactory;
28 
32  private $jsonSerializer;
33 
39  public function __construct(
40  GetSkuFromOrderItemInterface $getSkuFromOrderItem,
41  ItemToSellInterfaceFactory $itemsToSellFactory,
42  Json $jsonSerializer
43  ) {
44  $this->getSkuFromOrderItem = $getSkuFromOrderItem;
45  $this->itemsToSellFactory = $itemsToSellFactory;
46  $this->jsonSerializer = $jsonSerializer;
47  }
48 
53  public function execute(OrderItem $orderItem): array
54  {
55  $itemsToCancel = [];
56  if ($orderItem->getHasChildren()) {
57  if (!$orderItem->isDummy(true)) {
58  foreach ($this->processComplexItem($orderItem) as $item) {
59  $itemsToCancel[] = $item;
60  }
61  }
62  } elseif (!$orderItem->isDummy(true)) {
63  $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
64  $itemsToCancel[] = $this->itemsToSellFactory->create([
65  'sku' => $itemSku,
66  'qty' => $this->getQtyToCancel($orderItem)
67  ]);
68  }
69 
70  return $this->groupItemsBySku($itemsToCancel);
71  }
72 
77  private function groupItemsBySku(array $itemsToCancel): array
78  {
79  $processingItems = $groupedItems = [];
80  foreach ($itemsToCancel as $item) {
81  if ($item->getQuantity() == 0) {
82  continue;
83  }
84  if (empty($processingItems[$item->getSku()])) {
85  $processingItems[$item->getSku()] = $item->getQuantity();
86  } else {
87  $processingItems[$item->getSku()] += $item->getQuantity();
88  }
89  }
90 
91  foreach ($processingItems as $sku => $qty) {
92  $groupedItems[] = $this->itemsToSellFactory->create([
93  'sku' => $sku,
94  'qty' => $qty
95  ]);
96  }
97 
98  return $groupedItems;
99  }
100 
105  private function processComplexItem(OrderItem $orderItem): array
106  {
107  $itemsToCancel = [];
108  foreach ($orderItem->getChildrenItems() as $item) {
109  $productOptions = $item->getProductOptions();
110  if (isset($productOptions['bundle_selection_attributes'])) {
111  $bundleSelectionAttributes = $this->jsonSerializer->unserialize(
112  $productOptions['bundle_selection_attributes']
113  );
114  if ($bundleSelectionAttributes) {
115  $shippedQty = $bundleSelectionAttributes['qty'] * $orderItem->getQtyShipped();
116  $qty = $item->getQtyOrdered() - max($shippedQty, $item->getQtyInvoiced()) - $item->getQtyCanceled();
117  $itemSku = $this->getSkuFromOrderItem->execute($item);
118  $itemsToCancel[] = $this->itemsToSellFactory->create([
119  'sku' => $itemSku,
120  'qty' => $qty
121  ]);
122  }
123  } else {
124  // configurable product
125  $itemSku = $this->getSkuFromOrderItem->execute($orderItem);
126  $itemsToCancel[] = $this->itemsToSellFactory->create([
127  'sku' => $itemSku,
128  'qty' => $this->getQtyToCancel($orderItem)
129  ]);
130  }
131  }
132  return $itemsToCancel;
133  }
134 
139  private function getQtyToCancel(OrderItem $item): float
140  {
141  return $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled();
142  }
143 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
$orderItem
Definition: order.php:30
__construct(GetSkuFromOrderItemInterface $getSkuFromOrderItem, ItemToSellInterfaceFactory $itemsToSellFactory, Json $jsonSerializer)