public void ConnectionRequestDateKeyJoinsCorrectly()
        {
            var expectedRecordCount = 15;
            var year = 2015;

            using (var rockContext = new RockContext())
            {
                var connectionRequestService = new ConnectionRequestService(rockContext);

                var minDateValue = TestDataHelper.GetAnalyticsSourceMinDateForYear(rockContext, year);
                var maxDateValue = TestDataHelper.GetAnalyticsSourceMaxDateForYear(rockContext, year);

                for (var i = 0; i < 15; i++)
                {
                    var connectionRequest = BuildConnectionRequest(rockContext,
                                                                   TestDataHelper.GetRandomDateInRange(minDateValue, maxDateValue));

                    connectionRequestService.Add(connectionRequest);
                }

                rockContext.SaveChanges();
            }

            using (var rockContext = new RockContext())
            {
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var connectionRequests       = connectionRequestService.
                                               Queryable().
                                               Where(i => i.ForeignKey == connectionRequestForeignKey).
                                               Where(i => i.CreatedSourceDate.CalendarYear == year);

                Assert.AreEqual(expectedRecordCount, connectionRequests.Count());
                Assert.IsNotNull(connectionRequests.First().CreatedSourceDate);
            }
        }
        /// <summary>
        /// Creates the connection request.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="person">The person.</param>
        private void CreateConnectionRequest(RockContext rockContext, Person person)
        {
            if (person != null && _connectionOpportunity != null)
            {
                int defaultStatusId = _connectionOpportunity.ConnectionType.ConnectionStatuses
                                      .Where(s => s.IsDefault)
                                      .Select(s => s.Id)
                                      .FirstOrDefault();

                ConnectionRequestService connectionRequestService = new ConnectionRequestService(rockContext);
                ConnectionRequest        connectionRequest        = new ConnectionRequest();
                connectionRequest.PersonAliasId           = person.PrimaryAliasId.Value;
                connectionRequest.ConnectionOpportunityId = _connectionOpportunity.Id;
                connectionRequest.ConnectionState         = ConnectionState.Active;
                connectionRequest.ConnectionStatusId      = defaultStatusId;
                connectionRequest.CampusId = cpCampus.SelectedCampusId;

                StringBuilder sb = new StringBuilder();

                sb.AppendFormat("#### General\n");
                //sb.AppendFormat( "**Entry Point**: {0}  \n", rblSource.SelectedValue );
                sb.AppendFormat("**Guest Type**: {0}  \n", rblGuestType.SelectedValue);

                if (cblDecisions.SelectedValues.Count > 0)
                {
                    sb.AppendFormat("#### Decisions\n");
                    sb.AppendFormat("- {0}", cblDecisions.SelectedValues.AsDelimited("\n- "));
                    sb.AppendFormat("\n");
                }

                if (cblInterests.SelectedValues.Count > 0)
                {
                    sb.AppendFormat("#### Interests\n");
                    sb.AppendFormat("- {0}", cblInterests.SelectedValues.AsDelimited("\n- "));
                    sb.AppendFormat("\n");
                }

                if (!string.IsNullOrWhiteSpace(tbComments.Text))
                {
                    sb.AppendFormat("#### Additional Comments\n");
                    sb.AppendFormat("{0}", tbComments.Text);
                }

                connectionRequest.Comments = sb.ToString();

                connectionRequestService.Add(connectionRequest);
                rockContext.SaveChanges();
            }
        }
        public void ConnectionRequestDateKeySavesCorrectly()
        {
            var rockContext = new RockContext();
            var connectionRequestService = new ConnectionRequestService(rockContext);

            var connectionRequest = BuildConnectionRequest(rockContext, Convert.ToDateTime("3/15/2010"));

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

            var connectionRequestId = connectionRequest.Id;

            // We're bypassing the model because the model doesn't user the ConnectionRequestDateKey from the database,
            // but it still needs to be correct for inner joins to work correctly.
            var result = rockContext.Database.
                         SqlQuery <int>($"SELECT CreatedDateKey FROM ConnectionRequest WHERE Id = {connectionRequestId}").First();

            Assert.AreEqual(20100315, result);
        }
        /// <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;
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
        /// <summary>
        /// Assigns the connection requests from the SelectedCampaign's entity set.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="selectedCampaignItem">The selected campaign item.</param>
        /// <param name="numberOfRequestsRemaining">The number of requests remaining.</param>
        /// <param name="connectorPerson">The connector person.</param>
        private static void AssignConnectionRequestsFromEntitySet(RockContext rockContext, CampaignItem selectedCampaignItem, ref int numberOfRequestsRemaining, Person connectorPerson)
        {
            var opportunityService            = new ConnectionOpportunityService(rockContext);
            ConnectionOpportunity opportunity = opportunityService.Get(selectedCampaignItem.OpportunityGuid);

            if (opportunity == null || !opportunity.IsActive)
            {
                return;
            }

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

            // If opportunity doesn't have a default status, something is wrong
            if (defaultStatusId == null)
            {
                return;
            }

            var connectorCampusIds = GetConnectorCampusIds(selectedCampaignItem, connectorPerson);

            var connectionRequestService         = new ConnectionRequestService(rockContext);
            var connectionRequestActivityService = new ConnectionRequestActivityService(rockContext);

            // get previous connections for the connector that have the same campus of the connector, or if the person's campus or connector person's campus is null
            var previousConnectedPersonIdsForCurrentPerson = connectionRequestService.Queryable()
                                                             .Where(a => a.ConnectionOpportunityId == opportunity.Id)
                                                             .Where(a => a.ConnectorPersonAlias.PersonId == connectorPerson.Id)
                                                             .Where(a => (a.CampusId == null) || connectorCampusIds.Any(connectorCampusId => connectorCampusId == null || a.CampusId.Value == connectorCampusId))
                                                             .Select(a => a.PersonAlias.PersonId).Distinct().ToList();

            var entitySetId          = CampaignConnectionHelper.GetEntitySet(selectedCampaignItem);
            var entitySetItemService = new EntitySetItemService(rockContext);
            var entitySetItemList    = entitySetItemService.Queryable().Where(a => a.EntitySetId == entitySetId).OrderBy(a => a.Order).Select(a => new
            {
                PersonId        = a.EntityId,
                EntityItemOrder = a.Order
            }).ToList();

            if (selectedCampaignItem.PreferPreviousConnector)
            {
                // sort them by any where the current person was assigned to this person before
                entitySetItemList = entitySetItemList
                                    .OrderBy(a => previousConnectedPersonIdsForCurrentPerson.Any(x => x == a.PersonId))
                                    .ThenBy(a => a.EntityItemOrder).ToList();
            }
            else
            {
                entitySetItemList = entitySetItemList.OrderBy(a => a.EntityItemOrder).ToList();
            }

            var personService = new PersonService(rockContext);

            // get the last connection datetime.
            var lastConnectionDateTime = RockDateTime.Now.AddDays(-selectedCampaignItem.DaysBetweenConnection);

            // if DaysBetweenConnection is 0 then check for connection request for any time period.
            if (selectedCampaignItem.DaysBetweenConnection == default(int))
            {
                lastConnectionDateTime = DateTime.MinValue;
            }

            foreach (var entitySetItem in entitySetItemList)
            {
                var entitySetPerson = personService.Get(entitySetItem.PersonId);
                if (entitySetPerson == null)
                {
                    continue;
                }

                var entitySetPersonPrimaryCampusId = entitySetPerson.PrimaryCampusId;

                bool validCampus = IsValidCampus(connectorCampusIds, entitySetPersonPrimaryCampusId);
                if (!validCampus)
                {
                    continue;
                }

                // double check that they haven't already been added
                bool personAlreadyHasConnectionRequest = PersonAlreadyHasConnectionRequest(opportunity.Id, rockContext, lastConnectionDateTime, entitySetPerson.Id);

                if (personAlreadyHasConnectionRequest)
                {
                    continue;
                }

                var connectionRequest = new ConnectionRequest();
                connectionRequest.ConnectionOpportunityId = opportunity.Id;

                /*
                 *  3/30/2020 - NA
                 *
                 *  When setting the connection request's Requester, we have to use the PrimaryAlias
                 *  to set the connectionRequest.PersonAlias property because the ConnectionRequestChangeTransaction
                 *  https://github.com/SparkabilityGroup/Rock/blob/a556a9285b7fdfe5594441286242f4feaa5847f2/Rock/Transactions/ConnectionRequestChangeTransaction.cs#L123
                 *  (which handles triggered workflows) expects it.  Also, it needs to be tracked by
                 *  the current rockContext... hence the change from GetAsNoTracking() to just Get() above:
                 *  var entitySetPerson = personService.Get( entitySetItem.PersonId );
                 *
                 *  In other words, this will not work correctly:
                 *  connectionRequest.PersonAliasId = entitySetPerson.PrimaryAliasId.Value;
                 *
                 *  Reason: This plug-in cannot change Rock core assembly code.
                 */

                connectionRequest.PersonAlias            = entitySetPerson.PrimaryAlias;
                connectionRequest.ConnectionState        = ConnectionState.Active;
                connectionRequest.ConnectorPersonAliasId = connectorPerson.PrimaryAliasId;
                connectionRequest.CampusId           = entitySetPersonPrimaryCampusId;
                connectionRequest.ConnectionStatusId = defaultStatusId.Value;

                if (selectedCampaignItem.RequestCommentsLavaTemplate.IsNotNullOrWhiteSpace())
                {
                    var mergeFields = new Dictionary <string, object>();
                    mergeFields.Add("Person", entitySetPerson);
                    mergeFields.Add("Family", entitySetPerson.GetFamily());
                    connectionRequest.Comments = selectedCampaignItem.RequestCommentsLavaTemplate.ResolveMergeFields(mergeFields);
                }

                connectionRequestService.Add(connectionRequest);

                var connectionActivityTypeAssignedGuid = Rock.SystemGuid.ConnectionActivityType.ASSIGNED.AsGuid();
                int?assignedActivityId = new ConnectionActivityTypeService(rockContext).GetId(connectionActivityTypeAssignedGuid);
                if (assignedActivityId.HasValue)
                {
                    var connectionRequestActivity = new ConnectionRequestActivity();
                    connectionRequestActivity.ConnectionRequest        = connectionRequest;
                    connectionRequestActivity.ConnectionOpportunityId  = connectionRequest.ConnectionOpportunityId;
                    connectionRequestActivity.ConnectionActivityTypeId = assignedActivityId.Value;
                    connectionRequestActivity.ConnectorPersonAliasId   = connectorPerson.PrimaryAliasId;
                    connectionRequestActivityService.Add(connectionRequestActivity);
                }

                numberOfRequestsRemaining--;
                if (numberOfRequestsRemaining <= 0)
                {
                    break;
                }
            }
        }
        /// <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 )
        {
            if ( ! ppRequestor.PersonAliasId.HasValue )
            {
                ShowErrorMessage( "Incomplete", "You must select a person to save a request." );
                return;
            }

            if ( Page.IsValid )
            {
                using ( var rockContext = new RockContext() )
                {
                    ConnectionRequestService connectionRequestService = new ConnectionRequestService( rockContext );
                    ConnectionRequest connectionRequest = null;

                    int connectionRequestId = hfConnectionRequestId.ValueAsInt();

                    // if adding a new connection request
                    if ( connectionRequestId.Equals( 0 ) )
                    {
                        connectionRequest = new ConnectionRequest();
                        connectionRequest.ConnectionOpportunityId = hfConnectionOpportunityId.ValueAsInt();
                        if ( ddlCampus.SelectedValueAsId().HasValue )
                        {
                            SetUserPreference( CAMPUS_SETTING, ddlCampus.SelectedValueAsId().Value.ToString() );
                        }
                    }
                    else
                    {
                        // load existing connection request
                        connectionRequest = connectionRequestService.Get( connectionRequestId );
                    }

                    var personAliasService = new PersonAliasService( rockContext );

                    int? oldConnectorPersonAliasId = connectionRequest.ConnectorPersonAliasId;
                    int? newConnectorPersonId = ddlConnectorEdit.SelectedValueAsId();
                    int? newConnectorPersonAliasId = newConnectorPersonId.HasValue ? personAliasService.GetPrimaryAliasId( newConnectorPersonId.Value ) : (int?)null;

                    connectionRequest.ConnectorPersonAliasId = newConnectorPersonAliasId;
                    connectionRequest.PersonAlias = personAliasService.Get( ppRequestor.PersonAliasId.Value );
                    connectionRequest.ConnectionState = rblState.SelectedValueAsEnum<ConnectionState>();
                    connectionRequest.ConnectionStatusId = rblStatus.SelectedValueAsId().Value;

                    if ( ddlCampus.SelectedValueAsId().HasValue )
                    {
                        connectionRequest.CampusId = ddlCampus.SelectedValueAsId().Value;
                    }

                    connectionRequest.AssignedGroupId = ddlPlacementGroup.SelectedValueAsId();
                    connectionRequest.AssignedGroupMemberRoleId = ddlPlacementGroupRole.SelectedValueAsInt();
                    connectionRequest.AssignedGroupMemberStatus = ddlPlacementGroupStatus.SelectedValueAsEnumOrNull<GroupMemberStatus>();
                    connectionRequest.AssignedGroupMemberAttributeValues = GetGroupMemberAttributeValues();

                    connectionRequest.Comments = tbComments.Text.ScrubHtmlAndConvertCrLfToBr();
                    connectionRequest.FollowupDate = dpFollowUp.SelectedDate;

                    if ( !Page.IsValid )
                    {
                        return;
                    }

                    // if the connectionRequest IsValue is false, and the UI controls didn't report any errors, it is probably
                    // because the custom rules of ConnectionRequest didn't pass.
                    // So, make sure a message is displayed in the validation summary.
                    cvConnectionRequest.IsValid = connectionRequest.IsValid;

                    if ( !cvConnectionRequest.IsValid )
                    {
                        cvConnectionRequest.ErrorMessage = connectionRequest.ValidationResults.Select( a => a.ErrorMessage ).ToList().AsDelimited( "<br />" );
                        return;
                    }

                    if ( connectionRequest.Id.Equals( 0 ) )
                    {
                        connectionRequestService.Add( connectionRequest );
                    }

                    rockContext.SaveChanges();

                    if ( newConnectorPersonAliasId.HasValue && !newConnectorPersonAliasId.Equals( oldConnectorPersonAliasId ) )
                    {
                        var guid = Rock.SystemGuid.ConnectionActivityType.ASSIGNED.AsGuid();
                        var assignedActivityId = new ConnectionActivityTypeService( rockContext ).Queryable()
                            .Where( t => t.Guid == guid )
                            .Select( t => t.Id )
                            .FirstOrDefault();
                        if ( assignedActivityId > 0 )
                        {
                            var connectionRequestActivityService = new ConnectionRequestActivityService( rockContext );
                            var connectionRequestActivity = new ConnectionRequestActivity();
                            connectionRequestActivity.ConnectionRequestId = connectionRequest.Id;
                            connectionRequestActivity.ConnectionOpportunityId = connectionRequest.ConnectionOpportunityId;
                            connectionRequestActivity.ConnectionActivityTypeId = assignedActivityId;
                            connectionRequestActivity.ConnectorPersonAliasId = newConnectorPersonAliasId;
                            connectionRequestActivityService.Add( connectionRequestActivity );
                            rockContext.SaveChanges();
                        }
                    }

                    var qryParams = new Dictionary<string, string>();
                    qryParams["ConnectionRequestId"] = connectionRequest.Id.ToString();
                    qryParams["ConnectionOpportunityId"] = connectionRequest.ConnectionOpportunityId.ToString();

                    NavigateToPage( RockPage.Guid, qryParams );
                }
            }
        }
