コード例 #1
0
        public void LoadContent()
        {
            // get opportunity id
            int opportunityId = -1;

            if (!string.IsNullOrWhiteSpace(PageParameter("OpportunityId")))
            {
                opportunityId = Convert.ToInt32(PageParameter("OpportunityId"));
            }

            if (opportunityId > 0)
            {
                RockContext rockContext = new RockContext();
                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext);

                bool enableDebug = GetAttributeValue("EnableDebug").AsBoolean();

                var qry = connectionOpportunityService
                          .Queryable()
                          .Where(g => g.Id == opportunityId);

                if (!enableDebug)
                {
                    qry = qry.AsNoTracking();
                }
                var opportunity = qry.FirstOrDefault();

                var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage, this.CurrentPerson);
                Dictionary <string, object> linkedPages = new Dictionary <string, object>();
                linkedPages.Add("SignupPage", LinkedPageRoute("SignupPage"));
                mergeFields.Add("LinkedPages", linkedPages);

                mergeFields.Add("CampusContext", RockPage.GetCurrentContext(EntityTypeCache.Read("Rock.Model.Campus")) as Campus);

                // run opportunity summary and details through lava
                opportunity.Summary     = opportunity.Summary.ResolveMergeFields(mergeFields);
                opportunity.Description = opportunity.Description.ResolveMergeFields(mergeFields);

                mergeFields.Add("Opportunity", opportunity);

                // add linked pages

                lOutput.Text = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);

                if (GetAttributeValue("SetPageTitle").AsBoolean())
                {
                    string pageTitle = opportunity.PublicName;
                    RockPage.PageTitle    = pageTitle;
                    RockPage.BrowserTitle = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                    RockPage.Header.Title = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                }

                // show debug info
                if (GetAttributeValue("EnableDebug").AsBoolean() && IsUserAuthorized(Authorization.EDIT))
                {
                    lDebug.Visible = true;
                    lDebug.Text    = mergeFields.lavaDebugInfo();
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Binds the event calendar items grid.
        /// </summary>
        protected void BindConnectionOpportunitiesGrid()
        {
            if (_connectionType != null)
            {
                pnlConnectionOpportunities.Visible = true;

                rFilter.Visible = true;
                gConnectionOpportunities.Visible = true;

                var rockContext = new RockContext();

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext);
                var qry = connectionOpportunityService.Queryable()
                          .Where(o => o.ConnectionTypeId == _connectionType.Id);

                // Filter by Active Only
                if (cbActive.Checked)
                {
                    qry = qry.Where(o => o.IsActive);
                }

                // Filter query by any configured attribute filters
                if (AvailableAttributes != null && AvailableAttributes.Any())
                {
                    foreach (var attribute in AvailableAttributes)
                    {
                        var filterControl = phAttributeFilters.FindControl("filter_" + attribute.Id.ToString());
                        qry = attribute.FieldType.Field.ApplyAttributeQueryFilter(qry, filterControl, attribute, connectionOpportunityService, Rock.Reporting.FilterMode.SimpleFilter);
                    }
                }
                SortProperty sortProperty = gConnectionOpportunities.SortProperty;

                List <ConnectionOpportunity> connectionOpportunities = null;
                if (sortProperty != null)
                {
                    connectionOpportunities = qry.Sort(sortProperty).ToList();
                }
                else
                {
                    connectionOpportunities = qry.ToList().OrderBy(a => a.Name).ToList();
                }

                // Only include opportunities that current person is allowed to view
                var authorizedOpportunities = new List <ConnectionOpportunity>();
                foreach (var opportunity in connectionOpportunities)
                {
                    if (opportunity.IsAuthorized(Authorization.VIEW, CurrentPerson))
                    {
                        authorizedOpportunities.Add(opportunity);
                    }
                }

                gConnectionOpportunities.DataSource = authorizedOpportunities;
                gConnectionOpportunities.DataBind();
            }
            else
            {
                pnlConnectionOpportunities.Visible = false;
            }
        }
コード例 #3
0
        public void LoadContent()
        {
            // get opportunity id
            int opportunityId = -1;

            if (!string.IsNullOrWhiteSpace(PageParameter("OpportunityId")))
            {
                opportunityId = Convert.ToInt32(PageParameter("OpportunityId"));
            }

            if (opportunityId > 0)
            {
                RockContext rockContext = new RockContext();
                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext);

                bool enableDebug = GetAttributeValue("EnableDebug").AsBoolean();

                var qry = connectionOpportunityService
                          .Queryable()
                          .Where(g => g.Id == opportunityId);

                if (!enableDebug)
                {
                    qry = qry.AsNoTracking();
                }
                var opportunity = qry.FirstOrDefault();

                var mergeFields = new Dictionary <string, object>();
                mergeFields.Add("Opportunity", opportunity);

                // add linked pages
                Dictionary <string, object> linkedPages = new Dictionary <string, object>();
                linkedPages.Add("SignupPage", LinkedPageUrl("SignupPage", null));
                mergeFields.Add("LinkedPages", linkedPages);

                mergeFields.Add("CurrentPerson", CurrentPerson);

                var globalAttributeFields = Rock.Web.Cache.GlobalAttributesCache.GetMergeFields(CurrentPerson);
                globalAttributeFields.ToList().ForEach(d => mergeFields.Add(d.Key, d.Value));

                lOutput.Text = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);

                if (GetAttributeValue("SetPageTitle").AsBoolean())
                {
                    string pageTitle = opportunity.PublicName;
                    RockPage.PageTitle    = pageTitle;
                    RockPage.BrowserTitle = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                    RockPage.Header.Title = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                }

                // show debug info
                if (GetAttributeValue("EnableDebug").AsBoolean() && IsUserAuthorized(Authorization.EDIT))
                {
                    lDebug.Visible = true;
                    lDebug.Text    = mergeFields.lavaDebugInfo();
                }
            }
        }
コード例 #4
0
        /// <summary>
        /// Handles the GridReorder event of the gConnectionOpportunities control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="GridReorderEventArgs" /> instance containing the event data.</param>
        protected void gConnectionOpportunities_GridReorder(object sender, GridReorderEventArgs e)
        {
            var rockContext             = new RockContext();
            var service                 = new ConnectionOpportunityService(rockContext);
            var connectionOpportunities = service.Queryable().OrderBy(b => b.Order);

            service.Reorder(connectionOpportunities.ToList(), e.OldIndex, e.NewIndex);
            rockContext.SaveChanges();

            BindConnectionOpportunitiesGrid();
        }
コード例 #5
0
        /// <summary>
        /// Handles the SelectedIndexChanged event of the ddlConnectionType 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 ddlConnectionType_SelectedIndexChanged(object sender, EventArgs e)
        {
            var selectedConnectionTypeGuid   = ddlConnectionType.SelectedValueAsGuid();
            var connectionOpportunityService = new ConnectionOpportunityService(new RockContext());

            ddlConnectionOpportunity.Items.Clear();
            ddlConnectionOpportunity.Visible = selectedConnectionTypeGuid.HasValue;
            if (selectedConnectionTypeGuid.HasValue)
            {
                var connectionOpportunities = connectionOpportunityService.Queryable().Where(a => a.ConnectionType.Guid == selectedConnectionTypeGuid.Value);
                ddlConnectionOpportunity.Items.Add(new ListItem());
                ddlConnectionOpportunity.Items.AddRange(connectionOpportunities.Select(x => new ListItem {
                    Text = x.Name, Value = x.Guid.ToString()
                }).ToArray());
            }
        }
コード例 #6
0
        /// <summary>
        /// Shows the settings.
        /// </summary>
        protected override void ShowSettings()
        {
            if (Settings.Partitions.Count > 0)
            {
                deactivateTabs();
                liCounts.AddCssClass("active");
                pnlCounts.Visible = true;
            }

            var connectionOpportunityService = new ConnectionOpportunityService(new RockContext());
            var connections = connectionOpportunityService.Queryable().Where(co => co.IsActive == true).OrderBy(co => co.ConnectionType.Name).ThenBy(co => co.Name).ToList()
                              .Select(co => new ListItem(co.ConnectionType.Name + ": " + co.Name, co.Guid.ToString())).ToList();

            connections.Insert(0, new ListItem("Select One . . ."));
            rddlConnection.DataSource     = connections;
            rddlConnection.DataTextField  = "Text";
            rddlConnection.DataValueField = "Value";
            rddlConnection.DataBind();

            if (Settings.EntityGuid != Guid.Empty)
            {
                rddlConnection.SelectedValue = Settings.EntityGuid.ToString();
            }

            if (Settings.EntityTypeGuid == Rock.SystemGuid.EntityType.CONNECTION_OPPORTUNITY.AsGuid())
            {
                rddlType.SelectedValue = "Connection";
                rddlConnection.Visible = true;
            }
            else if (Settings.EntityTypeGuid == Rock.SystemGuid.EntityType.GROUP.AsGuid())
            {
                rddlType.SelectedValue = "Group";
                gpGroup.Visible        = true;
            }


            mdEdit.Show();
        }
コード例 #7
0
        /// <summary>
        /// Updates the list.
        /// </summary>
        private void UpdateList()
        {
            using ( var rockContext = new RockContext() )
            {
                var searchSelections = new Dictionary<string, string>();

                var connectionTypeId = GetAttributeValue( "ConnectionTypeId" ).AsInteger();
                var connectionType = new ConnectionTypeService( rockContext ).Get( connectionTypeId );
                var connectionOpportunityService = new ConnectionOpportunityService( rockContext );

                var qrySearch = connectionOpportunityService.Queryable().Where( a => a.ConnectionTypeId == connectionTypeId && a.IsActive == true ).ToList();

                if ( GetAttributeValue( "DisplayNameFilter" ).AsBoolean() )
                {
                    if ( !string.IsNullOrWhiteSpace( tbSearchName.Text ) )
                    {
                        searchSelections.Add( "tbSearchName", tbSearchName.Text );
                        var searchTerms = tbSearchName.Text.ToLower().SplitDelimitedValues( true );
                        qrySearch = qrySearch.Where( o => searchTerms.Any( t => t.Contains( o.Name.ToLower() ) || o.Name.ToLower().Contains( t ) ) ).ToList();
                    }
                }

                if ( GetAttributeValue( "DisplayCampusFilter" ).AsBoolean() )
                {
                    var searchCampuses = cblCampus.SelectedValuesAsInt;
                    if ( searchCampuses.Count > 0 )
                    {
                        searchSelections.Add( "cblCampus", searchCampuses.AsDelimited("|") );
                        qrySearch = qrySearch.Where( o => o.ConnectionOpportunityCampuses.Any( c => searchCampuses.Contains( c.CampusId ) ) ).ToList();
                    }
                }

                if ( GetAttributeValue( "DisplayAttributeFilters" ).AsBoolean() )
                {
                    // Filter query by any configured attribute filters
                    if ( AvailableAttributes != null && AvailableAttributes.Any() )
                    {
                        var attributeValueService = new AttributeValueService( rockContext );
                        var parameterExpression = attributeValueService.ParameterExpression;

                        foreach ( var attribute in AvailableAttributes )
                        {
                            string filterControlId = "filter_" + attribute.Id.ToString();
                            var filterControl = phAttributeFilters.FindControl( filterControlId );
                            if ( filterControl != null )
                            {
                                var filterValues = attribute.FieldType.Field.GetFilterValues( filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter );
                                var expression = attribute.FieldType.Field.AttributeFilterExpression( attribute.QualifierValues, filterValues, parameterExpression );
                                if ( expression != null )
                                {
                                    searchSelections.Add( filterControlId, filterValues.ToJson() );
                                    var attributeValues = attributeValueService
                                        .Queryable()
                                        .Where( v => v.Attribute.Id == attribute.Id );

                                    attributeValues = attributeValues.Where( parameterExpression, expression, null );

                                    qrySearch = qrySearch.Where( o => attributeValues.Select( v => v.EntityId ).Contains( o.Id ) ).ToList();
                                }
                            }
                        }
                    }
                }

                string sessionKey = string.Format( "ConnectionSearch_{0}", this.BlockId );
                Session[sessionKey] = searchSelections;

                var opportunities = qrySearch.OrderBy( s => s.PublicName ).ToList();

                var mergeFields = new Dictionary<string, object>();
                mergeFields.Add( "Opportunities", opportunities);
                mergeFields.Add( "CurrentPerson", CurrentPerson );

                var pageReference = new PageReference( GetAttributeValue( "DetailPage" ), null );
                mergeFields.Add( "DetailPage", BuildDetailPageUrl(pageReference.BuildUrl()) );

                lOutput.Text = GetAttributeValue( "LavaTemplate" ).ResolveMergeFields( mergeFields );

                if ( GetAttributeValue( "SetPageTitle" ).AsBoolean() )
                {
                    string pageTitle = "Connection";
                    RockPage.PageTitle = pageTitle;
                    RockPage.BrowserTitle = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                    RockPage.Header.Title = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                }

                // show debug info
                if ( GetAttributeValue( "EnableDebug" ).AsBoolean() && IsUserAuthorized( Authorization.EDIT ) )
                {
                    lDebug.Visible = true;
                    lDebug.Text = mergeFields.lavaDebugInfo();
                }
            }
        }
コード例 #8
0
        /// <summary>
        /// Handles the Click event of the btnEdit 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 btnConnect_Click(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var opportunityService       = new ConnectionOpportunityService(rockContext);
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var personService            = new PersonService(rockContext);

                // Get the opportunity and default status
                int opportunityId = PageParameter("OpportunityId").AsInteger();
                var opportunity   = opportunityService
                                    .Queryable()
                                    .Where(o => o.Id == opportunityId)
                                    .FirstOrDefault();

                int defaultStatusId = opportunity.ConnectionType.ConnectionStatuses
                                      .Where(s => s.IsDefault)
                                      .Select(s => s.Id)
                                      .FirstOrDefault();

                // If opportunity is valid and has a default status
                if (opportunity != null && defaultStatusId > 0)
                {
                    Person person = null;

                    string firstName = tbFirstName.Text.Trim();
                    string lastName  = tbLastName.Text.Trim();
                    string email     = tbEmail.Text.Trim();
                    int?   campusId  = cpCampus.SelectedCampusId;

                    // if a person guid was passed in from the query string use that
                    if (RockPage.PageParameter("PersonGuid") != null && !string.IsNullOrWhiteSpace(RockPage.PageParameter("PersonGuid")))
                    {
                        Guid?personGuid = RockPage.PageParameter("PersonGuid").AsGuidOrNull();

                        if (personGuid.HasValue)
                        {
                            person = personService.Get(personGuid.Value);
                        }
                    }
                    else if (CurrentPerson != null &&
                             CurrentPerson.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase) &&
                             (CurrentPerson.NickName.Equals(firstName, StringComparison.OrdinalIgnoreCase) || CurrentPerson.FirstName.Equals(firstName, StringComparison.OrdinalIgnoreCase)) &&
                             CurrentPerson.Email.Equals(email, StringComparison.OrdinalIgnoreCase))
                    {
                        // If the name and email entered are the same as current person (wasn't changed), use the current person
                        person = personService.Get(CurrentPerson.Id);
                    }

                    else
                    {
                        // Try to find matching person
                        var personMatches = personService.GetByMatch(firstName, lastName, email);
                        if (personMatches.Count() == 1)
                        {
                            // If one person with same name and email address exists, use that person
                            person = personMatches.First();
                        }
                    }

                    // If person was not found, create a new one
                    if (person == null)
                    {
                        // If a match was not found, create a new person
                        var dvcConnectionStatus = DefinedValueCache.Read(GetAttributeValue("ConnectionStatus").AsGuid());
                        var dvcRecordStatus     = DefinedValueCache.Read(GetAttributeValue("RecordStatus").AsGuid());

                        person                   = new Person();
                        person.FirstName         = firstName;
                        person.LastName          = lastName;
                        person.IsEmailActive     = true;
                        person.Email             = email;
                        person.EmailPreference   = EmailPreference.EmailAllowed;
                        person.RecordTypeValueId = DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()).Id;
                        if (dvcConnectionStatus != null)
                        {
                            person.ConnectionStatusValueId = dvcConnectionStatus.Id;
                        }
                        if (dvcRecordStatus != null)
                        {
                            person.RecordStatusValueId = dvcRecordStatus.Id;
                        }

                        PersonService.SaveNewPerson(person, rockContext, campusId, false);
                        person = personService.Get(person.Id);
                    }

                    // If there is a valid person with a primary alias, continue
                    if (person != null && person.PrimaryAliasId.HasValue)
                    {
                        var changes = new List <string>();

                        if (pnHome.Visible)
                        {
                            SavePhone(pnHome, person, _homePhone.Guid, changes);
                        }

                        if (pnMobile.Visible)
                        {
                            SavePhone(pnMobile, person, _cellPhone.Guid, changes);
                        }

                        if (changes.Any())
                        {
                            HistoryService.SaveChanges(
                                rockContext,
                                typeof(Person),
                                Rock.SystemGuid.Category.HISTORY_PERSON_DEMOGRAPHIC_CHANGES.AsGuid(),
                                person.Id,
                                changes);
                        }

                        // Now that we have a person, we can create the connection request
                        var connectionRequest = new ConnectionRequest();
                        connectionRequest.PersonAliasId           = person.PrimaryAliasId.Value;
                        connectionRequest.Comments                = tbComments.Text.Trim();
                        connectionRequest.ConnectionOpportunityId = opportunity.Id;
                        connectionRequest.ConnectionState         = ConnectionState.Active;
                        connectionRequest.ConnectionStatusId      = defaultStatusId;
                        connectionRequest.CampusId                = campusId;
                        connectionRequest.ConnectorPersonAliasId  = opportunity.GetDefaultConnectorPersonAliasId(campusId);
                        if (campusId.HasValue &&
                            opportunity != null &&
                            opportunity.ConnectionOpportunityCampuses != null)
                        {
                            var campus = opportunity.ConnectionOpportunityCampuses
                                         .Where(c => c.CampusId == campusId.Value)
                                         .FirstOrDefault();
                            if (campus != null)
                            {
                                connectionRequest.ConnectorPersonAliasId = campus.DefaultConnectorPersonAliasId;
                            }
                        }

                        if (!connectionRequest.IsValid)
                        {
                            // Controls will show warnings
                            return;
                        }

                        connectionRequestService.Add(connectionRequest);
                        rockContext.SaveChanges();

                        var mergeFields = new Dictionary <string, object>();
                        mergeFields.Add("Opportunity", new ConnectionOpportunityService(rockContext).Get(PageParameter("OpportunityId").AsInteger()));
                        mergeFields.Add("CurrentPerson", CurrentPerson);
                        mergeFields.Add("Person", person);

                        lResponseMessage.Text    = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);
                        lResponseMessage.Visible = true;

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
コード例 #9
0
        /// <summary>
        /// Sets the default number of requests.
        /// </summary>
        /// <param name="selectedCampaignConnectionItemGuid">The selected campaign connection item unique identifier.</param>
        private void SetDefaultNumberOfRequests(Guid?selectedCampaignConnectionItemGuid, int pendingCount)
        {
            if (!selectedCampaignConnectionItemGuid.HasValue)
            {
                // shouldn't happen
                return;
            }

            var campaignConnectionItems        = Rock.Web.SystemSettings.GetValue(CampaignConnectionKey.CAMPAIGN_CONNECTION_CONFIGURATION).FromJsonOrNull <List <CampaignItem> >() ?? new List <CampaignItem>();
            var selectedCampaignConnectionItem = campaignConnectionItems.Where(a => a.Guid == selectedCampaignConnectionItemGuid.Value).FirstOrDefault();

            var rockContext        = new RockContext();
            var opportunityService = new ConnectionOpportunityService(rockContext);
            IQueryable <ConnectionOpportunityConnectorGroup> opportunityConnecterGroupQuery = opportunityService.Queryable()
                                                                                              .Where(a => a.Guid == selectedCampaignConnectionItem.OpportunityGuid)
                                                                                              .SelectMany(a => a.ConnectionOpportunityConnectorGroups);

            int?defaultDailyLimitAssigned = null;

            // Check to see if the group member has any CampaignDailyLimit values defined.
            var currentPersonConnectorGroupMember = opportunityConnecterGroupQuery
                                                    .Select(s => s.ConnectorGroup).SelectMany(g => g.Members)
                                                    .WhereAttributeValue(rockContext, av => (av.Attribute.Key == "CampaignDailyLimit") && av.ValueAsNumeric > 0)
                                                    .FirstOrDefault(m => m.PersonId == this.CurrentPersonId.Value);

            if (currentPersonConnectorGroupMember != null)
            {
                currentPersonConnectorGroupMember.LoadAttributes();
                defaultDailyLimitAssigned = currentPersonConnectorGroupMember.GetAttributeValue("CampaignDailyLimit").AsIntegerOrNull();
            }

            if (defaultDailyLimitAssigned == null && selectedCampaignConnectionItem.CreateConnectionRequestOption == CreateConnectionRequestOptions.AsNeeded)
            {
                defaultDailyLimitAssigned = selectedCampaignConnectionItem.DailyLimitAssigned;
            }

            var entitySetItemService = new EntitySetItemService(rockContext);

            if (pendingCount == 0)
            {
                nbAddConnectionRequestsMessage.Text = "There are no pending requests remaining.";
                nbAddConnectionRequestsMessage.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Info;
                nbAddConnectionRequestsMessage.Visible             = true;
            }
            else if (pendingCount < defaultDailyLimitAssigned)
            {
                nbAddConnectionRequestsMessage.Text = string.Format("There are only {0} pending requests remaining.", pendingCount);
                nbAddConnectionRequestsMessage.NotificationBoxType = Rock.Web.UI.Controls.NotificationBoxType.Info;
                nbAddConnectionRequestsMessage.Visible             = true;
                defaultDailyLimitAssigned = pendingCount;
            }
            else
            {
                nbAddConnectionRequestsMessage.Visible = false;
            }

            nbNumberOfRequests.Text = defaultDailyLimitAssigned.ToString();
        }
コード例 #10
0
        /// <summary>
        /// Executes this instance.
        /// </summary>
        /// <param name="message"></param>
        public override void Execute(Message message)
        {
            using (var rockContext = new RockContext())
            {
                // Load the alert and alert type
                var financialTransactionAlertService = new FinancialTransactionAlertService(rockContext);
                var alert = financialTransactionAlertService.Queryable()
                            .AsNoTracking()
                            .Include(a => a.FinancialTransactionAlertType)
                            .FirstOrDefault(a => a.Id == message.FinancialTransactionAlertId);

                var alertType = alert?.FinancialTransactionAlertType;

                // If the alert or alert type are no longer in the database, then there is nothing that can be done
                if (alertType == null)
                {
                    return;
                }

                // Get the person that this alert was generated for. Several of the items below use this
                var personAliasService = new PersonAliasService(rockContext);
                var person             = personAliasService.Queryable()
                                         .AsNoTracking()
                                         .Where(pa => pa.Id == alert.PersonAliasId)
                                         .Select(pa => pa.Person)
                                         .FirstOrDefault();

                // Generate the merge objects for the lava templates used in the items below
                var isoDate           = alert.AlertDateTime.ToISO8601DateString();
                var alertsPageId      = PageCache.Get(SystemGuid.Page.GIVING_ALERTS).Id;
                var relativeAlertLink = $"page/{alertsPageId}?StartDate={isoDate}&EndDate={isoDate}&AlertTypeId={alertType.Id}";

                var mergeObjects = new Dictionary <string, object> {
                    { nameof(FinancialTransactionAlert), alert },
                    { nameof(FinancialTransactionAlertType), alertType },
                    { nameof(Person), person },
                    { "RelativeAlertLink", relativeAlertLink }
                };

                // Launch workflow if configured
                if (alertType.WorkflowTypeId.HasValue)
                {
                    var workflowAttributeValues = new Dictionary <string, string>();
                    workflowAttributeValues.Add(nameof(FinancialTransactionAlert), alert.Guid.ToString());
                    workflowAttributeValues.Add(nameof(FinancialTransactionAlertType), alertType.Guid.ToString());
                    workflowAttributeValues.Add(nameof(Person), person.Guid.ToString());
                    alert.LaunchWorkflow(alertType.WorkflowTypeId, string.Empty, workflowAttributeValues, null);
                }

                // Add the person to a connection opportunity if configured
                if (alertType.ConnectionOpportunityId.HasValue)
                {
                    var connectionOpportunityService = new ConnectionOpportunityService(rockContext);
                    var statuses = connectionOpportunityService.Queryable()
                                   .AsNoTracking()
                                   .Where(co =>
                                          co.Id == alertType.ConnectionOpportunityId)
                                   .SelectMany(co => co.ConnectionType.ConnectionStatuses)
                                   .Where(cs => cs.IsActive)
                                   .ToList()
                                   .OrderBy(cs => cs.Order);

                    var status = statuses.FirstOrDefault(cs => cs.IsDefault) ?? statuses.FirstOrDefault();

                    if (status != null)
                    {
                        var connectionRequestService = new ConnectionRequestService(rockContext);
                        var request = new ConnectionRequest
                        {
                            ConnectionOpportunityId = alertType.ConnectionOpportunityId.Value,
                            PersonAliasId           = alert.PersonAliasId,
                            ConnectionStatusId      = status.Id
                        };

                        if (alert.TransactionId.HasValue)
                        {
                            request.LoadAttributes();
                            request.SetAttributeValue("FinancialTransactionId", alert.TransactionId.Value.ToString());
                        }

                        connectionRequestService.Add(request);
                    }
                }

                // Send a bus event if configured
                if (alertType.SendBusEvent)
                {
                    new TransactionWasAlertedMessage
                    {
                        FinancialTransactionAlertId = alert.Id
                    }.Publish();
                }

                // Send a communication if configured
                if (alertType.SystemCommunicationId.HasValue)
                {
                    var systemCommunicationService = new SystemCommunicationService(rockContext);
                    var systemCommunication        = systemCommunicationService.Get(alertType.SystemCommunicationId.Value);

                    if (person != null && systemCommunication != null)
                    {
                        CommunicationHelper.SendMessage(person, ( int )person.CommunicationPreference, systemCommunication, mergeObjects);
                    }
                }

                // Send a communication to account followers if an Account Participant System Communication and Account is specified
                // for this alert type
                if (alertType.AccountParticipantSystemCommunicationId.HasValue && alertType.FinancialAccountId.HasValue)
                {
                    var systemCommunicationService            = new SystemCommunicationService(rockContext);
                    var financialAccountService               = new FinancialAccountService(rockContext);
                    var accountParticipantSystemCommunication = systemCommunicationService.Get(alertType.AccountParticipantSystemCommunicationId.Value);
                    if (accountParticipantSystemCommunication != null)
                    {
                        var accountFollowers = financialAccountService
                                               .GetAccountParticipants(alertType.FinancialAccountId.Value, RelatedEntityPurposeKey.FinancialAccountGivingAlert)
                                               .Select(a => a.Person);

                        foreach (var accountFollower in accountFollowers)
                        {
                            CommunicationHelper.SendMessage(accountFollower, ( int )accountFollower.CommunicationPreference, accountParticipantSystemCommunication, mergeObjects);
                        }
                    }
                }

                // Send a notification to a group if configured
                if (alertType.AlertSummaryNotificationGroupId.HasValue)
                {
                    var systemEmailGuid            = SystemGuid.SystemCommunication.FINANCIAL_TRANSACTION_ALERT_NOTIFICATION_SUMMARY.AsGuid();
                    var systemCommunicationService = new SystemCommunicationService(rockContext);
                    var systemCommunication        = systemCommunicationService.Get(systemEmailGuid);

                    CommunicationHelper.SendMessage(alertType.AlertSummaryNotificationGroupId.Value, systemCommunication, mergeObjects);
                }

                rockContext.SaveChanges();
            }
        }
コード例 #11
0
        public void LoadContent()
        {
            // get opportunity id
            int opportunityId = -1;

            if ( !string.IsNullOrWhiteSpace( PageParameter( "OpportunityId" ) ) )
            {
                opportunityId = Convert.ToInt32( PageParameter( "OpportunityId" ) );
            }

            if ( opportunityId > 0 )
            {
                RockContext rockContext = new RockContext();
                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );

                bool enableDebug = GetAttributeValue( "EnableDebug" ).AsBoolean();

                var qry = connectionOpportunityService
                    .Queryable()
                    .Where( g => g.Id == opportunityId );

                if ( !enableDebug )
                {
                    qry = qry.AsNoTracking();
                }
                var opportunity = qry.FirstOrDefault();

                var mergeFields = new Dictionary<string, object>();
                mergeFields.Add( "Opportunity", opportunity );

                // add linked pages
                Dictionary<string, object> linkedPages = new Dictionary<string, object>();
                linkedPages.Add( "SignupPage", LinkedPageUrl( "SignupPage", null ) );
                mergeFields.Add( "LinkedPages", linkedPages );

                mergeFields.Add( "CurrentPerson", CurrentPerson );

                var globalAttributeFields = Rock.Web.Cache.GlobalAttributesCache.GetMergeFields( CurrentPerson );
                globalAttributeFields.ToList().ForEach( d => mergeFields.Add( d.Key, d.Value ) );

                lOutput.Text = GetAttributeValue( "LavaTemplate" ).ResolveMergeFields( mergeFields );

                if ( GetAttributeValue( "SetPageTitle" ).AsBoolean() )
                {
                    string pageTitle = opportunity.PublicName;
                    RockPage.PageTitle = pageTitle;
                    RockPage.BrowserTitle = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                    RockPage.Header.Title = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                }

                // show debug info
                if ( GetAttributeValue( "EnableDebug" ).AsBoolean() && IsUserAuthorized( Authorization.EDIT ) )
                {
                    lDebug.Visible = true;
                    lDebug.Text = mergeFields.lavaDebugInfo();
                }
            }
        }
コード例 #12
0
        /// <summary>
        /// Updates the list.
        /// </summary>
        private void UpdateList()
        {
            using (var rockContext = new RockContext())
            {
                var searchSelections = new Dictionary <string, string>();

                var connectionTypeId             = GetAttributeValue("ConnectionTypeId").AsInteger();
                var connectionType               = new ConnectionTypeService(rockContext).Get(connectionTypeId);
                var connectionOpportunityService = new ConnectionOpportunityService(rockContext);

                var qrySearch = connectionOpportunityService.Queryable().Where(a => a.ConnectionTypeId == connectionTypeId && a.IsActive == true).ToList();

                if (GetAttributeValue("DisplayNameFilter").AsBoolean())
                {
                    if (!string.IsNullOrWhiteSpace(tbSearchName.Text))
                    {
                        searchSelections.Add("tbSearchName", tbSearchName.Text);
                        var searchTerms = tbSearchName.Text.ToLower().SplitDelimitedValues(true);
                        qrySearch = qrySearch.Where(o => searchTerms.Any(t => t.Contains(o.Name.ToLower()) || o.Name.ToLower().Contains(t))).ToList();
                    }
                }

                if (GetAttributeValue("DisplayCampusFilter").AsBoolean())
                {
                    var searchCampuses = cblCampus.SelectedValuesAsInt;
                    if (searchCampuses.Count > 0)
                    {
                        searchSelections.Add("cblCampus", searchCampuses.AsDelimited("|"));
                        qrySearch = qrySearch.Where(o => o.ConnectionOpportunityCampuses.Any(c => searchCampuses.Contains(c.CampusId))).ToList();
                    }
                }

                if (GetAttributeValue("DisplayAttributeFilters").AsBoolean())
                {
                    // Filter query by any configured attribute filters
                    if (AvailableAttributes != null && AvailableAttributes.Any())
                    {
                        var attributeValueService = new AttributeValueService(rockContext);
                        var parameterExpression   = attributeValueService.ParameterExpression;

                        foreach (var attribute in AvailableAttributes)
                        {
                            string filterControlId = "filter_" + attribute.Id.ToString();
                            var    filterControl   = phAttributeFilters.FindControl(filterControlId);
                            if (filterControl != null)
                            {
                                var filterValues = attribute.FieldType.Field.GetFilterValues(filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter);
                                var expression   = attribute.FieldType.Field.AttributeFilterExpression(attribute.QualifierValues, filterValues, parameterExpression);
                                if (expression != null)
                                {
                                    searchSelections.Add(filterControlId, filterValues.ToJson());
                                    var attributeValues = attributeValueService
                                                          .Queryable()
                                                          .Where(v => v.Attribute.Id == attribute.Id);

                                    attributeValues = attributeValues.Where(parameterExpression, expression, null);

                                    qrySearch = qrySearch.Where(o => attributeValues.Select(v => v.EntityId).Contains(o.Id)).ToList();
                                }
                            }
                        }
                    }
                }

                string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId);
                Session[sessionKey] = searchSelections;

                var opportunities = qrySearch.OrderBy(s => s.PublicName).ToList();

                var mergeFields = new Dictionary <string, object>();
                mergeFields.Add("CurrentPerson", CurrentPerson);
                mergeFields.Add("CampusContext", RockPage.GetCurrentContext(EntityTypeCache.Read("Rock.Model.Campus")) as Campus);
                var pageReference = new PageReference(GetAttributeValue("DetailPage"), null);
                mergeFields.Add("DetailPage", BuildDetailPageUrl(pageReference.BuildUrl()));

                // iterate through the opportunities and lava merge the summaries and descriptions
                foreach (var opportunity in opportunities)
                {
                    opportunity.Summary     = opportunity.Summary.ResolveMergeFields(mergeFields);
                    opportunity.Description = opportunity.Description.ResolveMergeFields(mergeFields);
                }

                mergeFields.Add("Opportunities", opportunities);

                lOutput.Text = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);

                if (GetAttributeValue("SetPageTitle").AsBoolean())
                {
                    string pageTitle = "Connection";
                    RockPage.PageTitle    = pageTitle;
                    RockPage.BrowserTitle = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                    RockPage.Header.Title = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                }
            }
        }
コード例 #13
0
        /// <summary>
        /// Gets the connector campus ids, if the connectorPerson is not a member of the connecter groups for the opportunity, this wil return an empty lkist
        /// </summary>
        /// <param name="selectedCampaignItem">The selected campaign item.</param>
        /// <param name="connectorPerson">The connector person.</param>
        /// <returns></returns>
        public static List <int?> GetConnectorCampusIds(CampaignItem selectedCampaignItem, Person connectorPerson)
        {
            if (connectorPerson == null)
            {
                // if no connector person is specified, we can return list that just an "All" (null) campus
                var result = new List <int?>();
                result.Add(( int? )null);
                return(result);
            }

            var         rockContext = new RockContext();
            List <int?> connectorCampusIds;
            var         opportunityService = new ConnectionOpportunityService(rockContext);

            IQueryable <ConnectionOpportunityConnectorGroup> opportunityConnecterGroupQuery = opportunityService.Queryable()
                                                                                              .Where(a => a.IsActive && a.Guid == selectedCampaignItem.OpportunityGuid)
                                                                                              .SelectMany(a => a.ConnectionOpportunityConnectorGroups);

            int connectorPersonId = connectorPerson.Id;

            // get the campusid of the connector's connector group) of this opportunity
            // If the person is a member in more than one of opportunity groups, get all the campus ids that the connector can work with
            connectorCampusIds = opportunityConnecterGroupQuery.Where(a => a.ConnectorGroup.Members.Any(m => m.GroupMemberStatus == GroupMemberStatus.Active && m.PersonId == connectorPersonId)).Select(a => a.CampusId).Distinct().ToList();

            // NOTE: if connectorPerson isn't in a ConnectionOpportunityConnectorGroup, there will be no campus ids. The AddCampaignRequests block shouldn't of let them request connections for this campaign
            return(connectorCampusIds);
        }
コード例 #14
0
        /// <summary>
        /// Binds the event calendar items grid.
        /// </summary>
        protected void BindConnectionOpportunitiesGrid()
        {
            if ( _connectionType != null )
            {
                pnlConnectionOpportunities.Visible = true;

                rFilter.Visible = true;
                gConnectionOpportunities.Visible = true;

                var rockContext = new RockContext();

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );
                var qry = connectionOpportunityService.Queryable()
                    .Where( o => o.ConnectionTypeId == _connectionType.Id );

                // Filter by Active Only
                if ( cbActive.Checked )
                {
                    qry = qry.Where( o => o.IsActive );
                }

                // Filter query by any configured attribute filters
                if ( AvailableAttributes != null && AvailableAttributes.Any() )
                {
                    var attributeValueService = new AttributeValueService( rockContext );
                    var parameterExpression = attributeValueService.ParameterExpression;

                    foreach ( var attribute in AvailableAttributes )
                    {
                        var filterControl = phAttributeFilters.FindControl( "filter_" + attribute.Id.ToString() );
                        if ( filterControl != null )
                        {
                            var filterValues = attribute.FieldType.Field.GetFilterValues( filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter );
                            var expression = attribute.FieldType.Field.AttributeFilterExpression( attribute.QualifierValues, filterValues, parameterExpression );
                            if ( expression != null )
                            {
                                var attributeValues = attributeValueService
                                    .Queryable()
                                    .Where( v => v.Attribute.Id == attribute.Id );

                                attributeValues = attributeValues.Where( parameterExpression, expression, null );

                                qry = qry.Where( w => attributeValues.Select( v => v.EntityId ).Contains( w.Id ) );
                            }
                        }
                    }
                }
                SortProperty sortProperty = gConnectionOpportunities.SortProperty;

                List<ConnectionOpportunity> connectionOpportunities = null;
                if ( sortProperty != null )
                {
                    connectionOpportunities = qry.Sort( sortProperty ).ToList();
                }
                else
                {
                    connectionOpportunities = qry.ToList().OrderByDescending( a => a.Name ).ToList();
                }

                gConnectionOpportunities.ObjectList = new Dictionary<string, object>();
                connectionOpportunities.ForEach( m => gConnectionOpportunities.ObjectList.Add( m.Id.ToString(), m ) );
                gConnectionOpportunities.EntityTypeId = EntityTypeCache.Read( "Rock.Model.ConnectionOpportunity" ).Id;

                gConnectionOpportunities.DataSource = connectionOpportunities.Select( o => new
                {
                    o.Id,
                    o.Guid,
                    Name = o.Name,
                    GroupType = o.GroupType.Name,
                    Active = o.IsActive ? "<span class='label label-success'>Active</span>" : "<span class='label label-campus'>Inactive</span>"

                } ).ToList();

                gConnectionOpportunities.DataBind();
            }
            else
            {
                pnlConnectionOpportunities.Visible = false;
            }
        }
コード例 #15
0
        /// <summary>
        /// Binds the event calendar items grid.
        /// </summary>
        protected void BindConnectionOpportunitiesGrid()
        {
            if (_connectionType != null)
            {
                pnlConnectionOpportunities.Visible = true;

                rFilter.Visible = true;
                gConnectionOpportunities.Visible = true;

                var rockContext = new RockContext();

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext);
                var qry = connectionOpportunityService.Queryable()
                          .Where(o => o.ConnectionTypeId == _connectionType.Id);

                // Filter by Active Only
                if (cbActive.Checked)
                {
                    qry = qry.Where(o => o.IsActive);
                }

                // Filter query by any configured attribute filters
                if (AvailableAttributes != null && AvailableAttributes.Any())
                {
                    var attributeValueService = new AttributeValueService(rockContext);
                    var parameterExpression   = attributeValueService.ParameterExpression;

                    foreach (var attribute in AvailableAttributes)
                    {
                        var filterControl = phAttributeFilters.FindControl("filter_" + attribute.Id.ToString());
                        if (filterControl == null)
                        {
                            continue;
                        }

                        var filterValues    = attribute.FieldType.Field.GetFilterValues(filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter);
                        var filterIsDefault = attribute.FieldType.Field.IsEqualToValue(filterValues, attribute.DefaultValue);
                        var expression      = attribute.FieldType.Field.AttributeFilterExpression(attribute.QualifierValues, filterValues, parameterExpression);
                        if (expression == null)
                        {
                            continue;
                        }

                        var attributeValues = attributeValueService
                                              .Queryable()
                                              .Where(v => v.Attribute.Id == attribute.Id);

                        var filteredAttributeValues = attributeValues.Where(parameterExpression, expression, null);

                        if (filterIsDefault)
                        {
                            qry = qry.Where(w =>
                                            !attributeValues.Any(v => v.EntityId == w.Id) ||
                                            filteredAttributeValues.Select(v => v.EntityId).Contains(w.Id));
                        }
                        else
                        {
                            qry = qry.Where(w =>
                                            filteredAttributeValues.Select(v => v.EntityId).Contains(w.Id));
                        }
                    }
                }
                SortProperty sortProperty = gConnectionOpportunities.SortProperty;

                List <ConnectionOpportunity> connectionOpportunities = null;
                if (sortProperty != null)
                {
                    connectionOpportunities = qry.Sort(sortProperty).ToList();
                }
                else
                {
                    connectionOpportunities = qry.ToList().OrderBy(a => a.Name).ToList();
                }

                // Only include opportunities that current person is allowed to view
                var authorizedOpportunities = new List <ConnectionOpportunity>();
                foreach (var opportunity in connectionOpportunities)
                {
                    if (opportunity.IsAuthorized(Authorization.VIEW, CurrentPerson))
                    {
                        authorizedOpportunities.Add(opportunity);
                    }
                }

                gConnectionOpportunities.DataSource = authorizedOpportunities;
                gConnectionOpportunities.DataBind();
            }
            else
            {
                pnlConnectionOpportunities.Visible = false;
            }
        }
