コード例 #1
0
        public async Task <IActionResult> OnPostAsync(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            ////////////////////////////////////////////////////////////
            // Step #1:
            // Check to see if records exists
            ////////////////////////////////////////////////////////////
            var lvProgramEnrollment = await _context.ProgramEnrollments
                                      .Include(p => p.LMSProgram)
                                      .SingleOrDefaultAsync(m => m.ProgramEnrollmentID == id);

            ////////////////////////////////////////////////////////////
            // Return "Not Found" if record doesn't exist
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                return(NotFound());
            }

            ////////////////////////////////////////////////////////////
            // Step #2:
            // Now that record exists, make sure that the logged-in user
            // is authorized to withdraw this program enrollment
            ////////////////////////////////////////////////////////////
            var loggedInUserID = _userManager.GetUserId(User);

            lvProgramEnrollment = null;
            lvProgramEnrollment = await _context.ProgramEnrollments
                                  .Where(pe => pe.StudentUserId == loggedInUserID && pe.ProgramEnrollmentID == id)
                                  .Include(p => p.LMSProgram)
                                  .SingleOrDefaultAsync();

            /////////////////////////////////////////////////////////////
            // We already know that record exists from Step #1 so if we
            // get a "Not Found" in Step #2, we know it's because the
            // logged-in user is not authorized to withdraw this
            // program enrollment.
            /////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                return(Unauthorized());
            }

            ////////////////////////////////////////////////////////////
            // Retrieve the correct StatusTransition
            ////////////////////////////////////////////////////////////
            StatusTransition lvStatusTranstion = null;

            //////////////////////////////////////////////////////////////////////
            // STATUS TRANSITION: PENDING TO WITHDRAEN
            //////////////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.StatusCode.Equals(StatusCodeConstants.PENDING))
            {
                lvStatusTranstion = await _context.StatusTransitions
                                    .Where(st => st.TransitionCode == TransitionCodeConstants.PENDING_TO_WITHDRAWN)
                                    .SingleOrDefaultAsync();
            }
            //////////////////////////////////////////////////////////////////////
            // STATUS TRANSITION: APPROVED TO WITHDRAEN
            //////////////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.StatusCode.Equals(StatusCodeConstants.APPROVED))
            {
                lvStatusTranstion = await _context.StatusTransitions
                                    .Where(st => st.TransitionCode == TransitionCodeConstants.APPROVED_TO_WITHDRAWN)
                                    .SingleOrDefaultAsync();
            }

            ////////////////////////////////////////////////////////////////
            // Create EnrollmentHistory using the correct StatusTranistion
            ////////////////////////////////////////////////////////////////
            var lvEnrollmentHistory = new EnrollmentHistory()
            {
                StatusTransitionID = lvStatusTranstion.StatusTransitionID,
                ActorUserId        = _userManager.GetUserId(User),
                ActorRemarks       = Input.Remarks,
                DateCreated        = DateTime.Now
            };

            ////////////////////////////////////////////////////////////
            // Instantiate EnrollmentHistory Collection, if necessary
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.EnrollmentHistory == null)
            {
                lvProgramEnrollment.EnrollmentHistory = new List <EnrollmentHistory>();
            }

            ///////////////////////////////////////////////////////////////////
            // Add newly created EnrollmentHistory with StatusTransition
            // to ProgramEnrollment's EnrollmentHistory Collection
            ///////////////////////////////////////////////////////////////////
            lvProgramEnrollment.EnrollmentHistory.Add(lvEnrollmentHistory);


            /////////////////////////////////////////////////////////////////
            // Update ProgramEnrollment Record with
            //  1. EnrollmentStatus of "WITHDRAWN"
            //  2. ApproverUserId (logged-in user)
            //  3. EnrollmentHistory (PENDING TO WiTHDRAWN)
            /////////////////////////////////////////////////////////////////
            lvProgramEnrollment.StatusCode     = StatusCodeConstants.WITHDRAWN;
            lvProgramEnrollment.ApproverUserId = _userManager.GetUserId(User);
            _context.ProgramEnrollments.Update(lvProgramEnrollment);
            await _context.SaveChangesAsync();

            ////////////////////////////////////////////////////////////////////////////////////
            // Send email notification to approvers who have their EmailNotify flag set to true
            ////////////////////////////////////////////////////////////////////////////////////
            IList <ProgramApprover> approverList = await _context.ProgramApprovers
                                                   .Where(pa => pa.LMSProgramID == lvProgramEnrollment.LMSProgramID && pa.EmailNotify == true)
                                                   .Include(pa => pa.Approver)
                                                   .Include(pa => pa.LMSProgram)
                                                   .AsNoTracking()
                                                   .ToListAsync();

            ApplicationUser student = await GetCurrentUserAsync();

            foreach (ProgramApprover approverObj in approverList)
            {
                string email   = approverObj.Approver.Email;
                string subject = "Program Enrollment Withdrawal (" + approverObj.LMSProgram.LongName + ")";
                string message = student.FullName + " has withdrawn his/her enrollment in " + approverObj.LMSProgram.LongName;
                await _emailSender.SendEmailAsync(email, subject, message);
            }
            ////////////////////////////////////////////////////////////////////////////////////
            // Send email notification to LMS Program's common inbox (if any)
            ////////////////////////////////////////////////////////////////////////////////////
            LMSProgram lmsProgram = await _context.LMSPrograms
                                    .Where(p => p.LMSProgramID == lvProgramEnrollment.LMSProgramID && p.CommonInbox != null)
                                    .AsNoTracking()
                                    .SingleOrDefaultAsync();

            if (String.IsNullOrEmpty(lmsProgram.CommonInbox) == false)
            {
                string email   = lmsProgram.CommonInbox;
                string subject = "Program Enrollment Withdrawal (" + lmsProgram.LongName + ")";
                string message = student.FullName + " has withdrawn his/her enrollment in " + lmsProgram.LongName;
                await _emailSender.SendEmailAsync(email, subject, message);
            }

            /////////////////////////////////////////////////////////////////
            // Redirect to Student Index Page
            /////////////////////////////////////////////////////////////////
            return(RedirectToPage("./Index"));
        }
