/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute( Model.WorkflowAction action, Object entity, out List<string> errorMessages ) { var checkInState = GetCheckInState( entity, out errorMessages ); if (checkInState != null) { using ( new Rock.Data.UnitOfWorkScope() ) { var personService = new PersonService(); var memberService = new GroupMemberService(); IQueryable<Person> people = null; if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_PHONE_NUMBER ) ) ) { people = personService.GetByPhonePartial( checkInState.CheckIn.SearchValue ); } else if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_NAME ) ) ) { people = personService.GetByFullName( checkInState.CheckIn.SearchValue ); } else { errorMessages.Add( "Invalid Search Type" ); return false; } foreach ( var person in people.ToList() ) { foreach ( var group in person.Members.Where( m => m.Group.GroupType.Guid == new Guid( SystemGuid.GroupType.GROUPTYPE_FAMILY ) ).Select( m => m.Group ).ToList() ) { var family = checkInState.CheckIn.Families.Where( f => f.Group.Id == group.Id ).FirstOrDefault(); if ( family == null ) { family = new CheckInFamily(); family.Group = group.Clone( false ); family.Group.LoadAttributes(); family.Caption = group.ToString(); family.SubCaption = memberService.GetFirstNames( group.Id ).ToList().AsDelimited( ", " ); checkInState.CheckIn.Families.Add( family ); } } } return true; } } errorMessages.Add( "Invalid Check-in State" ); return false; }
/// <summary> /// Shows the Edit Family block in Edit Family mode /// </summary> /// <param name="checkInFamily">The check in family.</param> public abstract void ShowEditFamily(CheckInFamily checkInFamily);
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute( RockContext rockContext, Model.WorkflowAction action, Object entity, out List<string> errorMessages ) { var checkInState = GetCheckInState( entity, out errorMessages ); if ( checkInState != null ) { var personService = new PersonService( rockContext ); var memberService = new GroupMemberService( rockContext ); Guid familyGroupTypeGuid = SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid(); if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_PHONE_NUMBER ) ) ) { string numericPhone = checkInState.CheckIn.SearchValue.AsNumeric(); var personRecordTypeId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id; // Find the families with any member who has a phone number that contains selected value var familyQry = memberService .Queryable().AsNoTracking() .Where( m => m.Group.GroupType.Guid.Equals( familyGroupTypeGuid ) && m.Person.RecordTypeValueId == personRecordTypeId && m.Person.PhoneNumbers.Any( n => n.Number.Contains( numericPhone ) ) ) .Select( m => m.GroupId ) .Distinct(); int maxResults = GetAttributeValue( action, "MaxResults" ).AsInteger(); if ( maxResults > 0 ) { familyQry = familyQry.Take( maxResults ); } var familyIds = familyQry.ToList(); // Load the family members var familyMembers = memberService .Queryable( "Group,GroupRole,Person" ).AsNoTracking() .Where( m => familyIds.Contains(m.GroupId) ) .ToList(); // Add each family foreach ( int familyId in familyIds ) { // Get each of the members for this family var thisFamilyMembers = familyMembers .Where( m => m.GroupId == familyId && m.Person.NickName != null ) .ToList(); if ( thisFamilyMembers.Any() ) { var group = thisFamilyMembers .Select( m => m.Group ) .FirstOrDefault(); var firstNames = thisFamilyMembers .OrderBy( m => m.GroupRole.Order ) .ThenBy( m => m.Person.BirthYear ) .ThenBy( m => m.Person.BirthMonth ) .ThenBy( m => m.Person.BirthDay ) .ThenBy( m => m.Person.Gender ) .Select( m => m.Person.NickName ) .ToList(); var family = new CheckInFamily(); family.Group = group.Clone( false ); family.Caption = group.ToString(); family.SubCaption = firstNames.AsDelimited( ", " ); checkInState.CheckIn.Families.Add( family ); } } } else if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_NAME ) ) ) { foreach ( var person in personService.GetByFullName( checkInState.CheckIn.SearchValue, false ) ) { foreach ( var group in person.Members.Where( m => m.Group.GroupType.Guid.Equals( familyGroupTypeGuid ) ).Select( m => m.Group ).ToList() ) { var family = checkInState.CheckIn.Families.Where( f => f.Group.Id == group.Id ).FirstOrDefault(); if ( family == null ) { family = new CheckInFamily(); family.Group = group.Clone( false ); family.Group.LoadAttributes( rockContext ); family.Caption = group.ToString(); family.SubCaption = memberService.GetFirstNames( group.Id ).ToList().AsDelimited( ", " ); checkInState.CheckIn.Families.Add( family ); } } } } else { errorMessages.Add( "Invalid Search Type" ); return false; } return true; } errorMessages.Add( "Invalid Check-in State" ); return false; }
/// <summary> /// Executes the specified workflow. /// </summary> /// <param name="rockContext">The rock context.</param> /// <param name="action">The workflow action.</param> /// <param name="entity">The entity.</param> /// <param name="errorMessages">The error messages.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public override bool Execute( RockContext rockContext, Model.WorkflowAction action, Object entity, out List<string> errorMessages ) { var checkInState = GetCheckInState( entity, out errorMessages ); if ( checkInState != null && checkInState.CheckIn.SearchType != null ) { var personService = new PersonService( rockContext ); var memberService = new GroupMemberService( rockContext ); GroupService groupService = new GroupService( rockContext ); PhoneNumberService phoneNumberService = new PhoneNumberService( rockContext ); int familyGroupTypeId = GroupTypeCache.Read( Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid() ).Id; var dvInactive = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_STATUS_INACTIVE.AsGuid() ); if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_PHONE_NUMBER ) ) ) { string numericPhone = checkInState.CheckIn.SearchValue.AsNumeric(); var personRecordTypeId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id; // Find the families with any member who has a phone number that contains selected value var familyQry = phoneNumberService.Queryable().AsNoTracking(); if ( checkInState.CheckInType == null || checkInState.CheckInType.PhoneSearchType == PhoneSearchType.EndsWith ) { char[] charArray = numericPhone.ToCharArray(); Array.Reverse( charArray ); familyQry = familyQry.Where( o => o.NumberReversed.StartsWith( new string( charArray ) ) ); } else { familyQry = familyQry.Where( o => o.Number.Contains( numericPhone ) ); } var tmpQry = familyQry.Join( personService.Queryable().AsNoTracking(), o => new { PersonId = o.PersonId, IsDeceased = false, RecordTypeValueId = personRecordTypeId }, p => new { PersonId = p.Id, IsDeceased = p.IsDeceased, RecordTypeValueId = p.RecordTypeValueId.Value }, ( pn, p ) => new { Person = p, PhoneNumber = pn } ) .Join( memberService.Queryable().AsNoTracking(), pn => pn.Person.Id, m => m.PersonId, ( o, m ) => new { PersonNumber = o.PhoneNumber, GroupMember = m } ); var familyIdQry = groupService.Queryable().Where( g => tmpQry.Any( o => o.GroupMember.GroupId == g.Id ) && g.GroupTypeId == familyGroupTypeId ) .Select( g => g.Id ) .Distinct(); int maxResults = checkInState.CheckInType != null ? checkInState.CheckInType.MaxSearchResults : 100; if ( maxResults > 0 ) { familyIdQry = familyIdQry.Take( maxResults ); } var familyIds = familyIdQry.ToList(); // Load the family members var familyMembers = memberService .Queryable( "Group,GroupRole,Person" ).AsNoTracking() .Where( m => familyIds.Contains( m.GroupId ) ) .ToList(); // Add each family foreach ( int familyId in familyIds ) { // Get each of the members for this family var familyMemberQry = familyMembers .Where( m => m.GroupId == familyId && m.Person.NickName != null ); if ( checkInState.CheckInType != null && checkInState.CheckInType.PreventInactivePeopele && dvInactive != null ) { familyMemberQry = familyMemberQry .Where( m => m.Person.RecordStatusValueId != dvInactive.Id ); } var thisFamilyMembers = familyMemberQry.ToList(); if ( thisFamilyMembers.Any() ) { var group = thisFamilyMembers .Select( m => m.Group ) .FirstOrDefault(); var firstNames = thisFamilyMembers .OrderBy( m => m.GroupRole.Order ) .ThenBy( m => m.Person.BirthYear ) .ThenBy( m => m.Person.BirthMonth ) .ThenBy( m => m.Person.BirthDay ) .ThenBy( m => m.Person.Gender ) .Select( m => m.Person.NickName ) .ToList(); var family = new CheckInFamily(); family.Group = group.Clone( false ); family.Caption = group.ToString(); family.SubCaption = firstNames.AsDelimited( ", " ); checkInState.CheckIn.Families.Add( family ); } } } else if ( checkInState.CheckIn.SearchType.Guid.Equals( new Guid( SystemGuid.DefinedValue.CHECKIN_SEARCH_TYPE_NAME ) ) ) { var people = personService.GetByFullName( checkInState.CheckIn.SearchValue, false ).AsNoTracking(); if ( checkInState.CheckInType != null && checkInState.CheckInType.PreventInactivePeopele && dvInactive != null ) { people = people.Where( p => p.RecordStatusValueId != dvInactive.Id ); } foreach ( var person in people ) { foreach ( var group in person.Members.Where( m => m.Group.GroupTypeId == familyGroupTypeId ).Select( m => m.Group ).ToList() ) { var family = checkInState.CheckIn.Families.Where( f => f.Group.Id == group.Id ).FirstOrDefault(); if ( family == null ) { family = new CheckInFamily(); family.Group = group.Clone( false ); family.Group.LoadAttributes( rockContext ); family.Caption = group.ToString(); if ( checkInState.CheckInType == null || !checkInState.CheckInType.PreventInactivePeopele ) { family.SubCaption = memberService.GetFirstNames( group.Id ).ToList().AsDelimited( ", " ); } else { family.SubCaption = memberService.GetFirstNames( group.Id, false, false ).ToList().AsDelimited( ", " ); } checkInState.CheckIn.Families.Add( family ); } } } } else { errorMessages.Add( "Invalid Search Type" ); return false; } return true; } errorMessages.Add( "Invalid Check-in State" ); return false; }
/// <summary> /// Adds the visitor group member roles. /// </summary> /// <param name="family">The family.</param> /// <param name="personId">The person id.</param> protected void AddVisitorGroupMemberRoles( CheckInFamily family, int personId ) { var rockContext = new RockContext(); var groupService = new GroupService( rockContext ); var groupMemberService = new GroupMemberService( rockContext ); var groupRoleService = new GroupTypeRoleService( rockContext ); int ownerRoleId = groupRoleService.Get( new Guid( Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_OWNER ) ).Id; int canCheckInId = groupRoleService.Get( new Guid( Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_CAN_CHECK_IN ) ).Id; foreach ( var familyMember in family.People ) { var group = groupMemberService.Queryable() .Where( m => m.PersonId == familyMember.Person.Id && m.GroupRoleId == ownerRoleId ) .Select( m => m.Group ) .FirstOrDefault(); if ( group == null ) { var role = new GroupTypeRoleService( rockContext ).Get( ownerRoleId ); if ( role != null && role.GroupTypeId.HasValue ) { var groupMember = new GroupMember(); groupMember.PersonId = familyMember.Person.Id; groupMember.GroupRoleId = role.Id; group = new Group(); group.Name = role.GroupType.Name; group.GroupTypeId = role.GroupTypeId.Value; group.Members.Add( groupMember ); groupService.Add( group ); } } // add the visitor to this group with CanCheckIn Person.CreateCheckinRelationship( familyMember.Person.Id, personId, CurrentPersonAlias ); } rockContext.SaveChanges(); }
/// <summary> /// Handles the Click event of the lbAddSearchedForPerson control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void lbSavePerson_Click( object sender, EventArgs e ) { if ( string.IsNullOrEmpty( tbFirstNameSearch.Text ) || string.IsNullOrEmpty( tbLastNameSearch.Text ) || string.IsNullOrEmpty( dpDOBSearch.Text ) || ddlGenderSearch.SelectedValueAsInt() == 0 ) { // modal takes care of the validation Page.Validate( "Person" ); mpeAddPerson.Show(); } else { var checkInFamily = CurrentCheckInState.CheckIn.Families.Where( f => f.Selected ).FirstOrDefault(); if ( checkInFamily == null ) { checkInFamily = new CheckInFamily(); var familyGroup = CreateFamily( tbLastNameSearch.Text ); checkInFamily.Group = familyGroup; checkInFamily.Caption = familyGroup.Name; } var checkInPerson = new CheckInPerson(); checkInPerson.Person = CreatePerson( tbFirstNameSearch.Text, tbLastNameSearch.Text, dpDOBSearch.SelectedDate, (int)ddlGenderSearch.SelectedValueAsEnum<Gender>(), ddlAbilitySearch.SelectedValue, ddlAbilitySearch.SelectedItem.Attributes["optiongroup"] ); if ( personVisitorType.Value != "Visitor" ) { // Family Member var groupMember = AddGroupMember( checkInFamily.Group.Id, checkInPerson.Person ); checkInPerson.FamilyMember = true; hfSelectedPerson.Value += checkInPerson.Person.Id + ","; } else { // Visitor AddVisitorGroupMemberRoles( checkInFamily, checkInPerson.Person.Id ); checkInPerson.FamilyMember = false; hfSelectedVisitor.Value += checkInPerson.Person.Id + ","; } checkInPerson.Selected = true; checkInFamily.People.Add( checkInPerson ); checkInFamily.SubCaption = string.Join( ",", checkInFamily.People.Select( p => p.Person.FirstName ) ); checkInFamily.Selected = true; CurrentCheckInState.CheckIn.Families.Add( checkInFamily ); tbFirstNameSearch.Required = false; tbLastNameSearch.Required = false; ddlGenderSearch.Required = false; dpDOBSearch.Required = false; ProcessFamily(); } }
/// <summary> /// Handles the Click event of the lbAddFamilySave control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="EventArgs"/> instance containing the event data.</param> protected void lbSaveFamily_Click( object sender, EventArgs e ) { var newFamilyList = (List<NewPerson>)ViewState["newFamily"]; var checkInFamily = new CheckInFamily(); CheckInPerson checkInPerson; NewPerson newPerson; // add the new people foreach ( ListViewItem item in lvAddFamily.Items ) { newPerson = new NewPerson(); newPerson.FirstName = ( (TextBox)item.FindControl( "tbFirstName" ) ).Text; newPerson.LastName = ( (TextBox)item.FindControl( "tbLastName" ) ).Text; newPerson.BirthDate = ( (DatePicker)item.FindControl( "dpBirthDate" ) ).SelectedDate; newPerson.Gender = ( (RockDropDownList)item.FindControl( "ddlGender" ) ).SelectedValueAsEnum<Gender>(); newPerson.Ability = ( (RockDropDownList)item.FindControl( "ddlAbilityGrade" ) ).SelectedValue; newPerson.AbilityGroup = ( (RockDropDownList)item.FindControl( "ddlAbilityGrade" ) ).SelectedItem.Attributes["optiongroup"]; newFamilyList.Add( newPerson ); } var lastName = newFamilyList.Where( p => p.BirthDate.HasValue ).OrderBy( p => p.BirthDate ).Select( p => p.LastName ).FirstOrDefault(); var familyGroup = CreateFamily( lastName ); // create people and add to checkin foreach ( NewPerson np in newFamilyList.Where( np => np.IsValid() ) ) { var person = CreatePerson( np.FirstName, np.LastName, np.BirthDate, (int)np.Gender, np.Ability, np.AbilityGroup ); var groupMember = AddGroupMember( familyGroup.Id, person ); familyGroup.Members.Add( groupMember ); checkInPerson = new CheckInPerson(); checkInPerson.Person = person; checkInPerson.Selected = true; checkInPerson.FamilyMember = true; checkInFamily.People.Add( checkInPerson ); } checkInFamily.Group = familyGroup; checkInFamily.Caption = familyGroup.Name; checkInFamily.SubCaption = string.Join( ",", checkInFamily.People.Select( p => p.Person.FirstName ) ); checkInFamily.Selected = true; CurrentCheckInState.CheckIn.Families.Clear(); CurrentCheckInState.CheckIn.Families.Add( checkInFamily ); ProcessFamily(); RefreshFamily(); }