public List<SavingEvent> CloseAndWithdraw(ISavingsContract saving, DateTime date, User user, OCurrency withdrawAmount, bool isDesactivateFees, Teller teller) { OCurrency balance = SimulateCloseAccount(saving, date, user, isDesactivateFees, teller).GetBalance(date); if (balance != withdrawAmount) { throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.WithdrawAmountIsInvalid); } List<SavingEvent> events = saving.Withdraw(withdrawAmount, date, "Withdraw savings", user, true, Teller.CurrentTeller); events.AddRange(saving.Close(date, user, "Close savings contract", isDesactivateFees, teller, false)); using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { foreach (SavingEvent savingEvent in events) _ePS.FireEvent(savingEvent, saving, sqlTransaction); if (saving.ClosedDate != null) _savingManager.UpdateStatus(saving.Id, saving.Status, saving.ClosedDate.Value); sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }
public List<SavingEvent> Withdraw(ISavingsContract pSaving, DateTime pDate, OCurrency pWithdrawAmount, string pDescription, User pUser, Teller teller, SqlTransaction sqlTransaction, PaymentMethod paymentMethod) { ValidateWithdrawal(pWithdrawAmount, pSaving, pDate, pDescription, pUser, teller, paymentMethod); List<SavingEvent> events = pSaving.Withdraw(pWithdrawAmount, pDate, pDescription, pUser, false, teller, paymentMethod); foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, pSaving, sqlTransaction); } // Charge overdraft fees if the balance is negative if (pSaving is SavingBookContract) { if (pSaving.GetBalance() < 0 && !((SavingBookContract)pSaving).InOverdraft) { SavingEvent overdraftFeeEvent = pSaving.ChargeOverdraftFee(pDate, pUser); _ePS.FireEvent(overdraftFeeEvent, pSaving, sqlTransaction); ((SavingBookContract)pSaving).InOverdraft = true; UpdateOverdraftStatus(pSaving.Id, true); } } return events; }
/// <summary> /// Checks DepositAmount and balance simulation /// </summary> /// <param name="pSaving"></param> /// <param name="pDate"></param> /// <param name="pWithdrawAmount"></param> /// <param name="pDescription"></param> /// <param name="pUser"></param> /// <returns></returns> public List<SavingEvent> Withdraw(ISavingsContract pSaving, DateTime pDate, OCurrency pWithdrawAmount, string pDescription, User pUser, Teller teller) { ValidateWithdrawal(pWithdrawAmount, pSaving, pDate, pDescription, pUser, teller); List<SavingEvent> events = pSaving.Withdraw(pWithdrawAmount, pDate, pDescription, pUser, false, teller); using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, pSaving, sqlTransaction); } // Charge overdraft fees if the balance is negative if (pSaving is SavingBookContract) { if (pSaving.GetBalance() < 0 && !((SavingBookContract) pSaving).InOverdraft) { SavingEvent overdraftFeeEvent = pSaving.ChargeOverdraftFee(pDate, pUser); _ePS.FireEvent(overdraftFeeEvent, pSaving, sqlTransaction); ((SavingBookContract) pSaving).InOverdraft = true; UpdateOverdraftStatus(pSaving.Id, true); } } sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }
/// <summary> /// Checks DepositAmount and balance simulation /// </summary> /// <param name="pSaving"></param> /// <param name="pDate"></param> /// <param name="pWithdrawAmount"></param> /// <param name="pDescription"></param> /// <param name="pUser"></param> /// <returns></returns> public List<SavingEvent> Withdraw(ISavingsContract pSaving, DateTime pDate, OCurrency pWithdrawAmount, string pDescription, User pUser, Teller teller, PaymentMethod paymentMethod) { ValidateWithdrawal(pWithdrawAmount, pSaving, pDate, pDescription, pUser, teller, paymentMethod); if (pSaving.Client == null) pSaving.Client = ServicesProvider.GetInstance().GetClientServices().FindTiersBySavingsId(pSaving.Id); List<SavingEvent> events = pSaving.Withdraw(pWithdrawAmount, pDate, pDescription, pUser, false, teller, paymentMethod); using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, pSaving, sqlTransaction); ServicesProvider.GetInstance() .GetContractServices() .CallInterceptor(new Dictionary<string, object> { {"Saving", pSaving}, {"Event", new SavingWithdrawEvent { Id = savingEvent.Id, Code = savingEvent.Code, Amount = savingEvent.Amount, Description = savingEvent.Description, PaymentsMethod = paymentMethod }}, {"SqlTransaction", sqlTransaction} }); } // Charge overdraft fees if the balance is negative if (pSaving is SavingBookContract) { if (pSaving.GetBalance() < 0 && !((SavingBookContract)pSaving).InOverdraft) { SavingEvent overdraftFeeEvent = pSaving.ChargeOverdraftFee(pDate, pUser); _ePS.FireEvent(overdraftFeeEvent, pSaving, sqlTransaction); ((SavingBookContract)pSaving).InOverdraft = true; UpdateOverdraftStatus(pSaving.Id, true); } } sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }