Добрый день . 

Есть стандартный БП Запуск процесса Отправка email сообщения группе о назначении обращения. Работает отлично. Но начиная с версии 7.17 можно отправлять вложения в  ходе БП.

Кто подскажет как модернизировать стандартный БП, что бы вложения отправлялись ? 

 

UserConnection userConnection = UserConnection;
if (userConnection.CurrentUser.ConnectionType == UserType.SSP) {
    userConnection = userConnection.AppConnection.SystemUserConnection;
}
var senderEmail = Terrasoft.Core.Configuration.SysSettings.GetValue<string>(userConnection, 
    "SupportServiceEmail", string.Empty);
if (userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguage") || userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguageV2")) {
    var caseRecordId = (StartSignal1.RecordId != Guid.Empty)
        ? StartSignal1.RecordId 
        : StartSignal2.RecordId;
    var esq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "Case");
    esq.AddColumn("Group");
    var caseEntity = esq.GetEntity(userConnection, caseRecordId);
    if (caseEntity != null) {
        var adminUnitEsq = new EntitySchemaQuery(userConnection.EntitySchemaManager, "SysAdminUnit");
        adminUnitEsq.UseAdminRights = false;
        var emailColumnName = adminUnitEsq.AddColumn("Contact.Email").Name;
        var groupId = caseEntity.GetTypedColumnValue<Guid>("GroupId");
        adminUnitEsq.Filters.Add(adminUnitEsq.CreateFilterWithParameters(FilterComparisonType.Equal, "[SysUserInRole:SysUser].SysRole", groupId));
        var collection = adminUnitEsq.GetEntityCollection(userConnection);
        var result = string.Join(";", collection.Select(e => e.GetTypedColumnValue<string>(emailColumnName)));
        if (!string.IsNullOrWhiteSpace(result)) {
            var emailTemplateSender = new Terrasoft.Configuration.EmailWithMacrosManager(userConnection);
            var emailTemplateId = Terrasoft.Configuration.CaseConsts.GroupTemplateId;
            if (userConnection.GetIsFeatureEnabled("EmailMessageMultiLanguageV2")) {
                emailTemplateSender.SendEmailFromTo(caseRecordId, emailTemplateId, senderEmail, result);
                return true;
            } else {
                var emailTemplateStore = new Terrasoft.Configuration.EmailTemplateStore(userConnection);
                var emailTemplateLanguageHelper = new Terrasoft.Configuration.EmailTemplateLanguageHelper(caseRecordId, userConnection);
                var languageId = emailTemplateLanguageHelper.GetLanguageId(emailTemplateId);
                var templateEntity = emailTemplateStore.GetTemplate(emailTemplateId, languageId);
                emailTemplateSender.SendEmailFromTo(caseRecordId, templateEntity.PrimaryColumnValue, senderEmail, result);
            }
        }
    }
} else {
    Guid sendEmailToCaseGroup = new Guid("C68F5A4E-AD06-4C83-88C4-040D2480FACB");
    var manager = userConnection.ProcessSchemaManager;
    var processSchema = manager.GetInstanceByUId(sendEmailToCaseGroup);
    if (ProcessSchemaManager.GetCanUseFlowEngine(userConnection, processSchema)) {
        var flowEngine = new FlowEngine(userConnection);
        Dictionary<string, string> parameter = new Dictionary<string, string>();
        parameter.Add("CaseRecordId", CaseRecordId.ToString());
        flowEngine.RunProcess(processSchema, parameter);
    } else {
        var moduleProcess = processSchema.CreateProcess(userConnection);
        if (processSchema.Parameters.ExistsByName("CaseRecordId")) {
            moduleProcess.SetPropertyValue("CaseRecordId", CaseRecordId);
        }
        moduleProcess.Execute(userConnection);
    }
}
return true;

Прикрепленные файлы

Нравится

1 комментарий

Добрый день.

Рекомендую вам воспользоваться данной статьей или уже готовое бесплатное расширение, которое можно будет немного отредактировать.

Показать все комментарии

nlog пишит свои логи в файл.

Пытаюсь настроить получение этих сообщений на почту. 

для этого в файл

nlog.targets.config

добавляю такой код 

       <target name="applicationAppenderNew" 
            xsi:type="Mail"
            smtpServer="smtp.office365.com"
            smtpAuthentication="Basic" 
            smtpPort="587"
            encoding="UTF-8"
            smtpusername="xxx@xxx"
            smtpPassword="xxxxx"
            from="hhhh"
            to="xxx@xxx"
            html="true"
            enableSsl="true"
            secureSocketOption="StartTls"
            replaceNewlineWithBrTagInHtml="true"  
            subject="Error"
            body="ff"
            timeout="10000"
        </target>

но почта не отправляется,

