Добрый день!

Появилась идея отправлять уведомление некоторой выборке пользователей. Выборка производится в бизнес процессе в задании - сценарии с помощью ESQ.

Возможно ли из c#-го кода отправить уведомление?

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

Может быть есть способ проще написать метод для отправки такого уведомления?

Нравится

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

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);

Вопрос решился просто. Добавила этот код в исходный код для нужного мне контакта. 

var Activity = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
var EntityActivity = Activity.CreateEntity(UserConnection);
EntityActivity.SetDefColumnValues();
EntityActivity.SetColumnValue("OwnerId", contactID);
EntityActivity.SetColumnValue("Title", "Активность с уведомлением");
EntityActivity.SetColumnValue("RemindToOwner", true);
EntityActivity.SetColumnValue("RemindToOwnerDate", DateTime.UtcNow);
EntityActivity.Save(false);
Показать все комментарии

Было бы хорошо отметку о напоминаниях автору и ответственному вынести в мини-карточку Активности, так как это одна из основных функций, которую заполняют при создании задач

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

Здравствуйте, Владимир!

 

Данная задача уже заведена у соответствующей команды на реализацию в будущих версиях приложения. Данный функционал будет реализован в рамках приоритетности задач по данному разделу.

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

Доброго времени суток, коллеги!

Совершаю первые попытки использования бизнес-процессов, поэтому прошу сильно не пинать.
Задача. При изменении состояния инцидента на определённое значение и неизменении этого состояния в течение n-ного количества времени, необходимо сформировать напоминалку ответственному и создателю.
Моё видение решения.
Через "Автоматический запуск процесса" настраиваю запуск моего процесса по изменению данных в источнике данных Инцидент если новое значение состояния соответствует такому-то фильтру. Как гасить уже висящий процесс при смене состояния на другое пока не придумал, возможно через другой бизнес-процесс, в котором скриптом прописать окончание предыдущего.
Создаём бизнес-процесс, содержащий всего два действия:
1. Задержка на n-ное количество времени
2. чтение/запись данных, "запись значений параметров в базу данных", "создать новую запись" с источником данных "напоминание". В п.5 заполняю поля будущего напоминания: "Описание = текст напоминания", "Тип объекта = Инцидент", "Время = как указать текущее + 1-2 минуты?" И вопрос с п.4: указать взаимосвязь ключевого поля с параметром диаграммы. Видимо, здесь нужно указать, к какому инциденту будет прицеплено новое уведомление. Откуда заполучить номер? И ID ответсвенного и создателя инцидента как поймать?

Нравится

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

1. Через "Автоматический запуск процесса" настраиваем запуск БП через каждые M-минут (зависит от n и здравого смысла)
2. В БП:
- берем все инциденты, подходящие по признакам ("неизменении этого состояния в течение n-ного", для учета последнего изменения надо либо сделать поле, куда писать текущее время при изменении, либо включить историю)
- проверяем для выбранных инцидентов - нет ли уже напоминалок/вместо проверки можно просто удалять созданные ранее (по какому-то признаку + ИД инцидента)
- добавляем и/или обновляем напоминалки для выбранных инцидентов
Так у вас будут всегда (с промежутком в M-минут) актуальные напоминалки

Как вариант, можно сделать это в виде задания Агента-SQL.

Но на сам деле надо сделать по-другому)) При изменении состояния инцидента на нужное - ставить напоминалку через n-времени. При изменении состояния с нужного - стирать ее. И Все)

"Андросов Дмитрий" написал:Как вариант, можно сделать это в виде задания Агента-SQL

Если все ж надумаете делать именно регулярно выполняемые задания - всячески плюсую этот вариант!

Ставить напоминалку - это работа ручками, а именно её и хочется исключить, т.к. в этом случае в процесс вклинивается человеческий фактор. Сейчас у народа есть фильтр по заданному состоянию инцидента, и на него им лень перейти и проверить не появилось ли там что-нибудь.
В целом, мысль понял и принял. На самом деле, наверно в джобик SQL это засунуть проще будет.
1. Выбираю все инциденты в нужном статусе из tbl_Incident
2. Из tbl_IncidentLog вытягиваю max(CreatedOn) для данного инцидента. Если эта дата отличается от текущей более чем на N, проверяю наличие/отсутствие в tbl_Reminding строчки для этого инцидента. Если нет, инсертю её.
Теоретически, должно получиться. Пошел кодить.

"Булат Андрей Борисович" написал:Ставить напоминалку - это работа ручками, а именно её и хочется исключить

Имелся ввиду скрипт на сохранение объекта Инцидент. Кодом написать генерацию напоминания, работать будет автоматом

"Александр Кудряшов" написал:
Булат Андрей Борисович пишет:

Ставить напоминалку - это работа ручками, а именно её и хочется исключить

Имелся ввиду скрипт на сохранение объекта Инцидент. Кодом написать генерацию напоминания, работать будет автоматом


Тоже вариант.
Остаётся вопрос: как убивать неиспользованные напоминания, если инцидент из неправильного состояния переведён раньше наступления часа Х. Там-же в скрипте отслеживать? Всё-таки, вариант с периодическим заданием/джобиком эту логику отработает правильнее.

"Булат Андрей Борисович" написал:как убивать неиспользованные напоминания...Там-же в скрипте отслеживать? Всё-таки, вариант с периодическим заданием/джобиком эту логику отработает правильнее.

реализовать скриптом проще.

после сохранения инцидента (DatasetAfterPost):
- если состояние изменилось с другого на неправильное - поставить напоминалку на текущее время + n
[когда наступит время Х - напоминалка отрабоается (удалится или переставится) вручную тем, на кого она ставится, если час Х не наступит то:]
- если состояние поменялось с неправильного на другой - удалить напоминалку, если она есть

состояние для дальнейшего сравнения в качестве "того, которое было до редактирования" лучше сохранять в переменную на AfterOpen

Реализовал таки через джобик SQL, ибо TSQL мне больше знаком :-) Вроде работает. Но... Напоминалку пользователь увидит только если запустит программу. У нас не все постоянно сидят в системе: не требуется это.
Отсюда вылезло продолжение задачи. Формировать не напоминалку а письмо. Тоже средствами MSSQL это возможно, или возвращаемся к первому сообщению - формирование бизнес-процесса?

"Булат Андрей Борисович" написал:Тоже средствами MSSQL это возможно, или возвращаемся к первому сообщению - формирование бизнес-процесса?

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

ой нет, это же 3х)))
по-моему, лучше сделать джоб на отправку е-мейла)

"Андросов Дмитрий" написал:

ой нет, это же 3х)))

по-моему, лучше сделать джоб на отправку е-мейла)


Тогда подскажите, с какой стороны подлезть? В какие таблицы и что засунуть? И самое главное, с чьей стороны будет уходить письмо?

сформулируйте еще раз задачу с учетом того, что это е-мейл, а не напоминание

При нахождении инцидентов, находящихся в состоянии YY более заданного времени (селека соответствующая уже готова), необходимо отправить письмо ответственному и автору инцидента. Адрес берём из соответствующих контактов. Тема письма - простой текст. В тело письма неплохо было бы затолкать номер инцидента, наименование контрагента и "признаки" инцидента.

письмо отправлять средствами сервера SQL (sp_send_dbmail) или через ОС сервера (плохо представляю как)
я бы отправлял одно письмо на одного адресата (с информацией на все инциденты, касающиеся адресата)
в Террасофт письма, естественно, не сохранятся (да и не надо)

Дмитрий, спасибо! Счастье наступило!
Слепил через sp_send_dbmail. В кучу собирать не стал: один инцидент - одно письмо, чтобы не перелопачивать логику предыдущего джоба.

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

Добрые день,
Еще один вопрос по БП, как должны срабатывать напоминания для активностей, используя элемент "Задача" создаю Активность, отмечаю "Напомнить за",
1

Активность создается но без напоминая, приходится создавать дополнительный элемент и вручную изменять значения полей "Напоминание ответственному" и "Дата напоминания ответственному"
2

Версия Team 7.4.0.2628

Нравится

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

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

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

При создании активности у Вас указано "Стартовать через 0 минут", а напоминание должно отработать за 1 минуту до начала. Я думаю из-за этого у Вас и не появляется напоминание. Попробуйте поставить значение "Стартовать через 2 минуты" должно все отработать корректно.

Добрый день, Тарас,
Спасибо за совет, сейчас попробую

Здравствуйте, Олег!

Похожий вопрос обсуждался на Community:

- http://www.community.terrasoft.ru/forum/topic/10496
- http://www.community.terrasoft.ru/forum/topic/10839
- http://www.community.terrasoft.ru/forum/topic/11325

Если возникнут дополнительные вопросы или сложности, пожалуйста, сообщите.

Результат тот же, активность создается, но деталь "Напоминания" пуста, также активность не попадает в меню справа "Уведомления".
Дмитрий, темы что вы привели, скажем немного не то что мне нужно, там рассматриваются всякие надстройки вроде "Напоминание на активность через веб сервис" или "Запуск БП на срабатывание напоминания".
Мне же нужно просто стандартный функционал чтобы заработал, а он видимо сбоит, напоминания не ставятся, уведомления справа не появляются, причем если создавать "Звонок" с такими же параметрами, стартовать через 0, напоминать через 1, все отрабатывает верно, проставляется напоминание и появляется уведомление в правом меню "Уведомления"

