public async Task <IActionResult> FilterRents(FilterRentBindingModel bindModel) { if (!ModelState.IsValid) { TempData.AddErrorMessage(WrongInput); return(RedirectToAction("IndexRents")); } var model = await this.payments.FilterRentsAsync(bindModel); TempData.AddSuccessMessage(model.FilterDetails); return(View(model)); }
public async Task <FilterRentsViewModel> FilterRentsAsync(FilterRentBindingModel bindModel) { string filteredDetails = "Аргументите на филтъра са: "; var payments = new List <Payment>(); if (bindModel.FilterByDeadline) { payments = await this.Db.Payments .Where(x => x.MonthlyPaymentRentId != null && x.MonthlyPaymentRent.DeadLine >= bindModel.StartDate && x.MonthlyPaymentRent.DeadLine <= bindModel.EndDate) .OrderBy(x => x.MonthlyPaymentRent.DeadLine) .ToListAsync(); filteredDetails += "по крайна дата, "; } else { payments = await this.Db.Payments .Where(x => x.MonthlyPaymentRentId != null && x.PaidOn >= bindModel.StartDate && x.PaidOn <= bindModel.EndDate) .OrderBy(x => x.PaidOn) .ToListAsync(); filteredDetails += "по дата на плащане, "; } if (payments == null) { return(null); } //Filter only chash if (bindModel.OnlyCash) { payments = payments .Where(x => x.CashPayment == true) .ToList(); filteredDetails += "пари платени само в борй, "; } else { filteredDetails += "всякакви плащания, "; } // Filter by client if needed if (bindModel.Client != 0) { payments = payments .Where(x => x.MonthlyPaymentRent.RentAgreement.ClientId == bindModel.Client) .ToList(); var client = await this.Db.Clients.FirstOrDefaultAsync(x => x.Id == bindModel.Client); if (client != null) { filteredDetails += $"само за клиент {client.Name}, "; } else { filteredDetails += "търсеният клиента няма такива плащания, "; } } else { filteredDetails += "всички клиенти, "; } // Filter by property if needed if (bindModel.Property != 0) { payments = payments .Where(x => x.MonthlyPaymentRent.RentAgreement.PropertyRents.Any(p => p.PropertyId == bindModel.Property)) .ToList(); var filterProperty = await this.Db.Properties.FirstOrDefaultAsync(x => x.Id == bindModel.Property); if (filterProperty != null) { filteredDetails += $"само за имот {filterProperty.Name}, "; } else { filteredDetails += "търсеният имот няма такива плащания, "; } } else { filteredDetails += "всички имоти, "; } // Filter by parking area if needed if (bindModel.ParkingArea != 0) { payments = payments .Where(x => x.MonthlyPaymentRent.RentAgreement.ParkingSlots.All(y => (int)y.Area == bindModel.ParkingArea)) .ToList(); if (bindModel.ParkingArea == 1) { filteredDetails += "на преден паркинг!"; } else if (bindModel.ParkingArea == 2) { filteredDetails += "на заден паркинг!"; } else { filteredDetails += "без запазена зона!"; } } else { filteredDetails += "всички зони за паркиране!"; } var paymentsListingModel = Mapper.Map <IEnumerable <PaymentRentListingModel> >(payments); var model = new FilterRentsViewModel() { StartDate = bindModel.StartDate, EndDate = bindModel.EndDate, Payments = paymentsListingModel, FilterDetails = filteredDetails }; return(model); }
public async Task FilterRentsAsync_ShouldReturn_CorrectQueryResult_DependingOnInput() { var db = GetDatabase(); var mapper = GetMapper(); var firstMonthConsumable = new MonthlyPaymentRent { Id = 1, RentAgreement = new RentAgreement { Id = 1, ClientId = 1 } }; var secondMonthConsumable = new MonthlyPaymentRent { Id = 2, RentAgreement = new RentAgreement { Id = 1, ClientId = 1 } }; var thirdMonthConsumable = new MonthlyPaymentRent { Id = 3, RentAgreement = new RentAgreement { Id = 2, ClientId = 2 } }; var forthMonthConsumable = new MonthlyPaymentRent { Id = 4, RentAgreement = new RentAgreement { Id = 1, ClientId = 1 } }; await db.MonthlyPaymentRents.AddRangeAsync(firstMonthConsumable, secondMonthConsumable, thirdMonthConsumable, forthMonthConsumable); var firstPayment = new Payment { Id = 1, PaidOn = new DateTime(2018, 12, 12), Amount = 10, CashPayment = false, MonthlyPaymentRentId = 1, }; var secndPayment = new Payment { Id = 2, PaidOn = new DateTime(2017, 11, 6), Amount = 20, CashPayment = true, MonthlyPaymentRentId = 2, }; var thirdPayment = new Payment { Id = 3, PaidOn = new DateTime(2015, 11, 12), Amount = 30, CashPayment = false, MonthlyPaymentRentId = 3 }; var forthPayment = new Payment { Id = 4, PaidOn = new DateTime(2015, 12, 15), Amount = 40, CashPayment = false, MonthlyPaymentRentId = 4 }; var fifthPayment = new Payment { Id = 5, PaidOn = new DateTime(2017, 12, 15), Amount = 50, MonthlyPaymentRentId = null, CashPayment = false }; await db.Payments.AddRangeAsync(firstPayment, secndPayment, thirdPayment, forthPayment, fifthPayment); await db.SaveChangesAsync(); var filterModel = new FilterRentBindingModel { Client = 1, OnlyCash = true, StartDate = new DateTime(2017, 1, 1), EndDate = new DateTime(2018, 12, 30) }; var paymentService = new PaymentsService(mapper, db, null); //Act var result = await paymentService.FilterRentsAsync(filterModel); //Assert result .Should() .BeOfType <FilterRentsViewModel>() .And .Match <FilterRentsViewModel>(x => x.TotalIncome == 20 && x.Payments.Any(y => y.PaidOn == new DateTime(2017, 11, 6))); }