Пример #7
0
        /// <summary>
        /// Handles the Click event of the btnEdit control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnConnect_Click(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var opportunityService       = new ConnectionOpportunityService(rockContext);
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var personService            = new PersonService(rockContext);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

                            var connectionAttributes = GetGroupMemberAttributes(rockContext, RepeaterIndex);

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

                                connectionRequest.AssignedGroupMemberAttributeValues = connectionDictionary.ToJson();
                            }

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

                            connectionRequestService.Add(connectionRequest);

                            RepeaterIndex++;
                        }

                        rockContext.SaveChanges();

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

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

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
        /// <summary>
        /// Handles the Click event of the btnEdit control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnConnect_Click(object sender, EventArgs e)
        {
            using (var rockContext = new RockContext())
            {
                var opportunityService       = new ConnectionOpportunityService(rockContext);
                var connectionRequestService = new ConnectionRequestService(rockContext);
                var personService            = new PersonService(rockContext);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
Пример #9
0
        /// <summary>
        /// Executes the specified workflow.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute(RockContext rockContext, WorkflowAction action, Object entity, out List <string> errorMessages)
        {
            errorMessages = new List <string>();

            // Get the person
            PersonAlias personAlias     = null;
            Guid        personAliasGuid = action.GetWorkflowAttributeValue(GetAttributeValue(action, "PersonAttribute").AsGuid()).AsGuid();

            personAlias = new PersonAliasService(rockContext).Get(personAliasGuid);
            if (personAlias == null)
            {
                errorMessages.Add("Invalid Person Attribute or Value!");
                return(false);
            }

            // Get the opportunity
            ConnectionOpportunity opportunity = null;
            Guid opportunityTypeGuid          = action.GetWorkflowAttributeValue(GetAttributeValue(action, "ConnectionOpportunityAttribute").AsGuid()).AsGuid();

            opportunity = new ConnectionOpportunityService(rockContext).Get(opportunityTypeGuid);
            if (opportunity == null)
            {
                errorMessages.Add("Invalid Connection Opportunity Attribute or Value!");
                return(false);
            }

            // Get connection status
            ConnectionStatus status = null;
            Guid?            connectionStatusGuid          = null;
            Guid?            connectionStatusAttributeGuid = GetAttributeValue(action, "ConnectionStatusAttribute").AsGuidOrNull();

            if (connectionStatusAttributeGuid.HasValue)
            {
                connectionStatusGuid = action.GetWorkflowAttributeValue(connectionStatusAttributeGuid.Value).AsGuidOrNull();
                if (connectionStatusGuid.HasValue)
                {
                    status = opportunity.ConnectionType.ConnectionStatuses
                             .Where(s => s.Guid.Equals(connectionStatusGuid.Value))
                             .FirstOrDefault();
                }
            }
            if (status == null)
            {
                connectionStatusGuid = GetAttributeValue(action, "ConnectionStatus").AsGuidOrNull();
                if (connectionStatusGuid.HasValue)
                {
                    status = opportunity.ConnectionType.ConnectionStatuses
                             .Where(s => s.Guid.Equals(connectionStatusGuid.Value))
                             .FirstOrDefault();
                }
            }
            if (status == null)
            {
                status = opportunity.ConnectionType.ConnectionStatuses
                         .Where(s => s.IsDefault)
                         .FirstOrDefault();
            }

            // Get Campus
            int? campusId            = null;
            Guid?campusAttributeGuid = GetAttributeValue(action, "CampusAttribute").AsGuidOrNull();

            if (campusAttributeGuid.HasValue)
            {
                Guid?campusGuid = action.GetWorkflowAttributeValue(campusAttributeGuid.Value).AsGuidOrNull();
                if (campusGuid.HasValue)
                {
                    var campus = CampusCache.Get(campusGuid.Value);
                    if (campus != null)
                    {
                        campusId = campus.Id;
                    }
                }
            }

            // Get the Comment
            String comment = action.GetWorkflowAttributeValue(GetAttributeValue(action, "ConnectionCommentAttribute").AsGuid());

            var connectionRequestService = new ConnectionRequestService(rockContext);

            var connectionRequest = new ConnectionRequest();

            connectionRequest.PersonAliasId           = personAlias.Id;
            connectionRequest.ConnectionOpportunityId = opportunity.Id;
            connectionRequest.ConnectionState         = ConnectionState.Active;
            connectionRequest.ConnectionStatusId      = status.Id;
            connectionRequest.CampusId = campusId;
            connectionRequest.ConnectorPersonAliasId = opportunity.GetDefaultConnectorPersonAliasId(campusId);
            connectionRequest.Comments = comment;

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

            // If request attribute was specified, requery the request and set the attribute's value
            Guid?connectionRequestAttributeGuid = GetAttributeValue(action, "ConnectionRequestAttribute").AsGuidOrNull();

            if (connectionRequestAttributeGuid.HasValue)
            {
                connectionRequest = connectionRequestService.Get(connectionRequest.Id);
                if (connectionRequest != null)
                {
                    SetWorkflowAttributeValue(action, connectionRequestAttributeGuid.Value, connectionRequest.Guid.ToString());
                }
            }

            return(true);
        }
        /// <summary>
        /// Executes this instance.
        /// </summary>
        /// <param name="message"></param>
        public override void Execute(Message message)
        {
            using (var rockContext = new RockContext())
            {
                // Load the alert and alert type
                var financialTransactionAlertService = new FinancialTransactionAlertService(rockContext);
                var alert = financialTransactionAlertService.Queryable()
                            .AsNoTracking()
                            .Include(a => a.FinancialTransactionAlertType)
                            .FirstOrDefault(a => a.Id == message.FinancialTransactionAlertId);

                var alertType = alert?.FinancialTransactionAlertType;

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

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

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

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

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

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

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

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

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

                        connectionRequestService.Add(request);
                    }
                }

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

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

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

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

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

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

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

                rockContext.SaveChanges();
            }
        }
Пример #11
0
        /// <summary>
        /// Adds the connections requests to the system from the given XML element.
        /// </summary>
        /// <example>
        ///   &lt;connections&gt;
        ///       &lt;connection type="Involvement" opportunity="Children's" comment="I would love to help teach kids about Jesus." date="2015-10-11T00:00:00" personGuid="1dfff821-e97c-4324-9883-cf59b5c5bdd6" /&gt;
        ///   &lt;/connections&gt;
        /// </example>
        /// <param name="elemConnections">The elem connections.</param>
        /// <param name="rockContext">The rock context.</param>
        private void AddConnections( XElement elemConnections, RockContext rockContext )
        {
            if ( elemConnections == null )
            {
                return;
            }

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

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

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

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

                    crService.Add( connectionRequest );
                }
            }
        }
Пример #12
0
        public void ConnectionOpportunity_NewSignupProducesWorkflow()
        {
            var testStartDateTime = RockDateTime.Now;

            var rockContext = new RockContext();

            var connectionRequestService = new ConnectionRequestService(rockContext);

            // Serve Children's Opportunity
            var connectionOpportunity = new ConnectionOpportunityService(rockContext).Get("2c09211f-e19e-4685-9b67-4edaa9945a97".AsGuid());

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

            var connectionRequest = new ConnectionRequest();

            connectionRequest.ConnectionOpportunityId = connectionOpportunity.Id;
            connectionRequest.PersonAliasId           = connectionOpportunity.ModifiedByPersonAliasId.Value;
            connectionRequest.ConnectionStatusId      = defaultStatusId;
            ConnectionWorkflow testConnectionWorkflow = null;

            if (!connectionOpportunity.ConnectionWorkflows.Any())
            {
                testConnectionWorkflow = new ConnectionWorkflow();

                // Whatever workflow type id. 13 is 'External Inquiry'
                var workflowType = new WorkflowTypeService(rockContext).Get(13);
                if (!workflowType.IsPersisted)
                {
                    // make sure it is Persisted so that the produced workflow gets saved to the database
                    workflowType.IsPersisted = true;
                    rockContext.SaveChanges();
                }

                testConnectionWorkflow.WorkflowTypeId   = 13;
                testConnectionWorkflow.TriggerType      = ConnectionWorkflowTriggerType.RequestStarted;
                testConnectionWorkflow.ConnectionTypeId = connectionOpportunity.ConnectionTypeId;
                connectionOpportunity.ConnectionWorkflows.Add(testConnectionWorkflow);
                rockContext.SaveChanges();
            }

            rockContext.WrapTransaction(() =>
            {
                connectionRequestService.Add(connectionRequest);
                rockContext.SaveChanges();
                connectionRequest.SaveAttributeValues(rockContext);

                // simulate the transaction taking longer. This helps test that the 'ProcessConnectionRequestChange.SendWhen' message is waiting for the database commit.
                Thread.Sleep(1000);
            });

            using (var rockContext2 = new RockContext())
            {
                var  connectionRequestWorkflowService  = new ConnectionRequestWorkflowService(rockContext2);
                bool producedConnectionRequestWorkflow = false;
                int  retryAttempt = 0;

                // the connection request workflow gets produced in a seperate thread, so check for up to 10 seconds to see if it created one
                while (!producedConnectionRequestWorkflow && retryAttempt < 10)
                {
                    var connectionRequestWorkflowQuery = connectionRequestWorkflowService.Queryable()
                                                         .Where(a => a.ConnectionRequestId == connectionRequest.Id && a.CreatedDateTime > testStartDateTime);

                    producedConnectionRequestWorkflow = connectionRequestWorkflowQuery.Any();
                    if (producedConnectionRequestWorkflow)
                    {
                        // Looks like it created it, so cleanup and break out
                        connectionRequestWorkflowService.DeleteRange(connectionRequestWorkflowQuery.ToList());

                        break;
                    }

                    retryAttempt++;
                    Task.Delay(1000).Wait();
                }

                // clean up if we needed to create a testConnectionWorkflow
                if (testConnectionWorkflow != null)
                {
                    new ConnectionWorkflowService(rockContext).Delete(testConnectionWorkflow);
                    rockContext.SaveChanges();
                }

                // test expected condition
                Assert.IsTrue(producedConnectionRequestWorkflow);
            }
        }
