public async Task <IActionResult> Pay(BindingMonthlyRentModel model)
        {
            var madeByUser = await this.userManager.GetUserAsync(this.User);

            if (!ModelState.IsValid)
            {
                TempData.AddErrorMessage(WrongInput);
                return(RedirectToAction("Index", "MonthlyRent"));
            }

            var successfulPayment = await this.payments.MakePaymentAsync(model, madeByUser.Id);

            if (!successfulPayment.Value)
            {
                TempData.AddErrorMessage("Плащането на наем не беше успешно!");
                return(RedirectToAction("Index", "MonthlyRent"));
            }
            if (successfulPayment == null)
            {
                TempData.AddErrorMessage("Плащането на наема БЕШЕ успешно, но прехвърляното за следващ месец се провали!");
                return(RedirectToAction("Index", "MonthlyRent"));
            }

            TempData.AddSuccessMessage("Плащането на наем беше успешно!");
            return(RedirectToAction("Index", "MonthlyRent"));
        }
Пример #2
0
        public async Task MakePaymentAsync_ShouldReturn_Null_WhenInputIsCorrectButNextMonthPaymentFails()
        {
            var db     = GetDatabase();
            var mapper = GetMapper();

            var firstMonthRent = new MonthlyPaymentRent
            {
                Id           = 1,
                TotalPayment = 2000
            };
            await db.MonthlyPaymentRents.AddRangeAsync(firstMonthRent);

            var firstPayment = new Payment {
                Id = 20, Amount = 500, MonthlyPaymentRentId = 1
            };
            var secndPayment = new Payment {
                Id = 21, Amount = 500, MonthlyPaymentRentId = 1
            };
            await db.Payments.AddRangeAsync(firstPayment, secndPayment);

            var user = new User
            {
                Id = "007"
            };
            await db.Users.AddAsync(user);

            await db.SaveChangesAsync();


            var monthlyRentMock = new Mock <IMonthlyRentsService>();

            monthlyRentMock
            .Setup(mr => mr.CreateNextMonthPayment(It.IsAny <int>()))
            .ReturnsAsync(false);

            var paymentService = new PaymentsService(mapper, db, monthlyRentMock.Object);

            //Act
            var paymentModel = new BindingMonthlyRentModel
            {
                CashPayment   = true,
                MonthlyRentId = 1,
                Payment       = 1000,
                PaidOn        = new DateTime(2018, 12, 12)
            };
            var result = await paymentService.MakePaymentAsync(paymentModel, "007");

            var payment = await db.Payments
                          .FirstOrDefaultAsync(x => x.MonthlyPaymentRentId == 1 && x.Amount == 1000);

            //Assert
            result
            .Should()
            .BeNull();
            payment
            .Should()
            .Match <Payment>(x => x.CashPayment == true &&
                             x.UserId == "007" &&
                             x.Amount == 1000);
        }
Пример #3
0
        public async Task <bool?> MakePaymentAsync(BindingMonthlyRentModel model, string userId)
        {
            var monthlyRent = await this.Db.FindAsync <MonthlyPaymentRent>(model.MonthlyRentId);

            var user = await this.Db.FindAsync <User>(userId);

            if (monthlyRent == null || user == null)
            {
                return(false);
            }
            var sumLeftToBePaid = monthlyRent.TotalPayment - monthlyRent.Payments.Sum(x => x.Amount);

            if (model.Payment == sumLeftToBePaid)
            {
                monthlyRent.IsPaid = true;
            }
            monthlyRent.Payments.Add(new Payment()
            {
                Amount      = model.Payment,
                CashPayment = model.CashPayment,
                PaidOn      = model.PaidOn,
                UserId      = userId,
                CreatedOn   = DateTime.UtcNow
            });
            try
            {
                await this.Db.SaveChangesAsync();
            }
            catch (Exception)
            {
                return(false);
            }

            //Create payment for next month
            if (monthlyRent.IsPaid)
            {
                bool nextMonthCreated = await this.monthlyRentService
                                        .CreateNextMonthPayment(monthlyRent.Id);

                if (!nextMonthCreated)
                {
                    return(null);
                }
            }

            return(true);
        }