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