Professional Services Automation Apex API Developer Reference

pse.ResourceAssignmentService

global with sharing class ResourceAssignmentService

Contains methods and structures to hold, unhold, and assign resources against resource requests.

Enums

SchedulingStrategy

Value Description
CALCULATE_END_DATE_LEVEL_SCHEDULE Calculates end date respecting availability.
CALCULATE_END_DATE_IGNORE_AVAILABILITY Calculates end date ignoring availability.
ADJUST_DAILY_HOURS Adjusts per day hours based on start date, end date, and total hours.
CALCULATE_END_DATE_CUSTOM_SCHEDULING Use pattern to set hours on each day of week.
PERCENT_ALLOCATION Allocates hours based on the percentage.
ZERO_HOUR_SCHEDULING Creates schedule with zero hours for each day.

RepeatModes

Defines the period for which the schedule pattern will be repeated. Like WEEKS or MONTHS.

Value Description
WEEKS The schedule pattern will be repeated using week as the period.

ResponseStatus

Defines the status of the response returned.

Value Description
SUCCESS status of the response when the request is successful.
PARTIAL_SUCCESS The status of the response when the request is partially successful.
FAILURE The status of the response when the request fails.

Methods

holdResourceRequests

global static List<pse.ResourceAssignmentService.ResourceAssignmentResponse> holdResourceRequests(List<pse.ResourceAssignmentService.ResourceAssignmentRequest> resourceAssignRequests)

Enables you to hold the resources on a resource request. You must have the Resource Request Entry permission control assigned to hold resources.

Input Parameters

Name Type Description
resourceAssignRequests List<pse.ResourceAssignmentService.ResourceAssignmentRequest> List of ResourceAssignmentRequest.

Return Value

List<pse.ResourceAssignmentService.ResourceAssignmentResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Holding a resource on a resource request with resource availability.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c, pse__Start_Date__c FROM pse__Resource_Request__c WHERE Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = resReq.pse__Start_Date__c;
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.holdResourceRequests(requestList);


/*
    ***************************************************************************************************************************
    Example 2: Holding a resource on a resource request with custom start date and level schedule strategy.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c FROM pse__Resource_Request__c WHERE Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.holdResourceRequests(requestList);


/*
    ***************************************************************************************************************************
    Example 3: Holding a resource on a resource request with custom hours on week days.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 4);
customHours.put('sun', 0);

pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c FROM pse__Resource_Request__c WHERE Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.EndDate = Date.newInstance(2023, 02, 04);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.holdResourceRequests(requestList);

/*
    ***************************************************************************************************************************
    Example 4: Holding a resource on a resource request with custom hours on week days and repeat schedule pattern for specified frequency by weeks.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 0);
customHours.put('sun', 0);

pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c FROM pse__Resource_Request__c WHERE Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = Date.newInstance(2024, 10, 01);
resAssignRequest.EndDate = Date.newInstance(2024, 10, 31);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;
resAssignRequest.Frequency = 2;
resAssignRequest.Mode = ResourceAssignmentService.RepeatModes.WEEKS;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.holdResourceRequests(requestList);

/*
    ***************************************************************************************************************************
    Example 4: Holding a resource on a resource request with strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    * UseDefaultStrategy flag is used to get scheduling strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c FROM pse__Resource_Request__c WHERE Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.UseDefaultStrategy = true;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.holdResourceRequests(requestList);

assignResourceRequests

global static List<pse.ResourceAssignmentService.ResourceAssignmentResponse> assignResourceRequests(List<pse.ResourceAssignmentService.ResourceAssignmentRequest> resourceAssignRequests)

This services enables you to create Assignment with the requested resource on the Resource Request. You must have the Resource Request Entry and Staffing permission control assigned to create assignments. If scheduling strategy is not defined and the UseDefaultStrategy field is selected, then scheduling strategy is retrieved from the Default Scheduling Strategy field of the Assignment Settings custom setting. If Default Scheduling Strategy field is blank, then the 'Calculate End Date, Level Schedule' strategy will be used.

Input Parameters

Name Type Description
resourceAssignRequests List<pse.ResourceAssignmentService.ResourceAssignmentRequest> List of ResourceAssignmentRequest.

Return Value

List<pse.ResourceAssignmentService.ResourceAssignmentResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Create an Assignment from a Resource Request, respecting the resource's availability.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Staffer_Resource__c, pse__Start_Date__c FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Staffer_Resource__c;
resAssignRequest.StartDate = resReq.pse__Start_Date__c;
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.assignResourceRequests(requestList);


/*
    ***************************************************************************************************************************
    Example 2: Create an Assignment from a Resource Request with custom start date and level schedule strategy.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Staffer_Resource__c FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Staffer_Resource__c;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.assignResourceRequests(requestList);


/*
    ***************************************************************************************************************************
    Example 3: Create an Assignment from a Resource Request with custom hours on week days.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 4);
customHours.put('sun', 0);

pse__Resource_Request__c resReq = [SELECT Id, pse__Staffer_Resource__c FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Staffer_Resource__c;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.EndDate = Date.newInstance(2023, 02, 04);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.assignResourceRequests(requestList);

/*
    ***************************************************************************************************************************
    Example 4: Create an assignment from a resource request with strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    * UseDefaultStrategy flag is used to get scheduling strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    ***************************************************************************************************************************
/*

pse__Resource_Request__c resReq = [SELECT Id, pse__Staffer_Resource__c, pse__Start_Date__c FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Staffer_Resource__c;
resAssignRequest.StartDate = resReq.pse__Start_Date__c;
resAssignRequest.UseDefaultStrategy = true;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.assignResourceRequests(requestList);

/*
    ***************************************************************************************************************************
    Example 5: Create an Assignment from a Resource Request with custom hours on week days and repeat schedule pattern for specified frequency by weeks.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 0);
customHours.put('sun', 0);

pse__Resource_Request__c resReq = [SELECT Id, pse__Staffer_Resource__c FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND Id = 'a1nDS000001j8fnYAA'];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Staffer_Resource__c;
resAssignRequest.StartDate = Date.newInstance(2024, 10, 01);
resAssignRequest.EndDate = Date.newInstance(2024, 10, 31);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;
resAssignRequest.Frequency = 2;
resAssignRequest.Mode = ResourceAssignmentService.RepeatModes.WEEKS;

List<pse.ResourceAssignmentService.ResourceAssignmentRequest> requestList = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};

List<pse.ResourceAssignmentService.ResourceAssignmentResponse> responseList = pse.ResourceAssignmentService.assignResourceRequests(requestList);

assignResourceRequestsAsync

global static void assignResourceRequestsAsync(pse.ResourceAssignmentService.ResourceAssignmentRequestDetail resourceAssignmentRequestDetail)

This services enables you to create Assignment asyncronously with the requested resource on the Resource Request. You must have the Resource Request Entry and Staffing permission control assigned to create assignments. If scheduling strategy is not defined and the UseDefaultStrategy field is selected, then scheduling strategy is retrieved from the Default Scheduling Strategy field of the Assignment Settings custom setting. If Default Scheduling Strategy field is blank, then the 'Calculate End Date, Level Schedule' strategy will be used.

Input Parameters

Name Type Description
resourceAssignmentRequestDetail pse.ResourceAssignmentService.ResourceAssignmentRequestDetail Details of ResourceAssignmentRequest.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Create an Assignment from a Resource Request, respecting the resource's availability.
    ***************************************************************************************************************************
/*
Id heldResourceRequestId = 'a1nDS000001j8fnYAA';
pse__Resource_Request__c resReq = [SELECT Id, pse__Resource__c, pse__Start_Date__c FROM pse__Resource_Request__c WHERE Id = :heldResourceRequestId];
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resReq.Id;
resAssignRequest.ResourceId = resReq.pse__Resource__c;
resAssignRequest.StartDate = resReq.pse__Start_Date__c;
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.assignResourceRequestsAsync(req);


/*
    ***************************************************************************************************************************
    Example 2: Create an Assignment from a Resource Request with custom start date and level schedule strategy.
    ***************************************************************************************************************************
/*
Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.assignResourceRequestsAsync(req);

/*
    ***************************************************************************************************************************
    Example 3: Create an Assignment from a Resource Request with custom hours on week days.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 4);
customHours.put('sun', 0);

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.EndDate = Date.newInstance(2023, 02, 04);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.assignResourceRequestsAsync(req);

/*
    ***************************************************************************************************************************
    Example 4: Create an assignment from a resource request with strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    * UseDefaultStrategy flag is used to get scheduling strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    ***************************************************************************************************************************
/*
Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.UseDefaultStrategy = true;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.assignResourceRequestsAsync(req);

/*
    ***************************************************************************************************************************
    Example 5: Create an Assignment from a Resource Request with custom hours on week days and repeat schedule pattern for specified frequency by weeks.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 0);
customHours.put('sun', 0);

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2024, 10, 01);
resAssignRequest.EndDate = Date.newInstance(2024, 10, 31);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;
resAssignRequest.Frequency = 2;
resAssignRequest.Mode = ResourceAssignmentService.RepeatModes.WEEKS;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.assignResourceRequestsAsync(req);

holdResourceRequestsAsync

global static void holdResourceRequestsAsync(pse.ResourceAssignmentService.ResourceAssignmentRequestDetail resourceAssignmentRequestDetail)

This service enables you to hold resources on the resource requests asynchronously. You must assign the Resource Request Entry permission control to hold resources.

Input Parameters

Name Type Description
resourceAssignmentRequestDetail pse.ResourceAssignmentService.ResourceAssignmentRequestDetail Details of ResourceAssignmentRequest.

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Holding a resource on a resource request with resource availability.
    ***************************************************************************************************************************
/*
Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.holdResourceRequestsAsync(req);


/*
    ***************************************************************************************************************************
    Example 2: Holding a resource on a resource request with custom start date and level schedule strategy.
    ***************************************************************************************************************************
/*

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_LEVEL_SCHEDULE;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.holdResourceRequestsAsync(req);


/*
    ***************************************************************************************************************************
    Example 3: Holding a resource on a resource request with custom hours on week days.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 4);
customHours.put('sun', 0);

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.EndDate = Date.newInstance(2023, 02, 04);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.holdResourceRequestsAsync(req);

/*
    ***************************************************************************************************************************
    Example 4: Holding a resource on a resource request with custom hours on week days and repeat schedule pattern for specified frequency by weeks.
    ***************************************************************************************************************************
/*
Map<String, Decimal> customHours = new Map<String, Decimal>();
customHours.put('mon', 8);
customHours.put('tue', 8);
customHours.put('wed', 8);
customHours.put('thu', 8);
customHours.put('fri', 8);
customHours.put('sat', 0);
customHours.put('sun', 0);

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2024, 10, 01);
resAssignRequest.EndDate = Date.newInstance(2024, 10, 31);
resAssignRequest.Strategy = pse.ResourceAssignmentService.SchedulingStrategy.CALCULATE_END_DATE_CUSTOM_SCHEDULING;
resAssignRequest.CustomHours = customHours;
resAssignRequest.Frequency = 2;
resAssignRequest.Mode = ResourceAssignmentService.RepeatModes.WEEKS;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.holdResourceRequestsAsync(req);

/*
    ***************************************************************************************************************************
    Example 4: Holding a resource on a resource request with strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    * UseDefaultStrategy flag is used to get scheduling strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
    ***************************************************************************************************************************
/*

Id resourceRequestId = 'a1nDS000001j8fnYAA';
Id resourceId = 'a1nDS000001d4fnYAA';
pse.ResourceAssignmentService.ResourceAssignmentRequest resAssignRequest = new pse.ResourceAssignmentService.ResourceAssignmentRequest();
resAssignRequest.ResourceRequestId = resourceRequestId;
resAssignRequest.ResourceId = resourceId;
resAssignRequest.StartDate = Date.newInstance(2023, 01, 29);
resAssignRequest.UseDefaultStrategy = true;

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail req = new pse.ResourceAssignmentService.ResourceAssignmentRequestDetail();
req.ResourceAssignmentRequests = new List<pse.ResourceAssignmentService.ResourceAssignmentRequest>{resAssignRequest};
req.SendErrorEmail = true;

pse.ResourceAssignmentService.holdResourceRequestsAsync(req);

unholdResourceRequests

global static List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse> unholdResourceRequests(List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> resourceUnholdRequests)

Enables you to update the provided resource requests to unhold by updating the fields of the resource request. You must have the Resource Request Entry permission control assigned to hold resources. If an error occurs while processing any resource request, updates to other resource requests are rolled back and an error is returned.

Input Parameters

Name Type Description
resourceUnholdRequests List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> List of request wrappers containing a Resource Request ID which should have resource and schedule linked and Status to be updated after unhold.

Return Value

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
 * Unholding resources on resource requests.
/*
List<pse__Resource_Request__c> heldResourceRequests = [SELECT Id FROM pse__Resource_Request__c WHERE pse__Resource_Held__c = true AND pse__Project__c = 'a1o6s000000uu0SAAQ' LIMIT 2];

pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest resourceUnholdRequest1 = new pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest();
resourceUnholdRequest1.ResourceRequestId = heldResourceRequests[0].Id;
resourceUnholdRequest1.Status = 'Ready to Staff';

pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest resourceUnholdRequest2 = new pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest();
resourceUnholdRequest2.ResourceRequestId = heldResourceRequests[1].Id;
resourceUnholdRequest2.Status = 'Draft';

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> resourceUnholdRequests = new List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest>{resourceUnholdRequest1, resourceUnholdRequest2};

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse> resourceUnholdResponses = pse.ResourceAssignmentService.unholdResourceRequests(resourceUnholdRequests);
Id unheldResourceRequestId1 = resourceUnholdResponses[0].ResourceRequestId;
Id unheldResourceRequestId2 = resourceUnholdResponses[1].ResourceRequestId;

unassignResourceRequests

global static List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse> unassignResourceRequests(List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> resourceUnassignRequests)

Updates the provided resource requests to unassign by updating the fields of the resource request. If an error occurs when unassigning any resource request, the process is rolled back and an error is returned.

Input Parameters

Name Type Description
resourceUnassignRequests List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> List of request wrapper containing a Resource Request ID. The ID should be linked to assignments and schedules, and the status should be updated after unassigning.

Return Value

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
 * Unassigning resources on resource requests.
/*

List<pse__Resource_Request__c> assignedResourceRequests = [SELECT Id FROM pse__Resource_Request__c WHERE pse__Assignment__c != NULL AND pse__Project__c = 'a1o6s000000uu0SAAQ' LIMIT 2];
pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest resourceUnassignRequest1 = new pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest();
resourceUnassignRequest1.ResourceRequestId = assignedResourceRequests[0].Id;
resourceUnassignRequest1.Status = 'Ready to Staff';

pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest resourceUnassignRequest2 = new pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest();
resourceUnassignRequest2.ResourceRequestId = assignedResourceRequests[1].Id;
resourceUnassignRequest2.Status = 'Draft';

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest> resourceUnassignRequests = new List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest>{resourceUnassignRequest1, resourceUnassignRequest2};

List<pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse> resourceUnassignResponses = pse.ResourceAssignmentService.unassignResourceRequests(resourceUnassignRequests);
Id unassignResourceRequestId1 = resourceUnassignResponses[0].ResourceRequestId;
Id unassignResourceRequestId2 = resourceUnassignResponses[1].ResourceRequestId;

splitAssignmentToResourceRequest

global static pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponse splitAssignmentToResourceRequest(pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest splitRequest)

Splits the assignment into a new resource request using the resource request's start date as the assignment's split date. A day before the start date of the new resource request is the end date of the current assignment. If an error occurs, the response provides the result and details of the error message.

Input Parameters

Name Type Description
splitRequest pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest - Contains the additional field names and the new resource request information. If the resource request details are not provided, an error message is returned in the response.

Return Value

Pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponse

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: A bulk request for Split Assignment to new Resource Request, with partial success and failure.
    ***************************************************************************************************************************
*/
// Valid fields of Resource Request
List<SObjectField> additionalFields = new List<SObjectField>{ 
    pse__Resource_Request__c.pse__Notes__c,
    pse__Resource_Request__c.pse__Milestone__c
};
// Details for request 1
Id assignmentIdToSplit1 = 'a1eDK000001aVCDYA2';    //Assignment must have a Resource Request with Resource Skill Request
Id projectIdForNewRR1 = 'a1vDK0000015M2fYAE';
Id regionIdForNewRR1 = 'a1zDK000001SxxyYAC';
Id milestoneIdForNewRR1 = 'a1rDK000006TNYbYAO'; //This Milestone must belong to project projectIdForNewRR1
Date startDateForNewRR1 = Date.newInstance(2025, 05, 10);    // Must be within the assignment start/end date
Date endDateForNewRR1 = Date.newInstance(2025, 06, 20);    //Date must be greater than startDateForNewRR1

