Коллеги, прошу помочь, может кто-то сталкивался - есть общий ящик, который используется службой поддержки клиентов. На него пишут клиенты, с него отправляются уведомления. В результате - задень количество сообщений больше 10 тыс. и к концу дня отправка уведомлений блокируется со стороны майкрософт. (максимум можно 10К в сутки).

Какой вариант решения есть?

Думал добавить отдельный ящик для уведомлений внутри компании (о назначении ответственным по обращению и о назначении группы ответственных), но как это правильно настроить?

Буду благодарен за подсказку.

Нравится

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

Для больших объёмов рассылок используют bpm'online marketing с его специально разработанными веб-сервисами, находящимися в отдельном облаке и взаимодействующими с сервисами массовых рассылок.

Но у Вас, насколько понял, не одинаковая рассылка, а переписка живых людей. Тогда, наверно, так не подойдёт.

Если честно, сложно представить компанию с таким объёмом переписки. Хотя, заглянул в профиль, понятно.

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

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

 

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

Коллеги, добрый день!

 

Подскажите, пожалуйста, как в визировании (в бизнес-процессе) при отказе сделать причину отказа обязательной для заполнения?

 

Без средств программирования, пожалуйста.

Нравится

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

Попробуйте через мастер детали настроить такое бизнес-правило обязательности поля 'Причина отказа' от статуса визы.

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

Как подготовка к аттестации в целом? 

Попробуйте через мастер детали настроить такое бизнес-правило обязательности поля 'Причина отказа' от статуса визы.

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

Екатерина, получилось ли сделать причину отказа обязательной ? Нигде не могу найти решение этой задачи.

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

Добрый день!

Имеется следующий кейс: в запись раздела "Изменения" в деталь "Конфигурационные единицы" добавлена КЕ. Как с помощью бизнес-процесса добавить данную КЕ из изменений в деталь "Конфигурационные единицы" записи раздела "Релизы" (то есть автоматически передать значения)?

Нравится

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

Создать бизнес-процесс, который будет запускаться по факту изменения записи в детали 'Конфигурационные единицы', потом добавить элемент 'Читать данные' указать id записи из стартового сигнала и вычитать id KE, потом добавить элемент 'Добавить данные' в деталь 'Конфигурационные единицы' раздела 'Релизы'.

Создать бизнес-процесс, который будет запускаться по факту изменения записи в детали 'Конфигурационные единицы', потом добавить элемент 'Читать данные' указать id записи из стартового сигнала и вычитать id KE, потом добавить элемент 'Добавить данные' в деталь 'Конфигурационные единицы' раздела 'Релизы'.

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

Добрый день, коллеги.

Подскажите, пожалуйста, как сделать, чтобы при открытии проекта, записи детали "Структура" были развернуты по умолчанию?

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

Нравится

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

Добрый день!



Хотелось бы получить консультацию по CSS стилям.

Цель: необходимо изменить стиль одного единственного конкретного поля



1) создаю новый модуль, где пишу в LESS

.Test { color: #7FFF00;  }

2) в схеме делаю привязку к модулю через css!

3) в нужном поле прописываю 

 

"labelWrapConfig": {"classes": {"wrapClassName": ["Test"]}},

Помогите разобраться в задаче

Нравится

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

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

Так же обратите внимание что labelWrapConfig относится к заголовку поля а не к отображению его значения, которое у вас может быть не выведено на страницу

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

Так же обратите внимание что labelWrapConfig относится к заголовку поля а не к отображению его значения, которое у вас может быть не выведено на страницу

Григорий Чех,

