diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod index 6cc8087d7753dab09bf7f85d37d3072b5a381b78..10f8654b0ad82f174b74f3a1b584b6c5a19823cd 100644 --- a/entity/Address_entity/Address_entity.aod +++ b/entity/Address_entity/Address_entity.aod @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Address_entity</name> <title>Addresses</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <recordContainerType>DB</recordContainerType> - <caption>Addresses</caption> <alias>Data_alias</alias> <conditionProcess>%aditoprj%/entity/Address_entity/conditionProcess.js</conditionProcess> + <recordContainerType>DB</recordContainerType> + <caption>Addresses</caption> <entityFields> <entityField> <name>ADDRESS</name> diff --git a/entity/Comm_entity/Comm_entity.aod b/entity/Comm_entity/Comm_entity.aod index c8e8ab8a1280bd4d3acf578d04f850279cff51b7..7441cfe350ac876895a30a000ae9d33185f74c4c 100644 --- a/entity/Comm_entity/Comm_entity.aod +++ b/entity/Comm_entity/Comm_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Comm_entity</name> <title>Communication</title> <majorModelMode>DISTRIBUTED</majorModelMode> @@ -15,7 +15,7 @@ <columnName>ADDR</columnName> <caption>${COMM_ADDRESS}</caption> <contentTypeProcess>%aditoprj%/entity/Comm_entity/entityfields/addr/contentTypeProcess.js</contentTypeProcess> - <valueProcess>%aditoprj%/entity/Comm_entity/entityfields/addr/valueProcess.js</valueProcess> + <onValidation>%aditoprj%/entity/Comm_entity/entityfields/addr/onValidation.js</onValidation> </entityField> <entityField> <name>COMMID</name> @@ -41,6 +41,7 @@ <columnName>MEDIUM_ID</columnName> <caption>Medium</caption> <possibleItemsProcess>%aditoprj%/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js</possibleItemsProcess> + <valueProcess>%aditoprj%/entity/Comm_entity/entityfields/medium_id/valueProcess.js</valueProcess> </entityField> <entityField> <name>RELATION_ID</name> @@ -87,6 +88,12 @@ So, for only showing telephone-types you&apos;ve to specify this parameter w <entityIncomingField> <name>#INCOMING</name> </entityIncomingField> + <entityParameter> + <name>RelationsMainCountry_param</name> + <code>%aditoprj%/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js</code> + <mandatory v="false" /> + <description>PARAMETER</description> + </entityParameter> </entityFields> <linkInformation> <linkInformation> diff --git a/entity/Comm_entity/conditionProcess.js b/entity/Comm_entity/conditionProcess.js index 7ab504b7b04216aec94e4d2dbbcba228e8c50819..52f44d3905881512659a8e605db36eb05e32a336 100644 --- a/entity/Comm_entity/conditionProcess.js +++ b/entity/Comm_entity/conditionProcess.js @@ -1,42 +1,38 @@ -import("system.logging"); -import("system.text"); -import("system.result"); -import("system.vars"); -import("Sql_lib"); -import("Keyword_lib"); - -var cond, relId, mediumCategories, keywordUtil; - - - -cond = ""; -if(vars.exists("$param.RelId_param")){ - - relId = vars.get("$param.RelId_param"); - - if (relId != null && relId != "" && relId != undefined) - { - cond += " and COMM.RELATION_ID in ('" + relId + "')";//TODO: quoting/prevent sql-injection - } -} -if (vars.exists("$param.MediumCategoriesFilter_param")){ - - mediumCategories = vars.get("$param.MediumCategoriesFilter_param"); - if (mediumCategories != null && mediumCategories != "" && mediumCategories != undefined) - { - - mediumCategories = text.decodeMS(mediumCategories); - keywordUtil = new KeywordUtils(); - var kwd = keywordUtil.createKeyword("COMM.MEDIUM"); - kwd.filter(function(id, name, customs){ - return mediumCategories.indexOf(customs.category) > -1; - }); - mediumIds = kwd.toArray("id"); - if (mediumIds.length == 0) - throw new Error();//TODO: add message - - cond += " and COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")"; - } -} - -result.string(cond ? "1 = 1 " + cond: "1 = 2"); \ No newline at end of file +import("system.db"); +import("system.logging"); +import("system.text"); +import("system.result"); +import("system.vars"); +import("Sql_lib"); +import("Keyword_lib"); + +var cond, relId, mediumCategories, keywordUtil, condStr; + +cond = new SqlCondition(); +if(vars.exists("$param.RelId_param")){ + relId = vars.get("$param.RelId_param"); + + if (relId != null && relId != ""){ + cond.andPrepare("COMM.RELATION_ID", "# = ?", relId); + } +} + +if (vars.exists("$param.MediumCategoriesFilter_param")){ + mediumCategories = vars.get("$param.MediumCategoriesFilter_param"); + if (mediumCategories != null && mediumCategories != "") { + mediumCategories = text.decodeMS(mediumCategories); + keywordUtil = new KeywordUtils(); + var kwd = keywordUtil.createKeyword("COMM.MEDIUM"); + kwd.filter(function(id, name, customs){ + return mediumCategories.indexOf(customs.category) > -1; + }); + mediumIds = kwd.toArray("id"); + if (mediumIds.length == 0) + throw new Error();//TODO: add message + + cond.and("COMM.MEDIUM_ID in (" + mediumIds.join(", ") + ")"); + } +} + +condStr = db.translateCondition([cond.toString("1 = 2"), cond.preparedValues]);//TODO: this should not be necessary in the future +result.string(condStr); \ No newline at end of file diff --git a/entity/Comm_entity/entityfields/addr/contentTypeProcess.js b/entity/Comm_entity/entityfields/addr/contentTypeProcess.js index 06a2fe06be4ffc09f15cfc7d2fcc671bdf6456dc..d447305cf063f92a6dc121a43b9a4df1f5f706b7 100644 --- a/entity/Comm_entity/entityfields/addr/contentTypeProcess.js +++ b/entity/Comm_entity/entityfields/addr/contentTypeProcess.js @@ -3,26 +3,12 @@ import("system.vars"); import("system.result"); import("system.neon"); -var keywordUtils, category, medium, contentType; +var keywordUtils, medium, contentType; //TODO: add constants for contentTypes #1022547 medium = vars.get("$field.MEDIUM_ID"); if (medium){ keywordUtils = new KeywordUtils(); - category = keywordUtils.createKeyword("COMM.MEDIUM").getPropForKey(medium, "category", true); - switch (category) { - case "PHONE": - contentType = "TELEPHONE"; - break; - case "EMAIL": - contentType = "EMAIL"; - break; - case "WEBSITE": - contentType = "LINK"; - break; - default: - contentType = "TEXT"; - break; - } + contentType = keywordUtils.createKeyword("COMM.MEDIUM").getPropForKey(medium, "contentType", true) || "TEXT"; } else { contentType = "TEXT"; diff --git a/entity/Comm_entity/entityfields/addr/onValidation.js b/entity/Comm_entity/entityfields/addr/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..b99bc84225439980d4ed10a88a6a45f9f30c082a --- /dev/null +++ b/entity/Comm_entity/entityfields/addr/onValidation.js @@ -0,0 +1,23 @@ +import("system.logging"); +import("system.translate"); +import("system.vars"); +import("system.net"); +import("system.result"); +import("system.mail"); +import("Keyword_lib"); +import("Comm_lib"); + +var kwdUtil = new KeywordUtils(); +var kwd = kwdUtil.createKeyword("COMM.MEDIUM"); +var commMedium = vars.get("$field.MEDIUM_ID"); +var commCategory = kwd.getPropForKey(commMedium, "contentType", true);//TODO: maybe accessible via $property - then it's not needed to keep this information within the keyword + +var fn = CommValidationUtil.makeValidationFn(commCategory); +if (fn != null){ + var commAddr = vars.get("$local.value");//contains the entered value - the field contains the value only after successfull validation + var additional = CommValidationUtil.getExtensionsBlueprint(); + additional.countryCode = vars.get("$param.RelationsMainCountry_param");//TODO: try to use users language first and then the companies + var res = fn.call(null, commAddr, additional); + if (res != null) + result.string(res); +} \ No newline at end of file diff --git a/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js b/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js index f73dccbca8682450c0237f4b5af827e2d2ae6182..a5f76ab6c894de82dbf14e1c0dcbfd4c21f2b82e 100644 --- a/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js +++ b/entity/Comm_entity/entityfields/medium_id/possibleItemsProcess.js @@ -1,3 +1,4 @@ +import("system.logging"); import("system.text"); import("system.vars"); import("system.result"); @@ -6,7 +7,7 @@ import("Keyword_lib"); var mediumCategories, kwdUtils, kwd, items; kwdUtils = new KeywordUtils(); -if (vars.exists("$param.MediumCategoriesFilter_param") && (mediumCategories = vars.get("$param.MediumCategoriesFilter_param")) != null){ +if (vars.exists("$param.MediumCategoriesFilter_param") && (mediumCategories = vars.get("$param.MediumCategoriesFilter_param")) != ""){ mediumCategories = text.decodeMS(mediumCategories); kwd = kwdUtils.createKeyword("COMM.MEDIUM"); kwd.filter(function(id, name, customs){ diff --git a/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js b/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..c14118ef254f82f6bbb35c3d32ca5974b113a1d0 --- /dev/null +++ b/entity/Comm_entity/entityfields/relationsmaincountry_param/code.js @@ -0,0 +1,22 @@ +import("system.result"); +import("system.db"); +import("system.logging"); +import("system.vars"); +import("Sql_lib"); + +var relId, country; + +if (vars.exists("$param.RelId_param")) { + relId = vars.get("$param.RelId_param"); + if (relId != "" && relId != null){ + var cond = new SqlCondition(); + cond.andPrepare("RELATION.RELATIONID", "# = ?", relId); + //TODO: this should happen by 1:1 links instead of manually requesting the data by a select + country = db.cell(["select ADDRESS.COUNTRY from ADDRESS " + + "join RELATION on RELATION.ADDRESS_ID = ADDRESS.ADDRESSID " + + cond.toWhereString(), cond.preparedValues]); + + if (country != "") + result.string(country); + } +} \ No newline at end of file diff --git a/entity/Contract_entity/Contract_entity.aod b/entity/Contract_entity/Contract_entity.aod index 8388d1b55c2ea8912f9b948347290f6031bd3336..c5490d13fc0d111ef418228350c0751ccfe53cbe 100644 --- a/entity/Contract_entity/Contract_entity.aod +++ b/entity/Contract_entity/Contract_entity.aod @@ -1,13 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Contract_entity</name> <title>Contract</title> <majorModelMode>DISTRIBUTED</majorModelMode> + <alias>Data_alias</alias> + <conditionProcess>%aditoprj%/entity/Contract_entity/conditionProcess.js</conditionProcess> <recordContainerType>DB</recordContainerType> <caption>Contract</caption> <iconId>VAADIN:FORM</iconId> - <alias>Data_alias</alias> - <conditionProcess>%aditoprj%/entity/Contract_entity/conditionProcess.js</conditionProcess> <entityFields> <entityField> <name>CONTRACTCODE</name> diff --git a/entity/Countries_Entity/Countries_Entity.aod b/entity/Countries_Entity/Countries_Entity.aod index d41286d9045f3cfbf9d979d9f3db16566777d6da..f9778cb9e1d98bd905af70b406ce7406451674c2 100644 --- a/entity/Countries_Entity/Countries_Entity.aod +++ b/entity/Countries_Entity/Countries_Entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Countries_Entity</name> <title>Countries</title> <majorModelMode>DISTRIBUTED</majorModelMode> diff --git a/entity/Gender_keyword/Gender_keyword.aod b/entity/Gender_keyword/Gender_keyword.aod index 044ab6dfe51ff3ae9dfd2a92cbf65f8601c750da..4f487bf216e65e2c3c9073aeb28478971e9c2800 100644 --- a/entity/Gender_keyword/Gender_keyword.aod +++ b/entity/Gender_keyword/Gender_keyword.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Gender_keyword</name> <majorModelMode>DISTRIBUTED</majorModelMode> <jDitoRecordAlias>Data_alias</jDitoRecordAlias> diff --git a/entity/History_entity/History_entity.aod b/entity/History_entity/History_entity.aod index 9d4131bdaf67a55f19ea7f277342545576757948..fe9f04dc945a48ba9a0fd0a7aa9df43fb2d57a25 100644 --- a/entity/History_entity/History_entity.aod +++ b/entity/History_entity/History_entity.aod @@ -1,17 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>History_entity</name> <title>History</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <recordContainerType>DB</recordContainerType> - <caption>History</caption> - <iconId>NEON:HISTORY</iconId> - <imageProcess>%aditoprj%/entity/History_entity/imageProcess.js</imageProcess> <alias>Data_alias</alias> <fromClauseProcess>%aditoprj%/entity/History_entity/fromClauseProcess.js</fromClauseProcess> <conditionProcess>%aditoprj%/entity/History_entity/conditionProcess.js</conditionProcess> <onDBInsert>%aditoprj%/entity/History_entity/onDBInsert.js</onDBInsert> <onDBDelete>%aditoprj%/entity/History_entity/onDBDelete.js</onDBDelete> + <recordContainerType>DB</recordContainerType> + <caption>History</caption> + <iconId>NEON:HISTORY</iconId> + <imageProcess>%aditoprj%/entity/History_entity/imageProcess.js</imageProcess> <entityFields> <entityField> <name>DIRECTION</name> diff --git a/entity/Offer_entity/Offer_entity.aod b/entity/Offer_entity/Offer_entity.aod index 4ab172e44a1d1f5a212b7d39a4d9693d33d5ffa5..a5e954badf21f6d01a0656b6d78f039c397a88a7 100644 --- a/entity/Offer_entity/Offer_entity.aod +++ b/entity/Offer_entity/Offer_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Offer_entity</name> <title>Offer</title> <majorModelMode>DISTRIBUTED</majorModelMode> @@ -41,12 +41,6 @@ <mandatory v="true" /> <possibleItemsProcess>%aditoprj%/entity/Offer_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess> </entityField> - <entityField> - <name>NET</name> - <tableName>OFFER</tableName> - <columnName>NET</columnName> - <caption>Total net</caption> - </entityField> <entityField> <name>OFFERCODE</name> <tableName>OFFER</tableName> @@ -116,6 +110,7 @@ <tableName>OFFER</tableName> <columnName>VAT</columnName> <caption>Total VAT</caption> + <state>READONLY</state> </entityField> <entityField> <name>IMAGE</name> @@ -127,6 +122,7 @@ <tableName>OFFER</tableName> <columnName>HEADER</columnName> <caption>Header text</caption> + <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/header/valueProcess.js</valueProcess> </entityField> <entityField> <name>FOOTER</name> @@ -153,6 +149,19 @@ <triggerRecalculation v="true" /> <mandatory v="true" /> </entityParameter> + <entityParameter> + <name>Currency_param</name> + <code>%aditoprj%/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js</code> + <expose v="true" /> + <triggerRecalculation v="true" /> + </entityParameter> + <entityParameter> + <name>RelationId_param</name> + <code>%aditoprj%/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js</code> + <expose v="true" /> + <triggerRecalculation v="true" /> + <mandatory v="true" /> + </entityParameter> </children> </entityOutgoingField> <entityActionField> @@ -161,6 +170,25 @@ <onActionProcess>%aditoprj%/entity/Offer_entity/entityfields/newofferversion/onActionProcess.js</onActionProcess> <caption>New offer verison</caption> </entityActionField> + <entityField> + <name>PreviewTitle</name> + <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/previewtitle/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>NET</name> + <tableName>OFFER</tableName> + <columnName>NET</columnName> + <caption>Total net</caption> + <state>READONLY</state> + <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/net/valueProcess.js</valueProcess> + <fieldIdProcess>%aditoprj%/entity/Offer_entity/entityfields/net/fieldIdProcess.js</fieldIdProcess> + </entityField> + <entityField> + <name>TotalGross</name> + <caption>Total gross</caption> + <state>READONLY</state> + <valueProcess>%aditoprj%/entity/Offer_entity/entityfields/totalgross/valueProcess.js</valueProcess> + </entityField> </entityFields> <linkInformation> <linkInformation> diff --git a/entity/Pers_entity/entityfields/gender/possibleItemsProcess.js b/entity/Offer_entity/entityfields/header/valueProcess.js similarity index 100% rename from entity/Pers_entity/entityfields/gender/possibleItemsProcess.js rename to entity/Offer_entity/entityfields/header/valueProcess.js diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js b/entity/Offer_entity/entityfields/net/fieldIdProcess.js similarity index 100% rename from entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js rename to entity/Offer_entity/entityfields/net/fieldIdProcess.js diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js b/entity/Offer_entity/entityfields/net/valueProcess.js similarity index 100% rename from entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js rename to entity/Offer_entity/entityfields/net/valueProcess.js diff --git a/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..5e55d336c5058653f14b546e53fcc03f9dce105c --- /dev/null +++ b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/currency_param/code.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.CURRENCY")); \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..a5cee65a3ba3e16976d5f7d3952da23c73ef54da --- /dev/null +++ b/entity/Offer_entity/entityfields/offerofferitem_dfo/children/relationid_param/code.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.RELATION_ID")); \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/previewtitle/valueProcess.js b/entity/Offer_entity/entityfields/previewtitle/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d8bf28486a9cc4b31d3042ee6df5b00dbcdf6063 --- /dev/null +++ b/entity/Offer_entity/entityfields/previewtitle/valueProcess.js @@ -0,0 +1,5 @@ +import("system.translate"); +import("system.result"); +import("system.vars"); + +result.string(translate.text("Offer") + " " + vars.get("$field.OFFERCODE")); \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/totalgross/valueProcess.js b/entity/Offer_entity/entityfields/totalgross/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..6e374c8f50a610ed0f50b89319726224167631d0 --- /dev/null +++ b/entity/Offer_entity/entityfields/totalgross/valueProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("system.vars"); +import("system.eMath"); + +var netValue = vars.get("$field.NET"); +var vatValue = vars.get("$field.VAT"); + +result.string( eMath.addDec(netValue, vatValue) ); \ No newline at end of file diff --git a/entity/Offeritem_entity/Offeritem_entity.aod b/entity/Offeritem_entity/Offeritem_entity.aod index e79df8ba11966550710e4281b06a5de92d3a766c..206e426134b28f34b15c6b34a01f84f74246e0cc 100644 --- a/entity/Offeritem_entity/Offeritem_entity.aod +++ b/entity/Offeritem_entity/Offeritem_entity.aod @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Offeritem_entity</name> <title>Offeritem</title> <majorModelMode>DISTRIBUTED</majorModelMode> <alias>Data_alias</alias> <conditionProcess>%aditoprj%/entity/Offeritem_entity/conditionProcess.js</conditionProcess> + <onDBInsert>%aditoprj%/entity/Offeritem_entity/onDBInsert.js</onDBInsert> + <onDBUpdate>%aditoprj%/entity/Offeritem_entity/onDBUpdate.js</onDBUpdate> + <onDBDelete>%aditoprj%/entity/Offeritem_entity/onDBDelete.js</onDBDelete> <recordContainerType>DB</recordContainerType> <caption>Offeritem</caption> <entityFields> @@ -44,6 +47,7 @@ <tableName>OFFERITEM</tableName> <columnName>DESCRIPTION</columnName> <caption>Description</caption> + <contentType>LONG_TEXT</contentType> </entityField> <entityField> <name>DISCOUNT</name> @@ -56,6 +60,8 @@ <tableName>OFFERITEM</tableName> <columnName>GROUPCODEID</columnName> <caption>Commodity group</caption> + <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js</possibleItemsProcess> + <state>READONLY</state> </entityField> <entityField> <name>ITEMNAME</name> @@ -68,6 +74,7 @@ <tableName>OFFERITEM</tableName> <columnName>ITEMPOSITION</columnName> <caption>Position</caption> + <state>READONLY</state> </entityField> <entityField> <name>ITEMSORT</name> @@ -78,6 +85,7 @@ <name>OFFERITEMID</name> <tableName>OFFERITEM</tableName> <columnName>OFFERITEMID</columnName> + <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js</valueProcess> </entityField> <entityField> <name>OFFER_ID</name> @@ -90,6 +98,9 @@ <tableName>OFFERITEM</tableName> <columnName>OPTIONAL</columnName> <caption>Optional</caption> + <contentType>BOOLEAN</contentType> + <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js</possibleItemsProcess> + <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/optional/valueProcess.js</valueProcess> </entityField> <entityField> <name>PRICE</name> @@ -102,18 +113,25 @@ <tableName>OFFERITEM</tableName> <columnName>PRODUCT_ID</columnName> <caption>Article</caption> + <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js</possibleItemsProcess> + <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValidation.js</onValidation> + <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/product_id/onValueChange.js</onValueChange> </entityField> <entityField> <name>QUANTITY</name> <tableName>OFFERITEM</tableName> <columnName>QUANTITY</columnName> <caption>Quantity</caption> + <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/valueProcess.js</valueProcess> + <onValidation>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValidation.js</onValidation> + <onValueChange>%aditoprj%/entity/Offeritem_entity/entityfields/quantity/onValueChange.js</onValueChange> </entityField> <entityField> <name>UNIT</name> <tableName>OFFERITEM</tableName> <columnName>UNIT</columnName> <caption>Unit</caption> + <possibleItemsProcess>%aditoprj%/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js</possibleItemsProcess> </entityField> <entityField> <name>USER_EDIT</name> @@ -132,6 +150,7 @@ <tableName>OFFERITEM</tableName> <columnName>VAT</columnName> <caption>VAT</caption> + <state>READONLY</state> </entityField> <entityParameter> <name>OfferId_param</name> @@ -140,6 +159,31 @@ <mandatory v="true" /> <description>PARAMETER</description> </entityParameter> + <entityParameter> + <name>RelationId_param</name> + <expose v="true" /> + <triggerRecalculation v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityParameter> + <name>Currency_param</name> + <expose v="true" /> + <triggerRecalculation v="true" /> + <description>PARAMETER</description> + </entityParameter> + <entityField> + <name>TotalPrice</name> + <caption>Sum</caption> + <contentType>NUMBER</contentType> + <outputFormat>#,##0.00</outputFormat> + <state>READONLY</state> + <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>IMAGE</name> + <contentType>IMAGE</contentType> + <valueProcess>%aditoprj%/entity/Offeritem_entity/entityfields/image/valueProcess.js</valueProcess> + </entityField> </entityFields> <linkInformation> <linkInformation> diff --git a/entity/Offeritem_entity/conditionProcess.js b/entity/Offeritem_entity/conditionProcess.js index 904a7b5517b1c1bd7f40ae87e00d2aaf3ea91b22..b39721ef89a7459add6bade8992f1d23296a84c4 100644 --- a/entity/Offeritem_entity/conditionProcess.js +++ b/entity/Offeritem_entity/conditionProcess.js @@ -5,4 +5,4 @@ import("system.vars"); if(vars.exists("$param.OfferId_param") && vars.get("$param.OfferId_param") != "") result.string("OFFERITEM.OFFER_ID = ('" + vars.get("$param.OfferId_param") + "')"); else - result.string("1 = 2"); \ No newline at end of file + result.string(""); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js similarity index 71% rename from entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js rename to entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js index 6b44f39adb82667f216ba46a76f1b3db73f83879..ec42dede214f092bd764b4151c5a0e93fa25de84 100644 --- a/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js +++ b/entity/Offeritem_entity/entityfields/groupcodeid/possibleItemsProcess.js @@ -4,5 +4,5 @@ import("Keyword_lib"); var kwdUtils, items; kwdUtils = new KeywordUtils(); -items = kwdUtils.getStandardArray("PRICELIST"); +items = kwdUtils.getStandardArray("GROUPCODE"); result.object(items); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/image/valueProcess.js b/entity/Offeritem_entity/entityfields/image/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e29d35c1604de27ca8281ae2d1848e258a943efd --- /dev/null +++ b/entity/Offeritem_entity/entityfields/image/valueProcess.js @@ -0,0 +1,2 @@ +import("system.result"); +result.string("TEXT:IM"); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js b/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..5be18c39832eee52e38b7147961d7db4bab5a588 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/offeritemid/valueProcess.js @@ -0,0 +1,7 @@ +import("system.util"); +import("system.vars"); +import("system.result"); +import("system.neon"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) + result.string(util.getNewUUID()); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1dfbf04839cfeacd9b7e3af1a453f1892cea77f1 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/optional/possibleItemsProcess.js @@ -0,0 +1,7 @@ +import("system.translate"); +import("system.result"); + +result.object([ + ["0", translate.text("Yes")] + ,["1", translate.text("No")] +]); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/optional/valueProcess.js b/entity/Offeritem_entity/entityfields/optional/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..04344c1e2caaa81ee9c4e8ed7c9e10c084b49f95 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/optional/valueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) + result.string("1"); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/product_id/onValidation.js b/entity/Offeritem_entity/entityfields/product_id/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..139597f9cb07c5d48bed18984ec4747f4b4f3438 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/product_id/onValidation.js @@ -0,0 +1,2 @@ + + diff --git a/entity/Offeritem_entity/entityfields/product_id/onValueChange.js b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..bdb931f90f8d6afa263804676af9479fd4ec5aa9 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/product_id/onValueChange.js @@ -0,0 +1,29 @@ +import("system.logging"); +import("system.vars"); +import("system.neon"); +import("Product_lib"); + +var pid = vars.get("$local.value"); +if(pid != "") +{ + var curr = vars.exists("$param.Currency_param") ? vars.get("$param.Currency_param") : ""; + var relid = vars.exists("$param.RelationId_param") ? vars.get("$param.RelationId_param") : ""; + + var pUtils = new ProductUtils(); + var PriceListFilter = { currency: curr, quantity: vars.get("$field.QUANTITY"), relationId: relid }; + + var ProductDetails = pUtils.getProductDetails(pid, PriceListFilter); + + if(ProductDetails[pid] != undefined) + { + vars.set("$field.GROUPCODEID", ProductDetails[pid].groupCode); + vars.set("$field.UNIT", ProductDetails[pid].unit); + vars.set("$field.ITEMNAME", ProductDetails[pid].productName); + + if(ProductDetails[pid].PriceListToUse != null) + { + vars.set("$field.PRICE", ProductDetails[pid].PriceListToUse.price); + vars.set("$field.VAT", ProductDetails[pid].PriceListToUse.vat); + } + } +} \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ece8c2eca10356f471b5d9013c36208311b4a7b6 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/product_id/possibleItemsProcess.js @@ -0,0 +1,17 @@ +import("system.logging"); +import("system.result"); +import("system.db"); +import("Sql_lib"); + +//TODO: change field to lookup field +var sqlUtils = new LegacySqlUtils(); +var prodsSql = "select PRODUCTID, " + sqlUtils.concat(["PRODUCTCODE", "'/'", "PRODUCTNAME"]) + + " from PRODUCT"; + +var prods = db.table(prodsSql); + +var retArray = []; +for(var i = 0; i < prods.length; i++) + retArray.push(prods[i]); + +result.object(retArray); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/quantity/onValidation.js b/entity/Offeritem_entity/entityfields/quantity/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/entity/Offeritem_entity/entityfields/quantity/onValueChange.js b/entity/Offeritem_entity/entityfields/quantity/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..5acf7788daa3af2aeb320809b1c55acdabf05908 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/quantity/onValueChange.js @@ -0,0 +1,23 @@ +import("system.logging"); +import("system.vars"); +import("system.neon"); +import("Product_lib"); + +var pid = vars.get("$field.PRODUCT_ID"); +var newQuantity = vars.get("$local.value"); +if(pid != "" && newQuantity != "") +{ + var curr = vars.exists("$param.Currency_param") ? vars.get("$param.Currency_param") : ""; + var relid = vars.exists("$param.RelationId_param") ? vars.get("$param.RelationId_param") : ""; + + var pUtils = new ProductUtils(); + var PriceListFilter = { currency: curr, quantity: newQuantity, relationId: relid }; + + var ProductDetails = pUtils.getProductDetails(pid, PriceListFilter); + + if(ProductDetails[pid] != undefined && ProductDetails[pid].PriceListToUse != null) + { + vars.set("$field.PRICE", ProductDetails[pid].PriceListToUse.price); + vars.set("$field.VAT", ProductDetails[pid].PriceListToUse.vat); + } +} \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/quantity/valueProcess.js b/entity/Offeritem_entity/entityfields/quantity/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..3aebc70e19c7c9cb3c62338a847b4759f5af2be0 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/quantity/valueProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "") +{ + result.string("1"); +} +else + result.string(vars.get("$this.value")); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js b/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7fff82a426deedb7c0729b258be6c55dda0b19f7 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/totalprice/valueProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("system.vars"); +import("Offer_lib"); + +var oiUtils = new OfferItemUtils(); + +result.string(oiUtils.roundPrice(oiUtils.getItemSum(vars.get("$field.QUANTITY"), vars.get("$field.PRICE") + , vars.get("$field.DISCOUNT"), vars.get("$field.OPTIONAL")))); \ No newline at end of file diff --git a/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js b/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..020f0770d41377e4f1eb2a0265e64a0055ef01f0 --- /dev/null +++ b/entity/Offeritem_entity/entityfields/unit/possibleItemsProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("Keyword_lib"); + +var kwdUtils, items; + +kwdUtils = new KeywordUtils(); +items = kwdUtils.getStandardArray("UNIT"); +result.object(items); \ No newline at end of file diff --git a/entity/Offeritem_entity/onDBDelete.js b/entity/Offeritem_entity/onDBDelete.js new file mode 100644 index 0000000000000000000000000000000000000000..e7ce64e15311337b8b619f36dc75edd10eeb3c52 --- /dev/null +++ b/entity/Offeritem_entity/onDBDelete.js @@ -0,0 +1,17 @@ +import("system.neon"); +import("system.vars"); +import("system.db"); +import("Offer_lib"); + +var oid = vars.get("$field.OFFER_ID"); +if(oid != "") +{ + var cols = ["NET", "VAT"]; + var colTypes = db.getColumnTypes("OFFER", cols); + var oUtils = new OfferUtils(); + var vals = oUtils.getOfferNetAndVAT(oid, vars.get("$field.OFFERITEMID")); + + db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'"); + + neon.refresh("Offer_entity"); +} \ No newline at end of file diff --git a/entity/Offeritem_entity/onDBInsert.js b/entity/Offeritem_entity/onDBInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..d27032ac0e449b2de5efa128292bb59561213b6f --- /dev/null +++ b/entity/Offeritem_entity/onDBInsert.js @@ -0,0 +1,17 @@ +import("system.neon"); +import("system.vars"); +import("system.db"); +import("Offer_lib"); + +var oid = vars.get("$field.OFFER_ID"); +if(oid != "") +{ + var cols = ["NET", "VAT"]; + var colTypes = db.getColumnTypes("OFFER", cols); + var oUtils = new OfferUtils(); + var vals = oUtils.getOfferNetAndVAT(oid); + + db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'"); + + neon.refresh("Offer_entity"); +} \ No newline at end of file diff --git a/entity/Offeritem_entity/onDBUpdate.js b/entity/Offeritem_entity/onDBUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..15e362e109713c274f3b53bc35fe30a3a99bb3ab --- /dev/null +++ b/entity/Offeritem_entity/onDBUpdate.js @@ -0,0 +1,18 @@ +import("system.logging"); +import("system.vars"); +import("system.db"); +import("system.neon"); +import("Offer_lib"); + +var oid = vars.get("$field.OFFER_ID"); +if(oid != "") +{ + var cols = ["NET", "VAT"]; + var colTypes = db.getColumnTypes("OFFER", cols); + var oUtils = new OfferUtils(); + var vals = oUtils.getOfferNetAndVAT(oid); + + db.updateData("OFFER", cols, colTypes, vals, "OFFERID = '" + oid + "'"); + + neon.refresh("Offer_entity"); +} \ No newline at end of file diff --git a/entity/Options_Entity/Options_Entity.aod b/entity/Options_Entity/Options_Entity.aod index a1f5e63ded38ae5869c80e41f31aadb12810c588..3712683649290ce89c0daff0f3803bfec96b3362 100644 --- a/entity/Options_Entity/Options_Entity.aod +++ b/entity/Options_Entity/Options_Entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Options_Entity</name> <title>Options</title> <description></description> diff --git a/entity/Org_entity/Org_entity.aod b/entity/Org_entity/Org_entity.aod index 4807ae7a89ab1c194c3a78b40d896af4f3b64b96..857f8573e8b1395215ce18af443c5a5049fcc7da 100644 --- a/entity/Org_entity/Org_entity.aod +++ b/entity/Org_entity/Org_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Org_entity</name> <title>Company</title> <majorModelMode>DISTRIBUTED</majorModelMode> @@ -51,6 +51,7 @@ <tableName>ORG</tableName> <columnName>NAME</columnName> <caption>Name</caption> + <mandatory v="true" /> </entityField> <entityField> <name>ORGID</name> @@ -259,6 +260,66 @@ </entityParameter> </children> </entityOutgoingField> + <entityOutgoingField> + <name>OrgCommEmail_dfo</name> + <fieldType>DEPENDENCY_OUT</fieldType> + <caption>Communication E-Mail</caption> + <dependency> + <name>dependency</name> + <entityName>Comm_entity</entityName> + <fieldName>#INCOMING</fieldName> + </dependency> + <children> + <entityParameter> + <name>RelId_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js</code> + </entityParameter> + <entityParameter> + <name>MediumCategoriesFilter_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js</code> + </entityParameter> + </children> + </entityOutgoingField> + <entityOutgoingField> + <name>OrgCommPhone_dfo</name> + <fieldType>DEPENDENCY_OUT</fieldType> + <caption>Communication Phone</caption> + <dependency> + <name>dependency</name> + <entityName>Comm_entity</entityName> + <fieldName>#INCOMING</fieldName> + </dependency> + <children> + <entityParameter> + <name>RelId_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js</code> + </entityParameter> + <entityParameter> + <name>MediumCategoriesFilter_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js</code> + </entityParameter> + </children> + </entityOutgoingField> + <entityOutgoingField> + <name>OrgCommOthers_dfo</name> + <fieldType>DEPENDENCY_OUT</fieldType> + <caption>Communication Other</caption> + <dependency> + <name>dependency</name> + <entityName>Comm_entity</entityName> + <fieldName>#INCOMING</fieldName> + </dependency> + <children> + <entityParameter> + <name>RelId_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js</code> + </entityParameter> + <entityParameter> + <name>MediumCategoriesFilter_param</name> + <code>%aditoprj%/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js</code> + </entityParameter> + </children> + </entityOutgoingField> <entityOutgoingField> <name>OrgContract_dfo</name> <fieldType>DEPENDENCY_OUT</fieldType> diff --git a/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..aaff61e4c8898ae395726ecc423de32a449ffedb --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommemail_dfo/children/mediumcategoriesfilter_param/code.js @@ -0,0 +1,4 @@ +import("system.text"); +import("system.result"); + +result.string(text.encodeMS(["EMAIL"])); diff --git a/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3 --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommemail_dfo/children/relid_param/code.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.RELATIONID")); \ No newline at end of file diff --git a/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..4f54b7ffc8acbf3d404f6d45dea8b79e991ca573 --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommothers_dfo/children/mediumcategoriesfilter_param/code.js @@ -0,0 +1,4 @@ +import("system.text"); +import("system.result"); + +result.string(text.encodeMS(["OTHER"])); diff --git a/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3 --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommothers_dfo/children/relid_param/code.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.RELATIONID")); \ No newline at end of file diff --git a/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js b/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..10d8f95a8428f41e01924b5a23ed0082fed74b2f --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommphone_dfo/children/mediumcategoriesfilter_param/code.js @@ -0,0 +1,4 @@ +import("system.text"); +import("system.result"); + +result.string(text.encodeMS(["PHONE"])); diff --git a/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js b/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js new file mode 100644 index 0000000000000000000000000000000000000000..c618e8d6e5ce719d68e284f7c5b4b050c95b25d3 --- /dev/null +++ b/entity/Org_entity/entityfields/orgcommphone_dfo/children/relid_param/code.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$field.RELATIONID")); \ No newline at end of file diff --git a/entity/Pers_entity/Pers_entity.aod b/entity/Pers_entity/Pers_entity.aod index 53eefff3e9a0536965f4a03d72fe853d1d0e2104..a564609fab5bf434e8475e3ae7174071b01902d3 100644 --- a/entity/Pers_entity/Pers_entity.aod +++ b/entity/Pers_entity/Pers_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Pers_entity</name> <title>Contact</title> <majorModelMode>DISTRIBUTED</majorModelMode> @@ -49,7 +49,6 @@ <columnName>GENDER</columnName> <caption>Gender</caption> <outgoingField>PersGender_dfo</outgoingField> - <possibleItemsProcess>%aditoprj%/entity/Pers_entity/entityfields/gender/possibleItemsProcess.js</possibleItemsProcess> </entityField> <entityField> <name>LASTNAME</name> @@ -391,21 +390,29 @@ <entityIncomingField> <name>#INCOMING</name> </entityIncomingField> + <entityField> + <name>LANGUAGE</name> + <tableName>RELATION</tableName> + <columnName>LANGUAGE</columnName> + <caption>Language</caption> + <mandatory v="true" /> + <possibleItemsProcess>%aditoprj%/entity/Pers_entity/entityfields/language/possibleItemsProcess.js</possibleItemsProcess> + </entityField> </entityFields> <linkInformation> <linkInformation> - <name>ffff1758-e84e-47d8-a957-5989d0be7092</name> + <name>9ce0dfd2-192d-4446-8b2d-a4c053abc44a</name> <tableName>PERS</tableName> <primaryKey>PERSID</primaryKey> </linkInformation> <linkInformation> - <name>5547b8d7-5145-4eb7-8698-c92674b4691f</name> + <name>348312a8-6392-4adb-af69-75cbcfc5b65b</name> <tableName>RELATION</tableName> <primaryKey>RELATIONID</primaryKey> <isUIDTable v="true" /> </linkInformation> <linkInformation> - <name>dae8e70a-ec76-4c53-9799-ee04bfbe3bd2</name> + <name>edf5e4f3-993d-4097-b59d-a100d5222cad</name> <tableName>ORG</tableName> <primaryKey>ORGID</primaryKey> <readonly v="true" /> diff --git a/entity/Pers_entity/entityfields/language/possibleItemsProcess.js b/entity/Pers_entity/entityfields/language/possibleItemsProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..26992f2c6cfc67f4cbfae11030af30b34b7c553d --- /dev/null +++ b/entity/Pers_entity/entityfields/language/possibleItemsProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("Keyword_lib"); + +var kwdUtils, items; + +kwdUtils = new KeywordUtils(); +items = kwdUtils.getStandardArray("LANGUAGE"); +result.object(items); \ No newline at end of file diff --git a/entity/Product_entity/Product_entity.aod b/entity/Product_entity/Product_entity.aod index 02d326e17c0fcd179f2cdcd9f38317894c43f969..b329898832b46fcb125df74c5839e5ec55f51c0d 100644 --- a/entity/Product_entity/Product_entity.aod +++ b/entity/Product_entity/Product_entity.aod @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Product_entity</name> <title>Product</title> <majorModelMode>DISTRIBUTED</majorModelMode> + <alias>Data_alias</alias> <recordContainerType>DB</recordContainerType> <caption>Product</caption> <iconId>VAADIN:HAMMER</iconId> - <alias>Data_alias</alias> <entityFields> <entityField> <name>ADVERTISING</name> diff --git a/entity/Productprice_entity/Productprice_entity.aod b/entity/Productprice_entity/Productprice_entity.aod index 0ab83ab71f67b32c62d0a0994004dc3b1f75b7cc..029ac867926eab7b3e24021a7b42cd0b3202cbbe 100644 --- a/entity/Productprice_entity/Productprice_entity.aod +++ b/entity/Productprice_entity/Productprice_entity.aod @@ -1,10 +1,11 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Productprice_entity</name> <title>Price list</title> <majorModelMode>DISTRIBUTED</majorModelMode> <alias>Data_alias</alias> <conditionProcess>%aditoprj%/entity/Productprice_entity/conditionProcess.js</conditionProcess> + <orderClauseProcess>%aditoprj%/entity/Productprice_entity/orderClauseProcess.js</orderClauseProcess> <recordContainerType>DB</recordContainerType> <caption>Price list</caption> <entityFields> @@ -16,6 +17,7 @@ <mandatory v="true" /> <mandatoryProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js</mandatoryProcess> <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js</possibleItemsProcess> + <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/buysell/valueProcess.js</valueProcess> </entityField> <entityField> <name>CURRENCY</name> @@ -69,7 +71,7 @@ <name>PRODUCT_ID</name> <tableName>PRODUCTPRICE</tableName> <columnName>PRODUCT_ID</columnName> - <caption>Product name</caption> + <caption>Product</caption> <linkedContext>Product_context</linkedContext> <mandatory v="false" /> <outgoingField>ProductpriceProduct_dfo</outgoingField> @@ -130,8 +132,11 @@ <tableName>PRODUCTPRICE</tableName> <columnName>PRICELIST</columnName> <caption>Price list</caption> + <captionProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/captionProcess.js</captionProcess> <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js</possibleItemsProcess> <state>AUTO</state> + <stateProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist/valueProcess.js</valueProcess> </entityField> <entityIncomingField> <name>ProductProductprice_dfi</name> @@ -158,14 +163,6 @@ <mandatory v="false" /> <description>PARAMETER</description> </entityParameter> - <entityField> - <name>Pricelist_Relation</name> - <caption>Price list / Company</caption> - <possibleItemsProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/possibleItemsProcess.js</possibleItemsProcess> - <valueProcess>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js</valueProcess> - <onValidation>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/onValidation.js</onValidation> - <onValueChange>%aditoprj%/entity/Productprice_entity/entityfields/pricelist_relation/onValueChange.js</onValueChange> - </entityField> <entityField> <name>PRODUCT_GROUPCODEID</name> <caption>Product group</caption> diff --git a/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js b/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js index 7808bc1144567b08f53c71a2934533fbb28bd695..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 --- a/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js +++ b/entity/Productprice_entity/entityfields/buysell/mandatoryProcess.js @@ -1,12 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.result"); - -if(vars.exists("$param.ProductId_param") && vars.get("$param.ProductId_param") != "") -{ - result.string("true"); -} -else -{ - result.string("false"); -} \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js b/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js index 5da424e274784b45e964216aa3a62cf03bdbacc4..827f2d7a130b4b475d4a486628908a9c5929df90 100644 --- a/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js +++ b/entity/Productprice_entity/entityfields/buysell/possibleItemsProcess.js @@ -2,6 +2,6 @@ import("system.translate"); import("system.result"); result.object([ - ["PP", translate.text("PP")], ["SP", translate.text("SP")] + , ["PP", translate.text("PP")] ]); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/buysell/valueProcess.js b/entity/Productprice_entity/entityfields/buysell/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..334695bcf35bf986d3158845954c58707cec9755 --- /dev/null +++ b/entity/Productprice_entity/entityfields/buysell/valueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == "") + result.string("SP"); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/pricelist/captionProcess.js b/entity/Productprice_entity/entityfields/pricelist/captionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..325222cf9a75416c2e498b3493b1dc5be5c893c2 --- /dev/null +++ b/entity/Productprice_entity/entityfields/pricelist/captionProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("system.translate"); +import("system.neon"); +import("system.result"); + +var str = translate.text("Price list"); +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_VIEW) + str = translate.text("Price list / Company"); + +result.string(str); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js b/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js index 6b44f39adb82667f216ba46a76f1b3db73f83879..23c85c28b992637216dd30c649dd607110dd9c02 100644 --- a/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js +++ b/entity/Productprice_entity/entityfields/pricelist/possibleItemsProcess.js @@ -1,3 +1,6 @@ +import("system.db"); +import("system.neon"); +import("system.vars"); import("system.result"); import("Keyword_lib"); @@ -5,4 +8,11 @@ var kwdUtils, items; kwdUtils = new KeywordUtils(); items = kwdUtils.getStandardArray("PRICELIST"); + +if(vars.get("$field.RELATION_ID") != "") +{ + var orgname = db.cell("select NAME from ORG join RELATION on ORG_ID = ORGID where RELATIONID = '" + vars.get("$field.RELATION_ID") + "'"); + items.push(["", orgname]); +} + result.object(items); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/pricelist/stateProcess.js b/entity/Productprice_entity/entityfields/pricelist/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7736f0d63499e5ffdee2b861d1dffb69d961f0ec --- /dev/null +++ b/entity/Productprice_entity/entityfields/pricelist/stateProcess.js @@ -0,0 +1,7 @@ +import("system.vars"); +import("system.result"); + +if(vars.get("$field.RELATION_ID") != "") + result.string("READONLY"); +else + result.string("EDITABLE"); \ No newline at end of file diff --git a/entity/Productprice_entity/entityfields/pricelist/valueProcess.js b/entity/Productprice_entity/entityfields/pricelist/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js b/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js deleted file mode 100644 index 3f9089e29c49884f47876b8d9a789ac01df256f0..0000000000000000000000000000000000000000 --- a/entity/Productprice_entity/entityfields/pricelist_relation/valueProcess.js +++ /dev/null @@ -1,16 +0,0 @@ -import("system.result"); -import("system.vars"); -import("Keyword_lib"); - -var kewUtils = new KeywordUtils(); - -var rel = vars.get("$field.RELATION_ID"); - -if(rel != "") -{ - result.string("Firma");//TODO: Org/pers Name -} -else -{ - result.string(kewUtils.getViewValue("PRICELIST", vars.get("$field.PRICELIST"))); -} \ No newline at end of file diff --git a/entity/Productprice_entity/orderClauseProcess.js b/entity/Productprice_entity/orderClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9fd0aad5a4bce2f8f7f5ca713d35f79bc1b9a7ec --- /dev/null +++ b/entity/Productprice_entity/orderClauseProcess.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.object({"PRODUCTPRICE.VALID_FROM": "down"}); \ No newline at end of file diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod index 2398361961635ff3eb850c159d96d34527f31ea7..f81960ed2babb095dd7430b9bb443b2d9c4815f7 100644 --- a/entity/Salesproject_entity/Salesproject_entity.aod +++ b/entity/Salesproject_entity/Salesproject_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Salesproject_entity</name> <title>Salesproject</title> <majorModelMode>DISTRIBUTED</majorModelMode> diff --git a/entity/Social_entity/Social_entity.aod b/entity/Social_entity/Social_entity.aod index 787822ab61170dafd42eb8cb733ed51144a495d4..4b500fab944187cb9e8fd43ded8a56f35b2d75b8 100644 --- a/entity/Social_entity/Social_entity.aod +++ b/entity/Social_entity/Social_entity.aod @@ -1,16 +1,16 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Social_entity</name> <title>Social</title> <majorModelMode>DISTRIBUTED</majorModelMode> - <recordContainerType>NONE</recordContainerType> - <caption>Social Media</caption> <indexGroup></indexGroup> <patternExtensionProcess></patternExtensionProcess> <fields> <element>UID</element> </fields> <contentProcess>%aditoprj%/entity/Social_entity/contentProcess.js</contentProcess> + <recordContainerType>NONE</recordContainerType> + <caption>Social Media</caption> <entityFields> <entityField> <name>TWITTER_TIMELINE</name> diff --git a/entity/Stock_entity/Stock_entity.aod b/entity/Stock_entity/Stock_entity.aod index 72a126bb04dd0ff96c22a297fea745d32c5cae08..4942e5aa72153edeca4529e1cdf8f8058f038173 100644 --- a/entity/Stock_entity/Stock_entity.aod +++ b/entity/Stock_entity/Stock_entity.aod @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.3" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.3"> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.0.4"> <name>Stock_entity</name> <title>Stock</title> <majorModelMode>DISTRIBUTED</majorModelMode> diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index b792b088507a336429f459b8e866edfc1764882f..a37c3f2fda4e76d43298037b7924a342cea607be 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -696,6 +696,75 @@ <entry> <key>New offer verison</key> </entry> + <entry> + <key>ISO3 Code</key> + </entry> + <entry> + <key>zusagen</key> + </entry> + <entry> + <key>EU Member</key> + </entry> + <entry> + <key>Zip exists</key> + </entry> + <entry> + <key>ISO2 Code</key> + </entry> + <entry> + <key>Sum</key> + </entry> + <entry> + <key>absagen</key> + </entry> + <entry> + <key>Option4</key> + </entry> + <entry> + <key>Option3</key> + </entry> + <entry> + <key>Option2</key> + </entry> + <entry> + <key>Option1</key> + </entry> + <entry> + <key>Countries</key> + </entry> + <entry> + <key>Euro zone</key> + </entry> + <entry> + <key>NAME</key> + </entry> + <entry> + <key>Options</key> + </entry> + <entry> + <key>Country code</key> + </entry> + <entry> + <key>Country Code</key> + </entry> + <entry> + <key>PO-box name</key> + </entry> + <entry> + <key>Adress format</key> + </entry> + <entry> + <key>vielleicht</key> + </entry> + <entry> + <key>Administration</key> + </entry> + <entry> + <key>Flag</key> + </entry> + <entry> + <key>Total gross</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> <sqlModels> diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod index 2befe9354a3f1458eefcdc771769a07ca247f5a5..a3683b6322427ec28d949b94239a810293604e2a 100644 --- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod +++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod @@ -909,6 +909,77 @@ <key>New offer verison</key> <value>Neue Angebotsversion</value> </entry> + <entry> + <key>ISO3 Code</key> + </entry> + <entry> + <key>zusagen</key> + </entry> + <entry> + <key>EU Member</key> + </entry> + <entry> + <key>Zip exists</key> + </entry> + <entry> + <key>ISO2 Code</key> + </entry> + <entry> + <key>Sum</key> + <value>Summe</value> + </entry> + <entry> + <key>absagen</key> + </entry> + <entry> + <key>Option4</key> + </entry> + <entry> + <key>Option3</key> + </entry> + <entry> + <key>Option2</key> + </entry> + <entry> + <key>Option1</key> + </entry> + <entry> + <key>Countries</key> + </entry> + <entry> + <key>Euro zone</key> + </entry> + <entry> + <key>NAME</key> + </entry> + <entry> + <key>Options</key> + </entry> + <entry> + <key>Country code</key> + </entry> + <entry> + <key>Country Code</key> + </entry> + <entry> + <key>PO-box name</key> + </entry> + <entry> + <key>Adress format</key> + </entry> + <entry> + <key>vielleicht</key> + </entry> + <entry> + <key>Administration</key> + </entry> + <entry> + <key>Flag</key> + </entry> + <entry> + <key>Total gross</key> + <value>Betrag brutto</value> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod index 88547b926576827437d608ede7b69fb816c67337..8f1c4ca4922e38aa5735c049a17eae478d499c16 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -704,6 +704,75 @@ <entry> <key>New offer verison</key> </entry> + <entry> + <key>ISO3 Code</key> + </entry> + <entry> + <key>zusagen</key> + </entry> + <entry> + <key>EU Member</key> + </entry> + <entry> + <key>Zip exists</key> + </entry> + <entry> + <key>ISO2 Code</key> + </entry> + <entry> + <key>Sum</key> + </entry> + <entry> + <key>absagen</key> + </entry> + <entry> + <key>Option4</key> + </entry> + <entry> + <key>Option3</key> + </entry> + <entry> + <key>Option2</key> + </entry> + <entry> + <key>Option1</key> + </entry> + <entry> + <key>Countries</key> + </entry> + <entry> + <key>Euro zone</key> + </entry> + <entry> + <key>NAME</key> + </entry> + <entry> + <key>Options</key> + </entry> + <entry> + <key>Country code</key> + </entry> + <entry> + <key>Country Code</key> + </entry> + <entry> + <key>PO-box name</key> + </entry> + <entry> + <key>Adress format</key> + </entry> + <entry> + <key>vielleicht</key> + </entry> + <entry> + <key>Administration</key> + </entry> + <entry> + <key>Flag</key> + </entry> + <entry> + <key>Total gross</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/neonContext/Offeritem_context/Offeritem_context.aod b/neonContext/Offeritem_context/Offeritem_context.aod index bbfcab9649ab51bd109a53945a6a54e42686bfbc..d541a52c517c3226f5605c3e52c7520dfa07e3ad 100644 --- a/neonContext/Offeritem_context/Offeritem_context.aod +++ b/neonContext/Offeritem_context/Offeritem_context.aod @@ -1,7 +1,10 @@ <?xml version="1.0" encoding="UTF-8"?> <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.0.0"> <name>Offeritem_context</name> + <title>Offeritem</title> <majorModelMode>DISTRIBUTED</majorModelMode> + <filterview>OfferitemFilter_view</filterview> + <preview>OfferitemPreview_view</preview> <entity>Offeritem_entity</entity> <references> <neonViewReference> diff --git a/neonView/OfferPreview_view/OfferPreview_view.aod b/neonView/OfferPreview_view/OfferPreview_view.aod index d639c0b4f7c4d5134e511749ef64ff9f3b97b0f3..c9b1bb992940cd5becb6ce76339038340b54a6b9 100644 --- a/neonView/OfferPreview_view/OfferPreview_view.aod +++ b/neonView/OfferPreview_view/OfferPreview_view.aod @@ -11,7 +11,7 @@ <cardViewTemplate> <name>OfferHeader_template</name> <iconField>IMAGE</iconField> - <titleField>OFFERCODE</titleField> + <titleField>PreviewTitle</titleField> <descriptionField>RELATION_ID</descriptionField> <entityField>#ENTITY</entityField> </cardViewTemplate> @@ -33,13 +33,17 @@ <entityField>LANGUAGE</entityField> </entityFieldLink> <entityFieldLink> - <name>9e876b07-3029-42fe-a1e7-5c19b845e50d</name> + <name>4843f0f0-4ee8-47c2-bc0f-99241bad4c51</name> <entityField>NET</entityField> </entityFieldLink> <entityFieldLink> <name>cd72899a-69b2-4fe2-bf58-4fb9f594324e</name> <entityField>VAT</entityField> </entityFieldLink> + <entityFieldLink> + <name>10d8f38b-1e01-45a1-bc57-424284bf87be</name> + <entityField>TotalGross</entityField> + </entityFieldLink> <entityFieldLink> <name>16d38881-d3d3-4c4d-9f23-39d60eadce8d</name> <entityField>CURRENCY</entityField> @@ -52,6 +56,10 @@ <name>3317b73e-68e8-41a8-a678-89c7c7c8513e</name> <entityField>SALESPROJECT_ID</entityField> </entityFieldLink> + <entityFieldLink> + <name>683e3a86-0f9f-4b40-85c0-ae102a5a4a9a</name> + <entityField>HEADER</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod index ec94cab9bee6ab6e9b5adf44202c92331bec418b..481f23266f24a2ec1e102aec6645739475d23e7e 100644 --- a/neonView/OfferitemFilter_view/OfferitemFilter_view.aod +++ b/neonView/OfferitemFilter_view/OfferitemFilter_view.aod @@ -10,6 +10,7 @@ <children> <tableViewTemplate> <name>OfferitemFilter_table</name> + <autoNewRow v="true" /> <entityField>#ENTITY</entityField> <columns> <neonTableColumn> @@ -18,7 +19,7 @@ </neonTableColumn> <neonTableColumn> <name>545f79bf-2fee-4112-9541-0889d0e514eb</name> - <entityField>ITEMNAME</entityField> + <entityField>PRODUCT_ID</entityField> </neonTableColumn> <neonTableColumn> <name>2a907da4-b48d-4933-bc17-a40e7d4556f9</name> diff --git a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod index 467fadca47f07681dabc81aa3f3686000323ea40..48c2b919c5c99ecc9e4ad2babe5a431fb44b2ecf 100644 --- a/neonView/OfferitemPreview_view/OfferitemPreview_view.aod +++ b/neonView/OfferitemPreview_view/OfferitemPreview_view.aod @@ -10,8 +10,29 @@ <children> <cardViewTemplate> <name>OfferitemPreview_header</name> + <iconField>IMAGE</iconField> <titleField>ITEMNAME</titleField> <descriptionField>DESCRIPTION</descriptionField> + <entityField>#ENTITY</entityField> </cardViewTemplate> + <genericViewTemplate> + <name>Offeritem_generic</name> + <showDrawer v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>9868560c-41c7-4641-b0f1-627a61b796b3</name> + <entityField>TotalPrice</entityField> + </entityFieldLink> + <entityFieldLink> + <name>c0c04d1c-90a7-4c0b-9323-1f0783757987</name> + <entityField>GROUPCODEID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>e25386dc-a740-4f93-a1f0-32317cf5a36a</name> + <entityField>OPTIONAL</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> </children> </neonView> diff --git a/neonView/OrgPreview_view/OrgPreview_view.aod b/neonView/OrgPreview_view/OrgPreview_view.aod index 2807fd672f1b75ef82268bceb91ba7827f7919db..dfa831fca34615d5f91a0f9de35496517147640b 100644 --- a/neonView/OrgPreview_view/OrgPreview_view.aod +++ b/neonView/OrgPreview_view/OrgPreview_view.aod @@ -1,52 +1,62 @@ -<?xml version="1.0" encoding="UTF-8"?> -<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0"> - <name>OrgPreview_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <layout> - <boxLayout> - <name>layout</name> - </boxLayout> - </layout> - <children> - <cardViewTemplate> - <name>BasicCard_template</name> - <iconField>IMAGE</iconField> - <titleField>NAME</titleField> - <descriptionField>CUSTOMERCODE_DISPLAY_fieldGroup</descriptionField> - <entityField>#ENTITY</entityField> - </cardViewTemplate> - <neonViewReference> - <name>df605bb6-5d18-4233-abc0-1da82e4910ca</name> - <entityField>OrgAddress_dfo</entityField> - <view>AddressList_view</view> - </neonViewReference> - <neonViewReference> - <name>7fbd6034-4213-41f9-bb0d-c73d55b88d82</name> - <entityField>OrgComm_dfo</entityField> - <view>CommList_view</view> - </neonViewReference> - <genericViewTemplate> - <name>OrgInfo_template</name> - <showDrawer v="true" /> - <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>4bad7219-1a3a-4e6e-ae5a-533d3acb6845</name> - <entityField>LANGUAGE</entityField> - </entityFieldLink> - <entityFieldLink> - <name>5a397737-2768-4e16-8c58-890b8a26b4a2</name> - <entityField>STATUS</entityField> - </entityFieldLink> - <entityFieldLink> - <name>89e9aa74-1568-4f74-b42a-a02b13752802</name> - <entityField>TYPE</entityField> - </entityFieldLink> - <entityFieldLink> - <name>180e8467-4eb2-4f89-a59f-ff76b8810925</name> - <entityField>INFO</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> - </children> -</neonView> +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.0.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.0.0"> + <name>OrgPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <cardViewTemplate> + <name>BasicCard_template</name> + <iconField>IMAGE</iconField> + <titleField>NAME</titleField> + <descriptionField>CUSTOMERCODE_DISPLAY_fieldGroup</descriptionField> + <entityField>#ENTITY</entityField> + </cardViewTemplate> + <neonViewReference> + <name>df605bb6-5d18-4233-abc0-1da82e4910ca</name> + <entityField>OrgAddress_dfo</entityField> + <view>AddressList_view</view> + </neonViewReference> + <genericViewTemplate> + <name>OrgInfo_template</name> + <showDrawer v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>4bad7219-1a3a-4e6e-ae5a-533d3acb6845</name> + <entityField>LANGUAGE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>5a397737-2768-4e16-8c58-890b8a26b4a2</name> + <entityField>STATUS</entityField> + </entityFieldLink> + <entityFieldLink> + <name>89e9aa74-1568-4f74-b42a-a02b13752802</name> + <entityField>TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>180e8467-4eb2-4f89-a59f-ff76b8810925</name> + <entityField>INFO</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + <neonViewReference> + <name>7b3f1253-f671-4cf4-83ec-81e229910014</name> + <entityField>OrgCommEmail_dfo</entityField> + <view>CommList_view</view> + </neonViewReference> + <neonViewReference> + <name>23f420cb-fd45-433f-b385-55a49e98744f</name> + <entityField>OrgCommPhone_dfo</entityField> + <view>CommList_view</view> + </neonViewReference> + <neonViewReference> + <name>c45d71cf-b81f-4d75-876d-7f9c26b1eb12</name> + <entityField>OrgCommOthers_dfo</entityField> + <view>CommList_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/PersEdit_view/PersEdit_view.aod b/neonView/PersEdit_view/PersEdit_view.aod index 95b00ae97314c2df0b4ce8de2d68381ea52db2ba..57bba3ca2f7c0820868ce9810333c1f92f931340 100644 --- a/neonView/PersEdit_view/PersEdit_view.aod +++ b/neonView/PersEdit_view/PersEdit_view.aod @@ -48,6 +48,10 @@ <name>74de507e-75e0-4957-a4fb-7070fa3c5a4a</name> <entityField>DATEOFBIRTH</entityField> </entityFieldLink> + <entityFieldLink> + <name>d8d04e36-de46-48a3-994a-fa72d1f2ea89</name> + <entityField>LANGUAGE</entityField> + </entityFieldLink> </fields> </genericViewTemplate> <neonViewReference> diff --git a/neonView/PersFilter_view/PersFilter_view.aod b/neonView/PersFilter_view/PersFilter_view.aod index b8f86322d84be98eeb9378ec3f60e9846e428644..ec8bc3ee05333157dfc2d475a88446d6f4b00a3a 100644 --- a/neonView/PersFilter_view/PersFilter_view.aod +++ b/neonView/PersFilter_view/PersFilter_view.aod @@ -29,6 +29,9 @@ <children> <tableViewTemplate> <name>PersFilter_template</name> + <favoriteActionGroup1>MyActions</favoriteActionGroup1> + <favoriteActionGroup2>ServusGruppe</favoriteActionGroup2> + <favoriteActionGroup3>HalloGruppe</favoriteActionGroup3> <showHeader v="true" /> <entityField>#ENTITY</entityField> <columns> diff --git a/neonView/PersPreview_view/PersPreview_view.aod b/neonView/PersPreview_view/PersPreview_view.aod index a3b9ca8a3a46aa3e518431f883cebd728a8991b6..786aef8c3fe8ac185a6b7205425777566f88d9b1 100644 --- a/neonView/PersPreview_view/PersPreview_view.aod +++ b/neonView/PersPreview_view/PersPreview_view.aod @@ -66,6 +66,10 @@ <name>5d4e0828-b7fe-4f54-a47a-f9b5838fb1ae</name> <entityField>DATEOFBIRTH</entityField> </entityFieldLink> + <entityFieldLink> + <name>3aa3e89b-91ce-4607-8d76-53ee309a688f</name> + <entityField>LANGUAGE</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod index 1c56c25712bcf4b6c50bad7737801cbf34810b61..96f22def03c732f18052ddd63f262f037c0b3ded 100644 --- a/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod +++ b/neonView/ProductpriceFilter_view/ProductpriceFilter_view.aod @@ -20,7 +20,7 @@ </neonTableColumn> <neonTableColumn> <name>695ce7be-d738-48a9-833d-e8815c6eff74</name> - <entityField>Pricelist_Relation</entityField> + <entityField>PRICELIST</entityField> </neonTableColumn> <neonTableColumn> <name>472a96ca-10ff-49c7-b2ae-6550e04c4e6f</name> diff --git a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod index 3d65425be7d9285d965e27d67589c0b096c87e43..861b1d1178595c2b98e2fbc557f4d8de0128ea3a 100644 --- a/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod +++ b/neonView/ProductpriceRelation_view/ProductpriceRelation_view.aod @@ -18,10 +18,6 @@ <name>bc7ca35e-c454-4cc0-9b2e-0656e03f1f65</name> <entityField>IMAGE</entityField> </neonTableColumn> - <neonTableColumn> - <name>0b2271ca-f55f-4339-b63f-f6f95d1d18e6</name> - <entityField>PRODUCT_GROUPCODEID</entityField> - </neonTableColumn> <neonTableColumn> <name>9b809450-cbe5-40f3-8d64-b4a5bac5eb5b</name> <entityField>PRODUCT_ID</entityField> @@ -46,6 +42,10 @@ <name>20efd64c-297d-4774-b020-437d3610e798</name> <entityField>CURRENCY</entityField> </neonTableColumn> + <neonTableColumn> + <name>787d2cce-ddb0-4d7e-8df4-5675e0d96d76</name> + <entityField>VAT</entityField> + </neonTableColumn> </columns> </tableViewTemplate> </children> diff --git a/others/db_changes/masterChangelog.xml b/others/db_changes/masterChangelog.xml index f7675a5a11231d93c5990ac14ae410754bccb997..13278709b581a055601de549c2c09d3a5d4cbf95 100644 --- a/others/db_changes/masterChangelog.xml +++ b/others/db_changes/masterChangelog.xml @@ -1,6 +1,6 @@ <?xml version="1.1" encoding="UTF-8" standalone="no"?> <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> - <include file="struct/Create_Pers.xml"/> + <include file="struct/create_pers.xml"/> <include file="struct/create_org.xml"/> <include file="struct/create_history.xml"/> <include file="struct/1022526_orgChange.xml"/> diff --git a/others/db_changes/struct/create_org.xml b/others/db_changes/struct/create_org.xml index ae2a69496b565e19534cbb7dd669833be0129d75..a7fae3e18c4b0ecae19a04586ad5a33f592f6073 100644 --- a/others/db_changes/struct/create_org.xml +++ b/others/db_changes/struct/create_org.xml @@ -2,7 +2,9 @@ <databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> <changeSet author="j.goderbauer" id="1528803466364-1"> <createTable tableName="ORG"> - <column name="NAME" type="NVARCHAR(255)"/> + <column name="NAME" type="NVARCHAR(255)"> + <constraints nullable="false"/> + </column> <column name="INFO" type="NCLOB"/> <column name="TYPE" type="SMALLINT"/> <column name="CUSTOMERCODE" type="VARCHAR(30)"/> diff --git a/others/db_changes/struct/Create_Pers.xml b/others/db_changes/struct/create_pers.xml similarity index 91% rename from others/db_changes/struct/Create_Pers.xml rename to others/db_changes/struct/create_pers.xml index 2fc0b35392db9b5e910225760dd710850b544013..8fdd0ff9eb3b21528732f9bea02f18867447d3cc 100644 --- a/others/db_changes/struct/Create_Pers.xml +++ b/others/db_changes/struct/create_pers.xml @@ -12,7 +12,9 @@ <column name="USER_NEW" type="VARCHAR(50)"/> <column name="FIRSTNAME" type="VARCHAR(50)"/> <column name="MIDDLENAME" type="VARCHAR(50)"/> - <column name="LASTNAME" type="VARChAR(50)"/> + <column name="LASTNAME" type="VARCHAR(50)"> + <constraints nullable="false"/> + </column> <column name="GENDER" type="VARCHAR(50)"/> <column name="SALUTATION" type="VARCHAR(16)"/> <column name="TITLE" type="VARCHAR(50)"/> diff --git a/process/Comm_lib/Comm_lib.aod b/process/Comm_lib/Comm_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..21ab969d90c667d39fe448d4805b9a95d4994f69 --- /dev/null +++ b/process/Comm_lib/Comm_lib.aod @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.7" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.1.7"> + <name>Comm_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/Comm_lib/process.js</process> +</process> diff --git a/process/Comm_lib/process.js b/process/Comm_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..84b969d635c72e28ad7bffdd2f8b4a03424232b6 --- /dev/null +++ b/process/Comm_lib/process.js @@ -0,0 +1,65 @@ +import("system.translate"); +import("system.net"); +import("system.mail"); +import("system.cti"); + + +/** + * provides somehow static methods for validation of communication data + * do not create an instance of this + */ +function CommValidationUtil(){ +} + +/** + * creates a function depending on a given COMM-category (like PHONE, EMAIL, etc.) or null if no validation-function was defined for the given category + * @param {string} commCategory category that determines which function shall be created, e.g. "EMAIL" + * @return {function} function that receives the following arguments: + * <br/> - commAddress + * <br/> - extensions + * <br/>the function has to return null if everything is OK or a value with details if validation failed + */ +CommValidationUtil.makeValidationFn = function (commCategory){ + var callbackFn; + + switch (commCategory) { + case "EMAIL": + callbackFn = function (addrValue){ +// if (!mail.isValidMailAddress(addrValue)) //TODO: enable JDito-methods +// return translate.text("no valid mail-address format"); + return null; + } + break; + case "LINK": + callbackFn = function (addrValue){ +// if (!net.isValidUrl(addrValue, ["http", "https"]))//TODO: enable JDito-methods +// return translate.text("no valid format"); + return null; + } + break; + case "TELEPHONE": + callbackFn = function (addrValue, ext){ + var country = null; + if (addrValue[0] != "+") //if the number starts with a country-identifier (e.g. +49) no country needs to be specified + country = ext.countryCode; +// if (!cti.isValidPhoneNumber(addrValue, country))//TODO: enable JDito-methods +// return translate.text("no valid phone number"); + return null; + } + break; + default: + callbackFn = null; + break; + } + return callbackFn; +} + +/** + * returns a blueprint for validation extensions; these extensions are needed for validating comm data and can be passed to other functions + * @return {object} a object with properties that have a specific default value; normally you want to overwrite that value + */ +CommValidationUtil.getExtensionsBlueprint = function(){ + return { + countryCode: null + }; +} diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js index 7e8781529f62f054c579424e158129a7a7a8a0c9..d018fbf41aa3d76b6cc9cfcd2b73a16276a8455e 100644 --- a/process/Keyword_lib/process.js +++ b/process/Keyword_lib/process.js @@ -1,352 +1,354 @@ -import("system.translate"); - -/** - * provides methods for interactions with keywords - */ -function KeywordUtils(){ - /** - * returns the default case for keyword-arrays (id and translated name) - * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" - * @return {Array} a 2D array in form of [["id1", "name1"], ["idN", "nameN"]] - * @example - * var kwdUtils, items; - * - * kwdUtils = new KeywordUtils(); - * items = kwdUtils.getStandardArray("ADDRESS.TYPE"); - * result.object(items); - */ - this.getStandardArray = function(keywordType){ - return this.createKeyword(keywordType).toArray(["id", "name"]); - } - - /** - * returns a specific name (translated) - this is normally the view-value - of a given keyword; - * <br/>if the key could not be found an empty string "" is returned - * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" - * @param {String} key id value of the keyword where the view-value shall be searched - * @return {String} representation of the translated name of the keyword-key - * @example - * var kwdUtils, histMedium; - * histMedium = vars.get("$field.MEDIUM"); - * if (histMedium){ - * kwdUtils = new KeywordUtils(); - * result.string(vars.get("$field.SUBJECT") + " (" + kwdUtils.getViewValue("HISTORY.MEDIUM", histMedium) + ")"); - * } - */ - this.getViewValue = function(keywordType, key){ - var k = this.createKeyword(keywordType); - return k.getPropForKey(key, "name") || ""; - } - - /** - * creates an object with methods for interacting with an specific keyword - * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" - * @return {Object} object with the following methods: - * <br/>- toArray - * <br/>- getPropForKey - * <br/>- getPropsForKey - */ - this.createKeyword = function(keywordType){//TODO: rename ot createKeywordObj? - var valueContainer, _toArrayFn, _getPropForKeyFn, _getPropsForKeyFn; - - switch (keywordType){ - case "RELATION.STATUS": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Inactive")) - ,createKeywordEntry("1", translate.text("Active")) - ,createKeywordEntry("2", translate.text("In review")) - ]); - break; - case "COUNTRY": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("DE", translate.text("Germany")) - ,createKeywordEntry("AT", translate.text("Austria")) - ,createKeywordEntry("CH", translate.text("Switzerland")) - ,createKeywordEntry("GB", translate.text("United Kingdom")) - ,createKeywordEntry("NO", translate.text("Norway")) - ]); - break; - case "LANGUAGE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("de", translate.text("German")) - ,createKeywordEntry("de-DE", translate.text("German (Germany)")) - ,createKeywordEntry("de-AT", translate.text("German (Austria)")) - ,createKeywordEntry("en", translate.text("English")) - ,createKeywordEntry("en-GB", translate.text("English (United Kingdom)")) - ,createKeywordEntry("no-NO", translate.text("Norwegian")) - ]); - break; - case "HISTORY.DIRECTION": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("i", translate.text("Incoming")) - ,createKeywordEntry("o", translate.text("Outgoing")) - ]); - break; - case "HISTORY.MEDIUM": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Visit")) - ,createKeywordEntry("1", translate.text("E-Mail")) - ,createKeywordEntry("2", translate.text("Phone")) - ,createKeywordEntry("3", translate.text("Internal")) - ,createKeywordEntry("4", translate.text("Online-Meeting")) - ]); - case "COMM.MEDIUM": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Mobile"), null, {category: "PHONE"}) - ,createKeywordEntry("1", translate.text("E-Mail"), null, {category: "EMAIL"}) - ,createKeywordEntry("2", translate.text("Phone"), null, {category: "PHONE"}) - ,createKeywordEntry("3", translate.text("Internet"), null, {category: "OTHER"}) - ]); - break; - case "ADDRESS.TYPE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Office address")) - ,createKeywordEntry("2", translate.text("Home address")) - ,createKeywordEntry("3", translate.text("Delivery address")) - ,createKeywordEntry("4", translate.text("Post office box")) - ]); - break; - case "ORG.TYPE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Customer")) - ,createKeywordEntry("1", translate.text("Prospect")) - ,createKeywordEntry("2", translate.text("Supplier")) - ,createKeywordEntry("3", translate.text("Other")) - ]); - break; - case "PERS.GENDER": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("f", translate.text("Female")) - ,createKeywordEntry("m", translate.text("Male")) - ,createKeywordEntry("o", translate.text("${GENDER_OTHER}")) - ]); - break; - case "CONTRACT.CONTRACTTYPE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Framework contract")) - ,createKeywordEntry("1", translate.text("Service contract")) - ,createKeywordEntry("2", translate.text("Maintenance contract")) - ]); - break; - case "CONTRACT.CONTRACTSTATUS": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Valid, unlimited")) - ,createKeywordEntry("1", translate.text("Valid, limited")) - ,createKeywordEntry("2", translate.text("Not signed yet")) - ,createKeywordEntry("3", translate.text("None, individual count")) - ,createKeywordEntry("4", translate.text("Cancelled")) - ]); - break; - case "CONTRACT.PAYMENT": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("0", translate.text("Annually")) - ,createKeywordEntry("1", translate.text("Semiannually")) - ,createKeywordEntry("2", translate.text("Quarterly")) - ]); - break; - case "GROUPCODE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Commodity group 1")) - ,createKeywordEntry("2", translate.text("Commodity group 2")) - ,createKeywordEntry("3", translate.text("Commodity group 3")) - ,createKeywordEntry("4", translate.text("Discount")) - ,createKeywordEntry("5", translate.text("Spare parts")) - ,createKeywordEntry("6", translate.text("Service")) - ]); - break; - case "UNIT": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Pieces")) - ,createKeywordEntry("2", translate.text("Kgs")) - ,createKeywordEntry("3", translate.text("Liter")) - ,createKeywordEntry("4", translate.text("Hours")) - ]); - break; - case "PRICELIST": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("${PRICELIST_DEFAULT}")) - ,createKeywordEntry("2", translate.text("Key account")) - ,createKeywordEntry("3", translate.text("Special price list1")) - ,createKeywordEntry("4", translate.text("${PRICELIST_SERVICE}")) - ]); - break; - case "CURRENCY": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("EUR")) - ,createKeywordEntry("2", translate.text("USD")) - ,createKeywordEntry("3", translate.text("CND")) - ,createKeywordEntry("4", translate.text("CHF")) - ]); - break; - case "STOCK.WAREHOUSE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Warehouse 1")) - ,createKeywordEntry("2", translate.text("Warehouse 2")) - ,createKeywordEntry("3", translate.text("Warehouse 3")) - ]); - break; - case "SALESPROJECT.STATUS": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Open")) - ,createKeywordEntry("2", translate.text("Postponed")) - ,createKeywordEntry("3", translate.text("Aborted")) - ,createKeywordEntry("4", translate.text("Partial order")) - ,createKeywordEntry("5", translate.text("Order")) - ,createKeywordEntry("6", translate.text("Lost")) - ]); - break; - case "SALESPROJECT.PHASE": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Project decision")) - ,createKeywordEntry("2", translate.text("Negotiation")) - ,createKeywordEntry("3", translate.text("Workshop")) - ,createKeywordEntry("4", translate.text("Presentation postprocessing")) - ,createKeywordEntry("5", translate.text("Presentation preparation")) - ,createKeywordEntry("6", translate.text("Statement given")) - ,createKeywordEntry("7", translate.text("Specifications in progress")) - ,createKeywordEntry("8", translate.text("Waiting for request")) - ,createKeywordEntry("9", translate.text("Lead")) - ]); - break; - case "OFFER.PROBABILITY": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("0 %"), null, {percentValue: 0}) - ,createKeywordEntry("2", translate.text("25 %"), null, {percentValue: 25}) - ,createKeywordEntry("3", translate.text("50 %"), null, {percentValue: 50}) - ,createKeywordEntry("4", translate.text("75 %"), null, {percentValue: 75}) - ,createKeywordEntry("5", translate.text("100 %"), null, {percentValue: 100}) - ]); - break; - case "OFFER.STATUS": - valueContainer = createKeywordEntriesContainer([ - createKeywordEntry("1", translate.text("Checked")) - ,createKeywordEntry("2", translate.text("Sent")) - ,createKeywordEntry("3", translate.text("Won")) - ,createKeywordEntry("4", translate.text("Lost")) - ]); - break; - default: - throw new Error(translate.withArguments("[%0]the given keyword \"%1\" has no match with the possible keywordlist", [ - arguments.callee.name, keywordType - ])); - break; - } - - - _getPropForKeyFn = function(key, field, isCustom) { - var keyObject; - if (isCustom) - keyObject = valueContainer[key]["customProperties"]; - else - keyObject = valueContainer[key]; - - if (keyObject == undefined) - return undefined; - return keyObject[field]; - }; - - _getPropsForKeyFn = function(key, fields) { - var keyObject, i, l, currentRow, currentField; - - keyObject = valueContainer[key]; - if (keyObject == undefined) - return [];//TODO: throw error instead? - l = fields.length; - currentRow = []; - for (i = 0; i < l; i++){ - currentField = fields[i]; - //check if the passed fieldnames match the existing fieldnames (<=> properties in the object) - //to prevent errors and unexpected behaviour - if (keyObject[currentField]) - currentRow.push(keyObject[currentField]); - else - currentRow.push(""); - } - return currentRow; - }; - - _toArrayFn = function(fields){ - var res, id, currentRow; - - res = []; - if (!fields) - fields = ["id", "name"]; - else if (typeof(fields) == "string"){ - for (id in valueContainer){ - res.push(_getPropForKeyFn(id, fields)); - } - return res; - } - - for (id in valueContainer){ - currentRow = _getPropsForKeyFn(id, fields); - res.push(currentRow); - } - return res; - }; - - return { - /** - * toArray - */ - toArray: _toArrayFn - ,getPropForKey: _getPropForKeyFn - ,getPropsForKey: _getPropsForKeyFn - ,filter: function (callbackFn, thisArg){ - for (id in valueContainer){ - if (false == callbackFn.call(thisArg, valueContainer[id].id, valueContainer[id].name, valueContainer[id].customProperties, - valueContainer[id], valueContainer)){ - delete valueContainer[id]; - } - } - return this; - } - }; - }; - - /** - * internal function for creating an object that represents a keyword entry - * @param {String} id represents the key of an entry; a KeywordEntriesContainer can contain the same key only once - * @param {String} name represents the translated name of an entry; this is in most cases the view-value - * @param {String} [description=""] description text for describing the keyword - * @param {Object} [customProperties=null] an Object with additional properties; these can be virtually anything - * @return {Object} object that represents a single keyword entry; normally severel entries are cumulated in a "keywordEntriesContainer" - */ - function createKeywordEntry(id, name, description, customProperties){ - //TODO: verify if mandatory-checks are really that usefull or can at least be made easier - if (!id) - throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [ - "id", arguments.callee.name - ])); - if (!name) - throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [ - "name", arguments.callee.name - ])); - - return { - id: id - ,name: name - ,description: description || "" - ,customProperties: customProperties - }; - } - - /** - * internal function for creating an object that represents a container of several keywordEntries - * @param {Array} keywordEntries an Array of keywordEntry-objects (as they are created by "createKeywordEntry" - * @return {Object} object that contains several keywordEntries - */ - function createKeywordEntriesContainer(keywordEntries){ - var res, i, l, id; - - res = {}; - for (i = 0, l = keywordEntries.length; i < l; i++){ - id = keywordEntries[i].id; - if (res[id] != undefined){ - throw new Error("the given id is not unique since it already exists"); - } - res[id] = keywordEntries[i]; - } - return res; - } +import("system.translate"); +import("system.neon"); + +/** + * provides methods for interactions with keywords + */ +function KeywordUtils(){ + /** + * returns the default case for keyword-arrays (id and translated name) + * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" + * @return {Array} a 2D array in form of [["id1", "name1"], ["idN", "nameN"]] + * @example + * var kwdUtils, items; + * + * kwdUtils = new KeywordUtils(); + * items = kwdUtils.getStandardArray("ADDRESS.TYPE"); + * result.object(items); + */ + this.getStandardArray = function(keywordType){ + return this.createKeyword(keywordType).toArray(["id", "name"]); + } + + /** + * returns a specific name (translated) - this is normally the view-value - of a given keyword; + * <br/>if the key could not be found an empty string "" is returned + * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" + * @param {String} key id value of the keyword where the view-value shall be searched + * @return {String} representation of the translated name of the keyword-key + * @example + * var kwdUtils, histMedium; + * histMedium = vars.get("$field.MEDIUM"); + * if (histMedium){ + * kwdUtils = new KeywordUtils(); + * result.string(vars.get("$field.SUBJECT") + " (" + kwdUtils.getViewValue("HISTORY.MEDIUM", histMedium) + ")"); + * } + */ + this.getViewValue = function(keywordType, key){ + var k = this.createKeyword(keywordType); + return k.getPropForKey(key, "name") || ""; + } + + /** + * creates an object with methods for interacting with an specific keyword + * @param {String} keywordType specifies the type of the keyword and therefore the list elements; e.g. "COUNTRY" + * @return {Object} object with the following methods: + * <br/>- toArray + * <br/>- getPropForKey + * <br/>- getPropsForKey + * <br/>- filter + */ + this.createKeyword = function(keywordType){//TODO: rename ot createKeywordObj? + var valueContainer, _toArrayFn, _getPropForKeyFn, _getPropsForKeyFn; + + switch (keywordType){ + case "RELATION.STATUS": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Inactive")) + ,createKeywordEntry("1", translate.text("Active")) + ,createKeywordEntry("2", translate.text("In review")) + ]); + break; + case "COUNTRY": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("DE", translate.text("Germany")) + ,createKeywordEntry("AT", translate.text("Austria")) + ,createKeywordEntry("CH", translate.text("Switzerland")) + ,createKeywordEntry("GB", translate.text("United Kingdom")) + ,createKeywordEntry("NO", translate.text("Norway")) + ]); + break; + case "LANGUAGE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("de", translate.text("German")) + ,createKeywordEntry("de-DE", translate.text("German (Germany)")) + ,createKeywordEntry("de-AT", translate.text("German (Austria)")) + ,createKeywordEntry("en", translate.text("English")) + ,createKeywordEntry("en-GB", translate.text("English (United Kingdom)")) + ,createKeywordEntry("no-NO", translate.text("Norwegian")) + ]); + break; + case "HISTORY.DIRECTION": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("i", translate.text("Incoming")) + ,createKeywordEntry("o", translate.text("Outgoing")) + ]); + break; + case "HISTORY.MEDIUM": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Visit")) + ,createKeywordEntry("1", translate.text("E-Mail")) + ,createKeywordEntry("2", translate.text("Phone")) + ,createKeywordEntry("3", translate.text("Internal")) + ,createKeywordEntry("4", translate.text("Online-Meeting")) + ]); + case "COMM.MEDIUM": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Mobile"), null, {category: "PHONE", contentType: "TELEPHONE"}) + ,createKeywordEntry("1", translate.text("E-Mail"), null, {category: "EMAIL", contentType: "EMAIL"}) + ,createKeywordEntry("2", translate.text("Phone"), null, {category: "PHONE", contentType: "TELEPHONE"}) + ,createKeywordEntry("3", translate.text("Internet"), null, {category: "OTHER", contentType: "LINK"}) + ]); + break; + case "ADDRESS.TYPE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Office address")) + ,createKeywordEntry("2", translate.text("Home address")) + ,createKeywordEntry("3", translate.text("Delivery address")) + ,createKeywordEntry("4", translate.text("Post office box")) + ]); + break; + case "ORG.TYPE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Customer")) + ,createKeywordEntry("1", translate.text("Prospect")) + ,createKeywordEntry("2", translate.text("Supplier")) + ,createKeywordEntry("3", translate.text("Other"))//TODO: key as ${} + ]); + break; + case "PERS.GENDER": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("f", translate.text("Female")) + ,createKeywordEntry("m", translate.text("Male")) + ,createKeywordEntry("o", translate.text("${GENDER_OTHER}")) + ]); + break; + case "CONTRACT.CONTRACTTYPE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Framework contract")) + ,createKeywordEntry("1", translate.text("Service contract")) + ,createKeywordEntry("2", translate.text("Maintenance contract")) + ]); + break; + case "CONTRACT.CONTRACTSTATUS": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Valid, unlimited")) + ,createKeywordEntry("1", translate.text("Valid, limited")) + ,createKeywordEntry("2", translate.text("Not signed yet")) + ,createKeywordEntry("3", translate.text("None, individual count")) + ,createKeywordEntry("4", translate.text("Cancelled")) + ]); + break; + case "CONTRACT.PAYMENT": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("0", translate.text("Annually")) + ,createKeywordEntry("1", translate.text("Semiannually")) + ,createKeywordEntry("2", translate.text("Quarterly")) + ]); + break; + case "GROUPCODE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Commodity group 1")) + ,createKeywordEntry("2", translate.text("Commodity group 2")) + ,createKeywordEntry("3", translate.text("Commodity group 3")) + ,createKeywordEntry("4", translate.text("Discount")) + ,createKeywordEntry("5", translate.text("Spare parts")) + ,createKeywordEntry("6", translate.text("Service")) + ]); + break; + case "UNIT": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Pieces")) + ,createKeywordEntry("2", translate.text("Kgs")) + ,createKeywordEntry("3", translate.text("Liter")) + ,createKeywordEntry("4", translate.text("Hours")) + ]); + break; + case "PRICELIST": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("${PRICELIST_DEFAULT}")) + ,createKeywordEntry("2", translate.text("Key account")) + ,createKeywordEntry("3", translate.text("Special price list1")) + ,createKeywordEntry("4", translate.text("${PRICELIST_SERVICE}")) + ]); + break; + case "CURRENCY": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("EUR")) + ,createKeywordEntry("2", translate.text("USD")) + ,createKeywordEntry("3", translate.text("CND")) + ,createKeywordEntry("4", translate.text("CHF")) + ]); + break; + case "STOCK.WAREHOUSE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Warehouse 1")) + ,createKeywordEntry("2", translate.text("Warehouse 2")) + ,createKeywordEntry("3", translate.text("Warehouse 3")) + ]); + break; + case "SALESPROJECT.STATUS": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Open")) + ,createKeywordEntry("2", translate.text("Postponed")) + ,createKeywordEntry("3", translate.text("Aborted")) + ,createKeywordEntry("4", translate.text("Partial order")) + ,createKeywordEntry("5", translate.text("Order")) + ,createKeywordEntry("6", translate.text("Lost")) + ]); + break; + case "SALESPROJECT.PHASE": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Project decision")) + ,createKeywordEntry("2", translate.text("Negotiation")) + ,createKeywordEntry("3", translate.text("Workshop")) + ,createKeywordEntry("4", translate.text("Presentation postprocessing")) + ,createKeywordEntry("5", translate.text("Presentation preparation")) + ,createKeywordEntry("6", translate.text("Statement given")) + ,createKeywordEntry("7", translate.text("Specifications in progress")) + ,createKeywordEntry("8", translate.text("Waiting for request")) + ,createKeywordEntry("9", translate.text("Lead")) + ]); + break; + case "OFFER.PROBABILITY": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("0 %"), null, {percentValue: 0}) + ,createKeywordEntry("2", translate.text("25 %"), null, {percentValue: 25}) + ,createKeywordEntry("3", translate.text("50 %"), null, {percentValue: 50}) + ,createKeywordEntry("4", translate.text("75 %"), null, {percentValue: 75}) + ,createKeywordEntry("5", translate.text("100 %"), null, {percentValue: 100}) + ]); + break; + case "OFFER.STATUS": + valueContainer = createKeywordEntriesContainer([ + createKeywordEntry("1", translate.text("Checked")) + ,createKeywordEntry("2", translate.text("Sent")) + ,createKeywordEntry("3", translate.text("Won")) + ,createKeywordEntry("4", translate.text("Lost")) + ]); + break; + default: + throw new Error(translate.withArguments("[%0]the given keyword \"%1\" has no match with the possible keywordlist", [ + arguments.callee.name, keywordType + ])); + break; + } + + + _getPropForKeyFn = function(key, field, isCustom) { + var keyObject; + if (isCustom) + keyObject = valueContainer[key]["customProperties"]; + else + keyObject = valueContainer[key]; + + if (keyObject == undefined) + return undefined; + return keyObject[field]; + }; + + _getPropsForKeyFn = function(key, fields) { + var keyObject, i, l, currentRow, currentField; + + keyObject = valueContainer[key]; + if (keyObject == undefined) + return [];//TODO: throw error instead? + l = fields.length; + currentRow = []; + for (i = 0; i < l; i++){ + currentField = fields[i]; + //check if the passed fieldnames match the existing fieldnames (<=> properties in the object) + //to prevent errors and unexpected behaviour + if (keyObject[currentField]) + currentRow.push(keyObject[currentField]); + else + currentRow.push(""); + } + return currentRow; + }; + + _toArrayFn = function(fields){ + var res, id, currentRow; + + res = []; + if (!fields) + fields = ["id", "name"]; + else if (typeof(fields) == "string"){ + for (id in valueContainer){ + res.push(_getPropForKeyFn(id, fields)); + } + return res; + } + + for (id in valueContainer){ + currentRow = _getPropsForKeyFn(id, fields); + res.push(currentRow); + } + return res; + }; + + return { + /** + * toArray + */ + toArray: _toArrayFn + ,getPropForKey: _getPropForKeyFn + ,getPropsForKey: _getPropsForKeyFn + ,filter: function (callbackFn, thisArg){ + for (id in valueContainer){ + if (false == callbackFn.call(thisArg, valueContainer[id].id, valueContainer[id].name, valueContainer[id].customProperties, + valueContainer[id], valueContainer)){ + delete valueContainer[id]; + } + } + return this; + } + }; + }; + + /** + * internal function for creating an object that represents a keyword entry + * @param {String} id represents the key of an entry; a KeywordEntriesContainer can contain the same key only once + * @param {String} name represents the translated name of an entry; this is in most cases the view-value + * @param {String} [description=""] description text for describing the keyword + * @param {Object} [customProperties=null] an Object with additional properties; these can be virtually anything + * @return {Object} object that represents a single keyword entry; normally severel entries are cumulated in a "keywordEntriesContainer" + */ + function createKeywordEntry(id, name, description, customProperties){ + //TODO: verify if mandatory-checks are really that usefull or can at least be made easier + if (!id) + throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [ + "id", arguments.callee.name + ])); + if (!name) + throw new Error(translate.withArguments("the param \"%0\" in \"%1\" is mandatory and has to be set", [ + "name", arguments.callee.name + ])); + + return { + id: id + ,name: name + ,description: description || "" + ,customProperties: customProperties + }; + } + + /** + * internal function for creating an object that represents a container of several keywordEntries + * @param {Array} keywordEntries an Array of keywordEntry-objects (as they are created by "createKeywordEntry" + * @return {Object} object that contains several keywordEntries + */ + function createKeywordEntriesContainer(keywordEntries){ + var res, i, l, id; + + res = {}; + for (i = 0, l = keywordEntries.length; i < l; i++){ + id = keywordEntries[i].id; + if (res[id] != undefined){ + throw new Error("the given id is not unique since it already exists"); + } + res[id] = keywordEntries[i]; + } + return res; + } } \ No newline at end of file diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js index d142a7bc54e17f5950585a38c7fdd81f56c0ace9..b7c05285b8fb45833a699b54a8901fae47fab9e7 100644 --- a/process/Offer_lib/process.js +++ b/process/Offer_lib/process.js @@ -30,4 +30,51 @@ function OfferUtils(){ this.getOfferNumberValidationFailString = function(){ return translate.text("The offer number already exists!"); } + + this.getOfferNetAndVAT = function(pOfferId, pOfferitemIdToDel){ + //TODO: Bessere Möglichkeit als per SQL die zugehörigen Posten aus der DB zu holen? + var sum = 0; + var vat = 0; + var oiUtils = new OfferItemUtils(); + + var condition = "where OFFER_ID = '" + pOfferId + "'"; + if(pOfferitemIdToDel != undefined) + condition += " and OFFERITEMID <> '" + pOfferitemIdToDel + "'"; + + var offerItems = db.table("select QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL " + + "from OFFERITEM " + condition); + + for(var i = 0; i < offerItems.length; i++){ + sum += oiUtils.getItemSum(offerItems[i][0], offerItems[i][1], offerItems[i][2], offerItems[i][4]); + vat += oiUtils.getItemVAT(offerItems[i][0], offerItems[i][1], offerItems[i][2], offerItems[i][3], offerItems[i][4]); + } + + return [sum, vat]; + } +} + +function OfferItemUtils(){ + + this.getItemSum = function(pQuantity, pPrice, pDiscount, pOptional){ + + pQuantity = pQuantity || 0; + pPrice = pPrice || 0; + pDiscount = pDiscount || 0; + + return Number(pOptional) * parseFloat(pQuantity) * parseFloat(pPrice) * ((100 - parseFloat(pDiscount)) / 100); + } + + this.getItemVAT = function(pQuantity, pPrice, pDiscount, pVAT, pOptional){ + + pQuantity = pQuantity || 0; + pPrice = pPrice || 0; + pDiscount = pDiscount || 0; + pVAT = pVAT || 0; + + return Number(pOptional) * parseFloat(pQuantity) * parseFloat(pPrice) * ((100 - parseFloat(pDiscount)) / 100) * (parseFloat(pVAT) / 100); + } + + this.roundPrice = function(pPrice){ + return eMath.roundDec(pPrice, 2, eMath.ROUND_HALF_UP); + } } \ No newline at end of file diff --git a/process/Product_lib/process.js b/process/Product_lib/process.js index dd841c2a86f1b5d8c279ffebd4902d8950f292d4..0d4f9f1d184b6c6b5d8254fbe04322d3e3c0c947 100644 --- a/process/Product_lib/process.js +++ b/process/Product_lib/process.js @@ -64,4 +64,120 @@ function ProductUtils() throw new Error();//TODO: add message } } + + /** + * Delivers the stock + * + * @param pPid {String} ProductID + * + * @example productUtils.getStockCount(vars.get("$field.PRODUCTID")) + * + * @result {String} stock count + */ + this.getProductDetails = function( pPid, pPriceListFilter ) + { + var ProductDetails = {}; + + var cols = []; + var colsProduct = ["PRODUCT.PRODUCTID", "PRODUCT.PRODUCTNAME", "PRODUCT.GROUPCODEID", "PRODUCT.UNIT"]; + cols = cols.concat(colsProduct); + + var joins = []; + var conditions = ["1=1"]; + var orderby = ["PRODUCTID"]; + var sqltypes = []; + + //Prod2Prod + //TODO: get product structure + + //PriceList + if(pPriceListFilter != undefined + && pPriceListFilter.currency != undefined && pPriceListFilter.currency != "" + && pPriceListFilter.quantity != undefined && pPriceListFilter.quantity != "") + { + var colsPricelist = ["PRODUCTPRICE.PRODUCTPRICEID", "PRODUCTPRICE.RELATION_ID", "PRODUCTPRICE.PRICELIST", "PRODUCTPRICE.PRICE", "PRODUCTPRICE.VAT"]; + cols = cols.concat(colsPricelist); + joins.push(" left join PRODUCTPRICE on PRODUCTPRICE.PRODUCT_ID = PRODUCTID " + + " and PRODUCTPRICE.CURRENCY = " + pPriceListFilter.currency + + " and PRODUCTPRICE.VALID_FROM <= ? and (PRODUCTPRICE.VALID_TO > ? or PRODUCTPRICE.VALID_TO is null) " + + " and PRODUCTPRICE.FROMQUANTITY <= " + pPriceListFilter.quantity + + " and (PRODUCTPRICE.RELATION_ID = '" + pPriceListFilter.relationId + "' or (PRODUCTPRICE.RELATION_ID is null and PRODUCTPRICE.BUYSELL = 'SP')) "); + + sqltypes.push([datetime.date().toString(), SQLTYPES.TIMESTAMP]); + sqltypes.push([datetime.date().toString(), SQLTYPES.TIMESTAMP]); + orderby = orderby.concat(["PRODUCTPRICE.VALID_FROM desc, PRODUCTPRICE.FROMQUANTITY desc"]); + } + + var ProductDataSql = "select " + cols.join(", ") + + " from PRODUCT " + + joins.join(" ") + + " where PRODUCTID = '" + pPid + "' " + + " and " + conditions.join(" and ") + + " order by " + orderby.join(", "); + + + var ProductData = db.table([ProductDataSql, sqltypes]); + + for(var i = 0; i < ProductData.length; i++) + { + //Product + if(ProductDetails[ProductData[i][0]] == undefined) + { + ProductDetails[ProductData[i][0]] = { + productId: ProductData[i][0] + , productName: ProductData[i][1] + , groupCode: ProductData[i][2] + , unit: ProductData[i][3] + , Prod2Prod: {} + , CurrentValidPriceLists: {} + , PriceListToUse: null + }; + } + //Pricelist + var colIdx = colsProduct.length; + if(ProductData[i][colIdx] != "") //Pricelist found + { + ProductDetails[ProductData[i][0]].CurrentValidPriceLists[ProductData[i][colIdx]] = { + priceListId: ProductData[i][colIdx++] + , relationId: ProductData[i][colIdx++] + , priceList: ProductData[i][colIdx++] + , price: ProductData[i][colIdx++] + , vat: ProductData[i][colIdx++] + } + } + } + + ProductDetails[pPid].PriceListToUse = _getPriceListToUse(ProductDetails[pPid].CurrentValidPriceLists, pPriceListFilter); + + return ProductDetails; + + + function _getPriceListToUse(pPriceLists, pPriceListFilter) + { + for(var list in pPriceLists) + { + //customer specific price (defined in Org -> Conditions) + if(pPriceListFilter.relationId != "" && pPriceListFilter.relationId == pPriceLists[list].relationId) + { + return pPriceLists[list]; + } + //customer deposited price list (defined by Attribute) + if(pPriceListFilter.priceList != "" && pPriceListFilter.priceList == pPriceLists[list].priceList) + { + return pPriceLists[list]; + } + //default price list + if(pPriceLists[list].priceList == "1") + { + return pPriceLists[list]; + } + } + + //no valid price list found + return null; + } + } + + + } \ No newline at end of file diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index 9187a8f49e56fa987f4fb7cb83c30a79153dfda4..4181790956d0d67fc930d95ce5d5e75d4ad2f20e 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -4,7 +4,8 @@ import("system.db"); import("system.datetime"); import("system.tools"); import("system.SQLTYPES"); -import("Util_lib") +import("system.text"); +import("Util_lib"); /** * Object for easier handling of conditions; @@ -12,8 +13,10 @@ import("Util_lib") * you don't need to append a "1=1" condition or similar; * @example //TODO: add missing example */ -function SqlCondition(){ +function SqlCondition(alias){ this._sqlStorage = ""; + this.preparedValues = []; + this.alias = alias; } /** * append with SQL-and; no paranthesize of existing conditions is done @@ -28,6 +31,22 @@ SqlCondition.prototype.and = function(cond){ this._sqlStorage += cond; return this; } + +/** + * same as the "and"-function but with preparedStatement functionality + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.andPrepare = function(field, cond, value, fieldType){ + cond = this._prepare(field, cond, value, fieldType); + return this.and(cond); +} + /** * append with SQL-or; Also paranthesize the existing conditions * @param {String} cond the condition string which shall be appended @@ -42,6 +61,21 @@ SqlCondition.prototype.or = function(cond){ this._sqlStorage = cond; return this; } + +/** + * same as the "or"-function but with preparedStatement functionality + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {Object} current SqlCondition-object + */ +SqlCondition.prototype.orPrepare = function(field, cond, value, fieldType){ + cond = this._prepare(field, cond, value, fieldType); + return this.or(cond); +} /** * ready to use string; does not contain a where keyword at the beginning * @param {String} alternativeCond condition that is returned when nothing has been appended @@ -66,6 +100,44 @@ SqlCondition.prototype.toWhereString = function(alternativeCond){ return cond; } +/** + * hidden function for composing preparedStatements + * @param {String} field the database field as "tablename.columnname"; e.g. "ORG.NAME" + * @param {String} cond the strucutre of the SQL condition as preparedString, you can use a number sign "#" as placeholder for you fieldname; + * e.g. "# > ?"; escaping the number sign is possible with a backslash "\" + * @param {String} value the value that shall be set into the prepared statement + * @param {Numeric} [fieldType] SQL-column-type; if the fieldType is not given it's loaded automatically; + * please note that this can be a performace issue if it happens a lot of times (e.g. in aloop) + * @return {String} the replaced SQL-condition string (replace # by the fieldname) + */ +SqlCondition.prototype._prepare = function(field, cond, value, fieldType){ + //this function looks more complex (and slower) than it actually is + /* the following regex looks like this after javascript-escaping of the backslash: (?<!\\)((?:\\\\)*)# + the regexp searches for the unescaped character and these characters are replaced by the field name + + examples: + --------------------- + | # --match | + | \# --no-match | + | \\# --match | + | \\\# --no-match | + | \\\\# --match | + --------------------- + */ + //use replaceAll because it's faster and supports negative lookbehinds + cond = text.replaceAll(cond, { + //manually readd the replaced backslashes by using a group reference, because they a part of the match and therefore replaced by "replaceAll" + //since the field COULD contain already a group reference (I think this is extremely uncommon; + //probably that never happens but better stay save): escape that references within the fieldname + "(?<!\\\\)((?:\\\\\\\\)*)#": "$1" + text.replaceAll(field, {"$1": "\\$1"}), + //now that we've replaced the correct field placeholder let's replace the escaped number sign "\#" to a normal number sign "#" + "\\\\#": "#" + }); + type = fieldType || SqlUtils.getSingleColumnType(field, undefined, this.alias); + this.preparedValues.push([value.toString(), type]); + return cond; +} + function SqlMaskingUtils(){ //TODO: use callbacks for different handling? /** @@ -218,6 +290,42 @@ function SqlMaskingUtils(){ } } +function SqlUtils(){ +} + +SqlUtils.getSingleColumnType = function(fieldOrTableName, columnName, alias) +{ + var tableName, fieldVarType; + if (columnName == undefined){ + fieldVarType = typeof(fieldOrTableName); + if (fieldVarType == "string") + fieldOrTableName = text.split(fieldOrTableName, "\\."); + else if (fieldVarType != "object"){ + throw new TypeError();//TODO: add message + } + + if (fieldOrTableName.hasOwnProperty("length") && fieldOrTableName.length == 2) + { + tableName = fieldOrTableName[0]; + columnName = fieldOrTableName[1]; + } + else + throw new TypeError();//TODO: add message + } + else + tableName = fieldOrTableName; + + if (typeof(columnName) != "string") + throw new TypeError();//TODO: add message + if (typeof(tableName) != "string") + throw new TypeError();//TODO: add message + + if (alias == undefined) + alias = db.getCurrentAlias(); + + return db.getColumnTypes(tableName, [columnName], alias)[0]; +} + /** *Class containing utilities for SQL *@deprecated use SqlMaskingUtils