コード例 #2
0
        public async Task <IActionResult> OnPostAsync(int programEnrollmentID, string statusCode, string statusTransitionCode)
        {
            ////////////////////////////////////////////////////////////
            // Step #1:
            // Check to see if records exists
            ////////////////////////////////////////////////////////////
            var lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                      .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                      .AsNoTracking()
                                      .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////
            // Return "Not Found" if record doesn't exist
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                _logger.LogInformation("[Approvals][ReviewModel][OnPostAsync] => ProgramEnrollment NOT FOUND ProgramEnrollmentID '" + programEnrollmentID + "'");
                return(NotFound());
            }

            ////////////////////////////////////////////////////////////
            // Step #2:
            // Now that record exists, make sure that the logged-in user
            // is authorized to edit (approver/deny) enrollment
            // applications for this particular LMS Program.
            //////////////////////////////////////////////////////////////////////////
            // PostgreSQL
            /////////////////////////////////////////////////////////////////////////
            // var sql = " SELECT * "
            //         + "   FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramEnrollment\" "
            //         + "  WHERE  \"ProgramEnrollmentID\" = {0} "
            //         + "    AND  \"LMSProgramID\" "
            //         + "     IN "
            //         + "      ( "
            //         + "        SELECT \"LMSProgramID\" "
            //         + "          FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramApprover\" "
            //         + "         WHERE \"ApproverUserId\" = {1} "
            //         + "      ) ";
            /////////////////////////////////////////////////////////////////////////
            // MySQL
            /////////////////////////////////////////////////////////////////////////
            var sql = " SELECT * "
                      + "   FROM " + MiscConstants.DB_SCHEMA_NAME + ".ProgramEnrollment "
                      + "  WHERE  ProgramEnrollmentID = {0} "
                      + "    AND  LMSProgramID "
                      + "     IN "
                      + "      ( "
                      + "        SELECT LMSProgramID "
                      + "          FROM " + MiscConstants.DB_SCHEMA_NAME + ".ProgramApprover "
                      + "         WHERE ApproverUserId = {1} "
                      + "      ) ";

            /////////////////////////////////////////////////////////////////////////

            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .FromSql(sql, programEnrollmentID, _userManager.GetUserId(User))
                                  .Include(pe => pe.EnrollmentHistory)
                                  .SingleOrDefaultAsync();

            /////////////////////////////////////////////////////////////
            // We already know that record exists from Step #1 so if we
            // get a "Not Found" in Step #2, we know it's because the
            // logged-in user is not authorized to edit (approve/deny)
            // enrollment applications for this LMS Program.
            /////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                return(Unauthorized());
            }

            ////////////////////////////////////////////////////////////
            // Retrieve the correct StatusTransition
            ////////////////////////////////////////////////////////////
            var lvStatusTranstion = await _dbContext.StatusTransitions
                                    .Where(st => st.TransitionCode == statusTransitionCode)
                                    .AsNoTracking()
                                    .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////////
            // Create EnrollmentHistory using the correct StatusTranistion
            ////////////////////////////////////////////////////////////////
            var lvEnrollmentHistory = new EnrollmentHistory()
            {
                StatusTransitionID = lvStatusTranstion.StatusTransitionID,
                ActorUserId        = _userManager.GetUserId(User),
                ActorRemarks       = Input.Remarks,
                DateCreated        = DateTime.Now
            };

            ////////////////////////////////////////////////////////////
            // Instantiate EnrollmentHistory, if necessary
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.EnrollmentHistory == null)
            {
                lvProgramEnrollment.EnrollmentHistory = new List <EnrollmentHistory>();
            }

            ///////////////////////////////////////////////////////////////////
            // Add newly created EnrollmentHistory with StatusTransition
            // to ProgramEnrollment's EnrollmentHistory Collection
            ///////////////////////////////////////////////////////////////////
            lvProgramEnrollment.EnrollmentHistory.Add(lvEnrollmentHistory);

            /////////////////////////////////////////////////////////////////
            // Update ProgramEnrollment Record with
            //  1. EnrollmentStatus of "APPROVED"
            //  2. ApproverUserId (logged-in user)
            //  3. EnrollmentHistory (PENDING TO APPROVED)
            /////////////////////////////////////////////////////////////////
            lvProgramEnrollment.StatusCode     = statusCode;
            lvProgramEnrollment.ApproverUserId = _userManager.GetUserId(User);
            _dbContext.ProgramEnrollments.Update(lvProgramEnrollment);
            await _dbContext.SaveChangesAsync();

            //////////////////////////////////////////////////////////////////////////////
            // Retrieve 'User as Approver' for event logging
            //////////////////////////////////////////////////////////////////////////////
            ApplicationUser approver = await GetCurrentUserAsync();

            //////////////////////////////////////////////////////////////////
            // Determine EventType StatusCode
            //////////////////////////////////////////////////////////////////
            string eventTypeCode = null;

            if (statusCode.Equals(StatusCodeConstants.APPROVED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_APPROVED;
            }
            if (statusCode.Equals(StatusCodeConstants.DENIED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_DENIED;
            }
            if (statusCode.Equals(StatusCodeConstants.REVOKED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_REVOKED;
            }

            /////////////////////////////////////////////////////////////////////////////////////////////
            // Log the ENROLLMENT <APPROVED || DENIED || REVOKED> event
            /////////////////////////////////////////////////////////////////////////////////////////////
            _eventLogService.LogEvent(eventTypeCode, approver, lvProgramEnrollment.ProgramEnrollmentID);

            /////////////////////////////////////////////////////////////////////
            // Send email notification to student, advising him/her of
            // program enrollment status
            /////////////////////////////////////////////////////////////////////
            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                  .Include(pe => pe.LMSProgram)
                                  .Include(pe => pe.Student)
                                  .Include(pe => pe.EnrollmentStatus)
                                  .AsNoTracking()
                                  .SingleOrDefaultAsync();

            ApplicationUser student = lvProgramEnrollment.Student;
            string          email   = student.Email;
            string          subject = lvProgramEnrollment.LMSProgram.LongName
                                      + " Enrollment Status";
            string message = "Your request to enroll in the "
                             + lvProgramEnrollment.LMSProgram.LongName
                             + " has been "
                             + lvProgramEnrollment.EnrollmentStatus.StatusLabel
                             + ".";

            if (StatusCodeConstants.APPROVED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                message += "You will receive an additional email from the GSA Learning Academy "
                           + "to finish setting up your account in the GSA Learning Academy "
                           + "and begin the training program";
            }
            if (StatusCodeConstants.DENIED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                string referrer = Request.Headers["Referer"];
                // TODO: Switch to a more professional way of doing this!
                int end = referrer.IndexOf("Approvals"); // TEMPORARY!!

                string baseUrl          = referrer.Substring(0, end);
                var    studentLoginPath = baseUrl + "Account/Login";
                message += " <a href='" + studentLoginPath + "'>Log-in</a> "
                           + "to the training registration system for more information "
                           + "regarding the denial and request to reenroll in the program..";
            }
            if (StatusCodeConstants.REVOKED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                string referrer = Request.Headers["Referer"];
                // TODO: Switch to a more professional way of doing this!
                int end = referrer.IndexOf("Approvals"); // TEMPORARY!!

                string baseUrl          = referrer.Substring(0, end);
                var    studentLoginPath = baseUrl + "Account/Login";
                message += " <a href='" + studentLoginPath + "'>Log-in</a> "
                           + "to the training registration system for more information "
                           + "regarding the revocation and request to reenroll in the program..";
            }

            await _emailSender.SendEmailAsync(email, subject, message);

            /////////////////////////////////////////////////////////////////
            // Redirect to Approval Index Page
            /////////////////////////////////////////////////////////////////
            return(RedirectToPage("./Index"));
        }
コード例 #3
0
ファイル: Review.cshtml.cs プロジェクト: leetrent/lmsextreg
        public async Task <IActionResult> OnPostAsync(int programEnrollmentID, string statusCode, string statusTransitionCode)
        {
            Console.WriteLine("Approvals.Review.OnPostAsync(): BEGIN");
            Console.WriteLine("id: " + programEnrollmentID);
            Console.WriteLine("Remarks: " + Input.Remarks);

            ////////////////////////////////////////////////////////////
            // Step #1:
            // Check to see if records exists
            ////////////////////////////////////////////////////////////
            var lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                      .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                      .AsNoTracking()
                                      .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////
            // Return "Not Found" if record doesn't exist
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                Console.WriteLine("ProgramEnrollment NOT FOUND in Step #1");
                return(NotFound());
            }

            ////////////////////////////////////////////////////////////
            // Step #2:
            // Now that record exists, make sure that the logged-in user
            // is authorized to edit (approver/deny) enrollment
            // applications for this particular LMS Program.
            ////////////////////////////////////////////////////////////
            var sql = " SELECT * "
                      + "   FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramEnrollment\" "
                      + "  WHERE  \"ProgramEnrollmentID\" = {0} "
                      + "    AND  \"LMSProgramID\" "
                      + "     IN "
                      + "      ( "
                      + "        SELECT \"LMSProgramID\" "
                      + "          FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramApprover\" "
                      + "         WHERE \"ApproverUserId\" = {1} "
                      + "      ) ";

            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .FromSql(sql, programEnrollmentID, _userManager.GetUserId(User))
                                  .Include(pe => pe.EnrollmentHistory)
                                  .SingleOrDefaultAsync();

            /////////////////////////////////////////////////////////////
            // We already know that record exists from Step #1 so if we
            // get a "Not Found" in Step #2, we know it's because the
            // logged-in user is not authorized to edit (approve/deny)
            // enrollment applications for this LMS Program.
            /////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                return(Unauthorized());
            }

            ////////////////////////////////////////////////////////////
            // Retrieve the correct StatusTransition
            ////////////////////////////////////////////////////////////
            var lvStatusTranstion = await _dbContext.StatusTransitions
                                    .Where(st => st.TransitionCode == statusTransitionCode)
                                    .AsNoTracking()
                                    .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////////
            // Create EnrollmentHistory using the correct StatusTranistion
            ////////////////////////////////////////////////////////////////
            var lvEnrollmentHistory = new EnrollmentHistory()
            {
                StatusTransitionID = lvStatusTranstion.StatusTransitionID,
                ActorUserId        = _userManager.GetUserId(User),
                ActorRemarks       = Input.Remarks,
                DateCreated        = DateTime.Now
            };

            ////////////////////////////////////////////////////////////
            // Instantiate EnrollmentHistory, if necessary
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.EnrollmentHistory == null)
            {
                lvProgramEnrollment.EnrollmentHistory = new List <EnrollmentHistory>();
            }

            ///////////////////////////////////////////////////////////////////
            // Add newly created EnrollmentHistory with StatusTransition
            // to ProgramEnrollment's EnrollmentHistory Collection
            ///////////////////////////////////////////////////////////////////
            lvProgramEnrollment.EnrollmentHistory.Add(lvEnrollmentHistory);

            /////////////////////////////////////////////////////////////////
            // Update ProgramEnrollment Record with
            //  1. EnrollmentStatus of "APPROVED"
            //  2. ApproverUserId (logged-in user)
            //  3. EnrollmentHistory (PENDING TO APPROVED)
            /////////////////////////////////////////////////////////////////
            lvProgramEnrollment.StatusCode     = statusCode;
            lvProgramEnrollment.ApproverUserId = _userManager.GetUserId(User);
            _dbContext.ProgramEnrollments.Update(lvProgramEnrollment);
            await _dbContext.SaveChangesAsync();

            /////////////////////////////////////////////////////////////////////
            // Send email notification to student, advising him/her of
            // program enrollment status
            /////////////////////////////////////////////////////////////////////
            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                  .Include(pe => pe.LMSProgram)
                                  .Include(pe => pe.Student)
                                  .Include(pe => pe.EnrollmentStatus)
                                  .AsNoTracking()
                                  .SingleOrDefaultAsync();

            ApplicationUser student = lvProgramEnrollment.Student;
            string          email   = student.Email;
            string          subject = lvProgramEnrollment.LMSProgram.LongName
                                      + " Enrollment Status";
            string message = "Your request to enroll in the "
                             + lvProgramEnrollment.LMSProgram.LongName
                             + " has been "
                             + lvProgramEnrollment.EnrollmentStatus.StatusLabel
                             + ".";

            if (StatusCodeConstants.DENIED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                string referrer = Request.Headers["Referer"];
                // TODO: Switch to a more professional way of doing this!
                int end = referrer.IndexOf("Approvals"); // TEMPORARY!!

                string baseUrl = referrer.Substring(0, end);
                Console.WriteLine("baseUrl: ");
                Console.WriteLine(baseUrl);

                var studentLoginPath = baseUrl + "Account/Login";
                Console.WriteLine("studentLoginPath: ");
                Console.WriteLine(studentLoginPath);
                message += " <a href='" + studentLoginPath + "'>Log-in</a> "
                           + "to the training registration system for more information regarding the denial.";
            }
            await _emailSender.SendEmailAsync(email, subject, message);

            /////////////////////////////////////////////////////////////////
            // Redirect to Approval Index Page
            /////////////////////////////////////////////////////////////////
            return(RedirectToPage("./Index"));
        }