при этом файл логирования  internalLogFile="D:\log\NLog.log">   даже не создается. Как разобраться в чем проблема?

nlog.config 

добавил цели

        <logger name="Terrasoft.WebApp.Loader.*" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />
        <logger name="Terrasoft.WebApp.Global" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />
        <logger name="Terrasoft.Core.LicManager" writeTo="applicationAppender, applicationAppenderNEW" minlevel="Info" final="true" />

Нравится

1 комментарий

Добрый день,  попробуйте дополнительно настроить  уровень логирования  

 

internalLogLevel="Trace",

 

так как в библиотеке NLog почти вся полезная, диагностическая информация логируется на этом уровне. Путь к файлу должен быть абсолютным и у пользователя пула должны быть права на эту папку. 

Также посмотрите документацию по Nlog  Nlog-project.org и на Академии

 


 
Показать все комментарии

Есть следующая задача: при изменении активности нужно отправить ответственному email в котором есть прямая ссылка на эту активность.

Данную задачу можно реализовать используя элементы [Формула] и [Читать данные] в дизайнере бизнес-процессов. Необходимо добавить в сам процесс дополнительный текстовый параметр, который преобразовывает идентификатор активности используя формулу в текстовое значение через метод ToString(). 
Ссылка на активность состоит из статической части и динамической, например:

https://XXXX-crm-bundle.terrasoft.ru/0/Nui/ViewModule.aspx#CardModuleV2…e59e41be-f36b-1410-d691-00155d04c01d, все что сразу после ../edit/ - динамическая часть, guid (глобальный идентификатор активности), его и будем подставлять в тело email после статической ссылки.

1. Создаем элемент бизнес-процесса [Сигнал] который будет реагировать на изменение в активности. 

2. Следующим шагом, элементом [Читать данные] вычитываем данные из активности по Id.

3. Добавляем в процесс текстовый параметр, который преобразовывается в идентификатор активности используя формулу.

4. Используя элемент [Формула] передаем значение формулы в параметр guid активности.

В значении формулы используем метод ToString(), который преобразует идентификатор в текстовое значение:

5. Добавляем элемент для отправки email c заданными параметрами.

В теле письма, вставляем статическую ссылку на ваш сайт и через кнопку "молния"  выбираем параметры процесса, Параметр для guid активности.

В результате в теле письма получаем:

Ссылка на активность
https://XXX-crm-bundle.terrasoft.ru/0/Nui/ViewModule.aspx#CardModuleV2/… для guid активности#]

6. И как результат, при изменении активности получаем на почту письмо:

 

 

 

Нравится

Поделиться

1 комментарий

Ссылку на сам сайт (если у вас есть тестовая и рабочая среды, например) можно хранить в системной настройке SiteUrl (он же используется для настройки Telegram - https://academy.terrasoft.ru/docs/user/ustanovka_i_administrirovanie/na…)

Показать все комментарии
Terrasoft.Core.Factories
Terrasoft.Mail.Sender
 
List<string> messageRecipients = new List<string>() { email };
var message = new EmailMessage
{
	From = sender,
	To = messageRecipients,
	Subject = emailSubject,
	Body = $"Добрый день, {name}. {messageBody}"
};
 
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection",
	UserConnection));
var emailSender = new EmailSender(emailClientFactory, UserConnection);
emailSender.Send(message, true);

 

Нравится

Поделиться

0 комментариев
Показать все комментарии

Здравствуйте!

 

Подскажите по какой причине в систему могут не прогружаются некоторые письма?

Нравится

1 комментарий
Лучший ответ

Роман, здравствуйте!
По данному вопросу рекомендую обратиться в техническую поддержку, так как причин может быть много.

Во-первых, необходимо понимать какой типа синхронизации используется (микросервис Exchange Listener, старый тип через планировщик)
Во-вторых, необходимо анализировать логи приложения, микросервиса на различные ошибки синхронизации\соединения с почтовым сервером и прочее.

По данным скриншотам никакой конкретики подсказать не могу, к сожалению.

Роман, здравствуйте!
По данному вопросу рекомендую обратиться в техническую поддержку, так как причин может быть много.

Во-первых, необходимо понимать какой типа синхронизации используется (микросервис Exchange Listener, старый тип через планировщик)
Во-вторых, необходимо анализировать логи приложения, микросервиса на различные ошибки синхронизации\соединения с почтовым сервером и прочее.

По данным скриншотам никакой конкретики подсказать не могу, к сожалению.

Показать все комментарии

Здравствуйте, коллеги! 

 

Возможно, такие идеи уже были озвучены, но я все таки предложу.

 

1. Добавить в редактор email-шаблонов вофможность вставлять данные из системной настройки

2. Добавить в редактор возможность вставлять ссылки на записи из произвольных справочников

 

