public void ConfirmCredit(int userId) { var credit = _creditRepository.GetAll().SingleOrDefault(c => c.BankAccountId == userId && c.Confirmed == false && c.PaidInFull == false); if (credit == null) { return; } credit.Confirmed = true; credit.ConfirmationDate = DateTime.Now; credit.NextInstallmentDate = (DateTime.Now + TimeSpan.FromDays(1)).Date; var firstInstallment = new CreditInstallment() { CreditId = credit.Id, InstallmentAmount = credit.InstallmentAmount, PaymentDeadline = credit.NextInstallmentDate.Value }; _creditInstallmentsRepository.Create(firstInstallment); _creditRepository.Update(credit); _bankAccountService.GiveCash(credit.CreditAmount, userId); }
public ResultDto PayInstallment(int userId, CreditInstallmentDto installmentDto) { var credit = _creditRepository.GetSingle(installmentDto.CreditId, c => c.Installments); if (credit == null || credit.BankAccountId != userId) { return new ResultDto() { Success = false, Message = "The credit does not exist or you don't have access to it" } } ; var installment = credit.Installments.SingleOrDefault(ci => ci.Id == installmentDto.Id); if (installment == null) { return new ResultDto() { Success = false, Message = "Cannot find the installment" } } ; var penaltyPercentage = CalculatePenalty(installment.PaymentDeadline); installment.InstallmentAmount += installment.InstallmentAmount * (penaltyPercentage / 100m); var result = _bankAccountService.TakeCash(installment.InstallmentAmount, userId); if (!result) { return new ResultDto() { Success = false, Message = "Cannot finish transaction" } } ; credit.InstallmentsAlreadyPaid++; installment.PaidOn = DateTime.Now; _creditInstallmentsRepository.Update(installment); if (credit.InstallmentsAlreadyPaid == credit.TotalInstallments) { credit.PaidInFull = true; } else { credit.NextInstallmentDate += TimeSpan.FromDays(1); var nextInstallment = new CreditInstallment() { CreditId = credit.Id, InstallmentAmount = credit.InstallmentAmount, PaymentDeadline = credit.NextInstallmentDate.Value }; _creditInstallmentsRepository.Create(nextInstallment); } _creditRepository.Update(credit); return(new ResultDto() { Success = true, Message = "You have successfully paid an installment" }); }