/** * copy a Fixed Deposit * @param type $fixedDepositModel * @throws Exception * @return string|true */ private function copyFixedDeposit($fixedDepositModel) { $fixedDepositModel->setIsNewRecord(true); $transaction = Yii::$app->db->beginTransaction(); $save = true; $message = null; // begin transaction try { // saving account $savingAccount = FinAccount::findOne($fixedDepositModel->saving_account); $savingAccount->opening_date = $fixedDepositModel->opening_date . ' 00:00:00'; $savingAccount->closing_date = $fixedDepositModel->closing_date . ' 00:00:00'; $savingAccount->term_interest_rate = $fixedDepositModel->interest_rate; // TM or ATM $currentAssets = FinAccount::findOne($fixedDepositModel->current_assets); // history entry (interest) $interestEntry = new FinAccountEntry(); $interestEntry->entry_date = $fixedDepositModel->opening_date; $interestEntry->entry_value = $fixedDepositModel->interest_add; $interestEntry->entry_status = MasterValueUtils::MV_FIN_ENTRY_TYPE_INTEREST_DEPOSIT; $interestEntry->description = serialize([MasterValueUtils::MV_FIN_ENTRY_LOG_INTEREST]); $interestEntry->account_source = 0; $interestEntry->account_target = $fixedDepositModel->saving_account; // history entry (capital) $capitalEntry = new FinAccountEntry(); $capitalEntry->entry_date = $fixedDepositModel->opening_date; $capitalEntry->entry_value = $fixedDepositModel->entry_value; $capitalEntry->entry_status = MasterValueUtils::MV_FIN_ENTRY_TYPE_DEPOSIT; $capitalEntry->description = serialize([MasterValueUtils::MV_FIN_ENTRY_LOG_SAVING]); if ($fixedDepositModel->add_flag == MasterValueUtils::MV_FIN_TIMEDP_TRANTYPE_ADDING) { $savingAccount->opening_balance += $fixedDepositModel->interest_add + $fixedDepositModel->entry_value; $savingAccount->capital += $fixedDepositModel->entry_value; $currentAssets->opening_balance -= $fixedDepositModel->entry_value; $capitalEntry->account_source = $fixedDepositModel->current_assets; $capitalEntry->account_target = $fixedDepositModel->saving_account; } else { $savingAccount->opening_balance += $fixedDepositModel->interest_add - $fixedDepositModel->entry_value; $savingAccount->capital -= $fixedDepositModel->entry_value; $currentAssets->opening_balance += $fixedDepositModel->entry_value; $capitalEntry->account_source = $fixedDepositModel->saving_account; $capitalEntry->account_target = $fixedDepositModel->current_assets; } // interest unit $instance = $savingAccount->instance(); $instance->initialize(); $fixedDepositModel->interest_unit = $instance->closing_interest_unit; $save = $savingAccount->save(); if ($save !== false) { $save = $currentAssets->save(); } if ($save !== false) { $save = $interestEntry->save(); } if ($save !== false) { $save = $capitalEntry->save(); } if ($save !== false) { $save = $fixedDepositModel->save(); } } catch (Exception $e) { $save = false; $message = Yii::t('common', 'Unable to save {record}.', ['record' => Yii::t('fin.models', 'Fixed Deposit')]); } // end transaction try { if ($save === false) { $transaction->rollback(); return $message; } else { $transaction->commit(); } } catch (Exception $e) { throw Exception(Yii::t('common', 'Unable to excute Transaction.')); } return true; }
/** * update a Purchase * @param $purchase OefPurchase * @param $fmShortDatePhp * @throws Exception * @return string|true */ private function updatePurchase($purchase, $fmShortDatePhp) { // modify data for DB $purchase->purchase_date = DateTimeUtils::parse($purchase->purchase_date, $fmShortDatePhp, DateTimeUtils::FM_DB_DATE); if (!empty($purchase->sip_date)) { $purchase->sip_date = DateTimeUtils::parse($purchase->sip_date, $fmShortDatePhp, DateTimeUtils::FM_DB_DATE); } $transaction = Yii::$app->db->beginTransaction(); $save = true; $message = null; // begin transaction try { // save OefPurchase $save = $purchase->save(); // FinAccountEntry $finPayment = FinAccountEntry::findOne($purchase->fin_entry_id); if ($save !== false && !is_null($finPayment)) { $finPayment->entry_date = $purchase->purchase_date; $finPayment->entry_value = $purchase->investment; $save = $finPayment->save(); // save FinAccount (Debit) if ($save !== false) { $debitFinAccount = FinAccount::findOne($finPayment->account_source); $debitFinAccount->opening_balance = $debitFinAccount->opening_balance - $purchase->investment + $purchase->investment_old; $save = $debitFinAccount->save(); } // save FinAccount (Credit) if ($save !== false) { $creditFinAccount = FinAccount::findOne($finPayment->account_target); $creditFinAccount->opening_balance = $creditFinAccount->opening_balance + $purchase->investment - $purchase->investment_old; $creditFinAccount->capital = $creditFinAccount->capital + $purchase->investment - $purchase->investment_old; $save = $creditFinAccount->save(); } } // save JarPayment $jarPayment = JarPayment::findOne($purchase->jar_payment_id); if ($save !== false && !is_null($jarPayment)) { $jarPayment->entry_date = $purchase->purchase_date; $jarPayment->entry_value = $purchase->investment; $save = $jarPayment->save(); // save JarAccount (Debit) if ($save !== false) { $debitJarAccount = JarAccount::findOne($jarPayment->account_source); $debitJarAccount->useable_balance = $debitJarAccount->useable_balance - $purchase->investment + $purchase->investment_old; $save = $debitJarAccount->save(); } // save JarAccount (Credit) if ($save !== false) { $creditJarAccount = JarAccount::findOne($jarPayment->account_target); $creditJarAccount->useable_balance = $creditJarAccount->useable_balance + $purchase->investment - $purchase->investment_old; $save = $creditJarAccount->save(); } } } catch (Exception $e) { $save = false; $message = Yii::t('common', 'Unable to save {record}.', ['record' => Yii::t('oef.models', 'Purchase')]); } // end transaction try { if ($save === false) { $transaction->rollback(); return $message; } else { $transaction->commit(); } } catch (Exception $e) { throw Exception(Yii::t('common', 'Unable to excute Transaction.')); } return true; }
public function actionCopy($id) { $this->objectId = $id; $model = FinAccountEntry::findOne(['entry_id' => $id, 'entry_status' => MasterValueUtils::MV_FIN_ENTRY_TYPE_SIMPLE, 'delete_flag' => MasterValueUtils::MV_FIN_FLG_DELETE_FALSE]); $renderView = 'copy'; if (is_null($model)) { $model = false; $renderData = ['model' => $model]; Yii::$app->session->setFlash(MasterValueUtils::FLASH_ERROR, Yii::t('common', 'The requested {record} does not exist.', ['record' => Yii::t('fin.models', 'Payment')])); } else { // master value $phpFmShortDate = DateTimeUtils::getPhpDateFormat(); $arrFinAccount = ModelUtils::getArrData(FinAccount::find()->select(['account_id', 'account_name'])->where(['delete_flag' => 0, 'account_type' => [1, 2, 3, 5, 6, 7]])->orderBy('account_type, order_num'), 'account_id', 'account_name'); $arrEntryLog = MasterValueUtils::getArrData('fin_entry_log'); // reset value $model->entry_date = DateTimeUtils::formatNow($phpFmShortDate); // submit data $postData = Yii::$app->request->post(); $submitMode = isset($postData[MasterValueUtils::SM_MODE_NAME]) ? $postData[MasterValueUtils::SM_MODE_NAME] : false; // populate model attributes with user inputs $model->load($postData); if (is_null($model->arr_entry_log)) { $model->arr_entry_log = StringUtils::unserializeArr($model->description); } // init value FinAccountEntry::$_PHP_FM_SHORTDATE = $phpFmShortDate; $model->scenario = MasterValueUtils::SCENARIO_COPY; $renderData = ['model' => $model, 'phpFmShortDate' => $phpFmShortDate, 'arrFinAccount' => $arrFinAccount, 'arrEntryLog' => $arrEntryLog]; switch ($submitMode) { case MasterValueUtils::SM_MODE_INPUT: $isValid = $model->validate(); if ($isValid) { $renderView = 'confirm'; $renderData['formMode'] = [MasterValueUtils::PG_MODE_NAME => MasterValueUtils::PG_MODE_COPY]; } break; case MasterValueUtils::SM_MODE_CONFIRM: $isValid = $model->validate(); if ($isValid) { $result = $this->copyPayment($model); if ($result === true) { Yii::$app->session->setFlash(MasterValueUtils::FLASH_SUCCESS, Yii::t('common', '{record} has been saved successfully.', ['record' => Yii::t('fin.models', 'Payment')])); return Yii::$app->getResponse()->redirect(Url::to(['index'])); } else { Yii::$app->session->setFlash(MasterValueUtils::FLASH_ERROR, $result); $renderView = 'confirm'; $renderData['formMode'] = [MasterValueUtils::PG_MODE_NAME => MasterValueUtils::PG_MODE_COPY]; } } break; case MasterValueUtils::SM_MODE_BACK: break; default: break; } } // render GUI return $this->render($renderView, $renderData); }