Wednesday, July 10, 2013

Project Server - Change Enterprise Project Type with PSI

Changing Enterprise Project Type of a project in Project Server using PSI is basically the same as restarting workflow. It is actually restart of your workflow to the beginning with another Enterprise Project Type.

Post on subject restarting your workflow is here, and description of FluentPS can be found here.

First, let's see how do you change Enterprise Project Type of a project in Project Server, manually:

1. When you open one of your project, in SharePoint Ribbon you will see "Options" button and its submenu "Change Project Type". By clicking this option, you can change the existing Project Type to another one (you can select from a list of a defined Project Types). This option will always restart workflow to the first stage, to the beginning. 


If you need to do this automatically, this is the code:


public void ChangeEPT(Guid projectUID, string stageName, string eptName)
      var logService = new LogService();

      var sessionService = new PSSessionService()
           HostName = "serverName", // your PWA host name
           SiteName = "pwa" // your PWA site name
      PsiContextService psiContextService = new PsiContextService();
      PSISvcsFactory psiSvcsFactory = new PSISvcsFactory(sessionService, psiContextService);

      Project svcProject = psiSvcsFactory.CreateSvcClient<Project>();
      Workflow svcWf = psiSvcsFactory.CreateSvcClient<Workflow>();
      SPSPagesService svcPage = new SPSPagesService(sessionService);
      SPSharepointService svcSP = new SPSharepointService(sessionService, svcPage, logService);
      PSWorkflowService svcPSWf= new PSWorkflowService(logService, svcWf, svcSP);
      WorkflowDataSet workflowDS = svcWf.ReadAvailableEnterpriseProjectTypes();
      List<PSWorkflowStatus> wfStatus = svcPSWf.GetProjectWorkflowStatus(projectUID);
      //Enteprise project template UID
      Guid _eptUID = new Guid();//
      //Stage UID
      Guid _stageGuid = new Guid();

      //stageName - must be the first stage of your workflow
      //I haven't tried it with another stage, but it works if it is the first stage name
      for (int i = 0; i < wfStatus.Count; i++)
           if (wfStatus[i].StageName == stageName)
                _stageGuid = wfStatus[i].StageUid;
      //getting the enterprise project type GUID
      //here we change our Project Type with another one - its name is the parameter
      //you don't have to do this if you already know the guid of your EPT, you can 
      //just assign your guid to _eptUID variable  
      for (int i = 0; i < workflowDS.EnterpriseProjectType.Count; i++)
          if (workflowDS.EnterpriseProjectType[i].ENTERPRISE_PROJECT_TYPE_NAME == eptName)
                _eptUID = workflowDS.EnterpriseProjectType[i].ENTERPRISE_PROJECT_TYPE_UID;
           //RESTART and EPT CHANGE
      //_eptUID is the uid of our new EPT
      Guid _restartGuid = svcPSWf.SubmitStage(projectUID, _eptUID, false, _stageGuid);


  1. can you give the complete code ? i need to know what web service reference needed.
    I plan to change the ept when user published from ms project using event handler depend on look up project type selected.

  2. This is complete code. You just need to add FluentPS library to use it. This is a post where I describe use of FluentPS:

  3. How Do I EPT using CSOM . Please update ?

    1. I don't know how it can be done with CSOM (or is it even possible). Sorry

  4. Very nice Mario. This could be very useful in Powershell as a bulk edit operation.