Пример #1
0
        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);
        }