From 414e5afa183bb2136f5e50ec7236fa709aba6178 Mon Sep 17 00:00:00 2001
From: Benjamin Ulrich <b.ulrich@adito.de>
Date: Thu, 24 Jun 2021 07:34:50 +0000
Subject: [PATCH] Sales 1082524 enable linking orders to orders

---
 .../changelog.xml                             |   6 +
 .../create_SalesorderLink.xml                 |  26 ++++
 .../Data_alias/basic/2021.1.1/changelog.xml   |   1 +
 aliasDefinition/Data_alias/Data_alias.aod     | 132 ++++++++++++++++
 entity/Context_entity/Context_entity.aod      |  13 ++
 .../children/blacklist_param/valueProcess.js  |   3 +
 .../invertblacklist_param/valueProcess.js     |   3 +
 .../children/blacklist_param/valueProcess.js  |   3 +
 .../invertblacklist_param/valueProcess.js     |   3 +
 entity/OrderLink_entity/OrderLink_entity.aod  | 145 ++++++++++++++++++
 entity/OrderLink_entity/documentation.adoc    |   7 +
 .../entityfields/date_edit/valueProcess.js    |   8 +
 .../entityfields/date_new/valueProcess.js     |   8 +
 .../object_rowid/displayValueProcess.js       |  28 ++++
 .../object_rowid/linkedContextProcess.js      |   5 +
 .../object_type/displayValueProcess.js        |  13 ++
 .../entityfields/object_type/valueProcess.js  |   8 +
 .../children/objecttype_param/valueProcess.js |   4 +
 .../salesorder_id/valueProcess.js             |   7 +
 .../salesorderlinkid/valueProcess.js          |   9 ++
 .../recordcontainers/db/conditionProcess.js   |   8 +
 .../recordcontainers/db/onDBDelete.js         |  12 ++
 .../recordcontainers/db/onDBInsert.js         |  12 ++
 .../recordcontainers/db/onDBUpdate.js         |  12 ++
 entity/Order_entity/Order_entity.aod          |  20 +++
 entity/Order_entity/afterUiInit.js            |  36 +++++
 .../entityfields/cancel/onActionProcess.js    |  41 ++---
 .../salesorderid_param/valueProcess.js        |   4 +
 .../links_param/documentation.adoc            |   4 +
 .../transferdeliverynote/onActionProcess.js   |   2 +-
 .../transferinvoice/onActionProcess.js        |   2 +-
 entity/Order_entity/grantDeleteProcess.js     |   1 +
 .../recordcontainers/db/onDBInsert.js         |  10 ++
 .../recordcontainers/db/onDBUpdate.js         |   4 +
 neonContext/Order/Order.aod                   |   1 -
 neonContext/OrderLink/OrderLink.aod           |  27 ++++
 neonView/OrderEdit_view/OrderEdit_view.aod    |   5 +
 .../OrderLinkFilter_view.aod                  |  39 +++++
 .../OrderLinkMultiEdit_view.aod               |  25 +++
 .../OrderLinkPreviewList_view.aod             |  22 +++
 .../OrderLinkPreview_view.aod}                |  20 +--
 .../OrderPreview_view/OrderPreview_view.aod   |   5 +
 process/Order_lib/process.js                  | 103 ++++++++++++-
 43 files changed, 808 insertions(+), 39 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/changelog.xml
 create mode 100644 .liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/create_SalesorderLink.xml
 create mode 100644 entity/Context_entity/entityfields/salesorderlinkeable/children/blacklist_param/valueProcess.js
 create mode 100644 entity/Context_entity/entityfields/salesorderlinkeable/children/invertblacklist_param/valueProcess.js
 create mode 100644 entity/Context_entity/entityfields/salesorderlinkeablet/children/blacklist_param/valueProcess.js
 create mode 100644 entity/Context_entity/entityfields/salesorderlinkeablet/children/invertblacklist_param/valueProcess.js
 create mode 100644 entity/OrderLink_entity/OrderLink_entity.aod
 create mode 100644 entity/OrderLink_entity/documentation.adoc
 create mode 100644 entity/OrderLink_entity/entityfields/date_edit/valueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/date_new/valueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/object_rowid/displayValueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/object_rowid/linkedContextProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/object_type/displayValueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/object_type/valueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/salesorder_id/valueProcess.js
 create mode 100644 entity/OrderLink_entity/entityfields/salesorderlinkid/valueProcess.js
 create mode 100644 entity/OrderLink_entity/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/OrderLink_entity/recordcontainers/db/onDBDelete.js
 create mode 100644 entity/OrderLink_entity/recordcontainers/db/onDBInsert.js
 create mode 100644 entity/OrderLink_entity/recordcontainers/db/onDBUpdate.js
 create mode 100644 entity/Order_entity/entityfields/links/children/salesorderid_param/valueProcess.js
 create mode 100644 entity/Order_entity/entityfields/links_param/documentation.adoc
 create mode 100644 neonContext/OrderLink/OrderLink.aod
 create mode 100644 neonView/OrderLinkFilter_view/OrderLinkFilter_view.aod
 create mode 100644 neonView/OrderLinkMultiEdit_view/OrderLinkMultiEdit_view.aod
 create mode 100644 neonView/OrderLinkPreviewList_view/OrderLinkPreviewList_view.aod
 rename neonView/{OrderLink_view/OrderLink_view.aod => OrderLinkPreview_view/OrderLinkPreview_view.aod} (51%)

