Clean Suite for CRM: Salesforce Components

Contents

Clean Suite for CRM: Salesforce Components#

Lightning Quick Actions#

Purpose#

Clean Suite provides six Lightning Components for quick actions on record pages. Each action starts one service request for the current record.

The action gets the record ID from Salesforce. It then finds Custom Mapping records for the object type of that record.

Only mappings with the required service value take part. The service writes only to fields that the mapping specifies.

Quick-Action Execution Flow#

The flow shows how a quick action uses a record and its matching mapping.

../../_images/CleanSuite_Components_QuickActionExecutionFlow.png

Diagram flow

  1. User selects a quick action → Current Salesforce record ID

  2. Current Salesforce record ID → Record object type

  3. Record object type → Matching Custom Mapping records

  4. Matching Custom Mapping records → Aura-enabled service method

  5. Aura-enabled service method → Mapped output fields

  6. Mapped output fields → Refreshed record view

Supported Quick Actions#

Create one Lightning Component action for each service that users need.

Lightning Component

Suggested action label

Apex service method

Required mapping service

CS_BusinessCoderAction

Verify Business

MD_BusinessWSExt.doBusinessCoder(Id recordId)

businessCoder

CS_GlobalAddressAction

Verify Global Address

MD_GlobalAddressWSExt.doGlobalAddress(Id recordId)

globalAddress

CS_GlobalEmailAction

Verify Email

MD_GlobalEmailWSExt.doGlobalEmail(Id recordId)

globalEmail

CS_GlobalPhoneAction

Verify Phone

MD_GlobalPhoneWSExt.doGlobalPhone(Id recordId)

globalPhone

CS_PersonatorAction

Verify Domestic Addr/Email/Phone/Name

MD_PersonatorWSExt.doPersonator(Id recordId)

personator

CS_PropertyAction

Verify Property

MD_PropertyV4WSExt.doLookupProperty(Id recordId)

property

The methods in this table are callable from quick actions. They accept one Salesforce record ID and return a string.

The package does not limit these actions to a fixed set of objects. Each method gets the object type from the record ID. It then selects Custom Mapping records for that object type.

Do not add an action to an object until you configure at least one mapping for its service. The methods read up to 100 mapping records for the object.

Add a Quick Action to a Record Layout#

Complete the service setup, license setup, and Custom Mapping setup before you add an action.

  1. In Setup, open Object Manager and select the target object.

  2. Open Buttons, Links, and Actions, then select New Action.

    ../../_images/ListwareSalesforce_LQA_01_NewAction.png

    The action list header shows the New Action button.

  3. Set the action type to Lightning Component. Select the required Clean Suite component from the table.

    ../../_images/ListwareSalesforce_LQA_02_SetupComponent.png

    The example sets the Lightning Component to MDPERSONATOR:CS_PersonatorAction on the Contact object.

  4. Enter an action label that identifies the service, then save the action.

  5. Open Page Layouts. Select each layout that must show the action.

    ../../_images/ListwareSalesforce_LQA_03_PageLayouts.png

    The page layout list shows each layout that is defined for the object.

  6. In the layout, open Mobile & Lightning Actions. Drag the new action into Salesforce Mobile and Lightning Experience Actions.

    ../../_images/ListwareSalesforce_LQA_04_Drag.png

    The layout editor shows the new action in the Salesforce Mobile and Lightning Experience Actions section.

  7. Save the page layout.

  8. Open a record of that object and confirm that the action is available.

    ../../_images/ListwareSalesforce_LQA_05_Confirm.png

    The record page header shows the new quick action next to the standard buttons.

  9. Test the action with a user who has the required permissions and a record that has mapped input data.

Repeat these steps for each record type and page layout that needs the service. An action can appear on a layout even when the object has no matching mapping. In that case, it does not process data.

User Experience#

When a user selects a quick action, the action starts immediately. It shows the package wait message and a spinner while the Apex call runs.

The action has no input form and no result table. It closes when the call completes and refreshes the record view.

After a successful Apex response, the action shows a success confirmation message for seven seconds. After an Apex error, it shows an error confirmation message for seven seconds. The error confirmation message includes the first Apex error message when Salesforce provides one.

A success confirmation message means that the call completed with a SUCCESS response state. The controllers do not inspect the string returned by the service method.

Do not use the confirmation message as proof that the service changed a record. Open the refreshed record and check the mapped output fields.

Example Result#

These images show a Personator action on a Contact record. The mapping writes the Other Address, Personator Result Codes, and Clean Suite Personator Result fields.

../../_images/CleanSuite_GettingStarted_ValidationExample-01.png

Before validation. The Mailing Address field holds the entered value. Other Address is empty.

../../_images/CleanSuite_GettingStarted_ValidationExample-02.png

After validation. Personator standardized the street name and added the plus-4 code.

../../_images/CleanSuite_GettingStarted_ValidationExample-03.png

Before validation. The result fields are empty.

../../_images/CleanSuite_GettingStarted_ValidationExample-04.png

Permissions and Configuration#

Assign a Clean Suite permission set before users run an action. The package includes these permission set files:

  • Melissa_Global_Intelligence_Permission_Set

  • Melissa_Global_Intelligence_Permission_Set_NonAdmin

Both permission sets grant Apex class access to the six action controllers. The controllers are MD_BusinessWSExt, MD_GlobalAddressWSExt, MD_GlobalEmailWSExt, MD_GlobalPhoneWSExt, MD_PersonatorWSExt, and MD_PropertyV4WSExt.

Also give each user access to the target object, the current record, and the mapped input and output fields. A quick action does not bypass Salesforce object, record, or field security.

Configure the Clean Suite license for every service that you expose. The package service settings and mappings control the request data and destination fields.

Important Limitations#

The service methods use the object type and Custom Mapping records at run time. They do not include a separate record-layout configuration screen.

If an object has no Custom Mapping records, all six methods return an empty string. They also skip mappings whose service value does not match the action.

Some access checks also return a string instead of an Apex error. For example, BusinessCoder returns FAIL when the target object is not updateable. Global Email returns an empty string when required upsert access is missing.

In these cases, the controller can show a success confirmation message because the Apex call itself completed. Verify output fields after each test.

The action methods are synchronous Aura calls. They are different from the package doOne... methods, which use future callouts for one record.

Other Package Surfaces#

Express Entry Aura and LWC Components#

LX_ExpressEntry is an Aura Lightning page component. It supports all FlexiPage types and Experience Cloud pages. It can receive the current record ID.

LX_ExpressEntry_Flow is an Aura Screen Flow component. globalEEFreeForm is an LWC with the lightning__FlowScreen target only.

The managed package gets the Express Entry service credential internally.

Do not add these Express Entry components as record-layout quick actions. Add LX_ExpressEntry to a Lightning page. Add LX_ExpressEntry_Flow or globalEEFreeForm to a Screen Flow.

Express Entry Visualforce Overrides#

Express Entry also provides legacy Visualforce New and Edit overrides. These are action overrides, not Lightning record-layout quick actions.

Object

Standard action

Visualforce page

Account

New, Edit

MD_expressAccountEdit

Contact

New, Edit

MD_expressContactEdit

Contact

New, Edit for mobile

MD_expressContactMobileView

Lead

New, Edit

MD_expressEntryLead

Lead

New, Edit legacy

MD_expressLeadEdit

To configure an override, open the object in Object Manager. Open Buttons, Links, and Actions, then edit the standard New or Edit action. Select Visualforce Page, select the matching page, and save.

Use the mobile Contact page only for the mobile form factor. Use the modern Lightning page or Screen Flow surfaces for new Lightning implementations.

Express Entry consumes credits when it requests suggestions. It is autocomplete, not final deliverability verification. Use Personator or Global Address when the business process requires verification or standardization.

Lightning Lookups#

Clean Suite does not define a component named LightningLookup or LightningLookups.

The package uses two Aura lookup components for object, field, and saved-mapping selection. They are package controls. They are not Salesforce record lookups.

Lookup Selection Flow#

The flow shows how the package selects an object, fields, or a saved mapping.

../../_images/CleanSuite_Components_LookupSelectionFlow.png

Diagram flow

  1. Selection need → CS_customLookup object search

  2. CS_customLookup object search → Selected object

  3. Selected object → CS_CustomMappingLookup

  4. Selected batch engine → CS_CustomMappingLookup

  5. CS_CustomMappingLookup → Selected saved mapping

  6. Selected object → CS_customLookup field search

  7. CS_customLookup field search → Selected field

1. Object and Field Lookup#

CS_customLookup is a single-selection Aura component. Clean Suite uses it in Advanced Mappings and Batch Processing to select a target object.

When objectAPIName is blank, the component searches Salesforce object API names and labels. It only returns objects that the user can access and query. It does not return custom settings.

When objectAPIName contains an object API name, the component searches field API names and labels for that object. It does not return fields of type ADDRESS or ANYTYPE.

The filters attribute accepts a comma-separated list of Salesforce field display types. A nonblank value limits the returned fields to those types. A blank value does not apply a type limit.

The component uses a case-insensitive substring match. It shows no more than 20 returned items.

Select an item to store its name and label values as the selected record. Remove the selected pill to clear the selection and return to the search input.

Supported Field Types#

The component default permits these field display types:

  • STRING

  • TEXTAREA

  • PICKLIST

  • EMAIL

  • PHONE

A caller can set filters to another valid display-type list. The package source does not provide an administrator setting for this list.

2. Saved Mapping Lookup#

CS_CustomMappingLookup is a single-selection Aura component for saved Clean Suite mappings. Batch Processing uses it after the user selects an object and an engine.

The component reads mapping records for the selected object. It keeps mappings whose stored service matches the selected batch engine. It returns each matching mapping as its name and label.

The package maps these batch engine names to mapping services:

Batch engine

Mapping service

MD_PersonatorBatch

personator

MD_GlobalBatch

globalAddress

MD_GlobalPhoneBatch

globalPhone

MD_GlobalEmailBatch

globalEmail

MD_SmartMoverBatch

smartmover

MD_SmartMoverCABatch

smartmover_ca

The server query reads no more than 100 mapping records for the selected object. The component shows no more than 20 returned items.

The component sends the typed search value to the server. The mapping query does not use that value to filter mapping names. Therefore, typing does not narrow the saved-mapping result set.

3. Result Lookup Relationship Fields#

Melissa documentation also uses the name Lightning Lookups for a standard Salesforce lookup relationship field. That field points a source record at its Clean Suite result record. It is a Salesforce field, not a package component.

Create the field before you map a Lookup Field output in Advanced Mappings.

  1. Open Setup.

  2. Open Object Manager.

  3. Select the object.

  4. Open Fields & Relationships.

  5. Click New.

    ../../_images/ListwareSalesforce_LL_01_FieldsRelationships.png

    Start a new custom field on the source object.

  6. Select Lookup Relationship.

  7. Click Next.

    ../../_images/ListwareSalesforce_LL_02_LookupRelationship.png

    A lookup relationship links the record to its result record.

  8. Select the Clean Suite result object in the Related To list.

  9. Click Next.

    ../../_images/ListwareSalesforce_LL_03_SelectService.png

    For Personator results, select Clean Suite Personator Result.

  10. Enter a Field Label.

  11. Enter a Field Name.

  12. Set the description and relationship options.

  13. Click Next.

  14. Set the security settings that your org requires.

  15. Click Next.

../../_images/ListwareSalesforce_LL_05_SetSecurity.png

Grant access to the profiles that run Clean Suite.

  1. Set the page layouts.

  2. Click Next.

../../_images/ListwareSalesforce_LL_06_SetPageLayouts.png

Select the layouts that must show the field.

  1. Set the related lists.

  2. Click Save.

  3. In Advanced Mappings, open the Lookup Field output.

  4. Select the new field.

../../_images/ListwareSalesforce_LL_08_SelectNew.png

The service then writes the full response to the linked result record.

Lightning Global Express Entry#

Global Express Entry lets a user search for an address and select a suggestion. The selected values can populate address fields. It is an autocomplete service. Use another validation process when you need deliverability confirmation.

Clean Suite provides these Express Entry surfaces:

Surface

Component or page

Use

Lightning page

LX_ExpressEntry

Add address autocomplete to a record, app, home, or Experience Cloud page.

Screen Flow

globalEEFreeForm

Use this LWC in a new Screen Flow.

Screen Flow

LX_ExpressEntry_Flow

Keep this Aura component in existing Screen Flows.

Legacy Visualforce

MD_expressAccountEdit, MD_expressContactEdit, MD_expressEntryLead, or MD_expressLeadEdit

Override a standard New or Edit action.

Legacy Visualforce mobile

MD_expressContactMobileView

Use the Contact mobile override page.

Surface Selection Flow#

Select the surface that matches the page or Screen Flow where users enter addresses.

../../_images/CleanSuite_Components_SurfaceSelectionFlow.png

Diagram flow

  1. Address entry need → Lightning page component

  2. Address entry need → New Screen Flow

  3. Address entry need → Existing Aura Screen Flow

  4. Address entry need → Legacy desktop override

  5. Address entry need → Legacy Contact mobile override

  6. Lightning page component → LX_ExpressEntry

  7. New Screen Flow → globalEEFreeForm

  8. Existing Aura Screen Flow → LX_ExpressEntry_Flow

  9. Legacy desktop override → Express Entry Visualforce page

  10. Legacy Contact mobile override → MD_expressContactMobileView

Shared setup#

  1. Set the Melissa license value in MD_suiteSetting__c.customerId__c.

  2. Use the setting record named webServiceOptions.

  3. Give each user read access to the Suite Setting and its customerId__c field.

  4. Give each user access to the target object and the fields that Express Entry updates.

  5. Confirm the Express Entry remote-site configuration for https://expressentry.melissadata.net.

  6. Confirm the installed token and Express Entry named credentials are active.

The package gets its service credential internally. Do not call or expose the credential helper from subscriber code.

Legacy Visualforce pages also read these Suite Setting fields:

Field

Purpose

Fallback value in MD_ExpressEntry

eeCountry__c

Default country

US

eeMinLookup__c

Minimum input characters

3

eeToggleCase__c

Legacy casing option

MIXED

For legacy Visualforce updates, create MD_expressEntryMap__c records. The controller matches a record by objectPrefix__c. The mapping contains the street, postal code, country, city, and state field names. The controller checks object and field access before it enables Express Entry.

Lightning page component#

Add CS ExpressEntry in Lightning App Builder. LX_ExpressEntry supports all Lightning page types and receives the current record ID.

  1. Open the target Lightning page in App Builder. Click the gear icon, then select Edit Page.

    ../../_images/Salesforce_Lightning-EE_Install_01.png

    Open the record page in Lightning App Builder.

  2. Find CS ExpressEntry in the component pane. Drag it onto the page.

    ../../_images/Salesforce_Lightning-EE_Install_02.png

    Place the component where users enter an address.

  3. Select the component to open its properties.

    ../../_images/Salesforce_Lightning-EE_Install_03.png

    The properties pane opens on the right.

  4. Set the field-binding properties for the fields that the component must update. Set the search and display properties that your page needs.

    ../../_images/Salesforce_Lightning-EE_Install_04.png

    Enter the API name of each target field.

  5. Save and activate the page. Return to the record and enter an address in the search field.

    ../../_images/Salesforce_Lightning-EE_Install_05.png

    Confirm that the component returns address suggestions.

The component shows an address search field, selected address fields, Clear, and Save. Select a suggestion. Then select a suite when the service returns suite values. Select Save to update the current record.

Field bindings#

Set each property to a target field API name. Leave an optional property blank when you do not want an update.

App Builder property

Component attribute

Selected value

Street

streetObjField

Street

Suite

suiteObjField

Suite

Locality/City/Town

cityObjField

City

State/Province

stateObjField

State or province

Postal Code

postalCodeObjField

Postal code

Country

countryObjField

Country

County/SubAdministrativeArea

countyObjField

County

Latitude

latObjField

Latitude

Longitude

longObjField

Longitude

MAK Field

makObjField

MAK

BaseMAK Field

baseMAKObjField

BaseMAK

Set Combine Street and Suite (USPS standard) to combine both values in the Street target field. Otherwise, use the separate Street and Suite bindings. Set Prevent User from changing Values to disable manual edits after a selection. User Changed Values reports whether the displayed values differ from the selected values.

Other page properties are Component Header, Default Country, Minimum Input Characters, Maximum Returns, and Mixed Casing. They also include Show Lat/Long, Show County, and Full Postal Code US. The Aura component defaults to 25 returns, a minimum of 3 characters, mixed case, and US. The Cloud API returns no more than 100 results. Do not set Maximum Returns above 100.

Screen Flow components#

globalEEFreeForm#

Use globalEEFreeForm in new Screen Flows. It is available only for a Flow screen.

  1. Create or edit a Screen Flow.

  2. Add a Screen element.

  3. Add globalEEFreeForm to the screen.

  4. Set Available Countries (CSV) when the default list does not apply.

  5. Bind the required output properties to Flow variables.

  6. Use the variables in later Flow elements.

Available Countries (CSV) defaults to US,GB,DE. The component requests suggestions after more than three input characters. It requests up to 10 suggestions.

Output-only

Value after a selection

street

Delivery address

city

Locality

state

Administrative area

postalCode

Postal code

country

Two-letter ISO 3166 country code, when returned

addressLine2

Selected suite, when returned

county

Sub-administrative area

plus4Code

Postal-code extension when the selected postal code contains one

latitude

Latitude

longitude

Longitude

formattedAddress

Formatted address string

mak

Melissa Address Key

baseMAK

Base Melissa Address Key

The component also exposes output-only addressLine1. The selection code does not assign or notify this property. Do not depend on it for selected street data. Use street.

LX_ExpressEntry_Flow#

Use MD Express Entry Flow for an existing Aura-based Screen Flow.

  1. Add a Screen element.

  2. Add MD Express Entry Flow.

  3. Set the input options.

  4. Bind the output values that later Flow elements require.

  5. Save and activate the flow.

The configurable inputs include Prevent User from changing Values, Minimum Input Characters, Maximum Returns, and Mixed Casing. They also include Show County, Combine Street and Suite (USPS standard), and Full Postal Code US.

The outputs are Street, Suite, City, State, PostalCode, County, Country, Latitude, Longitude, MAK, and BaseMAK. The component also exposes userChangedValues.

Legacy Visualforce pages#

The desktop pages use MD_ExpressEntry as a controller extension:

Object

Current page

Legacy page

Account

MD_expressAccountEdit

Contact

MD_expressContactEdit

Lead

MD_expressEntryLead

MD_expressLeadEdit

For Contact mobile, use MD_expressContactMobileView. That page includes MD_expressMobileComponent twice. It passes the Contact Mailing and Contact Other map names. The component accepts record, mapping, num, and recordType attributes. Its current markup only renders the ExpressEntry Mobile heading.

To configure a legacy override:

  1. Open the object in Object Manager.

  2. Open Buttons, Links, and Actions.

  3. Edit the required New or Edit action.

  4. Select Visualforce Page.

  5. Select the page that matches the object and action.

  6. Save the action.

Test the configuration#

  1. On a Lightning page, enter an address, select a suggestion, and select Save.

  2. Confirm that each configured record field contains the selected value.

  3. In a Screen Flow, select an address and inspect the bound output variables.

  4. On a legacy override, select New or Edit and confirm that the selected Visualforce page opens.

Do not test Express Entry by calling internal package methods. Do not expose or log service credentials.

Clean Suite Advanced Mappings#

Advanced Mappings connect fields on one Salesforce object to a Clean Suite service. The mapping then identifies Salesforce fields that receive service results.

The Advanced Mappings component supports these service values:

Service shown in the component

Stored service value

Personator

personator

Global Address

globalAddress

Global Email

globalEmail

Global Phone

globalPhone

Property V4

property

BusinessCoder

businessCoder

SmartMover US

smartmover

SmartMover CA

smartmover_ca

Create a Mapping#

../../_images/Salesforce_CSAM_01_Mappings.png

A Personator Contact mapping named Mailing Address Verification. The input column sends data. The output column receives the response.

  1. Select the Salesforce object that contains the source and result fields.

    ../../_images/Salesforce_CSAM_02_SelectObjectType.png

    Enter the object name under SELECT OBJECT TYPE, then select it.

  2. Select the Clean Suite service.

  3. Enter a mapping name.

    ../../_images/Salesforce_CSAM_04_NewMapping.png

    Use a name that you can recognize later, such as Mailing Address Verification.

  4. Save the new mapping.

  5. Select the mapping in the tree.

  6. Select Salesforce fields for the service input fields.

    ../../_images/Salesforce_CSAM_05_SelectInputs.png

    Enter a field name in the text box, then select it from the list.

  7. Select Salesforce fields for the service output fields.

  8. Save all mappings.

The component groups saved mappings by object type. It creates a mapping with an empty input map and output map. The component does not require an input or output selection before it creates the mapping.

Mapping Data Flow#

The flow shows how a mapping connects source fields, a service, and result fields.

../../_images/CleanSuite_Components_MappingDataFlow.png

Diagram flow

  1. Salesforce object → Selected source fields

  2. Selected source fields → Advanced mapping

  3. Clean Suite service → Advanced mapping

  4. Advanced mapping → Service request

  5. Service request → Selected result fields

  6. Selected result fields → Salesforce object

Stored Mapping Schema#

../../_images/mapping-anatomy.svg

Structure of one saved mapping. The inputMap builds the request. The outputMap writes the response.

Clean Suite stores each advanced mapping in an MD_customMappings2__c record. The record has an objectType__c text field and a Mapping__c long-text field. Mapping__c contains the serialized mapping.

The serialized mapping has these top-level members:

MemberUse

Description

name

Mapping name.

label

Mapping label. The component sets this to the mapping name when it creates the mapping.

service

Clean Suite service value.

objectType

Salesforce object API name.

recordId

Mapping record ID. The component sets this value after it loads a saved mapping.

inputMap

Map of service input keys to selected Salesforce fields.

outputMap

Map of service output keys to selected Salesforce fields.

Each selected field is a map with name and label values. The name value is the Salesforce field API name. The label value is the field label shown to the user.

Do not create a separate fields array for an advanced mapping. The Advanced Mappings Apex wrapper expects inputMap and outputMap as maps of field-selection maps.

Input Fields#

The component shows input fields for the selected service. Select a source field only when its value fits the service input.

ServiceInput purpose shown by the component

Description

Personator

FreeForm, name, company, address, city, state, postal code, country, phone, and email.

Property V4

Street address, city, state, postal code, and country.

BusinessCoder

Company, address, city, state, postal code, country, stock ticker symbol, and web URL.

Global Address

Organization, address lines 1 through 8, city or town, state or province, postal code, and country.

Global Email

Email.

Global Phone

Phone, country, and country of origin.

SmartMover US and SmartMover CA

Name, company, address, city, state, postal code, country, phone, and email.

For example, Global Email reads the field selected by its email input entry. It queries the selected field from the mapping object before it sends the email value to the service.

Minimum inputs#

Each Melissa service accepts a defined set of minimum inputs. Map at least one complete set for the service that you select.

ServiceAccepted minimum input sets

Description

Personator

Address plus postal code. Address plus city and state. Address plus last line. Email. Phone. Full name. IP address. FreeForm. Melissa Address Key. Melissa Identity Key.

Global Address

Address line 1, city, state or province, postal code, and country.

Global Email

Email.

Global Phone

Phone.

BusinessCoder

Address plus city, state, and postal code. FreeForm. Phone. Stock ticker symbol. Web URL.

Property V4

FIPS code plus APN. Melissa Address Key. FreeForm.

SmartMover US and SmartMover CA

A name and an address together. For the name use full name, or first and last name, or company. For the address use address line 1, plus city and state or postal code.

Personator accepts either FreeForm or the parsed fields. When you map the parsed fields, the minimum is address plus city and state, or address plus postal code.

For Personator, BusinessCoder, and Property, any one listed set is enough. SmartMover is different. It needs both a name and an address. Melissa records full name as required unless you map the parsed name inputs.

Each minimum input set comes from the Melissa Cloud API reference guide for that service on docs.melissa.com.

Output Fields#

The component shows a separate output list for each service. Select the Salesforce field that must receive each available service result. Leave an output unselected when the object does not need that result.

Clean Suite uses the name value from each output entry to select the target field. It writes a value only for output entries that have a nonblank field name.

For example, Global Email can use output entries for the saved result record, result codes, and email. It can also use an output entry for the deliverability confidence score. The service code writes these values from its saved response only when the related output entry exists.

The output keys are service-specific. Use the fields that the Advanced Mappings component displays for the selected service. Do not copy output keys from another Clean Suite service.

Map an output to a Salesforce picklist field only when the output value matches a picklist value.

Personator returns the state twice. State returns the two-letter abbreviation, such as CA. StateName returns the full name, such as California. Melissa added StateName for picklists that store full state names.

Global Address returns the United States state as a two-letter abbreviation in AdministrativeArea. CountrySubdivisionCode returns an ISO 3166-2 code, such as US-CA. Do not map CountrySubdivisionCode to a State picklist.

Validation and Save Behavior#

The component does not validate a complete mapping before it saves it. It lets you save a mapping with empty input and output maps. It also does not check that a selected field has the correct business meaning for a service input or output.

The server deserializes the mapping into its mapping wrapper and stores the serialized mapping. A save error can occur when Salesforce access or data operations fail. The component then shows an error message.

A successful save does not prove that the mapping can run. The service must later read the selected source fields and write the selected result fields.

Safe Practices#

  • Use a clear, unique mapping name. The mapping name identifies saved service results for at least Global Email.

  • Map fields on the selected object only. The component queries and updates the mapping object.

  • Use Salesforce field API names selected by the component. Do not hand-edit Mapping__c.

  • Confirm that input fields contain values that match the selected service input.

  • Confirm that output fields accept the returned value type.

  • Give users access to the mapping object and the selected Salesforce fields.

  • Test one record after you save a new or changed mapping.

  • Change one service mapping at a time. A mapping can affect later service requests and field updates.

Clean Suite Batch Processing#

The Clean Suite Batch Processing tab starts Salesforce Batch Apex jobs. The tab uses the CS_CleanSuiteBatch Lightning component and MD_CleanSuiteBatchController.

Before you start a job, check the settings in Administration and Advanced Mappings. The tab shows this warning.

Supported engines#

The tab shows these engine options when it starts:

Engine label

Controller value

Batch implementation

Personator

MD_PersonatorBatch

MDPERSONATOR.MD_PersonatorBatch

Global Address

MD_GlobalBatch

MDPERSONATOR.MD_GlobalBatch

Global Phone

MD_GlobalPhoneBatch

MDPERSONATOR.MD_GlobalPhoneBatch

Global Email

MD_GlobalEmailBatch

MDPERSONATOR.MD_GlobalEmailBatch

SmartMover US

MD_SmartMoverBatch

MD_SmartMoverJobWSExt with NCOA

SmartMover Canada

MD_SmartMoverCABatch

MD_SmartMoverJobWSExt with CCOA

Personator, Global Address, Global Phone, and Global Email do not need a SmartMover agreement check.

SmartMover options have separate availability rules. The controller reads the newest webServiceOptions settings record. It can evaluate those rules only when the current user can read both agreement fields. SmartMover US requires SmartMoverAgreement__c to be true. SmartMover Canada requires SmartMoverCAAgreement__c to be true.

If no engine is available, the tab disables Start Batch Job.

Batch Dispatch Flow#

This flow shows how the tab sends selected inputs to the batch controller. The controller then queues a job for the selected engine.

../../_images/CleanSuite_Components_BatchDispatchFlow.png

Diagram flow

  1. Selected engine → Batch controller

  2. Selected Salesforce object → Final SOQL query

  3. Selected batch conditions → Final SOQL query

  4. Selected mapping → Batch controller

  5. Final SOQL query → Batch controller

  6. Batch controller → Standard Batch Apex engine

  7. Batch controller → SmartMover batch implementation

  8. Standard Batch Apex engine → Salesforce queues the batch job

  9. SmartMover batch implementation → Salesforce queues the batch job

Start a batch job#

../../_images/batch-lifecycle.svg

Batch Apex stages, record chunking, and what the job writes back.

  1. Open Clean Suite Batch Processing.

  2. In Step 1: Select an Engine, select an engine.

    ../../_images/Salesforce_Batch_01_SelectEngine.png

    Select the engine that processes your records.

  3. In Step 2: Select an Object, select the Salesforce object.

    ../../_images/Salesforce_Batch_02_SelectObject.png

    Standard objects and custom objects are supported.

  4. In Step 3: Select a Mapping, select a mapping for that object and engine.

    ../../_images/Salesforce_Batch_03_SelectMapping.png

    The mapping must exist for the selected object type.

  5. In Step 4: Define Batch Conditions, select the record set.

    ../../_images/Salesforce_Batch_04_DefineConditions.png

    Select Process records in Custom Query to enter a SOQL query.

  6. Click Start Batch Job.

    ../../_images/Salesforce_Batch_05_StartBatchJob.png

    Find the job status on the Apex Jobs setup page.

The component requires an object and a mapping. If either value is empty, it does not send the request. It shows an error instead.

The component shows a queue confirmation after Salesforce accepts the request. It then disables Start Batch Job for the current page view.

Define the record set#

The tab has three Batch Settings options.

OptionController behavior

Description

Process all records

The controller sends ProcessAll as true.

Process only unvalidated records

The controller sends ProcessAll as false. The selected batch engine applies this setting.

Process records in Custom Query

The tab shows Custom Query and sends its text as the batch SOQL query.

For the first two options, the controller builds SELECT Id FROM <selected object>. For a custom query, the controller sends the entered query without changing it.

The Lightning tab always sends record update as enabled. It does not show a record-update choice.

Check that the custom query, selected object, and selected mapping refer to the same object. The component checks only that the object and mapping values are not empty.

All dispatched jobs use a Salesforce batch size of 100.

Record volume#

The tab sends a SOQL query string to every engine. Each engine returns a query locator from its start method. A query locator is not subject to the 50,000-record limit of a synchronous SOQL read. Jobs that you start from this tab therefore have no 50,000-record ceiling. This includes SmartMover.

The 50,000-record limit applies to custom Apex instead. A synchronous transaction can read no more than 50,000 records with SOQL. Some package entry points accept a collection that the caller gathers first. MD_PersonatorBatchList accepts a record list. MD_SmartMoverJobWSExt also accepts a set of record IDs. Those paths are subject to the limit.

Standard engine dispatch

Standard engine dispatch#

For Personator, Global Address, Global Email, and Global Phone, the controller sends the final SOQL query and selected mapping. It sends record update enabled and the selected ProcessAll value. It also sends the Clean Suite batch flag as true.

These engines receive the selected batch condition. SmartMover does not use the record-update or ProcessAll values from this tab.

SmartMover batch jobs#

SmartMover uses a separate batch implementation. The tab shows SmartMover Options only after you select SmartMover US or SmartMover Canada.

Use the SmartMover options as follows:

  1. Enter List Name when you need a list name.

  2. Use the same list name across runs when you want the interface to group them in one report.

  3. Enter Job ID only when you need a specific SmartMover job identifier.

  4. Leave either field empty to use its default behavior.

If Job ID is empty, the controller creates an identifier that starts with SMJOB-. If List Name is empty, it sends an empty list name.

The controller sends SmartMover US to the NCOA action. It sends SmartMover Canada to the CCOA action. Both paths use MD_SmartMoverJobWSExt and the selected SOQL query. This class uses a Database.QueryLocator for the query.

SmartMover validates that the selected mapping exists for the query object. It creates or updates a SmartMover Job record when processing starts. The record stores the job ID, list name, mapping name, and status.

SmartMover writes SmartMover result records and applies configured output mappings to the source records. It marks the SmartMover Job record Completed after normal processing. It marks the record Failed after a SmartMover transmission error or a start error. When the response contains report-link data, the job record can store NCOA, CCOA, and CASS report links.

Monitor jobs#

The Lightning batch tab confirms only that Salesforce queued the job. It does not show batch progress or poll job status.

In Setup, open Apex Jobs. Use this page to monitor each queued batch. The controller also has a status method for a job ID. The method returns the Salesforce status, error count, processed items, and total items.

For SmartMover, also review SmartMover Jobs. This object tracks SmartMover-specific status, list name, mapping name, total processed records, and available report links. Review the related SmartMover result records when you need record-level output.

The older Listware Batch Jobs page refreshes its job list every five seconds. It lists Batch Apex jobs whose Apex class name starts with MD and ends with Batch. SmartMover does not appear there because its class is MD_SmartMoverJobWSExt.

Visualforce Pages#

Clean Suite includes 19 Visualforce pages in the package source. This page lists those pages and their source-defined roles.

Express Entry Overrides#

Use an Express Entry override when a user must open an Express-Entry-aware Visualforce form from a standard action. The supported standard objects are Account, Contact, and Lead.

Override Route#

Use this route to select the Visualforce page for an Express Entry action.

../../_images/CleanSuite_Components_OverrideRoute.png

Diagram flow

  1. Start with a standard action → Select Account, Contact, or Lead

  2. Select Account, Contact, or Lead → Open the New or Edit action

  3. Open the New or Edit action → Select a Visualforce page

  4. Select a Visualforce page → Select the page for the object and form factor

  5. Select the page for the object and form factor → Save the action

  6. Save the action → Open the Express Entry form

Object

Action

Visualforce page

Role

Account

New or Edit

MDPERSONATOR__MD_expressAccountEdit

Desktop Account edit form. It uses the MD_ExpressEntry extension.

Contact

New or Edit

MDPERSONATOR__MD_expressContactEdit

Desktop Contact edit form. It uses the MD_ExpressEntry extension.

Contact

New or Edit on mobile

MDPERSONATOR__MD_expressContactMobileView

Contact page that uses MD_expressMobileComponent.

Lead

New or Edit

MDPERSONATOR__MD_expressEntryLead

