diff --git a/modules/salesforce_mapping/config/schema/salesforce_mapping.schema.yml b/modules/salesforce_mapping/config/schema/salesforce_mapping.schema.yml index e57bff2d1e10006249c56940764c2a7b958dc9e7..a3371b3e63829d9ae5cbccc79916aeef1f797bba 100644 --- a/modules/salesforce_mapping/config/schema/salesforce_mapping.schema.yml +++ b/modules/salesforce_mapping/config/schema/salesforce_mapping.schema.yml @@ -49,6 +49,9 @@ salesforce_mapping.salesforce_mapping.*: pull_where_clause: type: string label: 'Pull query SOQL "WHERE" clause' + pull_record_type_filter: + type: mapping + label: 'Pull query record type filter' sync_triggers: type: mapping label: 'Sync triggers' diff --git a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php index 5c768feb89040ff02a1ab47c1d6d864231e75947..f1148cf7337d408f5e8ace8144e22e99b30d3867 100644 --- a/modules/salesforce_mapping/src/Entity/SalesforceMapping.php +++ b/modules/salesforce_mapping/src/Entity/SalesforceMapping.php @@ -40,6 +40,7 @@ use Drupal\salesforce_mapping\MappingConstants; * "pull_standalone", * "pull_trigger_date", * "pull_where_clause", + * "pull_record_type_filter", * "sync_triggers", * "salesforce_object_type", * "drupal_entity_type", @@ -140,6 +141,13 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt */ protected $pull_where_clause = ''; + /** + * Pull query record type filter. + * + * @var array + */ + protected $pull_record_type_filter = []; + /** * The drupal entity type to which this mapping points. * @@ -686,6 +694,18 @@ class SalesforceMapping extends ConfigEntityBase implements SalesforceMappingInt if (!empty($this->pull_where_clause)) { $soql->conditions[] = [$this->pull_where_clause]; } + if (!empty($this->pull_record_type_filter)) { + $record_types = []; + foreach ($this->pull_record_type_filter as $enabled) { + if ($enabled) { + $record_types[] = $enabled; + } + } + if (!empty($record_types)) { + $record_types_list = implode("', '", $record_types); + $soql->conditions[] = ["RecordType.Id IN ('" . $record_types_list . "')"]; + } + } $soql->order[$this->getPullTriggerDate()] = 'ASC'; return $soql; } diff --git a/modules/salesforce_mapping/tests/modules/salesforce_mapping_test/config/install/salesforce_mapping.salesforce_mapping.test_mapping.yml b/modules/salesforce_mapping/tests/modules/salesforce_mapping_test/config/install/salesforce_mapping.salesforce_mapping.test_mapping.yml index d6ea961140918513cc6a49d6e3a053b9891f8517..ae3647ef8d00e97f807225fc70a6c365b95c2fdc 100644 --- a/modules/salesforce_mapping/tests/modules/salesforce_mapping_test/config/install/salesforce_mapping.salesforce_mapping.test_mapping.yml +++ b/modules/salesforce_mapping/tests/modules/salesforce_mapping_test/config/install/salesforce_mapping.salesforce_mapping.test_mapping.yml @@ -25,6 +25,7 @@ push_standalone: false pull_standalone: false pull_trigger_date: LastModifiedDate pull_where_clause: '' +pull_record_type_filter: [] sync_triggers: push_create: true push_update: true diff --git a/modules/salesforce_mapping_ui/src/Form/SalesforceMappingFormCrudBase.php b/modules/salesforce_mapping_ui/src/Form/SalesforceMappingFormCrudBase.php index a4fbc1fcf7f268d8d534a1474a52f416a083a7ef..91437811638a75936d954e91de981d9575a52da6 100644 --- a/modules/salesforce_mapping_ui/src/Form/SalesforceMappingFormCrudBase.php +++ b/modules/salesforce_mapping_ui/src/Form/SalesforceMappingFormCrudBase.php @@ -116,12 +116,16 @@ abstract class SalesforceMappingFormCrudBase extends SalesforceMappingFormBase { ]; $salesforce_object_type = ''; + $salesforce_object = NULL; if (!empty($form_state->getValues()) && !empty($form_state->getValue('salesforce_object_type'))) { $salesforce_object_type = $form_state->getValue('salesforce_object_type'); } elseif ($mapping->salesforce_object_type) { $salesforce_object_type = $mapping->salesforce_object_type; } + if (!empty($salesforce_object_type)) { + $salesforce_object = $this->client->objectDescribe($salesforce_object_type); + } $form['salesforce_object']['salesforce_object_type'] = [ '#title' => $this->t('Salesforce Object'), '#id' => 'edit-salesforce-object-type', @@ -218,11 +222,18 @@ abstract class SalesforceMappingFormCrudBase extends SalesforceMappingFormBase { '#default_value' => $mapping->pull_where_clause, ]; - $form['pull']['pull_where_clause'] = [ - '#title' => $this->t('Pull query SOQL "Where" clause'), - '#type' => 'textarea', - '#description' => $this->t('Add a "where" SOQL condition clause to limit records pulled from Salesforce. e.g. Email != \'\' AND RecordType.DevelopName = \'ExampleRecordType\''), - '#default_value' => $mapping->pull_where_clause, + $record_type_options = []; + if ($salesforce_object && !empty($salesforce_object->recordTypeInfos)) { + foreach ($salesforce_object->recordTypeInfos as $record_type_info) { + $record_type_options[$record_type_info['recordTypeId']] = $record_type_info['name']; + } + } + $form['pull']['pull_record_type_filter'] = [ + '#title' => $this->t('Record Types to Request'), + '#type' => 'checkboxes', + '#options' => $record_type_options, + '#description' => $this->t('Restrict the record types to pull from Salesforce. If you set no values, all types will be requested.'), + '#default_value' => $mapping->pull_record_type_filter ?: [], ]; $form['pull']['pull_frequency'] = [