コード例 #4
0
        public async Task <IActionResult> OnPostAsync(int programEnrollmentID, string statusCode, string statusTransitionCode)
        {
            ////////////////////////////////////////////////////////////
            // Step #1:
            // Check to see if records exists
            ////////////////////////////////////////////////////////////
            var lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                      .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                      .AsNoTracking()
                                      .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////
            // Return "Not Found" if record doesn't exist
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                _logger.LogInformation("[Approvals][ReviewModel][OnPostAsync] => ProgramEnrollment NOT FOUND ProgramEnrollmentID '" + programEnrollmentID + "'");
                return(NotFound());
            }

            ////////////////////////////////////////////////////////////
            // Step #2:
            // Now that record exists, make sure that the logged-in user
            // is authorized to edit (approver/deny) enrollment
            // applications for this particular LMS Program.
            //////////////////////////////////////////////////////////////////////////
            // PostgreSQL
            /////////////////////////////////////////////////////////////////////////
            // var sql = " SELECT * "
            //         + "   FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramEnrollment\" "
            //         + "  WHERE  \"ProgramEnrollmentID\" = {0} "
            //         + "    AND  \"LMSProgramID\" "
            //         + "     IN "
            //         + "      ( "
            //         + "        SELECT \"LMSProgramID\" "
            //         + "          FROM " + MiscConstants.DB_SCHEMA_NAME + ".\"ProgramApprover\" "
            //         + "         WHERE \"ApproverUserId\" = {1} "
            //         + "      ) ";
            /////////////////////////////////////////////////////////////////////////
            // MySQL
            /////////////////////////////////////////////////////////////////////////
            var sql = " SELECT * "
                      + "   FROM " + MiscConstants.DB_SCHEMA_NAME + ".ProgramEnrollment "
                      + "  WHERE  ProgramEnrollmentID = {0} "
                      + "    AND  LMSProgramID "
                      + "     IN "
                      + "      ( "
                      + "        SELECT LMSProgramID "
                      + "          FROM " + MiscConstants.DB_SCHEMA_NAME + ".ProgramApprover "
                      + "         WHERE ApproverUserId = {1} "
                      + "      ) ";

            /////////////////////////////////////////////////////////////////////////

            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .FromSqlRaw(sql, programEnrollmentID, _userManager.GetUserId(User))
                                  .Include(pe => pe.LMSProgram)
                                  .Include(pe => pe.EnrollmentHistory)
                                  .SingleOrDefaultAsync();

            /////////////////////////////////////////////////////////////
            // We already know that record exists from Step #1 so if we
            // get a "Not Found" in Step #2, we know it's because the
            // logged-in user is not authorized to edit (approve/deny)
            // enrollment applications for this LMS Program.
            /////////////////////////////////////////////////////////////
            if (lvProgramEnrollment == null)
            {
                return(Unauthorized());
            }

            ////////////////////////////////////////////////////////////
            // Retrieve the correct StatusTransition
            ////////////////////////////////////////////////////////////
            var lvStatusTranstion = await _dbContext.StatusTransitions
                                    .Where(st => st.TransitionCode == statusTransitionCode)
                                    .AsNoTracking()
                                    .SingleOrDefaultAsync();

            ////////////////////////////////////////////////////////////////
            // Create EnrollmentHistory using the correct StatusTranistion
            ////////////////////////////////////////////////////////////////
            var lvEnrollmentHistory = new EnrollmentHistory()
            {
                StatusTransitionID = lvStatusTranstion.StatusTransitionID,
                ActorUserId        = _userManager.GetUserId(User),
                ActorRemarks       = Input.Remarks,
                DateCreated        = DateTime.Now
            };

            ////////////////////////////////////////////////////////////
            // Instantiate EnrollmentHistory, if necessary
            ////////////////////////////////////////////////////////////
            if (lvProgramEnrollment.EnrollmentHistory == null)
            {
                lvProgramEnrollment.EnrollmentHistory = new List <EnrollmentHistory>();
            }

            ///////////////////////////////////////////////////////////////////
            // Add newly created EnrollmentHistory with StatusTransition
            // to ProgramEnrollment's EnrollmentHistory Collection
            ///////////////////////////////////////////////////////////////////
            lvProgramEnrollment.EnrollmentHistory.Add(lvEnrollmentHistory);

            /////////////////////////////////////////////////////////////////
            // Update ProgramEnrollment Record with
            //  1. EnrollmentStatus of "APPROVED"
            //  2. ApproverUserId (logged-in user)
            //  3. EnrollmentHistory (PENDING TO APPROVED)
            /////////////////////////////////////////////////////////////////
            string logSnippet = new StringBuilder("[")
                                .Append(DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss"))
                                .Append("][")
                                .Append(_userManager.GetUserId(User))
                                .Append("][Approver][Review][HttpPost] => ")
                                .ToString();

            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.LMSProgram == null)....: {lvProgramEnrollment.LMSProgram == null}");
            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.LMSProgram.ShortName)..: {lvProgramEnrollment.LMSProgram.ShortName}");
            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.LMSProgram.ExpiryDays).: {lvProgramEnrollment.LMSProgram.ExpiryDays}");

            lvProgramEnrollment.StatusCode      = statusCode;
            lvProgramEnrollment.DateLastUpdated = DateTime.Now;


            if (lvProgramEnrollment.StatusCode.Equals(StatusCodeConstants.APPROVED))
            {
                lvProgramEnrollment.DateExpired = lvProgramEnrollment.DateLastUpdated.AddDays(lvProgramEnrollment.LMSProgram.ExpiryDays);
            }
            else if (lvProgramEnrollment.StatusCode.Equals(StatusCodeConstants.REVOKED))
            {
                lvProgramEnrollment.DateExpired = DateTime.Now;
            }
            else
            {
                lvProgramEnrollment.DateExpired = null;
            }

            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.DateLastUpdated)..: {lvProgramEnrollment.DateLastUpdated}");
            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.StatusCode).......: {lvProgramEnrollment.StatusCode}");
            Console.WriteLine(logSnippet + $"(lvProgramEnrollment.DateExpired)......: {lvProgramEnrollment.DateExpired}");

            lvProgramEnrollment.ApproverUserId = _userManager.GetUserId(User);
            _dbContext.ProgramEnrollments.Update(lvProgramEnrollment);
            await _dbContext.SaveChangesAsync();

            //////////////////////////////////////////////////////////////////////////////
            // Retrieve 'User as Approver' for event logging
            //////////////////////////////////////////////////////////////////////////////
            ApplicationUser approver = await GetCurrentUserAsync();

            //////////////////////////////////////////////////////////////////
            // Determine EventType StatusCode
            //////////////////////////////////////////////////////////////////
            string eventTypeCode = null;

            if (statusCode.Equals(StatusCodeConstants.APPROVED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_APPROVED;
            }
            if (statusCode.Equals(StatusCodeConstants.DENIED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_DENIED;
            }
            if (statusCode.Equals(StatusCodeConstants.REVOKED))
            {
                eventTypeCode = EventTypeCodeConstants.ENROLLMENT_REVOKED;
            }

            /////////////////////////////////////////////////////////////////////////////////////////////
            // Log the ENROLLMENT <APPROVED || DENIED || REVOKED> event
            /////////////////////////////////////////////////////////////////////////////////////////////
            //_eventLogService.LogEvent(eventTypeCode, approver, lvProgramEnrollment.ProgramEnrollmentID);
            _eventLogService.LogEvent(eventTypeCode, approver, lvProgramEnrollment);

            /////////////////////////////////////////////////////////////////////
            // Send email notification to student, advising him/her of
            // program enrollment status
            /////////////////////////////////////////////////////////////////////
            lvProgramEnrollment = null;
            lvProgramEnrollment = await _dbContext.ProgramEnrollments
                                  .Where(pe => pe.ProgramEnrollmentID == programEnrollmentID)
                                  .Include(pe => pe.LMSProgram)
                                  .Include(pe => pe.Student)
                                  .Include(pe => pe.EnrollmentStatus)
                                  .AsNoTracking()
                                  .SingleOrDefaultAsync();

            ApplicationUser student = lvProgramEnrollment.Student;
            string          email   = student.Email;
            string          subject = lvProgramEnrollment.LMSProgram.LongName
                                      + " Enrollment Status";
            string message = "Your request to enroll in the "
                             + lvProgramEnrollment.LMSProgram.LongName
                             + " has been "
                             + lvProgramEnrollment.EnrollmentStatus.StatusLabel
                             + ".";

            ////////////////////////////////////////////////////////////////
            // SET BANNER THAT WILL BE DISPLAYED ON THE APPROVER INDEX PAGE
            ////////////////////////////////////////////////////////////////
            StringBuilder bannerMsg = new StringBuilder();

            bannerMsg.Append("Request by ");
            bannerMsg.Append(lvProgramEnrollment.Student.FullName);
            bannerMsg.Append(" to enroll in ");
            bannerMsg.Append(lvProgramEnrollment.LMSProgram.LongName);
            bannerMsg.Append(" has been ");
            bannerMsg.Append(lvProgramEnrollment.EnrollmentStatus.StatusLabel);
            bannerMsg.Append(".");
            HttpContext.Session.SetString(ApproverConstants.STATUS_CHANGE_MODAL_TITLE, lvProgramEnrollment.EnrollmentStatus.StatusCode);
            HttpContext.Session.SetString(ApproverConstants.STATUS_CHANGE_MODAL_TEXT, bannerMsg.ToString());

            ////////////////////////////////////////////////////////////////
            // BUILD EMAIL MESSAGE TO STUDENT
            ////////////////////////////////////////////////////////////////
            if (StatusCodeConstants.APPROVED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                message += "You will receive an additional email from the GSA Learning Academy "
                           + "to finish setting up your account in the GSA Learning Academy "
                           + "and begin the training program";
            }
            if (StatusCodeConstants.DENIED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                message += " <a href='" + MiscConstants.LOGIN_URL + "'>Log-in</a> "
                           + "to the training registration system for more information "
                           + "regarding the denial and request to reenroll in the program..";
            }
            if (StatusCodeConstants.REVOKED.Equals(lvProgramEnrollment.EnrollmentStatus.StatusCode))
            {
                message += " <a href='" + MiscConstants.LOGIN_URL + "'>Log-in</a> "
                           + "to the training registration system for more information "
                           + "regarding the revocation and request to reenroll in the program..";
            }

            await _emailSender.SendEmailAsync(email, subject, message);

            /////////////////////////////////////////////////////////////////
            // Redirect to Approval Index Page
            /////////////////////////////////////////////////////////////////
            return(RedirectToPage("./Index"));
        }