Открыть возможность написания пользовательских макросов для email не только для Customer Portal :) 

2 комментария

Лидия, спасибо за предложения. По системным настройкам в шаблоне идея уже была. По записи справочников — идею добавил. Хотя, если первую реализуют, можно будет создать системную настройку справочного типа.

По пользовательским, если речь о IMacrosInvokable, то тоже заведена идея использовать этот механизм в других продуктах, не только Service.

Зверев Александр,

Спасибо за ответ!

Показать все комментарии

Добрый день.
Есть предложение добавить новый стандартный макрос "Адрес стенда", который содержит доменное имя экземпляра creatio.
Это необходимо для формирования динамических ссылок на записи разделов.
Существующая функциональность "Ссылка на объект" записывает в тело шаблона статическую ссылку с доменным именем тестового стенда, и при переносе на Продакшн не перегенерирует её.

Так же есть просьба расширить возможность создания пользовательских макросов на все линейки creatio, а не ограничиваться только Service

1 комментарий

Игорь, зарегистрировал пожелание.

Также идея иметь возможность использовать макросы в продуктах, отличных от service уже заведена.

Ещё принята идея по добавлению  возможности добавить в шаблон письма системную настройку (в том числе и настройку SiteUrl, где хранится адрес сайта). 

Показать все комментарии

Добрый день, как при выборе флага загружать почту из выбранных папок, отобразить папку
Изображение удалено.
У меня не отображается ничего, я следовал статье в академии, где было все нормально
может быть на стороне почтового клиента нужны какие-то доп настройки?

Нравится

1 комментарий

Дмитрий, у меня тоже ничего не отображается:

 

Изображение удалено.

Можете прикрепить картинку и описать подробнее, что не работает?

Показать все комментарии

Добрый день!

 

Я удаляю письмо (Активность типа Email) из стандартного БП, созданного в дизайнере бизнес процессов. 

 

Есть ли возможность из БП обновить коммуникационную панель? Сейчас письмо из неё пропадает только после обновления страницы. 

Нравится

1 комментарий
Лучший ответ

Да. Сам так делаю примерно таким методом в схеме CommunicationPanelEmailSchema, а из БП шлю сообщение соответствующее:

onMyBpFinish: function(scope, message) {
    if (!message || message.Header.Sender !== "UpdateEmailHistory") {
        return;
    }
    var ID = message.Body;
    var collection = this.get("EmailCollection");
    var foundItem = collection.collection.items.find(item => item.id === ID);
    foundItem.set("IsNeedReload", false);
    this.reloadEmailsData([ID]);
    collection.remove(foundItem);
}

Скрипт в конце БП: 

var userConnection = Get<UserConnection>("UserConnection");
var EmailID = Get<string>("EmID");
EmailID.ToString();
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection,"UpdateEmailHistory", EmailID);
return true;

Возможно, можно как-то красивее и изящней, но вроде этот метод работает и наша ТП довольна результатом

Да. Сам так делаю примерно таким методом в схеме CommunicationPanelEmailSchema, а из БП шлю сообщение соответствующее:

onMyBpFinish: function(scope, message) {
    if (!message || message.Header.Sender !== "UpdateEmailHistory") {
        return;
    }
    var ID = message.Body;
    var collection = this.get("EmailCollection");
    var foundItem = collection.collection.items.find(item => item.id === ID);
    foundItem.set("IsNeedReload", false);
    this.reloadEmailsData([ID]);
    collection.remove(foundItem);
}

Скрипт в конце БП: 

var userConnection = Get<UserConnection>("UserConnection");
var EmailID = Get<string>("EmID");
EmailID.ToString();
Terrasoft.Configuration.MsgChannelUtilities.PostMessage(UserConnection,"UpdateEmailHistory", EmailID);
return true;

Возможно, можно как-то красивее и изящней, но вроде этот метод работает и наша ТП довольна результатом

Показать все комментарии

Добрый день!

Есть задача - добавлять в аудиторию письма (элемент "отправка письма" в процессе) коллекцию получателей (контакты, или их email'ы)

 

Список контактов каждый раз может быть разный и зависит от того, в какую орг.роль они входят. 

Другими словами - пользователь выбирает орг.роль, и в получатели письма вставляются контакты, которые входят в эту роль. 

В коробке системы это уже реализовано в процессе, который уведомляет группы ответственных о получении обращения. Но там это реализовано кодом. 

Вопрос - каким образом задачу можно решить средствами low-code платформы? :)

Нравится

1 комментарий
Лучший ответ

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

Доброе утро.

 

Средствами low-code можно попробовать реализовать с помощью обработки коллекций данных в бизнес-процессах через многоэкземплярное выполнение элемента [ Подпроцесс ].

Показать все комментарии