diff --git a/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
new file mode 100644
index 0000000000000000000000000000000000000000..1ed10ca0a52fb74404db55cc26a2e8b01f357bf3
--- /dev/null
+++ b/entity/CampaignCost_entitiy/CampaignCost_entitiy.aod
@@ -0,0 +1,310 @@
+<?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.3.5" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.5">
+  <name>CampaignCost_entitiy</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <afterOperatingState>%aditoprj%/entity/CampaignCost_entitiy/afterOperatingState.js</afterOperatingState>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </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>
+      <mandatoryProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js</mandatoryProcess>
+      <groupable v="true" />
+      <stateProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess>
+      <onValueChange>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js</onValueChange>
+      <onValueChangeTypes>
+        <element>MASK</element>
+      </onValueChangeTypes>
+    </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>
+      <inputFormat>#,##0.00</inputFormat>
+      <mandatory v="true" />
+    </entityField>
+    <entityField>
+      <name>USER_NEW</name>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_NEW</name>
+      <mandatory v="true" />
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>USER_EDIT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>DATE_EDIT</name>
+      <searchable v="false" />
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>CampaignCosts</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>7131288b-af5c-4914-96f5-c5d70217fc23</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignSteps_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityProvider>
+      <name>StepCosts</name>
+      <fieldType>DEPENDENCY_IN</fieldType>
+      <dependencies>
+        <entityDependency>
+          <name>af147f3e-a1bd-4eb0-9ac8-325dbdaba17d</name>
+          <entityName>CampaignStep_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+        <entityDependency>
+          <name>2a92b738-c0bb-4c14-9915-aff9e18effaf</name>
+          <entityName>Campaign_entity</entityName>
+          <fieldName>CampaignStepCosts</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+      <children>
+        <entityParameter>
+          <name>CampaignStepId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Uid_param</name>
+          <expose v="false" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>CampaignSteps_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js</valueProcess>
+          <expose v="false" />
+        </entityParameter>
+      </children>
+    </entityProvider>
+    <entityConsumer>
+      <name>Campaigns</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Campaign_entity</entityName>
+        <fieldName>Campaigns</fieldName>
+      </dependency>
+    </entityConsumer>
+    <entityConsumer>
+      <name>CampaignSteps</name>
+      <fieldType>DEPENDENCY_OUT</fieldType>
+      <dependency>
+        <name>dependency</name>
+        <entityName>CampaignStep_entity</entityName>
+        <fieldName>CampaignSteps</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>campaignId_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignsteps/children/campaignid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </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>
+        <entityParameter>
+          <name>ExcludedKeyIdsSubquery_param</name>
+          <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_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>
+    <entityParameter>
+      <name>Uid_param</name>
+      <expose v="true" />
+      <description>PARAMETER</description>
+    </entityParameter>
+    <entityField>
+      <name>netPerParticipant</name>
+      <contentType>NUMBER</contentType>
+      <outputFormat>#,##0.00</outputFormat>
+      <inputFormat>#,##0.00</inputFormat>
+      <state>READONLY</state>
+      <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>
+      <inputFormat>#0</inputFormat>
+      <state>READONLY</state>
+      <valueProcess>%aditoprj%/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js</valueProcess>
+    </entityField>
+    <entityParameter>
+      <name>CampaignSteps_param</name>
+      <title></title>
+      <expose v="true" />
+      <documentation>%aditoprj%/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc</documentation>
+      <description>PARAMETER</description>
+    </entityParameter>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>Data_alias</alias>
+      <fromClauseProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js</fromClauseProcess>
+      <conditionProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <orderClauseProcess>%aditoprj%/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js</orderClauseProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>70c2db20-0695-4189-92cb-7da585bff401</name>
+          <tableName>CAMPAIGNCOST</tableName>
+          <primaryKey>CAMPAIGNCOSTID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+        <linkInformation>
+          <name>b97b7f67-86ea-4d0a-8303-abc05863ed66</name>
+          <tableName>CAMPAIGNSTEP</tableName>
+          <primaryKey>CAMPAIGNSTEPID</primaryKey>
+          <isUIDTable v="false" />
+          <readonly v="true" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGN_ID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGN_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNCOSTID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGNCOSTID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CAMPAIGNSTEP_ID.value</name>
+          <recordfield>CAMPAIGNCOST.CAMPAIGNSTEP_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>CATEGORY.value</name>
+          <recordfield>CAMPAIGNCOST.CATEGORY</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_EDIT.value</name>
+          <recordfield>CAMPAIGNCOST.DATE_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>DATE_NEW.value</name>
+          <recordfield>CAMPAIGNCOST.DATE_NEW</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>NET.value</name>
+          <recordfield>CAMPAIGNCOST.NET</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>USER_EDIT.value</name>
+          <recordfield>CAMPAIGNCOST.USER_EDIT</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <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>
+</entity>
diff --git a/entity/CampaignCost_entitiy/afterOperatingState.js b/entity/CampaignCost_entitiy/afterOperatingState.js
new file mode 100644
index 0000000000000000000000000000000000000000..aadf712515f2c07c00aac89451d56b6cd77bdf39
--- /dev/null
+++ b/entity/CampaignCost_entitiy/afterOperatingState.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_VIEW) 
+{
+    neon.refreshAll();
+}
\ No newline at end of file
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 0000000000000000000000000000000000000000..5808a7a781c569c67472b7a91f7892363330b39a
--- /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 0000000000000000000000000000000000000000..2e2d6acf76ae6b1ea51cbcc77db98483695bcbf8
--- /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 0000000000000000000000000000000000000000..4037fcb024927b70e5a6ca6f7753c70c0cea0728
--- /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/campaigncostid/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..622e00f05f77bd63405f4487831518087cc38d27
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaigncostid/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.neon");
+import("system.util");
+import("system.vars");
+import("system.result");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(util.getNewUUID());
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f08839a6a4d79cdb90175f7b7f194a9902ec27f
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaigncosts/children/campaignsteps_param/valueProcess.js
@@ -0,0 +1,2 @@
+import("system.result");
+result.string(0)
\ 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 0000000000000000000000000000000000000000..f05a19497e25fe0dc5771521a787dbac10fb5489
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/displayValueProcess.js
@@ -0,0 +1,20 @@
+import("system.neon");
+import("system.translate");
+import("system.result");
+import("system.db");
+import("system.vars");
+import("Campaign_lib");
+
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
+{
+    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"));    
+    }
+}
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..32de11947a0d476bc467050c0a740461be22b2f7
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/mandatoryProcess.js
@@ -0,0 +1,7 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+result.object((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
+                vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1" &&
+                vars.exists("$param.CampaignStepId_param") && !vars.get("$param.CampaignStepId_param")));
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js
new file mode 100644
index 0000000000000000000000000000000000000000..6483cdd91c7941e5997f3405fffbddcf3893f23a
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/onValueChange.js
@@ -0,0 +1,3 @@
+import("system.neon");
+
+neon.setFieldValue("$field.CATEGORY", "");
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..a3d6f4f4d26c42171f5dfaf152074f7039f95afd
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignstep_id/stateProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.neon");
+import("system.vars");
+if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW &&
+    vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1" &&
+    vars.exists("$param.CampaignStepId_param") && !vars.get("$param.CampaignStepId_param"))
+{
+    result.string(neon.COMPONENTSTATE_AUTO);
+}
+else
+{
+    result.string(neon.COMPONENTSTATE_INVISIBLE);
+}
\ No newline at end of file
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 0000000000000000000000000000000000000000..30896ea50e4ae6bbc69bb7baaca294418004cb84
--- /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/campaignsteps/children/campaignid_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..dc855dd051409b0f79372cc2e34d294a1a57c72d
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignsteps/children/campaignid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.vars");
+import("system.result");
+
+result.string(vars.get("$param.CampaignId_param"))
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc b/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc
new file mode 100644
index 0000000000000000000000000000000000000000..d74c862542faa32b0e558fa69c33edc0000980f6
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/campaignsteps_param/documentation.adoc
@@ -0,0 +1,2 @@
+if 0: show only fix costs
+if 1: show only campaign steps
\ 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 0000000000000000000000000000000000000000..c8d7303fadeec6339bcd9065205606caa49e415c
--- /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/countparticipants/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/countparticipants/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..c8cec9a46f4ad458f2dfb3f8525644fb1a1d5244
--- /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/date_edit/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..96630036eca528560c85d9a237044931e7a9197b
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/date_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.date"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b1ea7c082a78ebd6e793a5dc644d8920f9522c2
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/date_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.date"));
\ 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 0000000000000000000000000000000000000000..621fdd82097282d2e949cb0402cf1edcbf5610ce
--- /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/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..7bf0f39ed06188503867bd1ecca206fece100bc0
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/keywordcampaignmanagementcostcategory/children/excludedkeyidssubquery_param/valueProcess.js
@@ -0,0 +1,18 @@
+import("system.neon");
+import("system.vars");
+import("system.db");
+import("Sql_lib");
+import("system.result");
+
+var cond = SqlCondition.begin()
+                       .andPrepareVars("CAMPAIGNCOST.CAMPAIGN_ID", "$field.CAMPAIGN_ID");
+
+if (vars.get("$field.CAMPAIGNSTEP_ID"))
+    cond.andPrepareVars("CAMPAIGNCOST.CAMPAIGNSTEP_ID", "$field.CAMPAIGNSTEP_ID");
+else
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is null")
+    
+if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW)
+    cond.andPrepareVars("CAMPAIGNCOST.CAMPAIGNCOSTID", "$field.CAMPAIGNCOSTID", "# <> ?");
+
+result.string(db.translateStatement(cond.buildSql("select CATEGORY from CAMPAIGNCOST", "1=2", "group by CATEGORY")));
\ 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 0000000000000000000000000000000000000000..c5ea14f73ec9a5870c7c5e3a7a58e3358107e15d
--- /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 0000000000000000000000000000000000000000..eea808176cb74be09b41f29a60bb1105115c5af4
--- /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 (netto && countParticipants &&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/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..4336563e79c0a64b263cca325ed6285fbbededa7
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/stepcosts/children/campaignsteps_param/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string(1);
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..8a93ff7e16a82fb332cf1f6f30c95bec0c74d929
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/user_edit/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)
+    result.string(vars.get("$sys.user"));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js b/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2615c2bbe71788eb05f1ff93ea8afaa05b40f6fb
--- /dev/null
+++ b/entity/CampaignCost_entitiy/entityfields/user_new/valueProcess.js
@@ -0,0 +1,7 @@
+import("system.util");
+import("system.result");
+import("system.neon");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW)
+    result.string(vars.get("$sys.user"));
\ 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 0000000000000000000000000000000000000000..f553af6bac573d4226067d0bf246eada7d0d1dc5
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,22 @@
+import("system.vars");
+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");
+                       
+if (vars.exists("$param.CampaignSteps_param") && vars.get("$param.CampaignSteps_param") == "1")
+{
+    // only step costs
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is not null");
+}
+else
+{
+    // only fix costs
+    cond.and("CAMPAIGNCOST.CAMPAIGNSTEP_ID is null");
+}
+
+result.string(db.translateCondition(cond.build("1=2")));
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e075c4e894903b135e4bd4281da91bdb84c90538
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/fromClauseProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("CAMPAIGNCOST left join CAMPAIGNSTEP on CAMPAIGNCOST.CAMPAIGNSTEP_ID = CAMPAIGNSTEP.CAMPAIGNSTEPID")
\ No newline at end of file
diff --git a/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js b/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8abc388f8ef2e8b95dcb0d800030fcfc52701d0
--- /dev/null
+++ b/entity/CampaignCost_entitiy/recordcontainers/db/orderClauseProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.db");
+
+result.object({"CAMPAIGNSTEP.SORTING": db.ASCENDING});
\ 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 0000000000000000000000000000000000000000..4f14958aedfdf8daa195607c5b86e2e66e097ce5
--- /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 10c9826fa0449b6097ff2c6d0c2a2a22a164f2d8..972daa93743021681d51bda90d8e79105842a2af 100644
--- a/entity/CampaignStep_entity/CampaignStep_entity.aod
+++ b/entity/CampaignStep_entity/CampaignStep_entity.aod
@@ -124,7 +124,7 @@
         </entityDependency>
         <entityDependency>
           <name>ad4ee503-95b9-4add-a0ef-e833db008349</name>
