public async Task <IEnumerable <GetReservationDto> > FilterReservationsAsync(FilterReservationDto filterReservationDto) { var filteredReservations = await _reservationRepository.FilterAsync(filterReservationDto); var reservations = filteredReservations.ToList(); foreach (var reservation in reservations) { reservation.Client = await _clientRepository.GetAsync(reservation.ClientId); reservation.Room = await _roomRepository.GetAsync(reservation.RoomId); } return(reservations.Select(r => _reservationConverter.ReservationToGetReservationDto(r))); }
public async Task <IEnumerable <Reservation> > FilterAsync(FilterReservationDto filterReservationDto) { var filters = 0; var activeFiltered = false; var paidFiltered = false; var result = new List <Reservation>(); var minId = filterReservationDto.MinId ?? 0; var maxId = filterReservationDto.MaxId ?? 0; if (minId > 0 || maxId > 0) { var filteredMinIds = await _db.Reservations.Where(r => r.Id >= minId).ToListAsync(); var filteredMaxIds = await _db.Reservations.Where(r => r.Id <= maxId).ToListAsync(); if (minId > 0 && maxId == 0) { result.AddRange(filteredMinIds); } else if (maxId > 0 && minId == 0) { result.AddRange(filteredMaxIds); } result.AddRange(filteredMaxIds.Intersect(filteredMinIds)); filters += 1; } var minBalance = filterReservationDto.MinBalance ?? 0; var maxBalance = filterReservationDto.MaxBalance ?? 0; if (minId > 0 || maxId > 0) { var filteredMinBalance = await _db.Reservations.Where(r => r.Balance >= minBalance).ToListAsync(); var filteredMaxBalance = await _db.Reservations.Where(r => r.Balance <= maxBalance).ToListAsync(); if (minBalance > 0 && maxBalance == 0) { result.AddRange(filteredMinBalance); } else if (maxBalance > 0 && minBalance == 0) { result.AddRange(filteredMaxBalance); } result.AddRange(filteredMaxBalance.Intersect(filteredMinBalance)); filters += 1; } var minDate = filterReservationDto.MinDate; var maxDate = filterReservationDto.MaxDate; if (minDate != null || maxDate != null) { var filteredMinDates = await _db.Reservations.Where(r => r.StartDate >= minDate).ToArrayAsync(); var filteredMaxDates = await _db.Reservations.Where(r => r.EndDate <= maxDate).ToArrayAsync(); if (minDate != null && maxDate == null) { result.AddRange(filteredMinDates); } else if (minDate == null) { result.AddRange(filteredMaxDates); } result.AddRange(filteredMaxDates.Intersect(filteredMinDates)); filters += 1; } if (!string.IsNullOrEmpty(filterReservationDto.Room)) { var filteredRooms = _db.Reservations.Where(r => EF.Functions.Like(r.Room.Number, $"%{filterReservationDto.Room}%")); result.AddRange(filteredRooms); filters += 1; } if (filterReservationDto.IsActive) { var activeReservations = await _db.Reservations.Where(r => r.Active).ToListAsync(); result.AddRange(activeReservations); if (!activeFiltered) { activeFiltered = true; } } if (filterReservationDto.IsNotActive) { var notActiveReservations = await _db.Reservations.Where(r => !r.Active).ToListAsync(); result.AddRange(notActiveReservations); if (!activeFiltered) { activeFiltered = true; } } if (filterReservationDto.IsPaid) { var paidReservations = await _db.Reservations.Where(r => r.IsPaid).ToListAsync(); result.AddRange(paidReservations); if (!paidFiltered) { paidFiltered = true; } } if (filterReservationDto.IsNotPaid) { var notPaidReservations = await _db.Reservations.Where(r => !r.IsPaid).ToListAsync(); result.AddRange(notPaidReservations); if (!paidFiltered) { paidFiltered = true; } } if (activeFiltered) { filters += 1; } if (paidFiltered) { filters += 1; } var groupedResults = result.GroupBy(r => r); var finalResult = new List <Reservation>(); foreach (var gr in groupedResults) { if (gr.Count() == filters) { finalResult.Add(gr.Key); } } return(finalResult); }