Еженедельная проверка на наличие дней рождений контактов и создание задач ответственным за них

В статье приведено описание реализации процесса для еженедельной проверки дней рождения контактов, предстоящих на следующей неделе.  При наличии дня рождения, ответственному за контакт пользователю ставится задача.

Чтобы бизнес-процесс запускался еженедельно, необходимо в настройках стартового события изменить триггер на Таймер, в появившейся вкладке Настройки таймера установить параметры запуска: еженедельно в выбранный день. Для получения списка пользователей, день рождения которых попадает в неделю с момента запуска процесса, и создания задач, используйте сценарий, приведенный ниже.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA до 3.12.1 включительно.

Контекстная переменная:

  • context.Spisok – переменная типа Контакт с типом связи Список.

Пространство имен:

using EleWise.ELMA.API;

Текст сценария:

var kontragenti = PublicAPI.CRM.Contractor.Find(FetchOptions.All).ToList();
kontragenti.ForEach(kontr =>{
  var kontrakti = kontr.Contacts.ToList(); //в каждом контрагенте просматриваем все имеющихся контактов
  kontrakti.ForEach(k =>{
   if ((k.Birthday != null)&(kontr.Responsible != null)) //выбираем только те контакты, в которых указаны даты рождения и ответственный
   {
   	if ((k.Birthday.Value.DayOfYear > context.WorkflowInstance.StartDate.Value.DayOfYear)&
												(k.Birthday.Value.DayOfYear < (context.WorkflowInstance.StartDate.Value.DayOfYear + 7))) //выбираем только тех контактов, у кого дата рождения попадает в неделю с момента запуска процесса 
   	{
   		//если нужно вывести полученный список, добавляем контакт в контекстную переменную
   		 //типа "Контакт" с типом связи "Список"     
   		 context.Spisok.Add(k);
   		 //создаем задачу и заполняем все ее обязательные поля
   		 var tsk = PublicAPI.Portal.TaskBase.Task.Create();
														 
   		 //в качестве автора задачи Вы можете указать любого другого пользователя     
   		  tsk.CreationAuthor = kontr.Responsible;
   		  tsk.CreationDate = DateTime.Now;
   		  //в зависимости от срока выполнения так же можно указать другое значение даты окончания задачи
   		  tsk.EndDate=DateTime.Now.AddDays(1);
   		  //записываем в качестве исполнителя задачи ответственного за данного контрагента
   		  tsk.Executor = kontr.Responsible;
   		  //в теме задачи прописываем, у кого день рождения и к какому контрагенту этот контакт относится
   		  tsk.Subject = "День рождения у " + k.Name + " из " + kontr.Name;
   		  tsk.Description = "Любое описание задачи";
   		  tsk.Save();
   	}
   }
    });
   });

Пример сценария без использования PublicAPI

Для корректной работы сценария необходимо подключить сборки:

Elewise.ELMA.Project
Elewise.ELMA.Documents
Elewise.ELMA.Documents.Docflow
Elewise.ELMA.Tasks
 
Пространства имен:
using EleWise.ELMA.CRM.Models;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Tasks.Models;
using EleWise.ELMA.Tasks.Managers;
using EleWise.ELMA.Model.Services;
Текст сценария:
//просматриваем всех имеющихся контрагентов
var kontragenti = EntityManager<Contractor>.Instance.Find(FetchOptions.All);
kontragenti.ForEach(kontr =>{
//в каждом контрагенте просматриваем все имеющихся контактов
  var kontakti = kontr.Contacts.ToList();
  kontakti.ForEach(k =>{
  //выбираем только те контакты, в которых указаны даты рождения и ответственный                                
    if ((k.Birthday != null)&(kontr.Responsible != null))
    {
//выбираем только тех контактов, у кого дата рождения попадает в неделю с момента запуска процесса                                     
        if ((k.Birthday.Value.DayOfYear > context.WorkflowInstance.StartDate.Value.DayOfYear)&
        (k.Birthday.Value.DayOfYear < (context.WorkflowInstance.StartDate.Value.DayOfYear + 7)))
          {
          //если нужно вывести полученный список, добавляем контакт в контекстную переменную
      //типа "Контакт" с типом связи "Список"                                    
      context.Spisok.Add(k);
      //создаем задачу и заполняем все ее обязательные поля
          var tsk = InterfaceActivator.Create<Task>();               
      //в качестве автора задачи Вы можете указать любого другого пользователя                                     
          tsk.CreationAuthor = kontr.Responsible;
          tsk.CreationDate = DateTime.Now;
          //в зависимости от срока выполнения так же можно указать другое значение даты окончания задачи
          tsk.EndDate=DateTime.Now.AddDays(1);
          //записываем в качестве исполнителя задачи ответственного за данного контрагента
          tsk.Executor = kontr.Responsible;
          //в теме задачи прописываем, у кого день рождения и к какому контрагенту этот контакт относится
          tsk.Subject = "День рождения у " + k.Name + " из " + kontr.Name;
          tsk.Description = "Любое описание задачи";
          tsk.Save();
       }
     }
  });
});