Skip to content
Snippets Groups Projects
Commit c62dafb1 authored by Sebastian Pongratz's avatar Sebastian Pongratz :ping_pong:
Browse files

Merge branch '2021.0_duplicates' into '2021.0'

2021.0 duplicates

See merge request xrm/basic!742
parents df671c04 9d0a859a
No related branches found
No related tags found
No related merge requests found
Showing
with 78 additions and 444 deletions
import("system.vars");
import("system.result");
//let clusterId = vars.get("$sys.selection");
let clusterId = vars.get("$param.ClusterId_param");
result.string(clusterId);
\ No newline at end of file
import("system.result");
result.string("Person_entity");
\ No newline at end of file
import("system.result");
import("system.translate");
result.string(translate.text("Person duplicates"));
\ No newline at end of file
import("Sql_lib");
import("system.logging");
import("system.db");
import("system.vars");
import("system.result");
var INDEX_CLUSTERID = 0;
var INDEX_FIRSTNAME = 1;
var INDEX_LASTNAME = 2;
var INDEX_ORGNAME = 1;
let targetEntity = vars.get("$param.TargetEntity");
let duplicates = [];
let selectedClusterId = vars.get("$param.ClusterId_param");
let duplicateInfosQuery = new SqlBuilder();
let selectedId = vars.get("$local.idvalues");
if(selectedId)
{
/*
* Definitely a todo.
* Support for the action "Ignore whole cluster"
* If this action is used two times in a row, an error occurs on the second time.
* Although the selected record isn't present in the recordcontainer any more, the core tries to load a record with the same id.
* As a result an error gets thrown. If a dummy record gets returned here, it plays along with the current internal logic and doesn't throw an error.
* If a preview should be shown, this part of the container has to be extended.
*/
duplicates.push([selectedId, "", "", "", ""]);
result.object(duplicates);
}
else
{
if(targetEntity == "Person_entity")
{
duplicateInfosQuery.select("CLUSTERID, FIRSTNAME, LASTNAME")
.from("DUPLICATECLUSTERS")
.join("CONTACT", "CONTACT.CONTACTID = DUPLICATEID")
.join("PERSON", "PERSON.PERSONID = CONTACT.PERSON_ID")
.where("DUPLICATEID not in (select UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID from UNRELATEDDUPLICATES)")
.andIfSet("DUPLICATECLUSTERS.CLUSTERID", selectedClusterId)
.orderBy("CLUSTERID");
}
else
{
duplicateInfosQuery.select("CLUSTERID, ORGANISATION.\"NAME\"")
.from("DUPLICATECLUSTERS")
.join("CONTACT", "CONTACT.CONTACTID = DUPLICATEID")
.join("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
.where("DUPLICATEID not in (select UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID from UNRELATEDDUPLICATES)")
.andIfSet("DUPLICATECLUSTERS.CLUSTERID", vars.get("$local.idvalues"), SqlBuilder.IN())
.orderBy("CLUSTERID");
}
let duplicateInfos = duplicateInfosQuery.table();
let MAX_SHOW_CLUSTER_RECORDS = 4;
let recordClusterId = "";
let recordDescription = "";
let recordDuplicateInClusterCount = 0;
for (let i = 0; i < duplicateInfos.length; i++)
{
let currentClusterId = duplicateInfos[i][INDEX_CLUSTERID];
let currentDescription = "";
//Build the description depending on the targetEntity
if(targetEntity == "Person_entity")
currentDescription = duplicateInfos[i][INDEX_FIRSTNAME] + " " + duplicateInfos[i][INDEX_LASTNAME];
else
currentDescription = duplicateInfos[i][INDEX_ORGNAME];
if(i == 0)
{
recordClusterId = currentClusterId;
recordDescription = currentDescription;
recordDuplicateInClusterCount = 1;
continue;
}
//If the record belongs to the same Cluster as the one before, append its value and increase the counter
//otherwise write the clusters record an start a new record.
if(recordClusterId == currentClusterId)
{
if(recordDuplicateInClusterCount < MAX_SHOW_CLUSTER_RECORDS)
recordDescription += ", " + currentDescription;
if(recordDuplicateInClusterCount == MAX_SHOW_CLUSTER_RECORDS)
recordDescription += ", ..."
recordDuplicateInClusterCount++;
/*
* Finish the current record if its the last duplicate.
* It has to be checked wether or not more than one element is currently in the cluster:
* Normally, there are always at least 2 elements in a cluster. If then a duplicate relation
* is beign ignored, there's only one record left in this particluar cluster.
* As there are then no interactions possible (and a cluster of one is no cluster), this cluster musn't be shown in the list.
*/
if(i == duplicateInfos.length-1 && recordDuplicateInClusterCount > 1)
duplicates.push([recordClusterId, recordDescription, recordDuplicateInClusterCount, targetEntity, recordClusterId]);
}
else
{
/*
* Finish the current record if its the next cluster.
* It has to be checked wether or not more than one element is currently in the cluster:
* Normally, there are always at least 2 elements in a cluster. If then a duplicate relation
* is beign ignored, there's only one record left in this particluar cluster.
* As there would be no interactions possible (and a cluster of one is no cluster), this cluster musn't be shown in the list.
*/
if(recordDuplicateInClusterCount > 1)
duplicates.push([recordClusterId, recordDescription, recordDuplicateInClusterCount, targetEntity, recordClusterId]);
recordClusterId = currentClusterId
recordDescription = currentDescription
recordDuplicateInClusterCount = 1;
}
}
result.object(duplicates);
}
......@@ -637,6 +637,24 @@
<fieldName>KeywordPhases</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>414ad662-727b-4e9f-9e86-0659d92ec60d</name>
<entityName>DuplicatePerson_entity</entityName>
<fieldName>KeywordContactStates</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>0f8f9bfc-379c-4f05-8364-8270e718fe9a</name>
<entityName>DuplicateOrganisation_entity</entityName>
<fieldName>KeywordContactStates</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>b78c0dd7-a35c-4d9b-9a23-1a20e7e41464</name>
<entityName>DuplicateOrganisation_entity</entityName>
<fieldName>KeywordOrganisationTypes</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>98608b12-9927-4197-adfe-1398a388bcb0</name>
<entityName>WebtrackingTag_entity</entityName>
......
......@@ -186,6 +186,12 @@
<fieldName>OrganisationConsumer</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>fa1b6124-1e00-4fa0-8c04-debc19f58d95</name>
<entityName>DuplicatePerson_entity</entityName>
<fieldName>Organisations</fieldName>
<isConsumer v="false" />
</entityDependency>
<entityDependency>
<name>640a8509-1972-4dc5-980e-68832f1c03c5</name>
<entityName>Planning_entity</entityName>
......@@ -226,14 +232,6 @@
<name>AttributeId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewAdditionalFeatures_param</name>
<expose v="false" />
......@@ -699,14 +697,6 @@
<name>ExcludedContactIds_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewAdditionalFeatures_param</name>
<expose v="false" />
......@@ -770,14 +760,6 @@
<name>ExcludedContactIds_param</name>
<expose v="true" />
</entityParameter>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewAdditionalFeatures_param</name>
<expose v="false" />
......@@ -955,65 +937,10 @@
<colorProcess>%aditoprj%/entity/Organisation_entity/entityfields/lastactivity/colorProcess.js</colorProcess>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/lastactivity/valueProcess.js</valueProcess>
</entityField>
<entityProvider>
<name>SelfDuplicates</name>
<documentation>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicates/documentation.adoc</documentation>
<titlePlural>Duplicates</titlePlural>
<children>
<entityParameter>
<name>AttributeId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>AttributeKeyId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>FilterPreSet_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>OrganisationType_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>WithPrivate_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>OnlyOwnSupervised_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>ExcludeOrganisationsByPersonId</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewAdditionalFeatures_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewCenterLat_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewCenterLon_param</name>
<expose v="false" />
</entityParameter>
</children>
</entityProvider>
<entityParameter>
<name>OnlyShowContactIds_param</name>
<expose v="true" />
</entityParameter>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<expose v="true" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="true" />
</entityParameter>
<entityField>
<name>STANDARD_COUNTRY</name>
<title>Standard Country</title>
......@@ -1023,33 +950,6 @@
<name>OnlyOwnSupervised_param</name>
<expose v="true" />
</entityParameter>
<entityConsumer>
<name>SelfDuplicatesUncached</name>
<dependency>
<name>dependency</name>
<entityName>Organisation_entity</entityName>
<fieldName>SelfDuplicates</fieldName>
</dependency>
<children>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js</valueProcess>
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js</valueProcess>
<title></title>
</entityParameter>
<entityParameter>
<name>OnlyShowContactIds_param</name>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js</valueProcess>
</entityParameter>
<entityParameter>
<name>ExcludedContactIds_param</name>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess>
</entityParameter>
</children>
</entityConsumer>
<entityConsumer>
<name>CommRestrictions</name>
<dependency>
......@@ -1153,14 +1053,6 @@
<name>AttributeKeyId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateActionsControl_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>ExcludedContactIds_param</name>
<expose v="false" />
......@@ -1226,10 +1118,6 @@
<name>OnlyShowContactIds_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>ExcludeOrganisationsByPersonId</name>
<expose v="false" />
......@@ -1282,52 +1170,6 @@
<name>FilterPreSet_param</name>
<expose v="true" />
</entityParameter>
<entityProvider>
<name>NonselfDuplicates</name>
<documentation>%aditoprj%/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc</documentation>
<dependencies>
<entityDependency>
<name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name>
<entityName>Duplicates_entity</entityName>
<fieldName>DuplicateOrganisationsConsumer</fieldName>
<isConsumer v="false" />
</entityDependency>
</dependencies>
<children>
<entityParameter>
<name>AttributeKeyId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>DuplicateCurrentContactId_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>ExcludedContactIds_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>OnlyShowContactIds_param</name>
<expose v="true" />
</entityParameter>
<entityParameter>
<name>OnlyOwnSupervised_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewAdditionalFeatures_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewCenterLon_param</name>
<expose v="false" />
</entityParameter>
<entityParameter>
<name>MapViewCenterLat_param</name>
<expose v="false" />
</entityParameter>
</children>
</entityProvider>
<entityConsumer>
<name>AttributesFilter</name>
<dependency>
......@@ -1526,52 +1368,6 @@
<iconId>VAADIN:ENVELOPE</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/newletter/stateProcess.js</stateProcess>
</entityActionField>
<entityActionGroup>
<name>DuplicateActions</name>
<title>Duplicate actions</title>
<state>AUTO</state>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/stateProcess.js</stateProcess>
<children>
<entityActionField>
<name>IntegrateSelectedIntoCurrentAction</name>
<title>Integrate selected into current contact</title>
<onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js</onActionProcess>
<isMenuAction v="true" />
<isObjectAction v="false" />
<isSelectionAction v="true" />
<iconId>NEON:IMPORT</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js</stateProcess>
</entityActionField>
<entityActionField>
<name>IntegrateCurrentIntoSelectedAction</name>
<title>Integrate current into selected contact</title>
<onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js</onActionProcess>
<isMenuAction v="true" />
<isObjectAction v="false" />
<isSelectionAction v="true" />
<iconId>NEON:EXPORT</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js</stateProcess>
</entityActionField>
<entityActionField>
<name>IgnoreDuplicate</name>
<title>Ignore Duplicate</title>
<onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js</onActionProcess>
<isMenuAction v="true" />
<isObjectAction v="false" />
<isSelectionAction v="true" />
<iconId>VAADIN:CLOSE</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js</stateProcess>
</entityActionField>
<entityActionField>
<name>IgnoreWholeCluster</name>
<title>Ignore whole Cluster</title>
<onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js</onActionProcess>
<isObjectAction v="false" />
<iconId>VAADIN:CLOSE</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js</stateProcess>
</entityActionField>
</children>
</entityActionGroup>
<entityActionField>
<name>startWorkflow</name>
<title>Start workflow</title>
......@@ -1629,6 +1425,22 @@
<iconId>VAADIN:CURLY_BRACKETS</iconId>
<stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/stateProcess.js</stateProcess>
</entityActionField>
<entityConsumer>
<name>Duplicates</name>
<selectionMode>MULTI</selectionMode>
<selectionModeProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicates/selectionModeProcess.js</selectionModeProcess>
<dependency>
<name>dependency</name>
<entityName>DuplicateOrganisation_entity</entityName>
<fieldName>#PROVIDER</fieldName>
</dependency>
<children>
<entityParameter>
<name>Obj_param</name>
<valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicates/children/obj_param/valueProcess.js</valueProcess>
</entityParameter>
</children>
</entityConsumer>
<entityConsumer>
<name>Plannings</name>
<dependency>
......@@ -1787,11 +1599,13 @@
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>STANDARD_EMAIL_COMMUNICATION.value</name>
<expression>%aditoprj%/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression>
<isFilterable v="false" />
<isLookupFilter v="false" />
</dbRecordFieldMapping>
<dbRecordFieldMapping>
<name>STANDARD_PHONE_COMMUNICATION.value</name>
<expression>%aditoprj%/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression>
<isFilterable v="false" />
<isLookupFilter v="false" />
</dbRecordFieldMapping>
......@@ -1943,6 +1757,13 @@
<filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/responsibleassignment/filterConditionProcess.js</filterConditionProcess>
<filtertype>EXTENDED</filtertype>
</filterExtension>
<filterExtension>
<name>Duplicates_filter</name>
<title>Duplicates</title>
<contentType>NUMBER</contentType>
<filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js</filterConditionProcess>
<filtertype>BASIC</filtertype>
</filterExtension>
<filterExtension>
<name>Communication_Mail_filter</name>
<title>Communication: Mail</title>
......
import("system.neon");
import("system.vars");
import("DuplicateScanner_lib");
let sourceContactId = vars.get("$param.DuplicateCurrentContactId_param");
let selectedContactId = vars.get("$sys.selection");
let clusterId = DuplicateScannerUtils.getClusterId(sourceContactId);
DuplicateScannerUtils.createUnrelatedDuplicateRelation(sourceContactId, selectedContactId, clusterId);
neon.refreshAll();
\ No newline at end of file
import("system.logging");
import("system.vars");
import("system.neon");
import("system.result");
//Actions to show in the duplicates view inside the persons main view
let actionState = vars.get("$param.DuplicateActionsControl_param");
if(actionState != null && actionState != "1")//todo replace with keyword
result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
import("system.logging");
import("system.neon");
import("system.vars");
import("DuplicateScanner_lib");
import("system.notification");
let contactId = vars.get("$field.CONTACTID");
let clusterId = DuplicateScannerUtils.getClusterId(contactId);
let duplicateContactIdsInClusterRay = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterId)
if(duplicateContactIdsInClusterRay.length > 1)
{
let referenceDuplicateId = duplicateContactIdsInClusterRay[0];
for (let i = 1; i < duplicateContactIdsInClusterRay.length; i++)
{
DuplicateScannerUtils.createUnrelatedDuplicateRelation(referenceDuplicateId, duplicateContactIdsInClusterRay[i], clusterId);
}
}
import("system.logging");
import("system.vars");
import("system.neon");
import("system.result");
//Actions to show in the duplicates view inside the persons main view
let actionState = vars.get("$param.DuplicateActionsControl_param");
if(actionState != null && actionState != "2")//todo replace with keyword
result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
import("system.logging");
import("system.vars");
import("system.neon");
import("system.result");
//Actions to show in the duplicates view inside the persons main view
let actionState = vars.get("$param.DuplicateActionsControl_param");
if(actionState != null && actionState != "1")//todo replace with keyword
result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
import("system.logging");
import("system.vars");
import("system.neon");
import("system.result");
//Actions to show in the duplicates view inside the persons main view
let actionState = vars.get("$param.DuplicateActionsControl_param");
if(actionState != null && actionState != "1")//todo replace with keyword
result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
import("system.logging");
import("system.vars");
import("system.neon");
import("system.result");
//Actions to show in the duplicates view inside the persons main view
let actionState = vars.get("$param.DuplicateActionsControl_param");
if(actionState == null || actionState == "0")//todo replace with keyword
result.string(neon.COMPONENTSTATE_INVISIBLE);
\ No newline at end of file
import("system.vars");
import("system.result");
result.string(JSON.stringify({
CONTACTID: vars.get("$field.CONTACTID"),
NAME: vars.get("$field.NAME"),
ADDRESS_ID: vars.get("$field.ADDRESS_ID"),
CUSTOMERCODE: vars.get("$field.CUSTOMERCODE"),
LANGUAGE: vars.get("$field.LANGUAGE"),
TYPE: vars.get("$field.TYPE"),
STATUS: vars.get("$field.STATUS"),
STANDARD_ADDRESS: vars.get("$field.STANDARD_ADDRESS"),
STANDARD_CITY: vars.get("$field.STANDARD_CITY"),
STANDARD_COUNTRY: vars.get("$field.STANDARD_COUNTRY"),
STANDARD_EMAIL_COMMUNICATION: vars.get("$field.STANDARD_EMAIL_COMMUNICATION"),
STANDARD_LAT: vars.get("$field.STANDARD_LAT"),
STANDARD_LON: vars.get("$field.STANDARD_LON"),
STANDARD_PHONE_COMMUNICATION: vars.get("$field.STANDARD_PHONE_COMMUNICATION"),
STANDARD_ZIP: vars.get("$field.STANDARD_ZIP")
}));
import("system.result");
import("system.vars");
import("system.neon");
result.string(
vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW ||
vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT ?
"NONE" : "MULTI"
);
Provides organisation duplicate-records without the `Organisation_entity` scope, for example for the `Duplicates_entity`.
The provider is named `NonselfDuplicates` to differentiate this provider and the `SelfDuplicates`-provider.
\ No newline at end of file
Provides organisation duplicate-records within the `Organisation_entity` scope itself.
\ No newline at end of file
import("system.result");
result.string("1");//todo use keyword
\ No newline at end of file
import("system.vars");
import("system.result");
result.string(vars.get("$field.CONTACTID"));
\ No newline at end of file
import("system.logging");
import("system.vars");
import("system.result");
import("DuplicateScanner_lib");
let unrelatedIds = DuplicateScannerUtils.getUnrelatedRelationsForDuplicate(vars.get("$field.CONTACTID"));
result.string(JSON.stringify(unrelatedIds));
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment