Esempio n. 1
0
        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;
                  }
              }
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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;
                }
            }
        }
Esempio n. 5
0
        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;
                }
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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;
                  }
              }
        }
Esempio n. 8
0
        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);
        }