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

Merge branch 'sales_1086473_FixAssignDistrictPerformance' into '2021.2.0'

Sales 1086473 fix assign district performance

See merge request xrm/basic!1271
parents 0b01b936 61afb85d
No related branches found
No related tags found
No related merge requests found
...@@ -83,14 +83,14 @@ DistrictUtils.getDataFromDistrictContact = function (pDistrictContactId) ...@@ -83,14 +83,14 @@ DistrictUtils.getDataFromDistrictContact = function (pDistrictContactId)
* Array of district-IDs.<br> * Array of district-IDs.<br>
* @param {String} pUser=currentUser (optional) <p> * @param {String} pUser=currentUser (optional) <p>
* User who will get the notification, <br> * User who will get the notification, <br>
* User who will start the batch job <br> * User who will start the batch job. <br>
* e.g: "_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046" <br>
* @param {String} pContactId (optional) <p> * @param {String} pContactId (optional) <p>
* Organisation which should be assigned to all <br> * Organisation which should be assigned to all <br>
* according districts with auto assignment is true <br> * according districts with auto assignment is true <br>
*/ */
DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContactId) DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContactId)
{ {
//pUser hat folgendes Format: _____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046
if (pUser === undefined) if (pUser === undefined)
pUser = EmployeeUtils.getCurrentUserId(); pUser = EmployeeUtils.getCurrentUserId();
var processConfig = process.createStartAsyncConfig() var processConfig = process.createStartAsyncConfig()
...@@ -118,7 +118,7 @@ DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContac ...@@ -118,7 +118,7 @@ DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContac
* Count of new assigned companies and no longer assigned companies.<br> * Count of new assigned companies and no longer assigned companies.<br>
*/ */
DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId) DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId)
{ {
if (pContactId == undefined) if (pContactId == undefined)
pContactId = null; pContactId = null;
...@@ -127,205 +127,163 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId ...@@ -127,205 +127,163 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId
var invalid = 0; var invalid = 0;
var updated = 0; var updated = 0;
var updateArray = []; //parse JSON-Formatted Filters to SQL-Condition
//Einlesen von allen bereits existierenden automatischen Zuordnungen
var arrExistingIds = [];
if (!pContactId)
{
arrExistingIds = newSelect(["DISTRICTCONTACT.DISTRICTCONTACTID", "DISTRICTCONTACT.CONTACT_ID", "DISTRICTCONTACT.ADVISER_CONTACT_ID"
, "DISTRICTCONTACT.ADVISER_ROLE", "DISTRICTCONTACT.ORIGIN", "DISTRICTCONTACT.DISTRICTRESPONSIBLE_ID"
, "DISTRICTCONTACT.STATUS", "DISTRICTCONTACT.VALID_FROM", "DISTRICTCONTACT.VALID_UNTIL, DISTRICTCONTACT.VISITFREQUENCY"])
.from("DISTRICTCONTACT")
.where("DISTRICTCONTACT.DISTRICT_ID", pDistrictId)
.and ("DISTRICTCONTACT.ORIGIN", $KeywordRegistry.districtOrigin$auto())
.table();
var districtContactObj = {};//object to store values of all auto contacts
for (let element in arrExistingIds)
{
let[districtContactId, contact_id, adviser_contact_id, adviserRole, origin, responsible_id, status, visitFrequency] = arrExistingIds[element];
if(origin == $KeywordRegistry.districtOrigin$auto())
{
if (!districtContactObj.hasOwnProperty(responsible_id))
{
districtContactObj[responsible_id] = {};
}
districtContactObj[responsible_id][districtContactId] = {}
districtContactObj[responsible_id][districtContactId]["adviserRole"] = adviserRole;
districtContactObj[responsible_id][districtContactId]["districtContactId"] = [districtContactId];
districtContactObj[responsible_id][districtContactId]["status"] = status;
districtContactObj[responsible_id][districtContactId]["valid_from"] = valid_from;
districtContactObj[responsible_id][districtContactId]["valid_until"] = valid_until;
districtContactObj[responsible_id][districtContactId]["visitFrequency"] = visitFrequency;
}
}
}
//Einlesen aller Betreuer, die dem übergebenen Gebiet zugeordnet sind
var arrResponsibleIds = newSelect(["DISTRICTRESPONSIBLE.EMPLOYEE_CONTACT_ID", "DISTRICTRESPONSIBLE.ADVISER_ROLE",
"DISTRICTRESPONSIBLE.ADVISER_STATUS", "DISTRICTRESPONSIBLE.VALID_FROM", "DISTRICTRESPONSIBLE.VALID_UNTIL",
"DISTRICTRESPONSIBLE.VISITFREQUENCY", "DISTRICTRESPONSIBLE.DISTRICTRESPONSIBLEID", "DISTRICTRESPONSIBLE.VISITFREQUENCY"])
.from("DISTRICTRESPONSIBLE")
.where("DISTRICTRESPONSIBLE.DISTRICT_ID", pDistrictId)
.table();
//Aufbereiten des im JSON-Format übergebenen Filters in eine SQL-Condition
var appliedFilterCondition = JSON.parse(pAppliedFilter).filter; var appliedFilterCondition = JSON.parse(pAppliedFilter).filter;
appliedFilterCondition = JSON.stringify(appliedFilterCondition); appliedFilterCondition = JSON.stringify(appliedFilterCondition);
var sqlCondition = db.toFilterCondition(appliedFilterCondition, "Organisation_entity"); var sqlCondition = db.toFilterCondition(appliedFilterCondition, "Organisation_entity");
//Get contactIds of this district using it's filter in the condition //get all responsibleContacts, assigned to the superior district
var orgContactIdAndStatus = newSelect("CONTACT.CONTACTID, CONTACT.STATUS") var arrResponsibleIds = newSelect(["DISTRICTRESPONSIBLE.EMPLOYEE_CONTACT_ID", "DISTRICTRESPONSIBLE.ADVISER_ROLE",
.from("ORGANISATION") "DISTRICTRESPONSIBLE.ADVISER_STATUS", "DISTRICTRESPONSIBLE.VALID_FROM", "DISTRICTRESPONSIBLE.VALID_UNTIL", "DISTRICTRESPONSIBLE.VISITFREQUENCY"])
.join("CONTACT", newWhere("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").and("CONTACT.PERSON_ID is null")) .from("DISTRICTRESPONSIBLE")
.leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") .where("DISTRICTRESPONSIBLE.DISTRICT_ID", pDistrictId)
.leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID") .table();
.whereIfSet(sqlCondition)
.andIfSet("CONTACT.CONTACTID", pContactId) var arrOrgContactIds = new SqlBuilder()
.table(); .selectDistinct("CONTACT.CONTACTID")
var arrOrgContactIds = []; .from("ORGANISATION")
.join("CONTACT", newWhere("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").and("CONTACT.PERSON_ID is null"))
//we want to set the status of the inactive ones to "in Review" and continue with the other ones .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID")
for (i = 0; i < orgContactIdAndStatus.length; i++) .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID")
{ .whereIfSet(sqlCondition)
let contactId, status; .andIfSet("CONTACT.CONTACTID", pContactId)
[contactId, status] = orgContactIdAndStatus[i]; .arrayColumn();
if(status == $KeywordRegistry.contactStatus$inactive())
{
newWhere("CONTACT.CONTACTID", contactId).updateData(true, "CONTACT", ["STATUS"], null, [$KeywordRegistry.contactStatus$inReview()]);
}
else
{
arrOrgContactIds.push(contactId);
}
}
var insertArray = [];
var colsInsert = [ var colsInsert = [
"DISTRICTCONTACTID", "DISTRICTCONTACTID",
"CONTACT_ID", "CONTACT_ID",
"DISTRICT_ID", "DISTRICT_ID",
"ADVISER_CONTACT_ID", "ADVISER_CONTACT_ID",
"ADVISER_ROLE", "ADVISER_ROLE",
"STATUS", "STATUS",
"VALID_FROM", "VALID_FROM",
"VALID_UNTIL", "VALID_UNTIL",
"ORIGIN", "ORIGIN",
"USER_NEW", "VISITFREQUENCY",
"DATE_NEW", "USER_NEW",
"VISITFREQUENCY", "DATE_NEW"
"DISTRICTRESPONSIBLE_ID" ];
];
var colsUpdate = [
"STATUS",
"USER_EDIT",
"DATE_EDIT",
"VALID_UNTIL"];
//Anlegen der Firmen-Betreuer-Datensätze in der Tabelle DISTRICTCONTACT var colsUpdate = [
for (var i=0; i<arrOrgContactIds.length; i++) "STATUS",
{ "USER_EDIT",
for (var j=0; j<arrResponsibleIds.length; j++) "DATE_EDIT"
];
//create districtContact datasets
for (var j=0; j < arrResponsibleIds.length; j++)
{
var insertArray = [];
var updateArray = [];
var updateStatements = [];
var existingEnriesObject = {};
var updatecond = "";
var [resContactId, resRole, resStatus, resValidFrom, resValidUntil, resVisitFrequency] = arrResponsibleIds[j];
var arrExistingEntries = [];
if(!pContactId)
{ {
//Existiert der Firmen-Betreuer-Datensatz bereits? arrExistingEntries = new SqlBuilder()
var found = false; .select(["DISTRICTCONTACT.DISTRICT_ID", "DISTRICTCONTACT.CONTACT_ID", "DISTRICTCONTACT.ADVISER_CONTACT_ID", "DISTRICTCONTACT.DISTRICTCONTACTID"
for (var k=0; k<arrExistingIds.length; k++) , "DISTRICTCONTACT.STATUS", "DISTRICTCONTACT.ADVISER_ROLE", "DISTRICTCONTACT.VISITFREQUENCY", "DISTRICTCONTACT.VALID_FROM", "DISTRICTCONTACT.VALID_UNTIL"])
{ .from("DISTRICTCONTACT")
if (arrExistingIds[k][1] == arrOrgContactIds[i] && arrExistingIds[k][2] == arrResponsibleIds[j][0]) .where("DISTRICTCONTACT.DISTRICT_ID", pDistrictId)
{ .and("DISTRICTCONTACT.ADVISER_CONTACT_ID", resContactId)
unchanged++; .table();
found = true; }
var fieldValues = {};
var changed = false; //create associative object so we don't have too loop trough an array to check wheter or not exisiting Entries already exist.
for (var aee = 0; aee < arrExistingEntries.length; aee++) {
if(arrResponsibleIds[j][1] != arrExistingIds[k][3])//role //existingEnriesObject[DISTRICT_ID + CONTACT_ID + ADVISER_CONTACT_ID] = [ID, STATUS]
{ existingEnriesObject[ arrExistingEntries[aee][0] + arrExistingEntries[aee][1] + arrExistingEntries[aee][2] ] = {"districtContactId": arrExistingEntries[aee][3]
fieldValues["ADVISER_ROLE"] = arrResponsibleIds[j][1]; , "status": arrExistingEntries[aee][4]
changed = true; , "role": arrExistingEntries[aee][5]
} , "visitFrequency" : arrExistingEntries[aee][6]
if(arrResponsibleIds[j][2] != arrExistingIds[k][6])//status , "vlaidFrom" : arrExistingEntries[aee][7]
{ , "vlaidUntil" : arrExistingEntries[aee][8]};
fieldValues["STATUS"] = arrResponsibleIds[j][2]; }
changed = true;
} for (var i = 0; i < arrOrgContactIds.length; i++)
if(arrResponsibleIds[j][5] != arrExistingIds[k][9])//visitFrequency {
{ //insert new assignments
fieldValues["VISITFREQUENCY"] = arrResponsibleIds[j][5]; var valsInsert = [
changed = true; util.getNewUUID(),
} arrOrgContactIds[i],
if(arrResponsibleIds[j][3] != arrExistingIds[k][7])//valid_from pDistrictId,
{ resContactId,
fieldValues["VALID_FROM"] = arrResponsibleIds[j][3]; resRole,
changed = true; resStatus,
} resValidFrom,
if(arrResponsibleIds[j][4] != arrExistingIds[k][6])//valid_until resValidUntil,
{ $KeywordRegistry.districtOrigin$auto(), //origin
fieldValues["VALID_UNTIL"] = arrResponsibleIds[j][4]; resVisitFrequency,
changed = true; vars.get("$sys.user"),
} vars.get("$sys.date")
if(changed) ];
{
unchanged++; //association = DISTRICT_ID + CONTACT_ID + ADVISER_CONTACT_ID
} var existingEntryAssoz = pDistrictId + arrOrgContactIds[i] + arrResponsibleIds[j][0];
var checkexistingEntry = existingEnriesObject[existingEntryAssoz]; //existingEnriesObject[pDistrictId + arrOrgContactIds[i] + arrResponsibleIds[j][0]]
if(Object.keys(fieldValues).length > 0)
{ //check associative Array
updateArray.push(newWhere("DISTRICTCONTACT.DISTRICTCONTACTID", arrExistingIds[k][0]).buildUpdateStatement(fieldValues, "DISTRICTCONTACT")); if (checkexistingEntry == undefined) { //insert missing entries
} newAssigned++
insertArray.push(["DISTRICTCONTACT", colsInsert, null, valsInsert]);
//Gefundenen Eintrag aus dem Array entfernen
//-> Am Schluss bleiben in dem Array alle ungültigen Datensätze übrig. Bei diesen wird weiter unten der Status geändert
arrExistingIds.splice(k, 1);
break;
}
} }
//Firmen-Betreuer-Datensatz existiert noch nicht -> Insert else if (checkexistingEntry != undefined &&
if (found == false) (checkexistingEntry["status"] != resStatus || checkexistingEntry["role"] != resRole
|| checkexistingEntry["validFrom"] != resValidFrom || checkexistingEntry["validUntil"] != resValidUntil
|| checkexistingEntry["visitFrequency"] != resVisitFrequency))// value changed -> update this dataset
{ {
//Falls Status null, dann auf active setzen updated++;
if (Utils.isNullOrEmpty(arrResponsibleIds[j][2]))
{ updateStatements.push(newWhere("DISTRICTCONTACT.DISTRICTCONTACTID", checkexistingEntry["districtContactId"]).buildUpdateStatement({
arrResponsibleIds[j][2] = $KeywordRegistry.contactStatus$active(); "ADVISER_ROLE": resRole,
} "STATUS": resStatus,
"VALID_FROM": resValidFrom,
var valsInsert = [ "VALID_UNTIL": resValidUntil,
util.getNewUUID(), "VISITFREQUENCY": resVisitFrequency,
arrOrgContactIds[i], "USER_EDIT": vars.get("$sys.user"),
pDistrictId, "DATE_EDIT": vars.get("$sys.date")
arrResponsibleIds[j][0], })
arrResponsibleIds[j][1], )
arrResponsibleIds[j][2], //delete from Object (we need to use association here) to sieve for invalid entries
arrResponsibleIds[j][3], delete existingEnriesObject[existingEntryAssoz];
arrResponsibleIds[j][4], }
$KeywordRegistry.districtOrigin$auto(), else if (checkexistingEntry != undefined){ //don't touch existing entries with valid status
vars.get("$sys.user"), unchanged++;
vars.get("$sys.date"), //delete from Object (we need to use association here) to sieve for invalid entries
arrResponsibleIds[j][5], delete existingEnriesObject[existingEntryAssoz];
arrResponsibleIds[j][6] }
];
insertArray.push(["DISTRICTCONTACT", colsInsert, null, valsInsert]);
}
} }
}
newAssigned = insertArray.length; //invalid entries (Assignments, that where already exisitng, but don't fit into said district because of changes -> set status to "In review")
db.inserts(insertArray); for (index in existingEnriesObject) {
db.updates(updateArray); invalid++;
existingEntryId = existingEnriesObject[index]["districtContactId"];
updateStatements.push(newWhere("DISTRICTCONTACT.DISTRICTCONTACTID", existingEntryId).buildUpdateStatement({
"STATUS": $KeywordRegistry.contactStatus$inReview(),
"USER_EDIT": vars.get("$sys.user"),
"DATE_EDIT": vars.get("$sys.date")
})
)
}
var pageSize = 5000;//paging to prevent timeouts
//Gibt es noch ungültige Zuordnungen, dann bei diesen den Status auf "zur Prüfung setzen" while(insertArray.length > pageSize)
if (arrExistingIds.length > 0) {
{ db.inserts(insertArray.splice(0, pageSize), "Data_alias", 6 * datetime.ONE_MINUTE);
invalid = arrExistingIds.length; }
db.inserts(insertArray);
//die erste Spalte enthält die Ids der zu aktualisierenden Datensätze
var arrIds = arrExistingIds.map(function(value) while(updateStatements.length > pageSize)
{ {
return value[0]; db.execute(updateStatements.splice(0, pageSize), "Data_alias", 6 * datetime.ONE_MINUTE);
}); }
DistrictUtils.setDistrictContactStatus (arrIds, $KeywordRegistry.contactStatus$inReview()); db.execute(updateStatements);
} }
return { return {
...@@ -336,7 +294,6 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId ...@@ -336,7 +294,6 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId
}; };
} }
/** /**
* Get the complete hierarchical filter * Get the complete hierarchical filter
* *
......
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