Skip to content
Snippets Groups Projects
Commit 61afb85d authored by Benjamin Ulrich's avatar Benjamin Ulrich :speech_balloon: Committed by Sebastian Pongratz
Browse files

[Projekt: xRM-Sales][TicketNr.: 1086473][Gebietsdefinitionen: imperformante...

[Projekt: xRM-Sales][TicketNr.: 1086473][Gebietsdefinitionen: imperformante Abarbeitung bei Zuweisung von existierenden Gebieten]
parent 345699a2
No related branches found
No related tags found
No related merge requests found
......@@ -83,14 +83,14 @@ DistrictUtils.getDataFromDistrictContact = function (pDistrictContactId)
* Array of district-IDs.<br>
* @param {String} pUser=currentUser (optional) <p>
* 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>
* Organisation which should be assigned to all <br>
* according districts with auto assignment is true <br>
*/
DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContactId)
{
//pUser hat folgendes Format: _____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046
if (pUser === undefined)
pUser = EmployeeUtils.getCurrentUserId();
var processConfig = process.createStartAsyncConfig()
......@@ -118,7 +118,7 @@ DistrictUtils.assignDistrictOnServer = function (pArrDistrictIds, pUser, pContac
* Count of new assigned companies and no longer assigned companies.<br>
*/
DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId)
{
{
if (pContactId == undefined)
pContactId = null;
......@@ -127,205 +127,163 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId
var invalid = 0;
var updated = 0;
var updateArray = [];
//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
//parse JSON-Formatted Filters to SQL-Condition
var appliedFilterCondition = JSON.parse(pAppliedFilter).filter;
appliedFilterCondition = JSON.stringify(appliedFilterCondition);
var sqlCondition = db.toFilterCondition(appliedFilterCondition, "Organisation_entity");
//Get contactIds of this district using it's filter in the condition
var orgContactIdAndStatus = newSelect("CONTACT.CONTACTID, CONTACT.STATUS")
.from("ORGANISATION")
.join("CONTACT", newWhere("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").and("CONTACT.PERSON_ID is null"))
.leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID")
.leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID")
.whereIfSet(sqlCondition)
.andIfSet("CONTACT.CONTACTID", pContactId)
.table();
var arrOrgContactIds = [];
//we want to set the status of the inactive ones to "in Review" and continue with the other ones
for (i = 0; i < orgContactIdAndStatus.length; i++)
{
let contactId, status;
[contactId, status] = orgContactIdAndStatus[i];
if(status == $KeywordRegistry.contactStatus$inactive())
{
newWhere("CONTACT.CONTACTID", contactId).updateData(true, "CONTACT", ["STATUS"], null, [$KeywordRegistry.contactStatus$inReview()]);
}
else
{
arrOrgContactIds.push(contactId);
}
}
var insertArray = [];
var sqlCondition = db.toFilterCondition(appliedFilterCondition, "Organisation_entity");
//get all responsibleContacts, assigned to the superior district
var arrResponsibleIds = newSelect(["DISTRICTRESPONSIBLE.EMPLOYEE_CONTACT_ID", "DISTRICTRESPONSIBLE.ADVISER_ROLE",
"DISTRICTRESPONSIBLE.ADVISER_STATUS", "DISTRICTRESPONSIBLE.VALID_FROM", "DISTRICTRESPONSIBLE.VALID_UNTIL", "DISTRICTRESPONSIBLE.VISITFREQUENCY"])
.from("DISTRICTRESPONSIBLE")
.where("DISTRICTRESPONSIBLE.DISTRICT_ID", pDistrictId)
.table();
var arrOrgContactIds = new SqlBuilder()
.selectDistinct("CONTACT.CONTACTID")
.from("ORGANISATION")
.join("CONTACT", newWhere("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").and("CONTACT.PERSON_ID is null"))
.leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID")
.leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID")
.whereIfSet(sqlCondition)
.andIfSet("CONTACT.CONTACTID", pContactId)
.arrayColumn();
var colsInsert = [
"DISTRICTCONTACTID",
"CONTACT_ID",
"DISTRICT_ID",
"ADVISER_CONTACT_ID",
"ADVISER_ROLE",
"STATUS",
"VALID_FROM",
"VALID_UNTIL",
"ORIGIN",
"USER_NEW",
"DATE_NEW",
"VISITFREQUENCY",
"DISTRICTRESPONSIBLE_ID"
];
var colsUpdate = [
"STATUS",
"USER_EDIT",
"DATE_EDIT",
"VALID_UNTIL"];
"DISTRICTCONTACTID",
"CONTACT_ID",
"DISTRICT_ID",
"ADVISER_CONTACT_ID",
"ADVISER_ROLE",
"STATUS",
"VALID_FROM",
"VALID_UNTIL",
"ORIGIN",
"VISITFREQUENCY",
"USER_NEW",
"DATE_NEW"
];
//Anlegen der Firmen-Betreuer-Datensätze in der Tabelle DISTRICTCONTACT
for (var i=0; i<arrOrgContactIds.length; i++)
{
for (var j=0; j<arrResponsibleIds.length; j++)
var colsUpdate = [
"STATUS",
"USER_EDIT",
"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?
var found = false;
for (var k=0; k<arrExistingIds.length; k++)
{
if (arrExistingIds[k][1] == arrOrgContactIds[i] && arrExistingIds[k][2] == arrResponsibleIds[j][0])
{
unchanged++;
found = true;
var fieldValues = {};
var changed = false;
if(arrResponsibleIds[j][1] != arrExistingIds[k][3])//role
{
fieldValues["ADVISER_ROLE"] = arrResponsibleIds[j][1];
changed = true;
}
if(arrResponsibleIds[j][2] != arrExistingIds[k][6])//status
{
fieldValues["STATUS"] = arrResponsibleIds[j][2];
changed = true;
}
if(arrResponsibleIds[j][5] != arrExistingIds[k][9])//visitFrequency
{
fieldValues["VISITFREQUENCY"] = arrResponsibleIds[j][5];
changed = true;
}
if(arrResponsibleIds[j][3] != arrExistingIds[k][7])//valid_from
{
fieldValues["VALID_FROM"] = arrResponsibleIds[j][3];
changed = true;
}
if(arrResponsibleIds[j][4] != arrExistingIds[k][6])//valid_until
{
fieldValues["VALID_UNTIL"] = arrResponsibleIds[j][4];
changed = true;
}
if(changed)
{
unchanged++;
}
if(Object.keys(fieldValues).length > 0)
{
updateArray.push(newWhere("DISTRICTCONTACT.DISTRICTCONTACTID", arrExistingIds[k][0]).buildUpdateStatement(fieldValues, "DISTRICTCONTACT"));
}
//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;
}
arrExistingEntries = new SqlBuilder()
.select(["DISTRICTCONTACT.DISTRICT_ID", "DISTRICTCONTACT.CONTACT_ID", "DISTRICTCONTACT.ADVISER_CONTACT_ID", "DISTRICTCONTACT.DISTRICTCONTACTID"
, "DISTRICTCONTACT.STATUS", "DISTRICTCONTACT.ADVISER_ROLE", "DISTRICTCONTACT.VISITFREQUENCY", "DISTRICTCONTACT.VALID_FROM", "DISTRICTCONTACT.VALID_UNTIL"])
.from("DISTRICTCONTACT")
.where("DISTRICTCONTACT.DISTRICT_ID", pDistrictId)
.and("DISTRICTCONTACT.ADVISER_CONTACT_ID", resContactId)
.table();
}
//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++) {
//existingEnriesObject[DISTRICT_ID + CONTACT_ID + ADVISER_CONTACT_ID] = [ID, STATUS]
existingEnriesObject[ arrExistingEntries[aee][0] + arrExistingEntries[aee][1] + arrExistingEntries[aee][2] ] = {"districtContactId": arrExistingEntries[aee][3]
, "status": arrExistingEntries[aee][4]
, "role": arrExistingEntries[aee][5]
, "visitFrequency" : arrExistingEntries[aee][6]
, "vlaidFrom" : arrExistingEntries[aee][7]
, "vlaidUntil" : arrExistingEntries[aee][8]};
}
for (var i = 0; i < arrOrgContactIds.length; i++)
{
//insert new assignments
var valsInsert = [
util.getNewUUID(),
arrOrgContactIds[i],
pDistrictId,
resContactId,
resRole,
resStatus,
resValidFrom,
resValidUntil,
$KeywordRegistry.districtOrigin$auto(), //origin
resVisitFrequency,
vars.get("$sys.user"),
vars.get("$sys.date")
];
//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]]
//check associative Array
if (checkexistingEntry == undefined) { //insert missing entries
newAssigned++
insertArray.push(["DISTRICTCONTACT", colsInsert, null, valsInsert]);
}
//Firmen-Betreuer-Datensatz existiert noch nicht -> Insert
if (found == false)
else if (checkexistingEntry != undefined &&
(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
if (Utils.isNullOrEmpty(arrResponsibleIds[j][2]))
{
arrResponsibleIds[j][2] = $KeywordRegistry.contactStatus$active();
}
var valsInsert = [
util.getNewUUID(),
arrOrgContactIds[i],
pDistrictId,
arrResponsibleIds[j][0],
arrResponsibleIds[j][1],
arrResponsibleIds[j][2],
arrResponsibleIds[j][3],
arrResponsibleIds[j][4],
$KeywordRegistry.districtOrigin$auto(),
vars.get("$sys.user"),
vars.get("$sys.date"),
arrResponsibleIds[j][5],
arrResponsibleIds[j][6]
];
insertArray.push(["DISTRICTCONTACT", colsInsert, null, valsInsert]);
}
updated++;
updateStatements.push(newWhere("DISTRICTCONTACT.DISTRICTCONTACTID", checkexistingEntry["districtContactId"]).buildUpdateStatement({
"ADVISER_ROLE": resRole,
"STATUS": resStatus,
"VALID_FROM": resValidFrom,
"VALID_UNTIL": resValidUntil,
"VISITFREQUENCY": resVisitFrequency,
"USER_EDIT": vars.get("$sys.user"),
"DATE_EDIT": vars.get("$sys.date")
})
)
//delete from Object (we need to use association here) to sieve for invalid entries
delete existingEnriesObject[existingEntryAssoz];
}
else if (checkexistingEntry != undefined){ //don't touch existing entries with valid status
unchanged++;
//delete from Object (we need to use association here) to sieve for invalid entries
delete existingEnriesObject[existingEntryAssoz];
}
}
}
newAssigned = insertArray.length;
db.inserts(insertArray);
db.updates(updateArray);
//invalid entries (Assignments, that where already exisitng, but don't fit into said district because of changes -> set status to "In review")
for (index in existingEnriesObject) {
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"
if (arrExistingIds.length > 0)
{
invalid = arrExistingIds.length;
//die erste Spalte enthält die Ids der zu aktualisierenden Datensätze
var arrIds = arrExistingIds.map(function(value)
{
return value[0];
});
DistrictUtils.setDistrictContactStatus (arrIds, $KeywordRegistry.contactStatus$inReview());
while(insertArray.length > pageSize)
{
db.inserts(insertArray.splice(0, pageSize), "Data_alias", 6 * datetime.ONE_MINUTE);
}
db.inserts(insertArray);
while(updateStatements.length > pageSize)
{
db.execute(updateStatements.splice(0, pageSize), "Data_alias", 6 * datetime.ONE_MINUTE);
}
db.execute(updateStatements);
}
return {
......@@ -336,7 +294,6 @@ DistrictUtils.assignDistrict = function (pDistrictId, pAppliedFilter, pContactId
};
}
/**
* 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