public static List <Lessons> GetLessons(string token)
        {
            var    result    = new List <Lessons>();
            string UrlDomain = ConfigurationManager.AppSettings["AbsorbUrlDomain"];
            string Url       = UrlDomain + "Lessons";

            HttpWebRequest request = WebRequest.Create(Url) as HttpWebRequest;

            request.Method      = "GET";
            request.ContentType = "application/json";
            request.Headers.Add("Authorization", token);

            try
            {
                string json;

                // Get response
                //var myWebResponse = request.GetResponse() as HttpWebResponse;
                HttpWebResponse myWebResponse = GetResponse(request);

                // Get the response stream and Deserialize to Employee
                using (StreamReader reader = new StreamReader(myWebResponse.GetResponseStream()))
                {
                    json   = reader.ReadToEnd();
                    result = JsonConvert.DeserializeObject <List <Lessons> >(json);
                };

                return(result);
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at AbsorbAPI.GetLessons: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.WriteToLogError.ToString(), true, DateTime.Now, "");
                throw;
            }
        }
        public static string GetToken()
        {
            //This is actually the CEEC.carollo.com account information.
            Accounts.AbsorbLMS account   = new Accounts.AbsorbLMS();
            string             UrlDomain = ConfigurationManager.AppSettings["AbsorbUrlDomain"];

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            var client = new
                         RestClient(UrlDomain);
            var request = new RestRequest("Authenticate", Method.POST);

            request.AddHeader("Content-Type", "application/json");

            var credentials = new
            {
                account.Username,
                account.Password,
                account.PrivateKey
            };

            request.AddJsonBody(credentials);
            try
            {
                var response = client.Execute(request);
                var content  = response.Content;
                //This removes outer quotes from the token
                var token = content.Trim('"');
                return(token);
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at AbsorbAPI.GetToken: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.WriteToLogError.ToString(), true, DateTime.Now, "");
                throw;
            }
        }
예제 #3
0
        public static void SendErrors(string strError, string strApp)
        {
            //This code sends emails to whomever is set in the Applications table
            //Added Nancy Maze, Christian Varella, and Jorge Cano with Roy Hollis
            var LogActivity = Carollo.GetApplicationActions(USER_NAME);

            if (!Carollo.IsLogSetUpForApp(LogActivity))
            {
                return;
            }

            var body = "The following error was generated by CEEC Data Transfer:" + Environment.NewLine + Environment.NewLine;

            body += strApp + Environment.NewLine + "Error:" + strError + Environment.NewLine + Environment.NewLine;
            body += "See Activity Log for more detail.";

            MailMessage message        = new MailMessage();
            var         emailAddresses = LogActivity[0].NotificatonEmailAddresses.Split(';');

            foreach (string address in emailAddresses)
            {
                message.To.Add(address);
            }

            message.Subject = "CEEC Data Transfer Error: " + DateTime.Now.ToShortDateString();
            message.From    = new MailAddress("*****@*****.**");
            message.Body    = body;
            var smtp = new SmtpClient(ConfigurationManager.AppSettings["EmailHost"]);

            smtp.Send(message);
        }
