diff --git a/.liquibase/Data_alias/basic/2020.2.2/Offer/addColumnOffer.xml b/.liquibase/Data_alias/basic/2020.2.2/Offer/addColumnOffer.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1ae38fd53a3e8cd90aa3ae2a373c704004c016f7
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/Offer/addColumnOffer.xml
@@ -0,0 +1,16 @@
+<?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="s.garb" id="995a11c7-fb16-4c33-b5ad-0c35f44905c3">
+        <addColumn tableName="OFFER">
+            <column name="DISCOUNT"  type="NUMERIC(14,2)" />
+            <column name="DISCOUNTED_NET"  type="NUMERIC(14,2)" />
+        </addColumn>
+    </changeSet> 
+    <changeSet author="s.garb" id="801708bd-91f0-4468-bed9-0bbab7e46997">
+        <addColumn tableName="OFFER">
+            <column name="DISCOUNTED_VAT"  type="NUMERIC(14,2)" />
+        </addColumn>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/Offer/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/Offer/changelog.xml
new file mode 100644
index 0000000000000000000000000000000000000000..86ddb71fe50db74127c2f6397e78cfffbacf5740
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2020.2.2/Offer/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 file="addColumnOffer.xml" relativeToChangelogFile="true" />
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
index 2a4bea7a4e0949d9504cea14b44a0f11cf14b25d..edc1ad48eaf11d2b6d7c88175b0113918d72c1d5 100644
--- a/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2020.2.2/changelog.xml
@@ -1,6 +1,7 @@
 <?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="Offer/changelog.xml"/>
     <include relativeToChangelogFile="true" file="insert_commMediumTitleKeywordAttribute.xml"/>
     <include relativeToChangelogFile="true" file="Knowledgemanagement/changelog_knowledgeManagement.xml"/>
     <include relativeToChangelogFile="true" file="insert_employeeCountAttribute.xml"/>
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index 1b90bea7f650ec646579634c155ced038fcf0d35..dbca10b0c0e70175cf3fdec1d3809a2fd5080360 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -3108,6 +3108,48 @@
                 <title></title>
                 <description></description>
               </entityFieldDb>
+              <entityFieldDb>
+                <name>DISCOUNT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="3" />
+                <size v="14" />
+                <scale v="2" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DISCOUNTED_NET</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="3" />
+                <size v="14" />
+                <scale v="2" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DISCOUNTED_VAT</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="3" />
+                <size v="14" />
+                <scale v="2" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
             </entityFields>
           </entityDb>
           <entityDb>
diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod
index 5349b4d8fd4c116790e08f7527679c5de5f74b5f..16bc1d967bbb1e7d6dea78d43d65f8985b06327a 100644
--- a/entity/Offer_entity/Offer_entity.aod
+++ b/entity/Offer_entity/Offer_entity.aod
@@ -98,6 +98,7 @@
       <contentType>NUMBER</contentType>
       <inputFormat>#,##0.00</inputFormat>
       <state>READONLY</state>
+      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/vat/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/Offer_entity/entityfields/vat/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -145,6 +146,10 @@
           <name>Language_param</name>
           <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/language_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>Discount_param</name>
+          <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/offeritems/children/discount_param/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
       <dependency>
         <name>dependency</name>
@@ -164,7 +169,7 @@
       <contentType>NUMBER</contentType>
       <outputFormat>#,##0.00</outputFormat>
       <inputFormat>#,##0.00</inputFormat>
-      <groupable v="true" />
+      <groupable v="false" />
       <state>READONLY</state>
       <displayValueProcess>%aditoprj%/entity/Offer_entity/entityfields/net/displayValueProcess.js</displayValueProcess>
     </entityField>
@@ -1056,6 +1061,45 @@
     <entityField>
       <name>ACTIVE</name>
     </entityField>
+    <entityField>
+      <name>DISCOUNT</name>
+      <title>Discount</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>0.00'%'</outputFormat>
+      <inputFormat>0.00</inputFormat>
+      <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/discount/valueProcess.js</valueProcess>
+      <onValueChange>%aditoprj%/entity/Offer_entity/entityfields/discount/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+      <onValidation>%aditoprj%/entity/Offer_entity/entityfields/discount/onValidation.js</onValidation>
+    </entityField>
+    <entityField>
+      <name>DISCOUNTED_NET</name>
+      <title>discounted Price</title>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <inputFormat>#,##0.00</inputFormat>
+      <state>READONLY</state>
+      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/discounted_net/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/Offer_entity/entityfields/discounted_net/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityParameter>
+      <name>Discount_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>DiscountChanged</name>
+    </entityField>
+    <entityField>
+      <name>DISCOUNTED_VAT</name>
+      <title>discounted Vat</title>
+      <contentType>NUMBER</contentType>
+      <inputFormat>#,##0.00</inputFormat>
+      <stateProcess>%aditoprj%/entity/Offer_entity/entityfields/discounted_vat/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/Offer_entity/entityfields/discounted_vat/displayValueProcess.js</displayValueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
@@ -1308,6 +1352,18 @@
           <name>ACTIVE.value</name>
           <expression>%aditoprj%/entity/Offer_entity/recordcontainers/db/recordfieldmappings/active.value/expression.js</expression>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DISCOUNTED_NET.value</name>
+          <recordfield>OFFER.DISCOUNTED_NET</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DISCOUNT.value</name>
+          <recordfield>OFFER.DISCOUNT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DISCOUNTED_VAT.value</name>
+          <recordfield>OFFER.DISCOUNTED_VAT</recordfield>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
       <filterExtensions>
         <filterExtensionSet>
diff --git a/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js b/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
index d610943f3409687827462179063e28df0aa3dde8..1b596584b051bec97da19e07429f38fecb1a9894 100644
--- a/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
+++ b/entity/Offer_entity/entityfields/copyoffer/onActionProcess.js
@@ -1,8 +1,8 @@
 import("system.vars");
+import("system.neon");
 import("Offer_lib");
 
 var offerId = vars.getString("$field.OFFERID");
-
 var fieldValues = {
     contactId: vars.getString("$field.CONTACT_ID"),
     language: vars.getString("$field.ISOLANGUAGE"),
@@ -12,7 +12,9 @@ var fieldValues = {
     deliveryTerm: vars.getString("$field.DELIVERYTERMS"),
     paymentTerm: vars.getString("$field.PAYMENTTERMS"),
     objectRowId: vars.getString("$field.OBJECT_ROWID"),
-    objectType: vars.getString("$field.OBJECT_TYPE")
+    objectType: vars.getString("$field.OBJECT_TYPE"),
+    discount: vars.getString("$field.DISCOUNT")
+    
 };
 
 OfferUtils.copyOffer(offerId, fieldValues);
diff --git a/entity/Offer_entity/entityfields/discount/onValidation.js b/entity/Offer_entity/entityfields/discount/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..595a5d9aae549242aaa2246e2e4b6e6d602249a0
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discount/onValidation.js
@@ -0,0 +1,10 @@
+import("system.result");
+import("system.vars");
+import("Util_lib");
+import("Entity_lib");
+
+var value = vars.get("local.value");
+var validationResult = NumberUtils.validateIsBetweenFloat("Discount", value, 0, 100);
+
+if (validationResult)
+    result.string(validationResult);
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discount/onValueChange.js b/entity/Offer_entity/entityfields/discount/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..5fc7651884946ad0f59a3f5c51b5bb93f0505c30
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discount/onValueChange.js
@@ -0,0 +1,5 @@
+import("system.neon");
+import("system.vars");
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon. OPERATINGSTATE_EDIT){
+    neon.setFieldValue("$field.DiscountChanged", "true");
+}
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discount/valueProcess.js b/entity/Offer_entity/entityfields/discount/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..fa96d16798f8258f091583613760f918dc4a8126
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discount/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.vars");
+import("system.result");
+    
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.Discount_param")
+    && vars.get("$param.Discount_param")){
+    result.string(vars.get("$param.Discount_param"));
+}
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discounted_net/displayValueProcess.js b/entity/Offer_entity/entityfields/discounted_net/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c7473e812c66616164442674dc87bdd5282dc50d
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discounted_net/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("Util_lib");
+import("system.vars");
+import("system.translate");
+import("system.result");
+
+result.string(NumberUtils.formatWithCurrency(vars.get("$field.DISCOUNTED_NET"), translate.text("#,##0.00"), vars.get("$field.CURRENCY")));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discounted_net/stateProcess.js b/entity/Offer_entity/entityfields/discounted_net/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7443b0c0dcb6c9e38045968ddaa64b5763dfd85e
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discounted_net/stateProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var discount = vars.get("$field.DISCOUNT");
+
+if(parseInt(discount) == parseInt("0") || !discount)
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+else 
+    result.string(neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discounted_vat/displayValueProcess.js b/entity/Offer_entity/entityfields/discounted_vat/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..730396f16084a8c954d9cd54640efdd758e8cb52
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discounted_vat/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("Util_lib");
+import("system.vars");
+import("system.translate");
+import("system.result");
+
+result.string(NumberUtils.formatWithCurrency(vars.get("$field.DISCOUNTED_VAT"), translate.text("#,##0.00"), vars.get("$field.CURRENCY")));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/discounted_vat/stateProcess.js b/entity/Offer_entity/entityfields/discounted_vat/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7443b0c0dcb6c9e38045968ddaa64b5763dfd85e
--- /dev/null
+++ b/entity/Offer_entity/entityfields/discounted_vat/stateProcess.js
@@ -0,0 +1,10 @@
+import("system.vars");
+import("system.neon");
+import("system.result");
+
+var discount = vars.get("$field.DISCOUNT");
+
+if(parseInt(discount) == parseInt("0") || !discount)
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+else 
+    result.string(neon.COMPONENTSTATE_READONLY);
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js b/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js
index 5a7493c41130f53a5a877ad0823f5783c8c80c02..02f67ef9c37049f446df6879107ff67b6032e91e 100644
--- a/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js
+++ b/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js
@@ -15,6 +15,7 @@ var params = {
     "OfferHeader_param" : vars.get("$field.HEADER"),
     "OfferFooter_param" : vars.get("$field.FOOTER"),
     "OfferDeliveryTerm_param" : vars.get("$field.DELIVERYTERMS"),
-    "OfferPaymentTerm_param" : vars.get("$field.PAYMENTTERMS")
+    "OfferPaymentTerm_param" : vars.get("$field.PAYMENTTERMS"),
+    "Discount_param": vars.get("$field.DISCOUNT")
 }
 neon.openContext("Offer", null, null, neon.OPERATINGSTATE_NEW, params);
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js b/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
index 8074aca46e2680d0b0d19060e41f370b84830fa1..44cc4476bcc740985830e3575cd626e03b526918 100644
--- a/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/Offer_entity/entityfields/object_rowid/displayValueProcess.js
@@ -1,11 +1,11 @@
-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") == null) {
-    result.string("");
-} else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
-}
\ No newline at end of file
+//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") == null) {
+//    result.string("");
+//} else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
+//    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
+//}
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/offeritems/children/discount_param/valueProcess.js b/entity/Offer_entity/entityfields/offeritems/children/discount_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..67b63c37f044f7d1f4e807d7a863457a78552701
--- /dev/null
+++ b/entity/Offer_entity/entityfields/offeritems/children/discount_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.DISCOUNT"));
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/totalgross/valueProcess.js b/entity/Offer_entity/entityfields/totalgross/valueProcess.js
index 6e374c8f50a610ed0f50b89319726224167631d0..9d6a6c9330d2fd3eb57fa5f5102e55ad5eb0ef3b 100644
--- a/entity/Offer_entity/entityfields/totalgross/valueProcess.js
+++ b/entity/Offer_entity/entityfields/totalgross/valueProcess.js
@@ -2,7 +2,8 @@ import("system.result");
 import("system.vars");
 import("system.eMath");
 
-var netValue = vars.get("$field.NET");
-var vatValue = vars.get("$field.VAT");
+var discount = vars.get("$field.DISCOUNT");
+var netValue = discount && parseInt(discount) != parseInt("0")  ? vars.get("$field.DISCOUNTED_NET") : vars.get("$field.NET")
+var vatValue =  discount && parseInt(discount) != parseInt("0") ? vars.get("$field.DISCOUNTED_VAT") : vars.get("$field.VAT");
 
 result.string( eMath.addDec(netValue, vatValue) );
\ No newline at end of file
diff --git a/entity/Offer_entity/entityfields/vat/stateProcess.js b/entity/Offer_entity/entityfields/vat/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..42a2d8e6788a09e0c2c8b410c5e4eadb7bfeb115
--- /dev/null
+++ b/entity/Offer_entity/entityfields/vat/stateProcess.js
@@ -0,0 +1,10 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+var discount = vars.get("$field.DISCOUNT");
+
+if(discount && parseInt(discount) != parseInt("0")){
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
+else 
+    result.string(neon.COMPONENTSTATE_READONLY)
\ No newline at end of file
diff --git a/entity/Offer_entity/recordcontainers/db/onDBInsert.js b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
index da551808a8c82e05a35c7aecf40d283434b2f4c0..c7d3c3336eadfb5bc6b41deaec997081f23c491b 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBInsert.js
@@ -1,17 +1,20 @@
 import("Context_lib");
 import("system.workflow");
 import("Workflow_lib");
+import("system.db");
 import("system.datetime");
+import("system.util");
 import("system.neon");
 import("system.vars");
 import("Offer_lib");
-import("Sql_lib");
 
+var rowdata = vars.get("$local.rowdata");
 if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
 {
     var offerId = vars.get("$local.uid");
-    if (vars.exists("$param.OfferOriginal_Id_param"))
-        OfferUtils.copyOfferItems(vars.getString("$param.OfferOriginal_Id_param"), offerId);
+    var discount = rowdata["OFFER.DISCOUNT"];
+    if (vars.exists("$param.OfferOriginal_Id_param") && vars.get("$param.OfferOriginal_Id_param"))
+        OfferUtils.copyOfferItems(vars.getString("$param.OfferOriginal_Id_param"), offerId, discount);
     
     var activityId = vars.get("$param.ActivityId_param");
     if (activityId)
diff --git a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
index 2e53f3cad9a9edf21cc5bbc6fdecc00c5001dfee..866c488632bc1e0629e2bfd4b4681a8f3baad6a5 100644
--- a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js
@@ -1,3 +1,38 @@
+import("system.entities");
+import("Offer_lib");
+import("system.vars");
 import("Workflow_lib");
 
+var rowdata = vars.get("$local.rowdata");
+var oid = rowdata["OFFER.OFFERID"];
+if(vars.get("$field.DiscountChanged") == "true" && oid){
+    var discount = rowdata["OFFER.DISCOUNT"];
+    var oiUtils = new OfferItemUtils(oid);  
+    
+    var vals = oiUtils.getNetAndVat();
+    var discountedVals = OfferItemUtils.getDiscountedNet(null, oid, discount);
+    
+    let config = entities.createConfigForUpdatingRows();
+    config.entity("Offer_entity");
+    if(discountedVals){
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1],
+            "DISCOUNTED_NET": discountedVals[0],
+            "DISCOUNTED_VAT": discountedVals[1]
+        });
+    }
+    else 
+    {
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1]
+        });
+    }
+
+    config.uid(oid);
+    entities.updateRow(config);
+
+}
+
 WorkflowSignalSender.updated();