Пример #13
0
        /// <summary>
        /// Add Connection Request to Context
        /// </summary>
        /// <param name="entityItemPersonAlias">The entity set item person alias.</param>
        /// <param name="requestCommentsLavaTemplate">The connection opportunity.</param>
        /// <param name="connectionOpportunityId">The connection opportunity indentifier.</param>
        /// <param name="connectionStatusId">The connection status identifier.</param>
        /// <param name="connectorPersonAliasId">The connector person alias indentifier.</param>
        /// <param name="rockContext">The rock context.</param>
        /// <returns></returns>
        private void CreateConnectionRequest(PersonAlias entityItemPersonAlias, string requestCommentsLavaTemplate, int connectionOpportunityId, int?connectionStatusId, int?connectorPersonAliasId, RockContext rockContext)
        {
            var defaultCampus = entityItemPersonAlias.Person.GetCampus();

            using (var insertRockContext = new RockContext())
            {
                try
                {
                    /*
                     *  3/30/2020 - NA
                     *
                     *  When setting the connection request's Requester, we have to use the PrimaryAlias
                     *  to set the connectionRequest.PersonAlias property because the ConnectionRequestChangeTransaction
                     *  https://github.com/SparkabilityGroup/Rock/blob/a556a9285b7fdfe5594441286242f4feaa5847f2/Rock/Transactions/ConnectionRequestChangeTransaction.cs#L123
                     *  (which handles triggered workflows) expects it.  Also, it needs to be tracked by
                     *  the current rockContext...
                     *
                     *  In other words, this will not work correctly:
                     *  PersonAliasId = personAlias.Id,
                     *
                     *  Reason: This plug-in cannot change Rock core assembly code.
                     */

                    var personPrimaryAlias = new PersonAliasService(insertRockContext).GetPrimaryAlias(entityItemPersonAlias.PersonId);
                    var connectionRequestActivityService = new ConnectionRequestActivityService(insertRockContext);
                    var insertConnectionRequestService   = new ConnectionRequestService(insertRockContext);

                    var connectionRequest = new ConnectionRequest()
                    {
                        ConnectionOpportunityId = connectionOpportunityId,
                        PersonAlias             = personPrimaryAlias,
                        ConnectionState         = ConnectionState.Active,
                        ConnectorPersonAliasId  = connectorPersonAliasId,
                        CampusId           = defaultCampus?.Id,
                        ConnectionStatusId = connectionStatusId.Value,
                    };

                    if (requestCommentsLavaTemplate.IsNotNullOrWhiteSpace())
                    {
                        var mergeFields = new Dictionary <string, object>();
                        mergeFields.Add("Person", entityItemPersonAlias.Person);
                        mergeFields.Add("Family", entityItemPersonAlias.Person.GetFamily());
                        connectionRequest.Comments = requestCommentsLavaTemplate.ResolveMergeFields(mergeFields);
                    }

                    insertConnectionRequestService.Add(connectionRequest);

                    if (connectorPersonAliasId.HasValue)
                    {
                        var connectionActivityTypeAssignedGuid = Rock.SystemGuid.ConnectionActivityType.ASSIGNED.AsGuid();
                        int?assignedActivityId = new ConnectionActivityTypeService(rockContext).GetId(connectionActivityTypeAssignedGuid);
                        if (assignedActivityId.HasValue)
                        {
                            var connectionRequestActivity = new ConnectionRequestActivity();
                            connectionRequestActivity.ConnectionRequest        = connectionRequest;
                            connectionRequestActivity.ConnectionOpportunityId  = connectionRequest.ConnectionOpportunityId;
                            connectionRequestActivity.ConnectionActivityTypeId = assignedActivityId.Value;
                            connectionRequestActivity.ConnectorPersonAliasId   = connectorPersonAliasId;
                            connectionRequestActivityService.Add(connectionRequestActivity);
                        }
                    }

                    insertRockContext.SaveChanges();
                }
                catch (Exception ex)
                {
                    // Log exception and keep on trucking.
                    var exception = new Exception($"Exception occurred trying to create connection request:{entityItemPersonAlias.Id}.", ex);
                    createConnectionRequestExceptions.Add(exception);
                    ExceptionLogService.LogException(exception, null);
                }
            }
        }
