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(); } } }
/// <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; } }
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(); } } }
/// <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(); }
/// <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()); } }
/// <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(); }
/// <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(); } } }
/// <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; } } } }
/// <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(); }
/// <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(); } }
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(); } } }
/// <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); } } }
/// <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); }
/// <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; } }
/// <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; } }
/// <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; } } } }
/// <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; } }
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(); } } }
/// <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 ); } }
/// <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; } } } }
/// <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; } }
/// <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 ); } }
/// <summary> /// Adds the connections requests to the system from the given XML element. /// </summary> /// <example> /// <connections> /// <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" /> /// </connections> /// </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 ); } } }
/// <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; } } } } } }
/// <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); } } }
/// <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(); }
/// <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); } } }