Exemple #1
0
        public static ReminderTask CreateReminderTask(SNAP_Workflow_State state)
        {
            ReminderTask tsk = null;

            var overdueType = Enum.GetName(typeof(WorkflowState), state.workflowStatusEnum);
            Utilities.OutputMessage(overdueType + ", Req id: " + state.SNAP_Workflow.SNAP_Request.pkId + ",WF id: " + state.SNAP_Workflow.pkId + "-" +
                state.SNAP_Workflow.SNAP_Actor.displayName + " due on: " + state.dueDate, EventLogEntryType.Information);

            if (overdue(state, overdueType))
            {
                if (state.workflowStatusEnum == (byte) WorkflowState.Pending_Approval &&
                    state.SNAP_Workflow.SNAP_Actor.pkId != AimActorID)
                    tsk =  new ApproverReminderTask(state);

                if (state.workflowStatusEnum == (byte) WorkflowState.Change_Requested)
                    tsk =  new ChangeRequestedReminderTask(state);

            }

            if (tsk != null)
                Utilities.OutputMessage(overdueType + ", Req id: " + state.SNAP_Workflow.SNAP_Request.pkId + ",WF id: " + state.SNAP_Workflow.pkId + " email nag", EventLogEntryType.Information);
            else
            {
                tsk = new ReminderTask(state);
            }

            return tsk;
        }
Exemple #2
0
 static bool canChangeDueDate(SNAP_Workflow_State latestState)
 {
     return (latestState.workflowStatusEnum == (byte) WorkflowState.Change_Requested ||
             latestState.workflowStatusEnum == (byte) WorkflowState.Pending_Approval)
            &&
            (latestState.completedDate == null && latestState.notifyDate != null && latestState.dueDate != null);
 }
Exemple #3
0
        static bool overdue(SNAP_Workflow_State wfState, string overdueType)
        {
            DateTime dueDate = DateTime.Parse(wfState.dueDate.ToString());
            TimeSpan diff = DateTime.Now.Subtract(dueDate);

            int overdueAlertIntervalInDays = Convert.ToInt16(ConfigurationManager.AppSettings["OverdueAlertIntervalInDays"]);
            int overdueAlertMaxDay = Convert.ToInt16(ConfigurationManager.AppSettings["OverdueAlertMaxDay"]);

            if (overdueAlertMaxDay <= 0 || overdueAlertIntervalInDays <= 0)
                return false;

            if (wfState.workflowStatusEnum != (byte)WorkflowState.Pending_Approval
                && wfState.workflowStatusEnum != (byte)WorkflowState.Change_Requested)
                return false;

            if (diff.Days >= overdueAlertMaxDay
                && (wfState.workflowStatusEnum == (byte)WorkflowState.Pending_Approval
                    || wfState.workflowStatusEnum == (byte)WorkflowState.Change_Requested))
            {
                var accessReq = new AccessRequest(wfState.SNAP_Workflow.requestId);
                accessReq.NoAccess(WorkflowAction.Abandon, string.Format("Request has been abandoned because of inactivity.  Maximum overdue days ({0}) for action reached.", overdueAlertMaxDay));
                return false;
            }

            if (diff.Days < overdueAlertMaxDay && diff.Days > 0)
            {
                // at least more than 24 hours over due
                if (diff.Days % overdueAlertIntervalInDays == 1 || overdueAlertIntervalInDays == 1) // also every x interval days to send alert
                {
                    if (wfState.workflowStatusEnum == (byte)WorkflowState.Pending_Approval
                        || wfState.workflowStatusEnum == (byte)WorkflowState.Change_Requested)
                    {
                        wfState.SNAP_Workflow.SNAP_Workflow_Comments.Add(new SNAP_Workflow_Comment()
                                                                             {
                                                                                 commentText =
                                                                                     "Overdue: " + overdueType.Replace('_', ' '),
                                                                                 commentTypeEnum =
                                                                                     (byte) CommentsType.Email_Reminder,
                                                                                 createdDate = DateTime.Now
                                                                             });

                        return true;
                    }
                }
            }
            return false;
        }