diff --git a/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/changelog.xml b/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/changelog.xml
new file mode 100644
index 0000000000..e64d7dc82d
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/changelog.xml
@@ -0,0 +1,6 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <include relativeToChangelogFile="true" file="create_SalesorderLink.xml"/>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/create_SalesorderLink.xml b/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/create_SalesorderLink.xml
new file mode 100644
index 0000000000..8b4db13937
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2021.1.1/SalesorderToSalesorderLinking/create_SalesorderLink.xml
@@ -0,0 +1,26 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="b.ulrich" id="5f26fa1d-4949-4997-8bdc-1bc792f7bed8">
+        <createTable tableName="SALESORDERLINK">
+            <column name="SALESORDERLINKID" type="CHAR(36)">
+                <constraints primaryKey="true" primaryKeyName="PK_SALESORDERLINKID"/>
+            </column>
+            <column name="SALESORDER_ID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="OBJECT_TYPE" type="NVARCHAR(63)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="OBJECT_ROWID" type="CHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            
+            <column name="USER_NEW" type="NVARCHAR(50)" />
+            <column name="DATE_NEW" type="DATETIME" />
+            <column name="USER_EDIT" type="NVARCHAR(50)" />
+            <column name="DATE_EDIT" type="DATETIME" />
+        </createTable>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2021.1.1/changelog.xml b/.liquibase/Data_alias/basic/2021.1.1/changelog.xml
index 04d7ebe37a..e916c27701 100644
--- a/.liquibase/Data_alias/basic/2021.1.1/changelog.xml
+++ b/.liquibase/Data_alias/basic/2021.1.1/changelog.xml
@@ -4,4 +4,5 @@
     <include relativeToChangelogFile="true" file="CurrencyRate/changelog.xml"/>
     <include relativeToChangelogFile="true" file="EmailFilter/alter_emailFilterHandling.xml"/>
     <include relativeToChangelogFile="true" file="EmailFilter/insert_recipientStatusBounced.xml"/>
+    <include relativeToChangelogFile="true" file="SalesorderToSalesorderLinking/changelog.xml"/>
 </databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index c2b79be597..4be3a84381 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -21272,6 +21272,138 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>SALESORDERLINK</name>
+            <dbName></dbName>
+            <idColumn>SALESORDERLINKID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>OBJECT_ROWID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESORDERLINKID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="true" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESORDER_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_NEW</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>OBJECT_TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="63" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>USER_EDIT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="50" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod
index 063809fea7..48924a7673 100644
--- a/entity/Context_entity/Context_entity.aod
+++ b/entity/Context_entity/Context_entity.aod
@@ -104,6 +104,19 @@
         </entityParameter>
       </children>
     </entityProvider>
