Ejemplo n.º 1
0
        public void CannotPayNotExistingInstallment()
        {
            //arrange
            int userId = 1, creditId = 2, installmentId = 3;

            var installmentDto = new CreditInstallmentDto()
            {
                CreditId = creditId,
                Id       = installmentId
            };

            var mockedCredit = new Credit()
            {
                BankAccountId           = userId,
                Installments            = new Collection <CreditInstallment>(),
                InstallmentsAlreadyPaid = 10,
                TotalInstallments       = 20,
                NextInstallmentDate     = DateTime.Now,
            };

            _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit);

            var service = InstantiateService();

            //act
            var result = service.PayInstallment(userId, installmentDto);

            //assert
            Assert.IsFalse(result.Success);
            Assert.AreEqual("Cannot find the installment", result.Message);
        }
Ejemplo n.º 2
0
        public IHttpActionResult GetPenalty([FromUri] CreditInstallmentDto creditInstallmentDto)
        {
            var userId = User.Identity.GetUserId().Value;
            var result = _creditService.GetInstallmentWithPenalty(creditInstallmentDto, userId);

            if (!result.Success)
            {
                return(BadRequest(result.Message));
            }
            else
            {
                return(Ok(result));
            }
        }
Ejemplo n.º 3
0
        public IHttpActionResult PayInstallment(CreditInstallmentDto creditInstallmentDto)
        {
            var userId = User.Identity.GetUserId().Value;

            var result = _creditService.PayInstallment(userId, creditInstallmentDto);

            if (!result.Success)
            {
                return(BadRequest(result.Message));
            }
            else
            {
                return(Ok(result.Message));
            }
        }
Ejemplo n.º 4
0
        public void CanPayLateInstallment()
        {
            //arrange
            int     userId = 1, creditId = 2, installmentId = 3;
            decimal installmentAmount = 100;

            var installmentDto = new CreditInstallmentDto()
            {
                CreditId = creditId,
                Id       = installmentId
            };

            var mockedCredit = new Credit()
            {
                BankAccountId = userId,
                Installments  = new Collection <CreditInstallment>()
                {
                    new CreditInstallment()
                    {
                        Id = installmentId,
                        InstallmentAmount = installmentAmount,
                        PaymentDeadline   = (DateTime.Now - TimeSpan.FromDays(2)).Date
                    }
                },
                InstallmentsAlreadyPaid = 10,
                TotalInstallments       = 20,
                NextInstallmentDate     = DateTime.Now,
            };

            _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit);
            _bankAccountService.Setup(b => b.TakeCash(It.Is <decimal>(a => a.Equals(installmentAmount * 1.1m)), It.Is <int>(x => x.Equals(userId)))).Returns(true);

            var service = InstantiateService();

            //act
            var result = service.PayInstallment(userId, installmentDto);

            //assert
            Assert.IsTrue(result.Success);
            Assert.AreEqual("You have successfully paid an installment", result.Message);
            _creditInstallmentRepository.Verify(c => c.Update(It.IsAny <CreditInstallment>()), Times.Once());
            _creditInstallmentRepository.Verify(c => c.Create(It.IsAny <CreditInstallment>()), Times.Once());
            _creditRepository.Verify(c => c.Update(It.IsAny <Credit>()), Times.Once());
        }
Ejemplo n.º 5
0
        public void CannotPayInstallmentWithoutMoney()
        {
            //arrange
            int     userId = 1, creditId = 2, installmentId = 3;
            decimal installmentAmount = 100;

            var installmentDto = new CreditInstallmentDto()
            {
                CreditId = creditId,
                Id       = installmentId
            };

            var mockedCredit = new Credit()
            {
                BankAccountId = userId,
                Installments  = new Collection <CreditInstallment>()
                {
                    new CreditInstallment()
                    {
                        Id = installmentId,
                        InstallmentAmount = installmentAmount,
                        PaymentDeadline   = DateTime.Now
                    }
                },
                InstallmentsAlreadyPaid = 10,
                TotalInstallments       = 20,
                NextInstallmentDate     = DateTime.Now,
            };

            _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit);
            _bankAccountService.Setup(b => b.TakeCash(It.Is <decimal>(a => a.Equals(installmentAmount)), It.Is <int>(x => x.Equals(userId)))).Returns(false);

            var service = InstantiateService();

            //act
            var result = service.PayInstallment(userId, installmentDto);

            //assert
            Assert.IsFalse(result.Success);
            Assert.AreEqual("Cannot finish transaction", result.Message);
        }
