public async Task <ContentCompletionModel> Get(int contentId, int userId)
        {
            var entity = await db.CourseContents
                         .Include(x => x.Question.FreeTextAnswers)
                         .Include(x => x.Question.MultipleChoiceAnswers)
                         .FirstOrDefaultAsync(x => x.Id == contentId);

            var model = new ContentCompletionModel
            {
                CourseId       = entity.CourseId,
                CourseModuleId = entity.CourseModuleId,
                ContentId      = entity.Id,
                Title          = entity.Title,
            };

            if (entity.CompletionType == ContentCompletionType.Timer)
            {
                model.CompletionType = ContentCompletionType.Timer;
                model.Timer          = entity.Timer;
                model.QuestionId     = null;
                model.Question       = null;
            }
            else if (entity.CompletionType == ContentCompletionType.ClickButton)
            {
                model.CompletionType = ContentCompletionType.ClickButton;
                model.QuestionId     = null;
                model.Question       = null;
                model.Timer          = 0;
            }
            else if (entity.CompletionType == ContentCompletionType.AnswerQuestion)
            {
                model.CompletionType = ContentCompletionType.AnswerQuestion;
                model.Timer          = 0;
                model.QuestionId     = entity.Question.Id;
            }
            else
            {
                model.CompletionType = ContentCompletionType.ClickButton;
                model.QuestionId     = null;
                model.Question       = null;
                model.Timer          = 0;
            }

            //// Get the user progress for this module.
            var course = await db.Courses.FirstOrDefaultAsync(x => x.Id == entity.CourseId);

            if (course?.Status == CourseStatus.Published)
            {
                var learner = await db.Learners.FirstOrDefaultAsync(x => x.User.Id == userId);

                if (learner != null)
                {
                    var progress = await db.CourseProgress.FirstOrDefaultAsync(x => x.ContentId == contentId &&
                                                                               x.LearnerId == learner.Id);

                    if (progress?.IsCompleted == true)
                    {
                        model.IsCompleted = true;
                    }
                }
            }

            return(model);
        }
        public async Task <IHttpActionResult> Post(bool CanViewAsLearner, [FromBody] ContentCompletionModel request)
        {
            if (ModelState.IsValid)
            {
                var currentContent = db.CourseContents.Find(request.ContentId);

                var nextContent = await db.CourseContents.Where(x => x.Order > currentContent.Order &&
                                                                x.CourseModuleId == currentContent.CourseModuleId)
                                  .OrderBy(x => x.Order).FirstOrDefaultAsync();

                if (nextContent != null)
                {
                    request.nextContentId = nextContent.Id;
                    request.nextModuleId  = currentContent.CourseModuleId;
                }
                else
                {
                    // get next module
                    var currentModule = db.CourseModules.Find(currentContent.CourseModuleId);
                    var nextModule    = await db.CourseModules.Where(x => x.CourseId == request.CourseId &&
                                                                     x.Order > currentModule.Order).OrderBy(x => x.Order).FirstOrDefaultAsync();

                    if (nextModule == null)
                    {
                        request.nextContentId = null;
                        request.nextModuleId  = null;
                    }
                    else
                    {
                        request.nextModuleId  = nextModule.Id;
                        request.nextContentId = null;
                    }
                }

                // Check if Admin or non learner, if so, no need to keep progress
                if (CanViewAsLearner)
                {
                    return(Ok(request));
                }

                var course = await db.Courses.FindAsync(currentContent.CourseId);

                if (course != null & course.Status == CourseStatus.Published)
                {
                    // get enrollment info
                    var learner = await db.Learners.FirstOrDefaultAsync(x => x.UserId == request.UserId);

                    if (learner == null)
                    {
                        db.ErrorLog.Add(new ErrorLog
                        {
                            ErrorDescription = "Learner not found to record progress.",
                            ErrorDetails     = $"Could not find learner with userid ={request.UserId} to record progress for course = { request.CourseId} ",
                            Module           = Modules.Learning,
                        });

                        db.SaveChanges();

                        return(BadRequest());
                    }

                    var enrollment = await db.Enrollments.FirstOrDefaultAsync(x => x.CourseId == request.CourseId &&
                                                                              x.LearnerId == learner.Id && !x.CourseEvent.IsTrial && (x.Status == EnrollmentStatus.Enrolled || x.Status == EnrollmentStatus.Completed));

                    if (enrollment == null)
                    {
                        db.ErrorLog.Add(new ErrorLog
                        {
                            ErrorDescription = "Enrollment not found to record progress.",
                            ErrorDetails     = $"Could not find enrollment for userid ={request.UserId} to record progress for course = { request.CourseId} ",
                            Module           = Modules.Learning,
                        });

                        db.SaveChanges();

                        return(BadRequest());
                    }

                    var courseProgress = enrollment.CourseProgress.FirstOrDefault(x => x.ModuleId == currentContent.CourseModuleId &&
                                                                                  x.ContentId == request.ContentId && x.LearnerId == learner.Id);

                    if (courseProgress == null)
                    {
                        courseProgress = new CourseProgress
                        {
                            EnrollmentId = enrollment.Id,
                            CourseId     = course.Id,
                            IsCompleted  = true,
                            ContentId    = request.ContentId,
                            ModuleId     = currentContent.CourseModuleId,

                            LearnerId = learner.Id,
                        };

                        db.CourseProgress.Add(courseProgress);
                    }
                    else
                    {
                        courseProgress.ModuleId    = currentContent.CourseModuleId;
                        courseProgress.CourseId    = currentContent.CourseId;
                        courseProgress.IsCompleted = true;

                        db.SetModified(courseProgress);
                    }

                    await db.SaveChangesAsync();

                    // calculate progress.
                    var progressCount = db.CourseProgress.Where(x => x.EnrollmentId == enrollment.Id).Count();

                    course.UpdateCourseStat();

                    var totalContent = course.TotalContents;

                    var progressPercent = ((decimal)progressCount / (decimal)totalContent) * 100m;

                    enrollment.TotalContentsCompleted = progressCount;
                    enrollment.PercentageCompleted    = progressPercent;

                    if ((request.nextContentId == null && request.nextModuleId == null) || enrollment.TotalContentsCompleted == totalContent)
                    {
                        enrollment.Status         = EnrollmentStatus.Completed;
                        enrollment.CompletionDate = DateTime.Now;
                    }

                    db.SetModified(enrollment);

                    await db.SaveChangesAsync();

                    request.CourseId = course.Id;

                    return(Ok(request));
                }
                else
                {
                    return(BadRequest());
                }
            }
            else
            {
                return(BadRequest(ModelState));
            }
        }