+    <entityProvider>
+      <name>SalesorderLinkeable</name>
+      <children>
+        <entityParameter>
+          <name>InvertBlacklist_param</name>
+          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/salesorderlinkeable/children/invertblacklist_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>Blacklist_param</name>
+          <valueProcess>%aditoprj%/entity/Context_entity/entityfields/salesorderlinkeable/children/blacklist_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityProvider>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Context_entity/entityfields/salesorderlinkeable/children/blacklist_param/valueProcess.js b/entity/Context_entity/entityfields/salesorderlinkeable/children/blacklist_param/valueProcess.js
new file mode 100644
index 0000000000..80a62aac0b
--- /dev/null
+++ b/entity/Context_entity/entityfields/salesorderlinkeable/children/blacklist_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.object(["Order"]);
\ No newline at end of file
diff --git a/entity/Context_entity/entityfields/salesorderlinkeable/children/invertblacklist_param/valueProcess.js b/entity/Context_entity/entityfields/salesorderlinkeable/children/invertblacklist_param/valueProcess.js
new file mode 100644
index 0000000000..40effa0178
--- /dev/null
+++ b/entity/Context_entity/entityfields/salesorderlinkeable/children/invertblacklist_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/entity/Context_entity/entityfields/salesorderlinkeablet/children/blacklist_param/valueProcess.js b/entity/Context_entity/entityfields/salesorderlinkeablet/children/blacklist_param/valueProcess.js
new file mode 100644
index 0000000000..1322527cbb
--- /dev/null
+++ b/entity/Context_entity/entityfields/salesorderlinkeablet/children/blacklist_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.object(["Salesproject", "Salesorder"]);
\ No newline at end of file
diff --git a/entity/Context_entity/entityfields/salesorderlinkeablet/children/invertblacklist_param/valueProcess.js b/entity/Context_entity/entityfields/salesorderlinkeablet/children/invertblacklist_param/valueProcess.js
new file mode 100644
index 0000000000..40effa0178
--- /dev/null
+++ b/entity/Context_entity/entityfields/salesorderlinkeablet/children/invertblacklist_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(true);
\ No newline at end of file
diff --git a/entity/OrderLink_entity/OrderLink_entity.aod b/entity/OrderLink_entity/OrderLink_entity.aod
new file mode 100644
index 0000000000..e6d20e4080
--- /dev/null
+++ b/entity/OrderLink_entity/OrderLink_entity.aod
@@ -0,0 +1,145 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.21" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.21">
+  <name>OrderLink_entity</name>
+  <title>Receipt</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <documentation>%aditoprj%/entity/OrderLink_entity/documentation.adoc</documentation>
+  <titlePlural>Receipts</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>SALESORDERLINKID</name>
+      <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/salesorderlinkid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>OBJECT_TYPE</name>
+      <title>{$OBJECTLINK_TYPE}</title>
+      <consumer>Contexts</consumer>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/object_type/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>SALESORDER_ID</name>
+      <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/salesorder_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>OBJECT_ROWID</name>
+      <title>{$OBJECTLINK_OBJECT}</title>
+      <consumer>Objects</consumer>
+      <linkedContextProcess>%aditoprj%/entity/OrderLink_entity/entityfields/object_rowid/linkedContextProcess.js</linkedContextProcess>
+      <mandatory v="true" />
+      <displayValueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/object_rowid/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityConsumer>
+      <name>Contexts</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Context_entity</entityName>
+        <fieldName>SalesorderLinkeable</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>Objects</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Object_entity</entityName>
+        <fieldName>AllObjects</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ObjectType_param</name>
+          <valueProcess>%aditoprj%/entity/OrderLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityProvider>
+      <name>Links</name>
+      <targetContextField>OBJECT_TYPE</targetContextField>
+      <targetIdField>OBJECT_ROWID</targetIdField>
+      <children>
+        <entityParameter>
+          <name>SalesorderId_param</name>
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityParameter>
+      <name>SalesorderId_param</name>
+      <expose v="true" />
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <conditionProcess>%aditoprj%/entity/OrderLink_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBInsert>%aditoprj%/entity/OrderLink_entity/recordcontainers/db/onDBInsert.js</onDBInsert>
+      <onDBUpdate>%aditoprj%/entity/OrderLink_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <onDBDelete>%aditoprj%/entity/OrderLink_entity/recordcontainers/db/onDBDelete.js</onDBDelete>
+      <alias>Data_alias</alias>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>SALESORDERLINK.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>SALESORDERLINK.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_ROWID.value</name>
+          <recordfield>SALESORDERLINK.OBJECT_ROWID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>OBJECT_TYPE.value</name>
+          <recordfield>SALESORDERLINK.OBJECT_TYPE</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SALESORDER_ID.value</name>
+          <recordfield>SALESORDERLINK.SALESORDER_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>SALESORDERLINKID.value</name>
+          <recordfield>SALESORDERLINK.SALESORDERLINKID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>SALESORDERLINK.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_NEW.value</name>
+          <recordfield>SALESORDERLINK.USER_NEW</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+      <linkInformation>
+        <linkInformation>
+          <name>ee3c9a6f-53e4-4579-b2b8-994913cba502</name>
+          <tableName>SALESORDERLINK</tableName>
+          <primaryKey>SALESORDERLINKID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/OrderLink_entity/documentation.adoc b/entity/OrderLink_entity/documentation.adoc
new file mode 100644
index 0000000000..6e5570234a
--- /dev/null
+++ b/entity/OrderLink_entity/documentation.adoc
@@ -0,0 +1,7 @@
+= OrderLink_entity
+
+Displays the connection between an Activity and another module (currently only other Orders).
+Functions the same way as ActivityLink for example.
+You can easily enable linking other object_types using the blacklist_param & invertBlacklist_param.
+
+The reason why you can link the Salesproject and the Offer directly in the Order_entity instead of here is because we only need a 1:1 relation for those ones.
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/date_edit/valueProcess.js b/entity/OrderLink_entity/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000..2af46a8e46
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+{
+    result.string(vars.get("$sys.date"));
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/date_new/valueProcess.js b/entity/OrderLink_entity/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000..d5cf2ff4f9
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/date_new/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+{
+    result.string(vars.get("$sys.date"));
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/object_rowid/displayValueProcess.js b/entity/OrderLink_entity/entityfields/object_rowid/displayValueProcess.js
new file mode 100644
index 0000000000..f2a40e1892
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/object_rowid/displayValueProcess.js
@@ -0,0 +1,28 @@
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+import("Sql_lib");
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("system.result");
+import("Context_lib");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID"))
+{
+    result.string("");
+}
+else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE"))
+{
+    if(vars.get("$field.OBJECT_TYPE") == "Order")//TODO: use another way to get the title, even tho it's probably still faster than ContextUtils.getTitleByContext()
+    {
+        var select = newSelect(["SALESORDER.SALESORDERCODE", KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.orderType(), "SALESORDER.ORDERTYPE")])
+                            .from("SALESORDER")
+                            .where("SALESORDER.SALESORDERID", vars.get("$this.value"))
+                            .arrayRow();
+        result.string(select[0] + " | " + select[1]);
+    }
+    else
+    {
+        result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
+    }
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/object_rowid/linkedContextProcess.js b/entity/OrderLink_entity/entityfields/object_rowid/linkedContextProcess.js
new file mode 100644
index 0000000000..d868fe097f
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/object_rowid/linkedContextProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.result");
+import("Context_lib");
+
+result.string(ContextUtils.getContextName(vars.get("$field.OBJECT_TYPE")))
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/object_type/displayValueProcess.js b/entity/OrderLink_entity/entityfields/object_type/displayValueProcess.js
new file mode 100644
index 0000000000..e3435bffa1
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/object_type/displayValueProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+import("system.project");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_TYPE"))
+{
+    result.string("");
+}
+else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE"))
+{
+    result.string(project.getDataModel(project.DATAMODEL_KIND_CONTEXT, vars.get("$field.OBJECT_TYPE"))[1]);
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/object_type/valueProcess.js b/entity/OrderLink_entity/entityfields/object_type/valueProcess.js
new file mode 100644
index 0000000000..4b81aa46c3
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/object_type/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$this.value") == null && (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT))
+{
+    result.string("Order");
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js b/entity/OrderLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
new file mode 100644
index 0000000000..b1bb16711d
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/objects/children/objecttype_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.OBJECT_TYPE"));
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/salesorder_id/valueProcess.js b/entity/OrderLink_entity/entityfields/salesorder_id/valueProcess.js
new file mode 100644
index 0000000000..004b4ab41f
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/salesorder_id/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.vars");
+import("system.result");
+
+if(vars.get("$this.value") && vars.get("$param.SalesorderId_param"))
+{
+    result.string(vars.get("$param.SalesorderId_param"))
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/entityfields/salesorderlinkid/valueProcess.js b/entity/OrderLink_entity/entityfields/salesorderlinkid/valueProcess.js
new file mode 100644
index 0000000000..24e8467f15
--- /dev/null
+++ b/entity/OrderLink_entity/entityfields/salesorderlinkid/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.neon");
+import("system.util");
+import("system.result");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null)
+{
+    result.string(util.getNewUUID());
+}
\ No newline at end of file
diff --git a/entity/OrderLink_entity/recordcontainers/db/conditionProcess.js b/entity/OrderLink_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000..85a3b3e863
--- /dev/null
+++ b/entity/OrderLink_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,8 @@
+import("system.vars");
+import("system.db");
+import("system.result");
+import("Sql_lib");
+
+var cond = newWhereIfSet("SALESORDERLINK.SALESORDER_ID", "$param.SalesorderId_param", SqlBuilder.EQUAL());
+
+result.string(cond.toString());
\ No newline at end of file
diff --git a/entity/OrderLink_entity/recordcontainers/db/onDBDelete.js b/entity/OrderLink_entity/recordcontainers/db/onDBDelete.js
new file mode 100644
index 0000000000..5bf99687b6
--- /dev/null
+++ b/entity/OrderLink_entity/recordcontainers/db/onDBDelete.js
@@ -0,0 +1,12 @@
+import("Order_lib");
+import("system.vars");
+import("Workflow_lib");
+
+var link = [{"OBJECT_TYPE": vars.get("$field.OBJECT_TYPE")
+                , "SALESORDER_ID": vars.get("$field.SALESORDER_ID")
+                , "OBJECT_ROWID": vars.get("$field.OBJECT_ROWID")
+                , "#UID": vars.get("$field.SALESORDERLINKID")}];
+        
+OrderLinkUtils.handleLinks(null, vars.get("$field.SALESORDER_ID"), link);//we need call this function in here so we can handle changes in the preview of Order
+
+WorkflowSignalSender.deleted();
\ No newline at end of file
diff --git a/entity/OrderLink_entity/recordcontainers/db/onDBInsert.js b/entity/OrderLink_entity/recordcontainers/db/onDBInsert.js
new file mode 100644
index 0000000000..f578a15953
--- /dev/null
+++ b/entity/OrderLink_entity/recordcontainers/db/onDBInsert.js
@@ -0,0 +1,12 @@
+import("Order_lib");
+import("system.vars");
+import("Workflow_lib");
+
+var link = [{"OBJECT_TYPE": vars.get("$field.OBJECT_TYPE")
+                , "SALESORDER_ID": vars.get("$field.SALESORDER_ID")
+                , "OBJECT_ROWID": vars.get("$field.OBJECT_ROWID")
+                , "#UID": vars.get("$field.SALESORDERLINKID")}];
+        
+OrderLinkUtils.handleLinks(link, vars.get("$field.SALESORDER_ID"));//we need call this function in here so we can handle changes in the preview of Order
+
+WorkflowSignalSender.inserted();
\ No newline at end of file
diff --git a/entity/OrderLink_entity/recordcontainers/db/onDBUpdate.js b/entity/OrderLink_entity/recordcontainers/db/onDBUpdate.js
new file mode 100644
index 0000000000..a428cace58
--- /dev/null
+++ b/entity/OrderLink_entity/recordcontainers/db/onDBUpdate.js
@@ -0,0 +1,12 @@
+import("Order_lib");
+import("system.vars");
+import("Workflow_lib");
+
+var link = [{"OBJECT_TYPE": vars.get("$field.OBJECT_TYPE")
+                , "SALESORDER_ID": vars.get("$field.SALESORDER_ID")
+                , "OBJECT_ROWID": vars.get("$field.OBJECT_ROWID")
+                , "#UID": vars.get("$field.SALESORDERLINKID")}];
+        
+OrderLinkUtils.handleLinks(link, vars.get("$field.SALESORDER_ID"));//we need call this function in here so we can handle changes in the preview of Order
+
+WorkflowSignalSender.updated();
\ No newline at end of file
diff --git a/entity/Order_entity/Order_entity.aod b/entity/Order_entity/Order_entity.aod
index 4c9cd4456c..2409f03522 100644
--- a/entity/Order_entity/Order_entity.aod
+++ b/entity/Order_entity/Order_entity.aod
@@ -1006,6 +1006,26 @@
       <name>Discount_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityConsumer>
+      <name>Links</name>
+      <refreshParent v="true" />
+      <dependency>
+        <name>dependency</name>
+        <entityName>OrderLink_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>SalesorderId_param</name>
+          <valueProcess>%aditoprj%/entity/Order_entity/entityfields/links/children/salesorderid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityParameter>
+      <name>Links_param</name>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/Order_entity/entityfields/links_param/documentation.adoc</documentation>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Order_entity/afterUiInit.js b/entity/Order_entity/afterUiInit.js
index fb24b7ec60..d8c53b2671 100644
--- a/entity/Order_entity/afterUiInit.js
+++ b/entity/Order_entity/afterUiInit.js
@@ -8,6 +8,42 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
     AttributeRelationUtils.presetMandatoryAttributes(ContextUtils.getCurrentContextId(), "Attributes");
 
     if(vars.get("$param.Copy_param"))
+    {
         neon.setFieldValues(JSON.parse(vars.get("$param.Copy_param")));
+    }
 }
 
+if(vars.exists("$field.Links.insertedRows"))//editmode
+{
+    var emptyRows = vars.get("$field.Links.insertedRows");
+
+    // the empty rows of the consumer are deleted
+    emptyRows.forEach(function(oneRow)
+    {
+        neon.deleteRecord("Links", oneRow["#UID"]);
+    });
+    
+    if(vars.get("$param.Copy_param") && vars.get("$param.SourceOrderId_param"))//add links of sourceOrder
+    {
+        neon.addRecord("Links",
+            JSON.parse(JSON.stringify({
+                "OBJECT_ROWID" : vars.get("$param.SourceOrderId_param"),
+                "OBJECT_TYPE" : "Order"
+            })));
+        
+        if(vars.get("$param.Links_param"))
+        {
+            var links = JSON.parse(vars.get("$param.Links_param"));
+            
+            for(var index in links)
+            {
+                var objectType = links[index]["OBJECT_TYPE"] == "" ? "Order" : links[index]["OBJECT_TYPE"];
+                neon.addRecord("Links",
+                    JSON.parse(JSON.stringify({
+                        "OBJECT_ROWID" : links[index]["OBJECT_ROWID"],
+                        "OBJECT_TYPE" : objectType
+                    })));
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/cancel/onActionProcess.js b/entity/Order_entity/entityfields/cancel/onActionProcess.js
index 16bfa9cc6a..541e1d8929 100644
--- a/entity/Order_entity/entityfields/cancel/onActionProcess.js
+++ b/entity/Order_entity/entityfields/cancel/onActionProcess.js
@@ -6,32 +6,35 @@ import("Order_lib");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-var id = vars.get("$field.SALESORDERID");
+var orderId = vars.get("$field.SALESORDERID");
 
 newWhereIfSet("SALESORDER.SALESORDERID", "$field.SALESORDERID")
     .updateFields({"CANCELLATION" : "1"}, "SALESORDER");
 
 neon.refreshAll();
 
-var contactId = vars.getString("$field.CONTACT_ID");
-var currency = vars.getString("$field.CURRENCY");
-var language = vars.getString("$field.ISOLANGUAGE");
-var header = vars.getString("$field.HEADER");
-var footer = vars.getString("$field.FOOTER");
-var offerId = vars.getString("$field.OFFER_ID");
-var deliveryTerm = vars.getString("$field.DELIVERYTERMS");
-var paymentTerm = vars.getString("$field.PAYMENTTERMS");
-var deliveryAddress = vars.getString("$field.DELIVERYADDRESS");
-var paymentAddress = vars.getString("$field.PAYMENTADDRESS");
-var rowId = vars.getString("$field.OBJECT_ROWID");
-var objectType = vars.getString("$field.OBJECT_TYPE");
-var dunningDate = vars.getString("$field.DUNNINGDATE");
-var dunningLevel = vars.getString("$field.DUNNINGLEVEL");
-var orderType= $KeywordRegistry.orderType$cancellation();
-var cancellation= vars.getString("$field.CANCELLATION");
-var orderStatus=vars.getString("$field.ORDERSTATUS");
 
-OrderUtils.copyOrder(offerId, contactId, orderType, language, currency, header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, rowId, dunningDate, dunningLevel, cancellation, orderStatus);
+var fieldValues = {
+    contactId: vars.getString("$field.CONTACT_ID"),
+    currency: vars.getString("$field.CURRENCY"),
+    language: vars.getString("$field.ISOLANGUAGE"),
+    header: vars.getString("$field.HEADER"),
+    footer: vars.getString("$field.FOOTER"),
+    offerId: vars.getString("$field.OFFER_ID"),
+    deliveryTerm: vars.getString("$field.DELIVERYTERMS"),
+    paymentTerm: vars.getString("$field.PAYMENTTERMS"),
+    paymentAddress: vars.getString("$field.PAYMENTADDRESS"),
+    deliveryAddress: vars.getString("$field.DELIVERYADDRESS"),
+    objectRowId: vars.getString("$field.OBJECT_ROWID"),
+    objectType: vars.getString("$field.OBJECT_TYPE"),
+    dunningDate: vars.getString("$field.DUNNINGDATE"),
+    dunningLevel: vars.getString("$field.DUNNINGLEVEL"),
+    orderType: $KeywordRegistry.orderType$cancellation(),
+    cancellation: vars.getString("$field.CANCELLATION"),
+    orderStatus:vars.getString("$field.ORDERSTATUS"),
+    discount:vars.getString("$field.DISCOUNT")
+};
 
+OrderUtils.copyOrder(orderId, fieldValues, true);
 
     
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/links/children/salesorderid_param/valueProcess.js b/entity/Order_entity/entityfields/links/children/salesorderid_param/valueProcess.js
new file mode 100644
index 0000000000..2d458f3d3e
--- /dev/null
+++ b/entity/Order_entity/entityfields/links/children/salesorderid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.SALESORDERID"));
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/links_param/documentation.adoc b/entity/Order_entity/entityfields/links_param/documentation.adoc
new file mode 100644
index 0000000000..33ba05bf33
--- /dev/null
+++ b/entity/Order_entity/entityfields/links_param/documentation.adoc
@@ -0,0 +1,4 @@
+Stringified entities.getRows() return of the Links consumer.
+
+This param get's filled by OrderUtils.copyOrder() when pCopyLinks is set to true.
+And get's used in the afterUiInit.js to preset those links
diff --git a/entity/Order_entity/entityfields/transferdeliverynote/onActionProcess.js b/entity/Order_entity/entityfields/transferdeliverynote/onActionProcess.js
index c999208047..0c7ef774bc 100644
--- a/entity/Order_entity/entityfields/transferdeliverynote/onActionProcess.js
+++ b/entity/Order_entity/entityfields/transferdeliverynote/onActionProcess.js
@@ -27,4 +27,4 @@ var fieldValues = {
     discount:vars.getString("$field.DISCOUNT")
 };
 
-OrderUtils.copyOrder(orderId, fieldValues);
\ No newline at end of file
+OrderUtils.copyOrder(orderId, fieldValues, true);
\ No newline at end of file
diff --git a/entity/Order_entity/entityfields/transferinvoice/onActionProcess.js b/entity/Order_entity/entityfields/transferinvoice/onActionProcess.js
index 85054a19bf..205006717f 100644
--- a/entity/Order_entity/entityfields/transferinvoice/onActionProcess.js
+++ b/entity/Order_entity/entityfields/transferinvoice/onActionProcess.js
@@ -27,4 +27,4 @@ var fieldValues = {
     discount:vars.getString("$field.DISCOUNT")
 };
 
-OrderUtils.copyOrder(orderId, fieldValues);
\ No newline at end of file
+OrderUtils.copyOrder(orderId, fieldValues, true);
\ No newline at end of file
diff --git a/entity/Order_entity/grantDeleteProcess.js b/entity/Order_entity/grantDeleteProcess.js
index d7bac9b238..7d6d96af04 100644
--- a/entity/Order_entity/grantDeleteProcess.js
+++ b/entity/Order_entity/grantDeleteProcess.js
@@ -12,6 +12,7 @@ var canDelete = new HasLinkedObjectTester()
     .andNoEntityRows("Activity_entity", "LinkedObjects", {ObjectId_param : currentContext, RowId_param : rowId}) //Activities
     .andNoEntityRows("Task_entity", "Tasks", {ObjectId_param : currentContext, RowId_param : rowId}) //Tasks
     .andNoEntityRows("Document_entity", "Documents", {AssignmentTable_param : "SALESORDER", AssignmentRowId_param : rowId}) //Documents
+    .andNoEntityRows("OrderLink_entity", "Links", {SalesorderId_param : rowId}) //OrderLink
     .validate();
 
 result.string(canDelete);
diff --git a/entity/Order_entity/recordcontainers/db/onDBInsert.js b/entity/Order_entity/recordcontainers/db/onDBInsert.js
index e529be392e..2d3460467e 100644
--- a/entity/Order_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Order_entity/recordcontainers/db/onDBInsert.js
@@ -1,9 +1,19 @@
+import("system.db");
+import("Employee_lib");
+import("system.util");
+import("Sql_lib");
+import("Entity_lib");
+import("system.logging");
 import("Offer_lib");
 import("Workflow_lib");
 import("Order_lib");
 import("system.neon");
 import("system.vars");
 
+var links = EntityConsumerRowsHelper.getCurrentConsumerRows("Links", ["OBJECT_ROWID", "OBJECT_TYPE", "SALESORDER_ID"]);
+
+OrderLinkUtils.handleLinks(links, vars.get("$local.uid"));
+
 //@TODO: OfferId_param is also set by 'copy order' -> the items of the offer are copied. What should happen?
 var rowdata = vars.get("$local.rowdata");
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
diff --git a/entity/Order_entity/recordcontainers/db/onDBUpdate.js b/entity/Order_entity/recordcontainers/db/onDBUpdate.js
index de5f68bc14..2d2591ba60 100644
--- a/entity/Order_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Order_entity/recordcontainers/db/onDBUpdate.js
@@ -1,3 +1,4 @@
+import("Entity_lib");
 import("Order_lib");
 import("system.entities");
 import("system.vars");
@@ -5,6 +6,9 @@ import("Workflow_lib");
 
 var rowdata = vars.get("$local.rowdata");
 var oid = rowdata["SALESORDER.SALESORDERID"];
+var links = EntityConsumerRowsHelper.getCurrentConsumerRows("Links", ["OBJECT_ROWID", "OBJECT_TYPE", "SALESORDER_ID"]);
+
+OrderLinkUtils.handleLinks(links, oid, vars.get("$field.Links.deletedRows"));
 
 if(vars.get("$field.DiscountChanged") == "true" && oid){
     var discount = rowdata["SALESORDER.DISCOUNT"];
diff --git a/neonContext/Order/Order.aod b/neonContext/Order/Order.aod
index 3aed2f990a..292c72ec90 100644
--- a/neonContext/Order/Order.aod
+++ b/neonContext/Order/Order.aod
@@ -33,7 +33,6 @@
     </neonViewReference>
     <neonViewReference>
       <name>ac222647-40b8-43e3-a054-edfc3d69106b</name>
-      <view>OrderLink_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>cea44230-2a80-4a3e-9dc4-3d199f8f6edc</name>
diff --git a/neonContext/OrderLink/OrderLink.aod b/neonContext/OrderLink/OrderLink.aod
new file mode 100644
index 0000000000..84130ba734
--- /dev/null
+++ b/neonContext/OrderLink/OrderLink.aod
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
+  <name>OrderLink</name>
+  <title>Receipt</title>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>OrderLinkFilter_view</filterView>
+  <previewView>OrderLinkPreview_view</previewView>
+  <entity>OrderLink_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>f7a75493-7b85-41d9-992e-f0b8e6de2216</name>
+      <view>OrderLinkFilter_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>7c716695-a9b1-4ab4-965e-11c18c8ceacd</name>
+      <view>OrderLinkMultiEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>73d603de-4f07-4f2f-bc58-55532a73c64d</name>
+      <view>OrderLinkPreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>3a683e7e-75d0-4067-8a12-f4123f10d773</name>
+      <view>OrderLinkPreviewList_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonView/OrderEdit_view/OrderEdit_view.aod b/neonView/OrderEdit_view/OrderEdit_view.aod
index 7ad8037635..686bb298e3 100644
--- a/neonView/OrderEdit_view/OrderEdit_view.aod
+++ b/neonView/OrderEdit_view/OrderEdit_view.aod
@@ -130,6 +130,11 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>f21d9b05-4dcd-4acf-a015-a886ce9c4f2f</name>
+      <entityField>Links</entityField>
+      <view>OrderLinkMultiEdit_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>72e2cb25-23e0-4f52-87a3-7c1bd80e99ec</name>
       <entityField>Attributes</entityField>
diff --git a/neonView/OrderLinkFilter_view/OrderLinkFilter_view.aod b/neonView/OrderLinkFilter_view/OrderLinkFilter_view.aod
new file mode 100644
index 0000000000..bc061ab0a1
--- /dev/null
+++ b/neonView/OrderLinkFilter_view/OrderLinkFilter_view.aod
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>OrderLinkFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <groupLayout>
+      <name>layout</name>
+    </groupLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>table</name>
+      <autoNewRow v="true" />
+      <columns>
+        <neonTableColumn>
+          <name>052374a4-5301-439d-b3ac-3a222c39b749</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>1893767d-6318-42df-8fb0-f04da82bd85d</name>
+          <entityField>OBJECT_ROWID</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+    <treeTableViewTemplate>
+      <name>treeTable</name>
+      <columns>
+        <neonTreeTableColumn>
+          <name>11518c47-06b2-442a-b1f9-a6b6f85046dd</name>
+          <entityField>OBJECT_ROWID</entityField>
+        </neonTreeTableColumn>
+        <neonTreeTableColumn>
+          <name>24cf5181-2db1-4b37-beb4-cf260c4b28f5</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonTreeTableColumn>
+      </columns>
+    </treeTableViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OrderLinkMultiEdit_view/OrderLinkMultiEdit_view.aod b/neonView/OrderLinkMultiEdit_view/OrderLinkMultiEdit_view.aod
new file mode 100644
index 0000000000..a192528243
--- /dev/null
+++ b/neonView/OrderLinkMultiEdit_view/OrderLinkMultiEdit_view.aod
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>OrderLinkMultiEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <genericMultipleViewTemplate>
+      <name>genericMultiple</name>
+      <columns>
+        <neonGenericMultipleTableColumn>
+          <name>28d9a600-aa77-416d-abc8-a191ac338254</name>
+          <entityField>OBJECT_TYPE</entityField>
+        </neonGenericMultipleTableColumn>
+        <neonGenericMultipleTableColumn>
+          <name>cb9aac2d-5495-48b6-b8c9-120a9ceb9d52</name>
+          <entityField>OBJECT_ROWID</entityField>
+        </neonGenericMultipleTableColumn>
+      </columns>
+    </genericMultipleViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OrderLinkPreviewList_view/OrderLinkPreviewList_view.aod b/neonView/OrderLinkPreviewList_view/OrderLinkPreviewList_view.aod
new file mode 100644
index 0000000000..688209b87a
--- /dev/null
+++ b/neonView/OrderLinkPreviewList_view/OrderLinkPreviewList_view.aod
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
+  <name>OrderLinkPreviewList_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <noneLayout>
+      <name>layout</name>
+    </noneLayout>
+  </layout>
+  <children>
+    <titledListViewTemplate>
+      <name>links</name>
+      <titleField>OBJECT_TYPE</titleField>
+      <columns>
+        <neonTitledListTableColumn>
+          <name>bf3aa37e-c59b-4751-bb3d-ccded68121bd</name>
+          <entityField>OBJECT_ROWID</entityField>
+        </neonTitledListTableColumn>
+      </columns>
+    </titledListViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/OrderLink_view/OrderLink_view.aod b/neonView/OrderLinkPreview_view/OrderLinkPreview_view.aod
similarity index 51%
rename from neonView/OrderLink_view/OrderLink_view.aod
rename to neonView/OrderLinkPreview_view/OrderLinkPreview_view.aod
index c70ac5d66d..50eb1a5615 100644
--- a/neonView/OrderLink_view/OrderLink_view.aod
+++ b/neonView/OrderLinkPreview_view/OrderLinkPreview_view.aod
@@ -1,30 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8">
-  <name>OrderLink_view</name>
-  <title>Links</title>
+  <name>OrderLinkPreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
-    <boxLayout>
+    <noneLayout>
       <name>layout</name>
-    </boxLayout>
+    </noneLayout>
   </layout>
   <children>
     <genericViewTemplate>
-      <name>Links</name>
-      <entityField>#ENTITY</entityField>
+      <name>links</name>
       <fields>
         <entityFieldLink>
-          <name>3a8b8210-72d3-4b58-b964-0a1058909346</name>
-          <entityField>OFFER_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>11cb37e5-d902-44ba-8494-c26215e2a46a</name>
+          <name>1235b65f-a4b8-4710-8dd2-46cc6c85ab70</name>
           <entityField>OBJECT_ROWID</entityField>
         </entityFieldLink>
-        <entityFieldLink>
-          <name>470b177a-7df6-4433-acf5-e43d77ebb04b</name>
-          <entityField>OBJECT_TYPE</entityField>
-        </entityFieldLink>
       </fields>
     </genericViewTemplate>
   </children>
diff --git a/neonView/OrderPreview_view/OrderPreview_view.aod b/neonView/OrderPreview_view/OrderPreview_view.aod
index b29cb9ac76..cc5cdd5c95 100644
--- a/neonView/OrderPreview_view/OrderPreview_view.aod
+++ b/neonView/OrderPreview_view/OrderPreview_view.aod
@@ -121,6 +121,11 @@
         </entityFieldLink>
       </fields>
     </genericViewTemplate>
+    <neonViewReference>
+      <name>1bcdc4ef-8153-4ef2-a9de-e8b7fba711c8</name>
+      <entityField>Links</entityField>
+      <view>OrderLinkPreviewList_view</view>
+    </neonViewReference>
     <neonViewReference>
       <name>2e68ece3-d98d-49c4-92f9-3e3675ba5cb2</name>
       <entityField>MainDocuments</entityField>
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index 8dfe4b4d5e..c88d00506f 100644
--- a/process/Order_lib/process.js
+++ b/process/Order_lib/process.js
@@ -1,3 +1,5 @@
+import("Employee_lib");
+import("system.entities");
 import("Offer_lib");
 import("system.project");
 import("Context_lib");
@@ -106,8 +108,9 @@ OrderUtils.createNewOrder = function(pContextId, pRowId, pRelationId)
  * @param {Object} [pOrderData] the field values to preset, possible properties: contactId, orderType, language, offerId, currency, 
  *      header, footer, deliveryTerm, paymentTerm, paymentAddress, deliveryAddress, objectType, objectRowId, 
  *      dunningDate, dunningLevel, cancellation, orderStatus
+ * @param {Booelan} [pCopyLinks] whether or not the existing links should get copied aswell
  */
-OrderUtils.copyOrder = function (pSourceOrderId, pOrderData)
+OrderUtils.copyOrder = function (pSourceOrderId, pOrderData, pCopyLinks)
 {
     if (!pOrderData)
         pOrderData = {};
@@ -131,12 +134,22 @@ OrderUtils.copyOrder = function (pSourceOrderId, pOrderData)
         "$field.ORDERSTATUS": pOrderData.orderStatus || "",
         "$field.DISCOUNT": pOrderData.discount || ""
     };
-    
+       
     var params = {
         "Copy_param": JSON.stringify(fieldparams),
         "SourceOrderId_param": pSourceOrderId
     };
     
+    if(pCopyLinks)
+    {
+        var config = entities.createConfigForLoadingConsumerRows()//get the links
+                                .consumer("Links")
+                                .fields(["OBJECT_TYPE", "OBJECT_ROWID"]);
+        var links = entities.getRows(config);
+        
+        params["Links_param"] = JSON.stringify(links);
+    }
+    
     neon.openContext("Order", null, null, neon.OPERATINGSTATE_NEW, params);
 }
 
@@ -810,3 +823,89 @@ OrderItemUtils.getDiscountedNet = function(pExcludedIs, pOrderId, pDiscount, pEx
     ret = [sum, vat];
     return ret;
 }
+
+/**
+ * Methods used by Order and Orderlink.
+ * Do not create an instance of this!
+ * 
+ * @class
+ */
+function OrderLinkUtils() {}
+   
+/**
+ * This function is used to handle the orderLinks when inserting, updating and deleting orderLink records.
+ * <p>
+ * We Always want to have the linked Orders both ways: 
+ * <p>
+ * If Order 1001 has a link to Order 1004 -> 1004 should have a link to 1001
+ * <p>
+ * We have to use it in the onInsert and onUpdate of Order_entity aswell as the onUpdate, onDelete and onInsert of OrderLink_entity so it also get's triggered when updating records in the preview.
+ * 
+ * @param {Array} [pLinks] Array with the Rows as objects (as returned by EntityConsumerRowsHelper.getCurrentConsumerRows() for example)
+ * @param {String} pOrderId the salesOrderId the links are coming from
+ * @param {Array} [pRemovedLinks] Array with the Rows as objects
+ */
+OrderLinkUtils.handleLinks = function(pLinks, pOrderId, pRemovedLinks)
+{
+    if(pRemovedLinks)
+    {
+        var deleteStatements = [];
+        var idk = 123;
+        for (var i = 0; i < pRemovedLinks.length; i++)
+        {
+            deleteStatements.push(newWhere("SALESORDERLINK.SALESORDER_ID", pRemovedLinks[i]["OBJECT_ROWID"]).buildDeleteStatement(true, "SALESORDERLINK"));
+        }
+        db.execute(deleteStatements);
+    }
+    if(pLinks)
+    {
+        var orderIds = [];
+        var insertStatements = [];
+        // the empty rows of the consumer are deleted
+        pLinks.forEach(function(row)
+        {
+            if(row["OBJECT_TYPE"] == "Order")
+            {
+                var ownOrderId = row["SALESORDER_ID"];
+                var linkedOrderId = row["OBJECT_ROWID"];
+                orderIds.push(linkedOrderId);
+            }
+        });
+        if(orderIds.length > 0)
+        {
+            var salesOrderIds = newSelect("SALESORDERLINK.OBJECT_ROWID") //one select -> performance
+                                            .from("SALESORDERLINK")
+                                            .where("SALESORDERLINK.OBJECT_TYPE", "Order")
+                                            .and("SALESORDERLINK.SALESORDER_ID", orderIds, SqlBuilder.IN())
+                                            .and("SALESORDERLINK.OBJECT_ROWID", pOrderId)
+                                            .groupBy("OBJECT_ROWID")
+                                            .table();
+            var orderId, linkedId;
+
+            for (let i = 0; i < salesOrderIds.length; i++)
+            {
+                orderIds.splice(i, 1);//link already exists for these ones -> we don't need to insert
+            }
+
+            var columns = ["SALESORDERLINKID"
+                            , "SALESORDER_ID"
+                            , "OBJECT_TYPE"
+                            , "OBJECT_ROWID"
+                            , "USER_NEW"
+                            , "DATE_NEW"]
+
+            for (let i = 0; i < orderIds.length; i++)
+            {
+                var values = [util.getNewUUID()
+                                , orderIds[i]
+                                , "Order"
+                                , pOrderId
+                                , EmployeeUtils.getCurrentUserName()
+                                , vars.get("$sys.date")];
+
+                insertStatements.push(["SALESORDERLINK", columns, null, values]);
+            }
+            db.inserts(insertStatements)
+        }
+    }
+};
\ No newline at end of file
-- 
GitLab