Версия Team 7.4.0.2628

Здравствуйте, Олег!

Проверил на последней релизной сборке 7.4.1.589 (Team, ENU).

Ошибку не воспроизвел, - для активности с типом Задача и категорией Выполнить, а также для активности с типом Звонок создаются напоминания:

http://i64.fastpic.ru/big/2015/0201/d9/fc2f92129cd84579be765fda968b55d9.png

http://i67.fastpic.ru/big/2015/0201/cf/e0076aca5f2c061cb50b7aee1a50f3cf.png

Напишите, пожалуйста, заявку на support@terrasoft.ru для предоставления Вам сборки.

Добрый день, Андрей,
С помощью саппорта обнаружили проблему:
"Проблема кроется в отсутствии подключения к веб-сокетам (не телефонийным).
В консоли должна быть строка вида:
ws-connection opened for url:ws://web-site:2011/0/Nui/ViewModule.aspx.ashx"
После включения проблема исчезла. Спасибо

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

Не отправляет напоминания о визировании при создании договора.
Началось с того, что у нескольких пользователей при установке визы перестали создаваться напоминания следующему по списку визировавшему.
Теперь такое у всех, кто бы не создал договор, кто бы его не визировал, напоминание о визирование не уходит к следующему пользователю.
Сообщение о том, что напоминание отправлено, не появляется.
В коде программы 100% ничего не изменяли.

Нравится

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

Здравствуйте, Андрей.

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

Прикрепляю детальную инструкцию по созданию виз и напоминаний по ним в прикрепленные файлы.

Спасибо,
Это я уже проверял у всех стоит напоминание.
не помогло

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

Анна, спасибо.

Андрей, прошу сообщить используемую Вами версию Terrasoft.

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

Добрый день!

Очень беспокоит вопрос появления напоминаний о создании новых E-mail сообщений по инциденту. Не знаю в какой момент, но у ответственного пользователя по инциденту появляются напоминания о том, что у инцидента появилось новое E-mail сообщение. Посмотрев деталь E-mail в инцидентах я действительно нашел там новые сообщения. Никто их туда специально не привязывал. Значит, получается, что при разборе почты каким-то образом это сообщение автоматически привязалось к инциденту. Я догадываюсь, что автоматическая привязка происходит по теме сообщения и номеру инцидента. Но это не совсем корректно, т.к. к инциденту номер 200 привязываются сообщения с темой "АКЦИЯ! Рекламный авиатур в Черногорию 200 евро!".

Как настроить корректную работу данного функционала или отключить его вообще?

Нравится

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

"Ozzy" написал:Значит, получается, что при разборе почты каким-то образом это сообщение автоматически привязалось к инциденту. Я догадываюсь, что автоматическая привязка происходит по теме сообщения и номеру инцидента.

Да, так и есть. В скрипте scr_MailLinks это делают функции FindIncidentNumber и GetIncidentDataBySubject:

function FindIncidentNumber(Str) {
	var Mask = GetSystemParameterValueEx('IncidentMask', false);
	var NumList = Str.match(/(\d+)/g);
	if (!NumList) {
		return;
	}
	for (var i = 0; i < NumList.length; i++) {
		var Num = Mask.replace(/\%1/g, NumList[i]);
		var SafeNum = '(^|:|#|№|-|\\s+)' + NormalizeForRegex(Num) + '(\\s|\\.|$)';
		if (Str.match(new RegExp(SafeNum, 'ig'))) {
			return Num;
		}
	}
}
 
function GetIncidentDataBySubject(Subject) {
	if (!System.GetHasLicense('Incidents')) {
		return false;
	}
 
	var IncidentNumber = FindIncidentNumber(Subject);
	if (!IncidentNumber) {
	    return null;
	}
    var SelectQuery = GetSingleItemByCode('sq_GetIncidentDataByNumber',
		'MailLinks');
    SelectQuery.Parameters('IncidentNumber').Value = IncidentNumber;
    var Dataset = SelectQuery.Open();
    try {
	    if (IsDatasetEmpty(Dataset)) {
	        return null;
	    }
	    return LoadRecord(Dataset);
	} finally {
		Dataset.Close();
	}
}

Если эта логика вообще не нужна, то можно во второй функции в начале вписать return null; .

