public ActionResult PendingCourseList(Int32?venueId)
        {
            CourseSearchModel model = new CourseSearchModel
            {
                CourseStatus = (Int32)Constants.RecordStatus.Pending
            };

            return(List(venueId, null, model));
        }
 private void GetLookups(CourseSearchModel model, Int32 providerId)
 {
     ViewBag.RecordStatuses = new SelectList(
         db.RecordStatus.Where(s => !s.IsDeleted),
         "RecordStatusId",
         "RecordStatusName",
         model.CourseStatus);
     ViewBag.StudyModes = new SelectList(
         db.StudyModes,
         "StudyModeId",
         "StudyModeName",
         model.StudyModeId);
     ViewBag.AttendanceTypes = new SelectList(
         db.AttendanceTypes,
         "AttendanceTypeId",
         "AttendanceTypeName",
         model.AttendanceModeId);
     ViewBag.AttendancePatterns = new SelectList(
         db.AttendancePatterns,
         "AttendancePatternId",
         "AttendancePatternName",
         model.AttendancePatternId);
     ViewBag.Venues = new SelectList(
         db.Venues.Where(x => x.ProviderId == providerId),
         "VenueId",
         "VenueName",
         model.VenueId);
     ViewBag.OpportunityStatuses = new SelectList(
         db.RecordStatus.Where(s => !s.IsDeleted && s.RecordStatusId != (int)Constants.RecordStatus.Pending),
         "RecordStatusId",
         "RecordStatusName",
         model.OpportunityStatus);
     ViewBag.StartDateOptions = new SelectList(new List <SelectListItem>
     {
         new SelectListItem {
             Text = AppGlobal.Language.GetText(this, "Before", "Before"), Value = "1"
         },
         new SelectListItem {
             Text = AppGlobal.Language.GetText(this, "After", "After"), Value = "2"
         }
     }, "Value", "Text", model.StartDateId);
 }
        public ActionResult List(Int32?venueId, Constants.CourseSearchQAFilter?qualitySearchMode, CourseSearchModel model)
        {
            Provider provider = db.Providers.Find(userContext.ItemId);

            if (provider == null)
            {
                return(HttpNotFound());
            }

            if (model == null)
            {
                model = new CourseSearchModel();
            }

            if (venueId.HasValue && Request.HttpMethod == "GET")
            {
                model.VenueId = venueId;
            }

            if (qualitySearchMode.HasValue && Request.HttpMethod == "GET")
            {
                model.QualitySearchMode = qualitySearchMode;
            }

            IQueryable <Course> courses = db.Courses.Include("LearningAim").Where(x => x.ProviderId == userContext.ItemId);

            if (!model.QualitySearchMode.HasValue)
            {
                // Get Courses Based on Search Criteria
                if (!String.IsNullOrEmpty(model.ProviderCourseId))
                {
                    courses = courses.Where(x => x.ProviderOwnCourseRef.Contains(model.ProviderCourseId));
                }
                if (!String.IsNullOrEmpty(model.ProviderCourseTitle))
                {
                    courses = courses.Where(x => x.CourseTitle.Contains(model.ProviderCourseTitle));
                }
                if (!String.IsNullOrEmpty(model.LearningAimReference))
                {
                    courses = courses.Where(x => x.LearningAimRefId.Contains(model.LearningAimReference));
                }
                if (model.LastUpdated.HasValue)
                {
                    //Bug fix, cannot use AddDays within a linq expression. Calculate outside of linq, also cater for null ModifiedDateTime
                    DateTime dateTo = model.LastUpdated.Value.AddDays(1);
                    courses = courses.Where(x => (x.ModifiedDateTimeUtc ?? x.CreatedDateTimeUtc) >= model.LastUpdated && (x.ModifiedDateTimeUtc ?? x.CreatedDateTimeUtc) < dateTo);
                }
                if (model.CourseStatus.HasValue)
                {
                    courses = courses.Where(x => x.RecordStatusId == model.CourseStatus);
                }
                if (!String.IsNullOrEmpty(model.ProviderOpportunityId))
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.ProviderOwnCourseInstanceRef == model.ProviderOpportunityId));
                }
                if (model.StudyModeId.HasValue)
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.StudyModeId == model.StudyModeId));
                }
                if (model.AttendanceModeId.HasValue)
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.AttendanceTypeId == model.AttendanceModeId));
                }
                if (model.AttendancePatternId.HasValue)
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.AttendancePatternId == model.AttendancePatternId));
                }
                if (model.VenueId.HasValue)
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.Venues.Any(v => v.VenueId == model.VenueId)));
                }
                if (model.StartDateId.HasValue && model.StartDate.HasValue)
                {
                    if (model.StartDateId == 1)
                    {
                        /* Before */
                        courses = courses.Where(x => x.CourseInstances.Any(i => i.CourseInstanceStartDates.Any(sd => sd.StartDate < model.StartDate)));
                    }
                    else
                    {
                        /* After */
                        courses = courses.Where(x => x.CourseInstances.Any(i => i.CourseInstanceStartDates.Any(sd => sd.StartDate >= model.StartDate)));
                    }
                }
                if (!String.IsNullOrEmpty(model.StartDateDescription))
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.StartDateDescription.Contains(model.StartDateDescription)));
                }
                if (model.OpportunityStatus.HasValue)
                {
                    courses = courses.Where(x => x.CourseInstances.Any(i => i.RecordStatusId == model.OpportunityStatus));
                }
            }


            if (model.QualitySearchMode.HasValue)
            {
                //New quality score filtering options
                if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CourseShortSummary)
                {
                    courses = courses.Where(x => x.CourseSummary.Length <= 200);
                }
                else if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CourseNonDistinctSummary)
                {
                    var nonDistinct = courses.GroupBy(c => c.CourseSummary).Where(grp => grp.Count() > 1).Select(grp => grp.Key);
                    courses = courses.Where(x => x.CourseSummary.Length > 200 && nonDistinct.Contains(x.CourseSummary));
                }
                else if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CoursesPending)
                {
                    courses = courses.Where(x => x.RecordStatusId == (int)Constants.RecordStatus.Pending);
                }
            }

            CourseDateStatusModel courseDateStatuses = new CourseDateStatusModel
            {
                ProviderId = provider.ProviderId
            };

            courseDateStatuses.Populate(db);

            foreach (Course c in courses.OrderByDescending(x => x.ModifiedDateTimeUtc ?? x.CreatedDateTimeUtc))
            {
                CourseDateStatusModelItem item = courseDateStatuses.Items.Where(x => x.CourseId == c.CourseId).FirstOrDefault();
                if (item != null)
                {
                    model.Courses.Add(new CourseListModel(c, item.MaxStartDate, item.DateStatus));
                }
                else
                {
                    model.Courses.Add(new CourseListModel(c, (DateTime?)null, null));
                }
            }

            if (model.QualitySearchMode.HasValue)
            {
                //New quality score filtering options
                if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CoursesOutOfDate)
                {
                    model.Courses = model.Courses.Where(x => x.DateStatus == Constants.CourseFilterDateStatus.OutOfDate).ToList();
                }
                if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CoursesExpiring)
                {
                    model.Courses = model.Courses.Where(x => x.DateStatus == Constants.CourseFilterDateStatus.Expiring).ToList();
                }
                if (model.QualitySearchMode == Constants.CourseSearchQAFilter.CoursesUpToDate)
                {
                    model.Courses = model.Courses.Where(x => x.DateStatus == Constants.CourseFilterDateStatus.UpToDate).ToList();
                }
                else if (model.QualitySearchMode == Constants.CourseSearchQAFilter.LearningAimExpired)
                {
                    model.Courses = model.Courses.Where(x => x.IsLARSExpired.HasValue && x.IsLARSExpired.Value).ToList();
                }
                else if (model.QualitySearchMode == Constants.CourseSearchQAFilter.LearningAimNone)
                {
                    model.Courses = model.Courses.Where(x => !x.IsLARSExpired.HasValue).ToList();
                }
            }


            // Populate drop downs
            GetLookups(model, userContext.ItemId ?? -1);

            model.NumberOfPendingCourses = courses.Count(x => x.RecordStatusId == (Int32)Constants.RecordStatus.Pending);

            return(View("List", model));
        }