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; } } }
public List<SavingEvent> RepayLoanFromSaving(Loan loan, RepaymentEvent repaymentEvent, ISavingsContract savingsContract, DateTime date, OCurrency amount, string description, SqlTransaction sqlTransaction) { if (savingsContract.GetBalance() - amount < 0) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.WithdrawAmountIsInvalid); User user = User.CurrentUser; Teller teller = Teller.CurrentTeller; if (date.Hour == 0 && date.Minute == 0 && date.Second == 0) { date = new DateTime(date.Year, date.Month, date.Day, TimeProvider.Now.Hour, TimeProvider.Now.Minute, TimeProvider.Now.Second); } ISavingsContract savingSimulation = (ISavingsContract) savingsContract.Clone(); savingSimulation.RepayLoanFromSaving(loan, repaymentEvent.Id, date, amount, description, user, teller); List<SavingEvent> events = savingsContract.RepayLoanFromSaving(loan, repaymentEvent.Id, date, amount, description, user, teller); foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, savingsContract, sqlTransaction); } return events; }
public ISavingsContract SimulateCloseAccount(ISavingsContract saving, DateTime date, User user, bool isDesactivateFees, Teller teller) { ISavingsContract savingSimulation = (ISavingsContract) saving.Clone(); savingSimulation.SimulateClose(date, user, "Close savings contract", isDesactivateFees, teller); return savingSimulation; }
public List<SavingEvent> LoanDisbursement(ISavingsContract savings, Loan loan, DateTime date, string description, User user, bool disableFees) { using(SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { bool isPending = false; OSavingsMethods savingsMethod = OSavingsMethods.Cash; int? pendingEventId = null; Teller teller = Teller.CurrentTeller; if (date.Hour == 0 && date.Minute == 0 && date.Second == 0) date = new DateTime(date.Year, date.Month, date.Day, TimeProvider.Now.Hour, TimeProvider.Now.Minute, TimeProvider.Now.Second); ISavingsContract savingSimulation = (ISavingsContract) savings.Clone(); savingSimulation.LoanDisbursement(loan, date, description, user, disableFees, isPending, savingsMethod, pendingEventId, teller); List<SavingEvent> events = savings.LoanDisbursement(loan, date, description, user, false, isPending, savingsMethod, pendingEventId, teller); foreach (SavingEvent savingEvent in events) { _ePS.FireEvent(savingEvent, savings, sqlTransaction); } // Change overdraft state if (savings is SavingBookContract) { if (savings.GetBalance() > 0) { ((SavingBookContract) savings).InOverdraft = false; UpdateOverdraftStatus(savings.Id, false); } } sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }
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; } } }
private void ValidateWithdrawal(OCurrency pWithdrawAmount, ISavingsContract pSaving, DateTime pDate, string pDescription, User pUser, Teller teller) { if (!IsWithdrawAmountCorrect(pWithdrawAmount, pSaving)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.WithdrawAmountIsInvalid); if (pSaving is SavingBookContract) { OCurrency fee; if(((SavingBookContract) pSaving).RateWithdrawFees.HasValue) { fee = ((SavingBookContract) pSaving).RateWithdrawFees.Value*pWithdrawAmount; } else { fee = ((SavingBookContract) pSaving).FlatWithdrawFees; } OCurrency totalAmount = pWithdrawAmount + fee; if (((SavingBookContract)pSaving).GetBalance() - totalAmount < 0) CanUserMakeBalanceNegative();//Check if current user is allowed to make balance negative decimal vBalance = CheckVirtualBalance((SavingBookContract) pSaving, totalAmount); 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.BalanceOnCurrentSavingAccount, messages); } } // Create a fake Saving object ISavingsContract savingSimulation = (ISavingsContract)pSaving.Clone(); // Do withdraw in the fake Saving object savingSimulation.Withdraw(pWithdrawAmount, pDate, pDescription, pUser, false, teller); // Check balance simulation if (!IsSavingBalanceCorrect(savingSimulation)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.BalanceIsInvalid); }
private SavingCreditOperationEvent SpecialOperationCredit(ISavingsContract pSaving, DateTime pDate, OCurrency creditAmount, string pDescription, User pUser, OSavingsMethods savingsMethod) { using (SqlConnection conn = _savingManager.GetConnection()) using (SqlTransaction sqlTransaction = conn.BeginTransaction()) { try { //// Create a fake Saving object ISavingsContract savingSimulation = (ISavingsContract) pSaving.Clone(); // Do deposit to the fake Saving object savingSimulation.SpecialOperationCredit(creditAmount, pDate, pDescription, pUser); // Check balance simulation if (!IsSavingBalanceCorrect(savingSimulation)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.BalanceIsInvalid); SavingCreditOperationEvent events = pSaving.SpecialOperationCredit(creditAmount, pDate, pDescription, pUser); _ePS.FireEvent(events, pSaving, sqlTransaction); sqlTransaction.Commit(); return events; } catch (Exception) { sqlTransaction.Rollback(); throw; } } }
private void CheckTransfer(ISavingsContract to, ISavingsContract from, OCurrency amount, OCurrency fee, DateTime date, string description) { if (to == null) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.TransferAccountIsInvalid); if (to.Status == OSavingsStatus.Closed) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.CreditTransferAccountInvalid); if (from is SavingBookContract) { decimal vBalance = CheckVirtualBalance((SavingBookContract)from, amount + fee); if (vBalance > 0) { List<string> messages = new List<string> { ServicesHelper.ConvertDecimalToString(((SavingBookContract) from).GetBalance().Value), ServicesHelper.ConvertDecimalToString(vBalance), ((SavingBookContract) from).Loans.Count.ToString(), ServicesHelper.ConvertDecimalToString(((SavingBookContract) from).GetBalance().Value - vBalance) }; throw new OpenCbsSavingException( OpenCbsSavingExceptionEnum.BalanceOnCurrentSavingAccountForTransfer, messages); } } if (from.Id == to.Id) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.SavingsContractForTransferIdenticals); if (from.Product.Currency.Id != to.Product.Currency.Id) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.SavingsContractForTransferNotSameCurrncy); if (!IsTransferAmountCorrect(amount, from)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.TransferAmountIsInvalid); ISavingsContract fromCopy = (ISavingsContract)from.Clone(); ISavingsContract toCopy = (ISavingsContract)to.Clone(); fromCopy.Transfer(toCopy, amount, fee, date, description); if (!IsSavingBalanceCorrect(fromCopy)) throw new OpenCbsSavingException(OpenCbsSavingExceptionEnum.BalanceIsInvalid); }