\ No newline at end of file
diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod
index a900e6473e8d7ded55a0ca946aa0798296bf657e..81fb7d31b7653aa0fc62698a0d29813d33c89c66 100644
--- a/entity/Offeritem_entity/Offeritem_entity.aod
+++ b/entity/Offeritem_entity/Offeritem_entity.aod
@@ -248,6 +248,10 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityParameter>
+      <name>Discount_param</name>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js b/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js
index 88f823f4fb90b6fcbd3e10b059a1bbf3df190dc0..283d1cb7a7cdb0568b117c1f8001fe4f7a2ef796 100644
--- a/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Offeritem_entity/recordcontainers/db/onDBDelete.js
@@ -1,3 +1,4 @@
+import("system.entities");
 import("system.neon");
 import("system.vars");
 import("system.db");
@@ -8,6 +9,7 @@ var oid = vars.get("$field.OFFER_ID");
 if(oid != "")
 {
     var oiid = vars.get("$field.OFFERITEMID");
+    var discount = vars.exists("$param.Discount_param") ? vars.get("$param.Discount_param"): "";
     var oiUtils = new OfferItemUtils(oid);
     var deletedIds = oiUtils.deletePartsList(oiid);
     oiUtils.reOrgItems();
@@ -15,8 +17,27 @@ if(oid != "")
     deletedIds.push(oiid);
     var cols = ["NET", "VAT"];
     
-    var vals = oiUtils.getNetAndVat(deletedIds);
+    var vals = oiUtils.getNetAndVat(deletedIds);    
+    var discountedVals = OfferItemUtils.getDiscountedNet(deletedIds, oid, discount);
     
-    newWhere("OFFER.OFFERID", oid)
-        .updateData(true, "OFFER", cols, null, vals)
+    let config = entities.createConfigForUpdatingRows()
+    config.entity("Offer_entity");
+    
+    if(discountedVals){
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1],
+            "DISCOUNTED_NET": discountedVals[0],
+            "DISCOUNTED_VAT": discountedVals[1]
+        });
+    }
+    else{
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1]
+        });
+    }
+    config.uid(oid);
+    entities.updateRow(config);
+
 }
\ No newline at end of file
diff --git a/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js b/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js
index 473b49850845193bb86ddee243f668ae206617e4..f7e305e7c5ecac3ab334df84828152e91e3e9d30 100644
--- a/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js
@@ -1,3 +1,4 @@
+import("system.entities");
 import("system.datetime");
 import("system.neon");
 import("system.vars");
@@ -14,14 +15,34 @@ if(oid != "")
 {
     var curr = vars.exists("$param.Currency_param") ? vars.get("$param.Currency_param") : "";
     var contactid = vars.exists("$param.ContactId_param") ? vars.get("$param.ContactId_param") : "";
+    var discount = vars.exists("$param.Discount_param") ? vars.get("$param.Discount_param"): "";
     var oiUtils = new OfferItemUtils(rowdata["OFFERITEM.OFFER_ID"]);    
     oiUtils.insertPartsList(rowdata["OFFERITEM.PRODUCT_ID"], vars.get("$local.uid"), curr, contactid, vars.get("$param.Language_param"));
     oiUtils.reOrgItems();
     
     //update offer price
     var vals = oiUtils.getNetAndVat();
-    var cols = ["NET", "VAT"];
+    var discountedVals = OfferItemUtils.getDiscountedNet(null, oid,  discount);
+    
+    let config = entities.createConfigForUpdatingRows()
+    config.entity("Offer_entity");
+
+    if(discountedVals){
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1],
+            "DISCOUNTED_NET": discountedVals[0],
+            "DISCOUNTED_VAT": discountedVals[1]
+        });
+    }
+    else{
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1]
+        });
+
+    }
+    config.uid(oid);
+    entities.updateRow(config);
 
-    newWhere("OFFER.OFFERID", oid)
-        .updateData(true, "OFFER", cols, null, vals);    
 }
\ No newline at end of file
diff --git a/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js b/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js
index a1e94cd51186a9e57ee45df344263e3cc26d79b9..a004c7c8b6e4ca57eb19c52f75ef55dafded35b8 100644
--- a/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Offeritem_entity/recordcontainers/db/onDBUpdate.js
@@ -1,3 +1,4 @@
+import("system.entities");
 import("system.vars");
 import("system.db");
 import("system.neon");
@@ -7,9 +8,30 @@ import("Sql_lib");
 var oid = vars.get("$field.OFFER_ID");
 if(oid != "")
 {
+    var discount = vars.exists("$param.Discount_param") ? vars.get("$param.Discount_param"): "";
     var cols = ["NET", "VAT"];    
     var oiUtils = new OfferItemUtils(oid);
+    var vals = oiUtils.getNetAndVat();
+    var discountedVals = OfferItemUtils.getDiscountedNet(null, oid, discount);
     
-    newWhere("OFFER.OFFERID", oid)
-        .updateData(true, "OFFER", cols, null, oiUtils.getNetAndVat());    
+    let config = entities.createConfigForUpdatingRows()
+    config.entity("Offer_entity");
+    
+    if(discountedVals){
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1],
+            "DISCOUNTED_NET": discountedVals[0],
+            "DISCOUNTED_VAT": discountedVals[1]
+        });
+    }
+    else{
+        config.fieldValues({
+            "NET": vals[0],
+            "VAT": vals[1]
+        });
+    }
+    config.uid(oid);
+    entities.updateRow(config);
+ 
 }
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index 662da014d5034596c4170f196f73536c410c0250..a2b956772e39261987796439c35f9e2f4f4229b9 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -10,6 +10,10 @@
       <key>The max participants count can not be equal or less then 0</key>
       <value>Die maximale Teilnehmerzahl muss größer 0 sein!</value>
     </entry>
+    <entry>
+      <key>discounted Vat</key>
+      <value>Rbt. Mehrwertssteuer</value>
+    </entry>
     <entry>
       <key>Illegal Parent Operator in buildFilterObj-Function:</key>
       <value>Übergebener Operator ungültig in Funktion "buildFilterObj"</value>
@@ -38,6 +42,10 @@
       <key>Private</key>
       <value>Privat</value>
     </entry>
+    <entry>
+      <key>discounted Price</key>
+      <value>Rbt. Betrag netto</value>
+    </entry>
     <entry>
       <key>Add app</key>
       <value>App hinzufügen</value>
@@ -2851,6 +2859,10 @@
       <key>Guam</key>
       <value>Guam</value>
     </entry>
+    <entry>
+      <key>Subtotal</key>
+      <value>Zwischensumme</value>
+    </entry>
     <entry>
       <key>Lesotho</key>
       <value>Lesotho</value>
@@ -4463,6 +4475,10 @@
       <key>Salesproject milestone Id</key>
       <value>VertriebsprojektsmeilensteinId</value>
     </entry>
+    <entry>
+      <key>without Vat</key>
+      <value>ohne UmSt.</value>
+    </entry>
     <entry>
       <key>Appointment Id</key>
       <value>Termin Id</value>
@@ -8658,6 +8674,10 @@ Bitte Datumseingabe prüfen</value>
       <key>My Calendar</key>
       <value>Mein Kalender</value>
     </entry>
+    <entry>
+      <key>Invoice Discount</key>
+      <value>Rechnungsrabatt</value>
+    </entry>
     <entry>
       <key>Variable</key>
       <value>Variable</value>
@@ -9871,6 +9891,10 @@ Bitte Datumseingabe prüfen</value>
     <entry>
       <key>Messages</key>
     </entry>
+    <entry>
+      <key>incl. Vat</key>
+      <value>inkl. UmSt.</value>
+    </entry>
     <entry>
       <key>Channel Name</key>
     </entry>
diff --git a/neonView/OfferEdit_view/OfferEdit_view.aod b/neonView/OfferEdit_view/OfferEdit_view.aod
index 5bacbaaaf3210c985a93785da25639a707bac134..826a75ada785534d76abe4b7cb1f953a64c4c1d6 100644
--- a/neonView/OfferEdit_view/OfferEdit_view.aod
+++ b/neonView/OfferEdit_view/OfferEdit_view.aod
@@ -36,6 +36,10 @@
           <name>768683f3-08c8-4e85-bb4c-7e5c74a8dec0</name>
           <entityField>OFFERDATE</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>35804879-e866-477a-a0e6-9fea1506fc1d</name>
+          <entityField>DISCOUNT</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>64cb7376-3a7c-4ce9-99e8-e70bc91b41d0</name>
           <entityField>CURRENCY</entityField>
diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod
index 7b78909905af090ebc923109ba2ed9bdcb0492dd..d0e3891b5166dada85ca47fd9c06daa9df7b06ec 100644
--- a/neonView/OfferPreview_view/OfferPreview_view.aod
+++ b/neonView/OfferPreview_view/OfferPreview_view.aod
@@ -67,10 +67,18 @@
           <name>d7ca2b66-5e7a-4951-a89b-fbeab0f4f798</name>
           <entityField>NET</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>3e9e37e2-6756-41c2-ace7-6ff094dc78c1</name>
+          <entityField>DISCOUNTED_NET</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>c50dec3f-5468-4196-be88-a413ae3947de</name>
           <entityField>VAT</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>5cc461e4-fd0f-47e6-ab06-886a18621c31</name>
+          <entityField>DISCOUNTED_VAT</entityField>
+        </entityFieldLink>
         <entityFieldLink>
           <name>43972a26-67f7-4fb5-9107-111731d326af</name>
           <entityField>TotalGross</entityField>
@@ -99,6 +107,10 @@
           <name>a3a9ee30-bdd2-4907-b215-d4b4adcc0f1d</name>
           <entityField>DELIVERYTERMS</entityField>
         </entityFieldLink>
+        <entityFieldLink>
+          <name>b67494ee-f7c1-4002-a550-50ce1eac5020</name>
+          <entityField>DISCOUNT</entityField>
+        </entityFieldLink>
       </fields>
     </genericViewTemplate>
     <neonViewReference>
diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js
index 78ea329bfc0de71f18965d80cc03b82397687b0e..86cc96712ade6e652f107912eb59adba772e00f3 100644
--- a/process/Offer_lib/process.js
+++ b/process/Offer_lib/process.js
@@ -18,6 +18,7 @@ import("Neon_lib");
 import("KeywordRegistry_basic");
 import("Address_lib");
 import("DocumentTemplate_lib");
+import("system.eMath");
 
 /**
  * Methods used by Offer.
@@ -99,37 +100,42 @@ OfferUtils.createNewOffer = function(pContextId, pRowId, pRelationId, pActivityI
  * Builds the Offer report.
  * 
  * @param {String} pOfferID
+ * @param {String} pExclDiscountGroupcodes
  * @return {Array} [filename, data_bytes]
  */
-OfferUtils.buildOfferReport = function (pOfferID)
+OfferUtils.buildOfferReport = function (pOfferID, pExclDiscountGroupcodes)
 {
     var offerReport = new Report("Offer_report");  
 
     var sqlUtil = new SqlMaskingUtils();
     
     var offerFields = [
-        "ADDRESS", 
-        "CONTACT_ID", 
-        "ISOLANGUAGE", 
-        "PAYMENTTERMS", 
-        "DELIVERYTERMS", //4
-        "OFFERCODE", 
-        "CURRENCY", 
-        "OFFERDATE", 
-        "HEADER", //8
-        "VAT", 
-        sqlUtil.isNull("VERSNR", "0"),
-        sqlUtil.isNull("OFFERCODE", "0"), 
-        "OBJECT_TYPE", //12
-        "OBJECT_ROWID", //13
-        "FOOTER", //14
-        "LETTERSALUTATION" // 15
+    "ADDRESS", 
+    "CONTACT_ID", 
+    "ISOLANGUAGE", 
+    "PAYMENTTERMS", 
+    "DELIVERYTERMS", //4
+    "OFFERCODE", 
+    "CURRENCY", 
+    "OFFERDATE", 
+    "HEADER", //8
+    "VAT", 
+    sqlUtil.isNull("VERSNR", "0"),
+    sqlUtil.isNull("OFFERCODE", "0"), 
+    "OBJECT_TYPE", //12
+    "OBJECT_ROWID", //13
+    "FOOTER", //14
+    "LETTERSALUTATION", // 15
+    "DISCOUNT",
+    "NET",
+    "DISCOUNTED_NET", 
+    "DISCOUNTED_VAT"
     ];
    
     var offerData = newSelect(offerFields)
-                        .from("OFFER")
-                        .where("OFFER.OFFERID", pOfferID)
-                        .arrayRow();
+    .from("OFFER")
+    .where("OFFER.OFFERID", pOfferID)
+    .arrayRow();
   
     if (offerData.length === 0)
         return null;
@@ -137,36 +143,37 @@ OfferUtils.buildOfferReport = function (pOfferID)
     var letterSalutation = offerData[15];
     
     var language = newSelect("ISO2")
-                        .from("AB_LANGUAGE")
-                        .where("AB_LANGUAGE.ISO3", offerData[2])
-                        .cell();
+    .from("AB_LANGUAGE")
+    .where("AB_LANGUAGE.ISO3", offerData[2])
+    .cell();
                         
     offerData[7] = datetime.toDate(offerData[7], translate.text("dd.MM.yyyy", language));                    
         
     var offerItemFields = [
-        "OFFERITEM.INFO", 
-        "OFFERITEM.ASSIGNEDTO",
-        "OFFERITEM.PRODUCT_ID", 
-        "OFFERITEM.ITEMNAME" , 
-        "OFFERITEM.OPTIONAL",  //4
-        "OFFERITEM.ITEMPOSITION", 
-        "PRODUCT.PRODUCTCODE", 
-        "PRODUCT.PRODUCTID", 
-        "OFFERITEM.UNIT", //8
-        sqlUtil.isNull("OFFERITEM.QUANTITY", "0"), 
-        sqlUtil.isNull("OFFERITEM.PRICE", "0"),
-        sqlUtil.isNull("OFFERITEM.DISCOUNT", "0"), 
-        sqlUtil.isNull("OFFERITEM.VAT", "0"), //12
-        "0", 
-        "''"
+    "OFFERITEM.INFO", 
+    "OFFERITEM.ASSIGNEDTO",
+    "OFFERITEM.PRODUCT_ID", 
+    "OFFERITEM.ITEMNAME" , 
+    "OFFERITEM.OPTIONAL",  //4
+    "OFFERITEM.ITEMPOSITION", 
+    "PRODUCT.PRODUCTCODE", 
+    "PRODUCT.PRODUCTID", 
+    "OFFERITEM.UNIT", //8
+    sqlUtil.isNull("OFFERITEM.QUANTITY", "0"), 
+    sqlUtil.isNull("OFFERITEM.PRICE", "0"),
+    sqlUtil.isNull("OFFERITEM.DISCOUNT", "0"), 
+    sqlUtil.isNull("OFFERITEM.VAT", "0"), //12
+    "0", 
+    "''",
+    "OFFERITEM.GROUPCODEID"
     ]; 
 
     var itemData = newSelect(offerItemFields)
-                            .from("OFFERITEM")
-                            .leftJoin("PRODUCT", "PRODUCT.PRODUCTID = OFFERITEM.PRODUCT_ID")
-                            .where("OFFERITEM.OFFER_ID", pOfferID)
-                            .orderBy("OFFERITEM.ITEMSORT asc")
-                            .table();
+    .from("OFFERITEM")
+    .leftJoin("PRODUCT", "PRODUCT.PRODUCTID = OFFERITEM.PRODUCT_ID")
+    .where("OFFERITEM.OFFER_ID", pOfferID)
+    .orderBy("OFFERITEM.ITEMSORT asc")
+    .table();
             
     if (itemData.length == 0)
         return null;
@@ -178,10 +185,29 @@ OfferUtils.buildOfferReport = function (pOfferID)
     var sums = [];
     var vatsum = 0;
     var printDiscount = false;
+    var printHeadDiscount = false; 
+    var discValue = 0;
     
     var header = new DocumentTemplate(offerData[8], DocumentTemplate.types.PLAIN).getReplacedContentByContactId(offerData[1]);
     var footer = new DocumentTemplate(offerData[14], DocumentTemplate.types.PLAIN).getReplacedContentByContactId(offerData[1]);
     
+    var discount;
+    if(offerData[17] && offerData[18]){
+        discount = eMath.subDec(offerData[17].toString(), offerData[18].toString());
+        discount = text.formatDouble(discount.toString(), "#,##0.00", true);     
+    }
+    if (!printHeadDiscount && discount && parseFloat(discount) != parseFloat("0"))
+        printHeadDiscount = true;
+    if(printHeadDiscount){
+        total = eMath.addDec(offerData[18], offerData[19])
+    }
+    if(offerData[16]){
+        discValue = text.formatDouble(offerData[16], "#,##0.00", true);
+    }
+    if(offerData[18]){
+        offerData[18] = text.formatDouble(offerData[18], "#,##0.00", true);
+    }
+    
     itemData = itemData.map(function (item)
     {
         //quantity * price
@@ -192,45 +218,62 @@ OfferUtils.buildOfferReport = function (pOfferID)
             //itemSum = (fullPrice * (100 - discount)) / 100
             itemSum = eMath.roundDec(eMath.divDec(eMath.mulDec(fullPrice, eMath.subDec(100, item[11])), 100), 2, eMath.ROUND_HALF_EVEN); //sum of the item (with discount)
             sumItemSum += itemSum; //total sum (without vat) 
+
+            let excluded = -1
+            if(pExclDiscountGroupcodes){
+                excluded = pExclDiscountGroupcodes.indexOf(item[15])
+            }
+            //vatsum = itemSum * vat / 100
+
+            if(printHeadDiscount && offerData[16] && excluded == -1){
+                vatsum = ItemUtils.prototype.getItemVAT(item[9], item[10], item[11], item[12], item[4]);
+                vatsum = eMath.subDec(vatsum, eMath.divDec(eMath.mulDec(vatsum, offerData[16]), "100"));
+            }
+            else
+                vatsum = ItemUtils.prototype.getItemVAT(item[9], item[10], item[11], item[12], item[4])
+
+            if (item[12] > 0) 
+                sums.push([item[12], vatsum]); //MWSteuerwerte für Map vorbereiten
         }
-        //vatsum = itemSum * vat / 100
-        vatsum = eMath.divDec(eMath.mulDec(itemSum, item[12]), 100); //vat per product
-        if (item[12] > 0) 
-            sums.push([item[12], vatsum]); //MWSteuerwerte für Map vorbereiten
+        
         
         // sumItemSum + vat
-        total = eMath.addDec(sumItemSum, offerData[9]); //total sum with vat
+        if(!printHeadDiscount)
+            total = eMath.addDec(sumItemSum, offerData[9]); //total sum with vat
         
         if (!printDiscount && item[11] > 0)
             printDiscount = true;
         
         return [
-            offerData[6],   //currency
-            offerData[7],   //offerdate
-            pOfferID,       //offerId
-            item[0],        //info
-            item[1],        //assignedTo
-            item[3],        //itemname
-            item[4],        //optional
-            item[5],        //itemposition
-            item[6],        //productcode
-            header,         //header 
-            footer,         //footer 
-            text.formatDouble(item[9], "#,##0", true),          //quantity
-            text.formatDouble(item[10], "#,##0.00", true),      //price
-            text.formatDouble(item[11], "0.00", true),          //discount
-            offerData[10],  //versnr
-            offerData[5],   //offercode
-            text.formatDouble(item[12], "#,##0.00", true),      //vat
-            text.formatDouble(itemSum, "#,##0.00", true),       //itemsum
-            KeywordUtils.getViewValue($KeywordRegistry.quantityUnit(), item[8]) //unittext
+        offerData[6],   //currency
+        offerData[7],   //offerdate
+        pOfferID,       //offerId
+        item[0],        //info
+        item[1],        //assignedTo
+        item[3],        //itemname
+        item[4],        //optional
+        item[5],        //itemposition
+        item[6],        //productcode
+        header,         //header 
+        footer,         //footer 
+        text.formatDouble(item[9], "#,##0", true),          //quantity
+        text.formatDouble(item[10], "#,##0.00", true),      //price
+        text.formatDouble(item[11], "0.00", true),          //discount
+        offerData[10],  //versnr
+        offerData[5],   //offercode
+        text.formatDouble(item[12], "#,##0.00", true),      //vat
+        text.formatDouble(itemSum, "#,##0.00", true),       //itemsum
+        KeywordUtils.getViewValue($KeywordRegistry.quantityUnit(), item[8]), //unittext
+        discValue,
+        offerData[18],
+        discount
         ];
     });
     
     // TODO: get Images implementieren
     var imgData = ["meineFirma | Wilhelm-Str. 2  |  DE 80807 München",
-                   "base64:iVBORw0KGgoAAAANSUhEUgAAAM4AAABRCAYAAACaL5lSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDA4QzAyM0IwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA4QzAyM0MwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDhDMDIzOTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDhDMDIzQTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhF3nYoAAAlvSURBVHja7J1fjBXV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"]
-                // getMyASYS_ICONSdata();
+    "base64:iVBORw0KGgoAAAANSUhEUgAAAM4AAABRCAYAAACaL5lSAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6MDA4QzAyM0IwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6MDA4QzAyM0MwREIwMTFFNEFGMDREM0VEMjExRjlBRTIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDowMDhDMDIzOTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDowMDhDMDIzQTBEQjAxMUU0QUYwNEQzRUQyMTFGOUFFMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhF3nYoAAAlvSURBVHja7J1fjBXV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"]
+    // getMyASYS_ICONSdata();
     
     // TODO: implementieren wenn Attribute möglich sind
     var adma = ""; //adma = Aussendienstmitarbeiter
@@ -266,7 +309,12 @@ OfferUtils.buildOfferReport = function (pOfferID)
         "responsible" : adma,
         "SUMITEMSUM" : sumItemSum,
         "TOTAL" : text.formatDouble(total, "#,##0.00", true),
-        "printDiscount" : printDiscount ? "1" : "0"
+        "printDiscount" : printDiscount ? "1" : "0",
+        "subTotal": translate.text("Subtotal", language),
+        "InvoiceDiscount": translate.text("Invoice Discount", language),
+        "TotalWithoutVat": translate.text("without Vat", language),
+        "TotalWithVat": translate.text("incl. Vat", language),
+        "printHeadDiscount": printHeadDiscount ? "1" : "0"
     };
     
     
@@ -278,27 +326,30 @@ OfferUtils.buildOfferReport = function (pOfferID)
 
     offerReport.setReportData(ReportData.begin(
         [
-            "OFFER_CURRENCY", 
-            "OFFER_OFFERDATE", 
-            "OFFER_OFFERID",  
-            "OFFERITEM_INFO", 
-            "OFFERITEM_ASSIGNEDTO", //4
-            "OFFERITEM_ITEMNAME" , 
-            "OFFERITEM_OPTIONAL", 
-            "OFFERITEM_ITEMPOSITION", 
-            "PRODUCT_PRODUCTCODE", //8
-            "OFFER_HEADER", 
-            "OFFER_FOOTER", 
-            "OFFERITEM_QUANTITY", 
-            "OFFERITEM_PRICE", 
-            "OFFERITEM_DISCOUNT", //13
-            "OFFER_VERSNR", 
-            "OFFER_OFFERCODE", 
-            "OFFERITEM_VAT", 
-            "ITEMSUM", // 17
-            "OFFERITEM_UNITTEXT"
+        "OFFER_CURRENCY", 
+        "OFFER_OFFERDATE", 
+        "OFFER_OFFERID",  
+        "OFFERITEM_INFO", 
+        "OFFERITEM_ASSIGNEDTO", //4
+        "OFFERITEM_ITEMNAME" , 
+        "OFFERITEM_OPTIONAL", 
+        "OFFERITEM_ITEMPOSITION", 
+        "PRODUCT_PRODUCTCODE", //8
+        "OFFER_HEADER", 
+        "OFFER_FOOTER", 
+        "OFFERITEM_QUANTITY", 
+        "OFFERITEM_PRICE", 
+        "OFFERITEM_DISCOUNT", //13
+        "OFFER_VERSNR", 
+        "OFFER_OFFERCODE", 
+        "OFFERITEM_VAT", 
+        "ITEMSUM", // 17
+        "OFFERITEM_UNITTEXT",
+        "OFFER_DISCOUNT",
+        "OFFER_DISCOUNTED_NET",
+        "OFFER_DISCOUNTSUM"
         ])
-        .add(itemData));
+    .add(itemData));
         
     return offerReport.exportReport();
 }
