Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
VirtualSourceDeductionProcessor.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
14 use Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory;
21 use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory;
23 
28 {
32  private $getSourceSelectionResultFromInvoice;
33 
37  private $sourceDeductionService;
38 
42  private $sourceDeductionRequestsFromSourceSelectionFactory;
43 
47  private $salesEventFactory;
48 
52  private $itemToSellFactory;
53 
57  private $placeReservationsForSalesEvent;
58 
67  public function __construct(
68  GetSourceSelectionResultFromInvoice $getSourceSelectionResultFromInvoice,
69  SourceDeductionServiceInterface $sourceDeductionService,
70  SourceDeductionRequestsFromSourceSelectionFactory $sourceDeductionRequestsFromSourceSelectionFactory,
71  SalesEventInterfaceFactory $salesEventFactory,
72  ItemToSellInterfaceFactory $itemToSellFactory,
73  PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent
74  ) {
75  $this->getSourceSelectionResultFromInvoice = $getSourceSelectionResultFromInvoice;
76  $this->sourceDeductionService = $sourceDeductionService;
77  $this->sourceDeductionRequestsFromSourceSelectionFactory = $sourceDeductionRequestsFromSourceSelectionFactory;
78  $this->salesEventFactory = $salesEventFactory;
79  $this->itemToSellFactory = $itemToSellFactory;
80  $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent;
81  }
82 
88  public function execute(EventObserver $observer)
89  {
91  $invoice = $observer->getEvent()->getInvoice();
92  if (!$this->isValid($invoice)) {
93  return;
94  }
95 
96  $sourceSelectionResult = $this->getSourceSelectionResultFromInvoice->execute($invoice);
97 
99  $salesEvent = $this->salesEventFactory->create([
102  'objectId' => $invoice->getOrderId(),
103  ]);
104 
105  $sourceDeductionRequests = $this->sourceDeductionRequestsFromSourceSelectionFactory->create(
106  $sourceSelectionResult,
107  $salesEvent,
108  (int)$invoice->getOrder()->getStore()->getWebsiteId()
109  );
110 
111  foreach ($sourceDeductionRequests as $sourceDeductionRequest) {
112  $this->sourceDeductionService->execute($sourceDeductionRequest);
113  $this->placeCompensatingReservation($sourceDeductionRequest);
114  }
115  }
116 
122  private function placeCompensatingReservation(SourceDeductionRequestInterface $sourceDeductionRequest): void
123  {
124  $items = [];
125  foreach ($sourceDeductionRequest->getItems() as $item) {
126  $items[] = $this->itemToSellFactory->create([
127  'sku' => $item->getSku(),
128  'qty' => $item->getQty()
129  ]);
130  }
131  $this->placeReservationsForSalesEvent->execute(
132  $items,
133  $sourceDeductionRequest->getSalesChannel(),
134  $sourceDeductionRequest->getSalesEvent()
135  );
136  }
137 
142  private function isValid(InvoiceInterface $invoice): bool
143  {
144  if ($invoice->getOrigData('entity_id')) {
145  return false;
146  }
147 
148  return $this->hasValidItems($invoice);
149  }
150 
155  private function hasValidItems(InvoiceInterface $invoice): bool
156  {
157  foreach ($invoice->getItems() as $invoiceItem) {
159  $orderItem = $invoiceItem->getOrderItem();
160  if ($orderItem->getIsVirtual()) {
161  return true;
162  }
163  }
164 
165  return false;
166  }
167 }
$invoiceItem
$orderItem
Definition: order.php:30
__construct(GetSourceSelectionResultFromInvoice $getSourceSelectionResultFromInvoice, SourceDeductionServiceInterface $sourceDeductionService, SourceDeductionRequestsFromSourceSelectionFactory $sourceDeductionRequestsFromSourceSelectionFactory, SalesEventInterfaceFactory $salesEventFactory, ItemToSellInterfaceFactory $itemToSellFactory, PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent)
$invoice
$items