From 09ace0ff041f090c32ab4c0b92151dddb5a2d112 Mon Sep 17 00:00:00 2001
From: Johannes Hoermann <j.hoermann@adito.de>
Date: Thu, 25 Apr 2019 12:06:59 +0200
Subject: [PATCH] CampaignCosts

---
 .../create_campaignState.xml                  |   2 +-
 .../create_campaignStepState.xml              |   2 +-
 .../CampaignCost_entitiy.aod                  | 102 ++++++++++++++++++
 .../alter/children/edit/onActionProcess.js    |   7 ++
 .../campaign_id/displayValueProcess.js        |   9 ++
 .../entityfields/campaign_id/valueProcess.js  |   8 ++
 .../campaignstep_id/displayValueProcess.js    |  16 +++
 .../campaignstep_id/valueProcess.js           |   8 ++
 .../category/displayValueProcess.js           |   6 ++
 .../containername_param/valueProcess.js       |   4 +
 .../target_context/valueProcess.js            |  11 ++
 .../entityfields/target_rowid/valueProcess.js |  11 ++
 .../recordcontainers/db/conditionProcess.js   |  11 ++
 .../category.displayvalue/expression.js       |   6 ++
 .../CampaignStep_entity.aod                   |  20 ++++
 .../children/campaignid_param/valueProcess.js |   4 +
 .../campaignstepid_param/valueProcess.js      |   4 +
 .../entityfields/state/displayValueProcess.js |   2 +-
 entity/Campaign_entity/Campaign_entity.aod    |   6 ++
 .../children/campaignid_param/valueProcess.js |   4 +
 .../KeywordEntry_entity.aod                   |   6 ++
 .../_____LANGUAGE_EXTRA.aod                   |  13 +--
 .../_____LANGUAGE_de/_____LANGUAGE_de.aod     |  13 +--
 .../_____LANGUAGE_en/_____LANGUAGE_en.aod     |   6 ++
 .../CampaignCostEdit_view.aod                 |   8 --
 .../CampaignCostFilter_view.aod               |   2 +-
 .../CampaignStepMain_view.aod                 |   5 +
 process/KeywordRegistry_basic/process.js      |   1 +
 28 files changed, 263 insertions(+), 34 deletions(-)
 create mode 100644 entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/target_context/valueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/entityfields/target_rowid/valueProcess.js
 create mode 100644 entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
 create mode 100644 entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
 create mode 100644 entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
 create mode 100644 entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js
 create mode 100644 entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js

diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml
index 6b0cdb1acc..ead502807a 100644
--- a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignState.xml
@@ -9,7 +9,7 @@
             <column name="CONTAINER" value="CampaignManagementStates"/>
             <column name="SORTING" valueNumeric="1"/>
             <column name="ISACTIVE" valueNumeric="1"/>
-            <column name="ISESSENTIAL" valueNumeric="0"/>
+            <column name="ISESSENTIAL" valueNumeric="1"/>
         </insert>
         <insert tableName="AB_KEYWORD_ENTRY">
             <column name="AB_KEYWORD_ENTRYID" value="3e5036a1-43a1-4bb1-ad56-ed42df7c9538"/>
diff --git a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml
index f6f76c455b..c7560f94c6 100644
--- a/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml
+++ b/.liquibase/Data_alias/basic/2019.2/CampaignManagement/create_campaignStepState.xml
@@ -9,7 +9,7 @@
             <column name="CONTAINER" value="CampaignManagementStepStates"/>
             <column name="SORTING" valueNumeric="1"/>
             <column name="ISACTIVE" valueNumeric="1"/>
-            <column name="ISESSENTIAL" valueNumeric="0"/>
+            <column name="ISESSENTIAL" valueNumeric="1"/>
         </insert>
         <insert tableName="AB_KEYWORD_ENTRY">
             <column name="AB_KEYWORD_ENTRYID" value="b1f5ea38-1b8c-47a8-a8ad-4c6ed9c26cda"/>
diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
index 86082df736..6f2dff01cc 100644
--- a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
+++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
@@ -9,28 +9,41 @@
     </entityProvider>
     <entityField>
       <name>CAMPAIGNCOSTID</name>
+      <mandatory v="true" />
       <searchable v="false" />
       <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>CAMPAIGN_ID</name>
       <title>Campaign</title>
