pse.CreateProjectFromTemplateService
global with sharing class CreateProjectFromTemplateService
A service used to clone one or more projects from templates. You can use this service in conjunction with SObjectCloneMapper, as the mappers on a clone request, to add extra fields to objects or extra objects that are copied from the template. You must include the fields describing the relationship between extra objects and the template project. Although the API can accept a list of requests, we recommend that you only process single requests. This is because projects are created synchronously, which means triggers, flows, workflow rules, and similar processing can cause SOQL limits to be reached, even with a small number of requests (up to a maximum of three to five requests in most cases). For example, to copy a new custom object with a Project lookup field to a cloned project, add a mapper to the request and add all the fields to copy from the custom object, including the lookup field.
Enums
SchedulingStrategy
CALCULATE_END_DATE_IGNORE_AVAILABILITY |
calculates the end date by ignoring availability. |
ADJUST_DAILY_HOURS |
calculates the hours per day using the start date, end date, and total hours. |
ZERO_HOUR_SCHEDULING |
creates a schedule with zero hours for each day. |
RETAIN_PREFERRED_SCHEDULE |
create a schedule by retaining previous schedule hours per day. |
NONE |
should not create any schedule. |
Methods
createProjectsFromTemplates
global static List<pse.CreateProjectFromTemplateService.CreateProjectResponse> createProjectsFromTemplates(List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest> requests)
This method creates new projects from a project template using details provided in the CreateProjectFromTemplateRequest list. The following configuration is used: • budget-name-suffix • default-budget-status • default-budget-type • default-is-active • default-time-credited • default-time-excluded • default-is-billable
Input Parameters
Return Value
This service returns CreateProjectResponses in a list that parallels the input list.
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | Date startDateForProject = Date.Today();
Id templateProjectId = Id.valueOf( 'a1Q1a0000006VJ4' );
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest(templateProjectId, startDateForProject);
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest PROJ_REQ2 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest(templateProjectId, startDateForProject);
PROJ_REQ1.strategiesMapper = new Map<Id,CreateProjectFromTemplateService.SchedulingStrategy>{Id.valueOf( 'a1q6s000000Mg2rAAC' )=>CreateProjectFromTemplateService.SchedulingStrategy.ADJUST_DAILY_HOURS};
List<pse.CreateProjectFromTemplateService.CreateProjectResponse> PROJ_RESPONSES =
pse.CreateProjectFromTemplateService.createProjectsFromTemplates(
new List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest>{PROJ_REQ1, PROJ_REQ2});
for (pse.CreateProjectFromTemplateService.CreateProjectResponse response : PROJ_RESPONSES)
{
if ( response.isSuccess() )
{
System.debug( 'Request for this response :' + response.request);
System.debug( 'New project Id for the successful cloned project :' + response.NewProjectId);
}
else
{
System.debug( 'Request for this response :' + response.Request);
System.debug( 'Errors related to unsuccessful request :' + response.Errors);
}
}
|
createProjectsFromTemplates
global static List<pse.CreateProjectFromTemplateService.CreateProjectResponse> createProjectsFromTemplates(List<pse.CreateProjectFromTemplateService.CreateProjectFromProjectRequest> requests)
This method creates new projects from a project template using details provided in the CreateProjectFromTemplateRequest list. The following configuration is used: • budget-name-suffix • default-budget-status • default-budget-type • default-is-active • default-time-credited • default-time-excluded • default-is-billable
Input Parameters
Return Value
This service returns CreateProjectResponses in a list that parallels the input list.
createProjectsFromTemplates
global static List<pse.CreateProjectFromTemplateService.CreateProjectResponse> createProjectsFromTemplates(List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest> requests)
This method creates new projects from a project template using details provided in the requests list. The project will be linked to the account ID passed in the CreateProjectFromTemplateAndAccountRequest. The following configuration is used: • budget-name-suffix • default-budget-status • default-budget-type • default-is-active • default-time-credited • default-time-excluded • default-is-billable
Input Parameters
Return Value
This service returns CreateProjectResponses in a list that parallels the input list.
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Date startDateForProject = Date.Today();
Id templateProjectId = Id.valueOf( 'a1Q000000000000' );
Id accountId = Id.valueOf( '001000000000000' );
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest ACC_PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest(accountId, templateProjectId, startDateForProject);
ACC_PROJ_REQ1.strategiesMapper = new Map<Id,CreateProjectFromTemplateService.SchedulingStrategy>{Id.valueOf( 'a1q6s000000Mg2rAAC' )=>CreateProjectFromTemplateService.SchedulingStrategy.ADJUST_DAILY_HOURS};
List<pse.CreateProjectFromTemplateService.CreateProjectResponse> ACC_PROJ_RESPONSES =
pse.CreateProjectFromTemplateService.createProjectsFromTemplates(
new List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest>{ACC_PROJ_REQ1});
for (pse.CreateProjectFromTemplateService.CreateProjectResponse response : ACC_PROJ_RESPONSES)
{
if ( response.isSuccess() )
{
System.debug( 'Request for this response :' + response.Request);
System.debug( 'New project Id for the successful cloned project :' + response.NewProjectId);
}
else
{
System.debug( 'Request for this response :' + response.Request);
System.debug( 'Errors related to unsuccessful request :' + response.Errors);
}
}
|
createProjectsFromTemplates
global static List<pse.CreateProjectFromTemplateService.CreateProjectResponse> createProjectsFromTemplates(List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest> requests)
This method creates new projects from a template project using details provided in the CreateProjectFromTemplateAndOpportunityRequest list. The project will be linked to the opportunity ID passed in the CreateProjectFromTemplateAndOpportunityRequest. The following configuration is used: • project-name-suffix • budget-name-suffix • default-budget-status • default-budget-type • default-is-active • default-time-credited • default-time-excluded • default-is-billable • create-project-with-no-opp-update-permission
Input Parameters
Return Value
This service returns CreateProjectResponses in a list that parallels the input list.
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | Date startDateForProject = Date.Today();
Id templateProjectId = Id.valueOf( 'a1Q1a0000006VJ4' );
Id opportunityId = Id.valueOf( '00637000005rwZq' );
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest OPP_PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest(opportunityId, templateProjectId, startDateForProject);
OPP_PROJ_REQ1.strategiesMapper = new Map<Id,CreateProjectFromTemplateService.SchedulingStrategy>{Id.valueOf( 'a1q6s000000Mg2rAAC' )=>CreateProjectFromTemplateService.SchedulingStrategy.ADJUST_DAILY_HOURS};
List<pse.CreateProjectFromTemplateService.CreateProjectResponse> OPP_PROJ_RESPONSES =
pse.CreateProjectFromTemplateService.createProjectsFromTemplates(
new List<pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest>{OPP_PROJ_REQ1});
for (pse.CreateProjectFromTemplateService.CreateProjectResponse response : OPP_PROJ_RESPONSES)
{
if ( response.isSuccess() )
{
System.debug( 'Request for this response :' + response.request);
System.debug( 'New project Id for the successful cloned project :' + response.NewProjectId);
}
else
{
System.debug( 'Request for this response :' + response.Request);
System.debug( 'Errors related to unsuccessful request :' + response.Errors);
}
}
|
pse.CreateProjectFromTemplateService.CreateProjectRequest
global with sharing abstract class CreateProjectRequest
The request structure for the CreateProjectFromTemplateService.
Properties
IsActive |
Boolean |
Indicates if the cloned project is active.
|
IsTemplate |
Boolean |
Indicates if the cloned project is marked as a template.
|
ProjectName |
String |
Indicates the name of the cloned project.
|
ProjectOwnerId |
Id |
The project owner ID.
|
StartDate |
Date |
The intended project start date. This is also used to calculate a date offset value to update other project and related object date fields. If the Work_Calendar__c field on Project_Task__c sObject has been included in either Project Task field set or passed as a Mapper on this request then Project Tasks will be adjusted into working time after the offset has applied. This will determine which days are working days according to the Work_Calendar__c on each Project Task.
|
TemplateProjectId |
Id |
The template project ID used as a template to create a new project. Any data described by the Mappers must have a relationship with this record (or a sequence of relationships that can be followed to the record) or that data is not copied.
|
Mappers |
List<pse.SObjectCloneMapper> |
The SObjectCloneMapper list defining which fields are copied for which SObjects when creating a new project from a template. This is in addition to the default objects and fields as well as the fields contained in the 'CreateProjFromTemp' field sets.
|
UseCurrentTimePeriod |
Boolean |
Set to true to ensure the cloned project is in the current time period.
|
CreateBudget |
Boolean |
Set to false if you do not want to create a budget.
|
strategiesMapper |
Map<Id, pse.CreateProjectFromTemplateService.SchedulingStrategy> |
A schedule is created using the same scheduling strategy for the cloned resource request as for the passed resource request id.
|
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest
global with sharing class CreateProjectFromTemplateRequest extends CreateProjectRequest
The request structure for creating projects from templates only. To be used with createProjectsFromTemplates.
Methods
CreateProjectFromTemplateRequest
global CreateProjectFromTemplateRequest(Id templateProjectId, Date startDate)
A default constructor with minimum required properties.
Input Parameters
templateProjectId |
Id |
The project template ID. |
startDate |
Date |
The intended project start date. |
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | pse.SObjectCloneMapper.Field mapperField1 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.Name);
mapperField1.DefaultValue = 'MapperProjectName' ;
pse.SObjectCloneMapper.Field mapperField2 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Active__c);
mapperField2.DefaultValue = true ;
pse.SObjectCloneMapper.Field mapperField3 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Billable__c);
mapperField3.DefaultValue = true ;
Set<pse.SObjectCloneMapper.Field> setMapperFields =
new Set<pse.SObjectCloneMapper.Field>{mapperField1, mapperField2, mapperField3};
pse.SObjectCloneMapper mapp = new pse.SObjectCloneMapper(pse__Proj__c.SObjectType, setMapperFields);
Id templateProjectId = Id.valueOf( 'a1Q000000000000' );
Date startDateForProject = Date.Today();
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest(templateProjectId, startDateForProject);
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest PROJ_REQ2 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateRequest(templateProjectId, startDateForProject);
PROJ_REQ1.IsActive = true ;
PROJ_REQ1.IsTemplate = false ;
PROJ_REQ1.ProjectName = 'ExampleProjectName' ;
PROJ_REQ1.ProjectOwnerId = Id.valueOf( '0051a000000aeDc' );
PROJ_REQ1.Mappers = new List<pse.SObjectCloneMapper> { mapp };
PROJ_REQ2.IsActive = true ;
PROJ_REQ2.IsTemplate = false ;
PROJ_REQ2.ProjectName = 'ExampleProjectNameSecond' ;
PROJ_REQ2.ProjectOwnerId = Id.valueOf( '0051a000000aeDc' );
PROJ_REQ2.Mappers = new List<pse.SObjectCloneMapper> { mapp };
|
pse.CreateProjectFromTemplateService.CreateProjectFromProjectRequest
global with sharing class CreateProjectFromProjectRequest extends CreateProjectRequest
The request structure for creating projects from any other project. To be used with createProjectsFromTemplates.
Methods
CreateProjectFromProjectRequest
global CreateProjectFromProjectRequest(Id templateProjectId, Date startDate)
A default constructor with minimum required properties.
Input Parameters
templateProjectId |
Id |
The project template ID. |
startDate |
Date |
The intended project start date. |
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest
global with sharing class CreateProjectFromTemplateAndAccountRequest extends CreateProjectRequest
The request structure for creating projects from templates with certain data coming from an account. To be used with createProjectsFromTemplatesAndAccounts.
Properties
AccountId |
Id |
The account ID.
|
Methods
CreateProjectFromTemplateAndAccountRequest
global CreateProjectFromTemplateAndAccountRequest(Id accountId, Id templateProjectId, Date startDate)
A default constructor with minimum required properties.
Input Parameters
accountId |
Id |
The account ID. |
templateProjectId |
Id |
The project template ID. |
startDate |
Date |
The intended project start date. |
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | pse.SObjectCloneMapper.Field mapperField1 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.Name);
mapperField1.DefaultValue = 'MapperProjectName' ;
pse.SObjectCloneMapper.Field mapperField2 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Active__c);
mapperField2.DefaultValue = true ;
pse.SObjectCloneMapper.Field mapperField3 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Billable__c);
mapperField3.DefaultValue = true ;
Set<pse.SObjectCloneMapper.Field> setMapperFields =
new Set<pse.SObjectCloneMapper.Field>{mapperField1, mapperField2, mapperField3};
pse.SObjectCloneMapper mapp = new pse.SObjectCloneMapper(pse__Proj__c.SObjectType, setMapperFields);
Account account = [Select Id from Account where Name = 'Customer1' ];
pse__Proj__c proj = [Select Id from pse__Proj__c where pse__Project_ID__c = 'PR-000038' ];
Id accountId = account.Id;
Id templateProjectId = proj.Id;
Date startDateForProject = Date.Today();
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest ACC_PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndAccountRequest(accountId, templateProjectId, startDateForProject);
ACC_PROJ_REQ1.IsActive = true ;
ACC_PROJ_REQ1.IsTemplate = false ;
ACC_PROJ_REQ1.ProjectName = 'ExampleProjectName' ;
ACC_PROJ_REQ1.ProjectOwnerId = Id.valueOf( '0051a000000aeDc' );
ACC_PROJ_REQ1.Mappers = new List<pse.SObjectCloneMapper> { mapp };
|
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest
global with sharing virtual class CreateProjectFromTemplateAndOpportunityRequest extends CreateProjectRequest
The request structure for creating projects from templates with certain data coming from an opportunity. To be used with createProjectsFromTemplatesAndOpportunities.
Properties
OpportunityId |
Id |
The Opportunity ID.
|
Methods
CreateProjectFromTemplateAndOpportunityRequest
global CreateProjectFromTemplateAndOpportunityRequest(Id opportunityId, Id templateProjectId, Date startDate)
A default constructor with minimum required properties.
Input Parameters
opportunityId |
Id |
The opportunity ID. |
templateProjectId |
Id |
The project template ID. |
startDate |
Date |
The intended project start date. |
Sample Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | pse.SObjectCloneMapper.Field mapperField1 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.Name);
mapperField1.DefaultValue = 'MapperProjectName' ;
pse.SObjectCloneMapper.Field mapperField2 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Active__c);
mapperField2.DefaultValue = true ;
pse.SObjectCloneMapper.Field mapperField3 =
new pse.SObjectCloneMapper.Field(Schema.pse__Proj__c.pse__Is_Billable__c);
mapperField3.DefaultValue = true ;
Set<pse.SObjectCloneMapper.Field> setMapperFields =
new Set<pse.SObjectCloneMapper.Field>{mapperField1, mapperField2, mapperField3};
pse.SObjectCloneMapper cloneMap = new pse.SObjectCloneMapper(pse__Proj__c.SObjectType, setMapperFields);
Opportunity useOpportunity = [Select Id from Opportunity where Name = 'Test_Clone_Opportunity' ];
pse__Proj__c proj = [Select Id from Proj__c where Project_ID__c = 'PR-000038' ];
Id opportunityId = useOpportunity.Id;
Id templateProjectId = proj.Id;
Date startDateForProject = Date.Today();
pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest OPP_PROJ_REQ1 =
new pse.CreateProjectFromTemplateService.CreateProjectFromTemplateAndOpportunityRequest(opportunityId, templateProjectId, startDateForProject);
OPP_PROJ_REQ1.IsActive = true ;
OPP_PROJ_REQ1.IsTemplate = false ;
OPP_PROJ_REQ1.ProjectName = 'ExampleProjectName' ;
OPP_PROJ_REQ1.ProjectOwnerId = Id.valueOf( '0051a000000aeDc' );
OPP_PROJ_REQ1.Mappers = new List<pse.SObjectCloneMapper> { cloneMap };
|
pse.CreateProjectFromTemplateService.CreateProjectFromProjectAndOpportunityRequest
global with sharing class CreateProjectFromProjectAndOpportunityRequest extends CreateProjectFromTemplateAndOpportunityRequest
The request structure for creating projects based on other projects and including data from an opportunity. To be used with createProjectsFromTemplates.
Methods
pse.CreateProjectFromTemplateService.CreateProjectResponse
global inherited sharing class CreateProjectResponse
The response structure returned for each request passed to createProjectsFromTemplates.
Properties
Request |
pse.CreateProjectFromTemplateService.CreateProjectRequest |
The request associated with the response of CreateProjectFromTemplateService.
|
NewProjectId |
Id |
The new project ID. This may be set even though isSuccess is false.
|
Errors |
List<pse.CreateProjectFromTemplateService.CreateProjectError> |
Stores error messages that occur when executing methods from CreateProjectFromTemplateService.
|
QueuedJobId |
Id |
The CreateProjectFromTemplateService may spawn a Queueable to complete the work in a later transaction. When this occurs, this is the ID of the AsyncApexJob controlling the work. The record can be queried to monitor its status. When multiple requests are processed, only the QueuedJobId of the first response is set.
|
Methods
isSuccess
global Boolean isSuccess()
Indicates whether the project was successfully created. Even if isSuccess() is false, it is possible that the project was still created. That can happen, for example, when the there was a problem creating a budget to link to the new project.
pse.CreateProjectFromTemplateService.CreateProjectError
global with sharing class CreateProjectError
Stores error messages that occur when executing methods from CreateProjectFromTemplateService.
Properties
Message |
String |
The error message.
|
RecordId |
Id |
The Id of the record that the error message is associated with. It is optional
|
|