// Details for request 2
Id assignmentIdToSplit2 = 'a1eDK000001aVBmYAM';    //Assignment must have a Resource Request with Resource Skill Request
Id projectIdForNewRR2 = 'a1vDK0000015M2fYAE';
Id regionIdForNewRR2 = 'a1zDK000001SxxyYAC';
Date startDateForNewRR2 = Date.newInstance(2024, 12, 05); // Must be within the assignment start/end date
Date endDateForNewRR2 = Date.newInstance(2024, 12, 20);    // Must be greater than startDateForNewRR2

// Details for request 3
Id assignmentIdToSplit3 = 'a1eDK000001aVBlYAM';    //Assignment must have a Resource Request with Resource Skill Request
Id projectIdForNewRR3 = 'a1vDK0000015M2fYAE';
Id regionIdForNewRR3 = 'a1zDK000001SxxyYAC';
Date startDateForNewRR3 = Date.newInstance(2025, 09, 10); //Start date must be outside the assignment start/end date
Date endDateForNewRR3 = Date.newInstance(2025, 10, 20);    //Date must be greater than startDateForNewRR3

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest splitRequest = new pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest();
splitRequest.setAdditionalFields(additionalFields);

// Request having clone skills and schedule as false.
pse.ResourceAssignmentService.RequestDetail requestDetail1 = new pse.ResourceAssignmentService.RequestDetail();
requestDetail1.SourceAssignmentId = assignmentIdToSplit1;
requestDetail1.StartDate = startDateForNewRR1;
requestDetail1.EndDate = endDateForNewRR1;
requestDetail1.ProjectId = projectIdForNewRR1;
requestDetail1.ResourceRole = 'Project Manager';
requestDetail1.RequestedHours = 700;
requestDetail1.RegionId = regionIdForNewRR1;
requestDetail1.CloneSkills = false;
requestDetail1.CloneSchedule = false;
requestDetail1.additionalFieldApiWithValues = new Map<pse.ResourceAssignmentService.AdditionalField, String>{
    splitRequest.getAdditionalFields()[0] => 'Not cloning skills and schedules',
    splitRequest.getAdditionalFields()[1] => milestoneIdForNewRR1
};

