static void Main(string[] args) { using (var db = new KcsarContext()) { DateTime cutoff = DateTime.Today.AddYears(1); var course = db.TrainingCourses.Single(f => f.DisplayName == "HAM License"); var hams = db.PersonContact.Where(f => f.Type == "hamcall") .Where(f => !f.Person.ComputedAwards.Any(g => g.Expiry > cutoff && g.Course.Id == course.Id)) .Select(f => new { Member = f.Person, Call = f.Value }) .OrderBy(f => f.Member.LastName).ThenBy(f => f.Member.FirstName).ToArray(); foreach (var ham in hams) { Console.WriteLine(ham.Call); var lic = GetLicense(ham.Call); if (lic == null) { Console.WriteLine("!! No license found"); continue; } if (lic.Name.StartsWith(ham.Member.ReverseName, StringComparison.OrdinalIgnoreCase)) { // probably a match Console.WriteLine("Grant HAM to {0}, effective {1:yyyy-MM-dd}, expires {2:yyyy-MM-dd}", ham.Member.FullName, lic.Issued, lic.Expires); TrainingAward ta = new TrainingAward { Completed = lic.Issued, Course = course, Expiry = lic.Expires, Member = ham.Member, metadata = "Via FCC: " + lic.Url, LastChanged = DateTime.Now, ChangedBy = "HamFromFCC" }; db.TrainingAward.Add(ta); db.SaveChanges(); db.RecalculateTrainingAwards(ham.Member.Id); db.SaveChanges(); } else { Console.WriteLine("Can't match names: {0} :: {1}", lic.Name, ham.Member.ReverseName); } } } }
public TrainingAwardView Post([FromBody] TrainingAwardView view) { log.DebugFormat("POST {0} {1} {2}", Request.RequestUri, User.Identity.Name, JsonConvert.SerializeObject(view)); if (!User.IsInRole("cdb.trainingeditors")) { ThrowAuthError(); } // if (!Permissions.IsAdmin && !Permissions.IsSelf(view.MemberId) && !Permissions.IsMembershipForPerson(view.MemberId)) return GetAjaxLoginError<MemberContactView>(null); List <SubmitError> errors = new List <SubmitError>(); if (view.Member.Id == Guid.Empty) { ThrowSubmitErrors(new[] { new SubmitError { Error = Strings.API_Required, Property = "Member" } }); } TrainingAward model; model = (from a in db.TrainingAward.Include("Member").Include("Course") where a.Id == view.ReferenceId select a).FirstOrDefault(); if (model == null) { model = new TrainingAward(); model.Member = db.Members.Where(f => f.Id == view.Member.Id).FirstOrDefault(); if (model.Member == null) { errors.Add(new SubmitError { Property = "Member", Error = Strings.API_NotFound }); ThrowSubmitErrors(errors); } db.TrainingAward.Add(model); } try { model.UploadsPending = (view.PendingUploads > 0); DateTime completed; if (string.IsNullOrWhiteSpace(view.Completed)) { errors.Add(new SubmitError { Property = "Completed", Error = Strings.API_Required }); } else if (!DateTime.TryParse(view.Completed, out completed)) { errors.Add(new SubmitError { Error = Strings.API_InvalidDate, Property = "Completed" }); } else { model.Completed = completed; } if (model.metadata != view.Comments) { model.metadata = view.Comments; } if (model.Member.Id != view.Member.Id) { throw new InvalidOperationException("Don't know how to change member yet"); } if (view.Course.Id == null) { errors.Add(new SubmitError { Error = Strings.API_Required, Id = new[] { view.ReferenceId }, Property = "Course" }); } else if (model.Course == null || model.Course.Id != view.Course.Id) { model.Course = (from c in db.TrainingCourses where c.Id == view.Course.Id select c).First(); } switch (view.ExpirySrc) { case "default": model.Expiry = model.Course.ValidMonths.HasValue ? model.Completed.AddMonths(model.Course.ValidMonths.Value) : (DateTime?)null; break; case "custom": if (!string.IsNullOrWhiteSpace(view.Expires)) { model.Expiry = DateTime.Parse(view.Expires); } else { errors.Add(new SubmitError { Error = Strings.API_TrainingRecord_CustomExpiryRequired, Property = "Expiry", Id = new[] { view.ReferenceId } }); } break; case "never": model.Expiry = null; break; } // Documentation required. if (!model.UploadsPending && string.IsNullOrWhiteSpace(model.metadata)) { errors.Add(new SubmitError { Error = Strings.API_TrainingRecord_DocumentationRequired, Property = BaseApiController.ModelRootNodeName }); } // Prevent duplicate records if (db.TrainingAward.Where(f => f.Id != model.Id && f.Completed == model.Completed && f.Course.Id == model.Course.Id && f.Member.Id == model.Member.Id).Count() > 0) { ThrowSubmitErrors(new[] { new SubmitError { Error = Strings.API_TrainingRecord_Duplicate, Id = new[] { model.Id }, Property = BaseApiController.ModelRootNodeName } }); } if (errors.Count == 0) { db.SaveChanges(); db.RecalculateTrainingAwards(model.Member.Id); db.SaveChanges(); } view.ReferenceId = model.Id; view.Course.Title = model.Course.DisplayName; } catch (RuleViolationsException ex) { foreach (RuleViolation v in ex.Errors) { errors.Add(new SubmitError { Error = v.ErrorMessage, Property = v.PropertyName, Id = new[] { v.EntityKey } }); } // throw new InvalidOperationException("TODO: report errors"); } if (errors.Count > 0) { ThrowSubmitErrors(errors); } return(view); }