isSingleSourceMode = $isSingleSourceMode; $this->defaultSourceProvider = $defaultSourceProvider; $this->getItemsToDeductFromShipment = $getItemsToDeductFromShipment; $this->sourceDeductionRequestFromShipmentFactory = $sourceDeductionRequestFromShipmentFactory; $this->sourceDeductionService = $sourceDeductionService; $this->itemsToSellFactory = $itemsToSellFactory; $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent; } /** * @param EventObserver $observer * @return void */ public function execute(EventObserver $observer) { /** @var \Magento\Sales\Model\Order\Shipment $shipment */ $shipment = $observer->getEvent()->getShipment(); if ($shipment->getOrigData('entity_id')) { return; } if (!empty($shipment->getExtensionAttributes()) && !empty($shipment->getExtensionAttributes()->getSourceCode())) { $sourceCode = $shipment->getExtensionAttributes()->getSourceCode(); } elseif ($this->isSingleSourceMode->execute()) { $sourceCode = $this->defaultSourceProvider->getCode(); } $shipmentItems = $this->getItemsToDeductFromShipment->execute($shipment); if (!empty($shipmentItems)) { $sourceDeductionRequest = $this->sourceDeductionRequestFromShipmentFactory->execute( $shipment, $sourceCode, $shipmentItems ); $this->sourceDeductionService->execute($sourceDeductionRequest); $this->placeCompensatingReservation($sourceDeductionRequest); } } /** * Place compensating reservation after source deduction * * @param SourceDeductionRequestInterface $sourceDeductionRequest */ private function placeCompensatingReservation(SourceDeductionRequestInterface $sourceDeductionRequest): void { $items = []; foreach ($sourceDeductionRequest->getItems() as $item) { $items[] = $this->itemsToSellFactory->create([ 'sku' => $item->getSku(), 'qty' => $item->getQty() ]); } $this->placeReservationsForSalesEvent->execute( $items, $sourceDeductionRequest->getSalesChannel(), $sourceDeductionRequest->getSalesEvent() ); } }