// Request for cloning skills and schedule
pse.ResourceAssignmentService.RequestDetail requestDetail2 = new pse.ResourceAssignmentService.RequestDetail();
requestDetail2.SourceAssignmentId = assignmentIdToSplit2;
requestDetail2.StartDate = startDateForNewRR2;
requestDetail2.EndDate = endDateForNewRR2;
requestDetail2.ProjectId = projectIdForNewRR2;
requestDetail2.ResourceRole = 'Consultant';
requestDetail2.RequestedHours = 450;
requestDetail2.RegionId = regionIdForNewRR2;
requestDetail2.additionalFieldApiWithValues = new Map<pse.ResourceAssignmentService.AdditionalField, String>{
    splitRequest.getAdditionalFields()[0] => 'Cloning skills and schedule'
};

// Request having invalid start date
pse.ResourceAssignmentService.RequestDetail requestDetail3 = new pse.ResourceAssignmentService.RequestDetail();
requestDetail3.SourceAssignmentId = assignmentIdToSplit3;
requestDetail3.StartDate = startDateForNewRR3;
requestDetail3.EndDate = endDateForNewRR3;
requestDetail3.ProjectId = projectIdForNewRR3;
requestDetail3.ResourceRole = 'Consultant';
requestDetail3.RequestedHours = 450;
requestDetail3.RegionId = regionIdForNewRR3;
requestDetail3.additionalFieldApiWithValues = new Map<pse.ResourceAssignmentService.AdditionalField, String>{
    splitRequest.getAdditionalFields()[0] => 'Invalid request'
};

splitRequest.RequestDetails = new List<pse.ResourceAssignmentService.RequestDetail>{ requestDetail1, requestDetail2, requestDetail3 };

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponse response = pse.ResourceAssignmentService.splitAssignmentToResourceRequest(
    splitRequest
);

System.debug('Response: ' + response);
Integer index = 1;
for(pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponseDetail responseDetail : response.ResponseDetails) {
    System.debug('ResponseDetail for request ' + (index++) +': ' + responseDetail);
}

/*
    ***************************************************************************************************************************
    Example 2: Split an Assignment to new Resource Request, with invalid additional fields.
    ***************************************************************************************************************************
*/
List<SObjectField> additionalFields = new List<SObjectField>{ 
    pse__Resource_Request__c.pse__Notes__c,
    pse__Assignment__c.pse__Schedule__c // Invalid additional field
};
Id assignmentIdToSplit = 'a1eDK000001aVCDYA2';
Id projectIdForNewRR = 'a1vDK0000015M2fYAE';
Id regionIdForNewRR = 'a1zDK000001SxxyYAC';
String resourceRoleForNewRR = 'Project Manager';
Integer requestedHoursForNewRR = 700;
Date startDateForNewRR = Date.newInstance(2025, 05, 10); // Must be within the assignment start/end date
Date endDateForNewRR = Date.newInstance(2025, 06, 05);

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest splitRequest = new pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest();
splitRequest.setAdditionalFields(additionalFields);

