Skip to content
Snippets Groups Projects
Commit edba4b68 authored by Sebastian Listl's avatar Sebastian Listl :speech_balloon:
Browse files

VisitRecommendation filters added

parent cac26f9a
No related branches found
No related tags found
No related merge requests found
......@@ -176,11 +176,16 @@
</entityParameter>
</children>
</entityConsumer>
<entityField>
<name>ADDRESS_ZIP</name>
<title>Zip</title>
</entityField>
</entityFields>
<recordContainers>
<jDitoRecordContainer>
<name>jDito</name>
<jDitoRecordAlias>Data_alias</jDitoRecordAlias>
<isFilterable v="true" />
<contentProcess>%aditoprj%/entity/VisitRecommendation_entity/recordcontainers/jdito/contentProcess.js</contentProcess>
<onInsert>%aditoprj%/entity/VisitRecommendation_entity/recordcontainers/jdito/onInsert.js</onInsert>
<onUpdate>%aditoprj%/entity/VisitRecommendation_entity/recordcontainers/jdito/onUpdate.js</onUpdate>
......@@ -196,13 +201,9 @@
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>ORGANISATION_POINT_OF_CONTACT.value</name>
<isFilterable v="true" />
<isLookupFilter v="true" />
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>ORGANISATION_ADDRESS.value</name>
<isFilterable v="true" />
<isLookupFilter v="true" />
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>PRIORITY.value</name>
......@@ -217,20 +218,20 @@
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>DUE_DATE.value</name>
<isFilterable v="true" />
<isLookupFilter v="true" />
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>INFO.value</name>
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>CONTACT_ID.value</name>
<isFilterable v="true" />
<isLookupFilter v="true" />
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>PRIORITY_SOURCE.displayValue</name>
</jDitoRecordFieldMapping>
<jDitoRecordFieldMapping>
<name>ADDRESS_ZIP.value</name>
<isFilterable v="true" />
</jDitoRecordFieldMapping>
</recordFieldMappings>
<filterExtensions>
<filterExtensionSet>
......
import("system.SQLTYPES");
import("system.eMath");
import("system.tools");
import("PostalAddress_lib");
......@@ -16,59 +17,77 @@ import("AttributeRegistry_basic");
import("KeywordRegistry_basic");
import("Util_lib");
import("Address_lib");
import("JditoFilter_lib");
var recommendationData = [];
var tmpData = [];
var activitySubQuery = "";
var sqlMasker = new SqlMaskingUtils();
activitySubQuery = newSelect("max(ENTRYDATE)")
var activitySubQuery = newSelect("max(ENTRYDATE)")
.from("ACTIVITY")
.join("ACTIVITYLINK", "ACTIVITYID = ACTIVITY_ID")
.where("ACTIVITYLINK.OBJECT_ROWID = org.ORGANISATIONID")
.and("ACTIVITY.CATEGORY", "VISIT")
var idValues = false;
var idValues = null;
if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
idValues = true
idValues = vars.get("$local.idvalues");
//dynamic Recommendations
//recommended Organisations containing the attribute Visit Frequency
if(idValues == false)
if (!idValues)
{
var visitFrequencyData = newSelect(["org.ORGANISATIONID", "NAME",
newSelect("CONTACT.CONTACTID")
.from("CONTACT")
.leftJoin("AB_ATTRIBUTERELATION", "CONTACT.CONTACTID = AB_ATTRIBUTERELATION.OBJECT_ROWID")
.leftJoin("AB_ATTRIBUTE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID")
.leftJoin("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
.where("AB_ATTRIBUTE.AB_ATTRIBUTEID", $AttributeRegistry.visitPlanPointOfContact())
.cell(), AddressUtils.formatOnelineSql(),
"visitPlanFrequency.ID_VALUE", "'" + $KeywordRegistry.visitRecommendationPrioSource$visitFrequency()+"'" , activitySubQuery, "CONTACTID",
newSelect("min(ENTRYDATE)")
.from("VISITPLANENTRY")
.where("CONTACT.CONTACTID", "VISITPLANENTRY.ORGANISATION_CONTACT_ID")
.and(newWhere("VISITPLANENTRY.STATUS", $KeywordRegistry.visitPlanEntryStatus$planned())
.or("VISITPLANENTRY.STATUS", $KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()))
.and("VISITPLANENTRY.ENTRYDATE", newSelect("min(vp.ENTRYDATE)")
.from("VISITPLANENTRY", "vp")
.where(["VISITPLANENTRY", "ORGANISATION_CONTACT_ID", "vp"], "visitplanentry.ORGANISATION_CONTACT_ID")
.and(["VISITPLANENTRY", "ENTRYDATE", "vp"], datetime.today())
.and(newWhere(["VISITPLANENTRY", "STATUS", "vp"],
$KeywordRegistry.visitPlanEntryStatus$planned())
.or(["VISITPLANENTRY", "STATUS", "vp"],
$KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()))
.cell())])
.from("CONTACT")
.join("ORGANISATION", "CONTACT.ORGANISATION_ID = org.ORGANISATIONID", "org")
.leftJoin("PERSON", "PERSON.PERSONID = CONTACT.PERSON_ID")
.leftJoin("ADDRESS", "ADDRESS_ID = ADDRESSID")
.join("AB_ATTRIBUTERELATION", "visitPlanFrequency.OBJECT_ROWID = CONTACT.CONTACTID", "visitPlanFrequency")
.where(["AB_ATTRIBUTERELATION", "AB_ATTRIBUTE_ID", "visitPlanFrequency"], $AttributeRegistry.visitPlanFrequency())
.table();
var visitFrequencyData = newSelect([
"org.ORGANISATIONID",
"NAME",
newSelect("CONTACT.CONTACTID")
.from("CONTACT")
.leftJoin("AB_ATTRIBUTERELATION", "CONTACT.CONTACTID = AB_ATTRIBUTERELATION.OBJECT_ROWID")
.leftJoin("AB_ATTRIBUTE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID")
.leftJoin("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID")
.where("AB_ATTRIBUTE.AB_ATTRIBUTEID", $AttributeRegistry.visitPlanPointOfContact()),
AddressUtils.formatOnelineSql(),
"visitPlanFrequency.ID_VALUE",
"'" + $KeywordRegistry.visitRecommendationPrioSource$visitFrequency()+"'" ,
activitySubQuery,
"CONTACTID",
newSelect("min(ENTRYDATE)")
.from("VISITPLANENTRY")
.where("CONTACT.CONTACTID", "VISITPLANENTRY.ORGANISATION_CONTACT_ID")
.and(newWhere("VISITPLANENTRY.STATUS", $KeywordRegistry.visitPlanEntryStatus$planned())
.or("VISITPLANENTRY.STATUS", $KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()))
.and("VISITPLANENTRY.ENTRYDATE", newSelect("min(vp.ENTRYDATE)")
.from("VISITPLANENTRY", "vp")
.where(["VISITPLANENTRY", "ORGANISATION_CONTACT_ID", "vp"], "visitplanentry.ORGANISATION_CONTACT_ID")
.and(["VISITPLANENTRY", "ENTRYDATE", "vp"], datetime.today())
.and(newWhere(["VISITPLANENTRY", "STATUS", "vp"],
$KeywordRegistry.visitPlanEntryStatus$planned())
.or(["VISITPLANENTRY", "STATUS", "vp"],
$KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()))
.cell()),
"ADDRESS.ZIP"
])
.from("CONTACT")
.join("ORGANISATION", "CONTACT.ORGANISATION_ID = org.ORGANISATIONID", "org")
.leftJoin("PERSON", "PERSON.PERSONID = CONTACT.PERSON_ID")
.leftJoin("ADDRESS", "ADDRESS_ID = ADDRESSID")
.join("AB_ATTRIBUTERELATION", "visitPlanFrequency.OBJECT_ROWID = CONTACT.CONTACTID", "visitPlanFrequency")
.where(["AB_ATTRIBUTERELATION", "AB_ATTRIBUTE_ID", "visitPlanFrequency"], $AttributeRegistry.visitPlanFrequency())
.table();
}
var recommendationSQLData = newSelect(["VISITRECOMMENDATIONID", "VISITRECOMMENDATION.CONTACT_ID", "PRIORITY", "DUE_DATE", "SOURCE", "INFO", AddressUtils.formatOnelineSql(),
var prioSubSql = _getPrioByDueDateSubSql("VISITRECOMMENDATION.DUE_DATE", "VISITRECOMMENDATION.PRIORITY");
var recommendationSQLData = newSelect([
"VISITRECOMMENDATIONID",
"VISITRECOMMENDATION.CONTACT_ID",
"ORGANISATION.NAME",
prioSubSql,
"VISITRECOMMENDATION.DUE_DATE",
"VISITRECOMMENDATION.SOURCE",
"VISITRECOMMENDATION.INFO",
AddressUtils.formatOnelineSql(),
newSelect("CONTACT.CONTACTID")
.from("CONTACT")
.leftJoin("AB_ATTRIBUTERELATION", "CONTACT.CONTACTID = AB_ATTRIBUTERELATION.OBJECT_ROWID")
......@@ -96,92 +115,105 @@ var recommendationSQLData = newSelect(["VISITRECOMMENDATIONID", "VISITRECOMMENDA
.from("visitplanentry", "VP")
.where(["VISITPLANENTRY", "entrydate", "vp"], datetime.today(), SqlBuilder.GREATER())
.and(["VISITPLANENTRY", "STATUS", "vp"], $KeywordRegistry.visitPlanEntryStatus$planned())
.or(["VISITPLANENTRY", "STATUS", "vp"], $KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()).cell())
.or(["VISITPLANENTRY", "STATUS", "vp"], $KeywordRegistry.visitPlanEntryStatus$Appointmentarranged()).cell()),
"ADDRESS.ZIP"
])
.from("VISITRECOMMENDATION")
.join("CONTACT", "VISITRECOMMENDATION.CONTACT_ID = CONTACT.CONTACTID")
.leftJoin("ORGANISATION", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID")
.join("ADDRESS", "CONTACT.ADDRESS_ID = ADDRESS.ADDRESSID")
if(idValues == true)
recommendationSQLData.where("VISITRECOMMENDATION.VISITRECOMMENDATIONID", vars.get("$local.idvalues"), SqlBuilder.IN())
recommendationSQLData = recommendationSQLData.table();
.whereIfSet("VISITRECOMMENDATION.VISITRECOMMENDATIONID", idValues, SqlBuilder.IN());
for( let i = 0; i < recommendationSQLData.length; i++)
{
tmpData = [];
var organisationName = ContactUtils.getFullTitleByContactId(recommendationSQLData[i][1])
if(recommendationSQLData[i][2])
var prio = recommendationSQLData[i][2]
else if(recommendationSQLData[i][3])
prio = getPrioByDueDate(recommendationSQLData[i][3]);
var filterCond = new FilterSqlTranslator(vars.get("$local.filter"), "VISITRECOMMENDATION")
.addSqlFieldMapping("ORGANISATION_NAME", "ORGANISATION.NAME")
.addSqlFieldMapping("ADDRESS_ZIP", "ADDRESS.ZIP")
.addSpecialFieldConditionFn("PRIORITY", function (pFilterValue, pOperator)
{
switch (pOperator)
{
case "EQUAL":
return [prioSubSql[0] + " = ?", prioSubSql[1].concat([[pFilterValue, SQLTYPES.VARCHAR]])];
case "NOT_EQUAL":
return [prioSubSql[0] + " != ?", prioSubSql[1].concat([[pFilterValue, SQLTYPES.VARCHAR]])];
case "ISNULL":
return [prioSubSql[0] + " is null", prioSubSql[1]];
case "ISNOTNULL":
return [prioSubSql[0] + " is not null", prioSubSql[1]];
default:
return false;
}
})
.getSqlCondition();
else
prio = $KeywordRegistry.visitRecommendationPriority$low();
recommendationSQLData = recommendationSQLData.andIfSet(filterCond).table();
var recommendationData = recommendationSQLData.map(function ([uid, contactId, organisationName, priority, dueDate, prioSource, info, address, what, plannedDate, visitContact, addressZip])
{
var title = "";
if(recommendationSQLData[i][9]){
var user = tools.getUserByAttribute(tools.CONTACTID, recommendationSQLData[i][9]);
if(visitContact)
{
var user = tools.getUserByAttribute(tools.CONTACTID, visitContact);
title = user[tools.TITLE]
}
tmpData[0] = recommendationSQLData[i][0]; //UID
tmpData[1] = organisationName; //Organisation Name
tmpData[3] = recommendationSQLData[i][6]; //Address
tmpData[4] = prio;
tmpData[5] = recommendationSQLData[i][4]; //Source of Priority (Id)
tmpData[7] = recommendationSQLData[i][3]; //Due Date
tmpData[8] = recommendationSQLData[i][5]; //Info
tmpData[9] = recommendationSQLData[i][1]; //CONTACT_ID
tmpData[2] = recommendationSQLData[i][8]; //Data_planned
tmpData[6] = KeywordUtils.getViewValue($KeywordRegistry.visitRecommendationPrioSource(), recommendationSQLData[i][4]) //Source of Priority (displayvalue)
recommendationData.push(tmpData);
}
return [
uid,
organisationName,
plannedDate,
address,
priority,
prioSource,
KeywordUtils.getViewValue($KeywordRegistry.visitRecommendationPrioSource(), prioSource), //Source of Priority (displayvalue)
dueDate,
info,
contactId,
"",
addressZip
];
});
var monthly = parseInt(datetime.ONE_DAY * 31);
var semiannually = parseInt(datetime.ONE_DAY * 183);
var quarterly = parseInt(datetime.ONE_DAY * 93);
var yearly = parseInt(datetime.ONE_DAY * 365);
if(idValues == false)
if (!idValues)
{
var frequencyData = [];
for (var i = 0; i < visitFrequencyData.length; i++)
{
tmpData = [];
let title = "";
if(visitFrequencyData[i][9])
if(visitFrequencyData[i][10])
{
let user = tools.getUserByAttribute(tools.CONTACTID, visitFrequencyData[i][9]);
title = user[tools.TITLE]
}
tmpData[0] = visitFrequencyData[i][0]; //UID
tmpData[1] = visitFrequencyData[i][1]; //Organisation Name
tmpData[3] = visitFrequencyData[i][2]; //Address
tmpData[5] = visitFrequencyData[i][4]; //Source of Priority (Id)
tmpData[8] = "";
tmpData[4] = visitFrequencyData[i][5]; //last visit
tmpData[9] = visitFrequencyData[i][6]; //ContactId
tmpData[2] = visitFrequencyData[i][1]; //OrganisationId
tmpData[6] = KeywordUtils.getViewValue($KeywordRegistry.visitRecommendationPrioSource(), visitFrequencyData[i][4]) //Source of Priority (displayvalue)
let tmpData = [
visitFrequencyData[i][0], //UID
visitFrequencyData[i][1], //Organisation Name
visitFrequencyData[i][2], //point of contact
visitFrequencyData[i][3], //Address
"", //prio
visitFrequencyData[i][5], //Source of Priority (Id)
"", //Source of Priority (displayvalue)
"", //dueDate
"", //info
visitFrequencyData[i][7], //ContactId
"",
visitFrequencyData[i][9]
];
var dueDate = "";
var lastVisitDate = "";
var lastVisitDate = visitFrequencyData[i][8];
if((visitFrequencyData[i][5]).length == 0)
if (!lastVisitDate)
{
dueDate = datetime.date();
}
else
{
lastVisitDate = visitFrequencyData[i][5];
switch(visitFrequencyData[i][3])
switch(visitFrequencyData[i][4])
{
case $AttributeRegistry.visitPlanFrequency$monthly():
{
......@@ -210,13 +242,16 @@ if(idValues == false)
}
}
tmpData[7] = dueDate; //Due Date
tmpData[4] = getPrioByDueDate(dueDate); //Priority
recommendationData.push(tmpData);
frequencyData.push(tmpData);
}
var recordFilter = vars.get("$local.filter");
if (recordFilter && recordFilter.filter)
frequencyData = JditoFilterUtils.filterRecords(["UID", "ORGANISATION_NAME", "", "ORGANISATION_ADDRESS", "PRIORITY", "", "", "DUE_DATE", "INFO", "CONTACT_ID", "", "ADDRESS_ZIP"],
frequencyData, recordFilter.filter);
recommendationData = recommendationData.concat(frequencyData);
}
......@@ -232,6 +267,38 @@ ArrayUtils.sort2d(recommendationData, 4, true)
result.object(recommendationData);
function _getPrioByDueDateSubSql (pDueDateField, pPriorityField)
{
var currentDate = datetime.date();
var sqlMasker = new SqlMaskingUtils();
var subSql = "case when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$critical()
+ "' when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$veryHigh()
+ "' when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$high()
+ "' when " + pDueDateField + " < ? then '" + $KeywordRegistry.visitRecommendationPriority$medium()
+ "' else '" + $KeywordRegistry.visitRecommendationPriority$low() + "' end";
var [table, field] = pDueDateField.split(".");
var dateFieldType = db.getColumnTypes(table, [field])[0];
var dateDiffs = [
0, //critical
datetime.ONE_DAY * 3, //very high
datetime.ONE_WEEK, //high
datetime.ONE_WEEK * 2 //medium
];
var preparedValues = dateDiffs.map(function (dateDiff)
{
return [(currentDate + dateDiff).toString(), dateFieldType];
});
if (pPriorityField)
subSql = sqlMasker.isNull(pPriorityField, "(" + subSql + ")");
return [subSql, preparedValues];
}
function getPrioByDueDate(pDueDate)
{
var prio = "";
......
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