Salesforce Customization Guide | MuleSoft Documentation
# Salesforce Customization Guide
This guide provides instruction on creating the custom fields that are required in order to enable the customer profile and sales order sync use cases to function end-to-end.
## Fields to Be Updated
The Order object needs to be updated for the following fields for the use case:
Field Name | Type | Updated Values  
---|---|---  
Picklist | ADD_ON, CANCELLATION, INITIAL, JOURNAL, RENEWAL, RETURN, SUBSCRIPTION, UPGRADE  
Picklist | CANCELLED, CREATED, CONFIRMED, DELIVERED, IN_CART, IN_TRANSIT, INVOICED, LOST, PARTIALLY_SHIPPED, PICKUP_AVAILABLE, PROCESSING, REJECTED, RETURNED  
## Custom Objects
The following objects must be created
Salesforce Object Name | Singular Label | Plural Label  
---|---|---  
Managed_External_Id | Managed External Identifier | Managed External Identifiers  
### Create Custom Objects Manually
  1. In your Salesforce org, click Setup, and then select Setup to open Setup.
  2. Click the Object Manager tab. If you don’t see it, enter Object Manager in the Quick Find box.
  3. On the Object Manager page, click Create | Custom Object.
  4. For Label, enter the value in `Singular Label`.
  5. For Plural Label, enter the value in `Plural Label`.
  6. Leave the rest of the values as default and click Save.


### Create a Custom Object via Apex Script
An Apex class called `CustomObjectUtility` and `MetadataService` are used to create a custom object programmatically. The source can be found on Common Resources project and MetadataService respectively. Download the project and follow the steps below.
  1. Click on the Salesforce Setup icon and select `Developer Console` to open a new console window.
  2. Go to `File > New > Apex class` and create a new class named `CustomObjectUtility`.
  3. Copy the code from `accel-common-resources/salesforce/CustomObjectUtility.apxc` to the script editor.
  4. Select the `Save` from the File menu option to compile and save the class.
  5. Go to `File > New > Apex class` and create a new class named `MetadataService`.
  6. Copy the code from `https://github.com/financialforcedev/apex-mdapi/blob/master/apex-mdapi/src/classes/MetadataService.cls` to the script editor.
  7. Select the `Save` from the File menu option to compile and save the class.
  8. Select `Debug > Open Execute Anonymous Window`.
  9. Copy and paste the contents of `/src/test/resources/scripts/CreateCustomObjects.txt` into the window.
  10. Enable the `Open Log` option, and then click the **Execute** button.


Once the script completes, select the `Debug Only` filter option to show only the results of each create request. Verify that all fields have been created successfully.
## Custom Fields
The following fields must be created in the corresponding objects.
Salesforce Object | Field Label | Field Name | Data Type | Length | Unique | ExternalId  
---|---|---|---|---|---|---  
Global Billing Address ID | Global_BillingAddress_Id  
Global Customer ID | Global_Customer_Id  
Global Email Address ID | Global_EmailAddress_Id  
Global Fax Number ID | Global_FaxNumber_Id  
Global Mailing Address ID | Global_MailingAddress_Id  
Global Mobile Number ID | Global_MobileNumber_Id  
Global Party ID | Global_Party_Id  
Global Phone Number ID | Global_PhoneNumber_Id  
Global Shipping Address ID | Global_ShippingAddress_Id  
Customer Status | Customer_Status | Picklist  
Managed_External_Id__c | External Id | External_Id  
Managed_External_Id__c | External Id Type | External_Id_Type | Picklist  
Managed_External_Id__c | Object Id | Object_Id  
Managed_External_Id__c | Object Type | Object_Type | Picklist  
Managed_External_Id__c | Picklist  
Managed_External_Id__c | Status Last Changed | Status_Last_Changed | Date/Time  
Global_Individual_Id | Global_Individual_Id  
Global_SalesOrder_Id | Global_SalesOrder_Id  
Product2 | Global_Product_Id | Global_Product_Id  
Unique fields should be case-sensitive.   
---  
### Create via Apex Script
An Apex class called `CustomFieldUtility` can be used to create custom fields programmatically. The source for this class can be found in the Accelerator Common Resources project. Download this project and follow the steps below.
  1. Click on the Salesforce Setup icon and select `Developer Console` to open a new console window.
  2. Go to `File > New > Apex class` and create a new class named `CustomFieldUtility`.
  3. Copy the code from `accel-common-resources/salesforce/CustomFieldUtility.apxc` to the script editor.
  4. Select the `File > Save` menu option to compile and save the class.
  5. Select `Debug > Open Execute Anonymous Window`.
  6. Copy and paste the contents of `accel-common-resources/salesforce/CreateCustomFields.txt` into the window.
  7. Enable the `Open Log` option and click the **Execute** button.


