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