From 3dbc5a72e010337aca6fd26a786eaab87403c0f8 Mon Sep 17 00:00:00 2001
From: Johannes Hoermann <j.hoermann@adito.de>
Date: Thu, 11 Apr 2019 12:03:09 +0200
Subject: [PATCH] Meilensteine auf neue Keyword-logik umbauen

---
 ...ne_datatype_to_new_Keyword_logic_Derby.xml |  16 ++
 ...datatype_to_new_Keyword_logic_notDerby.xml |   7 +
 .../Data_alias/basic/2019.2/changelog.xml     |   6 +
 .../basic/2019.2/renameCycle_to_Milestone.xml |   9 +
 .../update_Milestone_to_new_Keyword.xml       | 135 ++++++++++++
 aliasDefinition/Data_alias/Data_alias.aod     | 207 +++++++++---------
 .../SalesprojectMilestone_entity.aod}         |  38 ++--
 .../conditionProcess.js                       |   2 +-
 .../entityfields/date_edit/valueProcess.js    |   0
 .../entityfields/date_new/valueProcess.js     |   0
 .../salesproject_id/valueProcess.js           |   0
 .../salesproject_milestoneid}/valueProcess.js |   0
 .../entityfields/type/possibleItemsProcess.js |   2 +-
 .../entityfields/user_edit/valueProcess.js    |   0
 .../entityfields/user_new/valueProcess.js     |   0
 .../value/possibleItemsProcess.js             |   2 +-
 .../recordcontainers/db}/conditionProcess.js  |   2 +-
 .../recordcontainers/db/onDBUpdate.js         |   0
 .../Salesproject_entity.aod                   |   8 +-
 entity/Salesproject_entity/onDBInsert.js      |   5 -
 entity/Salesproject_entity/onDBUpdate.js      |  24 --
 .../recordcontainers/db/onDBDelete.js         |   2 +-
 .../recordcontainers/db/onDBInsert.js         |   5 +-
 .../recordcontainers/db/onDBUpdate.js         |   7 +-
 neonContext/Salesproject/Salesproject.aod     |   2 +-
 .../SalesprojectMilestone.aod}                |  20 +-
 .../SalesprojectCycleChart_view.aod           |  17 ++
 .../SalesprojectCycleEdit_view.aod            |   2 +-
 .../SalesprojectCycleFilter_view.aod          |   4 +-
 .../SalesprojectCyclePreview_view.aod         |   2 +-
 .../SalesprojectCycle_view.aod                |   6 +-
 process/Data_lib/process.js                   |   2 +-
 process/Keyword_lib/process.js                |  21 +-
 process/Salesproject_lib/process.js           |  10 +-
 34 files changed, 374 insertions(+), 189 deletions(-)
 create mode 100644 .liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
 create mode 100644 .liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
 create mode 100644 .liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml
 create mode 100644 .liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml
 rename entity/{SalesprojectCycle_entity/SalesprojectCycle_entity.aod => SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod} (66%)
 rename entity/{SalesprojectCycle_entity/recordcontainers/db => SalesprojectMilestone_entity}/conditionProcess.js (72%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/date_edit/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/date_new/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/salesproject_id/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity/entityfields/salesproject_cycleid => SalesprojectMilestone_entity/entityfields/salesproject_milestoneid}/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/type/possibleItemsProcess.js (53%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/user_edit/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/user_new/valueProcess.js (100%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/entityfields/value/possibleItemsProcess.js (79%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity/recordcontainers/db}/conditionProcess.js (72%)
 rename entity/{SalesprojectCycle_entity => SalesprojectMilestone_entity}/recordcontainers/db/onDBUpdate.js (100%)
 delete mode 100644 entity/Salesproject_entity/onDBInsert.js
 delete mode 100644 entity/Salesproject_entity/onDBUpdate.js
 rename neonContext/{SalesprojectCycle/SalesprojectCycle.aod => SalesprojectMilestone/SalesprojectMilestone.aod} (56%)
 create mode 100644 neonView/SalesprojectCycleChart_view/SalesprojectCycleChart_view.aod

diff --git a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
new file mode 100644
index 00000000000..fa2c3652ee1
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_Derby.xml
@@ -0,0 +1,16 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet dbms="derby" author="j.hoermann" id="be098ba0-30ed-4e01-893e-928b1ac86923">
+        <sql>
+            ALTER TABLE SALESPROJECT_MILESTONE ADD COLUMN TYPE_NEW VARCHAR(80);
+            UPDATE SALESPROJECT_MILESTONE SET TYPE_NEW=CHAR(TYPE);
+            ALTER TABLE SALESPROJECT_MILESTONE DROP COLUMN TYPE;
+            RENAME COLUMN SALESPROJECT_MILESTONE.TYPE_NEW TO TYPE;
+            
+            ALTER TABLE SALESPROJECT_MILESTONE ADD COLUMN VALUE_NEW CHAR(36);
+            UPDATE SALESPROJECT_MILESTONE SET VALUE_NEW=CHAR(VALUE);
+            ALTER TABLE SALESPROJECT_MILESTONE DROP COLUMN VALUE;
+            RENAME COLUMN SALESPROJECT_MILESTONE.VALUE_NEW TO VALUE;
+        </sql>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
new file mode 100644
index 00000000000..41fdab8d766
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml
@@ -0,0 +1,7 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet dbms="!derby" author="j.hoermann" id="f5074961-4aa0-4cd8-8541-7381ddfb0b71">
+        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="TYPE" newDataType="NVARCHAR(80)"/>
+        <modifyDataType tableName="SALESPROJECT_MILESTONE" columnName="VALUE" newDataType="CHAR(36)"/>
+    </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/changelog.xml b/.liquibase/Data_alias/basic/2019.2/changelog.xml
index 02937d76436..3d05482a243 100644
--- a/.liquibase/Data_alias/basic/2019.2/changelog.xml
+++ b/.liquibase/Data_alias/basic/2019.2/changelog.xml
@@ -136,4 +136,10 @@
     <!-- Derby needs special handling -->
     <include relativeToChangelogFile="true" file="alter_activityLink_notDerby.xml" />
     <include relativeToChangelogFile="true" file="alter_activityLink_Derby.xml" />
+    
+    <include relativeToChangelogFile="true" file="renameCycle_to_Milestone.xml" />
+    <!-- Derby needs special handling -->
+    <include relativeToChangelogFile="true" file="change_Milestone_datatype_to_new_Keyword_logic_notDerby.xml" />
+    <include relativeToChangelogFile="true" file="change_Milestone_datatype_to_new_Keyword_logic_Derby.xml" />
+    <include relativeToChangelogFile="true" file="update_Milestone_to_new_Keyword.xml" />
 </databaseChangeLog>
diff --git a/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml b/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml
new file mode 100644
index 00000000000..94183e1d8dc
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/renameCycle_to_Milestone.xml
@@ -0,0 +1,9 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="j.hoermann" id="da0982c9-8541-43a2-ae3f-cfb179a6b8c3">
+        <renameTable oldTableName="SALESPROJECT_CYCLE" newTableName="SALESPROJECT_MILESTONE"/>
+        <renameColumn tableName="SALESPROJECT_MILESTONE" columnDataType="CHAR(36)" newColumnName="SALESPROJECT_MILESTONEID" oldColumnName="SALESPROJECT_CYCLEID"/>
+        <dropPrimaryKey tableName="SALESPROJECT_MILESTONE" constraintName="PK_SALESPROJECT_CYCLE_SALESPROJECT_CYCLEID"/>
+        <addPrimaryKey tableName="SALESPROJECT_MILESTONE" constraintName="PK_SALESPROJECT_MILESTONE_SALESPROJECT_MILESTONEID" columnNames="SALESPROJECT_MILESTONEID"/>
+   </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml b/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml
new file mode 100644
index 00000000000..78058cb3754
--- /dev/null
+++ b/.liquibase/Data_alias/basic/2019.2/update_Milestone_to_new_Keyword.xml
@@ -0,0 +1,135 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">
+    <changeSet author="j.hoermann" id="ec9bae68-ca27-4597-9808-fc333246b3a0">
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="TYPE" value="SalesprojectPhase"/>
+            <where>TYPE = ?</where>
+            <whereParams>
+                <param value="1" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="9f7d1fa9-7c09-4037-8f7c-8458def14d89"/>
+            <where>TYPE = ? and VALUE in (?,?,?,?,?,?,?,?,?,?,?)</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="1" />
+                <param value="7" />
+                <param value="8" />
+                <param value="9" />
+                <param value="10" />
+                <param value="11" />
+                <param value="12" />
+                <param value="13" />
+                <param value="14" />
+                <param value="15" />
+                <param value="16" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="292628f1-d9a5-432d-8130-f6690c14a5d4"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="4467b33c-3a68-4c8b-ba4a-1eb666a6c774"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="3" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="1e42f183-fb97-415f-9917-b43ca159fde4"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="4" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="972a41dc-a8ae-43cd-a03b-522ea84efbfb"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="5" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="60d09bb1-7e02-4003-99bf-18b739a577ad"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="6" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="213c8184-f930-457e-8605-703baaf21d4a"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectPhase" />
+                <param value="7" />
+            </whereParams>
+        </update>
+        
+        
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="TYPE" value="SalesprojectState"/>
+            <where>TYPE = ?</where>
+            <whereParams>
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="483bcaeb-1e5b-4772-b54e-7d7d8aa65712"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="1" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="23d38486-4cce-41ce-a8df-164ad44df706"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="2" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="8916e241-9452-4541-a323-d479ad5f2e4d"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="3" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="1606cf46-a87b-4797-830e-55ebdd70a001"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="4" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="130bb53a-a97e-455e-8f34-8d445e985474"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="5" />
+            </whereParams>
+        </update>
+        <update tableName="SALESPROJECT_MILESTONE">
+            <column name="VALUE" value="d8a60f60-a4e6-46ee-88ec-bac53e1afedd"/>
+            <where>TYPE = ? and VALUE = ?</where>
+            <whereParams>
+                <param value="SalesprojectState" />
+                <param value="6" />
+            </whereParams>
+        </update>
+   </changeSet>
+</databaseChangeLog>
\ No newline at end of file
diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod
index c50f192679f..a1158862b25 100644
--- a/aliasDefinition/Data_alias/Data_alias.aod
+++ b/aliasDefinition/Data_alias/Data_alias.aod
@@ -2702,109 +2702,6 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
-          <entityDb>
-            <name>SALESPROJECT_CYCLE</name>
-            <dbName></dbName>
-            <idColumn>SALESPROJECT_CYCLEID</idColumn>
-            <idGeneratorType v="0" />
-            <idGeneratorInterval v="1" />
-            <title></title>
-            <description></description>
-            <auditSyncConfig>
-              <name>auditSyncConfig</name>
-              <auditMode v="0" />
-              <syncActive v="false" />
-              <syncComplete v="true" />
-              <syncDirection v="1" />
-              <syncIds></syncIds>
-            </auditSyncConfig>
-            <entityFields>
-              <entityFieldDb>
-                <name>SALESPROJECT_CYCLEID</name>
-                <dbName></dbName>
-                <primaryKey v="true" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="true" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>DATE_START</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>VALUE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>SALESPROJECT_ID</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="1" />
-                <size v="36" />
-                <scale v="0" />
-                <notNull v="true" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>TYPE</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="4" />
-                <size v="10" />
-                <scale v="0" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-              <entityFieldDb>
-                <name>DATE_END</name>
-                <dbName></dbName>
-                <primaryKey v="false" />
-                <columnType v="93" />
-                <size v="29" />
-                <scale v="9" />
-                <notNull v="false" />
-                <isUnique v="false" />
-                <index v="false" />
-                <documentation></documentation>
-                <title></title>
-                <description></description>
-              </entityFieldDb>
-            </entityFields>
-          </entityDb>
           <entityDb>
             <name>SALESPROJECT_FORECAST</name>
             <dbName></dbName>
@@ -5982,6 +5879,110 @@
               </entityFieldDb>
             </entityFields>
           </entityDb>
+          <entityDb>
+            <name>SALESPROJECT_MILESTONE</name>
+            <dbName></dbName>
+            <idColumn>SALESPROJECT_MILESTONEID</idColumn>
+            <idGeneratorType v="0" />
+            <idGeneratorInterval v="1" />
+            <documentation></documentation>
+            <title></title>
+            <description></description>
+            <auditSyncConfig>
+              <name>auditSyncConfig</name>
+              <auditMode v="0" />
+              <syncActive v="false" />
+              <syncComplete v="true" />
+              <syncDirection v="1" />
+              <syncIds></syncIds>
+            </auditSyncConfig>
+            <entityFields>
+              <entityFieldDb>
+                <name>DATE_START</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>VALUE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESPROJECT_ID</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>TYPE</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="12" />
+                <size v="80" />
+                <scale v="0" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>DATE_END</name>
+                <dbName></dbName>
+                <primaryKey v="false" />
+                <columnType v="93" />
+                <size v="29" />
+                <scale v="9" />
+                <notNull v="false" />
+                <isUnique v="false" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+              <entityFieldDb>
+                <name>SALESPROJECT_MILESTONEID</name>
+                <dbName></dbName>
+                <primaryKey v="true" />
+                <columnType v="1" />
+                <size v="36" />
+                <scale v="0" />
+                <notNull v="true" />
+                <isUnique v="true" />
+                <index v="false" />
+                <documentation></documentation>
+                <title></title>
+                <description></description>
+              </entityFieldDb>
+            </entityFields>
+          </entityDb>
         </entities>
       </entityGroup>
     </aliasDefDb>
diff --git a/entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
similarity index 66%
rename from entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod
rename to entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
index fbf0ff3b285..37c61c5ea46 100644
--- a/entity/SalesprojectCycle_entity/SalesprojectCycle_entity.aod
+++ b/entity/SalesprojectMilestone_entity/SalesprojectMilestone_entity.aod
@@ -1,6 +1,6 @@
 <?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.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.1">
-  <name>SalesprojectCycle_entity</name>
+  <name>SalesprojectMilestone_entity</name>
   <title>Milestones</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <recordContainer>db</recordContainer>
@@ -24,24 +24,24 @@
       <outputFormat>dd.MM.yyyy</outputFormat>
     </entityField>
     <entityField>
-      <name>SALESPROJECT_CYCLEID</name>
-      <valueProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js</valueProcess>
+      <name>SALESPROJECT_MILESTONEID</name>
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>SALESPROJECT_ID</name>
-      <valueProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js</valueProcess>
+      <valueProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js</valueProcess>
     </entityField>
     <entityField>
       <name>TYPE</name>
       <title>Type</title>
       <mandatory v="true" />
-      <possibleItemsProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js</possibleItemsProcess>
+      <possibleItemsProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/type/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityField>
       <name>VALUE</name>
       <title>Milestone</title>
       <mandatory v="true" />
-      <possibleItemsProcess>%aditoprj%/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js</possibleItemsProcess>
+      <possibleItemsProcess>%aditoprj%/entity/SalesprojectMilestone_entity/entityfields/value/possibleItemsProcess.js</possibleItemsProcess>
     </entityField>
     <entityParameter>
       <name>SalesprojectId_param</name>
@@ -51,14 +51,14 @@
       <description>PARAMETER</description>
     </entityParameter>
     <entityProvider>
-      <name>SalesprojectCycles</name>
+      <name>SalesprojectMilestones</name>
       <fieldType>DEPENDENCY_IN</fieldType>
       <recordContainer>db</recordContainer>
       <dependencies>
         <entityDependency>
           <name>b05e2bdf-5d8b-4ba2-8dba-a8560c255470</name>
           <entityName>Salesproject_entity</entityName>
-          <fieldName>SalesprojectCycles</fieldName>
+          <fieldName>SalesprojectMilestones</fieldName>
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
@@ -75,13 +75,13 @@
       <name>db</name>
       <title></title>
       <alias>Data_alias</alias>
-      <conditionProcess>%aditoprj%/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
-      <onDBUpdate>%aditoprj%/entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
+      <conditionProcess>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <onDBUpdate>%aditoprj%/entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate>
       <linkInformation>
         <linkInformation>
           <name>464f1fd7-e5b6-4cfc-92f8-4873d4e10ce3</name>
-          <tableName>SALESPROJECT_CYCLE</tableName>
-          <primaryKey>SALESPROJECT_CYCLEID</primaryKey>
+          <tableName>SALESPROJECT_MILESTONE</tableName>
+          <primaryKey>SALESPROJECT_MILESTONEID</primaryKey>
           <isUIDTable v="true" />
           <readonly v="false" />
         </linkInformation>
@@ -89,27 +89,27 @@
       <recordFieldMappings>
         <dbRecordFieldMapping>
           <name>DATE_END.value</name>
-          <recordfield>SALESPROJECT_CYCLE.DATE_END</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.DATE_END</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>DATE_START.value</name>
-          <recordfield>SALESPROJECT_CYCLE.DATE_START</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.DATE_START</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
-          <name>SALESPROJECT_CYCLEID.value</name>
-          <recordfield>SALESPROJECT_CYCLE.SALESPROJECT_CYCLEID</recordfield>
+          <name>SALESPROJECT_MILESTONEID.value</name>
+          <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_MILESTONEID</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>TYPE.value</name>
-          <recordfield>SALESPROJECT_CYCLE.TYPE</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.TYPE</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>VALUE.value</name>
-          <recordfield>SALESPROJECT_CYCLE.VALUE</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.VALUE</recordfield>
         </dbRecordFieldMapping>
         <dbRecordFieldMapping>
           <name>SALESPROJECT_ID.value</name>
-          <recordfield>SALESPROJECT_CYCLE.SALESPROJECT_ID</recordfield>
+          <recordfield>SALESPROJECT_MILESTONE.SALESPROJECT_ID</recordfield>
         </dbRecordFieldMapping>
       </recordFieldMappings>
     </dbRecordContainer>
diff --git a/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js b/entity/SalesprojectMilestone_entity/conditionProcess.js
similarity index 72%
rename from entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js
rename to entity/SalesprojectMilestone_entity/conditionProcess.js
index 01636c9c6c0..7711ad471a8 100644
--- a/entity/SalesprojectCycle_entity/recordcontainers/db/conditionProcess.js
+++ b/entity/SalesprojectMilestone_entity/conditionProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("Sql_lib");
 
 var cond = new SqlCondition();
-cond.andPrepareVars("SALESPROJECT_CYCLE.SALESPROJECT_ID", "$param.SalesprojectId_param");
+cond.andPrepareVars("SALESPROJECT_MILESTONE.SALESPROJECT_ID", "$param.SalesprojectId_param");
 
 //TODO: use a preparedCondition when available #1030812 #1034026
 result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/date_edit/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/date_edit/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/date_edit/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/date_edit/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/date_new/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/date_new/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/date_new/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/date_new/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/salesproject_id/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/salesproject_id/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/salesproject_cycleid/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/salesproject_milestoneid/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js b/entity/SalesprojectMilestone_entity/entityfields/type/possibleItemsProcess.js
similarity index 53%
rename from entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/type/possibleItemsProcess.js
index effac991d66..2adb4c496b7 100644
--- a/entity/SalesprojectCycle_entity/entityfields/type/possibleItemsProcess.js
+++ b/entity/SalesprojectMilestone_entity/entityfields/type/possibleItemsProcess.js
@@ -2,5 +2,5 @@ import("system.result");
 import("system.vars");
 import("Keyword_lib");
 
-var items = LegacyKeywordUtils.getStandardArray("SALESPROJECT.CYCLE.TYPE");
+var items = LegacyKeywordUtils.getStandardArray("SALESPROJECT.MILESTONE.TYPE");
 result.object(items);
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/entityfields/user_edit/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/user_edit/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/user_edit/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/user_edit/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/user_new/valueProcess.js b/entity/SalesprojectMilestone_entity/entityfields/user_new/valueProcess.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/entityfields/user_new/valueProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/user_new/valueProcess.js
diff --git a/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js b/entity/SalesprojectMilestone_entity/entityfields/value/possibleItemsProcess.js
similarity index 79%
rename from entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js
rename to entity/SalesprojectMilestone_entity/entityfields/value/possibleItemsProcess.js
index 512b10f2cc7..e4b7b91a7c8 100644
--- a/entity/SalesprojectCycle_entity/entityfields/value/possibleItemsProcess.js
+++ b/entity/SalesprojectMilestone_entity/entityfields/value/possibleItemsProcess.js
@@ -10,7 +10,7 @@ type = vars.getString("$field.TYPE");
 
 // load the possible values based on the type.
 if (type) {
-    keyword = LegacyKeywordUtils.get("SALESPROJECT.CYCLE.TYPE", type)[2].keyword;
+    keyword = LegacyKeywordUtils.get("SALESPROJECT.MILESTONE.TYPE", type)[2].keyword;
         
     if (keyword) {
         items = LegacyKeywordUtils.getStandardArray(keyword);
diff --git a/entity/SalesprojectCycle_entity/conditionProcess.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
similarity index 72%
rename from entity/SalesprojectCycle_entity/conditionProcess.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
index 01636c9c6c0..7711ad471a8 100644
--- a/entity/SalesprojectCycle_entity/conditionProcess.js
+++ b/entity/SalesprojectMilestone_entity/recordcontainers/db/conditionProcess.js
@@ -4,7 +4,7 @@ import("system.vars");
 import("Sql_lib");
 
 var cond = new SqlCondition();
-cond.andPrepareVars("SALESPROJECT_CYCLE.SALESPROJECT_ID", "$param.SalesprojectId_param");
+cond.andPrepareVars("SALESPROJECT_MILESTONE.SALESPROJECT_ID", "$param.SalesprojectId_param");
 
 //TODO: use a preparedCondition when available #1030812 #1034026
 result.string(db.translateCondition(cond.build("1 = 1")));
\ No newline at end of file
diff --git a/entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js b/entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js
similarity index 100%
rename from entity/SalesprojectCycle_entity/recordcontainers/db/onDBUpdate.js
rename to entity/SalesprojectMilestone_entity/recordcontainers/db/onDBUpdate.js
diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod
index fc82706d673..34d70c4c5c8 100644
--- a/entity/Salesproject_entity/Salesproject_entity.aod
+++ b/entity/Salesproject_entity/Salesproject_entity.aod
@@ -130,18 +130,18 @@
       </children>
     </entityConsumer>
     <entityConsumer>
-      <name>SalesprojectCycles</name>
+      <name>SalesprojectMilestones</name>
       <title>Milestone</title>
       <fieldType>DEPENDENCY_OUT</fieldType>
       <dependency>
         <name>dependency</name>
-        <entityName>SalesprojectCycle_entity</entityName>
-        <fieldName>SalesprojectCycles</fieldName>
+        <entityName>SalesprojectMilestone_entity</entityName>
+        <fieldName>SalesprojectMilestones</fieldName>
       </dependency>
       <children>
         <entityParameter>
           <name>SalesprojectId_param</name>
-          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectcycles/children/salesprojectid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Salesproject_entity/entityfields/salesprojectmilestones/children/salesprojectid_param/valueProcess.js</valueProcess>
           <triggerRecalculation v="true" />
         </entityParameter>
       </children>
diff --git a/entity/Salesproject_entity/onDBInsert.js b/entity/Salesproject_entity/onDBInsert.js
deleted file mode 100644
index 46e16c3d687..00000000000
--- a/entity/Salesproject_entity/onDBInsert.js
+++ /dev/null
@@ -1,5 +0,0 @@
-import("system.vars");
-import("Salesproject_lib");
-
-Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 1, vars.get("$field.PHASE"), false);
-Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 2, vars.get("$field.STATE"), true);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/onDBUpdate.js b/entity/Salesproject_entity/onDBUpdate.js
deleted file mode 100644
index 514b528e696..00000000000
--- a/entity/Salesproject_entity/onDBUpdate.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import("system.vars");
-import("Salesproject_lib");
-
-var typeValue, fieldVar
-
-// create Milestones if changed
-vars.get("$local.changed").forEach(function(fieldName) {
-    switch (fieldName) {
-        case "SALESPROJECT.PHASE":
-            typeValue = 1;
-            fieldVar = "$field.PHASE";
-            break;
-        case "SALESPROJECT.STATE":
-            typeValue = 2;
-            fieldVar = "$field.STATE";
-            break;
-    }
-        
-    if (typeValue) {
-        Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar), true);
-    }
-});
-
-
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js b/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
index 6d045ce9112..45345082bb1 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBDelete.js
@@ -10,7 +10,7 @@ if (currentId)
     var toDelete = [
         "SALESPROJECT_COMPETITION",
         "SALESPROJECT_CLASSIFICATION",
-        "SALESPROJECT_CYCLE",
+        "SALESPROJECT_MILESTONE",
         "SALESPROJECT_FORECAST",
         "SALESPROJECT_MEMBER",
         "SALESPROJECT_SOURCE"
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
index 47067fdfe5c..49491bda007 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBInsert.js
@@ -1,6 +1,5 @@
 import("system.vars");
 import("Salesproject_lib");
 
-// TODO Milestone Value is still an Integer but has to be a String (varchar)
-// Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 1, vars.get("$field.PHASE"), false);
-// Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), 2, vars.get("$field.STATE"), true);
\ No newline at end of file
+Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), "SalesprojectPhase", vars.get("$field.PHASE"), false);
+Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), "SalesprojectState", vars.get("$field.STATE"), true);
\ No newline at end of file
diff --git a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
index 2d558ee7cdb..977509bc98a 100644
--- a/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
+++ b/entity/Salesproject_entity/recordcontainers/db/onDBUpdate.js
@@ -17,12 +17,12 @@ vars.get("$local.changed").forEach(function(fieldName) {
     
     switch (fieldName) {
         case "SALESPROJECT.PHASE":
-            typeValue = 1;
+            typeValue = "SalesprojectPhase";
             fieldVar = "$field.PHASE";
             break;
         case "SALESPROJECT.STATE":
             // Milestone
-            typeValue = 2;
+            typeValue = "SalesprojectState";
             fieldVar = "$field.STATE";
             
             // set COMPETITION / OFFER to Lost
@@ -60,8 +60,7 @@ vars.get("$local.changed").forEach(function(fieldName) {
 
     if (typeValue) {
         needToUpdateForecast = true;
-        // TODO Milestone Value is still an Integer but has to be a String (varchar) -> use new keywords
-        //Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar));
+        Salesproject.insertMilestone(vars.getString("$field.SALESPROJECTID"), typeValue, vars.getString(fieldVar));
     }
 });
 
diff --git a/neonContext/Salesproject/Salesproject.aod b/neonContext/Salesproject/Salesproject.aod
index feef4560535..37f47edb8bd 100644
--- a/neonContext/Salesproject/Salesproject.aod
+++ b/neonContext/Salesproject/Salesproject.aod
@@ -28,7 +28,7 @@
     </neonViewReference>
     <neonViewReference>
       <name>d7fb7e2b-c932-4b96-be2c-ae5ec3d36beb</name>
-      <view>SalesprojectCycle_view</view>
+      <view>SalesprojectMilestone_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonContext/SalesprojectCycle/SalesprojectCycle.aod b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
similarity index 56%
rename from neonContext/SalesprojectCycle/SalesprojectCycle.aod
rename to neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
index 59f07fb175b..c19b2a85a61 100644
--- a/neonContext/SalesprojectCycle/SalesprojectCycle.aod
+++ b/neonContext/SalesprojectMilestone/SalesprojectMilestone.aod
@@ -1,24 +1,28 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0">
-  <name>SalesprojectCycle</name>
+  <name>SalesprojectMilestone</name>
   <description>Milestones of a salesproject</description>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <filterview>SalesprojectCycleFilter_view</filterview>
-  <editview>SalesprojectCycleEdit_view</editview>
-  <preview>SalesprojectCyclePreview_view</preview>
-  <entity>SalesprojectCycle_entity</entity>
+  <filterview>SalesprojectMilestoneFilter_view</filterview>
+  <editview>SalesprojectMilestoneEdit_view</editview>
+  <preview>SalesprojectMilestonePreview_view</preview>
+  <entity>SalesprojectMilestone_entity</entity>
   <references>
     <neonViewReference>
       <name>5de9785c-92cc-4fe1-ae13-8d65b9a68ce0</name>
-      <view>SalesprojectCycleFilter_view</view>
+      <view>SalesprojectMilestoneFilter_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>04073406-1035-4a3b-919b-7e0bfda699e0</name>
-      <view>SalesprojectCycleEdit_view</view>
+      <view>SalesprojectMilestoneEdit_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>b3a4073e-9431-4de1-a4d5-c9d11a71a214</name>
-      <view>SalesprojectCyclePreview_view</view>
+      <view>SalesprojectMilestonePreview_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>54bee07a-f45d-458a-bfc6-56ba4992b63d</name>
+      <view>SalesprojectMilestoneChart_view</view>
     </neonViewReference>
   </references>
 </neonContext>
diff --git a/neonView/SalesprojectCycleChart_view/SalesprojectCycleChart_view.aod b/neonView/SalesprojectCycleChart_view/SalesprojectCycleChart_view.aod
new file mode 100644
index 00000000000..a33cf532753
--- /dev/null
+++ b/neonView/SalesprojectCycleChart_view/SalesprojectCycleChart_view.aod
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
+  <name>SalesprojectMilestoneChart_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <multiDataChartViewTemplate>
+      <name>MilestoneChart</name>
+      <chartType>COLUMN</chartType>
+      <entityField>#ENTITY</entityField>
+    </multiDataChartViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod b/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod
index de1a3461bb5..177c2715e8d 100644
--- a/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod
+++ b/neonView/SalesprojectCycleEdit_view/SalesprojectCycleEdit_view.aod
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycleEdit_view</name>
+  <name>SalesprojectMilestoneEdit_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
     <boxLayout>
diff --git a/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod b/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod
index 55809e21f25..2774b5d2994 100644
--- a/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod
+++ b/neonView/SalesprojectCycleFilter_view/SalesprojectCycleFilter_view.aod
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycleFilter_view</name>
+  <name>SalesprojectMilestoneFilter_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterable v="true" />
   <layout>
@@ -10,7 +10,7 @@
   </layout>
   <children>
     <tableViewTemplate>
-      <name>Cycles</name>
+      <name>Milestones</name>
       <autoNewRow v="true" />
       <entityField>#ENTITY</entityField>
       <columns>
diff --git a/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod b/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod
index 41114194e65..c87d969c7e7 100644
--- a/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod
+++ b/neonView/SalesprojectCyclePreview_view/SalesprojectCyclePreview_view.aod
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCyclePreview_view</name>
+  <name>SalesprojectMilestonePreview_view</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
     <boxLayout>
diff --git a/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod b/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod
index edacdea2adf..98018a3e81f 100644
--- a/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod
+++ b/neonView/SalesprojectCycle_view/SalesprojectCycle_view.aod
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.1">
-  <name>SalesprojectCycle_view</name>
+  <name>SalesprojectMilestone_view</name>
   <title>Milestones</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <layout>
@@ -11,8 +11,8 @@
   <children>
     <neonViewReference>
       <name>c68c50b8-6ff9-4be4-ab1e-c8bd9b93f650</name>
-      <entityField>SalesprojectCycles</entityField>
-      <view>SalesprojectCycleFilter_view</view>
+      <entityField>SalesprojectMilestones</entityField>
+      <view>SalesprojectMilestoneFilter_view</view>
     </neonViewReference>
     <neonViewReference>
       <name>b172fd14-209d-412f-9250-aeb0f37091b5</name>
diff --git a/process/Data_lib/process.js b/process/Data_lib/process.js
index fe628720ef1..e6802ed44f1 100644
--- a/process/Data_lib/process.js
+++ b/process/Data_lib/process.js
@@ -366,7 +366,7 @@ DataTree.prototype.addArray = function(pData, pManipulateNodeFn)
 DataTree.prototype.toArray = function(pMaxDepth) 
 {   
     var that = this;
-    // TODO: maybe implement without recursion to prevent stack overflow even on deep cycles...
+    // TODO: maybe implement without recursion to prevent stack overflow even on deep milestones...
     var treeArray = [];
     var tree = this._dataTree;
     
diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js
index a4527c2594e..0f98d5e899c 100644
--- a/process/Keyword_lib/process.js
+++ b/process/Keyword_lib/process.js
@@ -189,6 +189,25 @@ KeywordUtils.getEntryNamesAndIdsByContainer = function(pContainerName)
     return list;
 };
 
+/**
+ * checks, if a specific keyword exists
+ * 
+ * @param {String} pKeyId the key of an element within a containerName - this is the value that is stored in the reference-table (e.g. "DE")
+ * @param {String} pContainerName specifies the type of the keyword and therefore the list elements;
+ *                                  e.g. "COUNTRY"; use an entry of the $KeywordRegistry here
+ * 
+ * @return {Boolean}
+ */
+KeywordUtils.exists = function(pKeyId, pContainerName)
+{
+    var sql = SqlCondition.begin()
+                          .andPrepare("AB_KEYWORD_ENTRY.KEYID", pKeyId)
+                          .andPrepare("AB_KEYWORD_ENTRY.CONTAINER", pContainerName)
+                          .buildSql("select count(*) from AB_KEYWORD_ENTRY", "1=2")
+    logging.log(db.cell(sql))
+    return parseInt(db.cell(sql)) > 0;
+};
+
 /**
  * object that provides featrues for a single keyword attribute; initalizes itself on creation with a specific keyword-attribute
  * 
@@ -434,7 +453,7 @@ function LegacyKeywordUtils(){}
                     ,_createKeywordEntry("16", translate.text("Lead", locale))
                 ]);
                 break;
-            case "SALESPROJECT.CYCLE.TYPE":
+            case "SALESPROJECT.MILESTONE.TYPE":
                 valueContainer = _createKeywordEntriesContainer([
                      _createKeywordEntry("1", translate.text("Phase", locale), null, {keyword: "SALESPROJECT.PHASE"})
                     ,_createKeywordEntry("2", translate.text("State", locale), null, {keyword: "SALESPROJECT.STATE"})
diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js
index 380aecbc0df..85744379172 100644
--- a/process/Salesproject_lib/process.js
+++ b/process/Salesproject_lib/process.js
@@ -1,3 +1,4 @@
+import("system.logging");
 import("system.neon");
 import("system.vars");
 import("system.util");
@@ -40,17 +41,18 @@ Salesproject.validateProjectNumber = function(projectNumber) {
  * Insert a new milestone.
  * 
  * @param {String} salesprojectId of the salesproject
- * @param {Integer} type can be any value of the keyword SALESPROJECT.CYCLE.TYPE
+ * @param {Integer} type can be any value of the keyword SALESPROJECT.MILESTONE.TYPE
  * @param {Integer} value value of the phase or state
  * @param {Boolean} notifyForecast if true, notify user to update the forecast
  * 
  * @result {Boolean} true if inserted, else false
  */
 Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForecast) {
-    if (LegacyKeywordUtils.createKeyword("SALESPROJECT.CYCLE.TYPE").exists(type)) {
+    logging.log(type + " " + value + " " + KeywordUtils.exists(value, type))
+    if (KeywordUtils.exists(value, type)) {
         db.insertData(
-            "SALESPROJECT_CYCLE",
-            ["SALESPROJECT_CYCLEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"],
+            "SALESPROJECT_MILESTONE",
+            ["SALESPROJECT_MILESTONEID", "SALESPROJECT_ID", "TYPE", "VALUE", "DATE_START"],
             null,
             [util.getNewUUID(), salesprojectId, type, value, vars.get("$sys.date")]);
         if (notifyForecast) {
-- 
GitLab