private List <bool> CheckDublicate(UserVacationRequest newRequest)
        {
            var currentRequests = _userVacationRequestRepository.FindByConditionWithUser(x => x.User.Id == newRequest.User.Id).ToList();

            List <bool> checkOverlaps = new List <bool>();

            if (currentRequests.Count == 0)
            {
                checkOverlaps.Add(false);
            }
            else
            {
                foreach (var request in currentRequests)
                {
                    checkOverlaps.Add((request.StartDate < newRequest.EndDate && newRequest.StartDate < request.EndDate));
                }
            }
            return(checkOverlaps);
        }
        private CountOfVacationDTO CheckVacationPolicies(UserVacationRequest newrequest)
        {
            var             allvacations = _userVacationRequestRepository.FindByConditionWithUser(x => x.User.Id == newrequest.User.Id).Where(x => (x.StartDate.Year == 2019) && (x.VacationType.Name == newrequest.VacationType.Name)).ToList();
            var             allHolidays  = _companyHolidayRepository.FindByCondition(x => x.Date.Year == DateTime.Now.Year);
            List <DateTime> allDatesPrev = new List <DateTime>();

            if (allvacations.Count != 0)
            {
                //count prev days without sat and sun
                foreach (var vacation in allvacations)
                {
                    for (DateTime date = vacation.StartDate; date <= vacation.EndDate; date = date.AddDays(1))
                    {
                        if (date.DayOfWeek.ToString() != "Saturday" && date.DayOfWeek.ToString() != "Sunday")
                        {
                            allDatesPrev.Add(date);
                        }
                    }
                }
                //count prev days without company holidays
                allDatesPrev = GetListDaysWithoutCompanyHolidays(allDatesPrev);
                //foreach (var checkHoliday in allHolidays)
                //{
                //    var item = allDatesPrev.SingleOrDefault(x => x.DayOfYear == checkHoliday.Date.DayOfYear);
                //    if (item != null)
                //    {
                //        allDatesPrev.Remove(item);
                //    }
                //}
            }

            //count days of current request
            List <DateTime> allDatesForCurrentRequest = new List <DateTime>();

            for (DateTime date = newrequest.StartDate; date <= newrequest.EndDate; date = date.AddDays(1))
            {
                if (date.DayOfWeek.ToString() != "Saturday" && date.DayOfWeek.ToString() != "Sunday")
                {
                    allDatesForCurrentRequest.Add(date);
                }
            }
            //count days of current request without company holiday
            allDatesForCurrentRequest = GetListDaysWithoutCompanyHolidays(allDatesForCurrentRequest);
            //foreach (var checkHoliday in allHolidays)
            //{
            //    var item = allDatesForCurrentRequest.SingleOrDefault(x => x.DayOfYear == checkHoliday.Date.DayOfYear);
            //    if (item != null)
            //    {
            //        allDatesForCurrentRequest.Remove(item);
            //    }
            //}

            //get vacation policy for category
            List <VacationPolicy> currentVacationPolicy = _vacationPolicyRepository.FindCurrentVacationPolicy(newrequest);
            int commonCountOfday = currentVacationPolicy[0].Count + currentVacationPolicy[0].Count;

            //it check if is dates yet
            int countAllDatesForCurrentRequest = allDatesForCurrentRequest.Count;
            int countAllDatesPrev = allDatesPrev.Count;

            if (commonCountOfday >= countAllDatesForCurrentRequest + countAllDatesPrev)
            {
                VacationPolicy PolicyWithPay    = currentVacationPolicy.Find(x => x.Payments == x.Count);
                int            remainderPayDays = PolicyWithPay.Count - (countAllDatesForCurrentRequest + countAllDatesPrev);

                if (remainderPayDays >= 0)
                {
                    return(new CountOfVacationDTO {
                        Payments = countAllDatesForCurrentRequest, Free = 0
                    });
                }
                else if (countAllDatesPrev > PolicyWithPay.Count)
                {
                    return(new CountOfVacationDTO {
                        Payments = 0, Free = countAllDatesForCurrentRequest
                    });
                }
                else if (countAllDatesPrev < PolicyWithPay.Count)
                {
                    return(new CountOfVacationDTO {
                        Payments = allDatesForCurrentRequest.Count + remainderPayDays, Free = -remainderPayDays
                    });
                }
            }
            return(null);
        }
        public List <VacationPolicy> FindCurrentVacationPolicy(UserVacationRequest userVacationRequest)
        {
            int workingYears = DateTime.Now.Year - userVacationRequest.User.DateRecruitment.Year;

            return(RepositoryContext.VacationPolicies.Include(x => x.VacationType).Where(x => x.VacationType.Id == userVacationRequest.VacationType.Id).Where(x => x.WorkingYear >= workingYears).ToList().OrderBy(x => x.WorkingYear).Take(2).ToList());;
        }