@@ -336,7 +387,8 @@ OfferUtils.copyOffer = function (pOfferId, pOfferData)
         "OfferDeliveryTerm_param": pOfferData.deliveryTerm || "",
         "OfferPaymentTerm_param": pOfferData.paymentTerm || "",
         "ObjectType_param": pOfferData.objectType || "",
-        "ObjectRowId_param": pOfferData.objectRowId || ""
+        "ObjectRowId_param": pOfferData.objectRowId || "",
+        "Discount_param" :  pOfferData.discount || ""
     };
     neon.openContext("Offer", null, null, neon.OPERATINGSTATE_NEW, params);
 }
@@ -347,7 +399,7 @@ OfferUtils.copyOffer = function (pOfferId, pOfferData)
  * @param {String} pSourceOfferId
  * @param {String} pTargetOfferId
  */
-OfferUtils.copyOfferItems = function (pSourceOfferId, pTargetOfferId)
+OfferUtils.copyOfferItems = function (pSourceOfferId, pTargetOfferId, pDiscount)
 {
     var inputMapping = {
         "OFFERITEM": {
@@ -363,12 +415,24 @@ OfferUtils.copyOfferItems = function (pSourceOfferId, pTargetOfferId)
     
     //update order price
     var [netPrice, vat] = oiUtils.getNetAndVat();
+    var discountedVals = OfferItemUtils.getDiscountedNet(null, pSourceOfferId,  pDiscount);
     
-    newWhere("OFFER.OFFERID", pTargetOfferId)
+    if(discountedVals){
+        newWhere("OFFER.OFFERID", pTargetOfferId)
+        .updateFields({
+            "NET": netPrice,
+            "VAT": vat,
+            "DISCOUNTED_NET": discountedVals[0],
+            "DISCOUNTED_VAT": discountedVals[1]
+        });
+    }
+    else{
+        newWhere("OFFER.OFFERID", pTargetOfferId)
         .updateFields({
             "NET": netPrice,
             "VAT": vat
         });
+    }
 }
 
 /**
@@ -384,8 +448,8 @@ OfferUtils.copyOfferItems = function (pSourceOfferId, pTargetOfferId)
  */
 OfferUtils.copyToOrder = function (pOfferId, pContextId, pRowId, pContactId, pLanguage, pCurrency, pAddress)
 {  
-        var fieldparams = 
-        {
+    var fieldparams = 
+    {
         "$field.CONTACT_ID" : pContactId,
         "$field.ISOLANGUAGE" : pLanguage,
         "$field.OFFER_ID" : pOfferId,
@@ -393,7 +457,7 @@ OfferUtils.copyToOrder = function (pOfferId, pContextId, pRowId, pContactId, pLa
         "$field.PAYMENTADDRESS" : pAddress || "",
         "$field.OBJECT_TYPE" : pContextId || "",
         "$field.OBJECT_ROWID" : pRowId || ""
-        };
+    };
     
     var params = {};
     params["Copy_param"] = JSON.stringify(fieldparams);
@@ -414,13 +478,13 @@ OfferUtils.getOfferTitleById = function (pOfferId)
     if (!pOfferId)
         return "";
     var offerNumber = newSelect("OFFERCODE, VERSNR")
-                        .from("OFFER")
-                        .where("OFFER.OFFERID", pOfferId)
-                        .arrayRow();
+    .from("OFFER")
+    .where("OFFER.OFFERID", pOfferId)
+    .arrayRow();
                         
     return offerNumber.length > 0 
-        ? translate.text("Offer") + " " + offerNumber.join("-") 
-        : "";
+    ? translate.text("Offer") + " " + offerNumber.join("-") 
+    : "";
 }
 
 
@@ -482,26 +546,26 @@ OfferItemUtils.prototype.insertPartsList = function(pProductId, pAssignedTo, pCu
     this.initItemTree();
     
     var cols =  ["OFFERITEMID"
-                , "OFFER_ID"
-                , "PRODUCT_ID"
-                , "GROUPCODEID"
-                , "ASSIGNEDTO"
-                , "ITEMNAME"
-                , "UNIT"
-                , "PRICE"
-                , "VAT"
-                , "QUANTITY"
-                , "OPTIONAL"
-                , "ITEMPOSITION"
-                , "ITEMSORT"];
+    , "OFFER_ID"
+    , "PRODUCT_ID"
+    , "GROUPCODEID"
+    , "ASSIGNEDTO"
+    , "ITEMNAME"
+    , "UNIT"
+    , "PRICE"
+    , "VAT"
+    , "QUANTITY"
+    , "OPTIONAL"
+    , "ITEMPOSITION"
+    , "ITEMSORT"];
 
     return ItemUtils.prototype.insertPartsList.apply(this, [cols, pProductId, pAssignedTo, pCurrency, pContactId, [[["info", "INFO"], ["info", 
-                            "( " + newSelect("DESCRIPTION")
-                                .from("DESCRIPTIONTRANSLATION")
-                                .where("DESCRIPTIONTRANSLATION.OBJECT_ROWID = PRODUCT.PRODUCTID")
-                                .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE", "Product")
-                                .and("DESCRIPTIONTRANSLATION.LANG", pLanguage)
-                                .toString() + ")"]]]]);
+        "( " + newSelect("DESCRIPTION")
+        .from("DESCRIPTIONTRANSLATION")
+        .where("DESCRIPTIONTRANSLATION.OBJECT_ROWID = PRODUCT.PRODUCTID")
+        .and("DESCRIPTIONTRANSLATION.OBJECT_TYPE", "Product")
+        .and("DESCRIPTIONTRANSLATION.LANG", pLanguage)
+        .toString() + ")"]]]]);
                                   
 }
 
@@ -541,3 +605,51 @@ OfferItemUtils.prototype.reOrgItems = function() {
     ItemUtils.prototype.reOrgItems.apply(this);
 }
 
