public List<SavingEvent> Deposit(ISavingsContract saving, DateTime dateTime, OCurrency depositAmount, string description, User user, bool isPending, OSavingsMethods savingsMethod, int? pendingEventId, Teller teller) { using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { if (!IsDepositAmountCorrect(depositAmount, saving, savingsMethod)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.DepositAmountIsInvalid); ISavingsContract savingSimulation = (ISavingsContract) saving.Clone(); // Create a fake Saving object // Do deposit to the fake Saving object savingSimulation.Deposit(depositAmount, dateTime, description, user, false, isPending, savingsMethod, pendingEventId, teller); if (!IsSavingBalanceCorrect(savingSimulation)) // Check balance simulation throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.BalanceIsInvalid); List<SavingEvent> events = saving.Deposit(depositAmount, dateTime, description, user, false, isPending, savingsMethod, pendingEventId, teller); foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, saving, sqlTransaction); } // Change overdraft state if (saving is SavingBookContract) { if (saving.GetBalance() > 0) { ((SavingBookContract) saving).InOverdraft = false; UpdateOverdraftStatus(saving.Id, false); } } sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }