Разработка
18
Апр
0

Добавление в электронную почту динамического форматированного контента с помощью бизнес-процессов

Одним из ограничений бизнес-процессов в Microsoft Dynamics CRM 4.0 является невозможность добавления динамического HTML-контента, например, для сообщений электронной почты. Под динамическим подразумевается, что контент зависит от записи для которой в настоящий момент работает Бизнес-процес.

Всем наверное известен трюк с копированием готовой странички в тело письма. http://mmcrm.ru/?p=834 Но это статичное решение, не позволяющее динамически формировать содержимое. Например, вместо: http://yandex.ru Вы хотите вставить в письмо HTML-ссылку <a href=»http://yandex.ru»>Яндекс</a>, которая, соответственно, в сообщении электропочты будет отображаться как Яндекс.

Все что для этого нужно – вставить в тело письма html-тэги, которые и будет интерпретированы как токовые. Но даже если Вы вставите html-тэги с помощью визуального интерфейса, то они и будут в таком виде отправлены получателю, поскольку система при вставке перекодирует их в заменители. Поэтому вставку необходимо производить на более низком уровне – например кода.

Cлучай с читабельными сылками уже решен в Акселераторе Business Productivity Workflow Tools.

Рассмотрим более сложный пример: необходим бизнес-процесс, который, будучи примененным к записи Бизнес-партнера, отправит его владельцу электронное письмо содержащее перечень связанных Контактов в отформатированный таблице и ссылками на эти контакты в читабельном виде (в качестве текста ссылки будет использоваться ФИО Контакта).

  • Создайте В Visual Studio проект нового кастомного Бизнес-процесса;
  • Добавьте в него сборки из SDK и подпишите;
  • Добавьте в него такой код:
    using System;
    using System.Workflow.ComponentModel;
    using System.Workflow.Activities;
    using System.Web.Services.Protocols;
    using Microsoft.Crm.Sdk;
    using Microsoft.Crm.SdkTypeProxy;
    using Microsoft.Crm.Sdk.Query;
    using Microsoft.Crm.Workflow;
    using System.Collections;
    using System.Text;
    
    namespace ActivityLibrary5
    {
        // Задаем имя шага
        [CrmWorkflowActivity("Связанные Контакты")]
        public partial class Activity1 : SequenceActivity
        {
            // Определяем строковый выходной параметр
            public static DependencyProperty formatteTableProperty = DependencyProperty.Register("formatteTable", typeof(string), typeof(Activity1));
            [CrmOutput("Table")]
            public string formatteTable
            {
                get { return (string)base.GetValue(formatteTableProperty); }
                set { base.SetValue(formatteTableProperty, value); }
            }
    
            protected override ActivityExecutionStatus Execute(ActivityExecutionContext executionContext)
            {
                // Получаем Crm Service из контекста выполнения Бизнес-процесса
                IContextService contextService = (IContextService)executionContext.GetService(typeof(IContextService)); 
                IWorkflowContext context = contextService.Context;
                ICrmService service = context.CreateCrmService();
    
                // Формируем запрос для получения всех Контактов связанных с текущей записью Бизнес-партнера
                QueryByAttribute query = new QueryByAttribute();
                query.EntityName = "contact";
                query.ColumnSet = new ColumnSet(new String[] { "contactid", "fullname", "telephone1", "emailaddress1" });
    
                query.Attributes = new String[] { "parentcustomerid" };
                query.Values = new Object[] { context.PrimaryEntityId };
                query.Orders = new ArrayList();
                query.Orders.Add(new OrderExpression("fullname", OrderType.Descending));
    
                RetrieveMultipleRequest request = new RetrieveMultipleRequest();
                request.Query = query;
    
                // Отправляем запрос в CRM
                RetrieveMultipleResponse returnedContacts = (RetrieveMultipleResponse)service.Execute(request);
                BusinessEntityCollection contacts = returnedContacts.BusinessEntityCollection;
    
                /* Формируем таблику связанных Контактов */
    
                // Добавляем текстовый заголовок
                StringBuilder results = new StringBuilder();
                results.Append("<b>Связанные контакты:</b><br><br>");
    
                // Открывающий тег HTML-таблицы
                results.Append("<table border=1 cellspacing=0>");
                // Заголовок HTML-таблицы
                results.Append("<tr><th>ФИО</th><th>Телефон</th><th>Электропочта</th></tr>");
    
                // Просматриваем каждый из возвращенных запросом Контактов и...
                foreach (contact Contact in contacts.BusinessEntities)
                {
                    // ...добавляем его поля в HTML-таблицу
                    results.Append(string.Format("<tr><td><a href='http://win-n22hj23d1b1/superfirma/sfa/conts/edit.aspx?id={1}'>{0}</a></td>", Contact.fullname, Contact.contactid.Value.ToString()));
                    results.Append(string.Format("<td>{0}</td>", Contact.telephone1));
                    results.Append(string.Format("<td><a href='mailto:{0}'>{0}</a></td></tr>", Contact.emailaddress1));
                }
                // Закрывающий тег HTML-таблицы
                results.Append("</table>");
    
                // Передаем результирующую строку в выходной параметр
                formatteTable = results.ToString();
    
                return ActivityExecutionStatus.Closed;
            }
        }
    }
    
  • Скомпилируйте проект и зарегистрируйте в Plug-in Registration Tool;
  • Откройте MS CRM и создайте новый бизнес-процесс для Бизнес-партнера;
  • Добавьте новый шаг Связанные контакты (кастомный, который мы только что создали);
  • Добавьте шаг Отправить сообщение. В диалоговом окне настройки параметров электронного сообщения добавьте в тело сообщения (помимо самого сообщения) выходной параметр шага Связанные контакты (Table);
  • Опубликуйте Бизнес-процесс и выполните его в отношении какой-либо записи Бизнес-партнера у которой есть связанные Контакты. Когда он выполнится откройте новый e-mail связанный с этой записью Бизнес-партнера 🙂




Комментарии (0)

*

code