public async Task <ActionResult> Search(SearchPersonModel model)
        {
            List <Person> persons = new List <Person>();

            if (!String.IsNullOrWhiteSpace(model.Email))
            {
                //search by email
                PersonListOptions options = new PersonListOptions()
                {
                    Email = model.Email
                };
                persons = await ArenaAPIHelper.GetPersons(options);
            }
            else if (!String.IsNullOrWhiteSpace(model.PhoneNumber))
            {
                //search by phone
                PersonListOptions options = new PersonListOptions()
                {
                    PhoneNumber = ValidationHelper.CleanPhoneNumber(model.PhoneNumber)
                };
                persons = await ArenaAPIHelper.GetPersons(options);
            }

            return(PartialView("_persons", persons));
        }
        public async Task <ActionResult> AddChildren(int id)
        {
            if (id == default(int))
            {
                RedirectToAction("New");
            }

            AddChildrenViewModel viewModel = new AddChildrenViewModel();

            viewModel.AddChildrenModel = new AddChildrenModel();

            Person person = await ArenaAPIHelper.GetPerson(id);

            viewModel.ExistingFamilyMembers = await ArenaAPIHelper.GetFamily(person.FamilyId);

            viewModel.AddChildrenModel.Adult    = person;
            viewModel.AddChildrenModel.Children = new List <Member>();
            viewModel.AddChildrenModel.Children.Add(new Member());

            return(View(viewModel));
        }
        public async Task <ActionResult> New(NewFamilyModel NewFamilyModel)
        {
            //we need to validate the data server side
            if (NewFamilyModel.NewFamilyMembers.Any(x => !x.AdultIsValid))
            {
                ModelState.AddModelError("", "Every family member requires a valid first name, last name, email and phone number.");
            }

            //ensure at least 1 person is being added
            if (NewFamilyModel.NewFamilyMembers.Count == 0)
            {
                ModelState.AddModelError("", "At least 1 family member is required to register a family.");
            }

            //check the email addresses and phone numbers
            foreach (var member in NewFamilyModel.NewFamilyMembers)
            {
                Boolean isValid = true;
                if (!ValidationHelper.IsValidEmail(member.Email))
                {
                    ModelState.AddModelError("", String.Format("{0} is not a valid email address", member.Email)); isValid = false;
                }
                if (!ValidationHelper.IsValidPhone(ValidationHelper.CleanPhoneNumber(member.PhoneNumber)))
                {
                    ModelState.AddModelError("", String.Format("{0} is not a valid phone number", member.PhoneNumber)); isValid = false;
                }

                if (isValid)
                {
                    //lets just verify this email doesn't already exist in the system, if it does, we should redirect
                    List <Person> personsFound = await ArenaAPIHelper.GetPersons(new PersonListOptions { Email = member.Email });

                    if (personsFound.Count > 0)
                    {
                        return(RedirectToAction("Find", new { email = member.Email }));
                    }
                }
            }



            if (!ModelState.IsValid)
            {
                NewFamilyViewModel viewModel = new NewFamilyViewModel();
                viewModel.Campuses       = GetCampuses();
                viewModel.States         = GetStates();
                viewModel.NewFamilyModel = NewFamilyModel;

                return(View(viewModel));
            }

            //add the first person
            Person requiredAdult = MemberHelper.GetAdultPersonFromMember(NewFamilyModel.NewFamilyMembers.First(), (Campus)NewFamilyModel.CampusId);

            requiredAdult.Addresses = new List <Address> {
                NewFamilyModel.Address
            };

            ArenaPostResult result = await ArenaAPIHelper.AddPerson(requiredAdult);

            if (result.WasSuccessful)
            {
                //we need the familyId
                requiredAdult = await ArenaAPIHelper.GetPerson(result.ObjectId);

                for (int i = 1; i < NewFamilyModel.NewFamilyMembers.Count; i++)
                {
                    Person additonalAdult = MemberHelper.GetAdultPersonFromMember(NewFamilyModel.NewFamilyMembers[i], (Campus)NewFamilyModel.CampusId);

                    additonalAdult.FamilyId  = requiredAdult.FamilyId;
                    additonalAdult.Addresses = requiredAdult.Addresses;

                    result = await ArenaAPIHelper.AddPerson(additonalAdult);
                }

                return(RedirectToAction("AddChildren", new { id = requiredAdult.PersonId }));
            }

            return(RedirectToAction("Index"));
        }
        public async Task <ActionResult> AddChildren(AddChildrenModel AddChildrenModel)
        {
            RegistrationCompleteViewModel viewModel = new RegistrationCompleteViewModel();

            viewModel.ChildrenAdded = AddChildrenModel.Children;
            viewModel.Adult         = AddChildrenModel.Adult;

            if (AddChildrenModel.Children == null || AddChildrenModel.Children.Count == 0)
            {
                //family opted to not add any children
                return(View("RegistrationComplete", viewModel));
            }

            //we need to validate the data server side
            if (AddChildrenModel.Children.Any(x => !x.ChildIsValid))
            {
                ModelState.AddModelError("", "Every child family member requires a valid first name, last name, birthdate and gender.");
            }

            if (!ModelState.IsValid)
            {
                AddChildrenViewModel addChildviewModel = new AddChildrenViewModel();
                addChildviewModel.AddChildrenModel.Adult = AddChildrenModel.Adult;
                addChildviewModel.AddChildrenModel       = AddChildrenModel;
                return(View(viewModel));
            }

            Person adult = await ArenaAPIHelper.GetPerson(AddChildrenModel.Adult.PersonId);

            viewModel.Adult = adult;

            //everything looks good, lets add the kids to the family
            foreach (var child in AddChildrenModel.Children)
            {
                Person familyChild = MemberHelper.GetChildPersonFromMember(child, (Campus)adult.CampusId);
                familyChild.Addresses  = adult.Addresses;
                familyChild.FamilyId   = adult.FamilyId;
                familyChild.FamilyName = adult.FamilyName;
                familyChild.Phones     = adult.Phones;
                ArenaPostResult result = await ArenaAPIHelper.AddPerson(familyChild);

                if (!result.WasSuccessful)
                {
                    //stop processing and report error
                    return(View("Error", new HandleErrorInfo(new Exception("API request to add child failed."), "Home", "AddChildren")));
                }

                int newPersonId = result.ObjectId;

                //add to group
                result = await ArenaAPIHelper.AddPersonToGroup(newPersonId, ((Campus)adult.CampusId == Campus.Brownsboro)?(int)VisitorGroups.BrownsboroVisitors : (int)VisitorGroups.CliftonVisitors);

                if (!result.WasSuccessful)
                {
                    //stop processing and report error
                    return(View("Error", new HandleErrorInfo(new Exception("API request to add child to group failed."), "Home", "AddChildren")));
                }

                //add grade note
                result = await ArenaAPIHelper.AddPersonNote(newPersonId, child.Grade);

                if (!result.WasSuccessful)
                {
                    //stop processing and report error
                    return(View("Error", new HandleErrorInfo(new Exception("API request to add grade to child failed."), "Home", "AddChildren")));
                }
            }

            return(View("RegistrationComplete", viewModel));
        }