pse.ResourceAssignmentService.RequestDetail requestDetail = new pse.ResourceAssignmentService.RequestDetail();
requestDetail.SourceAssignmentId = assignmentIdToSplit;
requestDetail.StartDate = startDateForNewRR;
requestDetail.EndDate = endDateForNewRR;
requestDetail.ProjectId = projectIdForNewRR;
requestDetail.ResourceRole = resourceRoleForNewRR;
requestDetail.RequestedHours = requestedHoursForNewRR;
requestDetail.RegionId = regionIdForNewRR;
requestDetail.CloneSkills = false;
requestDetail.CloneSchedule = false;
requestDetail.additionalFieldApiWithValues = new Map<pse.ResourceAssignmentService.AdditionalField, String>{
    splitRequest.getAdditionalFields()[0] => 'not cloning skills and schedules'
};

splitRequest.RequestDetails = new List<pse.ResourceAssignmentService.RequestDetail>{ requestDetail };

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponse response = pse.ResourceAssignmentService.splitAssignmentToResourceRequest(
    splitRequest
);
System.debug('Response: ' + response);

splitAssignmentToAssignment

global static List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentResponse> splitAssignmentToAssignment(List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest> splitRequests)

Splits an assignment into a new assignment using the provided start date as start date of the new assignment. If an error occurs, the response provides the result and details of the error message.

Input Parameters

Name Type Description
splitRequests List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest> - Request containing the assignment Id, Start Date and other details to split the assignment.

Return Value

List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Split an assignment to a new assignment.
    ***************************************************************************************************************************
*/
// prepare requests
List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest> requests = new List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest>();
pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest request = new pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest();
request.AssignmentId = 'a1bDL000005PWWGYA4';
request.ResourceId = '003DL00002B7IdAYAV';
request.NewAssignmentName = 'New Assignment';
request.StartDate = Date.newInstance(2025,6,1);

requests.add(request);

List<pse.ResourceAssignmentService.SplitAssignmentToAssignmentResponse> responses = pse.ResourceAssignmentService.splitAssignmentToAssignment(requests);

// log out the responses to evaluate the success or failure and related details if applicable
System.debug('responses');
for(pse.ResourceAssignmentService.SplitAssignmentToAssignmentResponse response : responses) {
    System.debug(response);
}

swapResourceOnAssignment

global static List<pse.ResourceAssignmentService.SwapResourceOnAssignmentResponse> swapResourceOnAssignment(List<pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest> swapRequests)

Swaps the resource on an assignment If an error occurs, the response provides the result and details of the error message.

Input Parameters

Name Type Description
swapRequests List<pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest> - A request containing the assignment Id to use for swapping, and the resource Id to swap

Return Value

List<pse.ResourceAssignmentService.SwapResourceOnAssignmentResponse>

Sample Code

//Note: This sample code is for demonstration purposes only. It is not intended for
//use in a production environment, is not guaranteed against defects or errors, and
//is in no way optimized or streamlined.

/*
    ***************************************************************************************************************************
    Example 1: Swap a resource on an assignment.
    ***************************************************************************************************************************
*/
// prepare requests
List<pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest> requests = new List<pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest>();
pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest request = new pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest();
request.AssignmentId = 'a1bDL000005PWWGYA4';
request.ResourceId = '003DL00002B7IdAYAV';
requests.add(request);

// call swapResourceOnAssignment to perform the swap from the existing resource to the new resource specified above
List<pse.ResourceAssignmentService.SwapResourceOnAssignmentResponse> responses = pse.ResourceAssignmentService.swapResourceOnAssignment(requests);

// log out the responses to evaluate the success or failure and related details if applicable
System.debug('responses');
for(pse.ResourceAssignmentService.SwapResourceOnAssignmentResponse response : responses) {
    System.debug(response);
}

pse.ResourceAssignmentService.ResourceAssignmentRequest

global with sharing class ResourceAssignmentRequest

Contains parameters for holding a resource on a resource request or assigning a resource request to a resource. The CustomHours and PercentAlloc fields are required for the CALCULATE_END_DATE_CUSTOM_SCHEDULING and PERCENT_ALLOCATION scheduling strategies, respectively.

Properties

