logo

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

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

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

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

Для корректной работы сценария необходимо подключить сборки NHibernate, EleWise.ELMA.Tasks, EleWise.ELMA.Security, EleWise.ELMA.Content, EleWise.ELMA.Documents, EleWise.ELMA.Documents.Docflow, EleWise.ELMA.Projects, EleWise.ELMA.KPI.

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

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> 
//Вместо IForTaskReplacement нужно указать IИмя_вашего_объекта { [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(); } } } } } } } }