Once the script completes, select the `Debug Only` filter option to show just the results of each create request. Verify that all fields have been successfully created.
### Create Manually via Salesforce
To create each of these custom fields and enable visibility for them on page layouts:
  1. Click on the Salesforce Setup icon.
  2. Select the `Object Manager` tab from the Setup home page.
  3. Find and select the target Salesforce object.
  4. Select the `Fields & Relationships` page.
  5. Click the **New** button and create the field as specified above.
  6. Once the field has been created, click the `Set Field-Level Security` button (or do these steps later - see below).
  7. Enable for desired profile, or tick the checkbox next to `Visible` to enable visibility for the desired profile(s).


Repeat these steps for each custom field in the above list.
Instead of adjusting permissions for each field as you go, if you are only making them available to one or two profiles, then it may be more efficient to go to `Users > Profiles > {profile} > Object Settings` for each object and adjust the permissions for multiple fields at once.   
---  
### Additional Notes
  * The **Customer Status** picklist values are **Prospect** , **Onboarding** , **Active** , **Inactive** , **Closed** , **Deceased** , **Delinquent** , and **Dormant**.
  * The **External Id Type** picklist values are **SALESFORCE_B2C** , **SALESFORCE_CORE** , **PIM** , **OFBIZ** , **SAP_4HANA** , **MDM** , **SAP_ECC** , **SALESFORCE_MARKETING** , **POS** , **SALESFORCE_DC** , **SALESFORCE_LM** , and **ORACLE_EBS**.
  * The **Object Type** picklist values are **BillingAddress** , **Customer** , **Email** , **Fax** , **Household** , **Individual** , **MailingAddress** , **MobilePhone** , **Organization** , **Phone** , **Product** , **SalesOrder** , and **ShippingAddress**.
  * The **Status** picklist values are **VALID** , **INVALID**.
  * All `Global_*_Id__c` fields should be visible in layouts (as described above) but made **read-only** to avoid issues with data synchronization.


## Configure Connected App for Authentication
Follow the below steps to generate the `Consumer Key` and `Consumer Secret` values required for Salesforce authentication.
  1. Click on the Salesforce Setup icon .
  2. Navigate to `Apps > App Manager`.
  3. Select `New Connected App`.
  4. Enter Connected App Name: `MuleSoft Accelerator`, API Name: `MuleSoft_Accelerator` and set your email address.
  5. In the `API (Enable OAuth Settings)` section, check the box `Enable OAuth Settings`.
  6. Set the callback URL `http://localhost`.
  7. From the `Selected OAuth Scopes` list, select `Full access (full)`.
  8. Click **Save** and then **Continue**.
  9. Click the **Manage** button to view details for the new connected app.
  10. Click the **Edit Policies** button.
  11. In the `OAuth Policies` section, for `Permitted Users` select `All users may self-authorize`.
  12. For `IP Relaxation`, select the `Relax IP restrictions` option.
  13. Click **Save**.
## Configure Connected App for Authentication
Follow the below steps to generate the `Consumer Key` and `Consumer Secret` values required for Salesforce authentication.
  1. Click on the Salesforce Setup icon .
  2. Navigate to `Apps > App Manager`.
  3. Select `New Connected App`.
  4. Enter Connected App Name: `MuleSoft Accelerator`, API Name: `MuleSoft_Accelerator` and set your email address.
  5. In the `API (Enable OAuth Settings)` section, check the box `Enable OAuth Settings`.
  6. Set the callback URL `http://localhost`.
  7. From the `Selected OAuth Scopes` list, select `Full access (full)`.
  8. Click **Save** and then **Continue**.
  9. Click the **Manage** button to view details for the new connected app.
  10. Click the **Edit Policies** button.
  11. In the `OAuth Policies` section, for `Permitted Users` select `All users may self-authorize`.
  12. For `IP Relaxation`, select the `Relax IP restrictions` option.
  13. Click **Save**.


