Формирование напоминаний при наступлении Знаменательного события
Добрый день!
Имеем следующею задачу:
1)Нужно за день до наступления некоторого "знаменательного события" создать напоминания всем пользователям.
2)Сделать возможность пользователю настраивать получения напоминаний (получать или нет) или фильтровать по каким то условиям.
Версия TS CRM 3.2.2.x, БД MS SQL
Заранее, спасибо !
Нравится
Добрый день, Роман.
Опишу кратко по шагам последовательность действий.
1. Необходимо реализовать хранилище для настроек напоминаний. Простейший способ - поле "Не получать напоминания" в таблице Контактов, типа Булевское, будет означать запрет на формирование автоматических напоминаний пользователю, связанному с контактом.
2. Реализовать хранимую процедуру (ХП) в базе продукта, основной задачей которой будет создание новых записей в tbl_Reminding (Напоминания) всем пользователям, чьи контакты не содержат установленного признака из п.1, на дату знаменательного события, при условии, что дата достаточно близка к текущей.
При создании этой процедуры нужно предусмотреть:
- не создавать напоминание пользователю о событии, если такое уже создано для этого пользователя
- учитывать только месяц и день события, не обращая внимания на год знаменательного события.
Если возникнут вопросы по реализации этой ХП, могу помочь, но на это уйдет некоторое время.
В итоге получим процедуру, периодически запуская которую можно автоматически генерировать напоминания.
3. Для периодического запуска ХП необходимо создать JOB на SQL-сервере. Если у Вас MSSQL 2000, то эту операцию можно выполнить в Enterprise Manager, если 2005 - в Management Studio. В создаваемом JOB'е будет лишь один шаг (step):
exec tsp_CreateAnniversaryRemindings
где tsp_CreateAnniversaryRemindings - имя Вашей созданной ХП.
Созданный JOB нужно настроить таким образом, чтобы он запускался 1 раз в сутки, ночью.
В итоге получим автоматическую генерацию напоминаний, как и требовалось.
4. Насчет настроек и фильтрации - тут все упирается в потребности клиента. Можно ввести понятие "Категория напоминания", добавить поле в таблицу, запрос, набор данных и окна напоминаний, и использовать это поле для фильтрации и сортировки. Как показывает практика, чересчур усложнять такие вещи не стоит, т.к. основная задача напоминания - именно напомнить о событии. В роли органайзера гораздо лучше использовать раздел Задачи.
Желаю успехов!
Спасибо за такой подробный ответ!
Но возник еще один небольшой вопрос:
По ТЗ "настройки получения напоминаний" должны находится в настройках пользователя, в которых он сможет вкл. или выкл. напоминания по контрагентам или по контактам (или получать напоминания по своим контрагентам или контактам).
Как лучше поступить в этой ситуации?
В такой ситуации лучше всего поступить так, как написано в ТЗ :).
То есть это означает, что нужно реализовать:
1. Хранение указанных настроек в БД системы (локальный профиль не подходит, т.к. недоступен для ХП на сервере и вообще хранится в файлах на диске, а не в БД). Как вариант, можно использовать таблицу tbl_UserSetting.
2. Чтение и сохранение настроек в скрипте окна wnd_UserSettings, настройка отображения настроек в элементах управления.
3. (самое главное) чтение и использованием указанных настроек в тексте ХП для создания напоминаний.
Желаю успехов!
И еще один вопрос (*надеюсь последний):
Возник вопрос с реализацией ХП! Во избежания глупых вопросов, можете ли вы опубликовать текст этой ХП ??
Роман, на разработку и отладку ХП может уйти достаточно большое время, 1-2 часа. На данный момент таким количеством свободного времени не располагаю. На выходных, возможно, удастся этим заняться, смогу помочь.
Чтобы повысить уровень знаний о платформе Terrasoft CRM и быстро выполнять подобные (и более сложные) задачи самостоятельно, рекомендуется пройти курсы по созданию конфигураций, проводимые компанией каждый месяц (возможны варианты в Киеве и Москве).
Здравствуйте!
Далее находится некоторый пример кода скрипта, который реализовывает вызов напоминаний и может вызываться с помощью Job.По необходимости его возможно поместить в хранимую процедуру.
insert into tbl_Reminding
(subjectTypeID, SubjectID, ContactID, RemindTime, Description)
SELECT DISTINCT
'A2B92783-A577-4904-9A29-2C75C9E66AB8' AS Expr1, tbl_Contact.ID, tbl_Contact.OwnerID, GETDATE() AS Expr2, CONVERT(varchar(250),
tbl_ContactAnniversary.AnniversaryDate, 104)
+ ' ' + tbl_Contact.Name + ' (' + tbl_Account.Name + ')' + ': ' + isnull(tbl_AnniversaryType.Name, '') AS TypeName
FROM tbl_Contact INNER JOIN
tbl_ContactAnniversary ON tbl_Contact.ID = tbl_ContactAnniversary.ContactID left outer join
tbl_AnniversaryType ON tbl_ContactAnniversary.TypeID = tbl_AnniversaryType.ID INNER JOIN
tbl_Account ON tbl_Contact.AccountID = tbl_Account.ID INNER JOIN
tbl_AdminUnit ON tbl_Contact.OwnerID = tbl_AdminUnit.UserContactID
WHERE (DATEPART(day, tbl_ContactAnniversary.AnniversaryDate) = DATEPART(day, GETDATE() + 3)) AND (DATEPART(month,
tbl_ContactAnniversary.AnniversaryDate) = DATEPART(month, GETDATE() + 3)) AND (tbl_AdminUnit.UserIsEnabled = 1)
AND (tbl_AdminUnit.UserContactID <> tbl_Contact.ID)
Terrasoft Support Team