External Data Providers
Conceptadmin
Baucore imports project data from more than one external source — ibau, Barbour ABI, MyProjectSales, and even Baucore Inbox’s email extraction — and all of them run on the same underlying provider framework rather than separate, one-off integrations. Understanding this shared layer makes it easier to configure any one provider, and it’s exactly what you’d extend to add a new one.
The core objects
| Object | Purpose |
|---|---|
Prov_Search__c | A saved search profile for a provider — encodes search parameters (region, project type, phase, etc.) as JSON, plus sync frequency (Daily/Weekly/Monthly/Yearly) and which user newly-imported records are assigned to. |
Prov_Field_Mapping__c | Maps a field coming from the provider’s data to a Salesforce target object and field. Each provider is identified by a value in the Provider__c picklist (e.g. baucoreInbox for Baucore Inbox). |
Prov_Picklist_Mapping__c | Maps a provider’s picklist string value to the corresponding Salesforce picklist API value, for any mapped picklist field. |
Ext_Project_Credential__c | Per-user provider credentials (username, password, login code), validated against the provider’s API on save, with the result written to a Status field. Uses Private sharing — only the owner and admins can see a given credential. |
How a sync run works, end to end
- A scheduled job (a provider-specific scheduler, e.g.
ibau_Sync_Schedulerorabi_Sync_Scheduler) iterates over activeProv_Search__cprofiles. - For each profile, it calls the provider’s API using the stored
Ext_Project_Credential__cand the JSON search parameters insearchstring__c. - Returned records are mapped to Salesforce fields via
Prov_Field_Mapping__c, with picklist values translated viaProv_Picklist_Mapping__c. - Participant creation follows the same role-mapping logic across every provider: a role that’s already mapped creates the participant automatically; an unmapped role holds for the user to map it before creation.
- If
Auto_Sync__cis enabled on the search profile, subsequent changes detected by the provider are imported automatically on the next scheduled run — otherwise, matches are surfaced for a user to review and link manually.
Credential hygiene
Only one active credential (Active__c = true) should exist per user per provider. Deactivate an old credential before activating its replacement — the trigger handler re-validates against the provider API whenever a credential is inserted or updated.
Adding a new provider
This is the same pattern every existing provider follows:
- Create a new
Ext_Project_Credential__crecord type/flow for the provider’s authentication. - Add
Prov_Field_Mapping__crecords with a newProvider__cvalue identifying the provider. - Add
Prov_Picklist_Mapping__crecords for any picklist fields that need value translation. - Implement a parser analogous to the existing provider converters, and a scheduler to drive it.
- Reuse the existing invocable classes (
ProvCheckParticipant,ProvUpsertParticipantRecord) andParticipant_Data.getParticipantBasedOnProjectAndAccount()for participant creation and deduplication — there’s no need to reimplement this layer per provider.