Автоматическое переназначение задач-поручений при замещении

В приведенном примере рассматривается создание перехватчика (listener) для переназначения задач-поручений для действующих замещений. Стандартный механизм замещения не распространяется на простые задачи.

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

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using EleWise.ELMA.API;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Runtime.NH.Listeners;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Tasks.Models;
using NHibernate.Event;

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

[Component]
        public class ForTaskReplacement : PostFlushEventListener
        {
      //Создание объекта
            public override void OnPostInsert(PostInsertEvent @event)
            {
                //Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
                 var task = @event.Entity as ITask;
                if(task != null)
                {
             //Создаем фильтр для поиска активного замещения для исполнителя текущей задачи
                  
                    var rplscmnt = PublicAPI.Portal.Objects.Security.Replacement.Filter().SourceUser((User)task.Executor).Status(PublicAPI.Enums.Security.ReplacementStatus.Active).Find().FirstOrDefault();
             //Проверка наличия замещения
                    if (rplscmnt != null)
                    {
                 //Соотнесение даты начала и конца замещения с сроком текущей задачи
                        if (rplscmnt.StartDate < task.StartDate.Value)
                        {
                            if (rplscmnt.EndDate.AddMinutes(5) > task.StartDate.Value)
                            {
                         //Подмена исполнителя задачи замещающим пользователем
                                task.Executor = rplscmnt.TargetUser;
                                task.Save();
                            }
                        }
                    }
                }
            }
        }

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

Создадим объект Перехватчик.

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Runtime.NH.Listeners;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Tasks.Models;
using NHibernate.Event;

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

namespace EleWise.ELMA.ConfigurationModel.Scripts
{
    
    /// <summary>
    /// Модуль сценариев объекта "Замещение обычных задач"
    /// </summary>
    public class ForTaskReplacementScripts : EleWise.ELMA.Model.Scripts.Entities.EntityScriptModule<IForTaskReplacement>
    {
        [Component]
        public class ForTaskReplacement : PostFlushEventListener
        {
      //Создание объекта
            public override void OnPostInsert(PostInsertEvent @event)
            {
                //Проверяем @event.Entity на нужный тип и выполняем с ним необходимы действия
         var task = @event.Entity as ITask;
                if(task != null)
                {
             //Создаем фильтр для поиска активного замещения для исполнителя текущей задачи
                    var fl = InterfaceActivator.Create<IReplacementFilter>();
                    fl.SourceUser = task.Executor;
                    fl.Status = ReplacementStatus.Active;
             //Поиск замещения
                    var rplscmnt = EntityManager<IReplacement>.Instance.Find(fl, null).FirstOrDefault();
             //Проверка наличия замещения
                    if (rplscmnt != null)
                    {
                 //Соотнесение даты начала и конца замещения с сроком текущей задачи
                        if (rplscmnt.StartDate < task.StartDate.Value)
                        {
                            if (rplscmnt.EndDate.AddMinutes(5) > task.StartDate.Value)
                            {
                         //Подмена исполнителя задачи замещающим пользователем
                                task.Executor = rplscmnt.TargetUser;
                                task.Save();
                            }
                        }
                    }
                }
            }
        }

    }
}