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 0000000000000000000000000000000000000000..e64d7dc82d16fff5bd44f16ef27e959b0daf0ad8 --- /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 0000000000000000000000000000000000000000..8b4db13937621fe95a8659a71548a11bc400c168 --- /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 04d7ebe37a0ad01d785ec410f836fbd36b0786f2..e916c2770185190ea0ee13062e8016ab4ec7a25a 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 c2b79be597e2a13c90fa3ac33d193f80d5c4d437..4be3a84381cd8c61023613d35ccbe226b90ae36c 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 063809fea729fd8ff0978f4d790e35b6efcfdcb3..48924a76732f7a118fd3a6533ea521b7289aae30 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 0000000000000000000000000000000000000000..80a62aac0b8777398eae021c1700e345860ca8c5 --- /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 0000000000000000000000000000000000000000..40effa0178464da0c7850912345f19c7fa95975a --- /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 0000000000000000000000000000000000000000..1322527cbbdb3bdc8b39b9b566f8c82dc67b33e9 --- /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 0000000000000000000000000000000000000000..40effa0178464da0c7850912345f19c7fa95975a --- /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 0000000000000000000000000000000000000000..e6d20e4080787e38bc7de7a01091ecd46c05341c --- /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 0000000000000000000000000000000000000000..6e5570234a309e4aaf8077d0802bb0cdecb023e5 --- /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 0000000000000000000000000000000000000000..2af46a8e46789056c6c341a8e4e087f8e1edc0c4 --- /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 0000000000000000000000000000000000000000..d5cf2ff4f91546bf853125bec438493692a5e048 --- /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 0000000000000000000000000000000000000000..f2a40e1892fb08c15ef403d5002bb90dc2849406 --- /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 0000000000000000000000000000000000000000..d868fe097f20bc5d880af358b27fdea7a2c86063 --- /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 0000000000000000000000000000000000000000..e3435bffa1e849f6da8a5ff3662ef7b154b9eda2 --- /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 0000000000000000000000000000000000000000..4b81aa46c3f521882479fdb3f24979bda39cfc8a --- /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 0000000000000000000000000000000000000000..b1bb16711d793d92bca8f72231ad9c0f745c064d --- /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 0000000000000000000000000000000000000000..004b4ab41fdb2a6e8263543545182b36f8de29b4 --- /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 0000000000000000000000000000000000000000..24e8467f15a62bf30965849807daf8fb85977f2e --- /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 0000000000000000000000000000000000000000..85a3b3e8638686b094c443d272dac51df6c53509 --- /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 0000000000000000000000000000000000000000..5bf99687b621fac560b5ef37fbf1d7c1154f17b2 --- /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 0000000000000000000000000000000000000000..f578a15953fc100fc416f373bc0f53d1783f5987 --- /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 0000000000000000000000000000000000000000..a428cace58da48a288b062bb3ea769d336542604 --- /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 4c9cd4456c3f942948a45ab3d522c6d69a4ead5c..2409f0352293693a1cd6d2939cc3570b53ee79d3 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 fb24b7ec60ecd148bd0781d70563249786539bc0..d8c53b2671d5474d8350c7e5cfadfe17e7784eda 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 16bfa9cc6a1bbf6f8082c87ce745c4b1ab47b3db..541e1d8929271be192b851790dacafc6a96e6e9e 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 0000000000000000000000000000000000000000..2d458f3d3e14b4d4de7e16459e7ca915b9aafa16 --- /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 0000000000000000000000000000000000000000..33ba05bf332247188c4df4aa96b52b2f8a0be347 --- /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 c9992080475e9d6cd0f950b670f8079072395fb5..0c7ef774bc2702191d0c03b0e691cde1daa2c437 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 85054a19bf5183650c8b136f844dd133934e998b..205006717f92f7ad7edc039cb3efa634bcf0932a 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 d7bac9b238bc8f4beac4eeac96192f6f09d96408..7d6d96af04a2f7f9f374db27558dc2e36a7fb86a 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 e529be392e73ba3440f64c71a55beb52115f9680..2d3460467efd7eada8fc2339c04b58fa7531f7c7 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 de5f68bc141ec452ccbfc58ab1a6762919698d5a..2d2591ba60c5fe418f5a45c390bead3516efdafa 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 3aed2f990aa1c611b9800ff36c2f9d14cb569f98..292c72ec90fab1d1ae51db46715e333675e2b252 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 0000000000000000000000000000000000000000..84130ba73423ef8194e50e669aab039c2abbdad0 --- /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 7ad8037635ed21259aab3e15150b9adc86152afa..686bb298e348df0882623a6fad08b66d6672fec9 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 0000000000000000000000000000000000000000..bc061ab0a1bb9c0c49d846e239695037b8bc09b3 --- /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 0000000000000000000000000000000000000000..a192528243a1518342193a95d5ead877b411c2f1 --- /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 0000000000000000000000000000000000000000..688209b87a5dc4d1f45ee5592bbb2919fad84011 --- /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 c70ac5d66db832b24065e15aec813127f41507f3..50eb1a5615d4a5739c513899949ce26adea876ff 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 b29cb9ac7650c362802bf6a09ced75f3d339bcf4..cc5cdd5c9557e602e8a8cebb93ace6cf6d7a86e5 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 8dfe4b4d5e5b23c1659e8cd1a1c096dc0777d8cc..c88d00506f6757b5e441c6084a2602a4bb4836ff 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