WBSProjectSample

using System;  using TestFramework.ApplicationAPI; using TestFramework.AuthenticateAPI;
using TestFramework;  namespace Tests.wbs { 	/// <summary>
	/// Summary description for WBSProjectSample.
	/// 
	/// this sample loads or create a portfolio
	/// then creates a project, a proposal and a work organization
	/// and assigns them to the portfolio
	/// </summary>
	public class WBSProjectSample
	{
		public WBSProjectSample()
		{

		}

		// these are all variables that are used in this sample
		public static String projectExternalID = "external";
		public static String projectName = "IBM_GENERIC_PROJECT_ABC";
		public static String parentProjectExternalID = "parentExternalID";
		public static String chargeCodeName = "charge code name";
		public static String projectManagerID = "MANAGER_ID";
		public static String portName = "IBMPORTFOLIO_ABC";
		
		//Session ID is use for all transaction and is get from the 
		//Authenticate.login function. The session ID will replace 
		//the User password while transacting
		public static String sessionid;

		public void sampleTest() 
		{

			// initialize a session with the API
			sessionid = APISetup.SetUp();

			// create a save result object 
			SaveResult save = null;

			// create a portfolio scope
			// this scope enables us to work with a portfolio and 
			// any child object we wish to use
			PortfolioScope pScope = new PortfolioScope();

			// create a portfolio object that we will use to either 
			// create one or load one portfolio
			Portfolio parentProject = null;

			// adjust portfolio scope so it includes projects
			pScope.projects = new WorkElementScope();

			LoadResult loader = APISetup.application.
				loadFromXpath(sessionid, "/Portfolio", null);
			// query the portfolio
			LoadResult load = APISetup.application.loadFromXpath(
				sessionid, "/Portfolio[name='" + portName + "']", 
				pScope );

			//check if the portfolio exists
			if( load.rpmObjectList == null || 
				load.rpmObjectList.Length == 0 )
			{

				// create a portfolio
				parentProject = new Portfolio();
				parentProject.name = portName;

				// save the porfolio to the RPM repository
				// use a reload type thats enables you to continue 
				// using the object
				// a scope is not necessary here since we save a 
				// simple portfolio
				save = new SaveResult();
				save = APISetup.application.save(sessionid,
					parentProject, pScope,ReloadType.ReloadResult);
				APISetup.checkForErrors( save );

				// reload the portfolio
				// this way, an ID and contexte 
				// name as been given to it
				parentProject = (Portfolio)save.rpmObject;

			}
			else
			{

				// assign the existing portfolio to 
				// the portfolio object
				parentProject = (Portfolio)load.rpmObjectList[0];

			}
			
			// create a proposal
			Proposal proposal = createProposal(parentProject);

			// create a project
			Project project = createProject(parentProject);

			// create a work organization
			WorkOrganization organization = 
				createOrganization(parentProject);

			// assign the generic projects to the portfolio
			parentProject.projects = new GenericProject[] 
				{proposal, project, organization};

			// save the portfolio into the RPM repository
			// use a reload type thats enables you to continue 
			// using the object
			// a scope is necessary to keep the projects 
			// linked with the portfolio
			save = new SaveResult();
			save = APISetup.application.save(sessionid,parentProject,
				pScope,ReloadType.ReloadResult);
			APISetup.checkForErrors( save );

			// close connection with API
			APISetup.CleanUp(sessionid);
		}

		/** Proposal createProposal
		 * 
		 * simple fonction casting a Proposal into 
		 * createGenericProject fonction
		 */
		public Proposal createProposal(Portfolio parent)
		{


			Proposal proposal = 
				(Proposal)createGenericProject(new Proposal(), 
				parent);

			SaveResult save = new SaveResult();
			save = APISetup.application.save(sessionid, 
				proposal, null, ReloadType.ReloadResult);
			APISetup.checkForErrors( save );
			return (Proposal)save.rpmObject;

		}

		/** WorkOrganization createOrganization
		 * 
		 * simple fonction casting a WorkOrganization into 
		 * createGenericProject fonction
		 */
		public WorkOrganization createOrganization(Portfolio parent)
		{

			WorkOrganization org = 
				(WorkOrganization)createGenericProject(
				new WorkOrganization(), parent);

			SaveResult save = new SaveResult();
			save = APISetup.application.save(sessionid, 
				org, null, ReloadType.ReloadResult);
			APISetup.checkForErrors( save );
			return (WorkOrganization)save.rpmObject;
		}

		/** Project createProject
		 * 
		 * simple fonction casting a Project into 
		 * createGenericProject fonction
		 */
		public Project createProject(Portfolio parent)
		{

			Project project = (Project)createGenericProject(
				new Project(), parent);

			SaveResult save = new SaveResult();
			save = APISetup.application.save(sessionid, project, 
				null, ReloadType.ReloadResult);
			APISetup.checkForErrors( save );
			return (Project)save.rpmObject;
		}

		/** GenericProject createGenericProject
		 * 
		 * Fonction creating a generic project
		 * with basic information plus calendar and currency
		 */
		public GenericProject createGenericProject(GenericProject 
			projectToUpdate,  Portfolio parent)
		{

			// create a new project
			projectToUpdate.externalID = projectExternalID;
			projectToUpdate.name = projectName;
			projectToUpdate.portfolio = parent;

			TestFramework.ApplicationAPI.RPMCalendar projectCalendar=
				(TestFramework.ApplicationAPI.RPMCalendar)APISetup.
				application.loadFromXpath(sessionid, 
				"/RPMCalendar[name='Standard (Default)']", null ).
				rpmObjectList[0];

			projectToUpdate.calendar = projectCalendar;

			Currency projectCurrency = (Currency)APISetup.
				application.loadFromXpath(sessionid, 
				"/Currency[name='Canadian dollars']", 
				null ).rpmObjectList[0];

			projectToUpdate.currency = projectCurrency;
			projectToUpdate.estimatedStartDate = 
				new DateTime(2005, 10, 10, 10, 10, 10 );
			projectToUpdate.estimatedFinishDate = 
				new DateTime(2005, 11, 10, 10, 10, 10 );
			projectToUpdate.assignmentType = AssignmentType.Work;

			return projectToUpdate;
		}

	}
}