コード例 #16
0
        /// <summary>
        /// Handles the Click event of the btnEdit 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 btnConnect_Click( object sender, EventArgs e )
        {
            using ( var rockContext = new RockContext() )
            {
                var opportunityService = new ConnectionOpportunityService( rockContext );
                var connectionRequestService = new ConnectionRequestService( rockContext );
                var personService = new PersonService( rockContext );

                // Get the opportunity and default status
                int opportunityId = PageParameter( "OpportunityId" ).AsInteger();
                var opportunity = opportunityService
                    .Queryable()
                    .Where( o => o.Id == opportunityId )
                    .FirstOrDefault();

                int defaultStatusId = opportunity.ConnectionType.ConnectionStatuses
                    .Where( s => s.IsDefault )
                    .Select( s => s.Id )
                    .FirstOrDefault();

                // If opportunity is valid and has a default status
                if ( opportunity != null && defaultStatusId > 0 )
                {
                    Person person = null;

                    string firstName = tbFirstName.Text.Trim();
                    string lastName = tbLastName.Text.Trim();
                    string email = tbEmail.Text.Trim();
                    int? campudId = cpCampus.SelectedCampusId;

                    if ( CurrentPerson != null &&
                        CurrentPerson.LastName.Equals( lastName, StringComparison.OrdinalIgnoreCase ) &&
                        CurrentPerson.NickName.Equals( firstName, StringComparison.OrdinalIgnoreCase ) &&
                        CurrentPerson.Email.Equals( email, StringComparison.OrdinalIgnoreCase ) )
                    {
                        // If the name and email entered are the same as current person (wasn't changed), use the current person
                        person = personService.Get( CurrentPerson.Id );
                    }

                    else
                    {
                        // Try to find matching person
                        var personMatches = personService.GetByMatch( firstName, lastName, email );
                        if ( personMatches.Count() == 1 )
                        {
                            // If one person with same name and email address exists, use that person
                            person = personMatches.First();
                        }
                    }

                    // If person was not found, create a new one
                    if ( person == null )
                    {
                        // If a match was not found, create a new person
                        var dvcConnectionStatus = DefinedValueCache.Read( GetAttributeValue( "ConnectionStatus" ).AsGuid() );
                        var dvcRecordStatus = DefinedValueCache.Read( GetAttributeValue( "RecordStatus" ).AsGuid() );

                        person = new Person();
                        person.FirstName = firstName;
                        person.LastName = lastName;
                        person.IsEmailActive = true;
                        person.Email = email;
                        person.EmailPreference = EmailPreference.EmailAllowed;
                        person.RecordTypeValueId = DefinedValueCache.Read( Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid() ).Id;
                        if ( dvcConnectionStatus != null )
                        {
                            person.ConnectionStatusValueId = dvcConnectionStatus.Id;
                        }
                        if ( dvcRecordStatus != null )
                        {
                            person.RecordStatusValueId = dvcRecordStatus.Id;
                        }

                        PersonService.SaveNewPerson( person, rockContext, campudId, false );
                        person = personService.Get( person.Id );
                    }

                    // If there is a valid person with a primary alias, continue
                    if ( person != null && person.PrimaryAliasId.HasValue )
                    {
                        var changes = new List<string>();

                        if ( pnHome.Visible )
                        {
                            SavePhone( pnHome, person, _homePhone.Guid, changes );
                        }

                        if ( pnMobile.Visible )
                        {
                            SavePhone( pnMobile, person, _cellPhone.Guid, changes );
                        }

                        if ( changes.Any() )
                        {
                            HistoryService.SaveChanges(
                                rockContext,
                                typeof( Person ),
                                Rock.SystemGuid.Category.HISTORY_PERSON_DEMOGRAPHIC_CHANGES.AsGuid(),
                                person.Id,
                                changes );
                        }

                        // Now that we have a person, we can create the connection request
                        var connectionRequest = new ConnectionRequest();
                        connectionRequest.PersonAliasId = person.PrimaryAliasId.Value;
                        connectionRequest.Comments = tbComments.Text.Trim();
                        connectionRequest.ConnectionOpportunityId = opportunity.Id;
                        connectionRequest.ConnectionState = ConnectionState.Active;
                        connectionRequest.ConnectionStatusId = defaultStatusId;
                        connectionRequest.CampusId = campudId;

                        if ( !connectionRequest.IsValid )
                        {
                            // Controls will show warnings
                            return;
                        }

                        connectionRequestService.Add( connectionRequest );
                        rockContext.SaveChanges();

                        var mergeFields = new Dictionary<string, object>();
                        mergeFields.Add( "Opportunity", new ConnectionOpportunityService( rockContext ).Get( PageParameter( "OpportunityId" ).AsInteger() ) );
                        mergeFields.Add( "CurrentPerson", CurrentPerson );
                        mergeFields.Add( "Person", person );

                        lResponseMessage.Text = GetAttributeValue( "LavaTemplate" ).ResolveMergeFields( mergeFields );
                        lResponseMessage.Visible = true;

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
コード例 #17
0
        /// <summary>
        /// Binds the event calendar items grid.
        /// </summary>
        protected void BindConnectionOpportunitiesGrid()
        {
            if ( _connectionType != null )
            {
                pnlConnectionOpportunities.Visible = true;

                rFilter.Visible = true;
                gConnectionOpportunities.Visible = true;

                var rockContext = new RockContext();

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );
                var qry = connectionOpportunityService.Queryable()
                    .Where( o => o.ConnectionTypeId == _connectionType.Id );

                // Filter by Active Only
                if ( cbActive.Checked )
                {
                    qry = qry.Where( o => o.IsActive );
                }

                // Filter query by any configured attribute filters
                if ( AvailableAttributes != null && AvailableAttributes.Any() )
                {
                    var attributeValueService = new AttributeValueService( rockContext );
                    var parameterExpression = attributeValueService.ParameterExpression;

                    foreach ( var attribute in AvailableAttributes )
                    {
                        var filterControl = phAttributeFilters.FindControl( "filter_" + attribute.Id.ToString() );
                        if ( filterControl != null )
                        {
                            var filterValues = attribute.FieldType.Field.GetFilterValues( filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter );
                            var expression = attribute.FieldType.Field.AttributeFilterExpression( attribute.QualifierValues, filterValues, parameterExpression );
                            if ( expression != null )
                            {
                                var attributeValues = attributeValueService
                                    .Queryable()
                                    .Where( v => v.Attribute.Id == attribute.Id );

                                attributeValues = attributeValues.Where( parameterExpression, expression, null );

                                qry = qry.Where( w => attributeValues.Select( v => v.EntityId ).Contains( w.Id ) );
                            }
                        }
                    }
                }
                SortProperty sortProperty = gConnectionOpportunities.SortProperty;

                List<ConnectionOpportunity> connectionOpportunities = null;
                if ( sortProperty != null )
                {
                    connectionOpportunities = qry.Sort( sortProperty ).ToList();
                }
                else
                {
                    connectionOpportunities = qry.ToList().OrderBy( a => a.Name ).ToList();
                }

                gConnectionOpportunities.DataSource = connectionOpportunities;
                gConnectionOpportunities.DataBind();
            }
            else
            {
                pnlConnectionOpportunities.Visible = false;
            }
        }
コード例 #18
0
        public void LoadContent()
        {
            // get opportunity id
            int opportunityId = -1;

            if ( !string.IsNullOrWhiteSpace( PageParameter( "OpportunityId" ) ) )
            {
                opportunityId = Convert.ToInt32( PageParameter( "OpportunityId" ) );
            }

            if ( opportunityId > 0 )
            {
                RockContext rockContext = new RockContext();
                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );

                bool enableDebug = GetAttributeValue( "EnableDebug" ).AsBoolean();

                var qry = connectionOpportunityService
                    .Queryable()
                    .Where( g => g.Id == opportunityId );

                if ( !enableDebug )
                {
                    qry = qry.AsNoTracking();
                }
                var opportunity = qry.FirstOrDefault();

                var mergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields( this.RockPage, this.CurrentPerson );
                Dictionary<string, object> linkedPages = new Dictionary<string, object>();
                linkedPages.Add( "SignupPage", LinkedPageRoute( "SignupPage" ) );
                mergeFields.Add( "LinkedPages", linkedPages );

                mergeFields.Add( "CampusContext", RockPage.GetCurrentContext( EntityTypeCache.Read( "Rock.Model.Campus" ) ) as Campus );

                // run opportunity summary and details through lava
                opportunity.Summary = opportunity.Summary.ResolveMergeFields(mergeFields);
                opportunity.Description = opportunity.Description.ResolveMergeFields( mergeFields );

                mergeFields.Add( "Opportunity", opportunity );

                // add linked pages

                lOutput.Text = GetAttributeValue( "LavaTemplate" ).ResolveMergeFields( mergeFields );

                if ( GetAttributeValue( "SetPageTitle" ).AsBoolean() )
                {
                    string pageTitle = opportunity.PublicName;
                    RockPage.PageTitle = pageTitle;
                    RockPage.BrowserTitle = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                    RockPage.Header.Title = String.Format( "{0} | {1}", pageTitle, RockPage.Site.Name );
                }

                // show debug info
                if ( GetAttributeValue( "EnableDebug" ).AsBoolean() && IsUserAuthorized( Authorization.EDIT ) )
                {
                    lDebug.Visible = true;
                    lDebug.Text = mergeFields.lavaDebugInfo();
                }
            }
        }
コード例 #19
0
        /// <summary>
        /// Handles the Click event of the btnSave 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 btnSave_Click( object sender, EventArgs e )
        {
            ConnectionOpportunity connectionOpportunity = null;

            using ( RockContext rockContext = new RockContext() )
            {
                if ( !ValidPlacementGroups() )
                {
                    return;
                }

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );
                EventCalendarItemService eventCalendarItemService = new EventCalendarItemService( rockContext );
                ConnectionWorkflowService connectionWorkflowService = new ConnectionWorkflowService( rockContext );
                ConnectionRequestWorkflowService connectionRequestWorkflowService = new ConnectionRequestWorkflowService( rockContext );
                ConnectionOpportunityConnectorGroupService connectionOpportunityConnectorGroupsService = new ConnectionOpportunityConnectorGroupService( rockContext );
                ConnectionOpportunityCampusService connectionOpportunityCampusService = new ConnectionOpportunityCampusService( rockContext );
                ConnectionOpportunityGroupConfigService connectionOpportunityGroupConfigService = new ConnectionOpportunityGroupConfigService( rockContext );
                ConnectionOpportunityGroupService connectionOpportunityGroupService = new ConnectionOpportunityGroupService( rockContext );

                int connectionOpportunityId = hfConnectionOpportunityId.ValueAsInt();
                if ( connectionOpportunityId != 0 )
                {
                    connectionOpportunity = connectionOpportunityService
                        .Queryable( "ConnectionOpportunityGroups, ConnectionWorkflows" )
                        .Where( ei => ei.Id == connectionOpportunityId )
                        .FirstOrDefault();
                }

                if ( connectionOpportunity == null )
                {
                    connectionOpportunity = new ConnectionOpportunity();
                    connectionOpportunity.Name = string.Empty;
                    connectionOpportunity.ConnectionTypeId = PageParameter( "ConnectionTypeId" ).AsInteger();
                    connectionOpportunityService.Add( connectionOpportunity );
                }

                connectionOpportunity.Name = tbName.Text;
                connectionOpportunity.Summary = htmlSummary.Text;
                connectionOpportunity.Description = htmlDescription.Text;
                connectionOpportunity.IsActive = cbIsActive.Checked;
                connectionOpportunity.PublicName = tbPublicName.Text;
                connectionOpportunity.IconCssClass = tbIconCssClass.Text;

                int? orphanedPhotoId = null;
                if ( imgupPhoto.BinaryFileId != null )
                {
                    if ( connectionOpportunity.PhotoId != imgupPhoto.BinaryFileId )
                    {
                        orphanedPhotoId = connectionOpportunity.PhotoId;
                    }
                    connectionOpportunity.PhotoId = imgupPhoto.BinaryFileId.Value;
                }

                // remove any workflows that removed in the UI
                var uiWorkflows = WorkflowsState.Where( w => w.ConnectionTypeId == null ).Select( l => l.Guid );
                foreach ( var connectionWorkflow in connectionOpportunity.ConnectionWorkflows.Where( l => !uiWorkflows.Contains( l.Guid ) ).ToList() )
                {
                    foreach( var requestWorkflow in connectionRequestWorkflowService.Queryable()
                        .Where( w => w.ConnectionWorkflowId == connectionWorkflow.Id ) )
                    {
                        connectionRequestWorkflowService.Delete( requestWorkflow );
                    }

                    connectionOpportunity.ConnectionWorkflows.Remove( connectionWorkflow );
                    connectionWorkflowService.Delete( connectionWorkflow );
                }

                // Add or Update workflows from the UI
                foreach ( var workflowTypeStateObj in WorkflowsState.Where( w => w.ConnectionTypeId == null ) )
                {
                    ConnectionWorkflow connectionOpportunityWorkflow = connectionOpportunity.ConnectionWorkflows.Where( a => a.Guid == workflowTypeStateObj.Guid ).FirstOrDefault();
                    if ( connectionOpportunityWorkflow == null )
                    {
                        connectionOpportunityWorkflow = new ConnectionWorkflow();
                        connectionOpportunity.ConnectionWorkflows.Add( connectionOpportunityWorkflow );
                    }
                    connectionOpportunityWorkflow.Id = workflowTypeStateObj.Id;
                    connectionOpportunityWorkflow.Guid = workflowTypeStateObj.Guid;
                    connectionOpportunityWorkflow.ConnectionTypeId = workflowTypeStateObj.ConnectionTypeId;
                    connectionOpportunityWorkflow.WorkflowTypeId = workflowTypeStateObj.WorkflowTypeId;
                    connectionOpportunityWorkflow.TriggerType = workflowTypeStateObj.TriggerType;
                    connectionOpportunityWorkflow.QualifierValue = workflowTypeStateObj.QualifierValue;
                    connectionOpportunityWorkflow.ConnectionOpportunityId = connectionOpportunity.Id;
                }

                // remove any group campuses that removed in the UI
                var uiConnectorGroups = ConnectorGroupsState.Select( l => l.Guid );
                foreach ( var connectionOpportunityConnectorGroups in connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( l => !uiConnectorGroups.Contains( l.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityConnectorGroups.Remove( connectionOpportunityConnectorGroups );
                    connectionOpportunityConnectorGroupsService.Delete( connectionOpportunityConnectorGroups );
                }

                // Add or Update group campuses from the UI
                foreach ( var groupStateObj in ConnectorGroupsState )
                {
                    ConnectionOpportunityConnectorGroup connectionOpportunityConnectorGroup = connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( a => a.Guid == groupStateObj.Guid ).FirstOrDefault();
                    if ( connectionOpportunityConnectorGroup == null )
                    {
                        connectionOpportunityConnectorGroup = new ConnectionOpportunityConnectorGroup();
                        connectionOpportunity.ConnectionOpportunityConnectorGroups.Add( connectionOpportunityConnectorGroup );
                    }

                    connectionOpportunityConnectorGroup.CampusId = groupStateObj.CampusId;
                    connectionOpportunityConnectorGroup.ConnectorGroupId = groupStateObj.GroupId;
                    connectionOpportunityConnectorGroup.ConnectionOpportunityId = connectionOpportunity.Id;
                }

                // remove any campuses that removed in the UI
                var uiCampuses = cblSelectedItemsAsInt( cblCampus );
                foreach ( var connectionOpportunityCampus in connectionOpportunity.ConnectionOpportunityCampuses.Where( c => !uiCampuses.Contains( c.CampusId ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityCampuses.Remove( connectionOpportunityCampus );
                    connectionOpportunityCampusService.Delete( connectionOpportunityCampus );
                }

                // Add or Update campuses from the UI
                foreach ( var campusId in uiCampuses )
                {
                    ConnectionOpportunityCampus connectionOpportunityCampus = connectionOpportunity.ConnectionOpportunityCampuses.Where( c => c.CampusId == campusId ).FirstOrDefault();
                    if ( connectionOpportunityCampus == null )
                    {
                        connectionOpportunityCampus = new ConnectionOpportunityCampus();
                        connectionOpportunity.ConnectionOpportunityCampuses.Add( connectionOpportunityCampus );
                    }

                    connectionOpportunityCampus.CampusId = campusId;
                    connectionOpportunityCampus.DefaultConnectorPersonAliasId = DefaultConnectors.ContainsKey( campusId ) ? DefaultConnectors[campusId] : (int?)null;
                }

                // remove any group configs that were removed in the UI
                var uiGroupConfigs = GroupConfigsState.Select( r => r.Guid );
                foreach ( var connectionOpportunityGroupConfig in connectionOpportunity.ConnectionOpportunityGroupConfigs.Where( r => !uiGroupConfigs.Contains( r.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityGroupConfigs.Remove( connectionOpportunityGroupConfig );
                    connectionOpportunityGroupConfigService.Delete( connectionOpportunityGroupConfig );
                }

                // Add or Update group configs from the UI
                foreach ( var groupConfigStateObj in GroupConfigsState )
                {
                    ConnectionOpportunityGroupConfig connectionOpportunityGroupConfig = connectionOpportunity.ConnectionOpportunityGroupConfigs.Where( a => a.Guid == groupConfigStateObj.Guid ).FirstOrDefault();
                    if ( connectionOpportunityGroupConfig == null )
                    {
                        connectionOpportunityGroupConfig = new ConnectionOpportunityGroupConfig();
                        connectionOpportunity.ConnectionOpportunityGroupConfigs.Add( connectionOpportunityGroupConfig );
                    }

                    connectionOpportunityGroupConfig.GroupTypeId = groupConfigStateObj.GroupTypeId;
                    connectionOpportunityGroupConfig.GroupMemberRoleId = groupConfigStateObj.GroupMemberRoleId;
                    connectionOpportunityGroupConfig.GroupMemberStatus = groupConfigStateObj.GroupMemberStatus;
                    connectionOpportunityGroupConfig.UseAllGroupsOfType = groupConfigStateObj.UseAllGroupsOfType;

                    connectionOpportunityGroupConfig.ConnectionOpportunityId = connectionOpportunity.Id;
                }

                // Remove any groups that were removed in the UI
                var uiGroups = GroupsState.Select( r => r.Guid );
                foreach ( var connectionOpportunityGroup in connectionOpportunity.ConnectionOpportunityGroups.Where( r => !uiGroups.Contains( r.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityGroups.Remove( connectionOpportunityGroup );
                    connectionOpportunityGroupService.Delete( connectionOpportunityGroup );
                }

                // Add or Update groups from the UI
                foreach ( var groupStateObj in GroupsState )
                {
                    ConnectionOpportunityGroup connectionOpportunityGroup = connectionOpportunity.ConnectionOpportunityGroups.Where( a => a.Guid == groupStateObj.Guid ).FirstOrDefault();
                    if ( connectionOpportunityGroup == null )
                    {
                        connectionOpportunityGroup = new ConnectionOpportunityGroup();
                        connectionOpportunity.ConnectionOpportunityGroups.Add( connectionOpportunityGroup );
                    }

                    connectionOpportunityGroup.GroupId = groupStateObj.GroupId;
                    connectionOpportunityGroup.ConnectionOpportunityId = connectionOpportunity.Id;
                }

                connectionOpportunity.LoadAttributes();
                Rock.Attribute.Helper.GetEditValues( phAttributes, connectionOpportunity );

                if ( !Page.IsValid )
                {
                    return;
                }

                if ( !connectionOpportunity.IsValid )
                {
                    // Controls will render the error messages
                    return;
                }

                // use WrapTransaction since SaveAttributeValues does it's own RockContext.SaveChanges()
                rockContext.WrapTransaction( () =>
                {
                    rockContext.SaveChanges();

                    connectionOpportunity.SaveAttributeValues( rockContext );

                    if ( orphanedPhotoId.HasValue )
                    {
                        BinaryFileService binaryFileService = new BinaryFileService( rockContext );
                        var binaryFile = binaryFileService.Get( orphanedPhotoId.Value );
                        if ( binaryFile != null )
                        {
                            string errorMessage;
                            if ( binaryFileService.CanDelete( binaryFile, out errorMessage ) )
                            {
                                binaryFileService.Delete( binaryFile );
                                rockContext.SaveChanges();
                            }
                        }
                    }
                } );

                ConnectionWorkflowService.FlushCachedTriggers();

                var qryParams = new Dictionary<string, string>();
                qryParams["ConnectionTypeId"] = PageParameter( "ConnectionTypeId" );
                NavigateToParentPage( qryParams );
            }
        }
コード例 #20
0
        /// <summary>
        /// Handles the Click event of the btnEdit 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 btnConnect_Click(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var opportunityService       = new ConnectionOpportunityService(rockContext);
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var personService            = new PersonService(rockContext);

                // Get the opportunity and default status
                int opportunityId = PageParameter("OpportunityId").AsInteger();
                var opportunity   = opportunityService
                                    .Queryable()
                                    .Where(o => o.Id == opportunityId)
                                    .FirstOrDefault();

                int defaultStatusId = opportunity.ConnectionType.ConnectionStatuses
                                      .Where(s => s.IsDefault)
                                      .Select(s => s.Id)
                                      .FirstOrDefault();

                // If opportunity is valid and has a default status
                if (opportunity != null && defaultStatusId > 0)
                {
                    Person person = null;

                    string   firstName = tbFirstName.Text.Trim();
                    string   lastName  = tbLastName.Text.Trim();
                    DateTime?birthdate = bpBirthdate.SelectedDate;
                    string   email     = tbEmail.Text.Trim();
                    int?     campusId  = cpCampus.SelectedCampusId;

                    // if a person guid was passed in from the query string use that
                    if (RockPage.PageParameter("PersonGuid") != null && !string.IsNullOrWhiteSpace(RockPage.PageParameter("PersonGuid")))
                    {
                        Guid?personGuid = RockPage.PageParameter("PersonGuid").AsGuidOrNull();

                        if (personGuid.HasValue)
                        {
                            person = personService.Get(personGuid.Value);
                        }
                    }
                    else if (CurrentPerson != null &&
                             CurrentPerson.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase) &&
                             (CurrentPerson.NickName.Equals(firstName, StringComparison.OrdinalIgnoreCase) || CurrentPerson.FirstName.Equals(firstName, StringComparison.OrdinalIgnoreCase)) &&
                             CurrentPerson.Email.Equals(email, StringComparison.OrdinalIgnoreCase))
                    {
                        // If the name and email entered are the same as current person (wasn't changed), use the current person
                        person = personService.Get(CurrentPerson.Id);
                    }

                    else
                    {
                        List <Person> personMatches = new List <Person>();
                        if (Assembly.GetExecutingAssembly().GetReferencedAssemblies()
                            .FirstOrDefault(c => c.FullName == "org.secc.PersonMatch") != null)
                        {
                            var assembly = Assembly.Load("org.secc.PersonMatch");
                            if (assembly != null)
                            {
                                Type type = assembly.GetExportedTypes().Where(et => et.FullName == "org.secc.PersonMatch.Extension").FirstOrDefault();
                                if (type != null)
                                {
                                    var matchMethod = type.GetMethod("GetByMatch");
                                    personMatches = ((IEnumerable <Person>)matchMethod.Invoke(null, new object[] { personService, firstName, lastName, birthdate, email, null, null, null })).ToList();
                                }
                            }
                        }
                        else
                        {
                            personMatches = personService.GetByMatch(firstName, lastName, email).ToList();
                            if (bpBirthdate.Visible)
                            {
                                personMatches = personMatches.Where(p => p.BirthDate == birthdate).ToList();
                            }
                        }

                        if (personMatches.Count() == 1 &&
                            personMatches.First().Email != null &&
                            email.ToLower().Trim() == personMatches.First().Email.ToLower().Trim())
                        {
                            // If one person with same name and email address exists, use that person
                            person = personMatches.First();
                        }
                    }

                    // If person was not found, create a new one
                    if (person == null)
                    {
                        // If a match was not found, create a new person
                        var dvcConnectionStatus = DefinedValueCache.Read(GetAttributeValue("ConnectionStatus").AsGuid());
                        var dvcRecordStatus     = DefinedValueCache.Read(GetAttributeValue("RecordStatus").AsGuid());

                        person               = new Person();
                        person.FirstName     = firstName;
                        person.LastName      = lastName;
                        person.IsEmailActive = true;
                        person.SetBirthDate(birthdate);
                        person.Email             = email;
                        person.EmailPreference   = EmailPreference.EmailAllowed;
                        person.RecordTypeValueId = DefinedValueCache.Read(Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()).Id;
                        if (dvcConnectionStatus != null)
                        {
                            person.ConnectionStatusValueId = dvcConnectionStatus.Id;
                        }
                        if (dvcRecordStatus != null)
                        {
                            person.RecordStatusValueId = dvcRecordStatus.Id;
                        }

                        PersonService.SaveNewPerson(person, rockContext, campusId, false);
                        person = personService.Get(person.Id);
                    }

                    // If there is a valid person with a primary alias, continue
                    if (person != null && person.PrimaryAliasId.HasValue)
                    {
                        var changes = new List <string>();

                        if (pnHome.Visible)
                        {
                            SavePhone(pnHome, person, _homePhone.Guid, changes);
                        }

                        if (pnMobile.Visible)
                        {
                            SavePhone(pnMobile, person, _cellPhone.Guid, changes);
                        }

                        // Save the DOB
                        if (bpBirthdate.Visible && bpBirthdate.SelectedDate.HasValue && bpBirthdate.SelectedDate != person.BirthDate)
                        {
                            person.BirthDay   = bpBirthdate.SelectedDate.Value.Day;
                            person.BirthMonth = bpBirthdate.SelectedDate.Value.Month;
                            person.BirthYear  = bpBirthdate.SelectedDate.Value.Year;
                        }

                        if (changes.Any())
                        {
                            HistoryService.SaveChanges(
                                rockContext,
                                typeof(Person),
                                Rock.SystemGuid.Category.HISTORY_PERSON_DEMOGRAPHIC_CHANGES.AsGuid(),
                                person.Id,
                                changes);
                        }

                        // Now that we have a person, we can create the connection requests
                        int RepeaterIndex = 0;
                        foreach (ConnectionRoleRequest roleRequest in RoleRequests)
                        {
                            var connectionRequest = new ConnectionRequest();
                            connectionRequest.PersonAliasId           = person.PrimaryAliasId.Value;
                            connectionRequest.Comments                = tbComments.Text.Trim();
                            connectionRequest.ConnectionOpportunityId = opportunity.Id;
                            connectionRequest.ConnectionState         = ConnectionState.Active;
                            connectionRequest.ConnectionStatusId      = defaultStatusId;
                            connectionRequest.CampusId                = campusId;
                            connectionRequest.ConnectorPersonAliasId  = opportunity.GetDefaultConnectorPersonAliasId(campusId);
                            if (campusId.HasValue &&
                                opportunity != null &&
                                opportunity.ConnectionOpportunityCampuses != null)
                            {
                                var campus = opportunity.ConnectionOpportunityCampuses
                                             .Where(c => c.CampusId == campusId.Value)
                                             .FirstOrDefault();
                                if (campus != null)
                                {
                                    connectionRequest.ConnectorPersonAliasId = campus.DefaultConnectorPersonAliasId;
                                }
                            }

                            var hdnGroupId         = (( HiddenField )(rptGroupRoleAttributes.Items[RepeaterIndex].FindControl("hdnGroupId")));
                            var hdnGroupRoleTypeId = (( HiddenField )(rptGroupRoleAttributes.Items[RepeaterIndex].FindControl("hdnGroupRoleTypeId")));


                            if (hdnGroupId.Value.AsInteger() > 0 && hdnGroupRoleTypeId.Value.AsInteger() > 0)
                            {
                                connectionRequest.AssignedGroupId           = hdnGroupId.Value.AsInteger();
                                connectionRequest.AssignedGroupMemberRoleId = hdnGroupRoleTypeId.Value.AsInteger();
                                var groupConfig = opportunity.ConnectionOpportunityGroupConfigs.Where(gc => gc.GroupMemberRoleId == hdnGroupRoleTypeId.Value.AsInteger()).FirstOrDefault();
                                connectionRequest.AssignedGroupMemberStatus = groupConfig.GroupMemberStatus;
                            }

                            var connectionAttributes = GetGroupMemberAttributes(rockContext, RepeaterIndex);

                            if (connectionAttributes != null && connectionAttributes.Keys.Any())
                            {
                                var connectionDictionary = new Dictionary <string, string>();
                                foreach (var kvp in connectionAttributes)
                                {
                                    connectionDictionary.Add(kvp.Key, kvp.Value.Value);
                                }

                                connectionRequest.AssignedGroupMemberAttributeValues = connectionDictionary.ToJson();
                            }

                            if (!connectionRequest.IsValid)
                            {
                                // Controls will show warnings
                                return;
                            }

                            connectionRequestService.Add(connectionRequest);

                            RepeaterIndex++;
                        }

                        rockContext.SaveChanges();

                        var mergeFields = new Dictionary <string, object>();
                        mergeFields.Add("Opportunity", new ConnectionOpportunityService(rockContext).Get(PageParameter("OpportunityId").AsInteger()));
                        mergeFields.Add("CurrentPerson", CurrentPerson);
                        mergeFields.Add("Person", person);

                        lResponseMessage.Text    = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);
                        lResponseMessage.Visible = true;

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
コード例 #21
0
        /// <summary>
        /// Binds the event calendar items grid.
        /// </summary>
        protected void BindConnectionOpportunitiesGrid()
        {
            if (_connectionType != null)
            {
                pnlConnectionOpportunities.Visible = true;

                rFilter.Visible = true;
                gConnectionOpportunities.Visible = true;

                var rockContext = new RockContext();

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService(rockContext);
                var qry = connectionOpportunityService.Queryable()
                          .Where(o => o.ConnectionTypeId == _connectionType.Id);

                // Filter by Active Only
                if (cbActive.Checked)
                {
                    qry = qry.Where(o => o.IsActive);
                }

                // Filter query by any configured attribute filters
                if (AvailableAttributes != null && AvailableAttributes.Any())
                {
                    var attributeValueService = new AttributeValueService(rockContext);
                    var parameterExpression   = attributeValueService.ParameterExpression;

                    foreach (var attribute in AvailableAttributes)
                    {
                        var filterControl = phAttributeFilters.FindControl("filter_" + attribute.Id.ToString());
                        if (filterControl != null)
                        {
                            var filterValues = attribute.FieldType.Field.GetFilterValues(filterControl, attribute.QualifierValues, Rock.Reporting.FilterMode.SimpleFilter);
                            var expression   = attribute.FieldType.Field.AttributeFilterExpression(attribute.QualifierValues, filterValues, parameterExpression);
                            if (expression != null)
                            {
                                var attributeValues = attributeValueService
                                                      .Queryable()
                                                      .Where(v => v.Attribute.Id == attribute.Id);

                                attributeValues = attributeValues.Where(parameterExpression, expression, null);

                                qry = qry.Where(w => attributeValues.Select(v => v.EntityId).Contains(w.Id));
                            }
                        }
                    }
                }
                SortProperty sortProperty = gConnectionOpportunities.SortProperty;

                List <ConnectionOpportunity> connectionOpportunities = null;
                if (sortProperty != null)
                {
                    connectionOpportunities = qry.Sort(sortProperty).ToList();
                }
                else
                {
                    connectionOpportunities = qry.ToList().OrderBy(a => a.Name).ToList();
                }

                gConnectionOpportunities.DataSource = connectionOpportunities;
                gConnectionOpportunities.DataBind();
            }
            else
            {
                pnlConnectionOpportunities.Visible = false;
            }
        }
コード例 #22
0
        /// <summary>
        /// Handles the Click event of the btnSave 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 btnSave_Click( object sender, EventArgs e )
        {
            ConnectionOpportunity connectionOpportunity = null;

            using ( RockContext rockContext = new RockContext() )
            {
                int? groupTypeId = ddlGroupType.SelectedValueAsInt();
                if ( groupTypeId.HasValue && GroupsState.Any( g => g.Group.GroupTypeId != groupTypeId.Value ) )
                {
                    var groupType = new GroupTypeService( rockContext ).Get( groupTypeId.Value );
                    if ( groupType != null )
                    {
                        nbInvalidGroupTypes.Text = string.Format( "<p>One or more of the selected groups is not a <strong>{0}</strong> type. Please select groups that have a group type of <strong>{0}</strong>.", groupType.Name );
                        nbInvalidGroupTypes.Visible = true;
                        return;
                    }
                }

                ConnectionOpportunityService connectionOpportunityService = new ConnectionOpportunityService( rockContext );
                EventCalendarItemService eventCalendarItemService = new EventCalendarItemService( rockContext );
                ConnectionWorkflowService connectionWorkflowService = new ConnectionWorkflowService( rockContext );
                ConnectionOpportunityConnectorGroupService connectionOpportunityConnectorGroupsService = new ConnectionOpportunityConnectorGroupService( rockContext );
                ConnectionOpportunityCampusService connectionOpportunityCampusService = new ConnectionOpportunityCampusService( rockContext );
                ConnectionOpportunityGroupService connectionOpportunityGroupService = new ConnectionOpportunityGroupService( rockContext );

                int connectionOpportunityId = hfConnectionOpportunityId.ValueAsInt();
                if ( connectionOpportunityId != 0 )
                {
                    connectionOpportunity = connectionOpportunityService
                        .Queryable( "ConnectionOpportunityGroups, ConnectionWorkflows" )
                        .Where( ei => ei.Id == connectionOpportunityId )
                        .FirstOrDefault();
                }

                if ( connectionOpportunity == null )
                {
                    connectionOpportunity = new ConnectionOpportunity();
                    connectionOpportunity.Name = string.Empty;
                    connectionOpportunity.ConnectionTypeId = PageParameter( "ConnectionTypeId" ).AsInteger();
                    connectionOpportunityService.Add( connectionOpportunity );

                }

                connectionOpportunity.Name = tbName.Text;
                connectionOpportunity.Description = tbDescription.Text;
                connectionOpportunity.IsActive = cbIsActive.Checked;
                connectionOpportunity.PublicName = tbPublicName.Text;
                connectionOpportunity.IconCssClass = tbIconCssClass.Text;
                connectionOpportunity.GroupTypeId = ddlGroupType.SelectedValue.AsInteger();
                connectionOpportunity.GroupMemberRoleId = ddlGroupRole.SelectedValue.AsInteger();
                connectionOpportunity.GroupMemberStatus = ddlGroupMemberStatus.SelectedValueAsEnum<GroupMemberStatus>();

                int? orphanedPhotoId = null;
                if ( imgupPhoto.BinaryFileId != null )
                {
                    if ( connectionOpportunity.PhotoId != imgupPhoto.BinaryFileId )
                    {
                        orphanedPhotoId = connectionOpportunity.PhotoId;
                    }
                    connectionOpportunity.PhotoId = imgupPhoto.BinaryFileId.Value;
                }

                // remove any workflows that removed in the UI
                var uiWorkflows = WorkflowsState.Where( w => w.ConnectionTypeId == null ).Select( l => l.Guid );
                foreach ( var connectionOpportunityWorkflow in connectionOpportunity.ConnectionWorkflows.Where( l => !uiWorkflows.Contains( l.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionWorkflows.Remove( connectionOpportunityWorkflow );
                    connectionWorkflowService.Delete( connectionOpportunityWorkflow );
                }

                // Add or Update workflows from the UI
                foreach ( ConnectionWorkflow connectionOpportunityWorkflowState in WorkflowsState.Where( w => w.ConnectionTypeId == null ) )
                {
                    ConnectionWorkflow connectionOpportunityWorkflow = connectionOpportunity.ConnectionWorkflows.Where( a => a.Guid == connectionOpportunityWorkflowState.Guid ).FirstOrDefault();
                    if ( connectionOpportunityWorkflow == null )
                    {
                        connectionOpportunityWorkflow = new ConnectionWorkflow();
                        connectionOpportunity.ConnectionWorkflows.Add( connectionOpportunityWorkflow );
                    }
                    connectionOpportunityWorkflow.CopyPropertiesFrom( connectionOpportunityWorkflowState );
                    connectionOpportunityWorkflow.ConnectionOpportunityId = connectionOpportunity.Id;
                }

                // remove any group campuses that removed in the UI
                var uiGroupCampuses = GroupCampusesState.Select( l => l.Guid );
                foreach ( var connectionOpportunityConnectorGroups in connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( l => !uiGroupCampuses.Contains( l.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityConnectorGroups.Remove( connectionOpportunityConnectorGroups );
                    connectionOpportunityConnectorGroupsService.Delete( connectionOpportunityConnectorGroups );
                }

                // Add or Update group campuses from the UI
                foreach ( var connectionOpportunityConnectorGroupsState in GroupCampusesState )
                {
                    ConnectionOpportunityConnectorGroup connectionOpportunityConnectorGroups = connectionOpportunity.ConnectionOpportunityConnectorGroups.Where( a => a.Guid == connectionOpportunityConnectorGroupsState.Guid ).FirstOrDefault();
                    if ( connectionOpportunityConnectorGroups == null )
                    {
                        connectionOpportunityConnectorGroups = new ConnectionOpportunityConnectorGroup();
                        connectionOpportunity.ConnectionOpportunityConnectorGroups.Add( connectionOpportunityConnectorGroups );
                    }

                    connectionOpportunityConnectorGroups.CopyPropertiesFrom( connectionOpportunityConnectorGroupsState );
                }

                // remove any campuses that removed in the UI
                var uiCampuses = cblCampus.SelectedValuesAsInt;
                foreach ( var connectionOpportunityCampus in connectionOpportunity.ConnectionOpportunityCampuses.Where( c => !uiCampuses.Contains( c.CampusId ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityCampuses.Remove( connectionOpportunityCampus );
                    connectionOpportunityCampusService.Delete( connectionOpportunityCampus );
                }

                // Add or Update campuses from the UI
                foreach ( var campusId in uiCampuses )
                {
                    ConnectionOpportunityCampus connectionOpportunityCampus = connectionOpportunity.ConnectionOpportunityCampuses.Where( c => c.CampusId == campusId ).FirstOrDefault();
                    if ( connectionOpportunityCampus == null )
                    {
                        connectionOpportunityCampus = new ConnectionOpportunityCampus();
                        connectionOpportunity.ConnectionOpportunityCampuses.Add( connectionOpportunityCampus );
                    }

                    connectionOpportunityCampus.CampusId = campusId;
                }

                // Remove any groups that were removed in the UI
                var uiGroups = GroupsState.Select( r => r.Guid );
                foreach ( var connectionOpportunityGroup in connectionOpportunity.ConnectionOpportunityGroups.Where( r => !uiGroups.Contains( r.Guid ) ).ToList() )
                {
                    connectionOpportunity.ConnectionOpportunityGroups.Remove( connectionOpportunityGroup );
                    connectionOpportunityGroupService.Delete( connectionOpportunityGroup );
                }

                // Add or Update groups from the UI
                foreach ( var connectionOpportunityGroupState in GroupsState )
                {
                    ConnectionOpportunityGroup connectionOpportunityGroup = connectionOpportunity.ConnectionOpportunityGroups.Where( a => a.Guid == connectionOpportunityGroupState.Guid ).FirstOrDefault();
                    if ( connectionOpportunityGroup == null )
                    {
                        connectionOpportunityGroup = new ConnectionOpportunityGroup();
                        connectionOpportunity.ConnectionOpportunityGroups.Add( connectionOpportunityGroup );
                    }

                    connectionOpportunityGroup.CopyPropertiesFrom( connectionOpportunityGroupState );
                }

                connectionOpportunity.LoadAttributes();
                Rock.Attribute.Helper.GetEditValues( phAttributes, connectionOpportunity );

                if ( !Page.IsValid )
                {
                    return;
                }

                if ( !connectionOpportunity.IsValid )
                {
                    // Controls will render the error messages
                    return;
                }

                // use WrapTransaction since SaveAttributeValues does it's own RockContext.SaveChanges()
                rockContext.WrapTransaction( () =>
                {
                    rockContext.SaveChanges();

                    connectionOpportunity.SaveAttributeValues( rockContext );

                    if ( orphanedPhotoId.HasValue )
                    {
                        BinaryFileService binaryFileService = new BinaryFileService( rockContext );
                        var binaryFile = binaryFileService.Get( orphanedPhotoId.Value );
                        if ( binaryFile != null )
                        {
                            string errorMessage;
                            if ( binaryFileService.CanDelete( binaryFile, out errorMessage ) )
                            {
                                binaryFileService.Delete( binaryFile );
                                rockContext.SaveChanges();
                            }
                        }
                    }
                } );

                var qryParams = new Dictionary<string, string>();
                qryParams["ConnectionTypeId"] = PageParameter( "ConnectionTypeId" );
                NavigateToParentPage( qryParams );
            }
        }
コード例 #23
0
ファイル: SampleData.ascx.cs プロジェクト: NewPointe/Rockit
        /// <summary>
        /// Adds the connections requests to the system from the given XML element.
        /// </summary>
        /// <example>
        ///   &lt;connections&gt;
        ///       &lt;connection type="Involvement" opportunity="Children's" comment="I would love to help teach kids about Jesus." date="2015-10-11T00:00:00" personGuid="1dfff821-e97c-4324-9883-cf59b5c5bdd6" /&gt;
        ///   &lt;/connections&gt;
        /// </example>
        /// <param name="elemConnections">The elem connections.</param>
        /// <param name="rockContext">The rock context.</param>
        private void AddConnections( XElement elemConnections, RockContext rockContext )
        {
            if ( elemConnections == null )
            {
                return;
            }

            ConnectionRequestService crService = new ConnectionRequestService( rockContext );
            ConnectionOpportunityService coService = new ConnectionOpportunityService( rockContext );
            ConnectionTypeService typeService = new ConnectionTypeService( rockContext );
            ConnectionStatusService connectionStatusService = new ConnectionStatusService( rockContext );
            ConnectionStatus noContact = connectionStatusService.Get( "901e1a6a-0e91-4f42-880f-47c061c24e0c".AsGuid() );

            // Find the type and it's corresponding opportunity and then add a connection request for the given person.
            foreach ( var element in elemConnections.Elements( "connection" ) )
            {
                string connectionTypeName = element.Attribute( "type" ).Value.Trim();
                string opportunityName = element.Attribute( "opportunity" ).Value.Trim();
                string comment = element.Attribute( "comment" ).Value.Trim();
                DateTime date = DateTime.Parse( element.Attribute( "date" ).Value.Trim(), new CultureInfo( "en-US" ) );
                Guid personGuid = element.Attribute( "personGuid" ).Value.Trim().AsGuid();

                var connectionOpportunity = coService.Queryable( "ConnectionType" ).AsNoTracking().Where( co => co.ConnectionType.Name == connectionTypeName && co.Name == opportunityName ).FirstOrDefault();

                // make sure we found a matching connection opportunity
                if ( connectionOpportunity != null )
                {
                    ConnectionRequest connectionRequest = new ConnectionRequest()
                    {
                        ConnectionOpportunityId = connectionOpportunity.Id,
                        PersonAliasId = _peopleAliasDictionary[personGuid],
                        Comments = comment,
                        ConnectionStatus = noContact,
                        ConnectionState = global::ConnectionState.Active,
                        CreatedDateTime = date
                    };

                    crService.Add( connectionRequest );
                }
            }
        }
コード例 #24
0
        /// <summary>
        /// Handles the Click event of the btnEdit 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 btnConnect_Click(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var opportunityService       = new ConnectionOpportunityService(rockContext);
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var personService            = new PersonService(rockContext);

                Person person = null;

                string firstName         = tbFirstName.Text.Trim();
                string lastName          = tbLastName.Text.Trim();
                string email             = tbEmail.Text.Trim();
                string mobilePhoneNumber = pnMobile.Text.Trim();
                int?   campusId          = cpCampus.SelectedCampusId;

                // if a person guid was passed in from the query string use that
                if (RockPage.PageParameter("PersonGuid") != null && !string.IsNullOrWhiteSpace(RockPage.PageParameter("PersonGuid")))
                {
                    Guid?personGuid = RockPage.PageParameter("PersonGuid").AsGuidOrNull();

                    if (personGuid.HasValue)
                    {
                        person = personService.Get(personGuid.Value);
                    }
                }
                else if (CurrentPerson != null &&
                         CurrentPerson.LastName.Equals(lastName, StringComparison.OrdinalIgnoreCase) &&
                         (CurrentPerson.NickName.Equals(firstName, StringComparison.OrdinalIgnoreCase) || CurrentPerson.FirstName.Equals(firstName, StringComparison.OrdinalIgnoreCase)) &&
                         CurrentPerson.Email.Equals(email, StringComparison.OrdinalIgnoreCase))
                {
                    // If the name and email entered are the same as current person (wasn't changed), use the current person
                    person = personService.Get(CurrentPerson.Id);
                }
                else
                {
                    // Try to find matching person
                    var personQuery = new PersonService.PersonMatchQuery(firstName, lastName, email, mobilePhoneNumber);
                    person = personService.FindPerson(personQuery, true);
                }

                // If person was not found, create a new one
                if (person == null)
                {
                    // If a match was not found, create a new person
                    var dvcConnectionStatus = DefinedValueCache.Get(GetAttributeValue("ConnectionStatus").AsGuid());
                    var dvcRecordStatus     = DefinedValueCache.Get(GetAttributeValue("RecordStatus").AsGuid());

                    person                   = new Person();
                    person.FirstName         = firstName;
                    person.LastName          = lastName;
                    person.IsEmailActive     = true;
                    person.Email             = email;
                    person.EmailPreference   = EmailPreference.EmailAllowed;
                    person.RecordTypeValueId = DefinedValueCache.Get(Rock.SystemGuid.DefinedValue.PERSON_RECORD_TYPE_PERSON.AsGuid()).Id;
                    if (dvcConnectionStatus != null)
                    {
                        person.ConnectionStatusValueId = dvcConnectionStatus.Id;
                    }
                    if (dvcRecordStatus != null)
                    {
                        person.RecordStatusValueId = dvcRecordStatus.Id;
                    }

                    PersonService.SaveNewPerson(person, rockContext, campusId, false);
                    person = personService.Get(person.Id);
                }

                // If there is a valid person with a primary alias, continue
                if (person != null && person.PrimaryAliasId.HasValue)
                {
                    if (pnHome.Visible)
                    {
                        SavePhone(pnHome, person, _homePhone.Guid);
                    }

                    if (pnMobile.Visible)
                    {
                        SavePhone(pnMobile, person, _cellPhone.Guid);
                    }

                    //
                    // Now that we have a person, we can create the Connection Request
                    // Walk each of the controls found and determine if we need to
                    // take any action for the value of that control.
                    //
                    var checkboxes = new List <Control>();
                    var types      = new Type[] { typeof(CheckBox), typeof(RadioButton) };
                    KFSFindControlsRecursive(phConnections, types, ref checkboxes);

                    foreach (CheckBox box in checkboxes)
                    {
                        if (box.Checked)
                        {
                            int opportunityId = box.ID.AsInteger();
                            var opportunity   = opportunityService
                                                .Queryable()
                                                .Where(o => o.Id == opportunityId)
                                                .FirstOrDefault();

                            int defaultStatusId = opportunity.ConnectionType.ConnectionStatuses
                                                  .Where(s => s.IsDefault)
                                                  .Select(s => s.Id)
                                                  .FirstOrDefault();

                            // If opportunity is valid and has a default status
                            if (opportunity != null && defaultStatusId > 0)
                            {
                                var personCampus = person.GetCampus();
                                if (personCampus != null)
                                {
                                    campusId = personCampus.Id;
                                }

                                var connectionRequest = new ConnectionRequest();
                                connectionRequest.PersonAliasId           = person.PrimaryAliasId.Value;
                                connectionRequest.Comments                = tbComments.Text.Trim();
                                connectionRequest.ConnectionOpportunityId = opportunity.Id;
                                connectionRequest.ConnectionState         = ConnectionState.Active;
                                connectionRequest.ConnectionStatusId      = defaultStatusId;
                                connectionRequest.CampusId                = campusId;
                                connectionRequest.ConnectorPersonAliasId  = opportunity.GetDefaultConnectorPersonAliasId(campusId);
                                if (campusId.HasValue &&
                                    opportunity != null &&
                                    opportunity.ConnectionOpportunityCampuses != null)
                                {
                                    var campus = opportunity.ConnectionOpportunityCampuses
                                                 .Where(c => c.CampusId == campusId.Value)
                                                 .FirstOrDefault();
                                    if (campus != null)
                                    {
                                        connectionRequest.ConnectorPersonAliasId = campus.DefaultConnectorPersonAliasId;
                                    }
                                }

                                if (!connectionRequest.IsValid)
                                {
                                    // Controls will show warnings
                                    return;
                                }

                                connectionRequestService.Add(connectionRequest);

                                rockContext.SaveChanges();

                                var mergeFields = new Dictionary <string, object>();
                                mergeFields.Add("CurrentPerson", CurrentPerson);
                                mergeFields.Add("Person", person);

                                lResponseMessage.Text    = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);
                                lResponseMessage.Visible = true;

                                pnlSignup.Visible = false;
                            }
                        }
                    }
                }
            }
        }
コード例 #25
0
        /// <summary>
        /// Updates the list.
        /// </summary>
        private void UpdateList()
        {
            using (var rockContext = new RockContext())
            {
                var searchSelections = new Dictionary <string, string>();

                var connectionTypeId             = GetAttributeValue("ConnectionTypeId").AsInteger();
                var connectionType               = new ConnectionTypeService(rockContext).Get(connectionTypeId);
                var connectionOpportunityService = new ConnectionOpportunityService(rockContext);

                var qrySearch = connectionOpportunityService.Queryable().Where(a => a.ConnectionTypeId == connectionTypeId && a.IsActive == true).ToList();

                if (GetAttributeValue("EnableCampusContext").AsBoolean() && !GetAttributeValue("DisplayCampusFilter").AsBoolean())
                {
                    var campusEntityType = EntityTypeCache.Get("Rock.Model.Campus");
                    var contextCampus    = RockPage.GetCurrentContext(campusEntityType) as Campus;

                    if (contextCampus != null)
                    {
                        var campusId = contextCampus.Id;
                        qrySearch = qrySearch.Where(o => o.ConnectionOpportunityCampuses.Any(c => c.CampusId.Equals(campusId))).ToList();
                    }
                }

                if (AttributeOne != null)
                {
                    var control = phAttributeOne.Controls[0] as DropDownList;
                    if (control != null)
                    {
                        searchSelections.Add("ddlAttributeOne", control.SelectedValue);

                        var attributeValueService = new AttributeValueService(rockContext);
                        var parameterExpression   = attributeValueService.ParameterExpression;

                        var value = AttributeOne.FieldType.Field.GetEditValue(control, AttributeOne.QualifierValues);
                        if (!string.IsNullOrWhiteSpace(value))
                        {
                            var attributeValues = attributeValueService
                                                  .Queryable()
                                                  .Where(v => v.Attribute.Id == AttributeOne.Id)
                                                  .Where(v => v.Value.Equals(value));
                            qrySearch = qrySearch.Where(o => attributeValues.Select(v => v.EntityId).Contains(o.Id)).ToList();
                        }
                    }
                    else
                    {
                        var newDdlOne = phAttributeOne.Controls[2] as DropDownList;

                        searchSelections.Add("ddlAttributeOne", newDdlOne.SelectedValue);

                        var attributeValueService = new AttributeValueService(rockContext);
                        var parameterExpression   = attributeValueService.ParameterExpression;

                        var value = newDdlOne.SelectedValue;
                        if (!string.IsNullOrWhiteSpace(value))
                        {
                            var attributeValues = attributeValueService
                                                  .Queryable()
                                                  .Where(v => v.Attribute.Id == AttributeOne.Id)
                                                  .Where(v => v.Value.Contains(value));
                            qrySearch = qrySearch.Where(o => attributeValues.Select(v => v.EntityId).Contains(o.Id)).ToList();
                        }
                    }
                }

                if (AttributeTwo != null)
                {
                    var control = phAttributeTwo.Controls[0] as DropDownList;
                    if (control != null)
                    {
                        searchSelections.Add("ddlAttributeTwo", control.SelectedValue);

                        var attributeValueService = new AttributeValueService(rockContext);
                        var parameterExpression   = attributeValueService.ParameterExpression;

                        var value = AttributeTwo.FieldType.Field.GetEditValue(control, AttributeTwo.QualifierValues);
                        if (!string.IsNullOrWhiteSpace(value))
                        {
                            var attributeValues = attributeValueService
                                                  .Queryable()
                                                  .Where(v => v.Attribute.Id == AttributeTwo.Id)
                                                  .Where(v => v.Value.Equals(value));
                            qrySearch = qrySearch.Where(o => attributeValues.Select(v => v.EntityId).Contains(o.Id)).ToList();
                        }
                    }
                    else
                    {
                        var newDdlTwo = phAttributeTwo.Controls[2] as DropDownList;

                        searchSelections.Add("ddlAttributeTwo", newDdlTwo.SelectedValue);

                        var attributeValueService = new AttributeValueService(rockContext);
                        var parameterExpression   = attributeValueService.ParameterExpression;

                        var value = newDdlTwo.SelectedValue;
                        if (!string.IsNullOrWhiteSpace(value))
                        {
                            var attributeValues = attributeValueService
                                                  .Queryable()
                                                  .Where(v => v.Attribute.Id == AttributeTwo.Id)
                                                  .Where(v => v.Value.Contains(value));
                            qrySearch = qrySearch.Where(o => attributeValues.Select(v => v.EntityId).Contains(o.Id)).ToList();
                        }
                    }
                }

                string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId);
                Session[sessionKey] = searchSelections;

                var opportunities = qrySearch.OrderBy(s => s.PublicName).ToList();

                var mergeFields = new Dictionary <string, object>();
                mergeFields.Add("CurrentPerson", CurrentPerson);
                mergeFields.Add("CampusContext", RockPage.GetCurrentContext(EntityTypeCache.Get("Rock.Model.Campus")) as Campus);
                var pageReference = new PageReference(GetAttributeValue("DetailPage"), null);
                mergeFields.Add("DetailPage", BuildDetailPageUrl(pageReference.BuildUrl()));

                // iterate through the opportunities and lava merge the summaries and descriptions
                foreach (var opportunity in opportunities)
                {
                    opportunity.Summary     = opportunity.Summary.ResolveMergeFields(mergeFields);
                    opportunity.Description = opportunity.Description.ResolveMergeFields(mergeFields);
                }

                mergeFields.Add("Opportunities", opportunities);

                lOutput.Text = GetAttributeValue("LavaTemplate").ResolveMergeFields(mergeFields);

                if (GetAttributeValue("SetPageTitle").AsBoolean())
                {
                    string pageTitle = "Connection";
                    RockPage.PageTitle    = pageTitle;
                    RockPage.BrowserTitle = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                    RockPage.Header.Title = String.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                }
            }
        }
コード例 #26
0
        /// <summary>
        /// Gets the summary data.
        /// </summary>
        private void GetSummaryData()
        {
            var midnightToday = RockDateTime.Today.AddDays(1);

            SummaryState = new List <ConnectionTypeSummary>();

            var rockContext = new RockContext();
            var connectionOpportunityService = new ConnectionOpportunityService(rockContext);
            var followingService             = new FollowingService(rockContext);
            var opportunityEntityTypeId      = EntityTypeCache.Get <ConnectionOpportunity>().Id;

            var followedOpportunityIds = followingService.Queryable()
                                         .AsNoTracking()
                                         .Where(f =>
                                                f.PersonAliasId == CurrentPersonAliasId &&
                                                f.EntityTypeId == opportunityEntityTypeId &&
                                                string.IsNullOrEmpty(f.PurposeKey))
                                         .Select(f => f.EntityId)
                                         .ToList();

            var opportunityQuery = connectionOpportunityService.Queryable()
                                   .AsNoTracking()
                                   .Where(co =>
                                          co.IsActive &&
                                          co.ConnectionType.IsActive);

            var typeFilter = GetAttributeValue(AttributeKey.ConnectionTypes).SplitDelimitedValues().AsGuidList();

            if (typeFilter.Any())
            {
                opportunityQuery = opportunityQuery.Where(o => typeFilter.Contains(o.ConnectionType.Guid));
            }

            var selfAssignedOpportunities          = new List <int>();
            var isSelfAssignedOpportunitiesQueried = false;
            var opportunities = opportunityQuery.ToList();

            // Loop through opportunities
            foreach (var opportunity in opportunities)
            {
                // Check to see if person can edit the opportunity because of edit rights to this block or edit rights to
                // the opportunity
                bool canEdit = UserCanEdit || opportunity.IsAuthorized(Authorization.EDIT, CurrentPerson);
                bool campusSpecificConnector = false;
                var  campusIds = new List <int>();

                if (CurrentPersonId.HasValue)
                {
                    // Check to see if person belongs to any connector group that is not campus specific
                    if (!canEdit)
                    {
                        canEdit = opportunity
                                  .ConnectionOpportunityConnectorGroups
                                  .Any(g =>
                                       !g.CampusId.HasValue &&
                                       g.ConnectorGroup != null &&
                                       g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value));
                    }

                    // If user is not yet authorized to edit the opportunity, check to see if they are a member of one of the
                    // campus-specific connector groups for the opportunity, and note the campus
                    if (!canEdit)
                    {
                        foreach (var groupCampus in opportunity
                                 .ConnectionOpportunityConnectorGroups
                                 .Where(g =>
                                        g.CampusId.HasValue &&
                                        g.ConnectorGroup != null &&
                                        g.ConnectorGroup.Members.Any(m => m.PersonId == CurrentPersonId.Value)))
                        {
                            campusSpecificConnector = true;
                            canEdit = true;
                            campusIds.Add(groupCampus.CampusId.Value);
                        }
                    }
                }

                if (opportunity.ConnectionType.EnableRequestSecurity && !isSelfAssignedOpportunitiesQueried)
                {
                    isSelfAssignedOpportunitiesQueried = true;
                    selfAssignedOpportunities          = new ConnectionRequestService(rockContext)
                                                         .Queryable()
                                                         .Where(a => a.ConnectorPersonAlias.PersonId == CurrentPersonId.Value)
                                                         .Select(a => a.ConnectionOpportunityId)
                                                         .Distinct()
                                                         .ToList();
                }

                var canView = opportunity.IsAuthorized(Authorization.VIEW, CurrentPerson) ||
                              (opportunity.ConnectionType.EnableRequestSecurity && selfAssignedOpportunities.Contains(opportunity.Id));

                // Is user is authorized to view this opportunity type...
                if (canView)
                {
                    // Check if the opportunity's type has been added to summary yet, and if not, add it
                    var connectionTypeSummary = SummaryState.Where(c => c.Id == opportunity.ConnectionTypeId).FirstOrDefault();
                    if (connectionTypeSummary == null)
                    {
                        connectionTypeSummary = new ConnectionTypeSummary
                        {
                            Id   = opportunity.ConnectionTypeId,
                            Name = opportunity.ConnectionType.Name,
                            EnableRequestSecurity              = opportunity.ConnectionType.EnableRequestSecurity,
                            ConnectionRequestDetailPageId      = opportunity.ConnectionType.ConnectionRequestDetailPageId,
                            ConnectionRequestDetailPageRouteId = opportunity.ConnectionType.ConnectionRequestDetailPageRouteId,
                            Opportunities = new List <OpportunitySummary>(),
                            IconMarkup    = opportunity.ConnectionType.IconCssClass.IsNullOrWhiteSpace() ?
                                            string.Empty :
                                            $@"<i class=""{opportunity.ConnectionType.IconCssClass}""></i>",
                            Order = opportunity.ConnectionType.Order
                        };
                        SummaryState.Add(connectionTypeSummary);
                    }

                    // get list of idle requests (no activity in past X days)

                    var connectionRequestsQry = new ConnectionRequestService(rockContext).Queryable().Where(a => a.ConnectionOpportunityId == opportunity.Id);
                    if (cpCampusFilter.SelectedCampusId.HasValue)
                    {
                        connectionRequestsQry = connectionRequestsQry.Where(a => a.CampusId.HasValue && a.CampusId == cpCampusFilter.SelectedCampusId);
                    }

                    var currentDateTime    = RockDateTime.Now;
                    int activeRequestCount = connectionRequestsQry
                                             .Where(cr =>
                                                    cr.ConnectionState == ConnectionState.Active ||
                                                    (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < midnightToday)
                                                    )
                                             .Count();

                    // only show if the opportunity is active and there are active requests
                    if (opportunity.IsActive || (!opportunity.IsActive && activeRequestCount > 0))
                    {
                        // idle count is:
                        //  (the request is active OR future follow-up who's time has come)
                        //  AND
                        //  (where the activity is more than DaysUntilRequestIdle days old OR no activity but created more than DaysUntilRequestIdle days ago)
                        List <int> idleConnectionRequests = connectionRequestsQry
                                                            .Where(cr =>
                                                                   (
                                                                       cr.ConnectionState == ConnectionState.Active ||
                                                                       (cr.ConnectionState == ConnectionState.FutureFollowUp && cr.FollowupDate.HasValue && cr.FollowupDate.Value < midnightToday)
                                                                   )
                                                                   &&
                                                                   (
                                                                       (cr.ConnectionRequestActivities.Any() && cr.ConnectionRequestActivities.Max(ra => ra.CreatedDateTime) < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime)) ||
                                                                       (!cr.ConnectionRequestActivities.Any() && cr.CreatedDateTime < SqlFunctions.DateAdd("day", -cr.ConnectionOpportunity.ConnectionType.DaysUntilRequestIdle, currentDateTime))
                                                                   )
                                                                   )
                                                            .Select(a => a.Id).ToList();

                        // get list of requests that have a status that is considered critical.
                        List <int> criticalConnectionRequests = connectionRequestsQry
                                                                .Where(r =>
                                                                       r.ConnectionStatus.IsCritical &&
                                                                       (
                                                                           r.ConnectionState == ConnectionState.Active ||
                                                                           (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < midnightToday)
                                                                       )
                                                                       )
                                                                .Select(a => a.Id).ToList();

                        // Add the opportunity
                        var opportunitySummary = new OpportunitySummary
                        {
                            Id                         = opportunity.Id,
                            Order                      = opportunity.Order,
                            Name                       = opportunity.Name,
                            IsActive                   = opportunity.IsActive,
                            IconCssClass               = opportunity.IconCssClass,
                            IdleConnectionRequests     = idleConnectionRequests,
                            CriticalConnectionRequests = criticalConnectionRequests,
                            DaysUntilRequestIdle       = opportunity.ConnectionType.DaysUntilRequestIdle,
                            CanEdit                    = canEdit,
                            IsFollowed                 = followedOpportunityIds.Contains(opportunity.Id)
                        };

                        // If the user is limited requests with specific campus(es) set the list, otherwise leave it to be null
                        opportunitySummary.CampusSpecificConnector = campusSpecificConnector;
                        opportunitySummary.ConnectorCampusIds      = campusIds.Distinct().ToList();

                        connectionTypeSummary.Opportunities.Add(opportunitySummary);
                    }
                }
            }

            // Get a list of all the authorized opportunity ids
            var allOpportunities = SummaryState.SelectMany(s => s.Opportunities).Select(o => o.Id).Distinct().ToList();

            // Get all the active and past-due future followup request ids, and include the campus id and personid of connector
            var activeRequestsQry = new ConnectionRequestService(rockContext)
                                    .Queryable().AsNoTracking()
                                    .Where(r =>
                                           allOpportunities.Contains(r.ConnectionOpportunityId) &&
                                           (r.ConnectionState == ConnectionState.Active ||
                                            (r.ConnectionState == ConnectionState.FutureFollowUp && r.FollowupDate.HasValue && r.FollowupDate.Value < midnightToday)))
                                    .Select(r => new
            {
                r.Id,
                r.ConnectionOpportunityId,
                r.CampusId,
                ConnectorPersonId = r.ConnectorPersonAlias != null ? r.ConnectorPersonAlias.PersonId : -1
            });

            if (cpCampusFilter.SelectedCampusId.HasValue)
            {
                activeRequestsQry = activeRequestsQry.Where(a => a.CampusId.HasValue && a.CampusId == cpCampusFilter.SelectedCampusId);
            }

            var activeRequests = activeRequestsQry.ToList();

            // Based on the active requests, set additional properties for each opportunity
            foreach (var opportunity in SummaryState.SelectMany(s => s.Opportunities))
            {
                // Get the active requests for this opportunity that user is authorized to view (based on campus connector)
                var opportunityRequests = activeRequests
                                          .Where(r =>
                                                 r.ConnectionOpportunityId == opportunity.Id &&
                                                 (
                                                     !opportunity.CampusSpecificConnector ||
                                                     (r.CampusId.HasValue && opportunity.ConnectorCampusIds.Contains(r.CampusId.Value))
                                                 ))
                                          .ToList();

                // The active requests assigned to the current person
                opportunity.AssignedToYouConnectionRequests = opportunityRequests.Where(r => r.ConnectorPersonId == CurrentPersonId).Select(a => a.Id).ToList();

                // The active requests that are unassigned
                opportunity.UnassignedConnectionRequests = opportunityRequests.Where(r => r.ConnectorPersonId == -1).Select(a => a.Id).ToList();

                // Flag indicating if current user is connector for any of the active types
                opportunity.HasActiveRequestsForConnector = opportunityRequests.Any(r => r.ConnectorPersonId == CurrentPersonId);

                // Total number of requests for opportunity/campus/connector
                opportunity.TotalRequests = opportunityRequests.Count();
            }

            //Set the Idle tooltip
            var           connectionTypes = opportunities.Where(o => allOpportunities.Contains(o.Id)).Select(o => o.ConnectionType).Distinct().ToList();
            StringBuilder sb = new StringBuilder();

            if (connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().Count() == 1)
            {
                sb.Append(String.Format("Idle (no activity in {0} days)", connectionTypes.Select(t => t.DaysUntilRequestIdle).Distinct().First()));
            }
            else
            {
                sb.Append("Idle (no activity in several days)<br/><ul class='list-unstyled'>");
                foreach (var connectionType in connectionTypes)
                {
                    sb.Append(String.Format("<li>{0}: {1} days</li>", connectionType.Name, connectionType.DaysUntilRequestIdle));
                }
                sb.Append("</ul>");
            }

            var statusTemplate    = GetAttributeValue(AttributeKey.StatusTemplate);
            var statusMergeFields = Rock.Lava.LavaHelper.GetCommonMergeFields(this.RockPage);

            statusMergeFields.Add("ConnectionOpportunities", allOpportunities);
            statusMergeFields.Add("ConnectionTypes", connectionTypes);
            statusMergeFields.Add("IdleTooltip", sb.ToString().EncodeHtml());
            lStatusBarContent.Text = statusTemplate.ResolveMergeFields(statusMergeFields);
            BindSummaryData();
        }
コード例 #27
0
        /// <summary>
        /// Updates the list.
        /// </summary>
        private void UpdateList()
        {
            using (var rockContext = new RockContext())
            {
                var searchSelections = new Dictionary <string, string>();

                var connectionTypeId             = GetAttributeValue(AttributeKey.ConnectionTypeId).AsInteger();
                var connectionType               = new ConnectionTypeService(rockContext).Get(connectionTypeId);
                var connectionOpportunityService = new ConnectionOpportunityService(rockContext);

                var qrySearch = connectionOpportunityService.Queryable().Where(a => a.ConnectionTypeId == connectionTypeId && a.IsActive && a.ConnectionType.IsActive);

                if (GetAttributeValue(AttributeKey.DisplayNameFilter).AsBoolean())
                {
                    if (!string.IsNullOrWhiteSpace(tbSearchName.Text))
                    {
                        searchSelections.Add("tbSearchName", tbSearchName.Text);
                        var searchTerms = tbSearchName.Text.ToLower().SplitDelimitedValues(true);
                        qrySearch = qrySearch.Where(o => searchTerms.Any(t => t.Contains(o.Name.ToLower()) || o.Name.ToLower().Contains(t)));
                    }
                }

                if (GetAttributeValue(AttributeKey.DisplayCampusFilter).AsBoolean())
                {
                    cblCampus.Label = GetAttributeValue(AttributeKey.CampusLabel);
                    var searchCampuses = cblCampus.SelectedValuesAsInt;
                    if (searchCampuses.Count > 0)
                    {
                        searchSelections.Add("cblCampus", searchCampuses.AsDelimited("|"));
                        qrySearch = qrySearch.Where(o => o.ConnectionOpportunityCampuses.Any(c => searchCampuses.Contains(c.CampusId)));
                    }
                }

                if (GetAttributeValue(AttributeKey.DisplayAttributeFilters).AsBoolean())
                {
                    // Filter query by any configured attribute filters
                    if (AvailableAttributes != null && AvailableAttributes.Any())
                    {
                        foreach (var attribute in AvailableAttributes)
                        {
                            string filterControlId = "filter_" + attribute.Id.ToString();
                            var    filterControl   = phAttributeFilters.FindControl(filterControlId);
                            qrySearch = attribute.FieldType.Field.ApplyAttributeQueryFilter(qrySearch, filterControl, attribute, connectionOpportunityService, Rock.Reporting.FilterMode.SimpleFilter);
                        }
                    }
                }

                string sessionKey = string.Format("ConnectionSearch_{0}", this.BlockId);
                Session[sessionKey] = searchSelections;

                var opportunities = qrySearch
                                    .ToList()
                                    .Where(o => o.IsAuthorized(Authorization.VIEW, CurrentPerson))
                                    .OrderBy(o => o.Order)
                                    .ThenBy(o => o.Name)
                                    .ToList();

                var mergeFields = new Dictionary <string, object>();
                mergeFields.Add("CurrentPerson", CurrentPerson);
                mergeFields.Add("CampusContext", RockPage.GetCurrentContext(EntityTypeCache.Get("Rock.Model.Campus")) as Campus);
                var pageReference = new PageReference(GetAttributeValue(AttributeKey.DetailPage), null);
                // Not using the BuildUrlEncoded due to the additional method here that handles the encoding
                mergeFields.Add("DetailPage", BuildDetailPageUrl(pageReference.BuildUrl()));

                // iterate through the opportunities and lava merge the summaries and descriptions
                foreach (var opportunity in opportunities)
                {
                    opportunity.Summary     = opportunity.Summary.ResolveMergeFields(mergeFields);
                    opportunity.Description = opportunity.Description.ResolveMergeFields(mergeFields);
                }

                mergeFields.Add("Opportunities", opportunities);

                lOutput.Text = GetAttributeValue(AttributeKey.LavaTemplate).ResolveMergeFields(mergeFields);

                if (GetAttributeValue(AttributeKey.SetPageTitle).AsBoolean())
                {
                    string pageTitle = "Connection";
                    RockPage.PageTitle    = pageTitle;
                    RockPage.BrowserTitle = string.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                    RockPage.Header.Title = string.Format("{0} | {1}", pageTitle, RockPage.Site.Name);
                }
            }
        }