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>