Name Type Description
ResourceRequestId Id Resource Request ID for creating or holding assignments for a resource.
ResourceId Id Resource ID for holding resource requests or assigning on assignments.
StartDate Date Start date for the schedule.
EndDate Date End date for the schedule.
Strategy pse.ResourceAssignmentService.SchedulingStrategy Strategy for schedule calculation. Additional properties may be required depending on the chosen strategy.
CustomHours Map<String, Decimal> Hours for each day when custom scheduling strategy is selected.
PercentAlloc Decimal Percentage to create a schedule when the percent allocation scheduling strategy is selected.
UseDefaultStrategy Boolean The flag is used to get scheduling strategy from the Default Scheduling Strategy field of the Assignment Settings custom setting.
Frequency Integer Integer frequency defines the number of times follow the same schedule pattern for the defined mode. Default value is 1 which means every week(mode) defined pattern will repeat till the requested hours gets consumed. so as if 2 is the value, then in every 2 weeks(mode) the pattern will be repeated. 0 and positive values are valid, Any negative value entered, would be considered as default value(1). For frequency as 0, is a special case, schedule will be created for one week only irrespective of total hours or end date.
Mode pse.ResourceAssignmentService.RepeatModes RepeatModes mode defines the period for which schedule pattern will be repeated as per the frequency. Default value is RepeatModes.WEEKS.

pse.ResourceAssignmentService.ResourceAssignmentResponse

global with sharing class ResourceAssignmentResponse

Returns information related to the resource request ID and resource ID.

Properties

Name Type Description
ResourceRequestId Id Resource Request ID for creating or holding assignments for a resource.
Resource Id Resource ID for holding resource requests or assigning on assignments.

pse.ResourceAssignmentService.ResourceUnholdOrUnassignRequest

global with sharing class ResourceUnholdOrUnassignRequest

Contains parameters for unholding or unassigning the resource on a resource request.

Properties

Name Type Description
ResourceRequestId Id Resource Request ID for unholding or unassigning resource on resource requests.
Status String Status value of the resource request after unhold. If the status is blank, the default value is Draft.

Methods

ResourceUnholdOrUnassignRequest

global ResourceUnholdOrUnassignRequest()

pse.ResourceAssignmentService.ResourceUnholdOrUnassignResponse

global with sharing class ResourceUnholdOrUnassignResponse

Returns information related to the resource request.

Properties

Name Type Description
ResourceRequestId Id The ID of the target resource request.
ErrorMessage String Contains any errors from unholding or unassigning the resource.

pse.ResourceAssignmentService.AdditionalField

global with sharing class AdditionalField

The SObjectField details to be added in the request parameter using the setAdditionalFields method.

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestRequest

global with sharing class SplitAssignmentToResourceRequestRequest

Contains parameters related to request details for splitting assignments to resource requests.

Properties

Name Type Description
RequestDetails List<pse.ResourceAssignmentService.RequestDetail> The Assignment ID to split and details of the new resource request created after split.

Methods

setAdditionalFields

global void setAdditionalFields(List<SObjectField> fields)

This method enables users to set additional fields which are not provided in the given request.

getAdditionalFields

global List<pse.ResourceAssignmentService.AdditionalField> getAdditionalFields()

This method retrieves the list of the fields added to the setAdditionalFields method. The returned list of AdditionalField must be used as a key in AdditionalFieldApiWithValues of RequestDetails.

SplitAssignmentToResourceRequestRequest

global SplitAssignmentToResourceRequestRequest()

pse.ResourceAssignmentService.SplitAssignmentToAssignmentRequest

global with sharing class SplitAssignmentToAssignmentRequest

Contains parameters related to request details for splitting an assignment into a new assignment.

Properties

Name Type Description
AssignmentId Id The assignment Id to use for splitting.
ResourceId Id The ID of the resource for the new assignment.
NewAssignmentName String The Name of the new assignment.
StartDate Date The start date of the new assignment. The source assignment end date will be set to the day prior to this date.

Methods

SplitAssignmentToAssignmentRequest

global SplitAssignmentToAssignmentRequest()

pse.ResourceAssignmentService.SwapResourceOnAssignmentRequest

global with sharing class SwapResourceOnAssignmentRequest

Contains parameters related to request details for swapping a resource on an assignment.

Properties

Name Type Description
AssignmentId Id The assignment Id to use for swapping
ResourceId Id The resource Id to swap to on the assignment

Methods

SwapResourceOnAssignmentRequest

global SwapResourceOnAssignmentRequest()

pse.ResourceAssignmentService.RequestDetail

global with sharing class RequestDetail

Contains information related to the new resource request created after splitting assignments.

Properties