Если же хочется привязывать к инцидентам только нужные письма, можно договориться о формате номера (например, [200] или #200) и соответствующим образом модифицировать первую функцию.

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

Александр, воспользовался Вашим советом и отключил функционал полностью в функции GetIncidentDataBySubject. Но в результате по-прежнему появляются напоминания о привязанных письмах к инцидентам ((( Может еще где-то отключить надо?

Странно. То есть напоминания по новым письмам, пришедшим после изменения кода и перезапуска Аутлука?

Ну да. Изменения внес еще 20 августа, старые напоминания удалил. Но они продолжают появляться до сих пор. Тоже грешил на то, что не перезапустили программы, но уже столько времени прошло...

Ozzy, закомментируйте в function SaveMailItem(MailItem, Options) сервиса scr_MSOutlookLibrary строку:

Incident = GetIncidentDataBySubject(MailItem.Subject);

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

Если функция GetIncidentDataBySubject уже отключена изнутри, какой смысл отключать все её вызовы? Надо смотреть, может, похожая логика сделана ещё где-то отдельно.

Я же говорю, похожая функция реализована в 5 разных скриптах. Её реализация есть в scr_MailLinks, который Вы указали, а есть и в scr_MSOutlookLibrary, который указала Наталья. Необходимо найти правильный и заблокировать вызов.

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

Доброго времени суток!

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

Вопрос: при создании инцидента пытался присвоить полю ContactID датасета ds_Reminding ID группы "Все пользователи":

function CreateNewRemindings(Dataset) {
        var RemindingDataset = Services.GetNewItemByUSI('ds_Reminding');
        RemindingDataset.Open();
        RemindingDataset.Append();
        RemindingDataset.ValAsGUID('ContactID') = '{97490F89-2943-480D-9AFE-B1C95DE00010}';
        RemindingDataset.ValAsDateTime('RemindTime') = GetLocalDateTime();
        RemindingDataset.ValAsGUID('SubjectID') = Dataset.ValAsGUID('ID');
        RemindingDataset.ValAsGUID('SubjectTypeID') = '{8E742F80-1C1A-4657-8D46-F189F0640544}';
        RemindingDataset.Values('Description') = 'Добавлен новый инцидент!';
        RemindingDataset.Post();
        RemindingDataset.Close();
}

Но так не работает, выскакивает ошибка (прикрепил).
Как я понял, он пытается связать ID группы с ID контактов. Видимо все не так просто. :smile: Как это обойти?

Нравится

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

Обойти это не удастся. Нужно создавать напоминание каждому члену группы отдельно - посмотрите как это сделано например в scr_RemindingEdit при добавлении напоминания группе: формируется список контактов в группе и для каждого генерируется напоминание.
Можно оттуда функцию готовую и взять

Спасибо! Проблема решена.

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

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

Возник такой вопрос, можно ли совсем отключить напоминания в Terrasoft?
После запуска Terrasoft и просмотра в профайлере запросов обнаруживаю ежеминутный запрос проверки напоминаний

SELECT
COUNT(*) AS [Count]
FROM
[dbo].[tbl_Reminding] AS [tbl_Reminding]
WHERE([tbl_Reminding].[ContactID] = @P1 AND
[tbl_Reminding].[RemindTime] = @P2)

Хотелось бы узнать, возможно ли от этого избавится?

Версия Terrasoft 3.1

Нравится

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

Если Вам нет необходимости использовать функционал напоминаний, закомментируйте обновление окна напоминаний в скрипте scr_Main:

function TimerOnTimer(Timer) {
	//ShowTimerWindow();
	//PrepareTimer();
}

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

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

Здравствуйте, подскажите как можно из бизнес - процесса при создании задачи создать и напоминание о этой задаче.

Нравится

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

Во вложении инструкция по созданию напоминания в БП.

Спасибо вам, Андрей!)

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

Николай, есть два варианта решения. Первый - если Вы перемещаете создание напоминания в блок try, необходимо перед его созданием проверять, существует ли в БД напоминание по этой задаче для текущего пользователя (неплохо было бы также применять фильтр по тексту напоминания, так как по одной и той же задаче может быть несколько разных напоминаний), и создавать его только в случае, если подобного напоминания нет.

Второй вариант (опять же, с предварительной проверкой) - создавать напоминание в обработчике btnOKOnClick карточки редактирования задачи (скрипт scr_TaskEdit). Создавать его необходимо после выполнения базового обработчика (блок, содержащий if (!scr_BaseDBEdit.btnOKOnClick(Control)) {...}), но перед блоком

if ((!TaskEdit.StatusChanged) || (!IsFinished) ||
	(IsEmptyGUID(WorkflowItemID))) {
	return;
}

,

так как после этого блока карточка задачи закрывается, если состояние не конечное.

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

Добрый день,

возможно ли в Террасофт создать периодическое напоминание по задаче? Например, каждое утро напоминать пользователю о необходимости выполнить какую-либо задачу (составить отчет, например)?
Сейчас в карточке напоминания можно выбрать только одно число и время.

Нравится

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

Периодические задачи буду реализованы в 3.3.2

--
www.it-sfera.com.ua

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