Files
2026-09-15 10:26:34 +08:00

99 lines
3.8 KiB
PHP

<?php
namespace Stemcell\SubItemProduct\Observer;
use Magento\ConfigurableProduct\Model\Product\Type\Configurable;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\InventorySalesApi\Api\Data\SalesEventInterface;
use Magento\Sales\Model\Order;
use Magento\Sales\Model\Order\Item as OrderItem;
class RevertSubItemInventory extends SubtractSubItemInventory
{
/**
* @param Order\Item $orderItem
* @return void
*/
protected function revertSubItemInventory(Order\Item $orderItem)
{
try {
$this->getSubItemsFromOrderItem($orderItem);
//$this->logger->debug('$this->subItems: ', $this->subItems);
$sourceItems = [];
foreach ($this->subItems as $subItem) {
$items = $this->getSourceItemsBySku->execute($subItem['sku']);
foreach ($items as $sourceItem) {
if ($sourceItem->getSourceCode() === self::DEFAULT_SOURCE_CODE) {
//$this->logger->debug(sprintf('revert sub item inventory,source item %s, product sku: %s, product stock:%f, qty:%d', $sourceItem->getSourceCode(), $subItem['sku'], $sourceItem->getQuantity(), $subItem['qty']));
$newQty = $sourceItem->getQuantity() + $subItem['qty'];
$sourceItem->setQuantity($newQty);
$sourceItems[] = $sourceItem;
}
}
}
if (!empty($sourceItems)) {
$this->sourceItemsSave->execute($sourceItems);
}
} catch (LocalizedException $e) {
$this->logger->critical('revert sub item inventory error: '.$e->getMessage(), $e->getTrace());
}
}
/**
* @param Order $order
* @param array $items
* @return void
* @throws NoSuchEntityException
* @throws \Magento\Framework\Exception\CouldNotSaveException
* @throws \Magento\Framework\Exception\InputException
* @throws \Magento\Framework\Validation\ValidationException
*/
protected function appendReservations(Order $order, array $items)
{
$stockId = $this->getAssignedStockIdForWebsite->execute($order->getStore()->getWebsite()->getCode());
$reservations = [];
foreach ($items as $subProductId => $item) {
$reservations[] = $this->reservationBuilder->setSku($item['sku'])
->setQuantity($item['qty'])
->setStockId($stockId)
->setMetadata(
json_encode([
'event_type'=>SalesEventInterface::EVENT_ORDER_PLACED,
'object_type'=>SalesEventInterface::OBJECT_TYPE_ORDER,
'object_id'=>$order->getId(),
'object_increment_id' => $order->getIncrementId(),
'comment' => 'sub product of '.$this->subProductsParent[$subProductId],
])
)
->build();
}
$this->appendReservations->execute($reservations);
}
public function execute(Observer $observer)
{
/* @var $order Order */
$order = $observer->getData('order');
foreach ($order->getAllVisibleItems() as $item) {
$qty = (int)$item->getQtyOrdered();
try {
$product = $this->productRepository->get($item->getSku());
$this->subItemResourceModel->getConnection()->query("
update subitem_product set stock_qty = stock_qty + (bundle_qty*$qty)
where product_id={$product->getEntityId()};
");
} catch (NoSuchEntityException $e) {
}
}
}
}