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