+      <consumer>Campaigns</consumer>
+      <mandatory v="true" />
       <groupable v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>CAMPAIGNSTEP_ID</name>
       <title>Campaign Step</title>
+      <consumer>CampaignSteps</consumer>
       <groupable v="true" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>CATEGORY</name>
       <title>Category</title>
+      <consumer>KeywordCampaignManagementCostCategory</consumer>
+      <mandatory v="true" />
       <groupable v="true" />
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
       <name>NET</name>
       <title>Cost</title>
       <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <mandatory v="true" />
     </entityField>
     <entityField>
       <name>USER_NEW</name>
@@ -57,6 +70,8 @@
     <entityProvider>
       <name>CampaignCosts</name>
       <fieldType>DEPENDENCY_IN</fieldType>
+      <targetContextField>TARGET_CONTEXT</targetContextField>
+      <targetIdField>TARGET_ROWID</targetIdField>
       <dependencies>
         <entityDependency>
           <name>7131288b-af5c-4914-96f5-c5d70217fc23</name>
@@ -65,10 +80,41 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityProvider>
       <name>StepCosts</name>
       <fieldType>DEPENDENCY_IN</fieldType>
+      <targetContextField>TARGET_CONTEXT</targetContextField>
+      <targetIdField>TARGET_ROWID</targetIdField>
+      <dependencies>
+        <entityDependency>
+          <name>af147f3e-a1bd-4eb0-9ac8-325dbdaba17d</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="true" />
+          <mandatory v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+      </children>
     </entityProvider>
     <entityConsumer>
       <name>Campaigns</name>
@@ -88,11 +134,63 @@
         <fieldName>CampaignSteps</fieldName>
       </dependency>
     </entityConsumer>
+    <entityConsumer>
+      <name>KeywordCampaignManagementCostCategory</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>KeywordEntry_entity</entityName>
+        <fieldName>SpecificContainerKeywords</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>ContainerName_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
+    <entityActionGroup>
+      <name>alter</name>
+      <children>
+        <entityActionField>
+          <name>edit</name>
+          <fieldType>ACTION</fieldType>
+          <onActionProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js</onActionProcess>
+          <isSelectionAction v="true" />
+          <iconId>NEON:PENCIL</iconId>
+        </entityActionField>
+      </children>
+    </entityActionGroup>
+    <entityParameter>
+      <name>CampaignId_param</name>
+      <expose v="true" />
+      <mandatory v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityParameter>
+      <name>CampaignStepId_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>TARGET_CONTEXT</name>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/target_context/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>TARGET_ROWID</name>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/target_rowid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>Uid_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
       <name>db</name>
       <alias>Data_alias</alias>
+      <conditionProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js</conditionProcess>
       <linkInformation>
         <linkInformation>
           <name>70824b95-c84c-406c-89df-c5b9bb379b08</name>
@@ -139,6 +237,10 @@
           <name>USER_NEW.value</name>
           <recordfield>CAMPAIGNCOST.USER_NEW</recordfield>
         </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.displayValue</name>
+          <expression>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js</expression>
+        </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
   </recordContainers>
