Exemplo n.º 1
0
 private void verifyWorkflowStateComplete(SNAP_Workflow wf, WorkflowState state)
 {
     Assert.IsTrue(wf.SNAP_Workflow_States.Single(s => s.workflowStatusEnum == (byte)state).completedDate != null);
 }
Exemplo n.º 2
0
 private void verifyWorkflowTransition(SNAP_Workflow wf, WorkflowState fr, WorkflowState to)
 {
     verifyWorkflowStateComplete(wf, fr);
     verifyWorkflowState(wf, to);
 }
Exemplo n.º 3
0
 private void verifyWorkflowComment(SNAP_Workflow wf, CommentsType type)
 {
     Assert.IsTrue(wf.SNAP_Workflow_Comments.Count(c => c.commentTypeEnum == (byte)type) == 1);
 }
Exemplo n.º 4
0
 private void verifyWorkflowState(SNAP_Workflow wf, WorkflowState state)
 {
     Assert.IsTrue(wf.SNAP_Workflow_States.Count(
                       s => s.workflowStatusEnum == (byte) state) == 1);
 }
Exemplo n.º 5
0
 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);
 }
Exemplo n.º 6
0
        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;
        }
Exemplo n.º 7
0
        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"); ;
        }
Exemplo n.º 8
0
        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;
                    }

                }
            }
        }
Exemplo n.º 9
0
 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
     });
 }
Exemplo n.º 10
0
        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");
        }
Exemplo n.º 11
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);
        }
Exemplo n.º 12
0
        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];
        }
Exemplo n.º 13
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;
        }
Exemplo n.º 14
0
 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;
 }
Exemplo n.º 15
0
        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);
                //}
            }
        }