/// <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 family = checkInState.CheckIn.Families.Where( f => f.Selected ).FirstOrDefault(); if ( family != null ) { var service = new GroupMemberService( rockContext ); foreach ( var groupMember in service.GetByGroupId( family.Group.Id ).AsNoTracking().ToList() ) { if ( !family.People.Any( p => p.Person.Id == groupMember.PersonId ) ) { var person = new CheckInPerson(); person.Person = groupMember.Person.Clone( false ); person.FamilyMember = true; family.People.Add( person ); } } return true; } else { errorMessages.Add( "There is not a family that is selected" ); } return false; } 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 ) { var family = checkInState.CheckIn.CurrentFamily; if ( family != null ) { var service = new GroupMemberService( rockContext ); var people = service.GetByGroupId( family.Group.Id ).AsNoTracking(); if ( checkInState.CheckInType != null && checkInState.CheckInType.PreventInactivePeopele ) { var dvInactive = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_STATUS_INACTIVE.AsGuid() ); if ( dvInactive != null ) { people = people.Where( m => m.Person.RecordStatusValueId != dvInactive.Id ); } } foreach ( var groupMember in people.ToList() ) { if ( !family.People.Any( p => p.Person.Id == groupMember.PersonId ) ) { var person = new CheckInPerson(); person.Person = groupMember.Person.Clone( false ); person.FamilyMember = true; family.People.Add( person ); } } return true; } else { errorMessages.Add( "There is not a family that is selected" ); } return false; } 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 ) { string cacheKey = "Rock.FindRelationships.Roles"; ObjectCache cache = Rock.Web.Cache.RockMemoryCache.Default; List<int> roles = cache[cacheKey] as List<int>; if ( roles == null ) { roles = new List<int>(); foreach ( var role in new GroupTypeRoleService( rockContext ).Queryable() .Where( r => r.GroupType.Guid.Equals( new Guid( Rock.SystemGuid.GroupType.GROUPTYPE_KNOWN_RELATIONSHIPS ) ) ) ) { role.LoadAttributes( rockContext ); if ( role.Attributes.ContainsKey( "CanCheckin" ) ) { bool canCheckIn = false; if ( bool.TryParse( role.GetAttributeValue( "CanCheckin" ), out canCheckIn ) && canCheckIn ) { roles.Add( role.Id ); } } } CacheItemPolicy cacheItemPolicy = new CacheItemPolicy(); cacheItemPolicy.AbsoluteExpiration = DateTimeOffset.Now.AddSeconds( 300 ); cache.Set( cacheKey, roles, cacheItemPolicy ); } var checkInState = GetCheckInState( entity, out errorMessages ); if ( checkInState != null ) { if ( !roles.Any() ) { return true; } var family = checkInState.CheckIn.Families.Where( f => f.Selected ).FirstOrDefault(); if ( family != null ) { var service = new GroupMemberService( rockContext ); var familyMemberIds = family.People.Select( p => p.Person.Id ).ToList(); // Get the Known Relationship group id's for each person in the family var relationshipGroups = service.Queryable() .Where( g => g.GroupRole.Guid.Equals( new Guid( Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_OWNER ) ) && familyMemberIds.Contains( g.PersonId ) ) .Select( g => g.GroupId ) .ToList(); // Get anyone in any of those groups that has a role with the canCheckIn attribute set foreach ( var person in service.Queryable() .Where( g => relationshipGroups.Contains( g.GroupId ) && roles.Contains( g.GroupRoleId ) ) .Select( g => g.Person ) .Distinct().ToList() ) { if ( !family.People.Any( p => p.Person.Id == person.Id ) ) { var relatedPerson = new CheckInPerson(); relatedPerson.Person = person.Clone( false ); relatedPerson.FamilyMember = false; family.People.Add( relatedPerson ); } } return true; } else { errorMessages.Add( "There is not a family that is selected" ); } return false; } return false; }
/// <summary> /// Handles the RowCommand event of the grdPersonSearchResults control. /// </summary> /// <param name="sender">The source of the event.</param> /// <param name="e">The <see cref="GridViewCommandEventArgs"/> instance containing the event data.</param> protected void rGridPersonResults_AddExistingPerson( object sender, GridViewCommandEventArgs e ) { if ( e.CommandName == "Add" ) { var rockContext = new RockContext(); GroupMemberService groupMemberService = new GroupMemberService( rockContext ); int index = int.Parse( e.CommandArgument.ToString() ); int personId = int.Parse( rGridPersonResults.DataKeys[index].Value.ToString() ); var family = CurrentCheckInState.CheckIn.Families.Where( f => f.Selected ).FirstOrDefault(); if ( family != null ) { var checkInPerson = new CheckInPerson(); checkInPerson.Person = new PersonService( rockContext ).Get( personId ).Clone( false ); var isPersonInFamily = family.People.Any( p => p.Person.Id == checkInPerson.Person.Id ); if ( !isPersonInFamily ) { if ( personVisitorType.Value != "Visitor" ) { // TODO: DT: Is this right? Not sure this is the best way to set family id var groupMember = groupMemberService.GetByPersonId( personId ).FirstOrDefault(); groupMember.GroupId = family.Group.Id; rockContext.SaveChanges(); checkInPerson.FamilyMember = true; hfSelectedPerson.Value += personId + ","; } else { AddVisitorGroupMemberRoles( family, personId ); checkInPerson.FamilyMember = false; hfSelectedVisitor.Value += personId + ","; } checkInPerson.Selected = true; family.People.Add( checkInPerson ); ProcessFamily(); } mpeAddPerson.Hide(); } else { string errorMsg = "<ul><li>You have to pick a family to add this person to.</li></ul>"; maWarning.Show( errorMsg, Rock.Web.UI.Controls.ModalAlertType.Warning ); } } else { mpeAddPerson.Show(); BindPersonGrid(); } }
/// <summary> /// Processes the selection. /// </summary> /// <param name="person">The person.</param> /// <param name="schedule">The schedule.</param> /// <returns></returns> protected bool ProcessSelection( CheckInPerson person, CheckInSchedule schedule ) { if ( person != null ) { if ( !ProcessSelection( maWarning, () => person.SelectedGroupTypes( schedule ) .SelectMany( t => t.Groups.Where( g => !g.ExcludedByFilter ) ) .Count() <= 0, string.Format( "<p>Sorry, based on your selection, there are currently not any available locations that {0} can check into.</p>", person.Person.NickName ), true ) ) { ClearSelection(); } else { return true; } } return false; }
/// <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(); }
private void FilterGroups( CheckInPerson person, RockContext rockContext, bool remove ) { if ( person.Person.Attributes == null ) { person.Person.LoadAttributes( rockContext ); } string personAbilityLevel = person.Person.GetAttributeValue( "AbilityLevel" ).ToUpper(); if ( !string.IsNullOrWhiteSpace( personAbilityLevel ) ) { foreach ( var groupType in person.GroupTypes.ToList() ) { foreach ( var group in groupType.Groups.ToList() ) { var groupAttributes = group.Group.GetAttributeValues( "AbilityLevel" ); if ( groupAttributes.Any() && !groupAttributes.Contains( personAbilityLevel, StringComparer.OrdinalIgnoreCase ) ) { if ( remove ) { groupType.Groups.Remove( group ); } else { group.ExcludedByFilter = true; } } } } } }
/// <summary> /// Processes the selection. /// </summary> /// <param name="person">The person.</param> /// <param name="schedule">The schedule.</param> /// <returns></returns> protected bool ProcessSelection( CheckInPerson person, CheckInSchedule schedule ) { if ( person != null ) { if ( !ProcessSelection( maWarning, () => person.SelectedGroupTypes( schedule ) .SelectMany( t => t.SelectedGroups( schedule ) .SelectMany( g => g.SelectedLocations( schedule ) .SelectMany( l => l.ValidSchedules( schedule ) ) ) ) .Count() <= 0, "<p>Sorry, based on your selection, there are currently not any available times that can be checked into.</p>", CurrentCheckInState.CheckInType.TypeOfCheckin == TypeOfCheckin.Family ) ) { ClearSelection(); } else { return true; } } return false; }
/// <summary> /// Processes the selection. /// </summary> /// <param name="person">The person.</param> /// <param name="schedule">The schedule.</param> /// <returns></returns> protected bool ProcessSelection( CheckInPerson person, CheckInSchedule schedule ) { if ( person != null ) { if ( !ProcessSelection( maWarning, () => person.SelectedGroupTypes( schedule ) .SelectMany( t => t.SelectedGroups( schedule ) .SelectMany( g => g.Locations.Where( l => !l.ExcludedByFilter ) ) ) .Count() <= 0, "<p>Sorry, based on your selection, there are currently not any available locations that can be checked into.</p>", true ) ) { ClearSelection(); } else { return true; } } return false; }