예제 #4
0
        public static void SendUserNameChanges()
        {
            var LogActivity = Carollo.GetApplicationActions(USER_NAME);

            if (!Carollo.IsLogSetUpForApp(LogActivity))
            {
                return;
            }

            var UserNameChanges = Carollo.GetUserNameChanges();

            if (UserNameChanges.Count > 0 && LogActivity[0].NotificatonEmailAddresses.Length > 3)
            {
                var body = "The following employee user names need to be changed in CEEC :" + Environment.NewLine + Environment.NewLine;
                foreach (Models.NameChanges userNameChange in UserNameChanges)
                {
                    body += "Employee: " + userNameChange.EmpName + Environment.NewLine + "\tHCM email address: " + userNameChange.HCMUserId + Environment.NewLine + "\tCurrent CEEC user name: " + userNameChange.CeecUserId + Environment.NewLine + Environment.NewLine;
                }

                MailMessage message        = new MailMessage();
                var         emailAddresses = LogActivity[0].NotificatonEmailAddresses.Split(';');
                foreach (string address in emailAddresses)
                {
                    message.To.Add(address);
                }

                message.Subject = "CEEC User Names Needing Updating: " + DateTime.Now.ToShortDateString();
                message.From    = new MailAddress("*****@*****.**");
                message.Body    = body;
                var smtp = new SmtpClient(ConfigurationManager.AppSettings["EmailHost"]);

                smtp.Send(message);
            }
        }
        private static HttpWebResponse GetResponse(HttpWebRequest request, bool isToken = false)
        {
            HttpWebResponse response;

            response = null;
            var attemptCount = 1;
            var countLimit   = 3;
            var sleepTime    = 2;

            if (isToken)
            {
                countLimit = 5;
                sleepTime  = 5; //seconds
            }

            while (attemptCount <= countLimit)
            {
                try
                {
                    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
                    //Carollo.WriteToLog("GetResponse: Security Protocol: " + System.Net.ServicePointManager.SecurityProtocol.ToString(), MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
                    response = (HttpWebResponse)request.GetResponse();
                    return(response);
                }
                catch (Exception e)
                {
                    Carollo.WriteToLog("Error at AbsorbAPI.GetResponse: Attempt failed - " + attemptCount.ToString(), MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
                    if (attemptCount >= countLimit && isToken) // only throw the error if the system is attempting to get the token
                    {
                        Carollo.WriteToLog("Error at AbsorbAPI.GetResponse: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.WriteToLogError.ToString(), true, DateTime.Now, "");
                        throw;
                    }

                    System.Threading.Thread.Sleep(sleepTime * 1000);
                }
                finally
                {
                    attemptCount++;
                }
            }

            return(response);
        }
        public static string UpdateEnrollmentCourse(string token, Guid UserId, CourseEnrollment CourseEnrollmentEmployee)
        {
            string jsonString;

            try
            {
                string UrlDomain = ConfigurationManager.AppSettings["AbsorbUrlDomain"];
                string Url       = UrlDomain + "users/" + UserId + "/enrollments";

                HttpWebRequest request = WebRequest.Create(Url) as HttpWebRequest;
                request.Method      = "POST";
                request.ContentType = " text/json";
                request.Headers.Add("Authorization", token);
                request.UserAgent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
                request.Timeout   = 30000; // 30 seconds

                var javaScriptSerializer = new JavaScriptSerializer();
                jsonString = javaScriptSerializer.Serialize(CourseEnrollmentEmployee);

                using (var streamWriter = new StreamWriter(request.GetRequestStream()))
                {
                    streamWriter.Write(jsonString);
                    streamWriter.Flush();
                }

                // Get response
                //HttpWebResponse myWebResponse = (HttpWebResponse)request.GetResponse();
                HttpWebResponse myWebResponse = GetResponse(request);

                // Get the response stream
                using (StreamReader reader = new StreamReader(myWebResponse.GetResponseStream()))
                {
                    jsonString = reader.ReadToEnd();
                };
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at AbsorbAPI.UpdateEnrollmentCourse: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.WriteToLogError.ToString(), true, DateTime.Now, "");
                throw;
            }

            return(jsonString);
        }
        public static string CreateEnrollment(string token, string UserId, string CourseId)
        {
            try
            {
                string UrlDomain = ConfigurationManager.AppSettings["AbsorbUrlDomain"];
                string Url       = UrlDomain + "users/" + UserId + "/enrollments/" + CourseId + "/?reEnroll=true";

                HttpWebRequest request = WebRequest.Create(Url) as HttpWebRequest;
                request.Method      = "POST";
                request.ContentType = " text/json";
                request.Headers.Add("Authorization", token);
                request.UserAgent     = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)";
                request.Timeout       = 30000; // 30 seconds
                request.ContentLength = 0;

                string json;

                // Get response
                //var myWebResponse = request.GetResponse() as HttpWebResponse;
                HttpWebResponse myWebResponse = GetResponse(request);
                if (myWebResponse == null)
                {
                    return("");
                }

                var response = new AddEnrollmentResults();
                // Get the response stream and Deserialize to Employee
                using (StreamReader reader = new StreamReader(myWebResponse.GetResponseStream()))
                {
                    json     = reader.ReadToEnd();
                    response = JsonConvert.DeserializeObject <AddEnrollmentResults>(json);
                };

                return(response.EnrollmentId.ToString());
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at AbsorbAPI.CreateEnrollment: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.WriteToLogError.ToString(), true, DateTime.Now, "");
                throw;
            }
        }