Current Lead override page. It uses the MD_ExpressEntry extension.

Lead

New or Edit, legacy

MDPERSONATOR__MD_expressLeadEdit

Legacy Lead edit form. It uses the MD_ExpressEntry extension.

Configure an Override#

  1. Open Setup > Object Manager.

  2. Select Account, Contact, or Lead.

  3. Open Buttons, Links, and Actions.

  4. Edit the New or Edit action.

  5. Select Visualforce Page.

  6. Select the page for the object and form factor from the table.

  7. Save the action.

Configure the Contact mobile form factor separately. Select MD_expressContactMobileView for that form factor.

Before You Use an Express Entry Page#

The MD_ExpressEntry extension reads MD_expressEntryMap__c records. Each record matches an object prefix and defines street, postal, country, city, and state fields.

The extension checks that the record object is accessible and queryable. It also checks that each mapped field is accessible and updateable. The extension disables Express Entry when a required mapping is missing or a mapped field does not pass these checks.

Use the current Lead page, MD_expressEntryLead, for a new Lead override. Keep MD_expressLeadEdit only when an existing legacy override requires it.

Install a Single-Record Service Page#

The package includes Visualforce pages that show a Clean Suite service on a Contact record. These pages are designed for the View action, not for the New or Edit action.

Install one of these pages when a user must see service results on the record page.

  1. Open Setup. Open Object Manager and select Contact. Open Buttons, Links, and Actions.

    ../../_images/LWS_Menu_Build-Contacts-Buttons1.png

    In Salesforce Classic, the same page is under Customize > Contacts.

  2. Click Edit next to the View action.

    ../../_images/LWS_Build_BCB_View1.png

    The packaged single-record pages are designed for the View action.

  3. Select Visualforce Page. Next to Override With, select the page for the component that you need.

    ../../_images/LWS_Build_BCB_EditView1.png

    The example selects MD_personatorContact for the View action.

  4. Click Save.

Select the page that matches the Clean Suite component that you need.

Visualforce page

Clean Suite component

MD_personatorContact

Personator

MD_globalContact

Global Address Verification

MD_propertyContact

Property

You do not have to use a packaged page. To show a service on another object, copy a packaged page and adapt it. The next section describes that procedure.

Custom Visualforce Pages#

The packaged pages are read-only. To use a packaged page on another object, copy its markup into a new page in your org.

  1. Open Setup. In Quick Find, enter Visualforce Pages.

    ../../_images/LWS_Menu_Build-Develop-Pages1.png

    In Salesforce Classic, the same page is under Develop > Pages.

  2. Open the packaged page that you want to copy. Clean Suite pages use the MDPERSONATOR namespace.

    ../../_images/LWS_Menu_Build-DP-PersonatorContact1.png

    The example opens MD_personatorContact.

  3. Select the markup from <apex:page> to the closing </apex:page> tag. Copy it.

    ../../_images/LWS_Menu_Build-DP-PersonatorContact_Copy1.png

    Copy the complete markup block.

  4. Return to Visualforce Pages and click New.

    ../../_images/LWS_Visualforce_New1.png

    A new page opens in the org namespace.

  5. Paste the markup. Replace the source object name with the target object name. Enter a label and a name, then save.

    ../../_images/LWS_Visualforce_Edit1.png

    For a Lead page, replace each Contact reference with Lead.

Test the new page before you assign it to a standard action. A copied page keeps the packaged controller extension. Confirm that the extension supports the target object.

Page Inventory#

Administration and Batch Pages#

Page

Controller

Role from source

MD_administration

Standard controller: MD_suiteSetting__c.

Extension: MD_AdminExt.

Administration page for Clean Suite settings.

MD_batchProcess

MD_BatchProcessExt

Batch Processing page. It selects an object type and shows batch options.

MD_customMappings

MD_CustomMappings

Custom Mappings page. It accepts an object API name and shows input and output mappings.

Express Entry Pages#

Page

Controller

Role from source

MD_expressAccountEdit

Standard controller: Account.

Extension: MD_ExpressEntry.

Account edit page.

MD_expressContactEdit

Standard controller: Contact.

Extension: MD_ExpressEntry.

Contact edit page.

MD_expressContactMobileView

Standard controller: Contact.

Contact mobile page. It includes MD_expressMobileComponent.

MD_expressEntryLead

Standard controller: Lead.

Extension: MD_ExpressEntry.

Lead Express Entry page.

MD_expressLeadEdit

Standard controller: Lead.

Extension: MD_ExpressEntry.

Lead edit page.

Single-Record Service Pages#

Page

Controller

Role from source

MD_businessAccount

Standard controller: Account.

Extension: MD_BusinessWSExt.

Account page with the Lookup Business action.

MD_globalContact

Standard controller: Contact.

Extension: MD_GlobalWSExt.

Contact page with the Global Verify action.

MD_personatorAccount

Standard controller: Account.

Extension: MD_PersonatorWSExt.

Account page with the Personate action.

MD_personatorContact

Standard controller: Contact.

Extension: MD_PersonatorWSExt.

Contact page with the Personate action.

MD_personatorLead

Standard controller: Lead.

Extension: MD_PersonatorWSExt.

Lead page with the Personate action.

MD_propertyContact

Standard controller: Contact.

Extension: MD_PropertyWSExt.

Contact detail section for property data. It includes the Get Property Details custom button.

List Pages#

The list pages below are Visualforce shells. Their source declares a standard controller and a record-set variable. Some pages also declare a list controller extension.

Page

Standard controller

Record-set variable

Extension

MD_businessListAccount

Account

contacts

MD_BusinessListController

MD_globalContactList

Contact

contacts

MD_GlobalListController

MD_personatorAccountList

Account

accounts

None

MD_personatorContactList

Contact

contacts

None

MD_personatorLeadList

