Example #1
0
        /// <summary>
        /// Creates the email communication.
        /// </summary>
        /// <param name="createEmailCommunicationArgs">The create email communication arguments.</param>
        /// <returns></returns>
        public Communication CreateEmailCommunication(CreateEmailCommunicationArgs createEmailCommunicationArgs)
        {
            var recipients            = createEmailCommunicationArgs.Recipients;
            var senderPersonAliasId   = createEmailCommunicationArgs.SenderPersonAliasId;
            var fromName              = createEmailCommunicationArgs.FromName;
            var fromAddress           = createEmailCommunicationArgs.FromAddress;
            var replyTo               = createEmailCommunicationArgs.ReplyTo;
            var subject               = createEmailCommunicationArgs.Subject;
            var message               = createEmailCommunicationArgs.Message;
            var bulkCommunication     = createEmailCommunicationArgs.BulkCommunication;
            var sendDateTime          = createEmailCommunicationArgs.SendDateTime;
            var recipientStatus       = createEmailCommunicationArgs.RecipientStatus;
            var systemCommunicationId = createEmailCommunicationArgs.SystemCommunicationId;

            var recipientsWithPersonIds       = recipients.Where(a => a.PersonId.HasValue).Select(a => a.PersonId).ToList();
            var recipientEmailsUnknownPersons = recipients.Where(a => a.PersonId == null).Select(a => a.EmailAddress);

            var recipientPersonList = new PersonService(( RockContext )Context)
                                      .Queryable()
                                      .Where(p => recipientsWithPersonIds.Contains(p.Id))
                                      .ToList();

            if (!recipientPersonList.Any() && recipientEmailsUnknownPersons.Any(a => a != null))
            {
                // For backwards compatibility, if no PersonIds where specified, but there are recipients that are only specified by EmailAddress, take a guess at the personIds by looking for matching email addresses
                recipientPersonList = new PersonService(( RockContext )Context)
                                      .Queryable()
                                      .Where(p => recipientEmailsUnknownPersons.Contains(p.Email))
                                      .ToList();
            }

            if (!recipientPersonList.Any())
            {
                return(null);
            }

            var communication = new Communication
            {
                CommunicationType     = CommunicationType.Email,
                Status                = CommunicationStatus.Approved,
                ReviewedDateTime      = RockDateTime.Now,
                ReviewerPersonAliasId = senderPersonAliasId,
                SenderPersonAliasId   = senderPersonAliasId
            };

            communication.FromName              = fromName.TrimForMaxLength(communication, "FromName");
            communication.FromEmail             = fromAddress.TrimForMaxLength(communication, "FromEmail");
            communication.ReplyToEmail          = replyTo.TrimForMaxLength(communication, "ReplyToEmail");
            communication.Subject               = subject.TrimForMaxLength(communication, "Subject");
            communication.Message               = message;
            communication.IsBulkCommunication   = bulkCommunication;
            communication.FutureSendDateTime    = null;
            communication.SendDateTime          = sendDateTime;
            communication.SystemCommunicationId = systemCommunicationId;
            Add(communication);

            // add each person as a recipient to the communication
            foreach (var person in recipientPersonList)
            {
                var personAliasId = person.PrimaryAliasId;
                if (!personAliasId.HasValue)
                {
                    continue;
                }

                var communicationRecipient = new CommunicationRecipient
                {
                    PersonAliasId = personAliasId.Value,
                    Status        = recipientStatus,
                    SendDateTime  = sendDateTime
                };
                communication.Recipients.Add(communicationRecipient);
            }

            return(communication);
        }
        /// <summary>
        /// Creates the email communication.
        /// </summary>
        /// <param name="createEmailCommunicationArgs">The create email communication arguments.</param>
        /// <returns></returns>
        public Communication CreateEmailCommunication(CreateEmailCommunicationArgs createEmailCommunicationArgs)
        {
            var recipients            = createEmailCommunicationArgs.Recipients;
            var senderPersonAliasId   = createEmailCommunicationArgs.SenderPersonAliasId;
            var fromName              = createEmailCommunicationArgs.FromName;
            var fromAddress           = createEmailCommunicationArgs.FromAddress;
            var replyTo               = createEmailCommunicationArgs.ReplyTo;
            var subject               = createEmailCommunicationArgs.Subject;
            var message               = createEmailCommunicationArgs.Message;
            var bulkCommunication     = createEmailCommunicationArgs.BulkCommunication;
            var sendDateTime          = createEmailCommunicationArgs.SendDateTime;
            var recipientStatus       = createEmailCommunicationArgs.RecipientStatus;
            var systemCommunicationId = createEmailCommunicationArgs.SystemCommunicationId;

            var recipientsWithPersonIds       = recipients.Where(a => a.PersonId.HasValue).Select(a => a.PersonId).ToList();
            var recipientEmailsUnknownPersons = recipients.Where(a => a.PersonId == null).Select(a => a.EmailAddress);

            /*
             * 4-MAY-2022 DMV
             *
             * In tracking down alleged duplicate communications we discovered
             * that duplicates could be sent to the same person if they are in the
             * recipient list more that once with mulitple Person Alias IDs.
             * This could have occured through a person merge or other data changes
             * in Rock. This code removes those duplicates from the list before
             * sending the communication.
             *
             */

            var recipientPersonList = new PersonAliasService(( RockContext )Context)
                                      .GetPrimaryAliasQuery()
                                      .Where(pa => recipientsWithPersonIds.Contains(pa.PersonId))
                                      .Select(a => a.Person)
                                      .ToList();

            if (!recipientPersonList.Any() && recipientEmailsUnknownPersons.Any(a => a != null))
            {
                // For backwards compatibility, if no PersonIds where specified, but there are recipients that are only specified by EmailAddress, take a guess at the personIds by looking for matching email addresses
                recipientPersonList = new PersonService(( RockContext )Context)
                                      .Queryable()
                                      .Where(p => recipientEmailsUnknownPersons.Contains(p.Email))
                                      .ToList();
            }

            if (!recipientPersonList.Any())
            {
                return(null);
            }

            var communication = new Communication
            {
                CommunicationType     = CommunicationType.Email,
                Status                = CommunicationStatus.Approved,
                ReviewedDateTime      = RockDateTime.Now,
                ReviewerPersonAliasId = senderPersonAliasId,
                SenderPersonAliasId   = senderPersonAliasId
            };

            communication.FromName              = fromName.TrimForMaxLength(communication, "FromName");
            communication.FromEmail             = fromAddress.TrimForMaxLength(communication, "FromEmail");
            communication.ReplyToEmail          = replyTo.TrimForMaxLength(communication, "ReplyToEmail");
            communication.Subject               = subject.TrimForMaxLength(communication, "Subject");
            communication.Message               = message;
            communication.IsBulkCommunication   = bulkCommunication;
            communication.FutureSendDateTime    = null;
            communication.SendDateTime          = sendDateTime;
            communication.SystemCommunicationId = systemCommunicationId;
            Add(communication);

            // add each person as a recipient to the communication
            foreach (var person in recipientPersonList)
            {
                var personAliasId = person.PrimaryAliasId;
                if (!personAliasId.HasValue)
                {
                    continue;
                }

                var communicationRecipient = new CommunicationRecipient
                {
                    PersonAliasId = personAliasId.Value,
                    Status        = recipientStatus,
                    SendDateTime  = sendDateTime
                };
                communication.Recipients.Add(communicationRecipient);
            }

            return(communication);
        }