public IWeekJobsResultModel GetJobsForWeek(IWeekPlanFilterModel filter)
        {
            IEnumerable <IWeekPlanListViewModel> jobs = Enumerable.Empty <IWeekPlanListViewModel>();

            IWeekPlanGridModel model = GetWeekPlanGridModel(filter);

            if (filter.MemberIds.HasValue())
            {
                var allowedDayAssignIds = dayAssignService.GetDayAssignIds(filter.Map <ITaskDataFilterModel>()).ToList();
                jobs = GetListViewModel(model, filter.JobState)
                       .Where(x => x.DayAssignId.HasValue && allowedDayAssignIds.Contains(x.DayAssignId.Value));
            }
            else
            {
                jobs = GetListViewModel(model, filter.JobState);
            }

            List <IWeekPlanListViewModel> orderedJobList = jobs.OrderByDescending(x => x.AssignDate).ToList();

            filter.Week = filter.Week > default(int) ? --filter.Week : default(int);

            int previousNotEmptyWeekNumber = jobService.GetPreviousNotEmptyWeekNumber(filter);

            return(new WeekJobsResultModel
            {
                Jobs = orderedJobList,
                IsAllowedPreviousWeeks = orderedJobList.Any() && previousNotEmptyWeekNumber > default(int),
                PreviousNotEmptyWeekNumber = previousNotEmptyWeekNumber
            });
        }
        public IWeekPlanGridModel GetWeekPlanGridModel(IWeekPlanFilterModel filter)
        {
            IWeekPlanGridModel       result  = new WeekPlanGridModel();
            List <IWeekPlanJobModel> allJobs = GetWeekPlanJobs(filter);

            result.BackLogJobs     = allJobs.Where(j => j.IsBackLogJob);
            result.WeekJobs        = allJobs.Where(j => !j.IsBackLogJob).OrderByDescending(j => j.StatusId.GetSortIndex());
            result.WeekendJobCount = allJobs.Count(j => j.IsWeekEndJob);
            result.IsShowWeekend   = result.WeekendJobCount > 0;

            return(result);
        }
        private List <Job> GetWeekTasks(IWeekPlanFilterModel filter)
        {
            var result = new List <Job>();

            if (filter.HousingDepartmentId.HasValue)
            {
                result = jobProvider.GetByDepartmentIdYearWeek(filter.HousingDepartmentId.Value, filter.Year, filter.Week);
            }
            else
            {
                result = jobProvider.GetByYearWeekForAllDepartments(filter.Year, filter.Week);
            }

            return(result);
        }
        private IEnumerable <IWeekPlanJobModel> GetExpiredJobsForPreviousWeek(IWeekPlanFilterModel filter)
        {
            IEnumerable <JobStatus> allowedStatusesForMovingInExpiredStatus = appSettingHelper.GetFromJson <IEnumerable <JobStatus> >(Constants.AppSetting.AllowedStatusesForMovingInExpiredStatus);
            int previousWeekNumber = GetPreviousWeekNumber(filter.Week);
            int previousWeekYear   = GetPreviousWeekYear(filter.Week, filter.Year);

            var previousWeekFilter = filter.Clone();

            previousWeekFilter.Week = previousWeekNumber;
            previousWeekFilter.Year = previousWeekYear;

            IEnumerable <Job> jobs = GetWeekTasks(previousWeekFilter);
            IEnumerable <IWeekPlanJobModel> allTicketsFromPreviousWeek = GetTicketsForExpiredJobs(jobs, filter.HousingDepartmentId.Value, previousWeekNumber, previousWeekYear, true);

            return(allTicketsFromPreviousWeek.Where(j => allowedStatusesForMovingInExpiredStatus.Contains(j.StatusId)));
        }
        public int GetPreviousNotEmptyWeekNumber(IWeekPlanFilterModel filter)
        {
            int result = default(int);
            IWeekPlanFilterModel clonedFilter = filter.Clone();

            while (clonedFilter.Week > default(int))
            {
                if (dayAssignProvider.HasTasks(clonedFilter))
                {
                    result = clonedFilter.Week;
                    break;
                }

                --clonedFilter.Week;
            }

            return(result);
        }
        private Expression <Func <DayAssign, bool> > GetQuery(IWeekPlanFilterModel filter)
        {
            Expression <Func <DayAssign, bool> > query = i => true;

            if (filter.HousingDepartmentId.HasValue)
            {
                query = query.And(f => f.DepartmentId == filter.HousingDepartmentId.Value);
            }

            query = query.And(f => f.WeekNumber == filter.Week);
            query = query.And(f => f.Year == filter.Year);

            switch (filter.JobState)
            {
            case JobStateType.NotCompleted:
                query = query.And(f => f.StatusId == JobStatus.Canceled || f.StatusId == JobStatus.Expired);
                break;

            case JobStateType.InProgress:
                query = query.And(f => f.StatusId != JobStatus.Completed && f.StatusId != JobStatus.Canceled && f.StatusId != JobStatus.Expired);
                break;

            case JobStateType.Completed:
                query = query.And(f => f.StatusId == JobStatus.Completed);
                break;

            default:
                throw new InvalidEnumArgumentException($"No such job state {filter.JobState}");
            }

            if (filter.MemberIds.Any())
            {
                query = query.And(f => f.IsAssignedToAllUsers || f.UserIdList.Any(u => filter.MemberIds.Contains(u)));
            }

            return(query);
        }
        private IEnumerable <IWeekPlanJobModel> GetAlreadyMovedExpiredJobsForSelectedWeek(IWeekPlanFilterModel filter)
        {
            IEnumerable <Job>        jobs = GetWeekTasks(filter);
            List <IWeekPlanJobModel> ticketsExceptVirtual = GetTicketsForExpiredJobs(jobs, filter.HousingDepartmentId.Value, filter.Week, filter.Year, false);

            return(ticketsExceptVirtual.Where(t => t.ExpiredDayAssignId.HasValue));
        }
        private List <IWeekPlanJobModel> GetWeekPlanJobs(IWeekPlanFilterModel filter)
        {
            IEnumerable <Job> jobs = GetWeekTasks(filter);

            return(GetTicketsForJobList(jobs, filter.HousingDepartmentId, filter.Week, filter.Year, false));
        }
        public bool HasTasks(IWeekPlanFilterModel filter)
        {
            IEnumerable <IDayAssign> dayAssigns = Query.Where(GetQuery(filter));

            return(dayAssigns.Any());
        }