diff --git a/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js b/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js
new file mode 100644
index 0000000000..2f19601f3e
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/alter/children/edit/onActionProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+
+var params = {
+    "Uid_param" : vars.get("$sys.uid")
+}
+neon.openContext("CampaignCost", "CampaignCostEdit_view", null, neon.OPERATINGSTATE_EDIT, params);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js
new file mode 100644
index 0000000000..12ea2ba316
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaign_id/displayValueProcess.js
@@ -0,0 +1,9 @@
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignId = vars.get("$field.CAMPAIGN_ID");
+var campaignName = CampaignUtils.getCampaignNameById(campaignId);
+
+result.string(campaignName);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js
new file mode 100644
index 0000000000..aae29913f6
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaign_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.CampaignId_param") && vars.get("$param.CampaignId_param"))
+{
+    result.string(vars.get("$param.CampaignId_param"));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
new file mode 100644
index 0000000000..ad91b8afb4
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
@@ -0,0 +1,16 @@
+import("system.translate");
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+var campaignStepId = vars.get("$field.CAMPAIGNSTEP_ID");
+if (campaignStepId)
+{
+    var campaignStepName = CampaignUtils.getCampaignStepNameById(campaignStepId);
+    result.string(translate.text("Step") + ": " + campaignStepName);
+}
+else
+{
+    result.string(translate.text("Fix cost"));
+}
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js
new file mode 100644
index 0000000000..f4a91495ca
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.exists("$param.CampaignStepId_param") && vars.get("$param.CampaignStepId_param"))
+{
+    result.string(vars.get("$param.CampaignStepId_param"));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js b/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js
new file mode 100644
index 0000000000..96536279ef
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/category/displayValueProcess.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("system.vars");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepCostCategory(), vars.get("$this.value")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js
new file mode 100644
index 0000000000..7a66c85298
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/containername_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("KeywordRegistry_basic");
+
+result.string($KeywordRegistry.campaignStepCostCategory());
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/target_context/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/target_context/valueProcess.js
new file mode 100644
index 0000000000..246cdf8348
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/target_context/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$field.CAMPAIGNSTEP_ID") && vars.get("$field.CAMPAIGNSTEP_ID"))
+{
+    result.string("CampaignStep");
+}
+else
+{
+    result.string("Campaign");
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/target_rowid/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/target_rowid/valueProcess.js
new file mode 100644
index 0000000000..aa45c28884
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/target_rowid/valueProcess.js
@@ -0,0 +1,11 @@
+import("system.result");
+import("system.vars");
+
+if (vars.exists("$field.CAMPAIGNSTEP_ID") && vars.get("$field.CAMPAIGNSTEP_ID"))
+{
+    result.string(vars.get("$field.CAMPAIGNSTEP_ID"));
+}
+else
+{
+    result.string(vars.get("$field.CAMPAIGN_ID"));
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000..32c1d5d1ee
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,11 @@
+import("system.logging");
+import("system.db");
+import("system.result");
+import("Sql_lib");
+
+var cond = SqlCondition.begin()
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGNCOSTID", "$param.Uid_param")
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGN_ID", "$param.CampaignId_param")
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGNSTEP_ID", "$param.CampaignStepId_param");
+
+result.string(db.translateCondition(cond.build("1=2")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js b/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
new file mode 100644
index 0000000000..3aa7368fd4
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/recordfieldmappings/category.displayvalue/expression.js
@@ -0,0 +1,6 @@
+import("system.result");
+import("Keyword_lib");
+import("KeywordRegistry_basic");
+
+var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.campaignStepCostCategory(), "CAMPAIGNCOST.CATEGORY");
+result.string(sql);
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/CampaignStep_entity.aod b/entity/CampaignStep_entity/CampaignStep_entity.aod
index da9521b08e..96cb0aedca 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -198,6 +198,26 @@
         <fieldName>Employees</fieldName>
       </dependency>
     </entityConsumer>
+    <entityConsumer>
+      <name>CampaignStepCosts</name>
+      <title>Cost</title>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignCost_entitiy</entityName>
+        <fieldName>StepCosts</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000..b2482a5e35
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$field.CAMPAIGN_ID"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js
new file mode 100644
index 0000000000..533f8ec837
--- /dev/null
+++ b/entity/CampaignStep_entity/entityfields/campaignstepcosts/children/campaignstepid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$sys.uid"));
\ No newline at end of file
diff --git a/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js b/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js
index eda9e4ac40..076a4dc046 100644
--- a/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js
+++ b/entity/CampaignStep_entity/entityfields/state/displayValueProcess.js
@@ -3,4 +3,4 @@ import("system.vars");
 import("Keyword_lib");
 import("KeywordRegistry_basic");
 
-result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepState(), vars.get("$field.STATE")));
\ No newline at end of file
+result.string(KeywordUtils.getViewValue($KeywordRegistry.campaignStepState(), vars.get("$this.value")));
\ No newline at end of file
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 7b717c58ed..9ccbae20b8 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -184,6 +184,12 @@
         <entityName>CampaignCost_entitiy</entityName>
         <fieldName>CampaignCosts</fieldName>
       </dependency>
+      <children>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <valueProcess>%aditoprj%/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
     </entityConsumer>
   </entityFields>
   <recordContainers>
diff --git a/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js b/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000..c95f5ea0c8
--- /dev/null
+++ b/entity/Campaign_entity/entityfields/campaigncosts/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$sys.uid"));
\ No newline at end of file
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index 86428dc192..61a86af519 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -379,6 +379,12 @@
           <fieldName>KeywordStates</fieldName>
           <isConsumer v="false" />
         </entityDependency>
+        <entityDependency>
+          <name>13d739cb-2b97-44a0-bed0-b6868b0e579e</name>
+          <entityName>CampaignCost_entitiy</entityName>
+          <fieldName>KeywordCampaignManagementCostCategory</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
       </dependencies>
       <children>
         <entityParameter>
diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
index f646a49566..3df60c9058 100644
--- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
+++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod
@@ -3079,19 +3079,10 @@
       <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
     </entry>
     <entry>
-      <key>file '%0' cannot be read</key>
-    </entry>
-    <entry>
-      <key>Importer</key>
+      <key>Step</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>Fix cost</key>
     </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index d62906560f..c53a7ea555 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -3927,19 +3927,10 @@
       <value>Webservice nicht erreichbar. URL: %0 %1</value>
     </entry>
     <entry>
-      <key>file '%0' cannot be read</key>
-    </entry>
-    <entry>
-      <key>Importer</key>
+      <key>Step</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>Fix cost</key>
     </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 32179aedb6..7238483c5a 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -3108,6 +3108,12 @@
     <entry>
       <key>Costs</key>
     </entry>
+    <entry>
+      <key>Fix cost</key>
+    </entry>
+    <entry>
+      <key>Step</key>
+    </entry>
     <entry>
       <key>${WEBSERVICE_ERROR} url:%0 status:%1</key>
       <value>Webservice not available. URL: %0 %1</value>
diff --git a/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
index e9a5855a79..d55f1edace 100644
--- a/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
+++ b/neonView/CampaignCostEdit_view/CampaignCostEdit_view.aod
@@ -14,14 +14,6 @@
       <editMode v="true" />
       <entityField>#ENTITY</entityField>
       <fields>
-        <entityFieldLink>
-          <name>00e27896-3a82-4eb9-931d-6a99d7f5e346</name>
-          <entityField>CAMPAIGN_ID</entityField>
-        </entityFieldLink>
-        <entityFieldLink>
-          <name>378d8bd1-d5ce-4df6-85eb-070888afd58d</name>
-          <entityField>CAMPAIGNSTEP_ID</entityField>
-        </entityFieldLink>
         <entityFieldLink>
           <name>bb0e5fb9-e82c-47f7-b6fa-f3e5d4c36649</name>
           <entityField>CATEGORY</entityField>
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
index 3781b415c5..b2e97e0bfd 100644
--- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -11,8 +11,8 @@
   <children>
     <treeTableViewTemplate>
       <name>CostTreeTable</name>
+      <favoriteActionGroup1>alter</favoriteActionGroup1>
       <defaultGroupFields>
-        <element>CAMPAIGN_ID</element>
         <element>CAMPAIGNSTEP_ID</element>
       </defaultGroupFields>
       <entityField>#ENTITY</entityField>
diff --git a/neonView/CampaignStepMain_view/CampaignStepMain_view.aod b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
index 422d82911f..8e39191175 100644
--- a/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
+++ b/neonView/CampaignStepMain_view/CampaignStepMain_view.aod
@@ -24,5 +24,10 @@
       <entityField>#ENTITY</entityField>
       <view>CampaignStepAnalysis_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>b17669a6-7ddf-428a-983c-df18a2f7a738</name>
+      <entityField>CampaignStepCosts</entityField>
+      <view>CampaignCostFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js
index e0e5880779..fbd894dc51 100644
--- a/process/KeywordRegistry_basic/process.js
+++ b/process/KeywordRegistry_basic/process.js
@@ -81,3 +81,4 @@ $KeywordRegistry.campaignState = function(){return "CampaignManagementStates";};
 $KeywordRegistry.campaignState$planning = function(){return "e04c9c59-0590-463c-a10e-e25c583e9cf2";};
 $KeywordRegistry.campaignStepState = function(){return "CampaignManagementStepStates";};
 $KeywordRegistry.campaignStepState$open = function(){return "bbf69673-2ec6-46f8-b231-684a31be9fbd";};
+$KeywordRegistry.campaignStepCostCategory = function(){return "CampaignManagementCostCategory";};
-- 
GitLab