From 68d9e1ebcad189b082e5cb96b36ff5f8811c85fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Maximilian=20Schr=C3=B6ger?= <m.schroeger@adito.de>
Date: Fri, 5 Oct 2018 10:17:14 +0200
Subject: [PATCH] validierungen, liquibase example

---
 .../_____SYSTEM_APPLICATION_NEON.aod          |  1 +
 entity/Contract_entity/Contract_entity.aod    | 28 +++++++++++++++++--
 .../entityfields/contractdue/onValidation.js  | 11 ++++++++
 .../entityfields/contractend/onValidation.js  | 18 ++++++++++++
 .../onValueChange.js}                         |  0
 .../contractstart/onValidation.js             | 18 ++++++++++++
 .../relation_id/fieldIdProcess.js             |  6 ++++
 .../relation_id/linkedContextProcess.js       | 14 ++++++++++
 .../relation_id/valueMappingProcess.js        |  0
 .../entityfields/relation_id/valueProcess.js  |  2 +-
 entity/Org_entity/Org_entity.aod              | 12 ++++++++
 .../ContractPreview_view.aod                  |  5 +---
 .../example_contract/CONTRACT_42154311.xml    | 27 ++++++++++++++++++
 others/db_changes/masterChangelog.xml         |  1 +
 process/Date_lib/Date_lib.aod                 |  6 ++++
 process/Date_lib/process.js                   | 19 +++++++++++++
 16 files changed, 161 insertions(+), 7 deletions(-)
 create mode 100644 entity/Contract_entity/entityfields/contractdue/onValidation.js
 create mode 100644 entity/Contract_entity/entityfields/contractend/onValidation.js
 rename entity/Contract_entity/entityfields/{relation_id/possibleItemsProcess.js => contractend/onValueChange.js} (100%)
 create mode 100644 entity/Contract_entity/entityfields/contractstart/onValidation.js
 create mode 100644 entity/Contract_entity/entityfields/relation_id/fieldIdProcess.js
 create mode 100644 entity/Contract_entity/entityfields/relation_id/linkedContextProcess.js
 create mode 100644 entity/Contract_entity/entityfields/relation_id/valueMappingProcess.js
 create mode 100644 others/db_changes/data/example_contract/CONTRACT_42154311.xml
 create mode 100644 process/Date_lib/Date_lib.aod
 create mode 100644 process/Date_lib/process.js

diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
index 5dde13f0008..fb6f1364f76 100644
--- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
+++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod
@@ -12,6 +12,7 @@
         <node name="Org_context" kind="10077" />
         <node name="Pers_context" kind="10077" />
         <node name="History_context" kind="10077" />
+        <node name="Contract_context" kind="10077" />
         <node name="INTERNAL_ADMINISTRATOR" kind="159" />
       </node>
     </node>
diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod
index c06d034aaef..c62fc0e1d31 100644
--- a/entity/Contract_entity/Contract_entity.aod
+++ b/entity/Contract_entity/Contract_entity.aod
@@ -12,20 +12,26 @@
       <name>CONTRACTCODE</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTCODE</columnName>
+      <caption>Vertragsnummer</caption>
     </entityField>
     <entityField>
       <name>CONTRACTDUE</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTDUE</columnName>
+      <caption>nächste Fälligkeit</caption>
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
+      <onValidation>%aditoprj%/entity/Contract_entity/entityfields/contractdue/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>CONTRACTEND</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTEND</columnName>
+      <caption>Vertragsende</caption>
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
+      <onValidation>%aditoprj%/entity/Contract_entity/entityfields/contractend/onValidation.js</onValidation>
+      <onValueChange>%aditoprj%/entity/Contract_entity/entityfields/contractend/onValueChange.js</onValueChange>
     </entityField>
     <entityField>
       <name>CONTRACTID</name>
@@ -36,19 +42,23 @@
       <name>CONTRACTSTART</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTSTART</columnName>
+      <caption>Vertragsbeginn</caption>
       <contentType>DATE</contentType>
       <resolution>DAY</resolution>
+      <onValidation>%aditoprj%/entity/Contract_entity/entityfields/contractstart/onValidation.js</onValidation>
     </entityField>
     <entityField>
       <name>CONTRACTSTATUS</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTSTATUS</columnName>
+      <caption>Status</caption>
       <possibleItemsProcess>%aditoprj%/entity/Contract_entity/entityfields/contractstatus/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityField>
       <name>CONTRACTTYPE</name>
       <tableName>CONTRACT</tableName>
       <columnName>CONTRACTTYPE</columnName>
+      <caption>Vertragsart</caption>
       <possibleItemsProcess>%aditoprj%/entity/Contract_entity/entityfields/contracttype/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityField>
@@ -71,6 +81,7 @@
       <name>PAYMENT</name>
       <tableName>CONTRACT</tableName>
       <columnName>PAYMENT</columnName>
+      <caption>Zahlweise</caption>
       <mandatory v="true" />
       <possibleItemsProcess>%aditoprj%/entity/Contract_entity/entityfields/payment/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
@@ -78,15 +89,19 @@
       <name>RELATION_ID</name>
       <tableName>CONTRACT</tableName>
       <columnName>RELATION_ID</columnName>
+      <caption>Person / Firma</caption>
+      <linkedContextProcess>%aditoprj%/entity/Contract_entity/entityfields/relation_id/linkedContextProcess.js</linkedContextProcess>
       <mandatory v="true" />
-      <outgoingField></outgoingField>
-      <possibleItemsProcess>%aditoprj%/entity/Contract_entity/entityfields/relation_id/possibleItemsProcess.js</possibleItemsProcess>
+      <outgoingField>ContractOrg_dfo</outgoingField>
       <valueProcess>%aditoprj%/entity/Contract_entity/entityfields/relation_id/valueProcess.js</valueProcess>
+      <valueMappingProcess>%aditoprj%/entity/Contract_entity/entityfields/relation_id/valueMappingProcess.js</valueMappingProcess>
+      <fieldIdProcess>%aditoprj%/entity/Contract_entity/entityfields/relation_id/fieldIdProcess.js</fieldIdProcess>
     </entityField>
     <entityField>
       <name>REMARK</name>
       <tableName>CONTRACT</tableName>
       <columnName>REMARK</columnName>
+      <caption>Beschreibung</caption>
       <contentType>LONG_TEXT</contentType>
     </entityField>
     <entityField>
@@ -159,6 +174,15 @@
         </entityParameter>
       </children>
     </entityOutgoingField>
+    <entityOutgoingField>
+      <name>ContractOrg_dfo</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Org_entity</entityName>
+        <fieldName>ContractOrg_dfi</fieldName>
+      </dependency>
+    </entityOutgoingField>
   </entityFields>
   <linkInformation>
     <linkInformation>
diff --git a/entity/Contract_entity/entityfields/contractdue/onValidation.js b/entity/Contract_entity/entityfields/contractdue/onValidation.js
new file mode 100644
index 00000000000..eda236fcfd7
--- /dev/null
+++ b/entity/Contract_entity/entityfields/contractdue/onValidation.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Date_lib");
+
+var dateUtils = new DateUtils();
+var cDue = vars.get("$local.value");
+
+if (dateUtils.validateBeginnBeforeEnd(vars.get("$field.CONTRACTSTART"), cDue) === false || dateUtils.validateBeginnBeforeEnd(cDue, vars.get("$field.CONTRACTEND")) === false) {
+    result.string(translate.text("Nächste Fälligkeit muss nach Vertragsbeginn und vor Vertragsende liegen!"));
+}
diff --git a/entity/Contract_entity/entityfields/contractend/onValidation.js b/entity/Contract_entity/entityfields/contractend/onValidation.js
new file mode 100644
index 00000000000..ab2e63d3e9b
--- /dev/null
+++ b/entity/Contract_entity/entityfields/contractend/onValidation.js
@@ -0,0 +1,18 @@
+import("system.logging");
+import("system.neon");
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Date_lib");
+
+logging.log("###END_onValidation");
+
+var dateUtils = new DateUtils();
+var cEnd = vars.get("$local.value");
+var cDue = vars.get("$field.CONTRACTDUE");
+
+if (cDue > cEnd && cDue != "")
+    neon.setFieldValue("$field.CONTRACTDUE", cEnd);
+
+if (dateUtils.validateBeginnBeforeEnd(vars.get("$field.CONTRACTSTART"), cEnd) === false)
+    result.string(translate.text("Das Ende-Datum muss nach dem Beginn-Datum liegen"));
\ No newline at end of file
diff --git a/entity/Contract_entity/entityfields/relation_id/possibleItemsProcess.js b/entity/Contract_entity/entityfields/contractend/onValueChange.js
similarity index 100%
rename from entity/Contract_entity/entityfields/relation_id/possibleItemsProcess.js
rename to entity/Contract_entity/entityfields/contractend/onValueChange.js
diff --git a/entity/Contract_entity/entityfields/contractstart/onValidation.js b/entity/Contract_entity/entityfields/contractstart/onValidation.js
new file mode 100644
index 00000000000..d48c866c04d
--- /dev/null
+++ b/entity/Contract_entity/entityfields/contractstart/onValidation.js
@@ -0,0 +1,18 @@
+import("system.logging");
+import("system.neon");
+import("system.result");
+import("system.translate");
+import("system.vars");
+import("Date_lib");
+
+logging.log("###START_validation");
+
+var dateUtils = new DateUtils();
+var cStart = vars.get("$local.value");
+var cDue = vars.get("$field.CONTRACTDUE");
+
+if (cDue < cStart && cDue != "")
+    neon.setFieldValue("$field.CONTRACTDUE", cStart);
+
+if (dateUtils.validateBeginnBeforeEnd(cStart, vars.get("$field.CONTRACTEND")) === false)
+    result.string(translate.text("Das Ende-Datum muss nach dem Beginn-Datum liegen"));
\ No newline at end of file
diff --git a/entity/Contract_entity/entityfields/relation_id/fieldIdProcess.js b/entity/Contract_entity/entityfields/relation_id/fieldIdProcess.js
new file mode 100644
index 00000000000..70e9184ae25
--- /dev/null
+++ b/entity/Contract_entity/entityfields/relation_id/fieldIdProcess.js
@@ -0,0 +1,6 @@
+import("system.vars");
+import("system.db");
+import("system.result");
+import("system.neon");
+
+result.string (vars.get("$this.value"));
\ No newline at end of file
diff --git a/entity/Contract_entity/entityfields/relation_id/linkedContextProcess.js b/entity/Contract_entity/entityfields/relation_id/linkedContextProcess.js
new file mode 100644
index 00000000000..2b4986de616
--- /dev/null
+++ b/entity/Contract_entity/entityfields/relation_id/linkedContextProcess.js
@@ -0,0 +1,14 @@
+import("system.logging");
+import("system.vars");
+import("system.result");
+import("system.neon");
+
+var relid = vars.getString("$this.value");
+
+if(vars.exists("$image.lookup_orgname") && vars.get("$image.lookup_orgname") != '')
+    result.string("Org_context");
+else if((relid == null || relid.trim() == "0")
+    && (vars.get("$sys.operatingstate") != neon.OPERATINGSTATE_NEW))
+    result.string(null);
+else
+    result.string("Org_context");        
diff --git a/entity/Contract_entity/entityfields/relation_id/valueMappingProcess.js b/entity/Contract_entity/entityfields/relation_id/valueMappingProcess.js
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/entity/Contract_entity/entityfields/relation_id/valueProcess.js b/entity/Contract_entity/entityfields/relation_id/valueProcess.js
index 2d085e3aff5..5d0a3cefc2f 100644
--- a/entity/Contract_entity/entityfields/relation_id/valueProcess.js
+++ b/entity/Contract_entity/entityfields/relation_id/valueProcess.js
@@ -6,4 +6,4 @@ if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)
 {
     if(vars.exists("$param.RelId_param") && vars.get("$param.RelId_param") != null)
         result.string(vars.getString("$param.RelId_param"));    
-}
\ No newline at end of file
+}
diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod
index a9befeedbf3..a62f9fe8253 100644
--- a/entity/Org_entity/Org_entity.aod
+++ b/entity/Org_entity/Org_entity.aod
@@ -254,6 +254,18 @@
         </entityParameter>
       </children>
     </entityOutgoingField>
+    <entityIncomingField>
+      <name>ContractOrg_dfi</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>0bcad8ff-3b4e-439f-ac30-464c052c9525</name>
+          <entityName>Contract_entity</entityName>
+          <fieldName>ContractOrg_dfo</fieldName>
+          <isOutgoing v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityIncomingField>
   </entityFields>
   <linkInformation>
     <linkInformation>
diff --git a/neonView/ContractPreview_view/ContractPreview_view.aod b/neonView/ContractPreview_view/ContractPreview_view.aod
index 302a4134d69..7ac9e76980d 100644
--- a/neonView/ContractPreview_view/ContractPreview_view.aod
+++ b/neonView/ContractPreview_view/ContractPreview_view.aod
@@ -11,6 +11,7 @@
     <cardViewTemplate>
       <name>ContractHeader_template</name>
       <iconField>IMAGE</iconField>
