Magento 2.3.2: How to override a Inventory Deduction API model?
Question
I want to override below Magento core file
vendor/magento/module-inventory-source-deduction-api/Model/SourceDeductionService.php
to add code $qty=0; inline 83.
I tried by my self but getting an error.
Fatal error: Declaration of Ahmad\InventoryDeduction\Model\Rewrite\SourceDeductionService::execute(Ahmad\InventoryDeduction\Model\Rewrite\SourceDeductionRequestInterface $sourceDeductionRequest): void must be compatible with Magento\InventorySourceDeductionApi\Model\SourceDeductionServiceInterface::execute(Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface $sourceDeductionRequest): void in /opt/lampp/htdocs/M232/app/code/Ahmad/InventoryDeduction/Model/Rewrite/SourceDeductionService.php on line 8
Tried below module.
/Ahmad/Deduction/Model/Rewrite/SourceDeductionService.php
<?php
namespace Ahmad\Deduction\Model\Rewrite;
use Magento\Framework\Exception\LocalizedException;
use Magento\InventoryApi\Api\SourceItemsSaveInterface;
use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface;
use Magento\InventorySalesApi\Api\GetStockBySalesChannelInterface;
class SourceDeductionService extends \Magento\InventorySourceDeductionApi\Model\SourceDeductionService
{
/**
* @var SourceItemsSaveInterface
*/
private $sourceItemsSave;
/**
* @var GetSourceItemBySourceCodeAndSku
*/
private $getSourceItemBySourceCodeAndSku;
/**
* @var GetStockItemConfigurationInterface
*/
private $getStockItemConfiguration;
/**
* @var GetStockBySalesChannelInterface
*/
private $getStockBySalesChannel;
/**
* @param SourceItemsSaveInterface $sourceItemsSave
* @param GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku
* @param GetStockItemConfigurationInterface $getStockItemConfiguration
* @param GetStockBySalesChannelInterface $getStockBySalesChannel
*/
public function __construct(
SourceItemsSaveInterface $sourceItemsSave,
GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku,
GetStockItemConfigurationInterface $getStockItemConfiguration,
GetStockBySalesChannelInterface $getStockBySalesChannel
) {
$this->sourceItemsSave = $sourceItemsSave;
$this->getSourceItemBySourceCodeAndSku = $getSourceItemBySourceCodeAndSku;
$this->getStockItemConfiguration = $getStockItemConfiguration;
$this->getStockBySalesChannel = $getStockBySalesChannel;
}
/**
* @inheritdoc
*/
public function execute(Ahmad\Deduction\Model\Rewrite\SourceDeductionRequestInterface $sourceDeductionRequest): void
{
$sourceItems = [];
$sourceCode = $sourceDeductionRequest->getSourceCode();
$salesChannel = $sourceDeductionRequest->getSalesChannel();
$stockId = $this->getStockBySalesChannel->execute($salesChannel)->getStockId();
foreach ($sourceDeductionRequest->getItems() as $item) {
$itemSku = $item->getSku();
$qty = $item->getQty();
$stockItemConfiguration = $this->getStockItemConfiguration->execute(
$itemSku,
$stockId
);
if (!$stockItemConfiguration->isManageStock()) {
//We don't need to Manage Stock
continue;
}
$sourceItem = $this->getSourceItemBySourceCodeAndSku->execute($sourceCode, $itemSku);
if (($sourceItem->getQuantity() - $qty) >= 0) {
$qty = 0; // To stop stock qty decrease twice, on invoice
$sourceItem->setQuantity($sourceItem->getQuantity() - $qty);
$sourceItems[] = $sourceItem;
} else {
throw new LocalizedException(
__('Not all of your products are available in the requested quantity.')
);
}
}
if (!empty($sourceItems)) {
$this->sourceItemsSave->execute($sourceItems);
}
}
}
Ahmad/Deduction/etc/adminhtml/di.xml.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\InventorySourceDeductionApi\Model\SourceDeductionService" type="Ahmad\Deduction\Model\Rewrite\SourceDeductionService" />
</config>
Solution
There are many mistakes in your class.
1. You must include full path of the class for GetSourceItemBySourceCodeAndSku
2. You should call the parent __construct
method.
3. Copy the exact argument list from the parent class for execute()
method.
<?php
namespace Ahmad\Deduction\Model\Rewrite;
use Magento\InventoryApi\Api\SourceItemsSaveInterface;
use Magento\InventoryConfigurationApi\Api\GetStockItemConfigurationInterface;
use Magento\InventorySalesApi\Api\GetStockBySalesChannelInterface;
use Magento\InventorySourceDeductionApi\Model\GetSourceItemBySourceCodeAndSku;
use Magento\InventorySourceDeductionApi\Model\SourceDeductionRequestInterface;
use Magento\Framework\Exception\LocalizedException;
//use Magento\InventorySourceDeductionApi\Model\SourceDeductionService ;// added
/**
* @inheritdoc
*/
class SourceDeductionService extends \Magento\InventorySourceDeductionApi\Model\SourceDeductionService
{
/**
* @var SourceItemsSaveInterface
*/
private $sourceItemsSave;
/**
* @var GetSourceItemBySourceCodeAndSku
*/
private $getSourceItemBySourceCodeAndSku;
/**
* @var GetStockItemConfigurationInterface
*/
private $getStockItemConfiguration;
/**
* @var GetStockBySalesChannelInterface
*/
private $getStockBySalesChannel;
/**
* @param SourceItemsSaveInterface $sourceItemsSave
* @param GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku
* @param GetStockItemConfigurationInterface $getStockItemConfiguration
* @param GetStockBySalesChannelInterface $getStockBySalesChannel
*/
public function __construct(
SourceItemsSaveInterface $sourceItemsSave,
GetSourceItemBySourceCodeAndSku $getSourceItemBySourceCodeAndSku,
GetStockItemConfigurationInterface $getStockItemConfiguration,
GetStockBySalesChannelInterface $getStockBySalesChannel
) {
$this->sourceItemsSave = $sourceItemsSave;
$this->getSourceItemBySourceCodeAndSku = $getSourceItemBySourceCodeAndSku;
$this->getStockItemConfiguration = $getStockItemConfiguration;
$this->getStockBySalesChannel = $getStockBySalesChannel;
parent::__construct($sourceItemsSave,$getSourceItemBySourceCodeAndSku,$getStockItemConfiguration,$getStockBySalesChannel); //ended the statement with a ;
}
/**
* @inheritdoc
*/
public function execute(SourceDeductionRequestInterface $sourceDeductionRequest): void
{
$sourceItems = [];
$sourceCode = $sourceDeductionRequest->getSourceCode();
$salesChannel = $sourceDeductionRequest->getSalesChannel();
$stockId = $this->getStockBySalesChannel->execute($salesChannel)->getStockId();
foreach ($sourceDeductionRequest->getItems() as $item) {
$itemSku = $item->getSku();
$qty = $item->getQty();
$stockItemConfiguration = $this->getStockItemConfiguration->execute(
$itemSku,
$stockId
);
if (!$stockItemConfiguration->isManageStock()) {
//We don't need to Manage Stock
continue;
}
$sourceItem = $this->getSourceItemBySourceCodeAndSku->execute($sourceCode, $itemSku);
if (($sourceItem->getQuantity() - $qty) >= 0) {
$qty = 0; //added to stop decrease twice stock qty on invoice
$sourceItem->setQuantity($sourceItem->getQuantity() - $qty);
$sourceItems[] = $sourceItem;
} else {
throw new LocalizedException(
__('Not all of your products are available in the requested quantity.')
);
}
}
if (!empty($sourceItems)) {
$this->sourceItemsSave->execute($sourceItems);
}
}
}