/** * * @param array $params Required field warehouse_id, product_id, qty * Optional field app, reff_id, uom_id, item_value * @return boolean * @throws UserException */ public function updateStock($params) { $stock = MProductStock::findOne(['warehouse_id' => $params['warehouse_id'], 'product_id' => $params['product_id']]); if (isset($params['uom_id'])) { $qty_per_uom = ProductUom::find()->select('isi')->where(['product_id' => $params['product_id'], 'uom_id' => $params['uom_id']])->scalar(); if ($qty_per_uom === false) { throw new NotFoundException("Uom '{$params['uom_id']}' not found for product '{$params['product_id']}'"); } } else { $qty_per_uom = 1; } if (!$stock) { $stock = new MProductStock(['warehouse_id' => $params['warehouse_id'], 'product_id' => $params['product_id'], 'qty' => 0]); } // update cogs if (isset($params['price']) && $params['price'] !== '') { $params['qty_per_uom'] = $qty_per_uom; $this->updateCogs($params); } $stock->qty = $stock->qty + $params['qty'] * $qty_per_uom; if ($stock->canSetProperty('logParams')) { $logParams = ['mv_qty' => $params['qty'] * $qty_per_uom]; foreach (['app', 'reff_id'] as $key) { if (isset($params[$key]) || array_key_exists($key, $params)) { $logParams[$key] = $params[$key]; } } $stock->logParams = $logParams; } if (!$stock->save()) { throw new UserException(implode(",\n", $stock->firstErrors)); } return true; }