Exemple #3
0
        public async Task <ActionResult> Post(ContentCompletionModel model)
        {
            bool CanViewAsLearner = false;

            if (CurrentUser.HasAccess(UserAccess.CourseCreate) || CurrentUser.HasAccess(UserAccess.CourseEdit) ||
                CurrentUser.HasAccess(UserAccess.CourseVerify) || CurrentUser.HasAccess(UserAccess.CourseApproval1) ||
                CurrentUser.HasAccess(UserAccess.CourseApproval2) || CurrentUser.HasAccess(UserAccess.CourseApproval3) ||
                CurrentUser.HasAccess(UserAccess.CourseDiscussionCreate))
            {
                CanViewAsLearner = true;
            }

            if (ModelState.IsValid)
            {
                model.UserId = CurrentUser.UserId.Value;

                var response = await WepApiMethod.SendApiAsync <ContentCompletionModel>(HttpVerbs.Post, ContentCompletionsApiUrl.Post + $"?CanViewAsLearner={CanViewAsLearner}", model);

                if (response.isSuccess)
                {
                    //TempData["SuccessMessage"] = "Content Completed";

                    await LogActivity(Modules.Learning, $"User : {CurrentUser?.Name} complete this content : {model.Title}");

                    var nextContent = response.Data.nextContentId;
                    var nextModule  = response.Data.nextModuleId;
                    var courseId    = response.Data.CourseId;

                    if (nextContent == null)
                    {
                        if (nextModule == null) // No more module and content, lets go to the course page
                        {
                            TempData["SuccessMessage"] = "Congratulations, you have completed this course.";

                            var course = await CoursesController.TryGetFrontCourse(courseId.Value);

                            if (course.Status != Model.eLearning.CourseStatus.Published)
                            {
                                if (CurrentUser.HasAccess(UserAccess.CourseCreate))
                                {
                                    return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId }));
                                }
                                else
                                if (CurrentUser.HasAccess(UserAccess.CourseNonLearnerView))
                                {
                                    return(RedirectToAction("Approve", "CourseApprovals", new { area = "eLearning", @id = courseId }));
                                }
                            }
                            else
                            if (course.Status == Model.eLearning.CourseStatus.Published)
                            {
                                if (CurrentUser.HasAccess(UserAccess.CourseCreate))
                                {
                                    return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId }));
                                }
                                else
                                if (CurrentUser.HasAccess(UserAccess.CourseNonLearnerView))
                                {
                                    return(RedirectToAction("Content", "Courses", new { area = "eLearning", @id = courseId }));
                                }
                                else
                                {
                                    return(RedirectToAction("View", "Courses", new { area = "eLearning", @id = courseId }));
                                }
                            }
                            return(RedirectToAction("View", "Courses", new { area = "eLearning", @id = courseId }));
                        }
                        else  // go to next module
                        {
                            return(RedirectToAction("View", "CourseModules", new { area = "eLearning", @id = nextModule.Value }));
                        }
                    }
                    else // go to next content
                    {
                        return(RedirectToAction("View", "CourseContents", new { area = "eLearning", @id = nextContent.Value }));
                    }
                }
            }
            TempData["ErrorMessage"] = "Cannot complete content.";

            return(RedirectToAction("Content", "CourseModules", new { area = "eLearning", @id = model.CourseModuleId }));
        }