/** * Creates a new Delivery model. * If creation is successful, the browser will be redirected to the 'view' page. * @return mixed */ public function actionCreate() { $model = new Delivery(); $modelDetails = [new DeliveryDetail()]; if ($model->load(Yii::$app->request->post())) { $modelDetails = Delivery::createMultiple(DeliveryDetail::className()); Delivery::loadMultiple($modelDetails, Yii::$app->request->post()); //ajax validation if (Yii::$app->request->isAjax) { Yii::$app->request->format = Response::FORMAT_JSON; return ArrayHelper::merge(ActiveForm::validateMultiple($modelDetails), ActiveForm::validate($model)); } // set the time if ($model->time) { date_default_timezone_set("Asia/ShangHai"); $model->time .= " " . date("H:i:s"); } //validate all models $valid = $model->validate(); $profit = 0; $valid = Delivery::validateMultiple($modelDetails) && $valid; if ($valid) { $transcation = Yii::$app->db->beginTransaction(); try { if ($flag = $model->save(false)) { foreach ($modelDetails as $modelDetail) { $modelDetail->delivery_id = $model->id; //count the profit; $profit += $modelDetail->count * ($modelDetail->price - ($modelDetail->product->unit == 'B' ? $modelDetail->product->cost : $modelDetail->product->cost * $modelDetail->product->specification)); if (!($flag = $modelDetail->save(false))) { $transcation->rollBack(); } } } if ($flag) { $transcation->commit(); //add the money to customer $customer = $model->customer; $customer->unpay += $model->money; $customer->sum += $model->money; $customer->save(); // save the profit $model->profit = $profit; $model->save(); return $this->redirect(['view', 'id' => $model->id]); } } catch (Exception $e) { $transcation->rollBack(); } } } return $this->render('create', ['model' => $model, 'modelDetails' => empty($modelDetails) ? [new DeliveryDetail()] : $modelDetails]); }