-          <entityName>CampaignCost_entity</entityName>
+          <entityName>CampaignCost_entitiy</entityName>
           <fieldName>CampaignSteps</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -229,7 +229,7 @@
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
+        <entityName>CampaignCost_entitiy</entityName>
         <fieldName>StepCosts</fieldName>
       </dependency>
       <children>
diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod
index 7865abaefab2997512fe33d64d2696e04ca8c0c3..87e2fba10cfa3747c01ef0b9f4ee091a59ebeeaa 100644
--- a/entity/Campaign_entity/Campaign_entity.aod
+++ b/entity/Campaign_entity/Campaign_entity.aod
@@ -146,7 +146,7 @@
         </entityDependency>
         <entityDependency>
           <name>d238b02c-75e7-4cf4-b90c-bb36d41ae90f</name>
-          <entityName>CampaignCost_entity</entityName>
+          <entityName>CampaignCost_entitiy</entityName>
           <fieldName>Campaigns</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -197,7 +197,7 @@
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
+        <entityName>CampaignCost_entitiy</entityName>
         <fieldName>CampaignCosts</fieldName>
       </dependency>
       <children>
@@ -219,7 +219,7 @@
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>CampaignCost_entity</entityName>
+        <entityName>CampaignCost_entitiy</entityName>
         <fieldName>StepCosts</fieldName>
       </dependency>
       <children>
diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
index b4b9660d0b0eae968e4671097549231b0674ffe7..f7dacc688967a260bc2ffcec454dc412bfd62741 100644
--- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod
+++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod
@@ -382,7 +382,7 @@
         </entityDependency>
         <entityDependency>
           <name>13d739cb-2b97-44a0-bed0-b6868b0e579e</name>
-          <entityName>CampaignCost_entity</entityName>
+          <entityName>CampaignCost_entitiy</entityName>
           <fieldName>KeywordCampaignManagementCostCategory</fieldName>
           <isConsumer v="false" />
         </entityDependency>
diff --git a/neonContext/CampaignCost/CampaignCost.aod b/neonContext/CampaignCost/CampaignCost.aod
index 9c38b9368d9731c82c386ed4dd4d400104e3ae6b..0e1a0721491e11958bb84cfa99c0c1799c28ccca 100644
--- a/neonContext/CampaignCost/CampaignCost.aod
+++ b/neonContext/CampaignCost/CampaignCost.aod
@@ -4,7 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterview>CampaignCostFilter_view</filterview>
   <editview>CampaignCostEdit_view</editview>
-  <entity>CampaignCost_entity</entity>
+  <entity>CampaignCost_entitiy</entity>
   <references>
     <neonViewReference>
       <name>fa4ac7f7-4f30-42ba-86b2-99e86597734f</name>
diff --git a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
index c8076b48e2fbb0d7d4be508fa67ce69ef04f3763..ecafe08950d854c4e0a5cc437e50ec52652186fd 100644
--- a/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
+++ b/neonView/CampaignCostFilter_view/CampaignCostFilter_view.aod
@@ -2,12 +2,11 @@
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
   <name>CampaignCostFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="false" />
+  <filterable v="true" />
   <layout>
     <drawerLayout>
       <name>layout</name>
       <layoutCaption>Fix costs</layoutCaption>
-      <fixedDrawer v="true" />
     </drawerLayout>
   </layout>
   <children>
diff --git a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
index 5f8b4816b86bd345eca25bc7007beec732a99817..637e35e7165eab89651f57aab955987e54734fbf 100644
--- a/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
+++ b/neonView/CampaignCostVariable_view/CampaignCostVariable_view.aod
@@ -3,12 +3,11 @@
   <name>CampaignCostVariable_view</name>
   <title>Step costs</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterable v="false" />
+  <filterable v="true" />
   <layout>
     <drawerLayout>
       <name>layout</name>
       <layoutCaption>Variable costs</layoutCaption>
-      <fixedDrawer v="true" />
     </drawerLayout>
   </layout>
   <children>