diff --git a/datahub-web-react/src/images/logo-salesforce.svg b/datahub-web-react/src/images/logo-salesforce.svg new file mode 100644 index 00000000000000..a9a4d2b04239c8 --- /dev/null +++ b/datahub-web-react/src/images/logo-salesforce.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/metadata-ingestion/docs/sources/salesforce/salesforce.md b/metadata-ingestion/docs/sources/salesforce/salesforce.md new file mode 100644 index 00000000000000..61963c8da8b99a --- /dev/null +++ b/metadata-ingestion/docs/sources/salesforce/salesforce.md @@ -0,0 +1,30 @@ +### Prerequisites + +In order to ingest metadata from Salesforce, you will need: + +- Salesforce username, password, [security token](https://developer.Salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_concepts_security.htm) OR +- Salesforce instance url and access token/session id (suitable for one-shot ingestion only, as access token typically expires after 2 hours of inactivity) + +## Integration Details +This plugin extracts Salesforce Standard and Custom Objects and their details (fields, record count, etc) from a Salesforce instance. +Python library [simple-salesforce](https://pypi.org/project/simple-salesforce/) is used for authenticating and calling [Salesforce REST API](https://developer.Salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_what_is_rest_api.htm) to retrive details from Salesforce instance. + +### REST API Resources used in this integration +- [Versions](https://developer.Salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_versions.htm) +- [Tooling API Query](https://developer.salesforce.com/docs/atlas.en-us.api_tooling.meta/api_tooling/intro_rest_resources.htm) on objects EntityDefinition, EntityParticle, CustomObject, CustomField +- [Record Count](https://developer.Salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_record_count.htm) + +### Concept Mapping + +This ingestion source maps the following Source System Concepts to DataHub Concepts: + +| Source Concept | DataHub Concept | Notes | +| -- | -- | -- | +| `Salesforce` | [Data Platform](../../metamodel/entities/dataPlatform.md) | | +|Standard Object | [Dataset](../../metamodel/entities/dataset.md) | subtype "Standard Object" | +|Custom Object | [Dataset](../../metamodel/entities/dataset.md) | subtype "Custom Object" | + +### Caveats +- This connector has only been tested with Salesforce Developer Edition. +- This connector only supports table level profiling (Row and Column counts) as of now. Row counts are approximate as returned by [Salesforce RecordCount REST API](https://developer.Salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/resources_record_count.htm). +- This integration does not support ingesting Salesforce [External Objects](https://developer.Salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_external_objects.htm) \ No newline at end of file diff --git a/metadata-ingestion/docs/sources/salesforce/salesforce_recipe.yml b/metadata-ingestion/docs/sources/salesforce/salesforce_recipe.yml new file mode 100644 index 00000000000000..4fa50fd2606447 --- /dev/null +++ b/metadata-ingestion/docs/sources/salesforce/salesforce_recipe.yml @@ -0,0 +1,25 @@ +pipeline_name: my_salesforce_pipeline +source: + type: "salesforce" + config: + instance_url: "https://mydomain.my.salesforce.com/" + username: user@company + password: password_for_user + security_token: security_token_for_user + platform_instance: mydomain-dev-ed + domain: + sales: + allow: + - "Opportunity$" + - "Lead$" + + object_pattern: + allow: + - "Account$" + - "Opportunity$" + - "Lead$" + +sink: + type: "datahub-rest" + config: + server: "http://localhost:8080" \ No newline at end of file diff --git a/metadata-ingestion/setup.py b/metadata-ingestion/setup.py index 053aed2acf8f75..3a38e3271e1f84 100644 --- a/metadata-ingestion/setup.py +++ b/metadata-ingestion/setup.py @@ -260,6 +260,7 @@ def get_long_description(): "sqllineage==1.3.5", }, "sagemaker": aws_common, + "salesforce":{"simple-salesforce"}, "snowflake": snowflake_common, "snowflake-usage": snowflake_common | usage_common @@ -364,6 +365,7 @@ def get_long_description(): "starburst-trino-usage", "powerbi", "vertica", + "salesforce" # airflow is added below ] for dependency in plugins[plugin] @@ -507,6 +509,7 @@ def get_long_description(): "vertica = datahub.ingestion.source.sql.vertica:VerticaSource", "presto-on-hive = datahub.ingestion.source.sql.presto_on_hive:PrestoOnHiveSource", "pulsar = datahub.ingestion.source.pulsar:PulsarSource", + "salesforce = datahub.ingestion.source.salesforce:SalesforceSource", ], "datahub.ingestion.sink.plugins": [ "file = datahub.ingestion.sink.file:FileSink", diff --git a/metadata-ingestion/src/datahub/ingestion/source/salesforce.py b/metadata-ingestion/src/datahub/ingestion/source/salesforce.py new file mode 100644 index 00000000000000..7afbbe33d12577 --- /dev/null +++ b/metadata-ingestion/src/datahub/ingestion/source/salesforce.py @@ -0,0 +1,737 @@ +import json +import logging +import time +from datetime import datetime +from enum import Enum +from typing import Dict, Iterable, List, Optional + +import requests +from pydantic import Field, validator +from simple_salesforce import Salesforce + +import datahub.emitter.mce_builder as builder +from datahub.configuration.common import ( + AllowDenyPattern, + ConfigModel, + ConfigurationError, +) +from datahub.configuration.source_common import DatasetSourceConfigBase +from datahub.emitter.mcp import MetadataChangeProposalWrapper +from datahub.emitter.mcp_builder import add_domain_to_entity_wu +from datahub.ingestion.api.common import PipelineContext, WorkUnit +from datahub.ingestion.api.decorators import ( + SourceCapability, + SupportStatus, + capability, + config_class, + platform_name, + support_status, +) +from datahub.ingestion.api.source import Source, SourceReport +from datahub.ingestion.api.workunit import MetadataWorkUnit +from datahub.metadata.schema_classes import ( + AuditStampClass, + BooleanTypeClass, + BytesTypeClass, + ChangeTypeClass, + DataPlatformInstanceClass, + DatasetProfileClass, + DatasetPropertiesClass, + DateTypeClass, + DictWrapper, + EnumTypeClass, + ForeignKeyConstraintClass, + GlobalTagsClass, + NullTypeClass, + NumberTypeClass, + OperationClass, + OperationTypeClass, + OtherSchemaClass, + RecordTypeClass, + SchemaFieldClass, + SchemaFieldDataTypeClass, + SchemaMetadataClass, + StringTypeClass, + SubTypesClass, + TagAssociationClass, +) +from datahub.utilities import config_clean + +logger = logging.getLogger(__name__) + + +class SalesforceAuthType(Enum): + USERNAME_PASSWORD = "USERNAME_PASSWORD" + DIRECT_ACCESS_TOKEN = "DIRECT_ACCESS_TOKEN" + + +class SalesforceProfilingConfig(ConfigModel): + enabled: bool = Field( + default=False, + description="Whether profiling should be done. Supports only table-level profiling at this stage", + ) + + # TODO - support field level profiling + + +class SalesforceConfig(DatasetSourceConfigBase): + platform = "salesforce" + + auth: SalesforceAuthType = SalesforceAuthType.USERNAME_PASSWORD + + # Username, Password Auth + username: Optional[str] = Field(description="Salesforce username") + password: Optional[str] = Field(description="Password for Salesforce user") + security_token: Optional[str] = Field( + description="Security token for Salesforce username" + ) + # client_id, client_secret not required + + # Direct - Instance URL, Access Token Auth + instance_url: Optional[str] = Field( + description="Salesforce instance url. e.g. https://MyDomainName.my.salesforce.com" + ) + access_token: Optional[str] = Field(description="Access token for instance url") + + ingest_tags: Optional[bool] = Field( + default=False, + description="Ingest Tags from source. This will override Tags entered from UI", + ) + + object_pattern: AllowDenyPattern = Field( + default=AllowDenyPattern.allow_all(), + description="Regex patterns for Salesforce objects to filter in ingestion.", + ) + domain: Dict[str, AllowDenyPattern] = Field( + default=dict(), + description='Regex patterns for tables/schemas to describe domain_key domain key (domain_key can be any string like "sales".) There can be multiple domain keys specified.', + ) + + profiling: SalesforceProfilingConfig = SalesforceProfilingConfig() + + profile_pattern: AllowDenyPattern = Field( + default=AllowDenyPattern.allow_all(), + description="Regex patterns for profiles to filter in ingestion, allowed by the `object_pattern`.", + ) + + @validator("instance_url") + def remove_trailing_slash(cls, v): + return config_clean.remove_trailing_slashes(v) + + +class SalesforceSourceReport(SourceReport): + filtered: List[str] = [] + + def report_dropped(self, ent_name: str) -> None: + self.filtered.append(ent_name) + + +# https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_describesObjects_describesObjectresult.htm#FieldType +FIELD_TYPE_MAPPING = { + "string": StringTypeClass, + "boolean": BooleanTypeClass, + "int": NumberTypeClass, + "integer": NumberTypeClass, + "long": NumberTypeClass, + "double": NumberTypeClass, + "date": DateTypeClass, + "datetime": DateTypeClass, + "time": DateTypeClass, + "id": StringTypeClass, # Primary Key + "picklist": EnumTypeClass, + "address": RecordTypeClass, + "location": RecordTypeClass, + "reference": StringTypeClass, # Foreign Key + "currency": NumberTypeClass, + "textarea": StringTypeClass, + "percent": NumberTypeClass, + "phone": StringTypeClass, + "url": StringTypeClass, + "email": StringTypeClass, + "combobox": StringTypeClass, + "multipicklist": StringTypeClass, + "base64": BytesTypeClass, + "anyType": NullTypeClass, + "encryptedstring": StringTypeClass, +} + + +@platform_name("Salesforce") +@config_class(SalesforceConfig) +@support_status(SupportStatus.INCUBATING) +@capability( + capability_name=SourceCapability.PLATFORM_INSTANCE, + description="Can be equivalent to Salesforce organization", +) +@capability( + capability_name=SourceCapability.DOMAINS, + description="Supported via the `domain` config field", +) +@capability( + capability_name=SourceCapability.DATA_PROFILING, + description="Only table level profiling is supported via `profiling.enabled` config field", +) +@capability( + capability_name=SourceCapability.DELETION_DETECTION, + description="Not supported yet", + supported=False, +) +class SalesforceSource(Source): + + base_url: str + config: SalesforceConfig + report: SalesforceSourceReport + session: requests.Session + sf: Salesforce + fieldCounts: Dict[str, int] + + def __init__(self, config: SalesforceConfig, ctx: PipelineContext) -> None: + super().__init__(ctx) + self.config = config + self.report = SalesforceSourceReport() + self.session = requests.Session() + self.platform: str = "salesforce" + self.fieldCounts = {} + + try: + if self.config.auth is SalesforceAuthType.DIRECT_ACCESS_TOKEN: + logger.debug("Access Token Provided in Config") + assert ( + self.config.access_token is not None + ), "Config access_token is required for DIRECT_ACCESS_TOKEN auth" + assert ( + self.config.instance_url is not None + ), "Config instance_url is required for DIRECT_ACCESS_TOKEN auth" + + self.sf = Salesforce( + instance_url=self.config.instance_url, + session_id=self.config.access_token, + session=self.session, + ) + elif self.config.auth is SalesforceAuthType.USERNAME_PASSWORD: + logger.debug("Username/Password Provided in Config") + assert ( + self.config.username is not None + ), "Config username is required for USERNAME_PASSWORD auth" + assert ( + self.config.password is not None + ), "Config password is required for USERNAME_PASSWORD auth" + assert ( + self.config.security_token is not None + ), "Config security_token is required for USERNAME_PASSWORD auth" + + self.sf = Salesforce( + username=self.config.username, + password=self.config.password, + security_token=self.config.security_token, + session=self.session, + ) + + except Exception as e: + logger.error(e) + raise ConfigurationError("Salesforce login failed") from e + else: + # List all REST API versions and use latest one + versions_url = "https://{instance}/services/data/".format( + instance=self.sf.sf_instance, + ) + versions_response = self.sf._call_salesforce("GET", versions_url).json() + latest_version = versions_response[-1] + version = latest_version["version"] + self.sf.sf_version = version + + self.base_url = "https://{instance}/services/data/v{sf_version}/".format( + instance=self.sf.sf_instance, sf_version=version + ) + + logger.debug( + "Using Salesforce REST API with {label} version: {version}".format( + label=latest_version["label"], version=latest_version["version"] + ) + ) + + def get_workunits(self) -> Iterable[WorkUnit]: + + sObjects = self.get_salesforce_objects() + + for sObject in sObjects: + yield from self.get_salesforce_object_workunits(sObject) + + def get_salesforce_object_workunits(self, sObject: dict) -> Iterable[WorkUnit]: + + sObjectName = sObject["QualifiedApiName"] + + if not self.config.object_pattern.allowed(sObjectName): + self.report.report_dropped(sObjectName) + logger.debug( + "Skipping {sObject}, as it is not allowed by object_pattern".format( + sObject=sObjectName + ) + ) + return + + datasetUrn = builder.make_dataset_urn_with_platform_instance( + self.platform, + sObjectName, + self.config.platform_instance, + self.config.env, + ) + + customObject = {} + if sObjectName.endswith("__c"): # Is Custom Object + customObject = self.get_custom_object_details(sObject["DeveloperName"]) + + # Table Created, LastModified is available for Custom Object + yield from self.get_operation_workunit(customObject, datasetUrn) + + yield self.get_properties_workunit(sObject, customObject, datasetUrn) + + yield from self.get_schema_metadata_workunit( + sObjectName, sObject, customObject, datasetUrn + ) + + yield self.get_subtypes_workunit(sObjectName, datasetUrn) + + if self.config.platform_instance is not None: + yield self.get_platform_instance_workunit(datasetUrn) + + if self.config.domain is not None: + yield from self.get_domain_workunit(sObjectName, datasetUrn) + + if self.config.profiling.enabled and self.config.profile_pattern.allowed( + sObjectName + ): + yield from self.get_profile_workunit(sObjectName, datasetUrn) + + def get_custom_object_details(self, sObjectDeveloperName: str) -> dict: + customObject = {} + query_url = ( + self.base_url + + "tooling/query/?q=SELECT Description, Language, ManageableState, " + + "CreatedDate, CreatedBy.Username, LastModifiedDate, LastModifiedBy.Username " + + "FROM CustomObject where DeveloperName='{0}'".format(sObjectDeveloperName) + ) + custom_objects_response = self.sf._call_salesforce("GET", query_url).json() + if len(custom_objects_response["records"]) > 0: + logger.debug("Salesforce CustomObject query returned with details") + customObject = custom_objects_response["records"][0] + return customObject + + def get_salesforce_objects(self) -> List: + + # Using Describe Global REST API returns many more objects than required. + # Response does not have the attribute ("customizable") that can be used + # to filter out entities not on ObjectManager UI. Hence SOQL on EntityDefinition + # object is used instead, as suggested by salesforce support. + + query_url = ( + self.base_url + + "tooling/query/?q=SELECT DurableId,QualifiedApiName,DeveloperName," + + "Label,PluralLabel,InternalSharingModel,ExternalSharingModel,DeploymentStatus " + + "FROM EntityDefinition WHERE IsCustomizable = true" + ) + entities_response = self.sf._call_salesforce("GET", query_url).json() + logger.debug( + "Salesforce EntityDefinition query returned {count} sObjects".format( + count=len(entities_response["records"]) + ) + ) + return entities_response["records"] + + def get_domain_workunit( + self, dataset_name: str, datasetUrn: str + ) -> Iterable[WorkUnit]: + domain_urn: Optional[str] = None + + for domain, pattern in self.config.domain.items(): + if pattern.allowed(dataset_name): + domain_urn = builder.make_domain_urn(domain) + + if domain_urn: + yield from add_domain_to_entity_wu( + domain_urn=domain_urn, entity_type="dataset", entity_urn=datasetUrn + ) + + def get_platform_instance_workunit(self, datasetUrn: str) -> WorkUnit: + dataPlatformInstance = DataPlatformInstanceClass( + builder.make_data_platform_urn(self.platform), + instance=builder.make_dataplatform_instance_urn( + self.platform, self.config.platform_instance # type:ignore + ), + ) + return self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "dataPlatformInstance", dataPlatformInstance + ) + + def get_operation_workunit( + self, customObject: dict, datasetUrn: str + ) -> Iterable[WorkUnit]: + + if customObject.get("CreatedBy") and customObject.get("CreatedDate"): + timestamp = self.get_time_from_salesforce_timestamp( + customObject["CreatedDate"] + ) + operation = OperationClass( + timestampMillis=timestamp, + operationType=OperationTypeClass.CREATE, + lastUpdatedTimestamp=timestamp, + actor=builder.make_user_urn(customObject["CreatedBy"]["Username"]), + ) + yield self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "operation", operation + ) + + # Note - Object Level LastModified captures changes at table level metadata e.g. table + # description and does NOT capture field level metadata e.g. new field added, existing + # field updated + + if customObject.get("LastModifiedBy") and customObject.get( + "LastModifiedDate" + ): + timestamp = self.get_time_from_salesforce_timestamp( + customObject["LastModifiedDate"] + ) + operation = OperationClass( + timestampMillis=timestamp, + operationType=OperationTypeClass.ALTER, + lastUpdatedTimestamp=timestamp, + actor=builder.make_user_urn( + customObject["LastModifiedBy"]["Username"] + ), + ) + yield self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "operation", operation + ) + + def get_time_from_salesforce_timestamp(self, date: str) -> int: + return round( + datetime.strptime(date, "%Y-%m-%dT%H:%M:%S.%f%z").timestamp() * 1000 + ) + + def get_properties_workunit( + self, sObject: dict, customObject: Dict[str, str], datasetUrn: str + ) -> WorkUnit: + propertyLabels = { + # from EntityDefinition + "DurableId": "Durable Id", + "DeveloperName": "Developer Name", + "QualifiedApiName": "Qualified API Name", + "Label": "Label", + "PluralLabel": "Plural Label", + "InternalSharingModel": "Internal Sharing Model", + "ExternalSharingModel": "External Sharing Model", + # from CustomObject + "ManageableState": "Manageable State", + "Language": "Language", + } + + sObjectProperties = { + propertyLabels[k]: str(v) + for k, v in sObject.items() + if k in propertyLabels and v is not None + } + sObjectProperties.update( + { + propertyLabels[k]: str(v) + for k, v in customObject.items() + if k in propertyLabels and v is not None + } + ) + + datasetProperties = DatasetPropertiesClass( + name=sObject["Label"], + description=customObject.get("Description"), + customProperties=sObjectProperties, + ) + return self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "datasetProperties", datasetProperties + ) + + def get_subtypes_workunit(self, sObjectName: str, datasetUrn: str) -> WorkUnit: + subtypes = [] + if sObjectName.endswith("__c"): + subtypes.append("Custom Object") + else: + subtypes.append("Standard Object") + + return self.wrap_aspect_as_workunit( + entityName="dataset", + entityUrn=datasetUrn, + aspectName="subTypes", + aspect=SubTypesClass(typeNames=subtypes), + ) + + def get_profile_workunit( + self, sObjectName: str, datasetUrn: str + ) -> Iterable[WorkUnit]: + # Here approximate record counts as returned by recordCount API are used as rowCount + # In future, count() SOQL query may be used instead, if required, might be more expensive + sObject_records_count_url = ( + f"{self.base_url}limits/recordCount?sObjects={sObjectName}" + ) + + sObject_record_count_response = self.sf._call_salesforce( + "GET", sObject_records_count_url + ).json() + + logger.debug( + "Received Salesforce {sObject} record count response".format( + sObject=sObjectName + ) + ) + + for entry in sObject_record_count_response.get("sObjects", []): + datasetProfile = DatasetProfileClass( + timestampMillis=int(time.time() * 1000), + rowCount=entry["count"], + columnCount=self.fieldCounts[sObjectName], + ) + yield self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "datasetProfile", datasetProfile + ) + + # Here field description is created from label, description and inlineHelpText + def _get_field_description(self, field: dict, customField: dict) -> str: + desc = field["Label"] + if field.get("FieldDefinition", {}).get("Description"): + desc = "{0}\n\n{1}".format(desc, field["FieldDefinition"]["Description"]) + if field.get("InlineHelpText"): + desc = "{0}\n\n{1}".format(desc, field["InlineHelpText"]) + return desc + + # Here jsonProps is used to add additional salesforce field level properties. + def _get_field_json_props(self, field: dict, customField: dict) -> str: + jsonProps = {} + + if field.get("IsUnique"): + jsonProps["IsUnique"] = True + + return json.dumps(jsonProps) + + def _get_schema_field( + self, + sObjectName: str, + fieldName: str, + fieldType: str, + field: dict, + customField: dict, + ) -> SchemaFieldClass: + fieldPath = fieldName + + TypeClass = FIELD_TYPE_MAPPING.get(fieldType) + if TypeClass is None: + self.report.report_warning( + sObjectName, + f"Unable to map type {fieldType} to metadata schema", + ) + TypeClass = NullTypeClass + + fieldTags: List[str] = self.get_field_tags(fieldName, field) + + schemaField = SchemaFieldClass( + fieldPath=fieldPath, + type=SchemaFieldDataTypeClass(type=TypeClass()), # type:ignore + description=self._get_field_description(field, customField), + # nativeDataType is set to data type shown on salesforce user interface, + # not the corresponding API data type names. + nativeDataType=field["FieldDefinition"]["DataType"], + nullable=field["IsNillable"], + globalTags=get_tags(fieldTags) if self.config.ingest_tags else None, + jsonProps=self._get_field_json_props(field, customField), + ) + + # Created and LastModified Date and Actor are available for Custom Fields only + if customField.get("CreatedDate") and customField.get("CreatedBy"): + schemaField.created = self.get_audit_stamp( + customField["CreatedDate"], customField["CreatedBy"]["Username"] + ) + if customField.get("LastModifiedDate") and customField.get("LastModifiedBy"): + schemaField.lastModified = self.get_audit_stamp( + customField["LastModifiedDate"], + customField["LastModifiedBy"]["Username"], + ) + + return schemaField + + def get_field_tags(self, fieldName: str, field: dict) -> List[str]: + fieldTags: List[str] = [] + + if fieldName.endswith("__c"): + fieldTags.append("Custom") + + # https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/system_fields.htm + sfSystemFields = [ + "Id", + "IsDeleted", + "CreatedById", + "CreatedDate", + "LastModifiedById", + "LastModifiedDate", + "SystemModstamp", + ] + + if fieldName in sfSystemFields: + fieldTags.append("SystemField") + + if field["FieldDefinition"]["ComplianceGroup"] is not None: + # CCPA, COPPA, GDPR, HIPAA, PCI, PersonalInfo, PII + fieldTags.extend( + iter(field["FieldDefinition"]["ComplianceGroup"].split(";")) + ) + return fieldTags + + def get_audit_stamp(self, date: str, username: str) -> AuditStampClass: + return AuditStampClass( + time=self.get_time_from_salesforce_timestamp(date), + actor=builder.make_user_urn(username), + ) + + def get_schema_metadata_workunit( + self, sObjectName: str, sObject: dict, customObject: dict, datasetUrn: str + ) -> Iterable[WorkUnit]: + + sObject_fields_query_url = ( + self.base_url + + "tooling/query?q=SELECT " + + "QualifiedApiName,DeveloperName,Label, FieldDefinition.DataType, DataType," + + "FieldDefinition.LastModifiedDate, FieldDefinition.LastModifiedBy.Username," + + "Precision, Scale, Length, Digits ,FieldDefinition.IsIndexed, IsUnique," + + "IsCompound, IsComponent, ReferenceTo, FieldDefinition.ComplianceGroup," + + "RelationshipName, IsNillable, FieldDefinition.Description, InlineHelpText " + + "FROM EntityParticle WHERE EntityDefinitionId='{0}'".format( + sObject["DurableId"] + ) + ) + + sObject_fields_response = self.sf._call_salesforce( + "GET", sObject_fields_query_url + ).json() + + logger.debug( + "Received Salesforce {sObject} fields response".format(sObject=sObjectName) + ) + + sObject_custom_fields_query_url = ( + self.base_url + + "tooling/query?q=SELECT " + + "DeveloperName,CreatedDate,CreatedBy.Username,InlineHelpText," + + "LastModifiedDate,LastModifiedBy.Username " + + "FROM CustomField WHERE EntityDefinitionId='{0}'".format( + sObject["DurableId"] + ) + ) + + sObject_custom_fields_response = self.sf._call_salesforce( + "GET", sObject_custom_fields_query_url + ).json() + + logger.debug( + "Received Salesforce {sObject} custom fields response".format( + sObject=sObjectName + ) + ) + customFields: Dict[str, Dict] = { + record["DeveloperName"]: record + for record in sObject_custom_fields_response["records"] + } + + fields: List[SchemaFieldClass] = [] + primaryKeys: List[str] = [] + foreignKeys: List[ForeignKeyConstraintClass] = [] + + for field in sObject_fields_response["records"]: + + customField = customFields.get(field["DeveloperName"], {}) + + fieldName = field["QualifiedApiName"] + fieldType = field["DataType"] + + # Skip compound fields. All Leaf fields are ingested instead. + if fieldType in ("address", "location"): + continue + + schemaField: SchemaFieldClass = self._get_schema_field( + sObjectName, fieldName, fieldType, field, customField + ) + fields.append(schemaField) + + if fieldType == "id": + primaryKeys.append(fieldName) + + if ( + fieldType == "reference" + and field["ReferenceTo"]["referenceTo"] is not None + ): + foreignKeys.extend( + list(self.get_foreign_keys_from_field(fieldName, field, datasetUrn)) + ) + + schemaMetadata = SchemaMetadataClass( + schemaName="", + platform=builder.make_data_platform_urn(self.platform), + version=0, + hash="", + platformSchema=OtherSchemaClass(rawSchema=""), + fields=fields, + primaryKeys=primaryKeys, + foreignKeys=foreignKeys or None, + ) + + # Created Date and Actor are available for Custom Object only + if customObject.get("CreatedDate") and customObject.get("CreatedBy"): + schemaMetadata.created = self.get_audit_stamp( + customObject["CreatedDate"], customObject["CreatedBy"]["Username"] + ) + self.fieldCounts[sObjectName] = len(fields) + + yield self.wrap_aspect_as_workunit( + "dataset", datasetUrn, "schemaMetadata", schemaMetadata + ) + + def get_foreign_keys_from_field( + self, fieldName: str, field: dict, datasetUrn: str + ) -> Iterable[ForeignKeyConstraintClass]: + # https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/field_types.htm#i1435823 + foreignDatasets = [ + builder.make_dataset_urn_with_platform_instance( + self.platform, + fsObject, + self.config.platform_instance, + self.config.env, + ) + for fsObject in field["ReferenceTo"]["referenceTo"] + ] + + for foreignDataset in foreignDatasets: + yield ForeignKeyConstraintClass( + name=field["RelationshipName"] if field.get("RelationshipName") else "", + foreignDataset=foreignDataset, + foreignFields=[builder.make_schema_field_urn(foreignDataset, "Id")], + sourceFields=[builder.make_schema_field_urn(datasetUrn, fieldName)], + ) + + def wrap_aspect_as_workunit( + self, entityName: str, entityUrn: str, aspectName: str, aspect: DictWrapper + ) -> WorkUnit: + wu = MetadataWorkUnit( + id=f"{aspectName}-for-{entityUrn}", + mcp=MetadataChangeProposalWrapper( + entityType=entityName, + entityUrn=entityUrn, + aspectName=aspectName, + aspect=aspect, + changeType=ChangeTypeClass.UPSERT, + ), + ) + self.report.report_workunit(wu) + return wu + + def get_report(self) -> SourceReport: + return self.report + + +def get_tags(params: List[str] = None) -> GlobalTagsClass: + if params is None: + params = [] + tags = [TagAssociationClass(tag=builder.make_tag_urn(tag)) for tag in params if tag] + return GlobalTagsClass(tags=tags) diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/account_custom_fields_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/account_custom_fields_soql_response.json new file mode 100644 index 00000000000000..50142ca7edec15 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/account_custom_fields_soql_response.json @@ -0,0 +1,177 @@ +{ + "size": 7, + "totalSize": 7, + "done": true, + "queryLocator": null, + "entityTypeName": "CustomField", + "records": [ + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8LEAW" + }, + "DeveloperName": "CustomerPriority", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8NEAW" + }, + "DeveloperName": "SLA", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8KEAW" + }, + "DeveloperName": "Active", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8MEAW" + }, + "DeveloperName": "NumberofLocations", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8QEAW" + }, + "DeveloperName": "UpsellOpportunity", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8PEAW" + }, + "DeveloperName": "SLASerialNumber", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004FO8OEAW" + }, + "DeveloperName": "SLAExpirationDate", + "CreatedDate": "2022-05-02T03:22:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/account_fields_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/account_fields_soql_response.json new file mode 100644 index 00000000000000..947761b8c79a0f --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/account_fields_soql_response.json @@ -0,0 +1,2513 @@ +{ + "size": 72, + "totalSize": 72, + "done": true, + "queryLocator": null, + "entityTypeName": "EntityParticle", + "records": [ + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Id" + }, + "QualifiedApiName": "Id", + "DeveloperName": "Id", + "Label": "Account ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Id" + }, + "DataType": "Lookup()", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "id", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.IsDeleted" + }, + "QualifiedApiName": "IsDeleted", + "DeveloperName": "IsDeleted", + "Label": "Deleted", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.IsDeleted" + }, + "DataType": "Checkbox", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "boolean", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.MasterRecord" + }, + "QualifiedApiName": "MasterRecordId", + "DeveloperName": "MasterRecord", + "Label": "Master Record ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.MasterRecord" + }, + "DataType": "Lookup(Account)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "Account" + ] + }, + "RelationshipName": "MasterRecord", + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Name.TextName" + }, + "QualifiedApiName": "Name", + "DeveloperName": "Name", + "Label": "Account Name", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Name" + }, + "DataType": "Name", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.CompareName" + }, + "QualifiedApiName": "CompareName", + "DeveloperName": "CompareName", + "Label": "Compare Name", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.CompareName" + }, + "DataType": "Text(80)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Type" + }, + "QualifiedApiName": "Type", + "DeveloperName": "Type", + "Label": "Account Type", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Type" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Parent" + }, + "QualifiedApiName": "ParentId", + "DeveloperName": "Parent", + "Label": "Parent Account ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Parent" + }, + "DataType": "Hierarchy", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "Account" + ] + }, + "RelationshipName": "Parent", + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingStreet" + }, + "QualifiedApiName": "BillingStreet", + "DeveloperName": "BillingAddress", + "Label": "Billing Street", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "textarea", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingCity" + }, + "QualifiedApiName": "BillingCity", + "DeveloperName": "BillingAddress", + "Label": "Billing City", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingState" + }, + "QualifiedApiName": "BillingState", + "DeveloperName": "BillingAddress", + "Label": "Billing State/Province", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingPostalCode" + }, + "QualifiedApiName": "BillingPostalCode", + "DeveloperName": "BillingAddress", + "Label": "Billing Zip/Postal Code", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingCountry" + }, + "QualifiedApiName": "BillingCountry", + "DeveloperName": "BillingAddress", + "Label": "Billing Country", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingLatitude" + }, + "QualifiedApiName": "BillingLatitude", + "DeveloperName": "BillingAddress", + "Label": "Billing Latitude", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "double", + "Precision": 18, + "Scale": 15, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingLongitude" + }, + "QualifiedApiName": "BillingLongitude", + "DeveloperName": "BillingAddress", + "Label": "Billing Longitude", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "double", + "Precision": 18, + "Scale": 15, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress.BillingGeocodeAccuracy" + }, + "QualifiedApiName": "BillingGeocodeAccuracy", + "DeveloperName": "BillingAddress", + "Label": "Billing Geocode Accuracy", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.BillingAddress" + }, + "QualifiedApiName": "BillingAddress", + "DeveloperName": "BillingAddress", + "Label": "Billing Address", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.BillingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "address", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": true, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingStreet" + }, + "QualifiedApiName": "ShippingStreet", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Street", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "textarea", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingCity" + }, + "QualifiedApiName": "ShippingCity", + "DeveloperName": "ShippingAddress", + "Label": "Shipping City", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingState" + }, + "QualifiedApiName": "ShippingState", + "DeveloperName": "ShippingAddress", + "Label": "Shipping State/Province", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingPostalCode" + }, + "QualifiedApiName": "ShippingPostalCode", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Zip/Postal Code", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingCountry" + }, + "QualifiedApiName": "ShippingCountry", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Country", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingLatitude" + }, + "QualifiedApiName": "ShippingLatitude", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Latitude", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "double", + "Precision": 18, + "Scale": 15, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingLongitude" + }, + "QualifiedApiName": "ShippingLongitude", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Longitude", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "double", + "Precision": 18, + "Scale": 15, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress.ShippingGeocodeAccuracy" + }, + "QualifiedApiName": "ShippingGeocodeAccuracy", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Geocode Accuracy", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": true, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ShippingAddress" + }, + "QualifiedApiName": "ShippingAddress", + "DeveloperName": "ShippingAddress", + "Label": "Shipping Address", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ShippingAddress" + }, + "DataType": "Address", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "address", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": true, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Phone" + }, + "QualifiedApiName": "Phone", + "DeveloperName": "Phone", + "Label": "Account Phone", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Phone" + }, + "DataType": "Phone", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "phone", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Fax" + }, + "QualifiedApiName": "Fax", + "DeveloperName": "Fax", + "Label": "Account Fax", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Fax" + }, + "DataType": "Fax", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "phone", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.AccountNumber" + }, + "QualifiedApiName": "AccountNumber", + "DeveloperName": "AccountNumber", + "Label": "Account Number", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.AccountNumber" + }, + "DataType": "Text(40)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Website" + }, + "QualifiedApiName": "Website", + "DeveloperName": "Website", + "Label": "Website", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Website" + }, + "DataType": "URL(255)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "url", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.PhotoUrl" + }, + "QualifiedApiName": "PhotoUrl", + "DeveloperName": "PhotoUrl", + "Label": "Photo URL", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.PhotoUrl" + }, + "DataType": "URL(255)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "url", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Sic" + }, + "QualifiedApiName": "Sic", + "DeveloperName": "Sic", + "Label": "SIC Code", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Sic" + }, + "DataType": "Text(20)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Industry" + }, + "QualifiedApiName": "Industry", + "DeveloperName": "Industry", + "Label": "Industry", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Industry" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.AnnualRevenue" + }, + "QualifiedApiName": "AnnualRevenue", + "DeveloperName": "AnnualRevenue", + "Label": "Annual Revenue", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.AnnualRevenue" + }, + "DataType": "Currency(18, 0)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "currency", + "Precision": 18, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.NumberOfEmployees" + }, + "QualifiedApiName": "NumberOfEmployees", + "DeveloperName": "NumberOfEmployees", + "Label": "Employees", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.NumberOfEmployees" + }, + "DataType": "Number(8, 0)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "integer", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 8, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Ownership" + }, + "QualifiedApiName": "Ownership", + "DeveloperName": "Ownership", + "Label": "Ownership", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Ownership" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.TickerSymbol" + }, + "QualifiedApiName": "TickerSymbol", + "DeveloperName": "TickerSymbol", + "Label": "Ticker Symbol", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.TickerSymbol" + }, + "DataType": "Content(20)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Description" + }, + "QualifiedApiName": "Description", + "DeveloperName": "Description", + "Label": "Account Description", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Description" + }, + "DataType": "Long Text Area(32000)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "textarea", + "Precision": 0, + "Scale": 0, + "Length": 32000, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Rating" + }, + "QualifiedApiName": "Rating", + "DeveloperName": "Rating", + "Label": "Account Rating", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Rating" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Site" + }, + "QualifiedApiName": "Site", + "DeveloperName": "Site", + "Label": "Account Site", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Site" + }, + "DataType": "Text(80)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.CompareSite" + }, + "QualifiedApiName": "CompareSite", + "DeveloperName": "CompareSite", + "Label": "Compare Site", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.CompareSite" + }, + "DataType": "Text(80)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Owner" + }, + "QualifiedApiName": "OwnerId", + "DeveloperName": "Owner", + "Label": "Owner ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Owner" + }, + "DataType": "Lookup(User)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "User" + ] + }, + "RelationshipName": "Owner", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.OwnerAlias" + }, + "QualifiedApiName": "OwnerAlias", + "DeveloperName": "OwnerAlias", + "Label": "Owner Alias", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.OwnerAlias" + }, + "DataType": "Text(30)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 30, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.CreatedDate" + }, + "QualifiedApiName": "CreatedDate", + "DeveloperName": "CreatedDate", + "Label": "Created Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.CreatedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.CreatedBy" + }, + "QualifiedApiName": "CreatedById", + "DeveloperName": "CreatedBy", + "Label": "Created By ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.CreatedBy" + }, + "DataType": "Lookup(User)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "User" + ] + }, + "RelationshipName": "CreatedBy", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.LastModifiedDate" + }, + "QualifiedApiName": "LastModifiedDate", + "DeveloperName": "LastModifiedDate", + "Label": "Last Modified Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.LastModifiedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.LastModifiedBy" + }, + "QualifiedApiName": "LastModifiedById", + "DeveloperName": "LastModifiedBy", + "Label": "Last Modified By ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.LastModifiedBy" + }, + "DataType": "Lookup(User)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "User" + ] + }, + "RelationshipName": "LastModifiedBy", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.SystemModstamp" + }, + "QualifiedApiName": "SystemModstamp", + "DeveloperName": "SystemModstamp", + "Label": "System Modstamp", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.SystemModstamp" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.LastActivityDate" + }, + "QualifiedApiName": "LastActivityDate", + "DeveloperName": "LastActivityDate", + "Label": "Last Activity", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.LastActivityDate" + }, + "DataType": "Date", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "date", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.LastViewedDate" + }, + "QualifiedApiName": "LastViewedDate", + "DeveloperName": "LastViewedDate", + "Label": "Last Viewed Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.LastViewedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.LastReferencedDate" + }, + "QualifiedApiName": "LastReferencedDate", + "DeveloperName": "LastReferencedDate", + "Label": "Last Referenced Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.LastReferencedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Jigsaw" + }, + "QualifiedApiName": "Jigsaw", + "DeveloperName": "Jigsaw", + "Label": "Data.com Key", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Jigsaw" + }, + "DataType": "Text(20)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.JigsawCompany" + }, + "QualifiedApiName": "JigsawCompanyId", + "DeveloperName": "JigsawCompany", + "Label": "Jigsaw Company ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.JigsawCompany" + }, + "DataType": "External Lookup", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 20, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": "JigsawCompany", + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.CleanStatus" + }, + "QualifiedApiName": "CleanStatus", + "DeveloperName": "CleanStatus", + "Label": "Clean Status", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.CleanStatus" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 40, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.AccountSource" + }, + "QualifiedApiName": "AccountSource", + "DeveloperName": "AccountSource", + "Label": "Account Source", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.AccountSource" + }, + "DataType": "Picklist", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.DunsNumber" + }, + "QualifiedApiName": "DunsNumber", + "DeveloperName": "DunsNumber", + "Label": "D-U-N-S Number", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.DunsNumber" + }, + "DataType": "Text(9)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 9, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Tradestyle" + }, + "QualifiedApiName": "Tradestyle", + "DeveloperName": "Tradestyle", + "Label": "Tradestyle", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Tradestyle" + }, + "DataType": "Text(255)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.NaicsCode" + }, + "QualifiedApiName": "NaicsCode", + "DeveloperName": "NaicsCode", + "Label": "NAICS Code", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.NaicsCode" + }, + "DataType": "Text(8)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 8, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.NaicsDesc" + }, + "QualifiedApiName": "NaicsDesc", + "DeveloperName": "NaicsDesc", + "Label": "NAICS Description", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.NaicsDesc" + }, + "DataType": "Text(120)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 120, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.YearStarted" + }, + "QualifiedApiName": "YearStarted", + "DeveloperName": "YearStarted", + "Label": "Year Started", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.YearStarted" + }, + "DataType": "Text(4)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 4, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.SicDesc" + }, + "QualifiedApiName": "SicDesc", + "DeveloperName": "SicDesc", + "Label": "SIC Description", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.SicDesc" + }, + "DataType": "Text(80)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.DandbCompany" + }, + "QualifiedApiName": "DandbCompanyId", + "DeveloperName": "DandbCompany", + "Label": "D&B Company ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.DandbCompany" + }, + "DataType": "Lookup(D&B Company)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "DandBCompany" + ] + }, + "RelationshipName": "DandbCompany", + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.OperatingHours" + }, + "QualifiedApiName": "OperatingHoursId", + "DeveloperName": "OperatingHours", + "Label": "Operating Hour ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.OperatingHours" + }, + "DataType": "Lookup(Operating Hours)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "OperatingHours" + ] + }, + "RelationshipName": "OperatingHours", + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ConnectionReceivedDate" + }, + "QualifiedApiName": "ConnectionReceivedDate", + "DeveloperName": "ConnectionReceivedDate", + "Label": "Received Connection Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ConnectionReceivedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.ConnectionSentDate" + }, + "QualifiedApiName": "ConnectionSentDate", + "DeveloperName": "ConnectionSentDate", + "Label": "Sent Connection Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.ConnectionSentDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.Tier" + }, + "QualifiedApiName": "Tier", + "DeveloperName": "Tier", + "Label": "Einstein Account Tier", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.Tier" + }, + "DataType": "Text(2)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 2, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8L" + }, + "QualifiedApiName": "CustomerPriority__c", + "DeveloperName": "CustomerPriority", + "Label": "Customer Priority", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8L" + }, + "DataType": "Picklist", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8N" + }, + "QualifiedApiName": "SLA__c", + "DeveloperName": "SLA", + "Label": "SLA", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8N" + }, + "DataType": "Picklist", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8K" + }, + "QualifiedApiName": "Active__c", + "DeveloperName": "Active", + "Label": "Active", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8K" + }, + "DataType": "Picklist", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8M" + }, + "QualifiedApiName": "NumberofLocations__c", + "DeveloperName": "NumberofLocations", + "Label": "Number of Locations", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8M" + }, + "DataType": "Number(3, 0)", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "double", + "Precision": 3, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8Q" + }, + "QualifiedApiName": "UpsellOpportunity__c", + "DeveloperName": "UpsellOpportunity", + "Label": "Upsell Opportunity", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8Q" + }, + "DataType": "Picklist", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8P" + }, + "QualifiedApiName": "SLASerialNumber__c", + "DeveloperName": "SLASerialNumber", + "Label": "SLA Serial Number", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8P" + }, + "DataType": "Text(10)", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 10, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/Account.00N5i000004FO8O" + }, + "QualifiedApiName": "SLAExpirationDate__c", + "DeveloperName": "SLAExpirationDate", + "Label": "SLA Expiration Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/Account.00N5i000004FO8O" + }, + "DataType": "Date", + "LastModifiedDate": "2022-05-02T03:22:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "date", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/entity_definition_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/entity_definition_soql_response.json new file mode 100644 index 00000000000000..efae809c1c78f2 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/entity_definition_soql_response.json @@ -0,0 +1,2151 @@ +{ + "size": 153, + "totalSize": 153, + "done": true, + "queryLocator": null, + "entityTypeName": "EntityDefinition", + "records": [ + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Contract" + }, + "DurableId": "Contract", + "QualifiedApiName": "Contract", + "DeveloperName": "Contract", + "Label": "Contract", + "PluralLabel": "Contracts", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Order" + }, + "DurableId": "Order", + "QualifiedApiName": "Order", + "DeveloperName": "Order", + "Label": "Order", + "PluralLabel": "Orders", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/OrderItem" + }, + "DurableId": "OrderItem", + "QualifiedApiName": "OrderItem", + "DeveloperName": "OrderItem", + "Label": "Order Product", + "PluralLabel": "Order Products", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Campaign" + }, + "DurableId": "Campaign", + "QualifiedApiName": "Campaign", + "DeveloperName": "Campaign", + "Label": "Campaign", + "PluralLabel": "Campaigns", + "InternalSharingModel": "FullAccess", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CampaignMember" + }, + "DurableId": "CampaignMember", + "QualifiedApiName": "CampaignMember", + "DeveloperName": "CampaignMember", + "Label": "Campaign Member", + "PluralLabel": "Campaign Members", + "InternalSharingModel": "ControlledByCampaign", + "ExternalSharingModel": "ControlledByCampaign", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Account" + }, + "DurableId": "Account", + "QualifiedApiName": "Account", + "DeveloperName": "Account", + "Label": "Account", + "PluralLabel": "Accounts", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Contact" + }, + "DurableId": "Contact", + "QualifiedApiName": "Contact", + "DeveloperName": "Contact", + "Label": "Contact", + "PluralLabel": "Contacts", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Lead" + }, + "DurableId": "Lead", + "QualifiedApiName": "Lead", + "DeveloperName": "Lead", + "Label": "Lead", + "PluralLabel": "Leads", + "InternalSharingModel": "ReadWriteTransfer", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Opportunity" + }, + "DurableId": "Opportunity", + "QualifiedApiName": "Opportunity", + "DeveloperName": "Opportunity", + "Label": "Opportunity", + "PluralLabel": "Opportunities", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/OpportunityContactRole" + }, + "DurableId": "OpportunityContactRole", + "QualifiedApiName": "OpportunityContactRole", + "DeveloperName": "OpportunityContactRole", + "Label": "Opportunity Contact Role", + "PluralLabel": "Opportunity Contact Role", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/OpportunityLineItem" + }, + "DurableId": "OpportunityLineItem", + "QualifiedApiName": "OpportunityLineItem", + "DeveloperName": "OpportunityLineItem", + "Label": "Opportunity Product", + "PluralLabel": "Opportunity Product", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PricebookEntry" + }, + "DurableId": "PricebookEntry", + "QualifiedApiName": "PricebookEntry", + "DeveloperName": "PricebookEntry", + "Label": "Price Book Entry", + "PluralLabel": "Price Book Entries", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Product2" + }, + "DurableId": "Product2", + "QualifiedApiName": "Product2", + "DeveloperName": "Product2", + "Label": "Product", + "PluralLabel": "Products", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Asset" + }, + "DurableId": "Asset", + "QualifiedApiName": "Asset", + "DeveloperName": "Asset", + "Label": "Asset", + "PluralLabel": "Assets", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Case" + }, + "DurableId": "Case", + "QualifiedApiName": "Case", + "DeveloperName": "Case", + "Label": "Case", + "PluralLabel": "Cases", + "InternalSharingModel": "ReadWriteTransfer", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Solution" + }, + "DurableId": "Solution", + "QualifiedApiName": "Solution", + "DeveloperName": "Solution", + "Label": "Solution", + "PluralLabel": "Solutions", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContentVersion" + }, + "DurableId": "ContentVersion", + "QualifiedApiName": "ContentVersion", + "DeveloperName": "ContentVersion", + "Label": "Content Version", + "PluralLabel": "Content Versions", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Task" + }, + "DurableId": "Task", + "QualifiedApiName": "Task", + "DeveloperName": "Task", + "Label": "Task", + "PluralLabel": "Tasks", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Event" + }, + "DurableId": "Event", + "QualifiedApiName": "Event", + "DeveloperName": "Event", + "Label": "Event", + "PluralLabel": "Events", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/User" + }, + "DurableId": "User", + "QualifiedApiName": "User", + "DeveloperName": "User", + "Label": "User", + "PluralLabel": "Users", + "InternalSharingModel": "Read", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/EmailMessage" + }, + "DurableId": "EmailMessage", + "QualifiedApiName": "EmailMessage", + "DeveloperName": "EmailMessage", + "Label": "Email Message", + "PluralLabel": "Email Messages", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/VoiceCall" + }, + "DurableId": "VoiceCall", + "QualifiedApiName": "VoiceCall", + "DeveloperName": "VoiceCall", + "Label": "Voice Call", + "PluralLabel": "Voice Calls", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Individual" + }, + "DurableId": "Individual", + "QualifiedApiName": "Individual", + "DeveloperName": "Individual", + "Label": "Individual", + "PluralLabel": "Individuals", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Invoice" + }, + "DurableId": "Invoice", + "QualifiedApiName": "Invoice", + "DeveloperName": "Invoice", + "Label": "Invoice", + "PluralLabel": "Invoices", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Payment" + }, + "DurableId": "Payment", + "QualifiedApiName": "Payment", + "DeveloperName": "Payment", + "Label": "Payment", + "PluralLabel": "Payments", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Pricebook2" + }, + "DurableId": "Pricebook2", + "QualifiedApiName": "Pricebook2", + "DeveloperName": "Pricebook2", + "Label": "Price Book", + "PluralLabel": "Price Books", + "InternalSharingModel": "ReadSelect", + "ExternalSharingModel": "ReadSelect", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Idea" + }, + "DurableId": "Idea", + "QualifiedApiName": "Idea", + "DeveloperName": "Idea", + "Label": "Idea", + "PluralLabel": "Ideas", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Macro" + }, + "DurableId": "Macro", + "QualifiedApiName": "Macro", + "DeveloperName": "Macro", + "Label": "Macro", + "PluralLabel": "Macros", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkOrder" + }, + "DurableId": "WorkOrder", + "QualifiedApiName": "WorkOrder", + "DeveloperName": "WorkOrder", + "Label": "Work Order", + "PluralLabel": "Work Orders", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkOrderLineItem" + }, + "DurableId": "WorkOrderLineItem", + "QualifiedApiName": "WorkOrderLineItem", + "DeveloperName": "WorkOrderLineItem", + "Label": "Work Order Line Item", + "PluralLabel": "Work Order Line Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceAppointment" + }, + "DurableId": "ServiceAppointment", + "QualifiedApiName": "ServiceAppointment", + "DeveloperName": "ServiceAppointment", + "Label": "Service Appointment", + "PluralLabel": "Service Appointments", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkType" + }, + "DurableId": "WorkType", + "QualifiedApiName": "WorkType", + "DeveloperName": "WorkType", + "Label": "Work Type", + "PluralLabel": "Work Types", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceResource" + }, + "DurableId": "ServiceResource", + "QualifiedApiName": "ServiceResource", + "DeveloperName": "ServiceResource", + "Label": "Service Resource", + "PluralLabel": "Service Resources", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceTerritory" + }, + "DurableId": "ServiceTerritory", + "QualifiedApiName": "ServiceTerritory", + "DeveloperName": "ServiceTerritory", + "Label": "Service Territory", + "PluralLabel": "Service Territories", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceTerritoryMember" + }, + "DurableId": "ServiceTerritoryMember", + "QualifiedApiName": "ServiceTerritoryMember", + "DeveloperName": "ServiceTerritoryMember", + "Label": "Service Territory Member", + "PluralLabel": "Service Territory Members", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceResourceSkill" + }, + "DurableId": "ServiceResourceSkill", + "QualifiedApiName": "ServiceResourceSkill", + "DeveloperName": "ServiceResourceSkill", + "Label": "Service Resource Skill", + "PluralLabel": "Service Resource Skills", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/SkillRequirement" + }, + "DurableId": "SkillRequirement", + "QualifiedApiName": "SkillRequirement", + "DeveloperName": "SkillRequirement", + "Label": "Skill Requirement", + "PluralLabel": "Skill Requirements", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssignedResource" + }, + "DurableId": "AssignedResource", + "QualifiedApiName": "AssignedResource", + "DeveloperName": "AssignedResource", + "Label": "Assigned Resource", + "PluralLabel": "Assigned Resources", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/OperatingHours" + }, + "DurableId": "OperatingHours", + "QualifiedApiName": "OperatingHours", + "DeveloperName": "OperatingHours", + "Label": "Operating Hours", + "PluralLabel": "Operating Hours", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ResourceAbsence" + }, + "DurableId": "ResourceAbsence", + "QualifiedApiName": "ResourceAbsence", + "DeveloperName": "ResourceAbsence", + "Label": "Resource Absence", + "PluralLabel": "Resource Absences", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/TimeSlot" + }, + "DurableId": "TimeSlot", + "QualifiedApiName": "TimeSlot", + "DeveloperName": "TimeSlot", + "Label": "Time Slot", + "PluralLabel": "Time Slots", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ResourcePreference" + }, + "DurableId": "ResourcePreference", + "QualifiedApiName": "ResourcePreference", + "DeveloperName": "ResourcePreference", + "Label": "Resource Preference", + "PluralLabel": "Resource Preferences", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Entitlement" + }, + "DurableId": "Entitlement", + "QualifiedApiName": "Entitlement", + "DeveloperName": "Entitlement", + "Label": "Entitlement", + "PluralLabel": "Entitlements", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/EntityMilestone" + }, + "DurableId": "EntityMilestone", + "QualifiedApiName": "EntityMilestone", + "DeveloperName": "EntityMilestone", + "Label": "Object Milestone", + "PluralLabel": "Object Milestones", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceContract" + }, + "DurableId": "ServiceContract", + "QualifiedApiName": "ServiceContract", + "DeveloperName": "ServiceContract", + "Label": "Service Contract", + "PluralLabel": "Service Contracts", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContractLineItem" + }, + "DurableId": "ContractLineItem", + "QualifiedApiName": "ContractLineItem", + "DeveloperName": "ContractLineItem", + "Label": "Contract Line Item", + "PluralLabel": "Contract Line Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Location" + }, + "DurableId": "Location", + "QualifiedApiName": "Location", + "DeveloperName": "Location", + "Label": "Location", + "PluralLabel": "Locations", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssociatedLocation" + }, + "DurableId": "AssociatedLocation", + "QualifiedApiName": "AssociatedLocation", + "DeveloperName": "AssociatedLocation", + "Label": "Associated Location", + "PluralLabel": "Associated Locations", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DandBCompany" + }, + "DurableId": "DandBCompany", + "QualifiedApiName": "DandBCompany", + "DeveloperName": "DandBCompany", + "Label": "D&B Company", + "PluralLabel": "D&B Companies", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AccountCleanInfo" + }, + "DurableId": "AccountCleanInfo", + "QualifiedApiName": "AccountCleanInfo", + "DeveloperName": "AccountCleanInfo", + "Label": "Account Clean Info", + "PluralLabel": "Account Clean Info", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactCleanInfo" + }, + "DurableId": "ContactCleanInfo", + "QualifiedApiName": "ContactCleanInfo", + "DeveloperName": "ContactCleanInfo", + "Label": "Contact Clean Info", + "PluralLabel": "Contact Clean Info", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LeadCleanInfo" + }, + "DurableId": "LeadCleanInfo", + "QualifiedApiName": "LeadCleanInfo", + "DeveloperName": "LeadCleanInfo", + "Label": "Lead Clean Info", + "PluralLabel": "Lead Clean Info", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/QuickText" + }, + "DurableId": "QuickText", + "QualifiedApiName": "QuickText", + "DeveloperName": "QuickText", + "Label": "Quick Text", + "PluralLabel": "Quick Text", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/SocialPersona" + }, + "DurableId": "SocialPersona", + "QualifiedApiName": "SocialPersona", + "DeveloperName": "SocialPersona", + "Label": "Social Persona", + "PluralLabel": "Social Personas", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/UserProvisioningRequest" + }, + "DurableId": "UserProvisioningRequest", + "QualifiedApiName": "UserProvisioningRequest", + "DeveloperName": "UserProvisioningRequest", + "Label": "User Provisioning Request", + "PluralLabel": "User Provisioning Requests", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DuplicateRecordSet" + }, + "DurableId": "DuplicateRecordSet", + "QualifiedApiName": "DuplicateRecordSet", + "DeveloperName": "DuplicateRecordSet", + "Label": "Duplicate Record Set", + "PluralLabel": "Duplicate Record Sets", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DuplicateRecordItem" + }, + "DurableId": "DuplicateRecordItem", + "QualifiedApiName": "DuplicateRecordItem", + "DeveloperName": "DuplicateRecordItem", + "Label": "Duplicate Record Item", + "PluralLabel": "Duplicate Record Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssetRelationship" + }, + "DurableId": "AssetRelationship", + "QualifiedApiName": "AssetRelationship", + "DeveloperName": "AssetRelationship", + "Label": "Asset Relationship", + "PluralLabel": "Asset Relationships", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/MessagingEndUser" + }, + "DurableId": "MessagingEndUser", + "QualifiedApiName": "MessagingEndUser", + "DeveloperName": "MessagingEndUser", + "Label": "Messaging User", + "PluralLabel": "Messaging Users", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ScorecardMetric" + }, + "DurableId": "ScorecardMetric", + "QualifiedApiName": "ScorecardMetric", + "DeveloperName": "ScorecardMetric", + "Label": "Scorecard Metric", + "PluralLabel": "Scorecard Metrics", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Scorecard" + }, + "DurableId": "Scorecard", + "QualifiedApiName": "Scorecard", + "DeveloperName": "Scorecard", + "Label": "Scorecard", + "PluralLabel": "Scorecards", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/MessagingSession" + }, + "DurableId": "MessagingSession", + "QualifiedApiName": "MessagingSession", + "DeveloperName": "MessagingSession", + "Label": "Messaging Session", + "PluralLabel": "Messaging Sessions", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ReturnOrder" + }, + "DurableId": "ReturnOrder", + "QualifiedApiName": "ReturnOrder", + "DeveloperName": "ReturnOrder", + "Label": "Return Order", + "PluralLabel": "Return Orders", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ScorecardAssociation" + }, + "DurableId": "ScorecardAssociation", + "QualifiedApiName": "ScorecardAssociation", + "DeveloperName": "ScorecardAssociation", + "Label": "Scorecard Association", + "PluralLabel": "Scorecard Associations", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/RecordAction" + }, + "DurableId": "RecordAction", + "QualifiedApiName": "RecordAction", + "DeveloperName": "RecordAction", + "Label": "RecordAction", + "PluralLabel": "RecordActions", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ReturnOrderLineItem" + }, + "DurableId": "ReturnOrderLineItem", + "QualifiedApiName": "ReturnOrderLineItem", + "DeveloperName": "ReturnOrderLineItem", + "Label": "Return Order Line Item", + "PluralLabel": "Return Order Line Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactRequest" + }, + "DurableId": "ContactRequest", + "QualifiedApiName": "ContactRequest", + "DeveloperName": "ContactRequest", + "Label": "Contact Request", + "PluralLabel": "Contact Requests", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactPointAddress" + }, + "DurableId": "ContactPointAddress", + "QualifiedApiName": "ContactPointAddress", + "DeveloperName": "ContactPointAddress", + "Label": "Contact Point Address", + "PluralLabel": "Contact Point Addresses", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactPointEmail" + }, + "DurableId": "ContactPointEmail", + "QualifiedApiName": "ContactPointEmail", + "DeveloperName": "ContactPointEmail", + "Label": "Contact Point Email", + "PluralLabel": "Contact Point Emails", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactPointPhone" + }, + "DurableId": "ContactPointPhone", + "QualifiedApiName": "ContactPointPhone", + "DeveloperName": "ContactPointPhone", + "Label": "Contact Point Phone", + "PluralLabel": "Contact Point Phones", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkTypeGroup" + }, + "DurableId": "WorkTypeGroup", + "QualifiedApiName": "WorkTypeGroup", + "DeveloperName": "WorkTypeGroup", + "Label": "Work Type Group", + "PluralLabel": "Work Type Groups", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ConsumptionSchedule" + }, + "DurableId": "ConsumptionSchedule", + "QualifiedApiName": "ConsumptionSchedule", + "DeveloperName": "ConsumptionSchedule", + "Label": "Consumption Schedule", + "PluralLabel": "Consumption Schedules", + "InternalSharingModel": "Read", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ConsumptionRate" + }, + "DurableId": "ConsumptionRate", + "QualifiedApiName": "ConsumptionRate", + "DeveloperName": "ConsumptionRate", + "Label": "Consumption Rate", + "PluralLabel": "Consumption Rates", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ProductConsumptionSchedule" + }, + "DurableId": "ProductConsumptionSchedule", + "QualifiedApiName": "ProductConsumptionSchedule", + "DeveloperName": "ProductConsumptionSchedule", + "Label": "Product Consumption Schedule", + "PluralLabel": "Product Consumption Schedules", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ServiceTerritoryWorkType" + }, + "DurableId": "ServiceTerritoryWorkType", + "QualifiedApiName": "ServiceTerritoryWorkType", + "DeveloperName": "ServiceTerritoryWorkType", + "Label": "Service Territory Work Type", + "PluralLabel": "Service Territory Work Types", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentGroup" + }, + "DurableId": "PaymentGroup", + "QualifiedApiName": "PaymentGroup", + "DeveloperName": "PaymentGroup", + "Label": "Payment Group", + "PluralLabel": "Payment Groups", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CardPaymentMethod" + }, + "DurableId": "CardPaymentMethod", + "QualifiedApiName": "CardPaymentMethod", + "DeveloperName": "CardPaymentMethod", + "Label": "Card Payment Method", + "PluralLabel": "Card Payment Methods", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactPointConsent" + }, + "DurableId": "ContactPointConsent", + "QualifiedApiName": "ContactPointConsent", + "DeveloperName": "ContactPointConsent", + "Label": "Contact Point Consent", + "PluralLabel": "Contact Point Consents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ContactPointTypeConsent" + }, + "DurableId": "ContactPointTypeConsent", + "QualifiedApiName": "ContactPointTypeConsent", + "DeveloperName": "ContactPointTypeConsent", + "Label": "Contact Point Type Consent", + "PluralLabel": "Contact Point Type Consents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DataUseLegalBasis" + }, + "DurableId": "DataUseLegalBasis", + "QualifiedApiName": "DataUseLegalBasis", + "DeveloperName": "DataUseLegalBasis", + "Label": "Data Use Legal Basis", + "PluralLabel": "Data Use Legal Bases", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DataUsePurpose" + }, + "DurableId": "DataUsePurpose", + "QualifiedApiName": "DataUsePurpose", + "DeveloperName": "DataUsePurpose", + "Label": "Data Use Purpose", + "PluralLabel": "Data Use Purposes", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Image" + }, + "DurableId": "Image", + "QualifiedApiName": "Image", + "DeveloperName": "Image", + "Label": "Image", + "PluralLabel": "Images", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentAuthorization" + }, + "DurableId": "PaymentAuthorization", + "QualifiedApiName": "PaymentAuthorization", + "DeveloperName": "PaymentAuthorization", + "Label": "Payment Authorization", + "PluralLabel": "Payment Authorizations", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Recommendation" + }, + "DurableId": "Recommendation", + "QualifiedApiName": "Recommendation", + "DeveloperName": "Recommendation", + "Label": "Recommendation", + "PluralLabel": "Recommendations", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WebStore" + }, + "DurableId": "WebStore", + "QualifiedApiName": "WebStore", + "DeveloperName": "WebStore", + "Label": "Store", + "PluralLabel": "Stores", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkTypeGroupMember" + }, + "DurableId": "WorkTypeGroupMember", + "QualifiedApiName": "WorkTypeGroupMember", + "DeveloperName": "WorkTypeGroupMember", + "Label": "Work Type Group Member", + "PluralLabel": "Work Type Group Members", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AuthorizationForm" + }, + "DurableId": "AuthorizationForm", + "QualifiedApiName": "AuthorizationForm", + "DeveloperName": "AuthorizationForm", + "Label": "Authorization Form", + "PluralLabel": "Authorization Forms", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AuthorizationFormConsent" + }, + "DurableId": "AuthorizationFormConsent", + "QualifiedApiName": "AuthorizationFormConsent", + "DeveloperName": "AuthorizationFormConsent", + "Label": "Authorization Form Consent", + "PluralLabel": "Authorization Form Consents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AuthorizationFormDataUse" + }, + "DurableId": "AuthorizationFormDataUse", + "QualifiedApiName": "AuthorizationFormDataUse", + "DeveloperName": "AuthorizationFormDataUse", + "Label": "Authorization Form Data Use", + "PluralLabel": "Authorization Form Data Uses", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AuthorizationFormText" + }, + "DurableId": "AuthorizationFormText", + "QualifiedApiName": "AuthorizationFormText", + "DeveloperName": "AuthorizationFormText", + "Label": "Authorization Form Text", + "PluralLabel": "Authorization Form Texts", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CartDeliveryGroup" + }, + "DurableId": "CartDeliveryGroup", + "QualifiedApiName": "CartDeliveryGroup", + "DeveloperName": "CartDeliveryGroup", + "Label": "Cart Delivery Group", + "PluralLabel": "Cart Delivery Groups", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CartItem" + }, + "DurableId": "CartItem", + "QualifiedApiName": "CartItem", + "DeveloperName": "CartItem", + "Label": "Cart Item", + "PluralLabel": "Cart Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/InvoiceLine" + }, + "DurableId": "InvoiceLine", + "QualifiedApiName": "InvoiceLine", + "DeveloperName": "InvoiceLine", + "Label": "Invoice Line", + "PluralLabel": "Invoice Lines", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentGateway" + }, + "DurableId": "PaymentGateway", + "QualifiedApiName": "PaymentGateway", + "DeveloperName": "PaymentGateway", + "Label": "Payment Gateway", + "PluralLabel": "Payment Gateways", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentLineInvoice" + }, + "DurableId": "PaymentLineInvoice", + "QualifiedApiName": "PaymentLineInvoice", + "DeveloperName": "PaymentLineInvoice", + "Label": "Payment Line Invoice", + "PluralLabel": "Payment Line Invoices", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentMethod" + }, + "DurableId": "PaymentMethod", + "QualifiedApiName": "PaymentMethod", + "DeveloperName": "PaymentMethod", + "Label": "Payment Method", + "PluralLabel": "Payment Methods", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Refund" + }, + "DurableId": "Refund", + "QualifiedApiName": "Refund", + "DeveloperName": "Refund", + "Label": "Refund", + "PluralLabel": "Refunds", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Shift" + }, + "DurableId": "Shift", + "QualifiedApiName": "Shift", + "DeveloperName": "Shift", + "Label": "Shift", + "PluralLabel": "Shifts", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WebCart" + }, + "DurableId": "WebCart", + "QualifiedApiName": "WebCart", + "DeveloperName": "WebCart", + "Label": "Cart", + "PluralLabel": "Carts", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssetStatePeriod" + }, + "DurableId": "AssetStatePeriod", + "QualifiedApiName": "AssetStatePeriod", + "DeveloperName": "AssetStatePeriod", + "Label": "Asset State Period", + "PluralLabel": "Asset State Periods", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CreditMemo" + }, + "DurableId": "CreditMemo", + "QualifiedApiName": "CreditMemo", + "DeveloperName": "CreditMemo", + "Label": "Credit Memo", + "PluralLabel": "Credit Memos", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CreditMemoLine" + }, + "DurableId": "CreditMemoLine", + "QualifiedApiName": "CreditMemoLine", + "DeveloperName": "CreditMemoLine", + "Label": "Credit Memo Line", + "PluralLabel": "Credit Memo Lines", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/RefundLinePayment" + }, + "DurableId": "RefundLinePayment", + "QualifiedApiName": "RefundLinePayment", + "DeveloperName": "RefundLinePayment", + "Label": "Refund Line Payment", + "PluralLabel": "Refund Line Payments", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssetAction" + }, + "DurableId": "AssetAction", + "QualifiedApiName": "AssetAction", + "DeveloperName": "AssetAction", + "Label": "Asset Action", + "PluralLabel": "Asset Actions", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AssetActionSource" + }, + "DurableId": "AssetActionSource", + "QualifiedApiName": "AssetActionSource", + "DeveloperName": "AssetActionSource", + "Label": "Asset Action Source", + "PluralLabel": "Asset Action Sources", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CartTax" + }, + "DurableId": "CartTax", + "QualifiedApiName": "CartTax", + "DeveloperName": "CartTax", + "Label": "Cart Tax", + "PluralLabel": "Cart Taxes", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CommSubscription" + }, + "DurableId": "CommSubscription", + "QualifiedApiName": "CommSubscription", + "DeveloperName": "CommSubscription", + "Label": "Communication Subscription", + "PluralLabel": "Communication Subscriptions", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CommSubscriptionChannelType" + }, + "DurableId": "CommSubscriptionChannelType", + "QualifiedApiName": "CommSubscriptionChannelType", + "DeveloperName": "CommSubscriptionChannelType", + "Label": "Communication Subscription Channel Type", + "PluralLabel": "Communication Subscription Channel Types", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CommSubscriptionConsent" + }, + "DurableId": "CommSubscriptionConsent", + "QualifiedApiName": "CommSubscriptionConsent", + "DeveloperName": "CommSubscriptionConsent", + "Label": "Communication Subscription Consent", + "PluralLabel": "Communication Subscription Consents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CommSubscriptionTiming" + }, + "DurableId": "CommSubscriptionTiming", + "QualifiedApiName": "CommSubscriptionTiming", + "DeveloperName": "CommSubscriptionTiming", + "Label": "Communication Subscription Timing", + "PluralLabel": "Communication Subscription Timings", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CredentialStuffingEventStore" + }, + "DurableId": "CredentialStuffingEventStore", + "QualifiedApiName": "CredentialStuffingEventStore", + "DeveloperName": "CredentialStuffingEventStore", + "Label": "Credential Stuffing Event Store", + "PluralLabel": "Credential Stuffing Event Stores", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CreditMemoInvApplication" + }, + "DurableId": "CreditMemoInvApplication", + "QualifiedApiName": "CreditMemoInvApplication", + "DeveloperName": "CreditMemoInvApplication", + "Label": "Credit Memo Invoice Application", + "PluralLabel": "Credit Memo Invoice Applications", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/DigitalWallet" + }, + "DurableId": "DigitalWallet", + "QualifiedApiName": "DigitalWallet", + "DeveloperName": "DigitalWallet", + "Label": "Digital Wallet", + "PluralLabel": "Digital Wallets", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/EngagementChannelType" + }, + "DurableId": "EngagementChannelType", + "QualifiedApiName": "EngagementChannelType", + "DeveloperName": "EngagementChannelType", + "Label": "Engagement Channel Type", + "PluralLabel": "Engagement Channel Types", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/FinanceBalanceSnapshot" + }, + "DurableId": "FinanceBalanceSnapshot", + "QualifiedApiName": "FinanceBalanceSnapshot", + "DeveloperName": "FinanceBalanceSnapshot", + "Label": "Finance Balance Snapshot", + "PluralLabel": "Finance Balance Snapshots", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/FinanceTransaction" + }, + "DurableId": "FinanceTransaction", + "QualifiedApiName": "FinanceTransaction", + "DeveloperName": "FinanceTransaction", + "Label": "Finance Transaction", + "PluralLabel": "Finance Transactions", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LegalEntity" + }, + "DurableId": "LegalEntity", + "QualifiedApiName": "LegalEntity", + "DeveloperName": "LegalEntity", + "Label": "Legal Entity", + "PluralLabel": "Legal Entities", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PartyConsent" + }, + "DurableId": "PartyConsent", + "QualifiedApiName": "PartyConsent", + "DeveloperName": "PartyConsent", + "Label": "Party Consent", + "PluralLabel": "Party Consents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ReportAnomalyEventStore" + }, + "DurableId": "ReportAnomalyEventStore", + "QualifiedApiName": "ReportAnomalyEventStore", + "DeveloperName": "ReportAnomalyEventStore", + "Label": "Report Anomaly Event Store", + "PluralLabel": "Report Anomaly Event Stores", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/SessionHijackingEventStore" + }, + "DurableId": "SessionHijackingEventStore", + "QualifiedApiName": "SessionHijackingEventStore", + "DeveloperName": "SessionHijackingEventStore", + "Label": "Session Hijacking Event Store", + "PluralLabel": "Session Hijacking Event Stores", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkPlan" + }, + "DurableId": "WorkPlan", + "QualifiedApiName": "WorkPlan", + "DeveloperName": "WorkPlan", + "Label": "Work Plan", + "PluralLabel": "Work Plans", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkPlanTemplate" + }, + "DurableId": "WorkPlanTemplate", + "QualifiedApiName": "WorkPlanTemplate", + "DeveloperName": "WorkPlanTemplate", + "Label": "Work Plan Template", + "PluralLabel": "Work Plan Templates", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkPlanTemplateEntry" + }, + "DurableId": "WorkPlanTemplateEntry", + "QualifiedApiName": "WorkPlanTemplateEntry", + "DeveloperName": "WorkPlanTemplateEntry", + "Label": "Work Plan Template Entry", + "PluralLabel": "Work Plan Template Entries", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkStep" + }, + "DurableId": "WorkStep", + "QualifiedApiName": "WorkStep", + "DeveloperName": "WorkStep", + "Label": "Work Step", + "PluralLabel": "Work Steps", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WorkStepTemplate" + }, + "DurableId": "WorkStepTemplate", + "QualifiedApiName": "WorkStepTemplate", + "DeveloperName": "WorkStepTemplate", + "Label": "Work Step Template", + "PluralLabel": "Work Step Templates", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ApiAnomalyEventStore" + }, + "DurableId": "ApiAnomalyEventStore", + "QualifiedApiName": "ApiAnomalyEventStore", + "DeveloperName": "ApiAnomalyEventStore", + "Label": "API Anomaly Event Store", + "PluralLabel": "API Anomaly Event Stores", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LocWaitlistMsgTemplate" + }, + "DurableId": "LocWaitlistMsgTemplate", + "QualifiedApiName": "LocWaitlistMsgTemplate", + "DeveloperName": "LocWaitlistMsgTemplate", + "Label": "Queue Messaging Template", + "PluralLabel": "Queue Messaging Template", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LocationGroup" + }, + "DurableId": "LocationGroup", + "QualifiedApiName": "LocationGroup", + "DeveloperName": "LocationGroup", + "Label": "Location Group", + "PluralLabel": "Location Groups", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LocationGroupAssignment" + }, + "DurableId": "LocationGroupAssignment", + "QualifiedApiName": "LocationGroupAssignment", + "DeveloperName": "LocationGroupAssignment", + "Label": "Location Group Assignment", + "PluralLabel": "Location Group Assignments", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LocationWaitlist" + }, + "DurableId": "LocationWaitlist", + "QualifiedApiName": "LocationWaitlist", + "DeveloperName": "LocationWaitlist", + "Label": "Queue", + "PluralLabel": "Queues", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/LocationWaitlistedParty" + }, + "DurableId": "LocationWaitlistedParty", + "QualifiedApiName": "LocationWaitlistedParty", + "DeveloperName": "LocationWaitlistedParty", + "Label": "Queued Party", + "PluralLabel": "Queued Parties", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/OperatingHoursHoliday" + }, + "DurableId": "OperatingHoursHoliday", + "QualifiedApiName": "OperatingHoursHoliday", + "DeveloperName": "OperatingHoursHoliday", + "Label": "Operating Hours Holiday", + "PluralLabel": "Operating Hours Holidays", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ProcessException" + }, + "DurableId": "ProcessException", + "QualifiedApiName": "ProcessException", + "DeveloperName": "ProcessException", + "Label": "Process Exception", + "PluralLabel": "Process Exceptions", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ReturnOrderItemAdjustment" + }, + "DurableId": "ReturnOrderItemAdjustment", + "QualifiedApiName": "ReturnOrderItemAdjustment", + "DeveloperName": "ReturnOrderItemAdjustment", + "Label": "Return Order Item Adjustment", + "PluralLabel": "Return Order Item Adjustments", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ReturnOrderItemTax" + }, + "DurableId": "ReturnOrderItemTax", + "QualifiedApiName": "ReturnOrderItemTax", + "DeveloperName": "ReturnOrderItemTax", + "Label": "Return Order Item Tax", + "PluralLabel": "Return Order Item Taxes", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AlternativePaymentMethod" + }, + "DurableId": "AlternativePaymentMethod", + "QualifiedApiName": "AlternativePaymentMethod", + "DeveloperName": "AlternativePaymentMethod", + "Label": "Alternative Payment Method", + "PluralLabel": "Alternative Payment Methods", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/PaymentAuthAdjustment" + }, + "DurableId": "PaymentAuthAdjustment", + "QualifiedApiName": "PaymentAuthAdjustment", + "DeveloperName": "PaymentAuthAdjustment", + "Label": "Payment Authorization Adjustment", + "PluralLabel": "Payment Authorization Adjustments", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/AppointmentTopicTimeSlot" + }, + "DurableId": "AppointmentTopicTimeSlot", + "QualifiedApiName": "AppointmentTopicTimeSlot", + "DeveloperName": "AppointmentTopicTimeSlot", + "Label": "Appointment Topic Time Slot", + "PluralLabel": "Appointment Topic Time Slots", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "ReadWrite", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/BusinessBrand" + }, + "DurableId": "BusinessBrand", + "QualifiedApiName": "BusinessBrand", + "DeveloperName": "BusinessBrand", + "Label": "Business Brand", + "PluralLabel": "Business Brands", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/CaseRelatedIssue" + }, + "DurableId": "CaseRelatedIssue", + "QualifiedApiName": "CaseRelatedIssue", + "DeveloperName": "CaseRelatedIssue", + "Label": "Case Related Issue", + "PluralLabel": "Case Related Issues", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ChangeRequest" + }, + "DurableId": "ChangeRequest", + "QualifiedApiName": "ChangeRequest", + "DeveloperName": "ChangeRequest", + "Label": "Change Request", + "PluralLabel": "Change Requests", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ChangeRequestRelatedIssue" + }, + "DurableId": "ChangeRequestRelatedIssue", + "QualifiedApiName": "ChangeRequestRelatedIssue", + "DeveloperName": "ChangeRequestRelatedIssue", + "Label": "Change Request Related Issue", + "PluralLabel": "Change Request Related Issues", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Customer" + }, + "DurableId": "Customer", + "QualifiedApiName": "Customer", + "DeveloperName": "Customer", + "Label": "Customer", + "PluralLabel": "Customers", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Incident" + }, + "DurableId": "Incident", + "QualifiedApiName": "Incident", + "DeveloperName": "Incident", + "Label": "Incident", + "PluralLabel": "Incidents", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Problem" + }, + "DurableId": "Problem", + "QualifiedApiName": "Problem", + "DeveloperName": "Problem", + "Label": "Problem", + "PluralLabel": "Problems", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ProblemIncident" + }, + "DurableId": "ProblemIncident", + "QualifiedApiName": "ProblemIncident", + "DeveloperName": "ProblemIncident", + "Label": "Related Problem and Incident", + "PluralLabel": "Related Problems and Incidents", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Seller" + }, + "DurableId": "Seller", + "QualifiedApiName": "Seller", + "DeveloperName": "Seller", + "Label": "Seller", + "PluralLabel": "Sellers", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ChangeRequestRelatedItem" + }, + "DurableId": "ChangeRequestRelatedItem", + "QualifiedApiName": "ChangeRequestRelatedItem", + "DeveloperName": "ChangeRequestRelatedItem", + "Label": "Change Request Related Item", + "PluralLabel": "Change Request Related Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/IncidentRelatedItem" + }, + "DurableId": "IncidentRelatedItem", + "QualifiedApiName": "IncidentRelatedItem", + "DeveloperName": "IncidentRelatedItem", + "Label": "Incident Related Item", + "PluralLabel": "Incident Related Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/ProblemRelatedItem" + }, + "DurableId": "ProblemRelatedItem", + "QualifiedApiName": "ProblemRelatedItem", + "DeveloperName": "ProblemRelatedItem", + "Label": "Problem Related Item", + "PluralLabel": "Problem Related Items", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/WebCartAdjustmentBasis" + }, + "DurableId": "WebCartAdjustmentBasis", + "QualifiedApiName": "WebCartAdjustmentBasis", + "DeveloperName": "WebCartAdjustmentBasis", + "Label": "Cart Adjustment Basis", + "PluralLabel": "Cart Adjustment Bases", + "InternalSharingModel": "ControlledByParent", + "ExternalSharingModel": "ControlledByParent", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/Activity" + }, + "DurableId": "Activity", + "QualifiedApiName": "Activity", + "DeveloperName": "Activity", + "Label": "Activity", + "PluralLabel": "Activities", + "InternalSharingModel": "Private", + "ExternalSharingModel": "Private", + "DeploymentStatus": null + }, + { + "attributes": { + "type": "EntityDefinition", + "url": "/services/data/v54.0/tooling/sobjects/EntityDefinition/01I5i000000Y6fp" + }, + "DurableId": "01I5i000000Y6fp", + "QualifiedApiName": "Property__c", + "DeveloperName": "Property", + "Label": "Property", + "PluralLabel": "Properties", + "InternalSharingModel": "ReadWrite", + "ExternalSharingModel": "Private", + "DeploymentStatus": "Deployed" + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_fields_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_fields_soql_response.json new file mode 100644 index 00000000000000..fb8a815a37d441 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_fields_soql_response.json @@ -0,0 +1,81 @@ +{ + "size": 3, + "totalSize": 3, + "done": true, + "queryLocator": null, + "entityTypeName": "CustomField", + "records": [ + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004hSOmEAM" + }, + "DeveloperName": "Price", + "CreatedDate": "2022-05-04T11:01:45.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-04T11:01:45.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004jLgGEAU" + }, + "DeveloperName": "Description", + "CreatedDate": "2022-05-17T10:44:17.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": "more details about property", + "LastModifiedDate": "2022-05-17T10:44:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + }, + { + "attributes": { + "type": "CustomField", + "url": "/services/data/v54.0/tooling/sobjects/CustomField/00N5i000004jN1REAU" + }, + "DeveloperName": "Active", + "CreatedDate": "2022-05-17T12:26:33.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "InlineHelpText": null, + "LastModifiedDate": "2022-05-17T12:26:33.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_object_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_object_soql_response.json new file mode 100644 index 00000000000000..6b0fb98e96043f --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/property_custom_object_soql_response.json @@ -0,0 +1,34 @@ +{ + "size": 1, + "totalSize": 1, + "done": true, + "queryLocator": null, + "entityTypeName": "CustomObject", + "records": [ + { + "attributes": { + "type": "CustomObject", + "url": "/services/data/v54.0/tooling/sobjects/CustomObject/01I5i000000Y6fpEAC" + }, + "Description": "A tangible asset such as an apartment, a house, etc", + "Language": "en_US", + "ManageableState": "unmanaged", + "CreatedDate": "2022-05-04T10:59:12.000+0000", + "CreatedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "LastModifiedDate": "2022-05-17T10:40:43.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + } + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/property_fields_soql_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/property_fields_soql_response.json new file mode 100644 index 00000000000000..23c3777733bec2 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/property_fields_soql_response.json @@ -0,0 +1,544 @@ +{ + "size": 15, + "totalSize": 15, + "done": true, + "queryLocator": null, + "entityTypeName": "EntityParticle", + "records": [ + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.Id" + }, + "QualifiedApiName": "Id", + "DeveloperName": "Id", + "Label": "Record ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.Id" + }, + "DataType": "Lookup()", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "id", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.Owner" + }, + "QualifiedApiName": "OwnerId", + "DeveloperName": "Owner", + "Label": "Owner ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.Owner" + }, + "DataType": "Lookup(User,Group)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "Group", + "User" + ] + }, + "RelationshipName": "Owner", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.IsDeleted" + }, + "QualifiedApiName": "IsDeleted", + "DeveloperName": "IsDeleted", + "Label": "Deleted", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.IsDeleted" + }, + "DataType": "Checkbox", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "boolean", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.Name" + }, + "QualifiedApiName": "Name", + "DeveloperName": "Name", + "Label": "Property Name", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.Name" + }, + "DataType": "Text(80)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "string", + "Precision": 0, + "Scale": 0, + "Length": 80, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.CreatedDate" + }, + "QualifiedApiName": "CreatedDate", + "DeveloperName": "CreatedDate", + "Label": "Created Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.CreatedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.CreatedBy" + }, + "QualifiedApiName": "CreatedById", + "DeveloperName": "CreatedBy", + "Label": "Created By ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.CreatedBy" + }, + "DataType": "Lookup(User)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "User" + ] + }, + "RelationshipName": "CreatedBy", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.LastModifiedDate" + }, + "QualifiedApiName": "LastModifiedDate", + "DeveloperName": "LastModifiedDate", + "Label": "Last Modified Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.LastModifiedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.LastModifiedBy" + }, + "QualifiedApiName": "LastModifiedById", + "DeveloperName": "LastModifiedBy", + "Label": "Last Modified By ID", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.LastModifiedBy" + }, + "DataType": "Lookup(User)", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "reference", + "Precision": 0, + "Scale": 0, + "Length": 18, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": [ + "User" + ] + }, + "RelationshipName": "LastModifiedBy", + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.SystemModstamp" + }, + "QualifiedApiName": "SystemModstamp", + "DeveloperName": "SystemModstamp", + "Label": "System Modstamp", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.SystemModstamp" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": true, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.LastActivityDate" + }, + "QualifiedApiName": "LastActivityDate", + "DeveloperName": "LastActivityDate", + "Label": "Last Activity Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.LastActivityDate" + }, + "DataType": "Date", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "date", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.LastViewedDate" + }, + "QualifiedApiName": "LastViewedDate", + "DeveloperName": "LastViewedDate", + "Label": "Last Viewed Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.LastViewedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.LastReferencedDate" + }, + "QualifiedApiName": "LastReferencedDate", + "DeveloperName": "LastReferencedDate", + "Label": "Last Referenced Date", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.LastReferencedDate" + }, + "DataType": "Date/Time", + "LastModifiedDate": null, + "LastModifiedBy": null, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "datetime", + "Precision": 0, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.00N5i000004hSOm" + }, + "QualifiedApiName": "Price__c", + "DeveloperName": "Price", + "Label": "Price", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.00N5i000004hSOm" + }, + "DataType": "Currency(18, 0)", + "LastModifiedDate": "2022-05-04T11:01:45.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "currency", + "Precision": 18, + "Scale": 0, + "Length": 0, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.00N5i000004jLgG" + }, + "QualifiedApiName": "Description__c", + "DeveloperName": "Description", + "Label": "Description", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.00N5i000004jLgG" + }, + "DataType": "Text Area(255)", + "LastModifiedDate": "2022-05-17T10:44:17.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "textarea", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": true + }, + { + "attributes": { + "type": "EntityParticle", + "url": "/services/data/v54.0/tooling/sobjects/EntityParticle/01I5i000000Y6fp.00N5i000004jN1R" + }, + "QualifiedApiName": "Active__c", + "DeveloperName": "Active", + "Label": "Active", + "FieldDefinition": { + "attributes": { + "type": "FieldDefinition", + "url": "/services/data/v54.0/tooling/sobjects/FieldDefinition/01I5i000000Y6fp.00N5i000004jN1R" + }, + "DataType": "Picklist", + "LastModifiedDate": "2022-05-17T12:26:33.000+0000", + "LastModifiedBy": { + "attributes": { + "type": "User", + "url": "/services/data/v54.0/tooling/sobjects/User/0055i000001Vi2IAAS" + }, + "Username": "user@mydomain.com" + }, + "IsIndexed": false, + "ComplianceGroup": null, + "SecurityClassification": null + }, + "DataType": "picklist", + "Precision": 0, + "Scale": 0, + "Length": 255, + "Digits": 0, + "IsUnique": false, + "IsCompound": false, + "IsComponent": false, + "ReferenceTo": { + "referenceTo": null + }, + "RelationshipName": null, + "IsNillable": false + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/record_count_property_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/record_count_property_response.json new file mode 100644 index 00000000000000..dd193cc507081c --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/record_count_property_response.json @@ -0,0 +1,8 @@ +{ + "sObjects": [ + { + "count": 3, + "name": "Property__c" + } + ] +} \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/mock_files/versions_response.json b/metadata-ingestion/tests/integration/salesforce/mock_files/versions_response.json new file mode 100644 index 00000000000000..13dfd022c51b8a --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/mock_files/versions_response.json @@ -0,0 +1,172 @@ +[ + { + "label": "Spring '11", + "url": "/services/data/v21.0", + "version": "21.0" + }, + { + "label": "Summer '11", + "url": "/services/data/v22.0", + "version": "22.0" + }, + { + "label": "Winter '12", + "url": "/services/data/v23.0", + "version": "23.0" + }, + { + "label": "Spring '12", + "url": "/services/data/v24.0", + "version": "24.0" + }, + { + "label": "Summer '12", + "url": "/services/data/v25.0", + "version": "25.0" + }, + { + "label": "Winter '13", + "url": "/services/data/v26.0", + "version": "26.0" + }, + { + "label": "Spring '13", + "url": "/services/data/v27.0", + "version": "27.0" + }, + { + "label": "Summer '13", + "url": "/services/data/v28.0", + "version": "28.0" + }, + { + "label": "Winter '14", + "url": "/services/data/v29.0", + "version": "29.0" + }, + { + "label": "Spring '14", + "url": "/services/data/v30.0", + "version": "30.0" + }, + { + "label": "Summer '14", + "url": "/services/data/v31.0", + "version": "31.0" + }, + { + "label": "Winter '15", + "url": "/services/data/v32.0", + "version": "32.0" + }, + { + "label": "Spring '15", + "url": "/services/data/v33.0", + "version": "33.0" + }, + { + "label": "Summer '15", + "url": "/services/data/v34.0", + "version": "34.0" + }, + { + "label": "Winter '16", + "url": "/services/data/v35.0", + "version": "35.0" + }, + { + "label": "Spring '16", + "url": "/services/data/v36.0", + "version": "36.0" + }, + { + "label": "Summer '16", + "url": "/services/data/v37.0", + "version": "37.0" + }, + { + "label": "Winter '17", + "url": "/services/data/v38.0", + "version": "38.0" + }, + { + "label": "Spring '17", + "url": "/services/data/v39.0", + "version": "39.0" + }, + { + "label": "Summer '17", + "url": "/services/data/v40.0", + "version": "40.0" + }, + { + "label": "Winter '18", + "url": "/services/data/v41.0", + "version": "41.0" + }, + { + "label": "Spring ’18", + "url": "/services/data/v42.0", + "version": "42.0" + }, + { + "label": "Summer '18", + "url": "/services/data/v43.0", + "version": "43.0" + }, + { + "label": "Winter '19", + "url": "/services/data/v44.0", + "version": "44.0" + }, + { + "label": "Spring '19", + "url": "/services/data/v45.0", + "version": "45.0" + }, + { + "label": "Summer '19", + "url": "/services/data/v46.0", + "version": "46.0" + }, + { + "label": "Winter '20", + "url": "/services/data/v47.0", + "version": "47.0" + }, + { + "label": "Spring '20", + "url": "/services/data/v48.0", + "version": "48.0" + }, + { + "label": "Summer '20", + "url": "/services/data/v49.0", + "version": "49.0" + }, + { + "label": "Winter '21", + "url": "/services/data/v50.0", + "version": "50.0" + }, + { + "label": "Spring '21", + "url": "/services/data/v51.0", + "version": "51.0" + }, + { + "label": "Summer '21", + "url": "/services/data/v52.0", + "version": "52.0" + }, + { + "label": "Winter '22", + "url": "/services/data/v53.0", + "version": "53.0" + }, + { + "label": "Spring '22", + "url": "/services/data/v54.0", + "version": "54.0" + } +] \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/salesforce_mces_golden.json b/metadata-ingestion/tests/integration/salesforce/salesforce_mces_golden.json new file mode 100644 index 00000000000000..6cb938aaa04c69 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/salesforce_mces_golden.json @@ -0,0 +1,192 @@ +[ +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "value": "{\"customProperties\": {\"Durable Id\": \"Account\", \"Qualified API Name\": \"Account\", \"Developer Name\": \"Account\", \"Label\": \"Account\", \"Plural Label\": \"Accounts\", \"Internal Sharing Model\": \"ReadWrite\", \"External Sharing Model\": \"Private\"}, \"name\": \"Account\", \"tags\": []}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "value": "{\"schemaName\": \"\", \"platform\": \"urn:li:dataPlatform:salesforce\", \"version\": 0, \"created\": {\"time\": 0, \"actor\": \"urn:li:corpuser:unknown\"}, \"lastModified\": {\"time\": 0, \"actor\": \"urn:li:corpuser:unknown\"}, \"hash\": \"\", \"platformSchema\": {\"com.linkedin.schema.OtherSchema\": {\"rawSchema\": \"\"}}, \"fields\": [{\"fieldPath\": \"Id\", \"nullable\": false, \"description\": \"Account ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup()\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"IsDeleted\", \"nullable\": false, \"description\": \"Deleted\", \"type\": {\"type\": {\"com.linkedin.schema.BooleanType\": {}}}, \"nativeDataType\": \"Checkbox\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"MasterRecordId\", \"nullable\": true, \"description\": \"Master Record ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(Account)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Name\", \"nullable\": false, \"description\": \"Account Name\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Name\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CompareName\", \"nullable\": true, \"description\": \"Compare Name\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(80)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Type\", \"nullable\": true, \"description\": \"Account Type\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ParentId\", \"nullable\": true, \"description\": \"Parent Account ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Hierarchy\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingStreet\", \"nullable\": true, \"description\": \"Billing Street\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingCity\", \"nullable\": true, \"description\": \"Billing City\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingState\", \"nullable\": true, \"description\": \"Billing State/Province\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingPostalCode\", \"nullable\": true, \"description\": \"Billing Zip/Postal Code\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingCountry\", \"nullable\": true, \"description\": \"Billing Country\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingLatitude\", \"nullable\": true, \"description\": \"Billing Latitude\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingLongitude\", \"nullable\": true, \"description\": \"Billing Longitude\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"BillingGeocodeAccuracy\", \"nullable\": true, \"description\": \"Billing Geocode Accuracy\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingStreet\", \"nullable\": true, \"description\": \"Shipping Street\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingCity\", \"nullable\": true, \"description\": \"Shipping City\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingState\", \"nullable\": true, \"description\": \"Shipping State/Province\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingPostalCode\", \"nullable\": true, \"description\": \"Shipping Zip/Postal Code\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingCountry\", \"nullable\": true, \"description\": \"Shipping Country\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingLatitude\", \"nullable\": true, \"description\": \"Shipping Latitude\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingLongitude\", \"nullable\": true, \"description\": \"Shipping Longitude\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ShippingGeocodeAccuracy\", \"nullable\": true, \"description\": \"Shipping Geocode Accuracy\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Address\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Phone\", \"nullable\": true, \"description\": \"Account Phone\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Phone\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Fax\", \"nullable\": true, \"description\": \"Account Fax\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Fax\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"AccountNumber\", \"nullable\": true, \"description\": \"Account Number\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(40)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Website\", \"nullable\": true, \"description\": \"Website\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"URL(255)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"PhotoUrl\", \"nullable\": true, \"description\": \"Photo URL\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"URL(255)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Sic\", \"nullable\": true, \"description\": \"SIC Code\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(20)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Industry\", \"nullable\": true, \"description\": \"Industry\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"AnnualRevenue\", \"nullable\": true, \"description\": \"Annual Revenue\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Currency(18, 0)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"NumberOfEmployees\", \"nullable\": true, \"description\": \"Employees\", \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Number(8, 0)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Ownership\", \"nullable\": true, \"description\": \"Ownership\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"TickerSymbol\", \"nullable\": true, \"description\": \"Ticker Symbol\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Content(20)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Description\", \"nullable\": true, \"description\": \"Account Description\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Long Text Area(32000)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Rating\", \"nullable\": true, \"description\": \"Account Rating\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Site\", \"nullable\": true, \"description\": \"Account Site\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(80)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CompareSite\", \"nullable\": true, \"description\": \"Compare Site\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(80)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"OwnerId\", \"nullable\": false, \"description\": \"Owner ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"OwnerAlias\", \"nullable\": true, \"description\": \"Owner Alias\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(30)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CreatedDate\", \"nullable\": false, \"description\": \"Created Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CreatedById\", \"nullable\": false, \"description\": \"Created By ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastModifiedDate\", \"nullable\": false, \"description\": \"Last Modified Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastModifiedById\", \"nullable\": false, \"description\": \"Last Modified By ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SystemModstamp\", \"nullable\": false, \"description\": \"System Modstamp\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastActivityDate\", \"nullable\": true, \"description\": \"Last Activity\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastViewedDate\", \"nullable\": true, \"description\": \"Last Viewed Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastReferencedDate\", \"nullable\": true, \"description\": \"Last Referenced Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Jigsaw\", \"nullable\": true, \"description\": \"Data.com Key\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(20)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"JigsawCompanyId\", \"nullable\": true, \"description\": \"Jigsaw Company ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"External Lookup\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CleanStatus\", \"nullable\": true, \"description\": \"Clean Status\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"AccountSource\", \"nullable\": true, \"description\": \"Account Source\", \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"DunsNumber\", \"nullable\": true, \"description\": \"D-U-N-S Number\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(9)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Tradestyle\", \"nullable\": true, \"description\": \"Tradestyle\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(255)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"NaicsCode\", \"nullable\": true, \"description\": \"NAICS Code\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(8)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"NaicsDesc\", \"nullable\": true, \"description\": \"NAICS Description\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(120)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"YearStarted\", \"nullable\": true, \"description\": \"Year Started\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(4)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SicDesc\", \"nullable\": true, \"description\": \"SIC Description\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(80)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"DandbCompanyId\", \"nullable\": true, \"description\": \"D&B Company ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(D&B Company)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"OperatingHoursId\", \"nullable\": true, \"description\": \"Operating Hour ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(Operating Hours)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ConnectionReceivedDate\", \"nullable\": true, \"description\": \"Received Connection Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"ConnectionSentDate\", \"nullable\": true, \"description\": \"Sent Connection Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Tier\", \"nullable\": true, \"description\": \"Einstein Account Tier\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(2)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CustomerPriority__c\", \"nullable\": true, \"description\": \"Customer Priority\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SLA__c\", \"nullable\": true, \"description\": \"SLA\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Active__c\", \"nullable\": true, \"description\": \"Active\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"NumberofLocations__c\", \"nullable\": true, \"description\": \"Number of Locations\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Number(3, 0)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"UpsellOpportunity__c\", \"nullable\": true, \"description\": \"Upsell Opportunity\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SLASerialNumber__c\", \"nullable\": true, \"description\": \"SLA Serial Number\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(10)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SLAExpirationDate__c\", \"nullable\": true, \"description\": \"SLA Expiration Date\", \"created\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651461737000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}], \"primaryKeys\": [\"Id\"], \"foreignKeys\": [{\"name\": \"MasterRecord\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),MasterRecordId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD)\"}, {\"name\": \"Parent\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),ParentId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD)\"}, {\"name\": \"Owner\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),OwnerId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}, {\"name\": \"CreatedBy\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),CreatedById)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}, {\"name\": \"LastModifiedBy\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),LastModifiedById)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}, {\"name\": \"DandbCompany\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,DandBCompany,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),DandbCompanyId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,DandBCompany,PROD)\"}, {\"name\": \"OperatingHours\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,OperatingHours,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD),OperatingHoursId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,OperatingHours,PROD)\"}]}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Account,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "value": "{\"typeNames\": [\"Standard Object\"]}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "operation", + "aspect": { + "value": "{\"timestampMillis\": 1651661952000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"actor\": \"urn:li:corpuser:user@mydomain.com\", \"operationType\": \"CREATE\", \"lastUpdatedTimestamp\": 1651661952000}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "operation", + "aspect": { + "value": "{\"timestampMillis\": 1652784043000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"actor\": \"urn:li:corpuser:user@mydomain.com\", \"operationType\": \"ALTER\", \"lastUpdatedTimestamp\": 1652784043000}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "datasetProperties", + "aspect": { + "value": "{\"customProperties\": {\"Durable Id\": \"01I5i000000Y6fp\", \"Qualified API Name\": \"Property__c\", \"Developer Name\": \"Property\", \"Label\": \"Property\", \"Plural Label\": \"Properties\", \"Internal Sharing Model\": \"ReadWrite\", \"External Sharing Model\": \"Private\", \"Language\": \"en_US\", \"Manageable State\": \"unmanaged\"}, \"name\": \"Property\", \"description\": \"A tangible asset such as an apartment, a house, etc\", \"tags\": []}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "schemaMetadata", + "aspect": { + "value": "{\"schemaName\": \"\", \"platform\": \"urn:li:dataPlatform:salesforce\", \"version\": 0, \"created\": {\"time\": 1651661952000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 0, \"actor\": \"urn:li:corpuser:unknown\"}, \"hash\": \"\", \"platformSchema\": {\"com.linkedin.schema.OtherSchema\": {\"rawSchema\": \"\"}}, \"fields\": [{\"fieldPath\": \"Id\", \"nullable\": false, \"description\": \"Record ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup()\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"OwnerId\", \"nullable\": false, \"description\": \"Owner ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User,Group)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"IsDeleted\", \"nullable\": false, \"description\": \"Deleted\", \"type\": {\"type\": {\"com.linkedin.schema.BooleanType\": {}}}, \"nativeDataType\": \"Checkbox\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Name\", \"nullable\": true, \"description\": \"Property Name\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text(80)\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CreatedDate\", \"nullable\": false, \"description\": \"Created Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"CreatedById\", \"nullable\": false, \"description\": \"Created By ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastModifiedDate\", \"nullable\": false, \"description\": \"Last Modified Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastModifiedById\", \"nullable\": false, \"description\": \"Last Modified By ID\", \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Lookup(User)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"SystemModstamp\", \"nullable\": false, \"description\": \"System Modstamp\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:SystemField\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastActivityDate\", \"nullable\": true, \"description\": \"Last Activity Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastViewedDate\", \"nullable\": true, \"description\": \"Last Viewed Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"LastReferencedDate\", \"nullable\": true, \"description\": \"Last Referenced Date\", \"type\": {\"type\": {\"com.linkedin.schema.DateType\": {}}}, \"nativeDataType\": \"Date/Time\", \"recursive\": false, \"globalTags\": {\"tags\": []}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Price__c\", \"nullable\": false, \"description\": \"Price\", \"created\": {\"time\": 1651662105000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1651662105000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.NumberType\": {}}}, \"nativeDataType\": \"Currency(18, 0)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Description__c\", \"nullable\": true, \"description\": \"Description\", \"created\": {\"time\": 1652784257000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1652784257000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.StringType\": {}}}, \"nativeDataType\": \"Text Area(255)\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}, {\"fieldPath\": \"Active__c\", \"nullable\": false, \"description\": \"Active\", \"created\": {\"time\": 1652790393000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"lastModified\": {\"time\": 1652790393000, \"actor\": \"urn:li:corpuser:user@mydomain.com\"}, \"type\": {\"type\": {\"com.linkedin.schema.EnumType\": {}}}, \"nativeDataType\": \"Picklist\", \"recursive\": false, \"globalTags\": {\"tags\": [{\"tag\": \"urn:li:tag:Custom\"}]}, \"isPartOfKey\": false, \"jsonProps\": \"{}\"}], \"primaryKeys\": [\"Id\"], \"foreignKeys\": [{\"name\": \"Owner\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Group,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD),OwnerId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,Group,PROD)\"}, {\"name\": \"Owner\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD),OwnerId)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}, {\"name\": \"CreatedBy\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD),CreatedById)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}, {\"name\": \"LastModifiedBy\", \"foreignFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD),Id)\"], \"sourceFields\": [\"urn:li:schemaField:(urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD),LastModifiedById)\"], \"foreignDataset\": \"urn:li:dataset:(urn:li:dataPlatform:salesforce,User,PROD)\"}]}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "subTypes", + "aspect": { + "value": "{\"typeNames\": [\"Custom Object\"]}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "domains", + "aspect": { + "value": "{\"domains\": [\"urn:li:domain:sales\"]}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +}, +{ + "auditHeader": null, + "entityType": "dataset", + "entityUrn": "urn:li:dataset:(urn:li:dataPlatform:salesforce,Property__c,PROD)", + "entityKeyAspect": null, + "changeType": "UPSERT", + "aspectName": "datasetProfile", + "aspect": { + "value": "{\"timestampMillis\": 1652353200000, \"partitionSpec\": {\"type\": \"FULL_TABLE\", \"partition\": \"FULL_TABLE_SNAPSHOT\"}, \"rowCount\": 3, \"columnCount\": 15}", + "contentType": "application/json" + }, + "systemMetadata": { + "lastObserved": 1652353200000, + "runId": "salesforce-test", + "registryName": null, + "registryVersion": null, + "properties": null + } +} +] \ No newline at end of file diff --git a/metadata-ingestion/tests/integration/salesforce/test_salesforce.py b/metadata-ingestion/tests/integration/salesforce/test_salesforce.py new file mode 100644 index 00000000000000..6b3d8c1f7dc141 --- /dev/null +++ b/metadata-ingestion/tests/integration/salesforce/test_salesforce.py @@ -0,0 +1,114 @@ +import json +import pathlib +from unittest import mock + +from freezegun import freeze_time + +from datahub.ingestion.run.pipeline import Pipeline +from tests.test_helpers import mce_helpers + +FROZEN_TIME = "2022-05-12 11:00:00" + +test_resources_dir = None + + +def _read_response(file_name: str) -> dict: + response_json_path = f"{test_resources_dir}/mock_files/{file_name}" + with open(response_json_path) as file: + data = json.loads(file.read()) + return data + + +def side_effect_call_salesforce(type, url): + class MockResponse: + def __init__(self, json_data, status_code): + self.json_data = json_data + self.status_code = status_code + + def json(self): + return self.json_data + + if url.endswith("/services/data/"): + return MockResponse(_read_response("versions_response.json"), 200) + if url.endswith("FROM EntityDefinition WHERE IsCustomizable = true"): + return MockResponse(_read_response("entity_definition_soql_response.json"), 200) + elif url.endswith("FROM EntityParticle WHERE EntityDefinitionId='Account'"): + return MockResponse(_read_response("account_fields_soql_response.json"), 200) + elif url.endswith("FROM CustomField WHERE EntityDefinitionId='Account'"): + return MockResponse( + _read_response("account_custom_fields_soql_response.json"), 200 + ) + elif url.endswith("FROM CustomObject where DeveloperName='Property'"): + return MockResponse( + _read_response("property_custom_object_soql_response.json"), 200 + ) + elif url.endswith( + "FROM EntityParticle WHERE EntityDefinitionId='01I5i000000Y6fp'" + ): # DurableId of Property__c + return MockResponse(_read_response("property_fields_soql_response.json"), 200) + elif url.endswith("FROM CustomField WHERE EntityDefinitionId='01I5i000000Y6fp'"): + return MockResponse( + _read_response("property_custom_fields_soql_response.json"), 200 + ) + elif url.endswith("/recordCount?sObjects=Property__c"): + return MockResponse(_read_response("record_count_property_response.json"), 200) + return MockResponse({}, 404) + + +@freeze_time(FROZEN_TIME) +def test_salesforce_ingest(pytestconfig, tmp_path): + + global test_resources_dir + test_resources_dir = pathlib.Path( + pytestconfig.rootpath / "tests/integration/salesforce" + ) + + with mock.patch("simple_salesforce.Salesforce") as mock_sdk: + mock_sf = mock.Mock() + mocked_call = mock.Mock() + mocked_call.side_effect = side_effect_call_salesforce + mock_sf._call_salesforce = mocked_call + mock_sdk.return_value = mock_sf + + pipeline = Pipeline.create( + { + "run_id": "salesforce-test", + "source": { + "type": "salesforce", + "config": { + "auth": "DIRECT_ACCESS_TOKEN", + "instance_url": "https://mydomain.my.salesforce.com/", + "access_token": "access_token`", + "ingest_tags": True, + "object_pattern": { + "allow": [ + "^Account$", + "^Property__c$", + ], + }, + "domain": {"sales": {"allow": {"^Property__c$"}}}, + "profiling": {"enabled": True}, + "profile_pattern": { + "allow": [ + "^Property__c$", + ] + }, + }, + }, + "sink": { + "type": "file", + "config": { + "filename": f"{tmp_path}/salesforce_mces.json", + }, + }, + } + ) + pipeline.run() + pipeline.raise_from_status() + + mce_helpers.check_golden_file( + pytestconfig, + output_path=f"{tmp_path}/salesforce_mces.json", + golden_path=test_resources_dir / "salesforce_mces_golden.json", + ignore_paths=mce_helpers.IGNORE_PATH_TIMESTAMPS, + ) diff --git a/metadata-service/war/src/main/resources/boot/data_platforms.json b/metadata-service/war/src/main/resources/boot/data_platforms.json index 79280bcc2a8ad0..2825f05e694072 100644 --- a/metadata-service/war/src/main/resources/boot/data_platforms.json +++ b/metadata-service/war/src/main/resources/boot/data_platforms.json @@ -486,6 +486,16 @@ "logoUrl": "/assets/platforms/pulsarlogo.png" } }, + { + "urn": "urn:li:dataPlatform:salesforce", + "aspect": { + "datasetNameDelimiter": ".", + "name": "salesforce", + "displayName": "Salesforce", + "type": "OTHERS", + "logoUrl": "/assets/platforms/logo-salesforce.svg" + } + }, { "urn": "urn:li:dataPlatform:unknown", "aspect": {