コード例 #1
0
ファイル: SavingServices.cs プロジェクト: TalasZh/opencbs
        public SavingDebitOperationEvent SpecialOperationDebit(ISavingsContract pSaving, DateTime pDate, OCurrency debitAmount,
                string pDescription, User pUser, OSavingsMethods savingsMethod)
        {
            using (SqlConnection conn = _savingManager.GetConnection())
              using (SqlTransaction sqlTransaction = conn.BeginTransaction())
              {
                  try
                  {
                      if (pSaving is SavingBookContract)
                      {
                          decimal vBalance = CheckVirtualBalance((SavingBookContract) pSaving, debitAmount);

                          if (vBalance > 0)
                          {
                              List<string> messages = new List<string>
                                                          {
                                                              ServicesHelper.ConvertDecimalToString(
                                                                  ((SavingBookContract) pSaving).GetBalance().Value),
                                                              ServicesHelper.ConvertDecimalToString(vBalance),
                                                              ((SavingBookContract) pSaving).Loans.Count.ToString(),
                                                              ServicesHelper.ConvertDecimalToString(
                                                                  ((SavingBookContract) pSaving).GetBalance().Value -
                                                                  vBalance)
                                                          };
                              throw new OpenCbsSavingException(
                                  OpenCbsSavingExceptionEnum.BalanceOnCurrentSavingAccountForTransfer, messages);
                          }
                      }

                      //// Create a fake Saving object
                      ISavingsContract savingSimulation = (ISavingsContract) pSaving.Clone();
                      // Do deposit to the fake Saving object
                      savingSimulation.SpecialOperationDebit(debitAmount, pDate, pDescription, pUser);
                      // Check balance simulation
                      if (!IsSavingBalanceCorrect(savingSimulation))
                          throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.BalanceIsInvalid);

                      SavingDebitOperationEvent events = pSaving.SpecialOperationDebit(debitAmount, pDate, pDescription,
                                                                                        pUser);

                      _ePS.FireEvent(events, pSaving, sqlTransaction);

                      // Change overdraft state
                      if (pSaving is SavingBookContract)
                      {
                          if (pSaving.GetBalance() > 0)
                          {
                              ((SavingBookContract) pSaving).InOverdraft = false;
                              UpdateOverdraftStatus(pSaving.Id, false);
                          }
                      }
                      sqlTransaction.Commit();
                      return events;
                  }
                  catch (Exception)
                  {
                      sqlTransaction.Rollback();
                      throw;
                  }
              }
        }