Ejemplo n.º 1
0
        /// <summary>
        /// Gets the number of pending connection request based on existing request that don't have a connector plus the ones in the CampaignConnectionItem's EntitySet
        /// </summary>
        /// <param name="campaignConnectionItem">The campaign connection item.</param>
        /// <param name="connectorPerson">The connector person.</param>
        /// <returns></returns>
        public static int GetPendingConnectionCount(CampaignItem campaignConnectionItem, Person connectorPerson)
        {
            var rockContext      = new RockContext();
            var entitySetService = new EntitySetService(rockContext);
            var entitySetId      = GetEntitySet(campaignConnectionItem);

            var pendingPersonPrimaryCampusIdList = entitySetService.GetEntityQuery <Person>(entitySetId)
                                                   .Select(a => new
            {
                a.PrimaryCampusId
            })
                                                   .ToList();

            int pendingCount       = 0;
            var connectorCampusIds = GetConnectorCampusIds(campaignConnectionItem, connectorPerson);

            foreach (var pendingPerson in pendingPersonPrimaryCampusIdList)
            {
                int?entitySetPersonPrimaryCampusId = pendingPerson.PrimaryCampusId;

                if (IsValidCampus(connectorCampusIds, entitySetPersonPrimaryCampusId))
                {
                    pendingCount++;
                }
            }

            pendingCount += CampaignConnectionHelper.GetConnectionRequestsWithoutConnectorQuery(rockContext, campaignConnectionItem, connectorPerson).Count();
            return(pendingCount);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets the entity ids query.
        /// </summary>
        /// <returns></returns>
        private IQueryable <IEntity> GetEntityQuery()
        {
            var entitySetId = GetEntitySetId();

            var rockContext      = new RockContext();
            var entitySetService = new EntitySetService(rockContext);
            var query            = entitySetService.GetEntityQuery(entitySetId);

            if (query == null)
            {
                return(null);
            }

            query = query.AsNoTracking();

            if (!_doShowAll)
            {
                var limit = GetAttributeValue(AttributeKey.DefaultNumberOfItemsToShow).AsIntegerOrNull() ??
                            AttributeDefault.DefaultNumberOfItemsToShow;

                query = query.Take(limit);
            }

            return(query);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Cleans up expired entity sets.
        /// </summary>
        /// <param name="dataMap">The data map.</param>
        private void CleanupExpiredEntitySets(JobDataMap dataMap)
        {
            var entitySetRockContext = new Rock.Data.RockContext();
            var currentDateTime      = RockDateTime.Now;
            var entitySetService     = new EntitySetService(entitySetRockContext);
            var qry = entitySetService.Queryable().Where(a => a.ExpireDateTime.HasValue && a.ExpireDateTime < currentDateTime);

            foreach (var entitySet in qry.ToList())
            {
                string deleteWarning;
                if (entitySetService.CanDelete(entitySet, out deleteWarning))
                {
                    // delete in chunks (see http://dba.stackexchange.com/questions/1750/methods-of-speeding-up-a-huge-delete-from-table-with-no-clauses)
                    bool keepDeleting = true;
                    while (keepDeleting)
                    {
                        var dbTransaction = entitySetRockContext.Database.BeginTransaction();
                        try
                        {
                            string sqlCommand = @"DELETE TOP (1000) FROM [EntitySetItem] WHERE [EntitySetId] = @entitySetId";

                            int rowsDeleted = entitySetRockContext.Database.ExecuteSqlCommand(sqlCommand, new SqlParameter("entitySetId", entitySet.Id));
                            keepDeleting = rowsDeleted > 0;
                        }
                        finally
                        {
                            dbTransaction.Commit();
                        }
                    }

                    entitySetService.Delete(entitySet);
                    entitySetRockContext.SaveChanges();
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Shows the merge for entity set identifier.
        /// </summary>
        /// <param name="entitySetId">The entity set identifier.</param>
        protected void ShowMergeForEntitySetId(int entitySetId)
        {
            hfEntitySetId.Value = entitySetId.ToString();
            var rockContext           = new RockContext();
            var entitySetService      = new EntitySetService(rockContext);
            var entitySetItemsService = new EntitySetItemService(rockContext);
            var entitySet             = entitySetService.Get(entitySetId);

            if (entitySet == null)
            {
                nbWarningMessage.Text  = "Merge Records not found";
                nbWarningMessage.Title = "Warning";
                nbWarningMessage.NotificationBoxType = NotificationBoxType.Warning;
                pnlEntry.Visible = false;
                return;
            }

            if (entitySet.EntityTypeId.HasValue)
            {
                bool isPersonEntitySet      = entitySet.EntityTypeId.Value == EntityTypeCache.GetId <Rock.Model.Person>();
                bool isGroupMemberEntitySet = entitySet.EntityTypeId.Value == EntityTypeCache.GetId <Rock.Model.GroupMember>();
                cbCombineFamilyMembers.Visible = isPersonEntitySet || isGroupMemberEntitySet;
            }
            else
            {
                cbCombineFamilyMembers.Visible = false;
            }

            int itemsCount = entitySetItemsService.Queryable().Where(a => a.EntitySetId == entitySetId).Count();

            nbNumberOfRecords.Text = string.Format("There are {0} {1} to merge", itemsCount, "row".PluralizeIf(itemsCount != 1));
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Handles the DeleteClick event of the gCampaigns control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs"/> instance containing the event data.</param>
        protected void gCampaigns_DeleteClick(object sender, RowEventArgs e)
        {
            var campaignConnectionItem = CampaignConnectionHelper.GetCampaignConfiguration(e.RowKeyValue.ToString().AsGuid());

            if (campaignConnectionItem != null && campaignConnectionItem.EntitySetId != default(int))
            {
                var rockContext      = new RockContext();
                var entitySetService = new EntitySetService(rockContext);
                var entitySet        = entitySetService.Get(campaignConnectionItem.EntitySetId);

                string errorMessage;
                if (!entitySetService.CanDelete(entitySet, out errorMessage))
                {
                    mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                    return;
                }

                var entitySetItemQry = new EntitySetItemService(rockContext)
                                       .Queryable().AsNoTracking()
                                       .Where(i => i.EntitySetId == entitySet.Id);
                rockContext.BulkDelete(entitySetItemQry);
                entitySetService.Delete(entitySet);
                rockContext.SaveChanges();

                CampaignConnectionHelper.RemoveCampaignConfiguration(e.RowKeyValue.ToString().AsGuid());

                BindGrid();
            }
        }
        /// <summary>
        /// Handles the SaveClick event of the mdLinkConversation 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 mdLinkToPerson_SaveClick(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var personAliasService = new PersonAliasService(rockContext);
                var personService      = new PersonService(rockContext);

                // Get the Person Record from the selected conversation. (It should be a 'NamelessPerson' record type)
                int    namelessPersonAliasId = hfSelectedRecipientPersonAliasId.Value.AsInteger();
                var    phoneNumberService    = new PhoneNumberService(rockContext);
                Person namelessPerson        = personAliasService.GetPerson(namelessPersonAliasId);

                if (namelessPerson == null)
                {
                    // shouldn't happen, but just in case
                    return;
                }

                EntitySet mergeRequest = null;
                if (pnlLinkToExistingPerson.Visible)
                {
                    var existingPersonId = ppPerson.PersonId;
                    if (!existingPersonId.HasValue)
                    {
                        return;
                    }

                    var existingPerson = personService.Get(existingPersonId.Value);
                    mergeRequest = namelessPerson.CreateMergeRequest(existingPerson);
                    var entitySetService = new EntitySetService(rockContext);
                    entitySetService.Add(mergeRequest);

                    rockContext.SaveChanges();
                    hfSelectedRecipientPersonAliasId.Value = existingPerson.PrimaryAliasId.ToString();
                }
                else
                {
                    // new Person and new family
                    var newPerson = new Person();

                    newPersonEditor.UpdatePerson(newPerson, rockContext);

                    personService.Add(newPerson);
                    rockContext.SaveChanges();

                    mergeRequest = namelessPerson.CreateMergeRequest(newPerson);
                    var entitySetService = new EntitySetService(rockContext);
                    entitySetService.Add(mergeRequest);
                    rockContext.SaveChanges();

                    hfSelectedRecipientPersonAliasId.Value = newPerson.PrimaryAliasId.ToString();
                }

                RedirectToMergeRequest(mergeRequest);
            }

            mdLinkToPerson.Hide();
            LoadResponseListing();
        }
Ejemplo n.º 7
0
        /// <summary>
        /// Handles the SaveClick event of the mdLinkToPerson 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 mdLinkToPerson_SaveClick(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var personAliasService = new PersonAliasService(rockContext);
                var personService      = new PersonService(rockContext);

                int    namelessPersonId = hfNamelessPersonId.Value.AsInteger();
                Person namelessPerson   = personService.Get(namelessPersonId);

                if (namelessPerson == null)
                {
                    // shouldn't happen, but just in case
                    return;
                }

                EntitySet mergeRequest = null;
                if (pnlLinkToExistingPerson.Visible)
                {
                    var existingPersonId = ppPerson.PersonId;
                    if (!existingPersonId.HasValue)
                    {
                        return;
                    }

                    var existingPerson = personService.Get(existingPersonId.Value);

                    mergeRequest = namelessPerson.CreateMergeRequest(existingPerson);
                    var entitySetService = new EntitySetService(rockContext);
                    entitySetService.Add(mergeRequest);

                    rockContext.SaveChanges();
                }
                else
                {
                    // new Person and new family
                    var newPerson = new Person();

                    newPersonEditor.UpdatePerson(newPerson, rockContext);

                    personService.Add(newPerson);
                    rockContext.SaveChanges();

                    mergeRequest = namelessPerson.CreateMergeRequest(newPerson);
                    var entitySetService = new EntitySetService(rockContext);
                    entitySetService.Add(mergeRequest);
                    rockContext.SaveChanges();
                }

                RedirectToMergeRequest(mergeRequest);
            }

            mdLinkToPerson.Hide();
            BindGrid();
        }
Ejemplo n.º 8
0
        private void DisplaySettings()
        {
            RockContext      rockContext      = new RockContext();
            EntitySetService entitySetService = new EntitySetService(rockContext);
            var entitySet        = entitySetService.Get(PageParameter("EntitySetId").AsInteger());
            var workflowEntityId = EntityTypeCache.GetId(typeof(Rock.Model.Workflow));

            if (entitySet == null || entitySet.EntityTypeId != workflowEntityId)
            {
                return;
            }

            WorkflowService workflowService = new WorkflowService(rockContext);

            var workflowQueryable = workflowService.Queryable();

            var workflows = entitySet.Items
                            .Join(workflowQueryable,
                                  i => i.EntityId,
                                  w => w.Id,
                                  (i, w) => w);

            var firstWorkflow = workflows.FirstOrDefault();

            if (firstWorkflow == null)
            {
                return;
            }

            var workflowTypeId = firstWorkflow.WorkflowTypeId;

            AttributeService attributeService = new AttributeService(rockContext);

            var attributes = attributeService.Queryable()
                             .Where(a => a.EntityTypeId == workflowEntityId &&
                                    a.EntityTypeQualifierColumn == "WorkflowTypeId" &&
                                    a.EntityTypeQualifierValue == workflowTypeId.ToString())
                             .OrderBy(a => a.Order)
                             .ToList();

            rAttributes.DataSource = attributes;
            rAttributes.DataBind();

            var workflowActivityTypes = firstWorkflow.WorkflowType.ActivityTypes;

            ddlActivities.DataSource = workflowActivityTypes;
            ddlActivities.DataBind();
            ddlActivities.Items.Insert(0, new ListItem());

            hfCount.Value            = workflows.Count().ToString();
            hfWorkflowTypeName.Value = firstWorkflow.WorkflowType.Name;
            nbNotification.Text      = string.Format("Updating {0} {1} workflows.", workflows.Count(), firstWorkflow.WorkflowType.Name);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Gets the entity set.
        /// </summary>
        /// <returns></returns>
        private EntitySet GetEntitySet()
        {
            if (_entitySet == null)
            {
                var entitySetId = GetEntitySetId();

                var rockContext      = new RockContext();
                var entitySetService = new EntitySetService(rockContext);
                _entitySet = entitySetService.Queryable().AsNoTracking().FirstOrDefault(es => es.Id == entitySetId);
            }

            return(_entitySet);
        }
        /// <summary>
        /// Launches the Communication.
        /// </summary>
        private void LaunchCommunication()
        {
            var entitySetId = GetEntitySetId();

            if (entitySetId != default(int))
            {
                var rockContext      = new RockContext();
                var entitySetService = new EntitySetService(rockContext);
                var entityTypeCache  = GetEntityTypeCache();
                var entityQuery      = GetEntityQuery();
                var personAliases    = new List <PersonAlias>();


                if (entityTypeCache.Id == EntityTypeCache.Get <Person>().Id)
                {
                    foreach (var person in entityQuery.ToList().Select(e => ( Person )e))
                    {
                        personAliases.Add(person.PrimaryAlias);
                    }
                }
                else if (entityTypeCache.Id == EntityTypeCache.Get <Group>().Id)
                {
                    foreach (var group in entityQuery.ToList().Select(e => ( Group )e))
                    {
                        foreach (var groupMember in group.Members)
                        {
                            personAliases.Add(groupMember.Person.PrimaryAlias);
                        }
                    }
                }
                else if (entityTypeCache.Id == EntityTypeCache.Get <GroupMember>().Id)
                {
                    foreach (var groupMember in entityQuery.ToList().Select(e => ( GroupMember )e))
                    {
                        personAliases.Add(groupMember.Person.PrimaryAlias);
                    }
                }
                else
                {
                    ShowError(string.Format("The grid items that were passed in are currently not supported, the currently supported grid entities are Person, Group Members, or Groups. Please contact Kingdom First Solutions for more information. EntityType: {0}", entityTypeCache.FriendlyName));
                    return;
                }

                var queryParameters = CreateCommunication(personAliases, rockContext);
                if (queryParameters.Any())
                {
                    NavigateToPage(GetSelectedPage().Guid, queryParameters);
                }
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Launches the workflows.
        /// </summary>
        private void LaunchWorkflows()
        {
            var workflowType = GetSelectedWorkflowType();

            if (workflowType == null)
            {
                // Validator control will alert the user
                return;
            }

            var entitySetId      = GetEntitySetId();
            var rockContext      = new RockContext();
            var entitySetService = new EntitySetService(rockContext);

            entitySetService.LaunchWorkflows(entitySetId, workflowType.Id);
        }
Ejemplo n.º 12
0
        /// <summary>
        /// Handles the Click event of the btnShowDataPreview 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 btnShowDataPreview_Click(object sender, EventArgs e)
        {
            if (pnlPreview.Visible)
            {
                pnlPreview.Visible = false;
                return;
            }

            var rockContext = new RockContext();

            int entitySetId      = hfEntitySetId.Value.AsInteger();
            var entitySetService = new EntitySetService(rockContext);
            var entitySet        = entitySetService.Get(entitySetId);

            if (entitySet.EntityTypeId.HasValue)
            {
                var qry = entitySetService.GetEntityQuery(entitySetId).Take(15);

                EntityTypeCache itemEntityType = EntityTypeCache.Read(entitySet.EntityTypeId ?? 0);
                gPreview.CreatePreviewColumns(itemEntityType.GetEntityType());

                gPreview.DataSource = qry.ToList();
                gPreview.DataBind();
            }
            else
            {
                var entitySetItemService = new EntitySetItemService(rockContext);
                var qry  = entitySetItemService.GetByEntitySetId(entitySetId, true).Take(15);
                var list = qry.ToList().Select(a => a.AdditionalMergeValuesJson.FromJsonOrNull <Dictionary <string, object> >()).ToList();
                if (list.Any())
                {
                    gPreview.Columns.Clear();
                    foreach (var s in list[0])
                    {
                        var gridField = Grid.GetGridField(s.Value != null ? s.Value.GetType() : typeof(string));
                        gridField.HeaderText = s.Key.SplitCase();
                        gridField.DataField  = s.Key;
                        gPreview.Columns.Add(gridField);
                    }

                    gPreview.DataSource = qry.ToList().Select(a => a.AdditionalMergeValuesJson.FromJsonOrNull <object>()).ToList();
                    gPreview.DataBind();
                }
            }

            pnlPreview.Visible = true;
        }
Ejemplo n.º 13
0
        /// <summary>
        /// Gets the entity set item count.
        /// </summary>
        /// <returns></returns>
        private int GetEntitySetItemCount()
        {
            var countFromViewState = ViewState[ViewStateKey.EntitySetItemCount].ToStringSafe().AsIntegerOrNull();

            if (countFromViewState.HasValue)
            {
                return(countFromViewState.Value);
            }

            var entitySetId      = GetEntitySetId();
            var rockContext      = new RockContext();
            var entitySetService = new EntitySetService(rockContext);
            var count            = entitySetService.GetEntityQuery(entitySetId).Count();

            ViewState[ViewStateKey.EntitySetItemCount] = count;
            return(count);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Gets the people set.
        /// </summary>
        /// <returns></returns>
        private List <int> GetPersonIdSet()
        {
            if (_peopleIds == null)
            {
                var setId = PageParameter(PageParameterKey.PeopleSet).AsIntegerOrNull();

                if (setId.HasValue)
                {
                    var rockContext      = GetRockContext();
                    var entitySetService = new EntitySetService(rockContext);
                    var peopleQuery      = entitySetService.GetEntityQuery <Person>(setId.Value).AsNoTracking();
                    _peopleIds = peopleQuery.Select(p => p.Id).Distinct().ToList();
                }
            }

            return(_peopleIds);
        }
Ejemplo n.º 15
0
        /// <summary>
        /// Launches the workflows.
        /// </summary>
        private void LaunchWorkflows()
        {
            var workflowType = GetSelectedWorkflowType();

            if (workflowType == null)
            {
                // Validator control will alert the user
                return;
            }

            var workflowAttributes = PageParameters().ToDictionary(k => k.Key, v => v.Value.ToString());
            var entitySetId        = GetEntitySetId();
            var rockContext        = new RockContext();
            var entitySetService   = new EntitySetService(rockContext);

            entitySetService.LaunchWorkflows(entitySetId, workflowType.Id, workflowAttributes);
        }
Ejemplo n.º 16
0
        private void Actions_BulkUpdateClick(object sender, EventArgs e)
        {
            var items = gWorkflows.SelectedKeys.Select(s => ( int )s).ToList();

            if (!items.Any())
            {
                var dataKeyArray = gWorkflows.DataKeys;
                foreach (DataKey dataKey in dataKeyArray)
                {
                    items.Add(( int )dataKey.Value);
                }
            }

            if (!items.Any())
            {
                return;
            }

            RockContext      rockContext      = new RockContext();
            EntitySetService entitySetService = new EntitySetService(rockContext);
            EntitySet        entitySet        = new EntitySet
            {
                EntityTypeId   = EntityTypeCache.GetId(typeof(Workflow)),
                ExpireDateTime = RockDateTime.Now.AddDays(1)
            };

            entitySetService.Add(entitySet);


            foreach (var item in items)
            {
                var entitySetItem = new EntitySetItem()
                {
                    EntityId = item,
                };
                entitySet.Items.Add(entitySetItem);
            }
            rockContext.SaveChanges();
            NavigateToLinkedPage("UpdatePage", new Dictionary <string, string> {
                { "EntitySetId", entitySet.Id.ToString() }
            });
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Handles the Delete event of the gList control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RowEventArgs"/> instance containing the event data.</param>
        protected void gList_Delete(object sender, RowEventArgs e)
        {
            var       rockContext      = new RockContext();
            var       entitySetService = new EntitySetService(rockContext);
            EntitySet entitySet        = entitySetService.Get(e.RowKeyId);

            if (entitySet != null)
            {
                string errorMessage;
                if (!entitySetService.CanDelete(entitySet, out errorMessage))
                {
                    mdGridWarning.Show(errorMessage, ModalAlertType.Information);
                    return;
                }

                // mark it as expired and RockCleanup will delete it later
                entitySet.ExpireDateTime          = RockDateTime.Now.AddMinutes(-1);
                entitySet.EntitySetPurposeValueId = null;
                rockContext.SaveChanges();
            }

            BindGrid();
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Binds the grid.
        /// </summary>
        private void BindGrid()
        {
            RockContext rockContext      = new RockContext();
            var         entitySetService = new EntitySetService(rockContext);

            var entitySetPurposeGuid = Rock.SystemGuid.DefinedValue.ENTITY_SET_PURPOSE_PERSON_MERGE_REQUEST.AsGuid();

            var currentDateTime = RockDateTime.Now;
            var entitySetQry    = entitySetService.Queryable()
                                  .Where(a => a.EntitySetPurposeValue.Guid == entitySetPurposeGuid)
                                  .Where(s => !s.ExpireDateTime.HasValue || s.ExpireDateTime.Value > currentDateTime);

            SortProperty sortProperty = gList.SortProperty;

            var qryPersonEntities = entitySetService.GetEntityItems <Person>();

            var joinQry = entitySetQry.GroupJoin(qryPersonEntities, n => n.Id, o => o.EntitySetId, (a, b) => new
            {
                a.Id,
                a.ModifiedDateTime,
                a.Note,
                a.CreatedByPersonAlias,
                MergeRecords = b.Select(x => x.Item)
            });

            if (sortProperty != null)
            {
                joinQry = joinQry.Sort(sortProperty);
            }
            else
            {
                joinQry = joinQry.OrderBy(s => s.ModifiedDateTime);
            }

            gList.SetLinqDataSource(joinQry);
            gList.DataBind();
        }
Ejemplo n.º 19
0
        /// <summary>
        /// Gets the merge object list for the current EntitySet
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="fetchCount">The fetch count.</param>
        /// <returns></returns>
        private List <object> GetMergeObjectList(RockContext rockContext, int?fetchCount = null)
        {
            int entitySetId      = hfEntitySetId.Value.AsInteger();
            var entitySetService = new EntitySetService(rockContext);
            var entitySet        = entitySetService.Get(entitySetId);
            Dictionary <int, object> mergeObjectsDictionary = new Dictionary <int, object>();

            // If this EntitySet contains IEntity Items, add those first
            if (entitySet.EntityTypeId.HasValue)
            {
                var qryEntity = entitySetService.GetEntityQuery(entitySetId);

                if (fetchCount.HasValue)
                {
                    qryEntity = qryEntity.Take(fetchCount.Value);
                }

                var  entityTypeCache         = EntityTypeCache.Read(entitySet.EntityTypeId.Value);
                bool isPersonEntityType      = entityTypeCache != null && entityTypeCache.Guid == Rock.SystemGuid.EntityType.PERSON.AsGuid();
                bool isGroupMemberEntityType = entityTypeCache != null && entityTypeCache.Guid == Rock.SystemGuid.EntityType.GROUP_MEMBER.AsGuid();
                bool combineFamilyMembers    = cbCombineFamilyMembers.Visible && cbCombineFamilyMembers.Checked;

                if (isPersonEntityType && combineFamilyMembers)
                {
                    var  qryPersons            = qryEntity;
                    Guid familyGroupType       = Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid();
                    var  qryFamilyGroupMembers = new GroupMemberService(rockContext).Queryable()
                                                 .Where(a => a.Group.GroupType.Guid == familyGroupType)
                                                 .Where(a => qryPersons.Any(aa => aa.Id == a.PersonId));

                    var qryCombined = qryFamilyGroupMembers.Join(
                        qryPersons,
                        m => m.PersonId,
                        p => p.Id,
                        (m, p) => new { GroupMember = m, Person = p })
                                      .GroupBy(a => a.GroupMember.GroupId)
                                      .Select(x => new
                    {
                        GroupId = x.Key,
                        Persons = x.Select(xx => xx.Person).Distinct()
                    });

                    foreach (var combinedFamilyItem in qryCombined)
                    {
                        object mergeObject;

                        string commaPersonIds = combinedFamilyItem.Persons.Select(a => a.Id).Distinct().ToList().AsDelimited(",");

                        var primaryGroupPerson = combinedFamilyItem.Persons.FirstOrDefault() as Person;

                        if (mergeObjectsDictionary.ContainsKey(primaryGroupPerson.Id))
                        {
                            foreach (var person in combinedFamilyItem.Persons)
                            {
                                if (!mergeObjectsDictionary.ContainsKey(person.Id))
                                {
                                    primaryGroupPerson = person as Person;
                                    break;
                                }
                            }
                        }

                        if (combinedFamilyItem.Persons.Count() > 1)
                        {
                            var combinedPerson = primaryGroupPerson.ToJson().FromJsonOrNull <MergeTemplateCombinedPerson>();

                            var familyTitle = RockUdfHelper.ufnCrm_GetFamilyTitle(rockContext, null, combinedFamilyItem.GroupId, commaPersonIds, true);
                            combinedPerson.FullName = familyTitle;

                            var firstNameList = combinedFamilyItem.Persons.Select(a => (a as Person).FirstName).ToList();
                            var nickNameList  = combinedFamilyItem.Persons.Select(a => (a as Person).NickName).ToList();

                            combinedPerson.FirstName     = firstNameList.AsDelimited(", ", " & ");
                            combinedPerson.NickName      = nickNameList.AsDelimited(", ", " & ");
                            combinedPerson.LastName      = primaryGroupPerson.LastName;
                            combinedPerson.SuffixValueId = null;
                            combinedPerson.SuffixValue   = null;
                            mergeObject = combinedPerson;
                        }
                        else
                        {
                            mergeObject = primaryGroupPerson;
                        }

                        mergeObjectsDictionary.AddOrIgnore(primaryGroupPerson.Id, mergeObject);
                    }
                }
                else if (isGroupMemberEntityType)
                {
                    foreach (var groupMember in qryEntity.AsNoTracking().OfType <GroupMember>())
                    {
                        var person = groupMember.Person;
                        person.AdditionalLavaFields = new Dictionary <string, object>();

                        foreach (var item in groupMember.ToDictionary())
                        {
                            if (item.Key == "Id")
                            {
                                person.AdditionalLavaFields.AddOrIgnore("GroupMemberId", item.Value);
                            }
                            else if (item.Key == "Guid")
                            {
                                person.AdditionalLavaFields.AddOrIgnore("GroupMemberGuid", item.Value.ToStringSafe());
                            }
                            else
                            {
                                person.AdditionalLavaFields.AddOrIgnore(item.Key, item.Value);
                            }
                        }

                        mergeObjectsDictionary.AddOrIgnore(groupMember.PersonId, person);
                    }
                }
                else
                {
                    foreach (var item in qryEntity.AsNoTracking())
                    {
                        mergeObjectsDictionary.AddOrIgnore(item.Id, item);
                    }
                }
            }

            var entitySetItemService = new EntitySetItemService(rockContext);

            string[] emptyJson = new string[] { string.Empty, "{}" };
            var      entitySetItemMergeValuesQry = entitySetItemService.GetByEntitySetId(entitySetId, true).Where(a => !emptyJson.Contains(a.AdditionalMergeValuesJson));

            if (fetchCount.HasValue)
            {
                entitySetItemMergeValuesQry = entitySetItemMergeValuesQry.Take(fetchCount.Value);
            }

            // the entityId to use for NonEntity objects
            int nonEntityId = 1;

            // now, add the additional MergeValues regardless of if the EntitySet contains IEntity items or just Non-IEntity items
            foreach (var additionalMergeValuesItem in entitySetItemMergeValuesQry.AsNoTracking())
            {
                object mergeObject;
                int    entityId;
                if (additionalMergeValuesItem.EntityId > 0)
                {
                    entityId = additionalMergeValuesItem.EntityId;
                }
                else
                {
                    // not pointing to an actual EntityId, so use the nonEntityId for ti
                    entityId = nonEntityId++;
                }

                if (mergeObjectsDictionary.ContainsKey(entityId))
                {
                    mergeObject = mergeObjectsDictionary[entityId];
                }
                else
                {
                    if (entitySet.EntityTypeId.HasValue)
                    {
                        // if already have real entities in our list, don't add additional items to the mergeObjectsDictionary
                        continue;
                    }

                    // non-Entity merge object, so just use Dictionary
                    mergeObject = new Dictionary <string, object>();
                    mergeObjectsDictionary.AddOrIgnore(entityId, mergeObject);
                }

                foreach (var additionalMergeValue in additionalMergeValuesItem.AdditionalMergeValues)
                {
                    if (mergeObject is IEntity)
                    {
                        // add the additional fields to AdditionalLavaFields
                        IEntity mergeEntity = (mergeObject as IEntity);
                        mergeEntity.AdditionalLavaFields = mergeEntity.AdditionalLavaFields ?? new Dictionary <string, object>();
                        object mergeValueObject = additionalMergeValue.Value;
                        mergeEntity.AdditionalLavaFields.AddOrIgnore(additionalMergeValue.Key, mergeValueObject);
                    }
                    else if (mergeObject is IDictionary <string, object> )
                    {
                        // anonymous object with no fields yet
                        IDictionary <string, object> nonEntityObject = mergeObject as IDictionary <string, object>;
                        nonEntityObject.AddOrIgnore(additionalMergeValue.Key, additionalMergeValue.Value);
                    }
                    else
                    {
                        throw new Exception(string.Format("Unexpected MergeObject Type: {0}", mergeObject));
                    }
                }
            }

            var result = mergeObjectsDictionary.Select(a => a.Value);

            if (fetchCount.HasValue)
            {
                // make sure the result is limited to fetchCount (even though the above queries are also limited to fetch count)
                result = result.Take(fetchCount.Value);
            }

            return(result.ToList());
        }
Ejemplo n.º 20
0
        /// <summary>
        /// Gets the merge object list for the current EntitySet
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="fetchCount">The fetch count.</param>
        /// <returns></returns>
        private List <object> GetMergeObjectList(RockContext rockContext, int?fetchCount = null)
        {
            int entitySetId      = hfEntitySetId.Value.AsInteger();
            var entitySetService = new EntitySetService(rockContext);
            var entitySet        = entitySetService.Get(entitySetId);
            Dictionary <int, object> mergeObjectsDictionary = new Dictionary <int, object>();

            // If this EntitySet contains IEntity Items, add those first
            if (entitySet.EntityTypeId.HasValue)
            {
                var qryEntity = entitySetService.GetEntityQuery(entitySetId);

                if (fetchCount.HasValue)
                {
                    qryEntity = qryEntity.Take(fetchCount.Value);
                }

                var  entityTypeCache         = EntityTypeCache.Read(entitySet.EntityTypeId.Value);
                bool isPersonEntityType      = entityTypeCache != null && entityTypeCache.Guid == Rock.SystemGuid.EntityType.PERSON.AsGuid();
                bool isGroupMemberEntityType = entityTypeCache != null && entityTypeCache.Guid == Rock.SystemGuid.EntityType.GROUP_MEMBER.AsGuid();
                bool combineFamilyMembers    = cbCombineFamilyMembers.Visible && cbCombineFamilyMembers.Checked;

                if ((isGroupMemberEntityType || isPersonEntityType) && combineFamilyMembers)
                {
                    IQueryable <IEntity> qryPersons;
                    if (isGroupMemberEntityType)
                    {
                        qryPersons = qryEntity.OfType <GroupMember>().Select(a => a.Person).Distinct();
                    }
                    else
                    {
                        qryPersons = qryEntity;
                    }

                    Guid familyGroupType       = Rock.SystemGuid.GroupType.GROUPTYPE_FAMILY.AsGuid();
                    var  qryFamilyGroupMembers = new GroupMemberService(rockContext).Queryable("GroupRole,Person").AsNoTracking()
                                                 .Where(a => a.Group.GroupType.Guid == familyGroupType)
                                                 .Where(a => qryPersons.Any(aa => aa.Id == a.PersonId));

                    var qryCombined = qryFamilyGroupMembers.Join(
                        qryPersons,
                        m => m.PersonId,
                        p => p.Id,
                        (m, p) => new { GroupMember = m, Person = p })
                                      .GroupBy(a => a.GroupMember.GroupId)
                                      .Select(x => new
                    {
                        GroupId = x.Key,
                        // Order People to match ordering in the GroupMembers.ascx block.
                        Persons =
                            // Adult Male
                            x.Where(xx => xx.GroupMember.GroupRole.Guid.Equals(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT)) &&
                                    xx.GroupMember.Person.Gender == Gender.Male).OrderByDescending(xx => xx.GroupMember.Person.BirthDate).Select(xx => xx.Person)
                            // Adult Female
                            .Concat(x.Where(xx => xx.GroupMember.GroupRole.Guid.Equals(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT)) &&
                                            xx.GroupMember.Person.Gender != Gender.Male).OrderByDescending(xx => xx.GroupMember.Person.BirthDate).Select(xx => xx.Person))
                            // non-adults
                            .Concat(x.Where(xx => !xx.GroupMember.GroupRole.Guid.Equals(new Guid(Rock.SystemGuid.GroupRole.GROUPROLE_FAMILY_MEMBER_ADULT)))
                                    .OrderByDescending(xx => xx.GroupMember.Person.BirthDate).Select(xx => xx.Person))
                    });

                    foreach (var combinedFamilyItem in qryCombined)
                    {
                        object mergeObject;

                        string commaPersonIds = combinedFamilyItem.Persons.Select(a => a.Id).Distinct().ToList().AsDelimited(",");

                        var primaryGroupPerson = combinedFamilyItem.Persons.FirstOrDefault() as Person;

                        if (mergeObjectsDictionary.ContainsKey(primaryGroupPerson.Id))
                        {
                            foreach (var person in combinedFamilyItem.Persons)
                            {
                                if (!mergeObjectsDictionary.ContainsKey(person.Id))
                                {
                                    primaryGroupPerson = person as Person;
                                    break;
                                }
                            }
                        }

                        // if we are combining from a GroupMemberEntityType list add the GroupMember attributes of the primary person in the combined list
                        if (isGroupMemberEntityType)
                        {
                            var groupMember = qryEntity.OfType <GroupMember>().Where(a => a.PersonId == primaryGroupPerson.Id).FirstOrDefault();
                            primaryGroupPerson.AdditionalLavaFields = primaryGroupPerson.AdditionalLavaFields ?? new Dictionary <string, object>();
                            if (groupMember != null)
                            {
                                primaryGroupPerson.AdditionalLavaFields.AddOrIgnore("GroupMember", groupMember);
                            }
                        }

                        if (combinedFamilyItem.Persons.Count() > 1)
                        {
                            var combinedPerson = primaryGroupPerson.ToJson().FromJsonOrNull <MergeTemplateCombinedPerson>();

                            var familyTitle = RockUdfHelper.ufnCrm_GetFamilyTitle(rockContext, null, combinedFamilyItem.GroupId, commaPersonIds, true);
                            combinedPerson.FullName = familyTitle;

                            var firstNameList = combinedFamilyItem.Persons.Select(a => (a as Person).FirstName).ToList();
                            var nickNameList  = combinedFamilyItem.Persons.Select(a => (a as Person).NickName).ToList();

                            combinedPerson.FirstName     = firstNameList.AsDelimited(", ", " & ");
                            combinedPerson.NickName      = nickNameList.AsDelimited(", ", " & ");
                            combinedPerson.LastName      = primaryGroupPerson.LastName;
                            combinedPerson.SuffixValueId = null;
                            combinedPerson.SuffixValue   = null;
                            mergeObject = combinedPerson;
                        }
                        else
                        {
                            mergeObject = primaryGroupPerson;
                        }

                        mergeObjectsDictionary.AddOrIgnore(primaryGroupPerson.Id, mergeObject);
                    }
                }
                else if (isGroupMemberEntityType)
                {
                    foreach (var groupMember in qryEntity.AsNoTracking().OfType <GroupMember>())
                    {
                        var person = groupMember.Person;
                        person.AdditionalLavaFields = new Dictionary <string, object>();
                        person.AdditionalLavaFields.Add("GroupMember", groupMember);
                        mergeObjectsDictionary.AddOrIgnore(groupMember.PersonId, person);
                    }
                }
                else
                {
                    foreach (var item in qryEntity.AsNoTracking())
                    {
                        mergeObjectsDictionary.AddOrIgnore(item.Id, item);
                    }
                }
            }

            var entitySetItemService = new EntitySetItemService(rockContext);

            string[] emptyJson = new string[] { string.Empty, "{}" };
            var      entitySetItemMergeValuesQry = entitySetItemService.GetByEntitySetId(entitySetId, true).Where(a => !emptyJson.Contains(a.AdditionalMergeValuesJson));

            if (fetchCount.HasValue)
            {
                entitySetItemMergeValuesQry = entitySetItemMergeValuesQry.Take(fetchCount.Value);
            }

            // the entityId to use for NonEntity objects
            int nonEntityId = 1;

            // now, add the additional MergeValues regardless of if the EntitySet contains IEntity items or just Non-IEntity items
            foreach (var additionalMergeValuesItem in entitySetItemMergeValuesQry.AsNoTracking())
            {
                object mergeObject;
                int    entityId;
                if (additionalMergeValuesItem.EntityId > 0)
                {
                    entityId = additionalMergeValuesItem.EntityId;
                }
                else
                {
                    // not pointing to an actual EntityId, so use the nonEntityId for ti
                    entityId = nonEntityId++;
                }

                if (mergeObjectsDictionary.ContainsKey(entityId))
                {
                    mergeObject = mergeObjectsDictionary[entityId];
                }
                else
                {
                    if (entitySet.EntityTypeId.HasValue)
                    {
                        // if already have real entities in our list, don't add additional items to the mergeObjectsDictionary
                        continue;
                    }

                    // non-Entity merge object, so just use Dictionary
                    mergeObject = new Dictionary <string, object>();
                    mergeObjectsDictionary.AddOrIgnore(entityId, mergeObject);
                }

                foreach (var additionalMergeValue in additionalMergeValuesItem.AdditionalMergeValues)
                {
                    if (mergeObject is IEntity)
                    {
                        // add the additional fields to AdditionalLavaFields
                        IEntity mergeEntity = (mergeObject as IEntity);
                        mergeEntity.AdditionalLavaFields = mergeEntity.AdditionalLavaFields ?? new Dictionary <string, object>();
                        object mergeValueObject = additionalMergeValue.Value;

                        // if the mergeValueObject is a JArray (JSON Object), convert it into an ExpandoObject or List<ExpandoObject> so that Lava will work on it
                        if (mergeValueObject is JArray)
                        {
                            var jsonOfObject = mergeValueObject.ToJson();
                            try
                            {
                                mergeValueObject = Rock.Lava.RockFilters.FromJSON(jsonOfObject);
                            }
                            catch (Exception ex)
                            {
                                LogException(new Exception("MergeTemplateEntry couldn't do a FromJSON", ex));
                            }
                        }

                        mergeEntity.AdditionalLavaFields.AddOrIgnore(additionalMergeValue.Key, mergeValueObject);
                    }
                    else if (mergeObject is IDictionary <string, object> )
                    {
                        // anonymous object with no fields yet
                        IDictionary <string, object> nonEntityObject = mergeObject as IDictionary <string, object>;
                        nonEntityObject.AddOrIgnore(additionalMergeValue.Key, additionalMergeValue.Value);
                    }
                    else
                    {
                        throw new Exception(string.Format("Unexpected MergeObject Type: {0}", mergeObject));
                    }
                }
            }

            var result = mergeObjectsDictionary.Select(a => a.Value);

            if (fetchCount.HasValue)
            {
                // make sure the result is limited to fetchCount (even though the above queries are also limited to fetch count)
                result = result.Take(fetchCount.Value);
            }

            return(result.ToList());
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Binds the repeater.
        /// </summary>
        private void BindRepeater()
        {
            var entitySetId      = GetEntitySetId();
            var rockContext      = new RockContext();
            var entitySetService = new EntitySetService(rockContext);
            var entityQuery      = GetEntityQuery();
            var entityTypeCache  = GetEntityTypeCache();

            if (entityQuery == null || entityTypeCache == null)
            {
                rEntitySetItems.DataSource = null;
                rEntitySetItems.DataBind();

                ShowError("The entity set is not valid");
                return;
            }

            // Generate a view model for each entity that contains HTML to show the user what the entities are in the most
            // human friendly way possible
            var theType = entityTypeCache.GetEntityType();
            IEnumerable <RepeaterViewModel> viewModels;

            const string twoLineTemplate   = "{0}<br /><sup>({1})</sup>";
            const string nameAndIdTemplate = "{0} Id: {1}";

            /*
             * 2020-02-13 BJW
             *
             * This giant if statement is written this way so as to make the conditional choice for how to render each entity outside
             * of a loop. It would probably be easier to read if we put the conditionals inside the loop, but then those conditionals
             * would be evaluated for every entity. Since this block has potential to display thousands of entities, I thought it best
             * to try to optimize this way.
             */

            if (entityTypeCache.Id == EntityTypeCache.Get <Person>().Id || entityTypeCache.Id == EntityTypeCache.Get <Group>().Id)
            {
                // Person or Group have a good ToString override that works well here
                viewModels = entityQuery.ToList().Select(e => new RepeaterViewModel
                {
                    Html = e.ToString()
                });
            }
            else if (entityTypeCache.Id == EntityTypeCache.Get <GroupMember>().Id)
            {
                // Group members should show both the group and the person ToString results
                viewModels = entityQuery.Include("Person").Include("Group").ToList().Select(e => new RepeaterViewModel
                {
                    Html = string.Format(twoLineTemplate, (( GroupMember )e).Person, (( GroupMember )e).Group)
                });
            }
            else if (entityTypeCache.Id == EntityTypeCache.Get <ConnectionRequest>().Id)
            {
                // Connection requests should show both the opportunity and the person ToString results. ConnectionOpportunity has a good ToString method
                viewModels = entityQuery.Include("PersonAlias.Person").Include("ConnectionOpportunity").ToList().Select(e => new RepeaterViewModel
                {
                    Html = string.Format(twoLineTemplate, (( ConnectionRequest )e).PersonAlias.Person, (( ConnectionRequest )e).ConnectionOpportunity)
                });
            }
            else if (theType.GetProperty("Name") != null)
            {
                // If there is a name property then use that
                viewModels = entityQuery.ToList().Select(e => new RepeaterViewModel
                {
                    Html = e.GetPropertyValue("Name").ToString()
                });
            }
            else if (theType.GetProperty("Title") != null)
            {
                // If there is a title property then use that
                viewModels = entityQuery.ToList().Select(e => new RepeaterViewModel
                {
                    Html = e.GetPropertyValue("Title").ToString()
                });
            }
            else if (theType.GetProperty("Person") != null)
            {
                // If there is a Person property then use the person's name with the entity id underneath
                viewModels = entityQuery.Include("Person").ToList().Select(e => new RepeaterViewModel
                {
                    Html = string.Format(twoLineTemplate,
                                         e.GetPropertyValue("Person"),
                                         string.Format(nameAndIdTemplate, entityTypeCache.FriendlyName, e.Id))
                });
            }
            else if (theType.GetProperty("PersonAlias") != null)
            {
                // If there is a PersonAlias property then use the person's name with the entity id underneath
                viewModels = entityQuery.Include("PersonAlias.Person").ToList().Select(e => new RepeaterViewModel
                {
                    Html = string.Format(twoLineTemplate,
                                         (( PersonAlias )e.GetPropertyValue("PersonAlias")).Person,
                                         string.Format(nameAndIdTemplate, entityTypeCache.FriendlyName, e.Id))
                });
            }
            else
            {
                // There are no configured properties on this entity type, so just so the entity type name and entity id
                viewModels = entityQuery.ToList().Select(e => new RepeaterViewModel
                {
                    Html = string.Format(nameAndIdTemplate, entityTypeCache.FriendlyName, e.Id)
                });
            }

            rEntitySetItems.DataSource = viewModels;
            rEntitySetItems.DataBind();
        }
Ejemplo n.º 22
0
        private List <Rock.Model.Workflow> GetWorkflows(RockContext rockContext)
        {
            EntitySetService entitySetService = new EntitySetService(rockContext);
            var entitySet        = entitySetService.Get(PageParameter("EntitySetId").AsInteger());
            var workflowEntityId = EntityTypeCache.GetId(typeof(Rock.Model.Workflow));

            if (entitySet == null || entitySet.EntityTypeId != workflowEntityId)
            {
                return(null);
            }

            WorkflowService workflowService = new WorkflowService(rockContext);

            var workflowQueryable = workflowService.Queryable();

            var qry = entitySet.Items
                      .Join(workflowQueryable,
                            i => i.EntityId,
                            w => w.Id,
                            (i, w) => w);

            var firstWorkflow = qry.FirstOrDefault();

            if (firstWorkflow == null)
            {
                return(null);
            }

            var workflowTypeId = firstWorkflow.WorkflowTypeId;

            AttributeService      attributeService      = new AttributeService(rockContext);
            AttributeValueService attributeValueService = new AttributeValueService(rockContext);

            var attributeQueryable = attributeService.Queryable()
                                     .Where(a => a.EntityTypeId == workflowEntityId &&
                                            a.EntityTypeQualifierColumn == "WorkflowTypeId" &&
                                            a.EntityTypeQualifierValue == workflowTypeId.ToString())
                                     .Select(a => a.Id);

            var attributeValueQueryable = attributeValueService.Queryable()
                                          .Where(av => attributeQueryable.Contains(av.AttributeId));

            var mixedItems = qry.GroupJoin(attributeValueQueryable,
                                           w => w.Id,
                                           av => av.EntityId,
                                           (w, av) => new { Workflow = w, AttributeValues = av })
                             .ToList();

            Dictionary <string, AttributeCache> attributes = new Dictionary <string, AttributeCache>();

            foreach (var id in attributeQueryable.ToList())
            {
                var attributeCache = AttributeCache.Get(id);
                if (attributeCache != null)
                {
                    attributes[attributeCache.Key] = attributeCache;
                }
            }

            var workflows = new List <Rock.Model.Workflow>();

            foreach (var item in mixedItems)
            {
                var workflow = item.Workflow;
                workflow.Attributes      = attributes;
                workflow.AttributeValues = new Dictionary <string, AttributeValueCache>();
                foreach (var attribute in attributes)
                {
                    var attributeValue = item.AttributeValues.Where(av => av.AttributeKey == attribute.Key).FirstOrDefault();
                    workflow.AttributeValues[attribute.Key] = attributeValue != null ? new AttributeValueCache(attributeValue) : new AttributeValueCache();
                }
                workflows.Add(workflow);
            }
            return(workflows);
        }