You now need to copy the `Consumer Key` and `Consumer Secret` values for use in configuring Mule application deployments. More specifically, these must be supplied as the values for the `sfdc.fsc.client-id` and `sfdc.fsc.client-secret` properties found in the `Clouhub-RCG-DEV` profile in your Maven `settings.xml` file.
  1. On the Setup Home page, navigate to `Apps -> App Manager`.
  2. Locate your new connected app and choose **View** from the actions dropdown for that item.
  3. In the **API (Enable OAuth Settings)** section, click the **Manage Consumer Details** button.
  4. Verify your identity by entering the verification code that was emailed to you.
  5. Copy the key and secret values and update your `settings.xml` file as described previously.


Download the Accelerator Common Resources project for a sample `settings.xml` file that can be used as a starting point.
## Generating a Security Token for the Service Account
A token needs to be generated for the service account used by the Mule applications in order to connect to the FSC instance.
  1. Log in to Salesforce as the Service Account User, which is the account that will be used by the Mule applications to connect to Salesforce).
  2. Click the Username icon and select **Settings** from the menu.
  3. Select `My Personal Information > Reset My Security Token`. If you cannot find this, see the note at the end of these steps.
  4. Click **Reset Security Token**.
  5. Check the email inbox for an email from Salesforce with the new security token.


If the option to reset your security token is not available, it is likely that one or more Login IP Ranges are in effect. These can be temporarily removed from the settings page of the profile assigned to the service account user.   
---  
## Contact Point Mappings
The following table lists the conditions used to assign ContactPoints in Salesforce:
CIM PartyRoleType - PartyType | Salesforce Object - Record Type | Condition | Action in Salesforce | Comments  
---|---|---|---|---  
Customer - Individual | Account - PersonAccounts | ContactPointAddress with `isUsedForBilling` set as `false` and `isUsedForShipping` set as `false` | Assign Address as `PersonMailingAddress` | If multiple addresses match this condition, the one with primaryFlag set to true is used; if none of them match this condition, then the first one is used  
Customer - Individual | Account - PersonAccounts | ContactPointAddress with `isUsedForBilling` set as `true` | Assign Address as `BillingAddress`  
Customer - Individual | Account - PersonAccounts | ContactPointAddress with `isUsedForShipping` set as `true` | Assign Address as `ShippingAddress`  
Customer - Individual | Account - PersonAccounts | ContactPointPhone with `isSMSCapable` set as `false` | Assign Phone Number as `Phone` | If multiple phones match this condition, the one with primaryFlag set to true is used; if none of them match this condition, then the first one is used  
Customer - Individual | Account - PersonAccounts | ContactPointPhone with `isSMSCapable` set as `true` | Assign Phone Number as `PersonMobilePhone`]  
Customer - Organization | Account - Account | ContactPointAddress with `isUsedForBilling` set as `true` | Assign Address as `BillingAddress` | If multiple addresses match this condition, the one with primaryFlag set to true is used; if none of them match this condition, then the first one is used  
Customer - Organization | Account - Account | ContactPointAddress with `isUsedForBilling` set as `true` | Assign Address as `BillingAddress` | If multiple addresses match this condition, the one with primaryFlag set to true is used; if none of them match this condition, then the first one is used  
Customer - Organization | Account - Account | ContactPointAddress with `isUsedFoShipping` set as `true` | Assign Address as `ShippingAddress`  
Customer - Organization | Account - Account | ContactPointPhone with `isFaxCapable` set as `false` | Assign Phone Number as `Phone` | If multiple phones match this condition, the one with primaryFlag set to true is used; if none of them match this condition, then the first one is used  
Customer - Organization | Account - Account | ContactPointPhone with `isFaxCapable` set as `true` | Assign Phone Number as `Fax`  
*The default value for all flags is `false`.
## Household Record Type
The following record type must be enabled if CIM PartyRole `Customer` with Party as `Household` needs to be supported, otherwise this step can be ignored.
Salesforce Object | Record Type  
---|---  
Household  
To enable the `Household` record type in the `Account` object, follow these steps:
  1. Click on the Salesforce Setup icon.
  2. Navigate to `Users → Profiles`.
  3. Select the target profile for the service account user.
  4. Navigate to `Object Settings -> Accounts` and click the **Edit** button.
  5. Under `Record Types and Page Layout Assignments` check the `Household` record type.
  6. Click the **Save** button.


