Automatic reassigning of tasks in case of substitutions

This is an example of creating a listener for reassigning user tasks for existing substitutions. The standard substitution mechanism does not apply to user tasks.

Let's create a Listener object and on its Scripts tab add the following namespaces and code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EleWise.ELMA.ComponentModel;
using EleWise.ELMA.ConfigurationModel;
using EleWise.ELMA.Logging;
using EleWise.ELMA.Model.Common;
using EleWise.ELMA.Model.Entities;
using EleWise.ELMA.Model.Managers;
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.Runtime.NH.Listeners;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Tasks.Models;
using NHibernate.Event;

For the script to work, add the Microsoft.CSharp assembly.

namespace EleWise.ELMA.ConfigurationModel.Scripts
    /// <summary>
    /// Scripts module of the "User Task Substitution" object
    /// </summary>
    public class ForTaskReplacementScripts : EleWise.ELMA.Model.Scripts.Entities.EntityScriptModule<IForTaskReplacement>
        public class ForTaskReplacement : PostFlushEventListener
      //Create an object
            public override void OnPostInsert(PostInsertEvent @event)
                //Check @event.Entity for the required type and apply the required actions
         var task = @event.Entity as ITask;
                if(task != null)
             //Create a filter for searching an active substitution for the current user
                    var fl = InterfaceActivator.Create<IReplacementFilter>();
                    fl.SourceUser = task.Executor;
                    fl.Status = ReplacementStatus.Active;
             //Search a substitution
                    var rplscmnt = EntityManager<IReplacement>.Instance.Find(fl, null).FirstOrDefault();
             //Check if there is a substitution
                    if (rplscmnt != null)
                 //Compare the substitution start and end dates with the duedates of the current task
                        if (rplscmnt.StartDate < task.StartDate.Value)
                            if (rplscmnt.EndDate.AddMinutes(5) > task.StartDate.Value)
                         //Change the task executor with the subsitute user
                                task.Executor = rplscmnt.TargetUser;