protected function updateCogs($params) { $cogs = Cogs::findOne(['product_id' => $params['product_id']]); if (!$cogs) { $cogs = new Cogs(['product_id' => $params['product_id'], 'cogs' => 0.0]); } $current_stock = MProductStock::find()->where(['product_id' => $params['product_id']])->sum('qty'); $qty_per_uom = $params['qty_per_uom']; $added_stock = $params['qty'] * $qty_per_uom; if ($current_stock + $added_stock != 0) { $cogs->cogs = 1.0 * ($cogs->cogs * $current_stock + $params['price'] * $params['qty']) / ($current_stock + $added_stock); } else { $cogs->cogs = 0; } if ($cogs->canSetProperty('logParams')) { $cogs->logParams = ['app' => $params['app'], 'reff_id' => $params['reff_id']]; } if (!$cogs->save()) { throw new UserException(implode(",\n", $cogs->firstErrors)); } return true; }
/** * @return \yii\db\ActiveQuery */ public function getProductStocks() { return $this->hasMany(ProductStock::className(), ['product_id' => 'id']); }
/** * * @param StockOpname $opname * @param MStockAdjustment $model * @return mixed * @throws \Exception */ public function createFromOpname($opname, $model = null) { // info product $currentStocks = ProductStock::find()->select(['product_id', 'qty_stock'])->where(['warehouse_id' => $opname->warehouse_id])->indexBy('product_id')->asArray()->all(); $isiProductUoms = []; foreach (ProductUom::find()->asArray()->all() as $row) { $isiProductUoms[$row['product_id']][$row['uom_id']] = $row['isi']; } // *** $data = ['warehouse_id' => $opname->warehouse_id, 'adjustment_date' => date('Y-m-d'), 'reff_id' => $opname->id, 'description' => "Stock adjustment from stock opname no \"{$opname->opname_num}\"."]; $details = []; foreach ($opname->stockOpnameDtls as $detail) { $cQty = $currentStocks[$detail->product_id] / $isiProductUoms[$detail->product_id][$detail->uom_id]; $details[] = ['product_id' => $detail->product_id, 'uom_id' => $detail->uom_id, 'qty' => $detail->qty - $cQty]; } $data['details'] = $details; return $this->create($data, $model); }