## Create Platform Events and Apex Triggers
The following Platform Event Objects and Apex Triggers must be created in order to capture updates from Salesforce. The scripts to create these Apex Triggers and add fields to Platform Event Objects are located in the Accelerator Common Resources project.
Salesforce Object | Salesforce Platform Event Object | Salesforce Platform Event API Name | Apex Trigger Name  
---|---|---|---  
Account__e | AccountEventsPub  
### Create Platform Event Object
This implementation requires `Platform Events` to be created in Salesforce. Follow these steps to create a `Platform Event` object:
  1. Log in to Salesforce.
  2. Click **Setup** and search for "Platform Events" in the **Quick Find** box. The Platform Events page shows with a list of available Platform Events.
  3. Click the **New Platform Event** button to create an Object. Complete the **Platform Information Details** fields, including **Label** , **Plural Label** , **Object with Object Name** , and **Event API Names** as indicated in the previous table.
  4. Click **Save**.


Repeat these steps to create additional Salesforce Platform Event objects as indicated in the previous table. . To add Custom Fields & RelationShips to Platform Event Definitions, run the utility scripts (`CreatePlatformEventsCustomFields.txt`) available in the Accelerator Common Resources in the `/salesforce` folder.
### Create Apex Triggers
Follow these steps to create the Apex Triggers:
  1. Log in to Salesforce.
  2. Click Setup to search for Object Manager in Quick Find Box.
  3. Search for the Salesforce object. This opens a page that shows the details of the object.
  4. Click **Triggers** in the Details section to view a list of available triggers for the object.
  5. Click **New**.
  6. Search for the Apex Trigger name, which is indicated in the previous table. Copy the Trigger Script code in `CreateApexTriggers.txt` from the Accelerator Common Resources page and paste it into the script editor. The `CreateApexTriggers.txt` file is located in the `/salesforce` folder.
  7. Obtain the `LastModifiedById` and `RecordTypeId` (if it exists) by running the queries mentioned in the trigger from the Developer Console.
  8. Replace the values in the script and save the trigger.
  9. Click **Save** and ensure the **isActive** checkbox is checked.
  10. Repeat these steps for each Salesforce object in the previous table.
Repeat these steps to create additional Salesforce Platform Event objects as indicated in the previous table. . To add Custom Fields & RelationShips to Platform Event Definitions, run the utility scripts (`CreatePlatformEventsCustomFields.txt`) available in the Accelerator Common Resources in the `/salesforce` folder.
### Create Apex Triggers
Follow these steps to create the Apex Triggers:
  1. Log in to Salesforce.
  2. Click Setup to search for Object Manager in Quick Find Box.
  3. Search for the Salesforce object. This opens a page that shows the details of the object.
  4. Click **Triggers** in the Details section to view a list of available triggers for the object.
  5. Click **New**.
  6. Search for the Apex Trigger name, which is indicated in the previous table. Copy the Trigger Script code in `CreateApexTriggers.txt` from the Accelerator Common Resources page and paste it into the script editor. The `CreateApexTriggers.txt` file is located in the `/salesforce` folder.
  7. Obtain the `LastModifiedById` and `RecordTypeId` (if it exists) by running the queries mentioned in the trigger from the Developer Console.
  8. Replace the values in the script and save the trigger.
  9. Click **Save** and ensure the **isActive** checkbox is checked.
  10. Repeat these steps for each Salesforce object in the previous table.


### Additional Notes
  * Each of the Apex Triggers that are created from the table filter records based on `LastModifiedBy <> {Service account ID}`. This is done to avoid cyclical updates performed by the Salesforce Customers API and Salesforce Financial System API. This can be obtained by running the query `SELECT Id FROM User WHERE Username='<service-account-username>'` in the Developer Console.
  * The Apex Trigger `AccountEventsPub` also filters records based on record type ID. The record type ID can be obtained by running the query `SELECT Id,Name FROM RecordType where Name='Household' and 'sObjectType='Account'` in the Developer Console.


## See Also
  *   * MuleSoft Accelerator for Retail