Name Type Description
SourceAssignmentId Id The ID of the assignment to split.
StartDate Date The start date of the new resource request. This is required for splitting the assignment to a new resource request.
EndDate Date The end date of the new resource request. This is required for splitting the assignment to a new resource request. If the end date of the resource request exceeds the assignment’s end date, the new schedule takes the assignment’s end date into consideration.
ProjectId Id The ID of the project for the new resource request.
OpportunityId Id The ID of the opportunity for the new resource request.
ResourceRole String The resource role of the new resource request. This is required for new resource requests.
RequestedHours Decimal The requested hours of the new resource request. If not provided, the value is calculated for a start date and an end date in the request.
SuggestedResourceId Id The ID of the suggested resource for the new resource request.
RegionId Id The ID of the region for the new resource request.
PracticeId Id The ID of the practice for the new resource request.
GroupId Id The ID of the group for the new resource request.
CloneSkills Boolean If set to true, clones the skills from the resource request associated with the assignment. By default, this value is true.
CloneSchedule Boolean If set to true, creates a new schedule from the existing schedule of the assignment. By default, this value is true.
AdditionalFieldApiWithValues Map<pse.ResourceAssignmentService.AdditionalField, String> Sets values of the Additional fields provided in setAdditionalField method. For example, AdditionalField field = splitRequest.getAdditionalFields()[0]; AdditionalFieldApiWithValues = new Map<ResourceAssignmentService.AdditionalField, String>{ field => 'axc0000000dscd1fd' };

Methods

RequestDetail

global RequestDetail()

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponse

global with sharing class SplitAssignmentToResourceRequestResponse

Contains information related to the new resource request created after splitting assignments or an error message when the split action was not successful.

Properties

Name Type Description
ResponseDetails List<pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponseDetail> Details of newly created resource requests and Assignment IDs if the request is valid. Else, contains an error message when the request is invalid.
ResponseStatus pse.ResourceAssignmentService.ResponseStatus Indicates the status of the response.
ErrorMessage String Contains information about any errors in the request.

Methods

SplitAssignmentToResourceRequestResponse

global SplitAssignmentToResourceRequestResponse()

pse.ResourceAssignmentService.SplitAssignmentToAssignmentResponse

global with sharing class SplitAssignmentToAssignmentResponse

Contains information related to the response from splitting a Assignment into a new Assignment.

Properties

Name Type Description
SourceAssignmentId Id The ID of the source assignment.
NewAssignmentId Id The ID of the newly created assignment.
ResponseStatus pse.ResourceAssignmentService.ResponseStatus Indicates the status of the response.
ErrorMessage String Contains information about any errors.

Methods

SplitAssignmentToAssignmentResponse

global SplitAssignmentToAssignmentResponse()

pse.ResourceAssignmentService.SwapResourceOnAssignmentResponse

global with sharing class SwapResourceOnAssignmentResponse

Contains information related to the response from swapping a resource on an assignment

Properties

Name Type Description
AssignmentId Id The ID of the assignment that is having a resource swapped.
ResponseStatus pse.ResourceAssignmentService.ResponseStatus Indicates the status of the response.
ErrorMessage String Contains information about any errors.

Methods

SwapResourceOnAssignmentResponse

global SwapResourceOnAssignmentResponse()

pse.ResourceAssignmentService.SplitAssignmentToResourceRequestResponseDetail

global with sharing class SplitAssignmentToResourceRequestResponseDetail

Contains the Assignment ID and the details of the new resource request created after the split or an error message when the split action was not successful.

Properties

Name Type Description
AssignmentId Id The ID of the assignment.
IsSuccess Boolean Indicates if the assignment was split successfully.
ResourceRequest pse__Resource_Request__c Details of the new resource request created after the split.
ErrorMessage String Contains an error message when an assignment is not split to a resource request.

Methods

SplitAssignmentToResourceRequestResponseDetail

global SplitAssignmentToResourceRequestResponseDetail()

pse.ResourceAssignmentService.ResourceAssignmentRequestDetail

global with sharing class ResourceAssignmentRequestDetail

Contains parameters for assigning or holding resource requests in asynchronous mode.

Properties

Name Type Description
ResourceAssignmentRequests List<pse.ResourceAssignmentService.ResourceAssignmentRequest> Requires parameters for holding a resource on a resource request or assigning a resource request to a resource.
SendErrorEmail Boolean Determines whether to send an email containing an error message for each chunk. By default, the value is set to false.

Methods

ResourceAssignmentRequestDetail

global ResourceAssignmentRequestDetail()

Determines the number of times the process should be retried in case of record lock/unavailable. No need to make it global as it's an internal property.

© Copyright 2009–2025 Certinia Inc. All rights reserved. Various trademarks held by their respective owners.