Example #1
0
        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);
                    }
                }
            }
        }
Example #2
0
        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);
        }