Exemple #4
0
 public ReminderTask(SNAP_Workflow_State state)
 {
     wfState = state;
 }
Exemple #5
0
 public ChangeRequestedReminderTask(SNAP_Workflow_State st)
     : base(st)
 {
 }
Exemple #6
0
 public ApproverReminderTask(SNAP_Workflow_State st)
     : base(st)
 {
 }
Exemple #7
0
 private static void checkToCloseWorkflowAdimStates(ActorApprovalType approvalType, WorkflowState to, SNAP_Workflow_State newState, DateTime dueDate)
 {
     if (approvalType == ActorApprovalType.Workflow_Admin)
     {
         if (to == WorkflowState.Closed_Cancelled || to == WorkflowState.Closed_Completed ||
             to == WorkflowState.Closed_Denied || to == WorkflowState.Closed_Abandon)
         {
             newState.completedDate = DateTime.Now;
             newState.dueDate = dueDate;
         }
     }
 }
Exemple #8
0
 private static void checkToCloseMangerOrTeamOrTechnicalWorkflowStates(ActorApprovalType approvalType, WorkflowState to, SNAP_Workflow_State newState, DateTime dueDate)
 {
     if (approvalType != ActorApprovalType.Workflow_Admin)
     {
         if (to == WorkflowState.Approved || to == WorkflowState.Closed_Denied)
         {
             newState.completedDate = DateTime.Now;
             newState.dueDate = dueDate;
         }
     }
 }
Exemple #9
0
        internal static void stateTransition(ActorApprovalType approvalType, SNAP_Workflow wf, WorkflowState from, WorkflowState to)
        {
            //
            // !!! if the state completion date is null, it is the WF current state !!!
            //

            // a brand new apporval WF has from not-active to not-active state and have not pref state yet,
            // such as when creating a new manager, team and techical approval workflow.
            // Rememeber that: the accessTeamWF has prev state because it being inserted by the
            // store procedure when inserting the request the first time
            var prevDueDate = DateTime.Now;
            SNAP_Workflow_State prevWFState=null;
            if (from != WorkflowState.Not_Active)
            {
                // complete current/prev state

                prevWFState = wf.SNAP_Workflow_States.Single(
                    s => s.workflowStatusEnum == (byte)from
                    && s.completedDate == null); // To prevent looping in old state, null date is the latest state

                if (prevWFState != null)
                {
                    prevWFState.completedDate = DateTime.Now;
                    prevDueDate = prevWFState.dueDate ?? DateTime.Now;
                }
            }

            // create new state
            var newState = new SNAP_Workflow_State()
            {
                completedDate = null,
                //notifyDate = DateTime.Now,
                dueDate = getDueDate(approvalType, from, to),
                workflowStatusEnum = (byte)to
            };

            // we don't need to notify workflow admin/access team. they have to monitor the open request constantly
            if (approvalType == ActorApprovalType.Workflow_Admin)
            {
                newState.notifyDate = DateTime.Now;
            }
            else if (from == WorkflowState.Not_Active && to == WorkflowState.Pending_Approval)
            {
                // approval wf from not-active -> pending approval, we alread send the email out
                newState.notifyDate = DateTime.Now;
            }

            if (prevWFState != null)
            {
                newState.notifyDate = prevWFState.notifyDate; // just propergate the notify date to new state...it is primarily for approval manager
            }

            // for end/close states set the completion date
            checkToCloseWorkflowAdimStates(approvalType, to, newState, prevDueDate);

            // workflowstate.approved is end state for manger, team approval and techical aproval but not for workflow adim
            checkToCloseMangerOrTeamOrTechnicalWorkflowStates(approvalType, to, newState, prevDueDate);

            // go to new state
            wf.SNAP_Workflow_States.Add(newState);
        }