예제 #8
0
        public static void SendCourseShellNotices()
        {
            var LogActivity = Carollo.GetApplicationActions(COURSE_SHELL);

            if (!Carollo.IsLogSetUpForApp(LogActivity))
            {
                return;
            }

            try
            {
                var courseShells = Carollo.GetMissingCourseShells();
                if (courseShells.Count > 0)
                {
                    var body = "The following course shells need to be created in CEEC :" + Environment.NewLine + Environment.NewLine;
                    foreach (Models.CourseShells shell in courseShells)
                    {
                        body += "Vendor: " + shell.Vendor + Environment.NewLine + "\tCourse External Id: " + shell.CourseId + Environment.NewLine + "\tCourse Title: " + shell.CourseName + Environment.NewLine + "\tCredit Hours: " + shell.CreditHours + Environment.NewLine + Environment.NewLine;
                    }
                    MailMessage message        = new MailMessage();
                    var         emailAddresses = LogActivity[0].NotificatonEmailAddresses.Split(';');
                    foreach (string address in emailAddresses)
                    {
                        message.To.Add(address);
                    }

                    message.Subject = "Course Shells For CEEC: " + DateTime.Now.ToShortDateString();
                    message.From    = new MailAddress("*****@*****.**");
                    message.Body    = body;
                    var smtp = new SmtpClient(ConfigurationManager.AppSettings["EmailHost"]);

                    smtp.Send(message);
                }
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at Email.SendCourseShellNotices: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
            }
        }
예제 #9
0
        public static List <RVCourseActivity> GetAccountCourseActivity(int DaysBack)
        {
            var result        = new List <RVCourseActivity>();
            var arrayOfString = String.Empty;
            var account       = new Accounts.RedVectorLMS();
            var endDate       = DateTime.Today.ToString("MM/dd/yyyy");
            var startDate     = DateTime.Now.Date.AddDays(-DaysBack).ToString("MM/dd/yyyy");

            var UrlDomain = ConfigurationManager.AppSettings["RedVectorUrlDomain"];
            //var Url = UrlDomain + "?WebServiceUsername="******"&WebServicePassword="******"&StartDateUtc=11/01/2016&EndDateUtc=12/1/2016&OnlyCompletions=1";
            var Url = UrlDomain + "?WebServiceUsername="******"&WebServicePassword="******"&StartDateUtc=" + startDate + "&EndDateUtc=" + endDate + "&OnlyCompletions=1";

            var request = WebRequest.Create(Url) as HttpWebRequest;

            request.Method  = "GET";
            request.Timeout = 30000; // 30 seconds

            try
            {
                // Get response
                var myWebResponse = request.GetResponse() as HttpWebResponse;

                // Get the response stream and Deserialize to Course Activity
                using (StreamReader reader = new StreamReader(myWebResponse.GetResponseStream()))
                {
                    arrayOfString = reader.ReadToEnd();
                    result        = DeserializeObject(result, arrayOfString);
                };

                return(result);
            }
            catch (Exception e)
            {
                Carollo.WriteToLog("Error at RedVectorAPI.GetAccountCourseActivity: " + e.Message + Environment.NewLine + e.InnerException + Environment.NewLine + e.StackTrace, MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
                throw;
            }
        }
        public static void Process(string Vendor)
        {
            var startDate               = DateTime.Now;
            var processDate             = DateTime.Now;
            int numberOfCoursesReviewed = 0;
            int numberOfCourseShell     = 0;
            int numberOfEnrollments     = 0;
            var vendorName              = Vendor.Replace(" LMS", "");

            try
            {
                var absorbCourses = new List <Courses>();
                var LogActivity   = Carollo.GetApplicationActions(Vendor);

                if (Carollo.IsLogSetUpForApp(LogActivity))
                {
                    // Absorb
                    var    LMSEmployees = new List <LMSEmployees>();
                    string token        = AbsorbAPI.GetToken();
                    if (IsToken(token))
                    {
                        LMSEmployees = AbsorbAPI.GetUsers(token);
                    }
                    else
                    {
                        Carollo.WriteToLog("CEEC token not valid.", MessageType.Text, Vendor, ActionType.SetUpLog.ToString(), true, processDate, vendorName);
                        return;
                    }

                    var Completions = Carollo.GetCourseCompletions(vendorName);
                    if (Completions.Count == 0)
                    {
                        Carollo.WriteToLog("No completion data.", MessageType.Text, Vendor, ActionType.SetUpLog.ToString(), true, processDate, vendorName);
                        return;
                    }

                    // Group users together for user lookups
                    Completions.Sort((x, y) => x.UserName_Email.CompareTo(y.UserName_Email));
                    var currentUserName       = "";
                    var currentUserHasHCMData = false;
                    var currentUserId         = "";

                    var HCMEmployees = new List <HCMEmployees>();
                    HCMEmployees = Carollo.GetEmployees();

                    var userEnrollments    = new List <Enrollments>();
                    var AbsorbUser         = new LMSEmployees();
                    var currentHCMEmployee = new HCMEmployees();

                    foreach (var completion in Completions)
                    {
                        numberOfCoursesReviewed++;

                        if (completion.UserName_Email != currentUserName)
                        {
                            currentUserHasHCMData = false;
                            currentHCMEmployee    = HCMEmployees.Find(item => item.UserName.ToLower() == completion.UserName_Email.ToLower());

                            if (currentHCMEmployee != null)
                            {
                                AbsorbUser = LMSEmployees.Find(item => item.UserName.ToLower() == completion.UserName_Email.ToLower());
                                if (AbsorbUser == null)
                                {
                                    continue;
                                }

                                userEnrollments       = AbsorbAPI.GetUserEnrollments(token, AbsorbUser.Id.Value);
                                currentUserHasHCMData = true;
                                currentUserId         = AbsorbUser.Id.ToString();
                            }
                            else
                            {
                                Carollo.SetCourseCompletionProcessedDate((int)completion.Id);
                                Carollo.WriteToLog("No employee exist in HCM that matches the completion data for user " + completion.UserName_Email + ".", MessageType.Text, Vendor, ActionType.SetUpLog.ToString(), true, processDate, vendorName);
                                continue;
                            }

                            currentUserName = completion.UserName_Email;
                        }

                        if (currentUserHasHCMData)
                        {
                            // fetch data only if needed and only once
                            if (absorbCourses.Count == 0)
                            {
                                absorbCourses = AbsorbAPI.GetCourses(token);
                            }

                            var activityCourse = new Courses();
                            if (absorbCourses.Exists(item => item.ExternalId.ToUpper() == completion.CourseName.ToUpper()))
                            {
                                activityCourse = absorbCourses.Find(item => item.ExternalId.ToUpper() == completion.CourseName.ToUpper());
                            }

                            if (activityCourse.ExternalId != null)
                            {
                                var needsUpdate    = false;
                                var userEnrollment = new Enrollments();
                                if (!userEnrollments.Exists(item => item.CourseId == activityCourse.Id && item.DateCompleted == completion.CompletionDate))
                                {
                                    var enrollment = AbsorbAPI.CreateEnrollment(token, currentUserId, activityCourse.Id.ToString());
                                    if (enrollment == "")
                                    {
                                        continue;
                                    }

                                    Guid enrollmentGuid;
                                    if (Guid.TryParse(enrollment, out enrollmentGuid))
                                    {
                                        numberOfEnrollments++;
                                        needsUpdate    = true;
                                        userEnrollment = new Enrollments {
                                            Id = enrollmentGuid, CourseId = activityCourse.Id, UserId = (Guid)AbsorbUser.Id, IsActive = true, Progress = 1, Score = completion.Score, DateStarted = DateTime.Now, DateCompleted = completion.CompletionDate, TimeSpentTicks = 0, AcceptedTermsAndConditions = false
                                        };
                                        Carollo.WriteToLog("Enrollment succeeded: " + enrollment, MessageType.Text, Carollo.DetermineAction(LogActivity[0], ActionType.UpdateEnrollment.ToString()), true, currentUserId, completion.CourseName, completion.CourseTitle, completion.UserName_Email, vendorName, "");
                                    }
                                    else
                                    {
                                        Carollo.WriteToLog("Enrollment failed.", MessageType.Text, Carollo.DetermineAction(LogActivity[0], ActionType.WriteToLogError.ToString()), true, currentUserId, completion.CourseName, completion.CourseTitle, completion.UserName_Email, vendorName, "");
                                    }
                                }
                                else
                                {
                                    userEnrollment = userEnrollments.Find(item => item.CourseId == activityCourse.Id && item.DateCompleted == completion.CompletionDate);
                                    if (userEnrollment.Status != Status.Complete)
                                    {
                                        needsUpdate = true;
                                    }
                                }

                                if (needsUpdate)
                                {
                                    var CourseEnrollment = ConstructCourseEnrollmentEmployee(userEnrollment);
                                    var UpdateResult     = AbsorbAPI.UpdateEnrollmentCourse(token, (Guid)AbsorbUser.Id, CourseEnrollment);
                                    Carollo.WriteToLog(currentHCMEmployee.NickName + " " + currentHCMEmployee.LastName + " completed " + userEnrollment.CourseName + " results:" + UpdateResult, MessageType.Text, Carollo.DetermineAction(LogActivity[0], ActionType.UpdateEnrollment.ToString()), false, currentHCMEmployee.UserName, userEnrollment.CourseId.ToString(), userEnrollment.CourseName, currentHCMEmployee.EmployeeID, vendorName, "");
                                }

                                Carollo.SetCourseCompletionProcessedDate((int)completion.Id);
                            }
                            else
                            {
                                numberOfCourseShell++;
                                Carollo.WriteToLog("No course shell exist in CEEC that matches the completion data", MessageType.Text, Carollo.DetermineAction(LogActivity[0], ActionType.CourseShell.ToString()), true, currentUserId, completion.CourseName, completion.CourseTitle, completion.UserName_Email, vendorName, "");
                            }
                        }
                        else
                        {
                            Carollo.WriteToLog("No employee exist in HCM that matches the completion data for user " + completion.UserName_Email + ".", MessageType.Text, Vendor, ActionType.SetUpLog.ToString(), true, processDate, vendorName);
                        }
                    }

                    Carollo.WriteToLog("External completion Courses to CEEC results: Courses Reviewed = " + numberOfCoursesReviewed + " - Courses Enrolled = " + numberOfEnrollments + " - Course Shells missing = " + numberOfCourseShell, MessageType.Text, Vendor, ActionType.ExecuteCompleted.ToString(), true, startDate, vendorName);
                }
                else
                {
                    Carollo.WriteToLog("The Log Activity is not setup for this application", MessageType.Text, Vendor, ActionType.SetUpLog.ToString(), true, startDate, vendorName);
                }
            }
            catch (Exception ex)
            {
                Carollo.WriteToLog(ex.StackTrace, MessageType.Text, Vendor, ActionType.WriteToLogError.ToString(), true, startDate, vendorName);
            }
        }
        private void RunService(object sender, ElapsedEventArgs e)
        {
            Carollo.WriteToLog("Starting course processing at " + DateTime.Now.ToString("HH:mm:ss"), MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");

            List <Scheduler> Scheduler = new List <Scheduler>();

            Scheduler = Carollo.GetApplicationScheduler();

            if (Scheduler.Count > 0)
            {
                Carollo.GetEmployeeDataToAbsorb();

                foreach (var scheduler in Scheduler)
                {
                    var executeCourseProcessing = false;

                    // Fetch data for applications that process course data
                    switch (scheduler.ApplicationName)
                    {
                    // Ctec LMS
                    case CTEC_LMS:
                    {
                        Carollo.LoadCtecDataToDB(scheduler.DaysBack);
                        executeCourseProcessing = true;
                        break;
                    }

                    // Red Vector
                    case RED_VECTOR_LMS:
                    {
                        Carollo.LoadRedVectorDataToDB(scheduler.DaysBack);
                        executeCourseProcessing = true;
                        break;
                    }

                    //**************   07/2018 Removed as Lawroom courses are now embeded in CEEC
                    // LawRoom
                    //case LAWROOM_LMS:
                    //    {
                    //        // Loading of external data is a manual process
                    //        executeCourseProcessing = true;
                    //        break;
                    //    }
                    //*************************************************************************************

                    // Bentley
                    case BENTLEY_LMS:
                    {
                        // Loading of external data is a manual process
                        executeCourseProcessing = true;
                        break;
                    }

                    case USER_NAME:
                    {
                        Email.SendUserNameChanges();
                        break;
                    }

                    case COURSE_SHELL:
                    {
                        Email.SendCourseShellNotices();
                        break;
                    }

                    default:
                    {
                        // TODO: Create other application processes as needed and add them to the above list
                        break;
                    }
                    }

                    if (executeCourseProcessing)
                    {
                        CourseProcessing.Process(scheduler.ApplicationName);
                    }

                    Carollo.UpdateApplicationScheduler(scheduler);
                    //Carollo.WriteToLog("Finished course processing at " + DateTime.Now.ToString("HH:mm:ss"), MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
                }
            }
            Carollo.WriteToLog("Finished course processing at " + DateTime.Now.ToString("HH:mm:ss"), MessageType.Text, "System", ActionType.SetUpLog.ToString(), true, DateTime.Now, "");
        }