private void verifyWorkflowStateComplete(SNAP_Workflow wf, WorkflowState state) { Assert.IsTrue(wf.SNAP_Workflow_States.Single(s => s.workflowStatusEnum == (byte)state).completedDate != null); }
private void verifyWorkflowTransition(SNAP_Workflow wf, WorkflowState fr, WorkflowState to) { verifyWorkflowStateComplete(wf, fr); verifyWorkflowState(wf, to); }
private void verifyWorkflowComment(SNAP_Workflow wf, CommentsType type) { Assert.IsTrue(wf.SNAP_Workflow_Comments.Count(c => c.commentTypeEnum == (byte)type) == 1); }
private void verifyWorkflowState(SNAP_Workflow wf, WorkflowState state) { Assert.IsTrue(wf.SNAP_Workflow_States.Count( s => s.workflowStatusEnum == (byte) state) == 1); }
private void deleteActorWorkflow(SNAPDatabaseDataContext db, SNAP_Workflow wf) { db.SNAP_Workflow_States.DeleteAllOnSubmit(wf.SNAP_Workflow_States); db.SNAP_Workflows.DeleteOnSubmit(wf); db.SNAP_Workflow_Comments.DeleteAllOnSubmit(wf.SNAP_Workflow_Comments); }
private List<int> editApprovalWorkFlow(SNAPDatabaseDataContext db, List<int> actorIds) { /* var newAddedActorIds = new List<int>(); var req = db.SNAP_Requests.Single(x => x.pkId == _id); var toDeleteActorList = getToDeletedActorList(req, actorIds); deletedActors = toDeleteActorList; // we need to remove old approvers who are not in the new list if (req.SNAP_Workflows.Count > 1) { foreach (var i in toDeleteActorList) { var wf = req.SNAP_Workflows.Single(w => w.actorId == i); // only remove pending approval and not active wf if ((wf.SNAP_Workflow_States.Where(s => s.completedDate == null && s.notifyDate != null && (s.workflowStatusEnum == (byte)WorkflowState.Pending_Approval)).Count() == 1) || (wf.SNAP_Workflow_States.Where(s => s.completedDate == null && s.notifyDate == null && s.workflowStatusEnum == (byte)WorkflowState.Not_Active).Count() == 1) ) { deleteActorWorkflow(db, wf); } } } foreach (var actId in actorIds) { SNAP_Workflow wf; if (req.SNAP_Workflows.Count(w => w.actorId == actId) == 0) // { newAddedActorIds.Add(actId); wf = new SNAP_Workflow() { actorId = actId }; req.SNAP_Workflows.Add(wf); var actor = db.SNAP_Actors.Single(a => a.pkId == actId); var agt = actor.SNAP_Actor_Group.actorGroupType ?? 3; // default to accessteam if null ActorApprovalType t = (ActorApprovalType)agt; stateTransition(t, wf, WorkflowState.Not_Active, WorkflowState.Not_Active); } } return newAddedActorIds; */ addedActors.Clear(); deletedActors.Clear(); //var newAddedActorIds = new List<int>(); var req = db.SNAP_Requests.Single(x => x.pkId == _id); //var toDeleteActorList = getToDeletedActorList(req, actorIds); deletedActors = getToDeletedActorList(req, actorIds); ; // we need to remove old approvers who are not in the new list if (req.SNAP_Workflows.Count > 1) { foreach (var i in deletedActors) { var wf = req.SNAP_Workflows.Single(w => w.actorId == i); // only remove pending approval and not active wf if ((wf.SNAP_Workflow_States.Where(s => s.completedDate == null && s.notifyDate != null && (s.workflowStatusEnum == (byte)WorkflowState.Pending_Approval)).Count() == 1) || (wf.SNAP_Workflow_States.Where(s => s.completedDate == null && s.notifyDate == null && s.workflowStatusEnum == (byte)WorkflowState.Not_Active).Count() == 1) ) { deleteActorWorkflow(db,wf); } } } foreach (var actId in actorIds) { SNAP_Workflow wf; if (req.SNAP_Workflows.Count(w => w.actorId == actId) == 0) // { addedActors.Add(actId); wf = new SNAP_Workflow() { actorId = actId }; req.SNAP_Workflows.Add(wf); var actor = db.SNAP_Actors.Single(a => a.pkId == actId); var agt = actor.SNAP_Actor_Group.actorGroupType ?? 3; // default to accessteam if null ActorApprovalType t = (ActorApprovalType)agt; stateTransition(t, wf, WorkflowState.Not_Active, WorkflowState.Not_Active); } } return addedActors; }
private WebMethodResponse createHPSMTicket(SNAPDatabaseDataContext db, SNAP_Workflow accessTeamWF, DateTime? dueDate, SNAP_Request req) { string updatedDescription = string.Format("Supplemental Access Process Request Id: {0}\r\nAffected End User Id: {1}\r\nRequested By: {2}\r\n-------------------------------------------------------\r\n{3}" , req.pkId, req.userId, req.submittedBy, requestDescription); Quote q = new Quote(); q.Category = "apollo request"; q.Subcategory = "Employee Management Support Service"; q.Priority = "4 - R3 Regular"; q.RequestedEndDate = dueDate ?? DateTime.Now.AddDays(1); q.CurrentPhase = "Working"; q.ServiceContact = Regex.Replace(req.userId, @"^a\.", ""); q.PrimaryContact = Regex.Replace(req.submittedBy, @"^a\.", ""); q.Description = new List<string>() {updatedDescription}; q.PartNumber = "ag1144"; //Server Privileged Access - Add, modify, or remove q.ItemCount = "1"; q.ItemQuantity = "1"; q.SaveTicket(); // uncomment this line to do end-end test req.ticketNumber = q.RequestID; var hpsmlink = ConfigurationManager.AppSettings["HPSMLink"]; addAccessTeamComment( accessTeamWF , string.Format("Due Date: {0} | Service Desk Ticket: <a target=\"_blank\" href=\"{2}\">{1}</a>" , Convert.ToDateTime(dueDate).ToString("MMM d, yyyy") , req.ticketNumber , hpsmlink) , CommentsType.Ticket_Created); db.SubmitChanges(); return new WebMethodResponse(true, "Ticket Creation", "Success"); ; }
private void createrApprovalWorkFlow(SNAPDatabaseDataContext db, List<int> actorIds) { var req = db.SNAP_Requests.Single(x => x.pkId == _id); var toDeleteActorList = getToDeletedActorList(req,actorIds).ToList(); // we need to remove old approvers who are not in the new list if (req.SNAP_Workflows.Count > 1) { foreach (var i in toDeleteActorList) { var wf = req.SNAP_Workflows.Single(w => w.actorId == i); deleteActorWorkflow(db, wf); } } foreach (var actId in actorIds) { SNAP_Workflow wf; if (req.SNAP_Workflows.Count(w => w.actorId == actId) == 0) // { wf = new SNAP_Workflow() { actorId = actId }; req.SNAP_Workflows.Add(wf); } else // wf already exists due to change request(all prev wf are completed) or access team just needs to update the wf component { wf = req.SNAP_Workflows.Single(w => w.actorId == actId); } var actor = db.SNAP_Actors.Single(a => a.pkId == actId); var agt = actor.SNAP_Actor_Group.actorGroupType ?? 3; // default to accessteam if null ActorApprovalType t = (ActorApprovalType) agt; stateTransition(t, wf, WorkflowState.Not_Active, WorkflowState.Not_Active); // check to make sure we can update manager in the req table if (t == ActorApprovalType.Manager) { if (req.managerUserId != actor.userId) { req.managerUserId = actor.userId; req.managerDisplayName = actor.displayName; } } } }
private void addAccessTeamComment(SNAP_Workflow accessTeamWF, string comment, CommentsType type) { //comment = comment.Replace("<br />", string.Empty); accessTeamWF.SNAP_Workflow_Comments.Add(new SNAP_Workflow_Comment() { commentText = comment, commentTypeEnum = (byte)type, createdDate = DateTime.Now }); }
private WebMethodResponse createCASDTicket(SNAPDatabaseDataContext db, SNAP_Workflow accessTeamWF, DateTime? dueDate, SNAP_Request req) { var changeRequest = new ServiceDesk.ChangeRequest(Apollo.ServiceDesk.SDConfig.Instance.Login, Apollo.ServiceDesk.SDConfig.Instance.Password); string updatedDescription = string.Format("Supplemental Access Process Request Id: {0}\r\nAffected End User Id: {1}\r\nRequested By: {2}\r\n-------------------------------------------------------\r\n{3}" , req.pkId, req.userId, req.submittedBy, requestDescription); if (requestDescription.Length > 5000) { return new WebMethodResponse(false, "Ticket Creation Error", "Request Content Too Long. Please split the request"); } changeRequest.CategoryName = "Server.Systems.Privileged Access"; changeRequest.Submitter.Get("svc_Cap"); changeRequest.AffectedUser.Get(Regex.Replace(req.userId, @"^a\.", "")); // remove a. acct changeRequest.Attributes["description"] = updatedDescription; changeRequest.Create(); req.ticketNumber = changeRequest.Number; var handler = changeRequest.Handle.Split(':')[1]; // chg:12345 var sdlink = ConfigurationManager.AppSettings["SDLink"] + handler; addAccessTeamComment( accessTeamWF , string.Format("Due Date: {0} | Service Desk Ticket: <a target=\"_blank\" href=\"{2}\">{1}</a>" , Convert.ToDateTime(dueDate).ToString("MMM d, yyyy") , req.ticketNumber , sdlink) , CommentsType.Ticket_Created); db.SubmitChanges(); return new WebMethodResponse(true, "Ticket Creation", "Success"); }
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); }
protected ApprovalWorkflow(int id) { Id = id; db = new SNAPDatabaseDataContext(); wf = db.SNAP_Workflows.Single(w => w.pkId == Id); req = wf.SNAP_Request; accessReq = new AccessRequest(req.pkId); accessTeamWF = accessReq.FindApprovalTypeWF(db, (byte)ActorApprovalType.Workflow_Admin)[0]; }
private bool reqStateTransition(SNAP_Request req, RequestState reqFr, RequestState reqTo, SNAP_Workflow accessTeamWF, WorkflowState wfFr, WorkflowState wfTo) { var result = false; if (req.statusEnum == (byte)reqFr) { var accessTeamWFState = accessTeamWF.SNAP_Workflow_States.Single(s => s.completedDate == null); if (accessTeamWFState.workflowStatusEnum == (byte)wfFr) { stateTransition(ActorApprovalType.Workflow_Admin, accessTeamWF,wfFr,wfTo); if (reqFr != reqTo) { req.statusEnum = (byte) reqTo; req.lastModifiedDate = DateTime.Now; } result = true; } } return result; }
private void initializeData(SNAPDatabaseDataContext db, WorkflowState state, out SNAP_Request req, out SNAP_Workflow accessTeamWF, out DateTime? dueDate) { req = db.SNAP_Requests.Single(r => r.pkId == _id); accessTeamWF = req.SNAP_Workflows.Single(x => x.actorId == AccessTeamActorId); dueDate = accessTeamWF.SNAP_Workflow_States.Single( s => s.completedDate == null && s.workflowStatusEnum == (byte)state).dueDate; }
private void InformNewPendingApproverNewDueDate(SNAP_Workflow wf, int currentPendingApproverType) { if (wf.SNAP_Actor.SNAP_Actor_Group.actorGroupType == currentPendingApproverType) { /* var state = wf.SNAP_Workflow_States.Where( s => s.completedDate == null && s.notifyDate == null).ToList(); if ((state.Count() == 1) && state[0].workflowStatusEnum == (byte) WorkflowState.Not_Active) { */ // there should be only one state since we just added it wf.SNAP_Workflow_States[0].notifyDate = DateTime.Now; wf.SNAP_Workflow_States[0].completedDate = DateTime.Now; Email.SendTaskEmail(EmailTaskType.AssignToApprover, wf.SNAP_Actor.emailAddress, wf.SNAP_Actor.displayName, _id, wf.SNAP_Request.userDisplayName); stateTransition((ActorApprovalType) wf.SNAP_Actor.SNAP_Actor_Group.actorGroupType, wf,WorkflowState.Not_Active, WorkflowState.Pending_Approval); //} } }