6 declare(strict_types=1);
14 use Magento\InventorySalesApi\Api\Data\SalesEventInterfaceFactory;
21 use Magento\InventorySalesApi\Api\Data\ItemToSellInterfaceFactory;
32 private $getSourceSelectionResultFromInvoice;
37 private $sourceDeductionService;
42 private $sourceDeductionRequestsFromSourceSelectionFactory;
47 private $salesEventFactory;
52 private $itemToSellFactory;
57 private $placeReservationsForSalesEvent;
71 SalesEventInterfaceFactory $salesEventFactory,
72 ItemToSellInterfaceFactory $itemToSellFactory,
75 $this->getSourceSelectionResultFromInvoice = $getSourceSelectionResultFromInvoice;
76 $this->sourceDeductionService = $sourceDeductionService;
77 $this->sourceDeductionRequestsFromSourceSelectionFactory = $sourceDeductionRequestsFromSourceSelectionFactory;
78 $this->salesEventFactory = $salesEventFactory;
79 $this->itemToSellFactory = $itemToSellFactory;
80 $this->placeReservationsForSalesEvent = $placeReservationsForSalesEvent;
96 $sourceSelectionResult = $this->getSourceSelectionResultFromInvoice->execute(
$invoice);
99 $salesEvent = $this->salesEventFactory->create([
102 'objectId' =>
$invoice->getOrderId(),
105 $sourceDeductionRequests = $this->sourceDeductionRequestsFromSourceSelectionFactory->create(
106 $sourceSelectionResult,
108 (
int)
$invoice->getOrder()->getStore()->getWebsiteId()
111 foreach ($sourceDeductionRequests as $sourceDeductionRequest) {
112 $this->sourceDeductionService->execute($sourceDeductionRequest);
113 $this->placeCompensatingReservation($sourceDeductionRequest);
122 private function placeCompensatingReservation(SourceDeductionRequestInterface $sourceDeductionRequest): void
125 foreach ($sourceDeductionRequest->getItems() as
$item) {
126 $items[] = $this->itemToSellFactory->create([
127 'sku' =>
$item->getSku(),
128 'qty' =>
$item->getQty()
131 $this->placeReservationsForSalesEvent->execute(
133 $sourceDeductionRequest->getSalesChannel(),
134 $sourceDeductionRequest->getSalesEvent()
142 private function isValid(InvoiceInterface
$invoice): bool
144 if (
$invoice->getOrigData(
'entity_id')) {
148 return $this->hasValidItems(
$invoice);
155 private function hasValidItems(InvoiceInterface
$invoice): bool
__construct(GetSourceSelectionResultFromInvoice $getSourceSelectionResultFromInvoice, SourceDeductionServiceInterface $sourceDeductionService, SourceDeductionRequestsFromSourceSelectionFactory $sourceDeductionRequestsFromSourceSelectionFactory, SalesEventInterfaceFactory $salesEventFactory, ItemToSellInterfaceFactory $itemToSellFactory, PlaceReservationsForSalesEventInterface $placeReservationsForSalesEvent)
const EVENT_INVOICE_CREATED
execute(Observer $observer)