/// <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); }