/// <summary> /// Constructor - will generate a ResultDTO object from a database record. /// </summary> /// <param name="eSR">A database record of the e-Learning result.</param> public ResultDTO(ESRModules eSR) { this.Id = eSR.ID; this.PersonId = eSR.Employee; this.UserName = eSR.UserName; if (eSR.StaffID != null) { this.PersonName = eSR.Staff.Fname + " " + eSR.Staff.Sname; } this.CourseId = eSR.CourseID; if (eSR.CourseID != null) { this.CourseDesc = eSR.Course.CourseName; } this.ModuleName = eSR.ModuleName; this.CompletionDate = eSR.CompletionDate; this.FromADAcc = eSR.Source; this.Received = eSR.Received; this.Processed = eSR.Processed; this.Comments = eSR.Comments; }
public async Task <IHttpActionResult> PostELResult(NewResultDTO eLResult) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } ESRModules result = new ESRModules() { Employee = eLResult.Employee ?? -1, UserName = eLResult.UserName, ModuleName = eLResult.ModuleName, CompletionDate = eLResult.CompletionDate, Source = eLResult.Source, Processed = false }; if (string.IsNullOrWhiteSpace(result.Source)) { result.Source = User.Identity.Name; } db.ESRs.Add(result); await db.SaveChangesAsync(); await ProcessResultAsync(result); //Make sure Staff and Course details are in memory if (result.StaffID != null) { var person = await db.People.SingleOrDefaultAsync(p => p.ID == result.StaffID); } if (result.CourseID != null) { var person = await db.Courses.SingleOrDefaultAsync(c => c.ID == result.CourseID); } return(CreatedAtRoute("DefaultApi", new { id = result.ID }, new ResultDTO(result))); }
/// <summary> /// Attempts to process the E-learning result and update the associated requirement if found. /// Updated to processed field to true if sucessful, otherwise will update the comment field /// to reflect the reason the processing failed. /// </summary> /// <param name="eLResult">The E-Learning Result</param> /// <returns>nothing</returns> private async Task ProcessResultAsync(ESRModules eLResult) { if (eLResult.StaffID == null) { List <string> errors = new List <string>(); if (eLResult.Employee > 0) { //Find Person var person = await db.People.SingleOrDefaultAsync(p => p.ESRID == eLResult.Employee); if (person == null) { errors.Add($"Unable to find staff member matching employee number {eLResult.Employee}"); } else { eLResult.StaffID = person.ID; } } if (!string.IsNullOrWhiteSpace(eLResult.UserName) && eLResult.StaffID == null) { try { var person = await db.People.SingleOrDefaultAsync(p => p.EMail == eLResult.UserName); if (person == null) { errors.Add($"Unable to find staff member with E-Mail: {eLResult.UserName}"); } else { eLResult.StaffID = person.ID; } } catch (InvalidOperationException) { errors.Add($"Multiple Staff records have E-Mail address: {eLResult.UserName}"); } } if (string.IsNullOrWhiteSpace(eLResult.UserName) && eLResult.Employee <= 0) { errors.Add("No data items to identify staff member present in data!"); } if (eLResult.StaffID == null) { eLResult.Comments = string.Join(", ", errors); await db.SaveChangesAsync(); return; } } if (eLResult.CourseID == null) { //Find Course var map = await db.CourseMaps.SingleOrDefaultAsync(c => c.ModuleName == eLResult.ModuleName); if (map == null) { var course = await db.Courses.SingleOrDefaultAsync(c => c.CourseName == eLResult.ModuleName); if (course == null) { eLResult.Comments = $"Unable to find course matching {eLResult.ModuleName}"; await db.SaveChangesAsync(); return; } eLResult.CourseID = course.ID; } else { eLResult.CourseID = map.CourseID; } } //Find Requirement var req = await db.Requirements.SingleOrDefaultAsync(r => r.Staff == eLResult.StaffID && r.Course == eLResult.CourseID); if (req == null) { eLResult.Comments = "Staff member does not have requirement for course."; await db.SaveChangesAsync(); return; } //Update Requirement if (eLResult.CompletionDate != null) { req.Status = (short)5; req.Comments = "Course completed via e-learning."; } else { eLResult.Comments = "No Completion Date included in message"; await db.SaveChangesAsync(); return; } //Update Result eLResult.Processed = true; eLResult.Comments += string.Format(" Processed: {0:d}", DateTime.Now); await db.SaveChangesAsync(); }