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