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; }
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); }
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; }
public ReminderTask(SNAP_Workflow_State state) { wfState = state; }
public ChangeRequestedReminderTask(SNAP_Workflow_State st) : base(st) { }
public ApproverReminderTask(SNAP_Workflow_State st) : base(st) { }
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; } } }
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; } } }
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); }