From 4c91ee645ac23db6b0c8626e24c18740fdfae97c Mon Sep 17 00:00:00 2001 From: Johannes Hoermann <j.hoermann@adito.de> Date: Thu, 25 Apr 2019 14:12:49 +0200 Subject: [PATCH] Kampagnenkostenberechnung + ein paar fixes --- .../CampaignCost_entitiy.aod | 14 +++++ .../countparticipants/valueProcess.js | 12 ++++ .../netperparticipant/titleProcess.js | 4 ++ .../netperparticipant/valueProcess.js | 11 ++++ entity/CampaignStep_entity/titleProcess.js | 3 +- entity/Campaign_entity/Campaign_entity.aod | 10 ++++ .../date_end/displayValueProcess.js | 2 +- .../date_start/displayValueProcess.js | 2 +- .../cost.value/expression.js | 3 + .../_____LANGUAGE_EXTRA.aod | 3 + .../_____LANGUAGE_de/_____LANGUAGE_de.aod | 7 +++ .../_____LANGUAGE_en/_____LANGUAGE_en.aod | 14 +---- .../CampaignCostFilter_view.aod | 8 +++ .../CampaignPreview_view.aod | 4 ++ process/Campaign_lib/process.js | 57 ++++++++++++------- 15 files changed, 118 insertions(+), 36 deletions(-) create mode 100644 entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js create mode 100644 entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js create mode 100644 entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js create mode 100644 entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod index 6f2dff01cc..a280adae7f 100644 --- a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod +++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod @@ -185,6 +185,20 @@ <expose v="true" /> <description>PARAMETER</description> </entityParameter> + <entityField> + <name>netPerParticipant</name> + <contentType>NUMBER</contentType> + <outputFormat>#,##0.00</outputFormat> + <titleProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js</titleProcess> + <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>countParticipants</name> + <title>Participants</title> + <contentType>NUMBER</contentType> + <outputFormat>#0</outputFormat> + <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js</valueProcess> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> diff --git a/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js new file mode 100644 index 0000000000..6952bc19fb --- /dev/null +++ b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js @@ -0,0 +1,12 @@ +import("system.result"); +import("system.vars"); +import("Campaign_lib"); + +if (vars.get("$field.CAMPAIGNSTEP_ID")) +{ + result.string(CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID"))); +} +else +{ + result.string(CampaignUtils.getParticipantCount(vars.get("$field.CAMPAIGN_ID"))); +} \ No newline at end of file diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js new file mode 100644 index 0000000000..fc36199cca --- /dev/null +++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/titleProcess.js @@ -0,0 +1,4 @@ +import("system.translate"); +import("system.result"); + +result.string(translate.text("Cost") + " " + translate.text("per") + " " + translate.text("Participant")); \ No newline at end of file diff --git a/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js new file mode 100644 index 0000000000..21c3501692 --- /dev/null +++ b/entity/CampaignCost_entitiy/entityfields/netperparticipant/valueProcess.js @@ -0,0 +1,11 @@ +import("system.vars"); +import("system.result"); +import("system.eMath"); + +var netto = parseFloat(vars.get("$field.NET")); +var countParticipants = parseFloat(vars.get("$field.countParticipants")); + +if (countParticipants > 0) + result.string(eMath.roundDec(netto / countParticipants, 2, eMath.ROUND_HALF_UP)); +else + result.string(0); \ No newline at end of file diff --git a/entity/CampaignStep_entity/titleProcess.js b/entity/CampaignStep_entity/titleProcess.js index 33f139bb3d..429260276f 100644 --- a/entity/CampaignStep_entity/titleProcess.js +++ b/entity/CampaignStep_entity/titleProcess.js @@ -1,4 +1,5 @@ +import("Context_lib"); import("system.result"); import("system.vars"); -result.string(vars.getString("$field.NAME")); \ No newline at end of file +result.string(ContextUtils.prefixWithCurrentContextTitle(vars.getString("$field.NAME"))); \ No newline at end of file diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod index 9ccbae20b8..1fbad7abc9 100644 --- a/entity/Campaign_entity/Campaign_entity.aod +++ b/entity/Campaign_entity/Campaign_entity.aod @@ -191,6 +191,12 @@ </entityParameter> </children> </entityConsumer> + <entityField> + <name>COST</name> + <title>Cost</title> + <contentType>NUMBER</contentType> + <outputFormat>#,##0.00</outputFormat> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -247,6 +253,10 @@ <name>CAMPAIGNID.value</name> <recordfield>CAMPAIGN.CAMPAIGNID</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COST.value</name> + <expression>%aditoprj%/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js</expression> + </dbRecordFieldMapping> </recordFieldMappings> </dbRecordContainer> </recordContainers> diff --git a/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js index eeaf6b9c01..af009bc993 100644 --- a/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js +++ b/entity/Campaign_entity/entityfields/date_end/displayValueProcess.js @@ -6,7 +6,7 @@ if(vars.exists("$field.CAMPAIGNID") && vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null) { var capmaignId = vars.get("$field.CAMPAIGNID"); - var campaignStepEndDate = getCampaignEndDate(capmaignId); + var campaignStepEndDate = CampaignUtils.getCampaignEndDate(capmaignId); result.string(campaignStepEndDate); } \ No newline at end of file diff --git a/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js index 2fa5058ade..fd8b8586af 100644 --- a/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js +++ b/entity/Campaign_entity/entityfields/date_start/displayValueProcess.js @@ -6,7 +6,7 @@ if(vars.exists("$field.CAMPAIGNID") && vars.get("$field.CAMPAIGNID") != "" && vars.get("$field.CAMPAIGNID") != null) { var capmaignId = vars.get("$field.CAMPAIGNID"); - var campaignStepStartDate = getCampaignStartDate(capmaignId); + var campaignStepStartDate = CampaignUtils.getCampaignStartDate(capmaignId); result.string(campaignStepStartDate); } \ No newline at end of file diff --git a/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js new file mode 100644 index 0000000000..cecf6e4f7c --- /dev/null +++ b/entity/Campaign_entity/recordcontainers/db/recordfieldmappings/cost.value/expression.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string("(select sum(NET) from CAMPAIGNCOST where CAMPAIGNCOST.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID)") \ No newline at end of file diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index 3df60c9058..7d36afb0e9 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -3084,6 +3084,9 @@ <entry> <key>Fix cost</key> </entry> + <entry> + <key>per</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 c53a7ea555..7ea7f13841 100644 --- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod +++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod @@ -3893,6 +3893,7 @@ </entry> <entry> <key>Participant</key> + <value>Teilnehmer/in</value> </entry> <entry> <key>Printing costs</key> @@ -3928,9 +3929,15 @@ </entry> <entry> <key>Step</key> + <value>Stufe</value> </entry> <entry> <key>Fix cost</key> + <value>Fixkosten</value> + </entry> + <entry> + <key>per</key> + <value>pro</value> </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod index 7238483c5a..dc64f28a58 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -3119,19 +3119,7 @@ <value>Webservice not available. URL: %0 %1</value> </entry> <entry> - <key>file '%0' cannot be read</key> - </entry> - <entry> - <key>Importer</key> - </entry> - <entry> - <key>yyyy-MM-dd HH:mm:ss</key> - </entry> - <entry> - <key>file '%0' does not exist or you have got no permission on this file</key> - </entry> - <entry> - <key>Zip</key> + <key>per</key> </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod index b2e97e0bfd..d3aa701691 100644 --- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod +++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod @@ -21,6 +21,14 @@ <name>457caff8-0403-425f-839c-62e5d05fe3a1</name> <entityField>CATEGORY</entityField> </neonTableColumn> + <neonTableColumn> + <name>f8c6439c-9536-477b-af19-26719902e12e</name> + <entityField>netPerParticipant</entityField> + </neonTableColumn> + <neonTableColumn> + <name>8239e81b-d69c-4ea9-b55d-83e79d1693cf</name> + <entityField>countParticipants</entityField> + </neonTableColumn> <neonTableColumn> <name>2adbd887-f1df-43ff-bde9-12c8273af7a9</name> <entityField>NET</entityField> diff --git a/neonView/CampaignPreview_view/CampaignPreview_view.aod b/neonView/CampaignPreview_view/CampaignPreview_view.aod index 8eee0f9271..4ca3d91f4f 100644 --- a/neonView/CampaignPreview_view/CampaignPreview_view.aod +++ b/neonView/CampaignPreview_view/CampaignPreview_view.aod @@ -31,6 +31,10 @@ <name>a52607c9-da9c-4894-acc6-f31024510d6d</name> <entityField>DATE_END</entityField> </entityFieldLink> + <entityFieldLink> + <name>87b03a62-3508-4267-afd6-95428f0d1f8d</name> + <entityField>COST</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js index ced1497caf..eb04a8ad3e 100644 --- a/process/Campaign_lib/process.js +++ b/process/Campaign_lib/process.js @@ -70,6 +70,18 @@ CampaignUtils.getParticipantCountForStep = function(pCampaignStepId) return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignStepId, defaultValue); } +/** + * todo + */ +CampaignUtils.getParticipantCount = function(pCampaignId) +{ + let selectQuery = "select count(*) from CAMPAIGNPARTICIPANT"; + let conditionField = "CAMPAIGNPARTICIPANT.CAMPAIGN_ID"; + let defaultValue = 0; + + return _CampaignUtils._loadSingleValueFromDb(selectQuery, conditionField, pCampaignId, defaultValue); +} + /** * todo */ @@ -114,7 +126,7 @@ CampaignUtils.createLogEntry = function(pCampaignId, pCampaignStepId, pContactId */ CampaignUtils.getParticipantLogInsertColumnNames = function() { - return new Array("CAMPAIGNPARTICIPANT_ID", "CAMPAIGN_ID", "CAMPAIGNSTEP_ID", "CAMPAIGNPARTICIPANTLOGID", "USER_NEW", "DATE_NEW"); + return ["CAMPAIGNPARTICIPANT_ID", "CAMPAIGN_ID", "CAMPAIGNSTEP_ID", "CAMPAIGNPARTICIPANTLOGID", "USER_NEW", "DATE_NEW"]; } /** @@ -148,6 +160,29 @@ CampaignUtils.getDefaultCampaignStep = function(pCampaignId) return db.cell(selectQuery) } +/** + * todo + */ +CampaignUtils.getCampaignStartDate = function(pCapmaignId) +{ + var campaignIdCondition = SqlCondition.begin() + .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId); + // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row + return db.cell(campaignIdCondition.buildSql("SELECT DATE_START, SORTING FROM ADITO.CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY")); +} + +/** + * todo + */ +CampaignUtils.getCampaignEndDate = function(pCapmaignId) +{ + var campaignIdCondition = SqlCondition.begin() + .andPrepare("CAMPAIGNSTEP.CAMPAIGN_ID", pCapmaignId); + + // TODO: Fetch first 1 rows only will not work with all dbms! Maybe just remove it, because db.cell always uses only the first row + return db.cell(campaignIdCondition.buildSql("SELECT DATE_END, SORTING FROM CAMPAIGNSTEP", "1=2", "order by SORTING ASC FETCH FIRST 1 ROWS ONLY")); +} + /** * Methods for campaignmanagement. * Do not create an instance of this! @@ -186,29 +221,11 @@ _CampaignUtils._openAddParticipantContext = function(pContext, pRowIds, pEntityP _CampaignUtils._loadSingleValueFromDb = function(pSelectQuery, pConditionField, pConditionValue, pDefaultValue) { let res = pDefaultValue; - if (pConditionValue != null && pConditionValue != "null" && pConditionValue != "") + if (pConditionValue) { res = db.cell(SqlCondition.begin() .andPrepare(pConditionField, pConditionValue) .buildSql(pSelectQuery)); } return res; -} - -/** - * todo - */ -function getCampaignStartDate(pCapmaignId) -{ - var dateStartQuery = "SELECT DATE_START, SORTING FROM ADITO.CAMPAIGNSTEP where CAMPAIGN_ID = '"+ pCapmaignId +"' order by SORTING ASC FETCH FIRST 1 ROWS ONLY"; - return db.cell(dateStartQuery); -} - -/** - * todo - */ -function getCampaignEndDate(pCapmaignId) -{ - var dateEndQuery = "SELECT DATE_END, SORTING FROM ADITO.CAMPAIGNSTEP where CAMPAIGN_ID = '"+ pCapmaignId +"' order by SORTING DESC FETCH FIRST 1 ROWS ONLY"; - return db.cell(dateEndQuery); } \ No newline at end of file -- GitLab