Ejemplo n.º 6
0
        public void CannotPayInstallmentForAnotherUsersCredit()
        {
            //arrange
            int     userId = 1, creditId = 2, installmentId = 3, askingUserId = 4;
            decimal installmentAmount = 100;

            var installmentDto = new CreditInstallmentDto()
            {
                CreditId = creditId,
                Id       = installmentId
            };

            var mockedCredit = new Credit()
            {
                BankAccountId = userId,
                Installments  = new Collection <CreditInstallment>()
                {
                    new CreditInstallment()
                    {
                        Id = installmentId,
                        InstallmentAmount = installmentAmount,
                        PaymentDeadline   = DateTime.Now
                    }
                },
                InstallmentsAlreadyPaid = 10,
                TotalInstallments       = 20,
                NextInstallmentDate     = DateTime.Now,
            };

            _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit);

            var service = InstantiateService();

            //act
            var result = service.PayInstallment(askingUserId, installmentDto);

            //assert
            Assert.IsFalse(result.Success);
            Assert.AreEqual("The credit does not exist or you don't have access to it", result.Message);
        }
Ejemplo n.º 7
0
        public void CanGetInstallmentWithPenalty()
        {
            //arrange
            int userId = 1, creditId = 2, installmentId = 3;
            var installmentDto = new CreditInstallmentDto()
            {
                CreditId = creditId,
                Id       = installmentId
            };

            var mockedCredit = new Credit()
            {
                BankAccountId = userId,
                Installments  = new Collection <CreditInstallment>()
                {
                    new CreditInstallment()
                    {
                        Id = installmentId,
                        PaymentDeadline   = (DateTime.Now - TimeSpan.FromDays(2)).Date,
                        InstallmentAmount = 100
                    }
                }
            };

            _creditRepository.Setup(c => c.GetSingle(It.Is <int>(x => x.Equals(creditId)), a => a.Installments)).Returns(mockedCredit);
            var service = InstantiateService();

            //act
            var result = service.GetInstallmentWithPenalty(installmentDto, userId);

            //assert
            Assert.AreEqual("Successfully calculated penalty", result.Message);
            Assert.IsTrue(result.Success);
            Assert.IsInstanceOf <InstallmentPenaltyDto>(result.Data);
            Assert.AreEqual(10, result.Data.PenaltyPercentage);
        }
Ejemplo n.º 8
0
        public ResultDto <InstallmentPenaltyDto> GetInstallmentWithPenalty(CreditInstallmentDto creditInstallmentDto, int userId)
        {
            var credit = _creditRepository.GetSingle(creditInstallmentDto.CreditId, c => c.Installments);

            if (credit == null || credit.BankAccountId != userId)
            {
                return new ResultDto <InstallmentPenaltyDto>()
                       {
                           Success = false, Message = "The credit does not exist or you don't have permission to access it"
                       }
            }
            ;

            var installment = credit.Installments.SingleOrDefault(i => i.Id == creditInstallmentDto.Id);

            if (installment == null)
            {
                return new ResultDto <InstallmentPenaltyDto>()
                       {
                           Success = false, Message = "Specified installment does not exist"
                       }
            }
            ;

            var penalty            = CalculatePenalty(installment.PaymentDeadline);
            var installmentPenalty = new InstallmentPenaltyDto()
            {
                Amount            = installment.InstallmentAmount + (installment.InstallmentAmount * penalty / 100m),
                PenaltyPercentage = penalty
            };

            return(new ResultDto <InstallmentPenaltyDto>()
            {
                Success = true, Message = "Successfully calculated penalty", Data = installmentPenalty
            });
        }
Ejemplo n.º 9
0
        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"
            });
        }