From 3974a3cb1193e5720024fa566c8209430254096a Mon Sep 17 00:00:00 2001
From: Johannes Hoermann <j.hoermann@adito.de>
Date: Mon, 14 Jan 2019 11:47:56 +0100
Subject: [PATCH] [Projekt: Entwicklung - Neon][TicketNr.:
 1030762][Privatadresse bei Firma entfernen (Zweites Keyword anlegen)]

---
 entity/Address_entity/Address_entity.aod      |  7 +++++
 .../entityfields/addr_type/documentation.adoc |  5 ++++
 .../addr_type/possibleItemsProcess.js         | 26 +++++++++++++++---
 .../entityfields/relation_id/valueProcess.js  |  2 +-
 .../entityfields/relationtype/valueProcess.js |  5 ++++
 .../db_changes/data/example_org/ORG_gfk.xml   |  2 +-
 process/Keyword_lib/process.js                | 27 ++++++++++++++-----
 process/Relation_lib/process.js               |  4 +--
 8 files changed, 64 insertions(+), 14 deletions(-)
 create mode 100644 entity/Address_entity/entityfields/addr_type/documentation.adoc
 create mode 100644 entity/Address_entity/entityfields/relationtype/valueProcess.js

diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod
index 6feb8d1d17..429a2c68fc 100644
--- a/entity/Address_entity/Address_entity.aod
+++ b/entity/Address_entity/Address_entity.aod
@@ -23,6 +23,7 @@
     </entityField>
     <entityField>
       <name>ADDR_TYPE</name>
+      <documentation>%aditoprj%/entity/Address_entity/entityfields/addr_type/documentation.adoc</documentation>
       <title>Addresstype</title>
       <possibleItemsProcess>%aditoprj%/entity/Address_entity/entityfields/addr_type/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
@@ -59,6 +60,7 @@
     </entityField>
     <entityField>
       <name>RELATION_ID</name>
+      <mandatory v="true" />
       <valueProcess>%aditoprj%/entity/Address_entity/entityfields/relation_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
@@ -147,6 +149,11 @@
       <triggerRecalculation v="false" />
       <description>PARAMETER</description>
     </entityParameter>
+    <entityField>
+      <name>RelationType</name>
+      <contentType>NUMBER</contentType>
+      <valueProcess>%aditoprj%/entity/Address_entity/entityfields/relationtype/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Address_entity/entityfields/addr_type/documentation.adoc b/entity/Address_entity/entityfields/addr_type/documentation.adoc
new file mode 100644
index 0000000000..71a684ab1f
--- /dev/null
+++ b/entity/Address_entity/entityfields/addr_type/documentation.adoc
@@ -0,0 +1,5 @@
+ADDR_TYPE
+=========
+
+The Keyword ADDRESS.TYPE contains the following custom properties: {org: true, pers: false}
+The types are filtered by the current relation type in the possibleItemsProcess.
\ No newline at end of file
diff --git a/entity/Address_entity/entityfields/addr_type/possibleItemsProcess.js b/entity/Address_entity/entityfields/addr_type/possibleItemsProcess.js
index 5403dab1fe..9b37906c7b 100644
--- a/entity/Address_entity/entityfields/addr_type/possibleItemsProcess.js
+++ b/entity/Address_entity/entityfields/addr_type/possibleItemsProcess.js
@@ -1,7 +1,27 @@
+import("system.vars");
 import("system.result");
 import("Keyword_lib");
+import("Relation_lib");
 
-var items;
+var type = parseInt(vars.get("$field.RelationType"));
+var fields = [];
 
-items = KeywordUtils.getStandardArray("ADDRESS.TYPE");
-result.object(items);
\ No newline at end of file
+switch (type) {
+    case 1:
+        fields = ["org"];
+        break;
+    case 2:
+    case 3:
+        fields = ["pers"];
+        break;
+}
+
+result.object(KeywordUtils.getStandardArrayProps("ADDRESS.TYPE").filter(function (pKeyword) {       
+    for (let i = 0; i < fields.length; i++) {
+        if (pKeyword[2][fields[i]]) {
+            return true;
+        }
+    }
+    
+    return false;
+}));
\ No newline at end of file
diff --git a/entity/Address_entity/entityfields/relation_id/valueProcess.js b/entity/Address_entity/entityfields/relation_id/valueProcess.js
index 2d085e3aff..61a5ce97dd 100644
--- a/entity/Address_entity/entityfields/relation_id/valueProcess.js
+++ b/entity/Address_entity/entityfields/relation_id/valueProcess.js
@@ -4,6 +4,6 @@ import("system.vars");
 
 if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)
 {
-    if(vars.exists("$param.RelId_param") && vars.get("$param.RelId_param") != null)
+    if(vars.exists("$param.RelId_param") && vars.getString("$param.RelId_param"))
         result.string(vars.getString("$param.RelId_param"));    
 }
\ No newline at end of file
diff --git a/entity/Address_entity/entityfields/relationtype/valueProcess.js b/entity/Address_entity/entityfields/relationtype/valueProcess.js
new file mode 100644
index 0000000000..73d8117e07
--- /dev/null
+++ b/entity/Address_entity/entityfields/relationtype/valueProcess.js
@@ -0,0 +1,5 @@
+import("system.result");
+import("system.vars");
+import("Relation_lib")
+
+result.object(RelationUtils.getRelationTypeByRelation(vars.get("$field.RELATION_ID")));
\ No newline at end of file
diff --git a/others/db_changes/data/example_org/ORG_gfk.xml b/others/db_changes/data/example_org/ORG_gfk.xml
index b1d396a2c7..1b4ab630fb 100644
--- a/others/db_changes/data/example_org/ORG_gfk.xml
+++ b/others/db_changes/data/example_org/ORG_gfk.xml
@@ -50,7 +50,7 @@
 	</insert>
 	<insert tableName="ADDRESS">
 			<column name="STATE" value="Bayern"/>
-			<column name="ADDR_TYPE" valueNumeric="2"/>
+			<column name="ADDR_TYPE" valueNumeric="1"/>
 			<column name="DATE_NEW" valueDate="2018-07-02T00:00:00"/>
 			<column name="CITY" value="München"/>
 			<column name="COUNTRY" value="DE"/>
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index 059b246bec..d75223a4bb 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -23,6 +23,20 @@ function KeywordUtils(){
     KeywordUtils.getStandardArray = function(keywordType){
         return KeywordUtils.createKeyword(keywordType).toArray(["id", "name"]);
     }
+    
+    /**
+     * same as getStandardArray but also returns the custom properties
+     * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY"
+     * @return {Array} a 2D array in form of [["id1", "name1", {"prop1":"prop"}], ["idN", "nameN", {"prop1":"prop"}]]
+     * @example
+     * var items;
+     * 
+     * items = KeywordUtils.getStandardArray("ADDRESS.TYPE");
+     * result.object(items);
+     */
+    KeywordUtils.getStandardArrayProps = function(keywordType){
+        return KeywordUtils.createKeyword(keywordType).toArray(["id", "name", "customProperties"]);
+    }
 
     /**
      * get a Keyword by type and key
@@ -119,10 +133,10 @@ function KeywordUtils(){
                 break;
             case "ADDRESS.TYPE":
                 valueContainer = _createKeywordEntriesContainer([
-                     _createKeywordEntry("1", translate.text("Office address"))
-                    ,_createKeywordEntry("2", translate.text("Home address"))
-                    ,_createKeywordEntry("3", translate.text("Delivery address"))
-                    ,_createKeywordEntry("4", translate.text("Post office box"))
+                     _createKeywordEntry("1", translate.text("Office address"), null, {org: true, pers: false})
+                    ,_createKeywordEntry("2", translate.text("Home address"), null, {org: false, pers: true})
+                    ,_createKeywordEntry("3", translate.text("Delivery address"), null, {org: true, pers: true})
+                    ,_createKeywordEntry("4", translate.text("Post office box"), null, {org: true, pers: true})
                 ]);
                 break;
             case "ORG.TYPE":
@@ -405,14 +419,13 @@ function KeywordUtils(){
         };
 
         _getPropsForKeyFn = function(key, fields) {
-            var keyObject, i, l, currentRow, currentField;
+            var keyObject, i, currentRow, currentField;
 
             keyObject = valueContainer[key];
             if (keyObject == undefined)
                 return [];//TODO: throw error instead?
-            l = fields.length;
             currentRow = [];
-            for (i = 0; i < l; i++){
+            for (i = 0; i < fields.length; i++){
                 currentField = fields[i];
                 //check if the passed fieldnames match the existing fieldnames (<=> properties in the object)
                 //to prevent errors and unexpected behaviour
diff --git a/process/Relation_lib/process.js b/process/Relation_lib/process.js
index b28903b7db..fdcced185a 100644
--- a/process/Relation_lib/process.js
+++ b/process/Relation_lib/process.js
@@ -16,7 +16,7 @@ function RelationUtils() {}
  * If you already have persId and orgId from the RELATION table, use getRelationTypeByPersOrg() <br>
  * @param {String} pRelationId
  * <br>
- * @return {String} 0 if relationId not found <br>
+ * @return {Integer} 0 if relationId not found <br>
  *                  1 if organisation <br>
  *                  2 if privat person <br>
  *                  3 if person of an organisation <br>
@@ -55,7 +55,7 @@ RelationUtils.getRelationTypeByRelation = function(pRelationId)
  * @param {String} pPersId selected from the RELATION table
  * @param {String} pOrgId selected from the RELATION table
  *  <br>
- * @return {String} <br>1 if organisation <br>
+ * @return {Integer} <br>1 if organisation <br>
  *                      2 if privat person <br>
  *                      3 if person of an organisation <br>
  */
-- 
GitLab