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; } }
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; } }
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, ""); } }
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, ""); }