+
+
+OfferItemUtils.getDiscountedNet = function(pExcludedIs, pOfferId, pDiscount, pExcludedProductgroups){
+    pDiscount = pDiscount ? pDiscount : 0;
+    var ret;
+    var sum = 0;
+    var sumExcluded = 0;
+    var vat = 0;
+    var vatExcluded = 0;
+    if(pOfferId){
+        var offeritemData = newSelect("QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL")
+        .from("OFFERITEM")
+        .where("OFFERITEM.OFFER_ID", pOfferId)
+        .andIfSet("OFFERITEM.GROUPCODEID", pExcludedProductgroups, SqlBuilder.NOT_IN())
+        .andIfSet("OFFERITEM.OFFERITEMID", pExcludedIs, SqlBuilder.NOT_IN())
+        .table();
+        for (var i = 0; i < offeritemData.length; i++)
+        {
+            sum = eMath.addDec(sum, ItemUtils.prototype.getItemSum(offeritemData[i][0], offeritemData[i][1], offeritemData[i][2], offeritemData[i][4]));
+            vat = eMath.addDec(vat, ItemUtils.prototype.getItemVAT(offeritemData[i][0], offeritemData[i][1], offeritemData[i][2], offeritemData[i][3], offeritemData[i][4]));
+        }
+       
+        sum = eMath.subDec(sum, eMath.divDec(eMath.mulDec(sum, pDiscount), "100"));
+        vat = eMath.subDec(vat, eMath.divDec(eMath.mulDec(vat, pDiscount), "100"));
+        
+        if(pExcludedProductgroups){
+            var excludedOfferitemData = newSelect("QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL")
+            .from("OFFERITEM")
+            .where("OFFERITEM.OFFER_ID", pOfferId)
+            .and("OFFERITEM.GROUPCODEID", pExcludedProductgroups, SqlBuilder.IN())
+            .andIfSet("OFFERITEM.OFFERITEMID", pExcludedIs, SqlBuilder.NOT_IN())
+            .table();
+            for (var j = 0; j < excludedOfferitemData.length; j++)
+            {
+                sumExcluded = eMath.addDec(sumExcluded, ItemUtils.prototype.getItemSum(excludedOfferitemData[j][0], excludedOfferitemData[j][1], excludedOfferitemData[j][2], excludedOfferitemData[j][4]));
+                vatExcluded = eMath.addDec(vatExcluded, ItemUtils.prototype.getItemVAT(excludedOfferitemData[i][0], excludedOfferitemData[i][1], excludedOfferitemData[i][2], excludedOfferitemData[i][3], excludedOfferitemData[i][4]));
+            }
+        }
+        if(sumExcluded){
+            sum = eMath.addDec(sum, sumExcluded);
+        }
+        if(vatExcluded){
+            vat = eMath.addDec(vat, vatExcluded);
+        }
+    }
+    ret = [sum, vat]
+    return ret;
+}
diff --git a/report/Offer_report/reportData.jrxml b/report/Offer_report/reportData.jrxml
index 08de042f0203108955618282f122e0ba48444814..76b33d239d03b4c903aed440ea6f8c4b5c30df50 100644
--- a/report/Offer_report/reportData.jrxml
+++ b/report/Offer_report/reportData.jrxml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="report1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e7a916c8-3f9a-497d-84bb-3909b15271ea">
-	<property name="ireport.zoom" value="1.771561000000001"/>
+	<property name="ireport.zoom" value="1.7715610000000064"/>
 	<property name="ireport.x" value="0"/>
-	<property name="ireport.y" value="406"/>
+	<property name="ireport.y" value="279"/>
 	<parameter name="myAddr" class="java.lang.String"/>
 	<parameter name="Pos" class="java.lang.String"/>
 	<parameter name="Articledescription" class="java.lang.String"/>
@@ -24,7 +24,7 @@
 	<parameter name="OfferDeliveryTerm" class="java.lang.String"/>
 	<parameter name="responsible" class="java.lang.String"/>
 	<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
-		<defaultValueExpression><![CDATA["C:\\Entwicklung\\2020.2\\project\\basic2\\report\\Offer_report\\"]]></defaultValueExpression>
+		<defaultValueExpression><![CDATA["C:\\Users\\s.neumaier\\Documents\\AditoProjects\\basic_2020.2\\report\\Offer_report\\"]]></defaultValueExpression>
 	</parameter>
 	<parameter name="adito.datasource.subdata" class="java.lang.Object"/>
 	<parameter name="SUMITEMSUM" class="java.lang.Double"/>
@@ -32,6 +32,11 @@
 	<parameter name="adito.image.myLogo" class="java.lang.String"/>
 	<parameter name="printDiscount" class="java.lang.String"/>
 	<parameter name="directlyResponsible" class="java.lang.String"/>
+	<parameter name="subTotal" class="java.lang.String"/>
+	<parameter name="InvoiceDiscount" class="java.lang.String"/>
+	<parameter name="TotalWithoutVat" class="java.lang.String"/>
+	<parameter name="TotalWithVat" class="java.lang.String"/>
+	<parameter name="printHeadDiscount" class="java.lang.String"/>
 	<queryString>
 		<![CDATA[]]>
 	</queryString>
@@ -53,6 +58,9 @@
 	<field name="OFFER_HEADER" class="java.lang.String"/>
 	<field name="ITEMSUM" class="java.lang.String"/>
 	<field name="OFFER_FOOTER" class="java.lang.String"/>
+	<field name="OFFER_DISCOUNT" class="java.lang.String"/>
+	<field name="OFFER_DISCOUNTED_NET" class="java.lang.String"/>
+	<field name="OFFER_DISCOUNTSUM" class="java.lang.String"/>
 	<sortField name="OFFER_OFFERID"/>
 	<group name="OFFERID" isStartNewPage="true">
 		<groupExpression><![CDATA[$F{OFFER_OFFERID}]]></groupExpression>
@@ -128,7 +136,7 @@
 			</band>
 			<band height="20">
 				<textField isStretchWithOverflow="true">
-					<reportElement x="20" y="0" width="535" height="20" isPrintWhenDetailOverflows="true" uuid="8d10af04-82a4-4344-ae98-de42c82a674e"/>
+					<reportElement x="20" y="0" width="535" height="20" uuid="8d10af04-82a4-4344-ae98-de42c82a674e"/>
 					<textElement>
 						<font size="8"/>
 					</textElement>
@@ -233,19 +241,69 @@
 			</band>
 		</groupHeader>
 		<groupFooter>
-			<band height="24">
+			<band height="23">
 				<line>
 					<reportElement x="356" y="4" width="196" height="1" uuid="228a3e86-96b6-470f-b9d8-9c566a0f1065"/>
 				</line>
 				<textField pattern="#,##0.00;-#,##0.00">
-					<reportElement x="452" y="6" width="100" height="15" uuid="f71cd6ef-6a10-4bd5-9bd5-4c8de5a276f1"/>
+					<reportElement x="469" y="8" width="83" height="15" uuid="f71cd6ef-6a10-4bd5-9bd5-4c8de5a276f1"/>
 					<textElement textAlignment="Right">
-						<font size="8"/>
+						<font size="8" isBold="true"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{SUMITEMSUM}]]></textFieldExpression>
 				</textField>
+				<textField>
+					<reportElement x="356" y="8" width="113" height="15" uuid="c505a568-afb9-4cb3-9d15-b7803aeff207"/>
+					<textElement>
+						<font size="8" isBold="true"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$P{subTotal}]]></textFieldExpression>
+				</textField>
 			</band>
-			<band height="18">
+			<band height="34">
+				<printWhenExpression><![CDATA[!$P{printHeadDiscount}.equals("0")]]></printWhenExpression>
+				<textField isStretchWithOverflow="true">
+					<reportElement positionType="Float" x="469" y="19" width="83" height="15" uuid="26cc2b42-75a8-4e17-a674-f75a83465476">
+						<printWhenExpression><![CDATA[!$P{printHeadDiscount}.equals("0")]]></printWhenExpression>
+					</reportElement>
+					<textElement textAlignment="Right">
+						<font size="8" isBold="true"/>
+						<paragraph lineSpacing="Proportional"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$F{OFFER_DISCOUNTED_NET}]]></textFieldExpression>
+				</textField>
+				<textField isStretchWithOverflow="true">
+					<reportElement positionType="Float" x="356" y="19" width="113" height="15" uuid="05470803-14c1-4ecc-81f0-de432ec80c27">
+						<printWhenExpression><![CDATA[!$P{printHeadDiscount}.equals("0")]]></printWhenExpression>
+					</reportElement>
+					<textElement>
+						<font size="8" isBold="true"/>
+						<paragraph lineSpacing="Proportional"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$P{Total} + " " + $F{OFFER_CURRENCY} + " " + $P{TotalWithoutVat}]]></textFieldExpression>
+				</textField>
+				<textField isStretchWithOverflow="true">
+					<reportElement positionType="Float" x="356" y="2" width="113" height="15" uuid="152d4841-b63c-4cd3-bc6b-935af23ad0b8">
+						<printWhenExpression><![CDATA[!$P{printHeadDiscount}.equals("0")]]></printWhenExpression>
+					</reportElement>
+					<textElement>
+						<font size="8"/>
+						<paragraph lineSpacing="Proportional"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$F{OFFER_DISCOUNT} + " % " + $P{InvoiceDiscount}]]></textFieldExpression>
+				</textField>
+				<textField isStretchWithOverflow="true">
+					<reportElement positionType="Float" x="469" y="2" width="83" height="15" uuid="e205d256-1ac5-439b-9b9c-3735d7a301df">
+						<printWhenExpression><![CDATA[!$P{printHeadDiscount}.equals("0")]]></printWhenExpression>
+					</reportElement>
+					<textElement textAlignment="Right">
+						<font size="8"/>
+						<paragraph lineSpacing="Proportional"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$F{OFFER_DISCOUNTSUM}]]></textFieldExpression>
+				</textField>
+			</band>
+			<band height="19">
 				<subreport>
 					<reportElement isPrintRepeatedValues="false" x="355" y="2" width="196" height="15" isRemoveLineWhenBlank="true" uuid="8683c745-01bf-44aa-af62-a6ba881a9edd"/>
 					<subreportParameter name="PlusSalestax">
