public List<SavingEvent> Closure(ISavingsContract saving, DateTime dateTime, User user) { // Check if closure has been already run today List<SavingEvent> events = _savingEventManager.SelectEvents(saving.Id, saving.Product); SavingEvent closureEvent = events.Where(item => item is SavingClosureEvent).OrderByDescending(item => item.Date).FirstOrDefault(); if (closureEvent != null && closureEvent.Date == dateTime) return null; bool inOverdraft = ((SavingBookContract) saving).InOverdraft; ((SavingBookContract) saving).AccountAtMaturityEvent += SavingServicesAccountAtMaturity; List<SavingEvent> savingEvents = saving.Closure(dateTime, user); using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { foreach (SavingEvent savingEvent in savingEvents) { if (((SavingBookContract) saving).InOverdraft != inOverdraft) { ((SavingBookContract) saving).InOverdraft = inOverdraft; UpdateOverdraftStatus(saving.Id, inOverdraft); } _ePS.FireEvent(savingEvent, saving, sqlTransaction); } _savingManager.UpdateNextMaturityForSavingBook(saving.Id, ((SavingBookContract) saving).NextMaturity); sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }