public async Task <List <GetServiceWithAddressResponse> > GetAllServices(Account account, GetServiceRequestsFilter filter)
        {
            // prepare filter predicate
            var predicate = PredicateBuilder.New <ServiceRequest>(true);

            if (!string.IsNullOrEmpty(filter?.SearchString))
            {
                predicate = predicate.Or(p => p.Title.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Customer.CompanyName.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.Street.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.City.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.ZipCode.ToLower().Contains(filter.SearchString.ToLower()));
            }

            if (account.Role == Role.Customer)
            {
                // customer can get only his own service requests
                var customer = await _unitOfWork.Customers.GetByAccountId(account.Id);

                predicate = predicate.And(p => p.CustomerId == customer.Id);
            }

            if (!string.IsNullOrEmpty(filter?.DateRange))
            {
                switch (filter.DateRange)
                {
                case "30-days":
                    predicate = predicate.And(p => p.Created >= DateTime.UtcNow.AddDays(-30));
                    break;

                case "7-days":
                    predicate = predicate.And(p => p.Created >= DateTime.UtcNow.AddDays(-7));
                    break;

                case "today":
                    predicate = predicate.And(p => p.Created.Date == DateTime.UtcNow.Date);
                    break;
                }
            }

            if (filter.Status is not null)
            {
                predicate = predicate.And(p => p.Status.Equals(filter.Status));
            }

            var serviceRequests = await _unitOfWork.ServiceRequests.FindWithAddress(predicate);

            return(serviceRequests.Select(sr => new GetServiceWithAddressResponse()
            {
                Id = sr.Id,
                Title = sr.Title,
                Description = sr.Description,
                PlannedExecutionDate = sr.PlannedExecutionDate,
                CompletionDate = sr.CompletionDate,
                Created = sr.Created,
                CustomerId = sr.CustomerId,
                AddressId = sr.AddressId,
                Status = sr.Status.ToString(),
                CustomerAddress = _mapper.Map <GetCustomerAddressResponse>(sr.CustomerAddress)
            })
                   .ToList());
        }
        public async Task <List <GetServiceDetailsResponse> > GetAllServicesWithCustomerDetails(
            Account account,
            GetServiceRequestsFilter filter)
        {
            // prepare filter predicate
            var predicate = PredicateBuilder.New <ServiceRequest>(true);

            if (!string.IsNullOrEmpty(filter?.SearchString))
            {
                predicate = predicate.Or(p => p.Title.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Customer.CompanyName.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.Street.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.City.ToLower().Contains(filter.SearchString.ToLower()));
                predicate = predicate.Or(p => p.Address.ZipCode.ToLower().Contains(filter.SearchString.ToLower()));
            }

            if (account.Role == Role.Employee)
            {
                // employee can get only service requests he is assigned to
                var employee = await _unitOfWork.Employees.GetByAccountId(account.Id);

                predicate = predicate.And(p => p.ServiceRequestEmployees.Any(sre => sre.EmployeeId == employee.Id));
            }

            if (!string.IsNullOrEmpty(filter?.DateRange))
            {
                switch (filter.DateRange)
                {
                case "30-days":
                    predicate = predicate.And(p => p.Created >= DateTime.UtcNow.AddDays(-30));
                    break;

                case "7-days":
                    predicate = predicate.And(p => p.Created >= DateTime.UtcNow.AddDays(-7));
                    break;

                case "today":
                    predicate = predicate.And(p => p.Created.Date == DateTime.UtcNow.Date);
                    break;
                }
            }

            if (filter.Status is not null)
            {
                predicate = predicate.And(p => p.Status.Equals(filter.Status));
            }

            var Id = new Guid();

            if (!string.IsNullOrEmpty(filter?.EmployeeId) && Guid.TryParse(filter?.EmployeeId, out Id))
            {
                predicate = predicate.And(sr => sr.ServiceRequestEmployees.Any(sre => sre.EmployeeId == Id));
            }
            ;

            if (!string.IsNullOrEmpty(filter?.CustomerId) && Guid.TryParse(filter?.CustomerId, out Id))
            {
                predicate = predicate.And(sr => sr.CustomerId == Id);
            }
            ;

            var serviceRequests = await _unitOfWork.ServiceRequests
                                  .FindWithCustomerAndAddressAndEmployees(predicate);

            return(serviceRequests.Select(sr => new GetServiceDetailsResponse()
            {
                Id = sr.Id,
                Title = sr.Title,
                Description = sr.Description,
                PlannedExecutionDate = sr.PlannedExecutionDate,
                CompletionDate = sr.CompletionDate,
                Created = sr.Created,
                CustomerId = sr.CustomerId,
                AddressId = sr.AddressId,
                Status = sr.Status.ToString(),
                Customer = new GetCustomerWithImageResponse()
                {
                    Id = sr.CustomerAddress.Customer.Id,
                    AccountId = sr.CustomerAddress.Customer.AccountId,
                    CompanyName = sr.CustomerAddress.Customer.CompanyName,
                    VatNumber = sr.CustomerAddress.Customer.VatNumber,
                    Image = sr.CustomerAddress.Customer.Account.Image
                },
                CustomerAddress = _mapper.Map <GetCustomerAddressResponse>(sr.CustomerAddress),
            })
                   .ToList());
        }
 public async Task <ActionResult <List <GetServiceResponse> > > GetServiceRequests([FromQuery] GetServiceRequestsFilter filter)
 {
     if (Account.Role == Role.Customer)
     {
         return(Ok(await _serviceRequestService.GetAllServices(Account, filter)));
     }
     else
     {
         return(Ok(await _serviceRequestService.GetAllServicesWithCustomerDetails(Account, filter)));
     }
 }