@@ -257,46 +315,47 @@
 			</band>
 			<band height="33">
 				<textField>
-					<reportElement x="20" y="13" width="100" height="20" uuid="112f15db-0989-430e-b2c4-61f975f7b8a4">
-						<printWhenExpression><![CDATA[!$P{OfferPaymentTerm}.equals("")]]></printWhenExpression>
-					</reportElement>
-					<textElement>
-						<font size="8"/>
-					</textElement>
-					<textFieldExpression><![CDATA[$P{PaymentConditions}]]></textFieldExpression>
-				</textField>
-				<textField>
-					<reportElement x="122" y="13" width="100" height="20" uuid="8149be09-d439-4e1a-a853-f82bd5e5683e"/>
+					<reportElement x="122" y="12" width="100" height="20" uuid="8149be09-d439-4e1a-a853-f82bd5e5683e"/>
 					<textElement>
 						<font size="8"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{OfferPaymentTerm}]]></textFieldExpression>
 				</textField>
+				<line>
+					<reportElement x="356" y="29" width="196" height="1" uuid="982cac61-6b87-4439-93cb-6c89fcc7932c"/>
+					<graphicElement>
+						<pen lineWidth="3.0" lineStyle="Double"/>
+					</graphicElement>
+				</line>
 				<textField>
-					<reportElement x="402" y="8" width="90" height="20" uuid="c3444576-6cb8-47f2-9dc9-e892a91ceb07"/>
-					<textElement textAlignment="Right">
+					<reportElement x="356" y="7" width="113" height="20" uuid="c3444576-6cb8-47f2-9dc9-e892a91ceb07"/>
+					<textElement textAlignment="Left">
 						<font size="8" isBold="true"/>
 					</textElement>
-					<textFieldExpression><![CDATA[$P{Total} + " " + $F{OFFER_CURRENCY}]]></textFieldExpression>
+					<textFieldExpression><![CDATA[$P{Total} + " " + $F{OFFER_CURRENCY} + " " + $P{TotalWithVat}]]></textFieldExpression>
 				</textField>
 				<line>
-					<reportElement x="356" y="2" width="196" height="1" uuid="8973e664-cfc0-4b52-bd0d-c80a49910da2"/>
-				</line>
-				<line>
-					<reportElement x="356" y="30" width="196" height="1" uuid="982cac61-6b87-4439-93cb-6c89fcc7932c"/>
-					<graphicElement>
-						<pen lineWidth="3.0" lineStyle="Double"/>
-					</graphicElement>
+					<reportElement x="356" y="1" width="196" height="1" uuid="8973e664-cfc0-4b52-bd0d-c80a49910da2"/>
 				</line>
 				<textField pattern="###0.00;-###0.00">
-					<reportElement x="491" y="8" width="59" height="20" uuid="75bb0951-e562-4170-a5c2-731d3219ec66"/>
+					<reportElement x="469" y="7" width="81" height="20" uuid="75bb0951-e562-4170-a5c2-731d3219ec66"/>
 					<textElement textAlignment="Right">
 						<font size="8" isBold="true"/>
 					</textElement>
 					<textFieldExpression><![CDATA[$P{TOTAL}]]></textFieldExpression>
 				</textField>
+				<textField>
+					<reportElement x="20" y="12" width="100" height="20" uuid="112f15db-0989-430e-b2c4-61f975f7b8a4">
+						<printWhenExpression><![CDATA[!$P{OfferPaymentTerm}.equals("")]]></printWhenExpression>
+					</reportElement>
+					<textElement>
+						<font size="8"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$P{PaymentConditions}]]></textFieldExpression>
+				</textField>
 			</band>
 			<band height="20">
+				<printWhenExpression><![CDATA[($F{OFFER_FOOTER} != null && !$F{OFFER_FOOTER}.trim().isEmpty())]]></printWhenExpression>
 				<textField>
 					<reportElement x="20" y="0" width="100" height="20" uuid="75b328c0-4ab1-478d-afb8-0ed8974da1af">
 						<printWhenExpression><![CDATA[!$P{OfferDeliveryTerm}.equals("")]]></printWhenExpression>
@@ -315,9 +374,8 @@
 				</textField>
 			</band>
 			<band height="20">
-				<printWhenExpression><![CDATA[($F{OFFER_FOOTER} != null && !$F{OFFER_FOOTER}.trim().isEmpty())]]></printWhenExpression>
 				<textField isStretchWithOverflow="true">
-					<reportElement x="20" y="0" width="530" height="20" isPrintWhenDetailOverflows="true" uuid="2a2d0fe8-9c83-43b7-913d-a551a9879608"/>
+					<reportElement x="20" y="0" width="530" height="20" uuid="2a2d0fe8-9c83-43b7-913d-a551a9879608"/>
 					<textElement>
 						<font size="8"/>
 					</textElement>
diff --git a/report/Offer_report/reportData_subreport1.jrxml b/report/Offer_report/reportData_subreport1.jrxml
index 45e05cbc8afa6664aeeca709bcf3ec6afcf86df2..2429050e564354bcdb770e4cdb3ce3d989251f82 100644
--- a/report/Offer_report/reportData_subreport1.jrxml
+++ b/report/Offer_report/reportData_subreport1.jrxml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="reportData_subreport1" pageWidth="200" pageHeight="802" columnWidth="200" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="65da6912-abcf-40ed-a854-750d851fe857">
-	<property name="ireport.zoom" value="6.72749994932561"/>
+	<property name="ireport.zoom" value="4.177248169415656"/>
 	<property name="ireport.x" value="0"/>
 	<property name="ireport.y" value="0"/>
 	<parameter name="PlusSalestax" class="java.lang.String"/>
diff --git a/system/default/default.aod b/system/default/default.aod
index 9a52a413a65379d11c6a4f41d481f78eef758db0..52bd2d1c0a28061427e4a48cae30f56a521e2e46 100644
--- a/system/default/default.aod
+++ b/system/default/default.aod
@@ -2,7 +2,7 @@
 <system xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/system/1.1.0">
   <name>default</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <serverConfigPath>$ADITODATA/config/serverconfig_default.xml</serverConfigPath>
+  <serverConfigPath>C:\Users\s.neumaier\Documents\AditoProjects\basic_2020.2\data\sn-test-basic.dev.c2.adito.cloud_serverconfig_system.xml</serverConfigPath>
   <aditoHomePath>$ADITOHOME</aditoHomePath>
   <aditoDataPath>$PROJECTHOME/data</aditoDataPath>
   <loginUser>admin</loginUser>