Beispiel #1
0
        // GET: Loans/Edit/5
        public ActionResult Repay(long?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            Loan loan = db.Loans.Find(id);

            if (loan == null)
            {
                return(HttpNotFound());
            }

            LoanRepayViewModel model = new LoanRepayViewModel()
            {
                ClientAccountId   = loan.ClientAccountId,
                ClientAccountName = loan.Client.ClientAccountName,
                CurrentAmount     = loan.CurrentAmount,
                FreeDays          = loan.FreeDays,
                InterestRate      = loan.InterestRate,
                CurrentInterest   = GetRepayInterest(loan.CurrentAmount, loan.InterestRate, loan.StartDate, DateTime.Now.Date, loan.FreeDays),
                LoanId            = loan.LoanId,
                StartAmount       = loan.StartAmount,
                StartDate         = loan.StartDate
            };

            return(View(model));
        }
Beispiel #2
0
        public ActionResult RepayConfirmed([Bind(Include = "LoanId,RepayDate, RepayAmount, Notes")] LoanRepayViewModel loanRepayViewModel)
        {
            DateTime time = DateTime.Now;

            if (ModelState.IsValid)
            {
                var loan = db.Loans.Find(loanRepayViewModel.LoanId);

                if (loan == null)
                {
                    return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
                }

                double totalRepayAmount = GetRepayAmountWithInterest(
                    loanRepayViewModel.RepayAmount,
                    loan.InterestRate,
                    loan.StartDate,
                    loanRepayViewModel.RepayDate,
                    loan.FreeDays);

                var client = db.ClientAccounts.Find(loan.ClientAccountId);

                if (client == null)
                {
                    return(HttpNotFound());
                }

                if (client.Balance < totalRepayAmount)
                {
                    return(View(string.Format("The balance is not enough to pay the loan with interest {0}.", totalRepayAmount)));
                }

                client.Loan           -= loanRepayViewModel.RepayAmount;
                client.Balance        -= totalRepayAmount;
                db.Entry(client).State = EntityState.Modified;

                var loanHistory = new LoanHistory()
                {
                    Amount     = loanRepayViewModel.RepayAmount * -1,
                    DealDate   = loanRepayViewModel.RepayDate,
                    Interest   = totalRepayAmount - loanRepayViewModel.RepayAmount,
                    ChangeType = LoanChangeType.Repay,
                    LoanId     = loan.LoanId,
                    Notes      = loan.Notes,
                    Timestamp  = time
                };

                db.LoanHistories.Add(loanHistory);

                loan.CurrentAmount -= loanRepayViewModel.RepayAmount;
                loan.Timestamp      = time;

                if (loan.CurrentAmount == 0)
                {
                    loan.EndDate = loanRepayViewModel.RepayDate;
                }

                db.Entry(loan).State = EntityState.Modified;

                var clientBalanceHistory = new ClientBalanceHistory()
                {
                    Amount          = totalRepayAmount * -1,
                    BalanceType     = BalanceChangeType.LoanRepay,
                    ClientAccountId = client.ClientAccountId,
                    Description     = string.Format("Repay for Loan: {0}.", loan.LoanId),
                    Timestamp       = time
                };

                db.ClientBalanceHistories.Add(clientBalanceHistory);

                try
                {
                    db.SaveChanges();
                }
                catch (DbEntityValidationException e)
                {
                    string errorMessage = "";

                    foreach (var result in e.EntityValidationErrors)
                    {
                        foreach (var error in result.ValidationErrors)
                        {
                            errorMessage += error.ErrorMessage;
                        }
                    }

                    throw new Exception(errorMessage);
                }
                return(RedirectToAction("Index", new { accountId = client.ClientAccountId }));
            }

            return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
        }