Una cosa que las otras respuestas perdieron es que si usted setQty($qty)
aplicará el valor exacto que proporcione. Pero si se realizó una venta para ese producto un momento antes de su ahorro, la cantidad original podría haber cambiado. Entonces, lo que realmente quiere hacer es decirle a Magento la diferencia que desea aplicar a la cantidad.
Afortunadamente, Magento 2 proporciona un buen mecanismo para esto. Echa un vistazo a Magento\CatalogInventory\Model\ResourceModel\Stock\Item
:
protected function _prepareDataForTable(\Magento\Framework\DataObject $object, $table)
{
$data = parent::_prepareDataForTable($object, $table);
$ifNullSql = $this->getConnection()->getIfNullSql('qty');
if (!$object->isObjectNew() && $object->getQtyCorrection()) {
if ($object->getQty() === null) {
$data['qty'] = null;
} elseif ($object->getQtyCorrection() < 0) {
$data['qty'] = new \Zend_Db_Expr($ifNullSql . '-' . abs($object->getQtyCorrection()));
} else {
$data['qty'] = new \Zend_Db_Expr($ifNullSql . '+' . $object->getQtyCorrection());
}
}
return $data;
}
Aquí vemos que si establece el qty_correction
valor, aplicará la diferencia de forma incremental en lugar de aplicar una cantidad exacta.
Entonces, mi sugerencia para un ahorro de cantidad más seguro es esta:
/**
* @var \Magento\CatalogInventory\Api\StockRegistryInterface
*/
protected $stockRegistry;
public function __construct(StockRegistryInterface $stockRegistry)
{
$this->stockRegistry = $stockRegistry;
}
/**
* Set the quantity in stock for a product
*
*/
public function applyNewQty($sku, $newQty)
{
$stockItem = $this->stockRegistry->getStockItemBySku($sku);
$origQty = $stockItem->getQty();
$difference = $newQty - $origQty;
$stockItem->setQtyCorrection($difference);
$this->stockRegistry->updateStockItemBySku($sku, $stockItem);
// note that at this point, $stockItem->getQty() is incorrect, so you'll need to reload if you need that value
}