Lead

leads

None

Scope#

This inventory includes only .page files in force-app/main/default/pages. It does not list Aura, Lightning Web, Flow, or Visualforce component files.

Result Code Status Indicator#

Purpose#

Clean Suite includes the Aura component CleanSuiteResultcodeIndicator. Salesforce lists the component as CS ResultCodeIndicator.

The component reads one field from the current record. It compares that field value with up to three regular expressions. It then shows a title and one colored message panel.

Use this component on a Lightning page that has a record ID. The component is available for Lightning page types through flexipage.

This component does not interpret Clean Suite result codes by itself. You define the field, regular expressions, messages, and colors.

Rule Evaluation Flow#

The flow shows how the component evaluates a field and selects a status panel.

../../_images/CleanSuite_Components_RuleEvaluationFlow.png

Diagram flow

  1. Read the configured field → Field has a value?

  2. Field has a value? → Keep the default message: No Match (No)

  3. Field has a value? → Matches expression 1? (Yes)

  4. Matches expression 1? → Show status entry 1 (Yes)

  5. Matches expression 1? → Matches expression 2? (No)

  6. Matches expression 2? → Show status entry 2 (Yes)

  7. Matches expression 2? → Matches expression 3? (No)

  8. Matches expression 3? → Show status entry 3 (Yes)

  9. Matches expression 3? → Show No Match (No)

Add the Component#

  1. Open the target record page. Click the gear icon, then select Edit Page.

    ../../_images/Salesforce_ResultCode_Setup1.png

    The record page opens in Lightning App Builder.

  2. Drag CS ResultCodeIndicator onto the page.

To set the title, field, expressions, messages, and colors, see Configure Status Entries.

The component uses the configured field name to read the field from the current record. It does not update that field or another record field.

Configure Status Entries#

  1. Select the component on the page to open its settings.

    ../../_images/Salesforce_ResultCode_ResultStatusIndicator.png

    The settings pane opens on the right side of App Builder.

  2. Set Title to the heading that the panel shows.

    ../../_images/Salesforce_ResultCode_Field-Title.png

    The example uses Address Verification.

  3. Set Field Name to the API name of the field to evaluate.

    ../../_images/Salesforce_ResultCode_Field-FieldName.png

    The example uses the API name MDPERSONATOR__PersonatorResults__c.

  4. Set the message for each status entry.

    ../../_images/Salesforce_ResultCode_Field-InvalidRecordMessage.png

    The panel shows this text when the matching expression is true.

  5. Set the regular expression for each status entry.

    ../../_images/Salesforce_ResultCode_Field-InvalidRecordREGEX.png

    The expression runs against the value in the configured field.

  6. Set the color for each status entry.

    ../../_images/Salesforce_ResultCode_Field-InvalidRecordColor.png

    The Invalid Record Color setting takes a hexadecimal value, such as #E74C3C.

  7. Click Save.

    ../../_images/Salesforce_ResultCode_SaveForm.png

    The page editor toolbar holds the Analyze, Activation, and Save controls.

  8. Click Activation to activate the page.

The component does not appear on the record page until the page is active.

The component design exposes these three configuration groups:

Status entry

Message setting

Regular-expression setting

Color setting

1

Invalid Record Message

Invalid Record REGEX

Invalid Record Color

2

Partially Valid Record Message

Partially Valid Record REGEX

Partially Valid Record Color

3

Valid Record Message

Valid Record REGEX

Valid Record Color

The component checks the expressions in this order: 1, 2, then 3. The first matching expression sets the message and background color.

Shipped Defaults#

The component design supplies these default values. The defaults are address-oriented.

Status entry

Default message

Default expression

Default color

1

Invalid Record

AE

#E74C3C

2

Partially Valid Record

AS0[2]

#FFC433

3

Valid Record

AS0[1,3]

#2ECC71

These defaults are a starting configuration only. They are not a Clean Suite interpretation of a result code.

The design labels describe the configuration groups. The runtime does not assign a meaning to a result-code family. Use expressions that match the values stored in your selected field.

The default expressions match address codes. Change them when your field stores email, phone, or another service result. Configure the expressions and messages for the result codes that your mapping stores.

The default colors do not follow the Melissa palette. Set the color values that your page design requires.

The component shows white text on the color that you set. The three default colors do not give enough contrast for white text. Set a color that has a contrast ratio of at least 4.5:1 against white.

Configured Example#

../../_images/Salesforce_ResultCode_VerificationLevelsExample.png

Three components on one record page. Each panel matches a different code family in the same PersonatorResults field.

Configure Result-Code Matches#

Use Result Codes when you configure expressions.

Result values are comma-delimited code strings. Match full codes, not only code prefixes.

For example, (?:^|,)AS01(?:,|$) matches AS01 as a complete code. It also matches a value such as AS01,AS14.

Put the highest-priority expression first. The component uses the first expression that matches.

Do not use one expression for every service. Configure messages for the service and code family in your result field.

No-Match and Field Behavior#

If a nonempty field value matches none of the three expressions, the component shows No Match. It uses the noMatchColor value for that state. The component default for noMatchColor is #D3D3D3.

If the selected field has no value, the controller does not select a status entry. The component keeps its initial message value, which is No Match. The panel therefore shows No Match for an empty field and for a nonmatching value.

If Field Name is empty, the controller does not request a field value.

The component evaluates the field when it initializes. It evaluates the field again after force:recordData reports a CHANGED update.

Results and Logs#

The indicator evaluates one configured field. It does not show batch-job results or a Clean Suite log.

If the server cannot read the configured field, MD_UtilExt.getFieldValue writes a Clean Suite log record. The indicator controller does not show a separate error message for that failure.

Use the Clean Suite Log tab to review batch-job and API-call logging. Use the result fields and result objects that your Clean Suite mapping creates to review service results.