Пример #14
0
        /// <summary>
        /// Creates the connection requests.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="campaignItem">The campaign item.</param>
        /// <returns></returns>
        private int CreateConnectionRequests(IJobExecutionContext context, CampaignItem campaignItem)
        {
            context.UpdateLastStatusMessage($"Processing create connection requests for {campaignItem.Name}");

            // Skip creating connection requests if set to "AsNeeded" and DailyLimitAssigned is 0 or null
            if (campaignItem.CreateConnectionRequestOption == CreateConnectionRequestOptions.AsNeeded &&
                (campaignItem.DailyLimitAssigned <= 0 || campaignItem.DailyLimitAssigned == null))
            {
                return(0);
            }

            int recordsProcessed = 0;

            var rockContext = new RockContext();
            var connectionOpportunityService = new ConnectionOpportunityService(rockContext);
            var personAliasService           = new PersonAliasService(rockContext);
            var connectionRequestService     = new ConnectionRequestService(rockContext);

            var connectionOpportunity = connectionOpportunityService.Get(campaignItem.OpportunityGuid);

            if (connectionOpportunity == null)
            {
                return(0);
            }

            // get cutoff for the last connection datetime.
            var lastConnectionDateTime = RockDateTime.Now.AddDays(-campaignItem.DaysBetweenConnection);

            // if DaysBetweenConnection is 0 then check for connection request for any time period.
            if (campaignItem.DaysBetweenConnection == default(int))
            {
                lastConnectionDateTime = DateTime.MinValue;
            }

            var entitySetItemService = new EntitySetItemService(rockContext);

            var entitySetItemsQry = entitySetItemService
                                    .Queryable()
                                    .Where(a => a.EntitySetId == campaignItem.EntitySetId)
                                    .OrderBy(a => a.Order);

            bool autoAssignment     = false;
            var  eligibleConnectors = new List <ConnectionConnector>();

            if (campaignItem.CreateConnectionRequestOption == CreateConnectionRequestOptions.AsNeeded &&
                campaignItem.DailyLimitAssigned.HasValue &&
                campaignItem.DailyLimitAssigned != default(int))
            {
                autoAssignment     = true;
                eligibleConnectors = GetEligibleConnectorWithLimit(connectionOpportunity.Id, rockContext, campaignItem.DailyLimitAssigned.Value);
            }

            int?connectionStatusId = connectionOpportunity.ConnectionType.ConnectionStatuses
                                     .Where(s => s.IsDefault)
                                     .Select(s => ( int? )s.Id)
                                     .FirstOrDefault();

            // If opportunity doesn't have a default status, something is wrong
            if (connectionStatusId == null)
            {
                ExceptionLogService.LogException(new Exception($"Unable to determine default connection status for {connectionOpportunity.Name} while processing campaigns", null));
                return(0);
            }

            var dayofWeek         = RockDateTime.Now.DayOfWeek;
            var entitySetItemList = entitySetItemsQry.ToList();

            foreach (var entitySetItem in entitySetItemList)
            {
                var personAlias            = personAliasService.GetPrimaryAlias(entitySetItem.EntityId);
                var defaultCampus          = personAlias.Person.GetCampus();
                int?connectorPersonAliasId = null;
                if (autoAssignment)
                {
                    int?connectorPersonId = null;
                    if (campaignItem.PreferPreviousConnector)
                    {
                        var personIds = eligibleConnectors
                                        .Where(a => a.Limit - a.Current > 0 &&
                                               (!a.DaysOfWeek.Any() || a.DaysOfWeek.Contains(dayofWeek)) &&
                                               (!a.CampusId.HasValue || (a.CampusId.HasValue && defaultCampus != null && defaultCampus.Id == a.CampusId.Value)))
                                        .Select(a => a.PersonId)
                                        .ToList();

                        if (personIds.Any())
                        {
                            var person = connectionRequestService
                                         .Queryable()
                                         .Where(a => a.ConnectionOpportunityId == connectionOpportunity.Id &&
                                                a.PersonAlias.PersonId == personAlias.PersonId &&
                                                a.ConnectionState == ConnectionState.Connected &&
                                                a.ConnectorPersonAliasId.HasValue &&
                                                personIds.Contains(a.ConnectorPersonAlias.PersonId))
                                         .Select(a => a.ConnectorPersonAlias.Person)
                                         .FirstOrDefault();

                            if (person != null)
                            {
                                connectorPersonId = person.Id;
                            }
                        }
                    }

                    if (!connectorPersonId.HasValue)
                    {
                        var eligibleConnector = eligibleConnectors
                                                .Where(a => a.Limit - a.Current > 0 &&
                                                       (!a.DaysOfWeek.Any() || a.DaysOfWeek.Contains(dayofWeek)) &&
                                                       (!a.CampusId.HasValue || (a.CampusId.HasValue && defaultCampus != null && defaultCampus.Id == a.CampusId.Value)))
                                                .OrderBy(a => a.Current)     // order from least assigned to most assigned
                                                .ThenBy(x => Guid.NewGuid()) // and then randomize
                                                .FirstOrDefault();

                        if (eligibleConnector != null)
                        {
                            connectorPersonId = eligibleConnector.PersonId;
                        }
                    }

                    if (!connectorPersonId.HasValue)
                    {
                        continue;
                    }

                    foreach (var connectionConnector in eligibleConnectors.Where(a => a.PersonId == connectorPersonId.Value))
                    {
                        connectorPersonAliasId       = connectionConnector.PersonAliasId;
                        connectionConnector.Current += 1;
                    }
                }

                using (var insertRockContext = new RockContext())
                {
                    try
                    {
                        /*
                         *  3/30/2020 - NA
                         *
                         *  When setting the connection request's Requester, we have to use the PrimaryAlias
                         *  to set the connectionRequest.PersonAlias property because the ConnectionRequestChangeTransaction
                         *  https://github.com/SparkabilityGroup/Rock/blob/a556a9285b7fdfe5594441286242f4feaa5847f2/Rock/Transactions/ConnectionRequestChangeTransaction.cs#L123
                         *  (which handles triggered workflows) expects it.  Also, it needs to be tracked by
                         *  the current rockContext...
                         *
                         *  In other words, this will not work correctly:
                         *  PersonAliasId = personAlias.Id,
                         *
                         *  Reason: This plug-in cannot change Rock core assembly code.
                         */

                        var personPrimaryAlias = new PersonAliasService(insertRockContext).GetPrimaryAlias(entitySetItem.EntityId);
                        var connectionRequestActivityService = new ConnectionRequestActivityService(insertRockContext);
                        var insertConnectionRequestService   = new ConnectionRequestService(insertRockContext);

                        // double check that they haven't already been added
                        var personAlreadyHasConnectionRequest = CampaignConnectionHelper.PersonAlreadyHasConnectionRequest(connectionOpportunity.Id, rockContext, lastConnectionDateTime, entitySetItem.EntityId);

                        if (personAlreadyHasConnectionRequest)
                        {
                            continue;
                        }

                        var connectionRequest = new ConnectionRequest()
                        {
                            ConnectionOpportunityId = connectionOpportunity.Id,
                            PersonAlias             = personPrimaryAlias,
                            ConnectionState         = ConnectionState.Active,
                            ConnectorPersonAliasId  = connectorPersonAliasId,
                            CampusId           = defaultCampus?.Id,
                            ConnectionStatusId = connectionStatusId.Value,
                        };

                        if (campaignItem.RequestCommentsLavaTemplate.IsNotNullOrWhiteSpace())
                        {
                            var mergeFields = new Dictionary <string, object>();
                            mergeFields.Add("Person", personAlias.Person);
                            mergeFields.Add("Family", personAlias.Person.GetFamily());
                            connectionRequest.Comments = campaignItem.RequestCommentsLavaTemplate.ResolveMergeFields(mergeFields);
                        }

                        insertConnectionRequestService.Add(connectionRequest);

                        if (connectorPersonAliasId.HasValue)
                        {
                            var connectionActivityTypeAssignedGuid = Rock.SystemGuid.ConnectionActivityType.ASSIGNED.AsGuid();
                            int?assignedActivityId = new ConnectionActivityTypeService(rockContext).GetId(connectionActivityTypeAssignedGuid);
                            if (assignedActivityId.HasValue)
                            {
                                var connectionRequestActivity = new ConnectionRequestActivity();
                                connectionRequestActivity.ConnectionRequest        = connectionRequest;
                                connectionRequestActivity.ConnectionOpportunityId  = connectionRequest.ConnectionOpportunityId;
                                connectionRequestActivity.ConnectionActivityTypeId = assignedActivityId.Value;
                                connectionRequestActivity.ConnectorPersonAliasId   = connectorPersonAliasId;
                                connectionRequestActivityService.Add(connectionRequestActivity);
                            }
                        }

                        insertRockContext.SaveChanges();
                    }
                    catch (Exception ex)
                    {
                        // Log exception and keep on trucking.
                        var exception = new Exception($"Exception occurred trying to create connection request:{personAlias.Id}.", ex);
                        createConnectionRequestExceptions.Add(exception);
                        ExceptionLogService.LogException(exception, null);
                    }
                }

                recordsProcessed += 1;
            }

            return(recordsProcessed);
        }
Пример #15
0
        /// <summary>
        /// Handles the Click event of the btnEdit control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
        protected void btnConnect_Click( object sender, EventArgs e )
        {
            using ( var rockContext = new RockContext() )
            {
                var opportunityService = new ConnectionOpportunityService( rockContext );
                var connectionRequestService = new ConnectionRequestService( rockContext );
                var personService = new PersonService( rockContext );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                        pnlSignup.Visible = false;
                    }
                }
            }
        }
Пример #16
0
        /// <summary>
        /// Executes the specified workflow.
        /// </summary>
        /// <param name="rockContext">The rock context.</param>
        /// <param name="action">The action.</param>
        /// <param name="entity">The entity.</param>
        /// <param name="errorMessages">The error messages.</param>
        /// <returns></returns>
        public override bool Execute( RockContext rockContext, WorkflowAction action, Object entity, out List<string> errorMessages )
        {
            errorMessages = new List<string>();

            // Get the person
            PersonAlias personAlias = null;
            Guid personAliasGuid = action.GetWorklowAttributeValue(GetAttributeValue( action, "PersonAttribute" ).AsGuid()).AsGuid();
            personAlias = new PersonAliasService( rockContext ).Get( personAliasGuid );
            if ( personAlias == null )
            {
                errorMessages.Add( "Invalid Person Attribute or Value!" );
                return false;
            }

            // Get the opportunity
            ConnectionOpportunity opportunity = null;
            Guid opportunityTypeGuid = action.GetWorklowAttributeValue( GetAttributeValue( action, "ConnectionOpportunityAttribute" ).AsGuid() ).AsGuid();
            opportunity = new ConnectionOpportunityService( rockContext ).Get( opportunityTypeGuid );
            if ( opportunity == null )
            {
                errorMessages.Add( "Invalid Connection Opportunity Attribute or Value!" );
                return false;
            }

            // Get connection status
            ConnectionStatus status = null;
            Guid? connectionStatusGuid = null;
            Guid? connectionStatusAttributeGuid = GetAttributeValue( action, "ConnectionStatusAttribute" ).AsGuidOrNull();
            if ( connectionStatusAttributeGuid.HasValue )
            {
                connectionStatusGuid = action.GetWorklowAttributeValue( connectionStatusAttributeGuid.Value ).AsGuidOrNull();
                if ( connectionStatusGuid.HasValue )
                {
                    status = opportunity.ConnectionType.ConnectionStatuses
                        .Where( s => s.Guid.Equals( connectionStatusGuid.Value ) )
                        .FirstOrDefault();
                }
            }
            if ( status == null )
            {
                connectionStatusGuid = GetAttributeValue( action, "ConnectionStatus" ).AsGuidOrNull();
                if ( connectionStatusGuid.HasValue )
                {
                    status = opportunity.ConnectionType.ConnectionStatuses
                        .Where( s => s.Guid.Equals( connectionStatusGuid.Value ) )
                        .FirstOrDefault();
                }
            }
            if ( status == null )
            {
                status = opportunity.ConnectionType.ConnectionStatuses
                    .Where( s => s.IsDefault )
                    .FirstOrDefault();
            }

            // Get Campus
            int? campusId = null;
            Guid? campusAttributeGuid = GetAttributeValue( action, "CampusAttribute" ).AsGuidOrNull();
            if ( campusAttributeGuid.HasValue )
            {
                Guid? campusGuid = action.GetWorklowAttributeValue( campusAttributeGuid.Value ).AsGuidOrNull();
                if ( campusGuid.HasValue )
                {
                    var campus = CampusCache.Read( campusGuid.Value );
                    if ( campus != null )
                    {
                        campusId = campus.Id;
                    }
                }
            }

            // Get the Comment
            String comment = action.GetWorklowAttributeValue(GetAttributeValue(action, "ConnectionCommentAttribute").AsGuid());

            var connectionRequestService = new ConnectionRequestService( rockContext );

            var connectionRequest = new ConnectionRequest();
            connectionRequest.PersonAliasId = personAlias.Id;
            connectionRequest.ConnectionOpportunityId = opportunity.Id;
            connectionRequest.ConnectionState = ConnectionState.Active;
            connectionRequest.ConnectionStatusId = status.Id;
            connectionRequest.CampusId = campusId;
            connectionRequest.ConnectorPersonAliasId = opportunity.GetDefaultConnectorPersonAliasId( campusId );
            connectionRequest.Comments = comment;

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

            // If request attribute was specified, requery the request and set the attribute's value
            Guid? connectionRequestAttributeGuid = GetAttributeValue( action, "ConnectionRequestAttribute" ).AsGuidOrNull();
            if ( connectionRequestAttributeGuid.HasValue )
            {
                connectionRequest = connectionRequestService.Get( connectionRequest.Id );
                if ( connectionRequest != null )
                {
                    SetWorkflowAttributeValue( action, connectionRequestAttributeGuid.Value, connectionRequest.Guid.ToString() );
                }
            }

            return true;
        }