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; } } }