define("CasePage", ["ProcessModuleUtilities", "CasePageResources",
		"ServiceDeskConstants", "BusinessRuleModule", "ConfigurationConstants", "GeneralDetails", "css!UsrColorChangeCSS"],
	function(ProcessModuleUtilities, resources, ServiceDeskConstants, BusinessRuleModule, ConfigurationConstants) {
		return {
			entitySchemaName: "Case",
			details: /**SCHEMA_DETAILS*/{ куча всего }
		}/**SCHEMA_DETAILS*/,
			modules: /**SCHEMA_MODULES*/{}/**SCHEMA_MODULES*/,
			dataModels: /**SCHEMA_DATA_MODELS*/{}/**SCHEMA_DATA_MODELS*/,
			businessRules: /**SCHEMA_BUSINESS_RULES*/{ куча всего }/**SCHEMA_BUSINESS_RULES*/,
				diff: /**SCHEMA_DIFF*/[
 
            {
				"operation": "insert",
				"name": "UsrCostd7f9ba80-586e-48b5-9c7f-bbeb266c6f28",
				"values": {
					"labelWrapConfig": {"classes": {"wrapClassName": ["Test"]}},
					"layout": {
						"colSpan": 12,
						"rowSpan": 1,
						"column": 0,
						"row": 6,
						"layoutName": "SolutionTab_gridLayout"
					},
					"bindTo": "UsrCost"
				},
				"parentName": "SolutionTab_gridLayout",
				"propertyName": "items",
				"index": 9
			}

код модуля css в первом посте

Попробуйте в values

вставить вместо labelWrapConfig

classes: {

            labelClass: ["Test"]

        }

Григорий Чех,

не вышло 

Уточните className для вашего поля,  для label должен быть

className: "Terrasoft.Label",

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

Sales Enterprise

Версия 7.13.3.481

Настраиваю новое правило поиска дублей по полю  "Основной телефон" согласно инструкции:

https://academy.terrasoft.ru/documents/technic-sdk/7-13/dobavlenie-pravila-poiska-dubley

Признак "Использовать правило при сохранении" установлен: https://yadi.sk/i/546AVOF8xgA95A

Но при создании очевидного дубля по полю основной телефон новая запись благополучно сохраняется.



При запуске глобального поиска дублей поиск по новому правилу отрабатывает корректно.

 

Нравится

7 комментариев

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

Правило отрабатывает корректно при глобальном поиске.

Дополнительных настроек кроме признака "Использовать при сохранении" в академии не нашёл.

Если бы правило было настроено верно, оно бы отрабатывало везде. Кроме простановки галочки ещё нужно написать хранимую процедуру, о чём написано в инструкции.

Так же выявлено, что и базовые правила не отрабатывают при сохранении

Базовые правила должны отрабатывать при сохранении контакта и контрагента.

О сохранении Контрагента и идёт речь

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

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

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

Есть базовый функционал импорта из Excel который при каждом импорте запрашивает связку полей Excel документа и полей таблицы куда идет импорт. 

Можно ли сделать преднастройку связывания данных при импорте из Excel, что бы каждый раз не приходилось делать одни и те же настройки?

 

Нравится

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

Посмотри пример добавления вложений в письмо EmailMessagePublisherPage

define("EmailMessagePublisherPage", ["EmailMessagePublisherPageResources", "LookupUtilities", "EmailImageMixin",
		 "ConfigurationConstants", "MaskHelper", "ExchangeNUIConstants", "EmailActionsMixin", "MacrosUtilities",
		"ExtendedHtmlEditModuleUtilities", "ExtendedHtmlEditModule", "MessagePublisherAttachmentUtilities",
		"MacrosHelperServiceRequest", "EntityResponseValidationMixin", "css!HtmlEditModule",
		"css!EmailMessagePublisherModule"],
		function(resources, LookupUtilities, EmailImageMixin, ConfigurationConstants, MaskHelper, ExchangeNUIConstants) {
			return {
				entitySchemaName: "Activity",
 
{
	"operation": "insert",
	"name": "AttachFileButton",
	"propertyName": "items",
	"parentName": "PublisherBottomContainer",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.DEFAULT,
		"iconAlign": this.Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"imageConfig": {
			"bindTo": "getAttachFileButtonImageConfig"
		},
		"tag": "attachFileButton",
		"fileUpload": true,
		"filesSelected": {"bindTo": "onAttachFileSelected"},
		"enabled": {
			"bindTo": "IsPublishButtonEnabled"
		},
		"click": {
			"bindTo": "onAttachFileButtonClick"
		},
 

В MessagePublisherAttachmentUtilities в методе onAttachFileSelected выполняется загрузка файла а метод onComplete вызывается после окончания загрузки вот туда можно вставить вызов твоего сервиса по импорту данных и передать ему fileId загруженного файла.

В более сложном варианте можно обойтись без загрузки файла в БД но для этого тебе нужно по аналогии с FileApiService написать свой сервис обработки файлового потока и вызывать его

 

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

Почти 2 года назад озвучивала здесь это пожелание Возможность сохранения настроек импорта из Microsoft Excel. Но из-за того, что потребность в данной функциональности у пользователей bpm'online crm низкая, она до сих пор не реализована.

Если такая функциональность действительно нужна, переходите по ссылке выше и ставьте лайк. Насколько знаю, то здесь работает такая система, чем больше лайков, тем больше вероятность, что предложенную идею возьмут в работу продуктовые команды.

Другой вариант, Вы можете реализовать свой преднастроенный импорт, например, через действие раздела. Посмотрите обсуждение здесь.

Если вы часто выполняете импорт может стоить подумать о других механизмах а не Экселе. Импорт из экселя задумывался для разового переноса/наполнения системы. Использование его оправадано если данных сравнительно немного и их вручную нужно просматривать/фильтровать менять.

Если вы постоянно выполняете обновления то можно использовать интеграции с вэб сервисами или инструменты интеграции на уровне БД (Например на основе мастера экспорта импорта MSSQL Managment Studio можно создать свой пакет сохранив туда все настройки и использовать его для автоматизации процесса переноса записей)

 

Григорий Чех,

Импорт с Экселя оправдан т.к. данные вносятся туда вручную и их не так уж и много. 

Что было бы лучше? 1. Копаться в базовом импорте с Эксель и пробовать через этот способ сделать. 2. Сделать программу которая импортировала данны прямо в БД, но тогда мне неизвестно будет ли отрабатываться процессы на уровне Entity. 3. Сделать все как в 2 пункте только в БД специально созданной для этого случая и потом как-то синхронизировать её(эту БД) с bpmonline.

Алла Савельева,

Идею поддержал.

По поводу своего преднастроенного импорта. Если делать его через отдельную программу на C# , то будет ли срабатывать событийные процессы на уровне Entity?

Андреев Андрей Сергеевич,

Я бы написал свой БП или лучше сервис для импорта данных в bpm. Чтобы срабатывали событийные процессы для вставки данных используй esq

Как то так

var _caseFile = new Terrasoft.Configuration.CaseFile(UserConnection);
    _caseFile.SetDefColumnValues();
    _caseFile.SetColumnValue("Name", url);
    _caseFile.SetColumnValue("TypeId", FileConsts.LinkTypeUId);
    _caseFile.Save();

 

Григорий Чех,

Возможно вы знаете как загрузить Excel файл с  карточки загрузки на стороне клиента и правильно передать его при вызове серверного кода, используя 

ServiceHelper.callService(config);

Что-бы там его получить и уже как-то занести в БД?

Посмотри пример добавления вложений в письмо EmailMessagePublisherPage

define("EmailMessagePublisherPage", ["EmailMessagePublisherPageResources", "LookupUtilities", "EmailImageMixin",
		 "ConfigurationConstants", "MaskHelper", "ExchangeNUIConstants", "EmailActionsMixin", "MacrosUtilities",
		"ExtendedHtmlEditModuleUtilities", "ExtendedHtmlEditModule", "MessagePublisherAttachmentUtilities",
		"MacrosHelperServiceRequest", "EntityResponseValidationMixin", "css!HtmlEditModule",
		"css!EmailMessagePublisherModule"],
		function(resources, LookupUtilities, EmailImageMixin, ConfigurationConstants, MaskHelper, ExchangeNUIConstants) {
			return {
				entitySchemaName: "Activity",
 
{
	"operation": "insert",
	"name": "AttachFileButton",
	"propertyName": "items",
	"parentName": "PublisherBottomContainer",
	"values": {
		"itemType": this.Terrasoft.ViewItemType.BUTTON,
		"style": this.Terrasoft.controls.ButtonEnums.style.DEFAULT,
		"iconAlign": this.Terrasoft.controls.ButtonEnums.iconAlign.LEFT,
		"imageConfig": {
			"bindTo": "getAttachFileButtonImageConfig"
		},
		"tag": "attachFileButton",
		"fileUpload": true,
		"filesSelected": {"bindTo": "onAttachFileSelected"},
		"enabled": {
			"bindTo": "IsPublishButtonEnabled"
		},
		"click": {
			"bindTo": "onAttachFileButtonClick"
		},
 

В MessagePublisherAttachmentUtilities в методе onAttachFileSelected выполняется загрузка файла а метод onComplete вызывается после окончания загрузки вот туда можно вставить вызов твоего сервиса по импорту данных и передать ему fileId загруженного файла.

В более сложном варианте можно обойтись без загрузки файла в БД но для этого тебе нужно по аналогии с FileApiService написать свой сервис обработки файлового потока и вызывать его

 

Еще проще по нажатию кнопки вызвать

selectFile(event) {
    event.preventDefault();
 
    file_input = document.createElement('input');
    file_input.addEventListener("change", uploadFile, false);
    file_input.type = 'file';
    file_input.click();
},
 
uploadFile() {
    //отправка file_input.files[0]) например используя  XMLHttpRequest post
}

 

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

Ситуация по шагам: 

1. Клиент пишет обращение 

2. Ему приходит оповещение (Ваше обращение зарегистрировано т.д.) 

3. Клиент отвечает на это оповещение что-либо. 

4. В системе создается новое обращение 

5. Клиенту приходит еще одно оповещение соответственно. 

 

Разворачивал демостенд, насколько понимаю это является стандартной логикой BPM. 

Вопрос:

Можно ли избежать такой ситуации? Как сделать так, что бы при ответе на оповещение не создавалась новое обращение? 

Нравится

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

Новые письма привязываются к существующим инцидентам, если в их тексте есть упоминания номера, например №SR-12345.Значит, нужно в автоматическом шаблоне или в ручном ответе указывать номер в таком формате. Тогда при ответе будет не создаваться новое, а переоткрываться старое. Формат задаётся в системной настройке «Маска номера обращения». 

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

Коллеги, посоветуйте, пожалуйста, лучшие практики реализации Double Opt-In в bpm'online.

Желательно, без использования рассылок bpm'online marketing, чтобы не использовать лицензированные "активные контакты", которые так и не подпишутся на рассылки.

Нравится

7 комментариев

Для начала бы всем присутствующим знать, что такое «Double Opt-In». Если речь об этом:

Image: a graphic depicting the two steps of the double opt-in process: the signup form, and the opt-in confirmation email.

То это довольно похоже на стандартные механизмы раздела кампаний в bpm'online marketing с добавлениями из лендинга и триггерными рассылками:

 

section_campaigns_landing_condition_flow.png

Естественно, потребуются те самые лицензии на активные контакты.

Без них можно только отправлять почту прямо из системы по SMTP в рамках логики БП, что мало масштабируемо и нагружает систему.

 

Зверев Александр пишет:

То это довольно похоже на стандартные механизмы раздела кампаний в bpm'online marketing с добавлениями из лендинга и триггерными рассылками:

Да, очень похоже. Но пока непонятны некоторые моменты:

- как отлавливать завершение кампании Double Opt-In, чтобы в карточке контакта уже отметить, что он прошёл подписку до конца?

- как унифицировать это решение, чтобы не копировать в каждом landing page, где контакт может подписаться? 

Для этого служит элемент «Выход из кампании». Там отмечают не в карточке, но на детали:

Всем контактам, которые по переходу или согласно настроенным условиям группы попали на этот шаг, на вкладке [Аудитория] в колонке [Текущий шаг] будет установлено значение “Достигли цели”

Движок кампаний поддерживает ветвления, можно попробовать добавить в одной кампании несколько разных элементов «Добавить из лендинга».

Возникли ещё 2 вопроса:



1. Минимальный период запуска кампании - 15 минут, что слишком долго, чтобы выслать клиенту письмо с подтверждением подписки (большинство не дождётся, и не ответит)

2. Процесс, кажется, не отлавливает изменения в детали Campaign participant. По крайней мере, ни разу за день процессы (реальный и тестовый) не сработали, хотя, участники добавлялись и даже дошли до цели:

 

Процесс не запустится по событию на объекте, если добавление или изменение делается не при помощи механизмов EntitySchemaQuery, а посредством классов Insert/Update или напрямую в базе. Вероятно, для этой детали происходит именно так.

Зверев Александр пишет:

Процесс не запустится по событию на объекте, если добавление или изменение делается не при помощи механизмов EntitySchemaQuery, а посредством классов Insert/Update или напрямую в базе. Вероятно, для этой детали происходит именно так.

Интересно, а как тогда люди на bpm'online реализуют такой механизм Double Opt-In? 

Если логика простая — можно на триггере в базе. Или по таймеру проверять новые записи, которые ещё не обработаны. Или из того же триггера запустить через веб-сервис БП с Id нужной записи в параметре. Или найти то место в коде, где произошло добавление на деталь в обход ESQ (если дело действительно в этом) и добавить вызов нужной логики.

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

На странице [Адрес приложения]/0/Nui/ViewModule.aspx#BaseSchemaModuleV2/FeaturesPage доступна возможность управления функциональностью. Но не понятно кому какая функциональность доступна. При наведении просто пишет что функциональность доступна для группы пользователей. но нельзя понять для какой.

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

Если же добавить функциональность, то в таблице AdminUnitFeatureState она прописывается только для меня. Ка назначить функциональность скажем на Орг роль? 

Нравится

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

Так в той же самой таблице(AdminUnitFeatureState) есть поле SysAdminUnitId. В него и заносится пользователь/роль. Если из интерфейса вносится пользователь, то Id ролей скорее всего придется руками добавлять

Вот это как раз не интересно. Выходит руками в БД надо прописать ID роли. А если я хочу дать только двум пользователям, то видимо мне надо добавлять еще запись в AdminUnitFeatureState

Фичи предназначены для временного включения-выключения не до конца разработанной новой логики, подробная настройка их состояния по группам не реализована. Каждый пользователь может включить или выключить себе или же пользоваться значением, выбранным по умолчанию для группы «Все сотрудники компании» или «Все пользователи портала». Через базу можно указать и другие группы или пользователей.

А если Вы разрабатываете какую-то логику и хотите определять её доступность, лучше будет создать не фичу, а право на операцию, и проверять в коде его.

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