+      <titleField>CONTRACTCODE_DISPLAY_fieldGroup</titleField>
       <descriptionField>RELATION_ID</descriptionField>
       <entityField>#ENTITY</entityField>
     </cardViewTemplate>
@@ -19,10 +20,6 @@
       <showDrawer v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
-        <entityFieldLink>
-          <name>6afd1b0d-4d73-47a0-a0a6-58dac448c783</name>
-          <entityField>CONTRACTTYPE</entityField>
-        </entityFieldLink>
         <entityFieldLink>
           <name>9101eee8-57b1-4bcf-a271-2501b7a3b842</name>
           <entityField>CONTRACTSTART</entityField>
diff --git a/others/db_changes/data/example_contract/CONTRACT_42154311.xml b/others/db_changes/data/example_contract/CONTRACT_42154311.xml
new file mode 100644
index 00000000000..c014dc405cd
--- /dev/null
+++ b/others/db_changes/data/example_contract/CONTRACT_42154311.xml
@@ -0,0 +1,27 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="m.schroeger" id="c7ea5e6e-aff2-4cf5-95f1-f5ca1b350dd0">
+        <insert tableName="CONTRACT">
+            <column name="CONTRACTID" value="384c9d31-9923-4e6a-8a7f-2d2890470b70"/>
+            <column name="USER_NEW" value="Martin"/>
+            <column name="DATE_NEW" valueDate="2018-10-05T03:34:29"/>
+            <column name="RELATION_ID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/>
+            <column name="CONTRACTCODE" value="42154311"/>
+            <column name="PAYMENT" valueNumeric="2"/>
+            <column name="CONTRACTTYPE" valueNumeric="0"/>
+            <column name="CONTRACTSTATUS" valueNumeric="1"/>
+            <column name="CONTRACTEND" valueDate="2019-09-30T00:00:00"/>
+            <column name="CONTRACTSTART" valueDate="2018-10-01T00:00:00"/>
+            <column name="CONTRACTDUE" valueDate="2019-01-01T00:00:00"/>
+        </insert>
+        
+        <rollback>
+            <delete tableName="CONTRACT">
+                <where>CONTRACTID = ?</where>
+                <whereParams>
+                    <param value="384c9d31-9923-4e6a-8a7f-2d2890470b70"/>
+                </whereParams>
+            </delete>
+        </rollback>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/others/db_changes/masterChangelog.xml b/others/db_changes/masterChangelog.xml
index 5541636da7e..433ed43984c 100644
--- a/others/db_changes/masterChangelog.xml
+++ b/others/db_changes/masterChangelog.xml
@@ -15,4 +15,5 @@
     <include file="data/example_org/ORG_gfk.xml"/>
     <include file="data/example_pers/PERS_pfiffig.xml"/>
     <include file="data/example_pers/PERS_sommer.xml"/>
+    <include file="data/example_contract/CONTRACT_42154311.xml"/>
 </databaseChangeLog>
diff --git a/process/Date_lib/Date_lib.aod b/process/Date_lib/Date_lib.aod
new file mode 100644
index 00000000000..690eacb21d3
--- /dev/null
+++ b/process/Date_lib/Date_lib.aod
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7">
+  <name>Date_lib</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <process>%aditoprj%/process/Date_lib/process.js</process>
+</process>
diff --git a/process/Date_lib/process.js b/process/Date_lib/process.js
new file mode 100644
index 00000000000..116db949910
--- /dev/null
+++ b/process/Date_lib/process.js
@@ -0,0 +1,19 @@
+/**
+ * provides methods for interactions with dates
+ */
+function DateUtils(){
+
+    /**
+     * Validates two date inputs (beginning should always be before the end!)
+     * 
+     * @param pStart {Number}
+     * @param pEnd {Number}
+     * 
+     * @result {Boolean|null} Boolean if it was able to check smth or null if the input values were not valid
+     */
+    this.validateBeginnBeforeEnd = function(pStart, pEnd) {
+        if (pStart == "" || pStart == null || pEnd == "" || pEnd == null) return null
+        return pStart <= pEnd;
+    }
+
+}
\ No newline at end of file
-- 
GitLab