diff --git a/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationScore.xml b/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationScore.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e611914be01cf361fcb194fed32926e2712b812 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationScore.xml @@ -0,0 +1,19 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="b.ulrich" id="a2cee514-2b0a-4ac4-815a-9b40abfea920"> + <addColumn tableName="CLASSIFICATIONSCORE"> + <column name="FIELDVALUE" type="VARCHAR(1000)"/> + </addColumn> + <addColumn tableName="CLASSIFICATIONSCORE"> + <column name="INDICATORTEXT" type="VARCHAR(100)"/> + </addColumn> + <addColumn tableName="CLASSIFICATIONSCORE"> + <column name="INDICATORNUMBER" type="VARCHAR(100)"/> + </addColumn> + <addColumn tableName="CLASSIFICATIONSCORE"> + <column name="INDICATORINTEGER" type="VARCHAR(100)"/> + </addColumn> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationType.xml b/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationType.xml new file mode 100644 index 0000000000000000000000000000000000000000..f605a6d0e9bd9015fca3e238ed71cb01d84883da --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.1.0/Classification/alter_ClassificationType.xml @@ -0,0 +1,16 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="b.ulrich" id="3e2b99e1-594c-4a75-8474-33608819135a"> + <addColumn tableName="CLASSIFICATIONTYPE"> + <column name="FIELD" type="NVARCHAR(100)"/> + </addColumn> + <addColumn tableName="CLASSIFICATIONTYPE"> + <column name="FIELDTYPE" type="VARCHAR(64)"/> + </addColumn> + <addColumn tableName="CLASSIFICATIONTYPE"> + <column name="INDICATORTYPE" type="VARCHAR(64)"/> + </addColumn> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.1.0/Classification/changelog.xml b/.liquibase/Data_alias/basic/2021.1.0/Classification/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..ea5caaa5d16964b5f7f56d18c8d210f1f58173da --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.1.0/Classification/changelog.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <include file="alter_ClassificationType.xml" relativeToChangelogFile="true"/> + <include file="alter_ClassificationScore.xml" relativeToChangelogFile="true"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.1.0/changelog.xml b/.liquibase/Data_alias/basic/2021.1.0/changelog.xml index 9709b5188fcfbf709eca65b3dfa269e9195096c7..b44ea997cefbc71e30cf5b808b7ef4dff5fde740 100644 --- a/.liquibase/Data_alias/basic/2021.1.0/changelog.xml +++ b/.liquibase/Data_alias/basic/2021.1.0/changelog.xml @@ -3,6 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> <include relativeToChangelogFile="true" file="alterPlanningMonthData.xml"/> <include relativeToChangelogFile="true" file="offerWorkflow/alter_offer_approval.xml"/> + <include relativeToChangelogFile="true" file="Classification/changelog.xml"/> <include relativeToChangelogFile="true" file="offerWorkflow/add_ab_keyword_entry_offerstatus.xml"/> <include relativeToChangelogFile="true" file="offerWorkflow/add_ab_keyword_entry_activityCategory.xml"/> <include relativeToChangelogFile="true" file="create_standardWorkflow.xml"/> diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgrading.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgrading.xml index 2e68fcc50aed2ce81e7f85561d2038d543ade168..291fb3795a0be056b7c1ca5b1bfbbaec5dd2bb78 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgrading.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgrading.xml @@ -1,126 +1,198 @@ <?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="autogenerated" id="93e9cf02-abc4-4e98-9717-c63f1785124c"> - <delete tableName="classificationgrading"/> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <delete tableName="CLASSIFICATIONGRADING"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="03aa277d-873b-4913-9051-d44aa4f77627"/> <column name="GRADING" value="C"/> <column name="MINPERCENT" valueNumeric="26"/> - <column name="CLASSIFICATIONGRADINGID" value="03aa277d-873b-4913-9051-d44aa4f77627"/> + <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="14da2618-88be-424c-92c3-68d8584aa0bf"/> <column name="GRADING" value="C"/> <column name="MINPERCENT" valueNumeric="26"/> - <column name="CLASSIFICATIONGRADINGID" value="14da2618-88be-424c-92c3-68d8584aa0bf"/> + <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="29226adf-eb79-4696-a4b8-7be73c9488e6"/> <column name="GRADING" value="B"/> <column name="MINPERCENT" valueNumeric="51"/> - <column name="CLASSIFICATIONGRADINGID" value="29226adf-eb79-4696-a4b8-7be73c9488e6"/> + <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="348a2af8-ec01-4a58-8ff6-5e3a837852a4"/> <column name="GRADING" value="C"/> <column name="MINPERCENT" valueNumeric="26"/> - <column name="CLASSIFICATIONGRADINGID" value="348a2af8-ec01-4a58-8ff6-5e3a837852a4"/> + <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="4ef54a02-ddf8-4238-b9fd-f5a043032b7d"/> <column name="GRADING" value="A"/> <column name="MINPERCENT" valueNumeric="76"/> - <column name="CLASSIFICATIONGRADINGID" value="4ef54a02-ddf8-4238-b9fd-f5a043032b7d"/> + <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="5e5c3ffe-3fa6-41e3-8659-1b03e7e1a1cd"/> <column name="GRADING" value="D"/> <column name="MINPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONGRADINGID" value="5e46e499-00c2-4cc2-9f4c-952290484623"/> - </insert> - <insert tableName="classificationgrading"> <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> - <column name="GRADING" value="D"/> - <column name="MINPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONGRADINGID" value="5e5c3ffe-3fa6-41e3-8659-1b03e7e1a1cd"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="68dd4d91-d472-477d-935c-70cbe5606c51"/> <column name="GRADING" value="A"/> <column name="MINPERCENT" valueNumeric="76"/> - <column name="CLASSIFICATIONGRADINGID" value="68dd4d91-d472-477d-935c-70cbe5606c51"/> + <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="748ef65c-af41-42d8-8ac4-480bc9390591"/> <column name="GRADING" value="B"/> <column name="MINPERCENT" valueNumeric="51"/> - <column name="CLASSIFICATIONGRADINGID" value="748ef65c-af41-42d8-8ac4-480bc9390591"/> - </insert> - <insert tableName="classificationgrading"> <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="76af9740-a714-4a35-bfd2-6eab3c316e5b"/> <column name="GRADING" value="D"/> <column name="MINPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONGRADINGID" value="76af9740-a714-4a35-bfd2-6eab3c316e5b"/> - </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> - <column name="GRADING" value="A"/> - <column name="MINPERCENT" valueNumeric="76"/> - <column name="CLASSIFICATIONGRADINGID" value="7afd58ad-6eae-4d6b-8d4b-2ca4bdd177e6"/> + <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="8408ca43-a4dc-4767-8127-e52c08276815"/> <column name="GRADING" value="D"/> <column name="MINPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONGRADINGID" value="8408ca43-a4dc-4767-8127-e52c08276815"/> + <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="8e73dd97-4428-4316-882d-7b2af56330ef"/> <column name="GRADING" value="C"/> <column name="MINPERCENT" valueNumeric="26"/> - <column name="CLASSIFICATIONGRADINGID" value="8c982beb-bc53-4bcf-8b76-7ee919bbf653"/> - </insert> - <insert tableName="classificationgrading"> <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> - <column name="GRADING" value="C"/> - <column name="MINPERCENT" valueNumeric="26"/> - <column name="CLASSIFICATIONGRADINGID" value="8e73dd97-4428-4316-882d-7b2af56330ef"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="8f702449-83fc-4085-92c2-ac09f96dcd6b"/> <column name="GRADING" value="B"/> <column name="MINPERCENT" valueNumeric="51"/> - <column name="CLASSIFICATIONGRADINGID" value="8f702449-83fc-4085-92c2-ac09f96dcd6b"/> + <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="9437f368-bea1-47f4-b76e-d6a391af438d"/> <column name="GRADING" value="B"/> <column name="MINPERCENT" valueNumeric="51"/> - <column name="CLASSIFICATIONGRADINGID" value="9437f368-bea1-47f4-b76e-d6a391af438d"/> + <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> </insert> - <insert tableName="classificationgrading"> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="9a823957-0ca9-4972-95df-d894d4e4fc24"/> + <column name="GRADING" value="D"/> + <column name="MINPERCENT" valueNumeric="0"/> <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="c021718f-b6ca-4d4d-87f7-e4449d103fe2"/> + <column name="GRADING" value="A"/> + <column name="MINPERCENT" valueNumeric="76"/> + <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="f8e1c5a4-b0d0-4b73-9700-11ff916adfdd"/> + <column name="GRADING" value="A"/> + <column name="MINPERCENT" valueNumeric="76"/> + <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="8766b78a-6a34-463e-81b9-d65a155b7585"/> + <column name="GRADING" value="B"/> + <column name="MINPERCENT" valueNumeric="50"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="a1ab44bd-6b2f-44cc-b580-1b8e7fc3b848"/> + <column name="GRADING" value="C"/> + <column name="MINPERCENT" valueNumeric="25"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="de9b8d9d-35d4-495c-b08f-0fea52136825"/> + <column name="GRADING" value="A"/> + <column name="MINPERCENT" valueNumeric="75"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="fdbd2912-7b71-4c5b-be35-800982faf677"/> <column name="GRADING" value="D"/> <column name="MINPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONGRADINGID" value="9a823957-0ca9-4972-95df-d894d4e4fc24"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="90850ec1-28d7-4bb4-bcdf-c28f56f4c46a"/> + <column name="GRADING" value="A"/> + <column name="MINPERCENT" valueNumeric="75"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="c477412e-5ebe-4de4-b0ec-5b7cc50c029e"/> <column name="GRADING" value="B"/> - <column name="MINPERCENT" valueNumeric="51"/> - <column name="CLASSIFICATIONGRADINGID" value="a89c81df-9380-41b1-9c7c-52d3a1862ac7"/> + <column name="MINPERCENT" valueNumeric="50"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="79637d40-0296-4dae-b7e6-cdc21c9ab15b"/> + <column name="GRADING" value="C"/> + <column name="MINPERCENT" valueNumeric="25"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="ad4ee82d-87de-4fe8-a695-894d05b4e0c6"/> + <column name="GRADING" value="D"/> + <column name="MINPERCENT" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="ffd0d8a3-dc7e-445b-ac5c-d7decf04a663"/> + <column name="GRADING" value="B"/> + <column name="MINPERCENT" valueNumeric="50"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="2fc0b52c-ec51-4bf9-a9ea-70d6834d4c59"/> + <column name="GRADING" value="D"/> + <column name="MINPERCENT" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="b962cd34-681b-4870-bbf9-0dd6054e3bab"/> + <column name="GRADING" value="C"/> + <column name="MINPERCENT" valueNumeric="25"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="1d6891f5-3595-4c79-a5d9-578c57fe0325"/> <column name="GRADING" value="A"/> - <column name="MINPERCENT" valueNumeric="76"/> - <column name="CLASSIFICATIONGRADINGID" value="c021718f-b6ca-4d4d-87f7-e4449d103fe2"/> + <column name="MINPERCENT" valueNumeric="75"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> </insert> - <insert tableName="classificationgrading"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="7eaa8e94-bab0-42d5-b206-e6506253a172"/> <column name="GRADING" value="A"/> - <column name="MINPERCENT" valueNumeric="76"/> - <column name="CLASSIFICATIONGRADINGID" value="f8e1c5a4-b0d0-4b73-9700-11ff916adfdd"/> + <column name="MINPERCENT" valueNumeric="75"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="46bbbfed-3d63-4b41-ada2-5cb56b3393f0"/> + <column name="GRADING" value="B"/> + <column name="MINPERCENT" valueNumeric="50"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="ebb9ed14-7522-457e-af42-c483716094b2"/> + <column name="GRADING" value="D"/> + <column name="MINPERCENT" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + </insert> + <insert tableName="CLASSIFICATIONGRADING"> + <column name="CLASSIFICATIONGRADINGID" value="42f13fc5-bbca-47fe-84ef-3089aae0ed18"/> + <column name="GRADING" value="C"/> + <column name="MINPERCENT" valueNumeric="25"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> </insert> </changeSet> </databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgroup.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgroup.xml index 61598f100b31dec6e1458b4eac98496e5e050524..127844a6034bc7646df371d825c3d2dfe168e1d4 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgroup.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationgroup.xml @@ -1,31 +1,26 @@ <?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="autogenerated" id="284cc44f-516c-4f51-af74-66aa3b82e011"> - <delete tableName="classificationgroup"/> - <insert tableName="classificationgroup"> - <column name="CLASSIFICATIONGROUPID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <delete tableName="CLASSIFICATIONGROUP"/> + <insert tableName="CLASSIFICATIONGROUP"> + <column name="CLASSIFICATIONGROUPID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="TITLE" value="1. Target group"/> <column name="SORTING" valueNumeric="1"/> - <column name="TITLE" value="1. Classification"/> </insert> - <insert tableName="classificationgroup"> - <column name="CLASSIFICATIONGROUPID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> + <insert tableName="CLASSIFICATIONGROUP"> + <column name="CLASSIFICATIONGROUPID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + <column name="TITLE" value="2. Customer value"/> <column name="SORTING" valueNumeric="2"/> - <column name="TITLE" value="2. Classification"/> - </insert> - <insert tableName="classificationgroup"> - <column name="CLASSIFICATIONGROUPID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> - <column name="SORTING" valueNumeric="3"/> - <column name="TITLE" value="3. Classification"/> </insert> - <insert tableName="classificationgroup"> - <column name="CLASSIFICATIONGROUPID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <insert tableName="CLASSIFICATIONGROUP"> + <column name="CLASSIFICATIONGROUPID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + <column name="TITLE" value="1. Classification"/> <column name="SORTING" valueNumeric="1"/> - <column name="TITLE" value="1. Target group"/> </insert> - <insert tableName="classificationgroup"> - <column name="CLASSIFICATIONGROUPID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <insert tableName="CLASSIFICATIONGROUP"> + <column name="CLASSIFICATIONGROUPID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + <column name="TITLE" value="2. Classification"/> <column name="SORTING" valueNumeric="2"/> - <column name="TITLE" value="2. Customer value"/> </insert> </changeSet> </databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationscore.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationscore.xml index c4e7fabc5d69fe601b3e678925f03643858c6137..27cee38103765c6acc071fe0e2498faabb88e58e 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationscore.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationscore.xml @@ -1,755 +1,699 @@ <?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="autogenerated" id="f340e2da-d636-426a-8662-fa08a3b5f82c"> - <delete tableName="classificationscore"/> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="01840c9d-2856-4882-a12a-303e58fd9d30"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="Purchasing"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="07f21cf8-c369-45f3-88fe-40ca586ed11b"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="100-199 D€"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="0803779b-73d8-47b3-9705-f5771c01e6a3"/> - <column name="SORT" valueNumeric="140"/> - <column name="TITLE" value="Automotive"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="be76dab1-c6ab-4b1e-8322-8b052ccda4d9"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="08764209-9b5e-4893-96d0-e2a347bccf60"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="low"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="09559e61-09ed-4f85-b0cb-fa7b0c66e488"/> - <column name="SORT" valueNumeric="150"/> - <column name="TITLE" value="Publishing house"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4d878689-15c0-46cc-acc8-3c524463db5c"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="0b671383-ecc3-440c-aff4-ff485da2755d"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="medium"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="10419ecc-335b-43c3-a1e3-8ecfbeda6f2b"/> - <column name="SORT" valueNumeric="60"/> - <column name="TITLE" value="Project management"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="107c199b-b315-4093-add5-48c496794bc9"/> - <column name="SORT" valueNumeric="110"/> - <column name="TITLE" value="Lottery"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f4d3791e-1717-4473-987b-0cd751805387"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="11418754-1667-437b-816b-adec4b9291f3"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="No project planned"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="1bc2b2aa-2582-4b0c-a2f8-04125b82ba33"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="Service"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="1f924d71-c500-4cdd-bc52-4718a6b88e45"/> - <column name="SORT" valueNumeric="70"/> - <column name="TITLE" value="Consultation"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="037a9de1-fa6d-4895-9db3-82f7769682ae"/> - <column name="SCOREPERCENT" valueNumeric="70"/> - <column name="CLASSIFICATIONSCOREID" value="206fd02f-68ec-42f2-83d1-92848f51dc1a"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Switzerland"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="2119cb62-b57c-40be-aff8-ace8e40378d4"/> - <column name="SORT" valueNumeric="120"/> - <column name="TITLE" value="Education"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="22581c2e-bb4d-43cb-b6b3-80244425e209"/> - <column name="SORT" valueNumeric="180"/> - <column name="TITLE" value="Service"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="037a9de1-fa6d-4895-9db3-82f7769682ae"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="2745d6c3-fffb-4f72-8bc2-92439a14e919"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="Other"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="29134094-66f2-4331-9f14-fc6a27ab111e"/> + <delete tableName="CLASSIFICATIONSCORE"/> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="792b98f9-96fc-44c2-81f7-cb64a1acfb5f"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Hersteller","key":"ORGMANUF","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="5aede29e-f419-4cf3-be46-0d1fc66f5790"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Partner","key":"ORGPARTNER","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="a8ea1409-f502-4e08-b298-b20740e4c1f1"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Lieferant","key":"ORGSUP","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="67402953-d5ac-4648-bfb3-d5e863d6f47b"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Kunde","key":"ORGCUTOMER","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="5e5de184-d355-45b8-8850-1651c550cb5b"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Interessent","key":"ORGPROSPECT","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="6406b82c-8318-4af5-9d3b-aa0144c63fb0"/> + <column name="CLASSIFICATIONTYPE_ID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Wettbewerber","key":"ORGCOMP","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="c7156bb3-65e4-4681-b825-cf73b25e9e5b"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="35.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="2500"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="df7854c7-626d-4992-bf29-d5700ca97382"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="3000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="14bf184c-10fa-49c2-b4e7-c4d55d0f7376"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="10.00"/> + <column name="SORT" valueNumeric="6"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="100"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="96c5c764-8aa8-40d1-a1ab-9f5dee7e2431"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="75.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="7500"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="3fc94231-af75-462c-8b54-9c4bc724d7e1"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="25.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="1000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="65d3fec9-54e1-4925-8368-b81ab7d98e68"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="5.00"/> + <column name="SORT" valueNumeric="7"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="0"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="619ba460-e446-48bf-90c2-2d4bb40394c2"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="15.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="500"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="dd9e7f83-2feb-4847-b17c-f5a4f52034da"/> + <column name="CLASSIFICATIONTYPE_ID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="5000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="b5fe2ee7-4638-4bed-9093-a66fd68fc69a"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="30.00"/> + <column name="SORT" valueNumeric="6"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Service","key":"bb0c6356-33be-4e7c-a409-9ef5145f7aae","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="b5c901fb-1899-4715-b0eb-fa0164eaa89e"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"NPO","key":"4fcd8bb8-72fd-48d0-9e64-4c80e5177c36","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="202d8cd4-524e-4921-8261-803b4f7205b9"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Behörde","key":"2bdb04cb-4cd3-4454-802c-8e2b4a5e2e36","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="76ee8f19-4c25-4910-b7bc-efb8baba3850"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Finanzdienstleistung","key":"26385e16-6b2f-428c-9c28-1bfa9c2ccf6f","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="035fb82f-0b35-4386-a068-8af8cace3982"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Logistik","key":"617da3f5-d8bc-45ff-85a1-258621ea2a0b","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="4cfce46c-25c6-4937-92da-511341c8ee93"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Bauwesen","key":"79378933-9f74-4391-b876-4528b582661f","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="7d5e5df9-f285-4fee-9ed5-b5da273f5ce0"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="7"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Maschinenbau","key":"9882c4bc-a3d9-43a9-8238-81ef39387869","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="52dc6603-517e-4381-bb5e-a0aa5929c09c"/> + <column name="CLASSIFICATIONTYPE_ID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Handel","key":"acafca42-8ef4-4c21-abe8-1c2ca358a5aa","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="0bbd5007-85dc-47d1-8bd3-c465bf3a640f"/> + <column name="CLASSIFICATIONTYPE_ID" value="6f179460-4b93-4bd4-b85d-5771dbad7289"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImU3M2VkOTI5LTg2MzEtNDZkZS1iMjhmLWViMTQyM2FiYjgwOCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"mittel","key":"0a6cbbc0-bd0e-4794-96ef-3d458d5fdb70","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="e63a23b4-555d-4b96-a7fe-025cc3ed3b03"/> + <column name="CLASSIFICATIONTYPE_ID" value="6f179460-4b93-4bd4-b85d-5771dbad7289"/> + <column name="SCOREPERCENT" valueNumeric="30.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImU3M2VkOTI5LTg2MzEtNDZkZS1iMjhmLWViMTQyM2FiYjgwOCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"gering","key":"ed4c3079-51b0-4bb5-b228-55de4309d5ab","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="e7c4b6d3-2414-4a37-8ffe-ca0b2a9710ba"/> + <column name="CLASSIFICATIONTYPE_ID" value="6f179460-4b93-4bd4-b85d-5771dbad7289"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImU3M2VkOTI5LTg2MzEtNDZkZS1iMjhmLWViMTQyM2FiYjgwOCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"unbekannt","key":"fdcb07f0-a815-44f3-be47-00eaebfffe0d","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="9e83f2ce-36f7-4a7e-af74-bfc6cbdc6bc8"/> + <column name="CLASSIFICATIONTYPE_ID" value="6f179460-4b93-4bd4-b85d-5771dbad7289"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImU3M2VkOTI5LTg2MzEtNDZkZS1iMjhmLWViMTQyM2FiYjgwOCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"gross","key":"c85a5ebe-80fe-4176-a92a-35d2200baa07","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="a6096a3f-91e8-4fef-bc9e-1c9dfeef44a8"/> + <column name="CLASSIFICATIONTYPE_ID" value="8a2c4cf5-c2b7-4588-9a33-3387d784a90b"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImYxMWY2NWQwLTQzNTItNGY4MS04NWQwLWJmZDAzNDI3NWUzNCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"A","key":"292825e8-fa96-4b7b-8dab-71955ae14571","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="0a7cbbd4-57fa-45ea-9608-4fbacda2e25a"/> + <column name="CLASSIFICATIONTYPE_ID" value="8a2c4cf5-c2b7-4588-9a33-3387d784a90b"/> + <column name="SCOREPERCENT" valueNumeric="25.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImYxMWY2NWQwLTQzNTItNGY4MS04NWQwLWJmZDAzNDI3NWUzNCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"D","key":"9e20d257-e2a7-4ef7-9253-1d8ed971b7b9","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="497f09cb-0a88-4da4-be16-6339792abb9a"/> + <column name="CLASSIFICATIONTYPE_ID" value="8a2c4cf5-c2b7-4588-9a33-3387d784a90b"/> + <column name="SCOREPERCENT" valueNumeric="75.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImYxMWY2NWQwLTQzNTItNGY4MS04NWQwLWJmZDAzNDI3NWUzNCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"B","key":"e7e05c6e-6108-44bd-824a-c076dfa5ae93","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="16248e32-8a66-4563-aa15-c76b44c97217"/> + <column name="CLASSIFICATIONTYPE_ID" value="8a2c4cf5-c2b7-4588-9a33-3387d784a90b"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImYxMWY2NWQwLTQzNTItNGY4MS04NWQwLWJmZDAzNDI3NWUzNCIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"C","key":"957d61a4-0038-46e0-b5a3-fc2a5d413004","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="76f40d95-612a-4182-98d2-7de97569fde9"/> + <column name="CLASSIFICATIONTYPE_ID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Wettbewerber","key":"1d30d0ab-6103-4972-84c0-fd23eef15ca1","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="ef34ba24-6df6-4642-91ad-5187532ec652"/> + <column name="CLASSIFICATIONTYPE_ID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Kunde","key":"17746b46-2702-447a-b749-a92bfdf4bb38","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="10d82a29-f89b-4d2e-a3a2-0b06a3b1ea5e"/> + <column name="CLASSIFICATIONTYPE_ID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Interessent","key":"d0a9eb78-6dcf-48e0-ba91-04a3ba104d26","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="0e5a99a0-2caa-491e-9630-01dbf6f15d10"/> + <column name="CLASSIFICATIONTYPE_ID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Hersteller","key":"e4a60941-513f-4e75-a787-f00070ecb00a","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="94f2a7f9-a808-4e20-b12a-690075ce5ea2"/> + <column name="CLASSIFICATIONTYPE_ID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="SCOREPERCENT" valueNumeric="70.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Partner","key":"d14f6eea-8760-43bf-ad3a-e7c3e4416392","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="4e2312e5-2477-4a6d-907c-2c0e3fbe94b5"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Dumpingpreis Wettbewerb","key":"be60e4b3-19b1-48a9-ad5c-c7d38698b4a1","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="925f92f3-e081-49fb-bd7a-1ffb949522b2"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Entscheidungsträger hat sich geändert","key":"07fc6730-6c83-4996-bfd9-41c18765a10a","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="76ad6bf7-5e9a-4fac-896c-9fa8d9237be0"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Qualitätsproblem Kunde","key":"85c9cdd8-f7a6-4210-840e-fab8628f4dbe","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="75bd476e-a314-49c4-a0c2-c5974b0b810b"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="0.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"kein Risiko","key":"974bbd28-08b3-41a4-bd74-7d9c3c778249","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="d1640ee2-e6e0-410d-9f35-6e9fe29b638e"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="5.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Zahlungsproblem Kunde","key":"953e3b5e-0ca7-4215-8dee-b0ba28ef1bf9","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="104055a9-f43e-4071-8b8e-58e7db75cce9"/> + <column name="CLASSIFICATIONTYPE_ID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> + <column name="SCOREPERCENT" valueNumeric="70.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Projektverschiebung Kunde","key":"6db07a20-86bc-48da-8b27-b39bdd73b86b","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="cdbe6c86-0a1e-423f-8883-9a22a572e53b"/> + <column name="CLASSIFICATIONTYPE_ID" value="2e2ff9bc-6acf-4870-925b-be8f13571ddb"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Aktiv","key":"CONTACTSTATACTIVE","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="bd3afc9b-d1c2-420d-ad64-72c106a5f890"/> + <column name="CLASSIFICATIONTYPE_ID" value="2e2ff9bc-6acf-4870-925b-be8f13571ddb"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"zur Prüfung","key":"CONTACTSTATREVIEW","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="e73be9de-27de-4b30-9677-3df4cbfff3fd"/> + <column name="CLASSIFICATIONTYPE_ID" value="2e2ff9bc-6acf-4870-925b-be8f13571ddb"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Inaktiv","key":"CONTACTSTATINACTIVE","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="dfb76c1f-92e8-4677-b85c-c739fd028d38"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="40000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="a57799f6-51da-4057-9cb9-fde257f42248"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="0.00"/> + <column name="SORT" valueNumeric="7"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="0"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="68a483c5-85ab-46eb-9a95-02910256edac"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="25000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="8d82b200-41d5-49c6-b4e8-999719922936"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="10.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="1000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="7b25f6f1-f6bb-4624-a5d8-76f2db32d956"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="10000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="2e009253-1b38-4949-8421-04074fb2aa9f"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="50000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="5d1a5d2c-6019-4486-811f-4fa20ad27f0b"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="5.00"/> + <column name="SORT" valueNumeric="6"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="100"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="59bfc822-823e-4059-bac6-f6ad7a747c29"/> + <column name="CLASSIFICATIONTYPE_ID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="5000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="fe74f937-b53a-4386-b290-ffd86376f86a"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Vertagt","key":"SALPROJSTATPOSTPONED","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="5de5ac3f-58c0-4d41-9428-570e0c03e921"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Teilauftrag","key":"SALPROJSTATPARTIAL","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="cc985c15-e282-4548-b63e-c0a3645301e0"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="70.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Offen","key":"SALPROJSTATOPEN","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="2da43bc4-759b-49ac-a4eb-b1129bce02a8"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Abgebrochen","key":"SALPROJSTATABORT","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="07788bdd-5918-4f76-8c25-0fbe45bf2b89"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Bestellung","key":"SALPROJSTATORDER","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="6f85b6e5-5d4d-41ad-8dab-8c4b0e5f8760"/> + <column name="CLASSIFICATIONTYPE_ID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> + <column name="SCOREPERCENT" valueNumeric="0.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"STATUS","operator":"EQUAL","value":"Verloren","key":"SALPROJSTATLOST","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="f1756e15-ad79-4141-8281-2b2c6fdc5271"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="30.00"/> + <column name="SORT" valueNumeric="7"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="20"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="9197c144-bfdb-477d-bd33-18ee5c492bef"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="70"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="3771d32a-5eaf-43fa-98b8-0870848eb137"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="90"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="3e684949-1b47-43e7-b5a4-bfb0a0eda149"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="50"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="9ed7ac97-2098-4eda-bd16-adee75a12b33"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="10.00"/> + <column name="SORT" valueNumeric="9"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="1"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="83f6b3c1-eb66-4bbf-8225-c6237607a96f"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="90.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="80"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="4c96a7b4-fcf2-4fc4-ad77-ffbcc9102793"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="6"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="30"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="db28aea5-bdce-4adb-952b-d61252f8f18b"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="0.00"/> <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="0-49 D€"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="2a516661-537d-473e-864a-c2f721b96a42"/> - <column name="SORT" valueNumeric="180"/> - <column name="TITLE" value="Service"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPERCENT" valueNumeric="80"/> - <column name="CLASSIFICATIONSCOREID" value="2cd8d11f-ee3f-429b-a16a-7839cf30b62d"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="51-100"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="2f3b6088-d78f-4fba-998d-b18a6b981485"/> - <column name="SORT" valueNumeric="170"/> - <column name="TITLE" value="Environment"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="2f4fddd2-be83-4190-99c3-6de8a7e328c5"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="0 to 49T"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="54128957-c80b-4b5a-ad1b-cfce665dfb10"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="2fdb4d7e-24d5-4eb1-a130-3a0aaeebd8db"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Germany"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="3035e36e-ee6a-45d1-9d68-920cd3666362"/> - <column name="SORT" valueNumeric="70"/> - <column name="TITLE" value="Student/Internship"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="35d8ae15-8993-4ab2-99f6-e57c2ebf0bb3"/> - <column name="SORT" valueNumeric="80"/> - <column name="TITLE" value="Food"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPERCENT" valueNumeric="16"/> - <column name="CLASSIFICATIONSCOREID" value="39547328-ccc6-47ad-b31a-d6a149081c44"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="0 to 49"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="3c9ceefa-5c98-4629-9c6d-d46b6cad8b78"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="251 to 1,000"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="2031525e-6ca3-46b4-91d4-7f90cd31a630"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="3dc5fc76-d2d5-4911-891a-3aacc5a9c925"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Yes"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="2a702a31-9907-4f1b-abfd-3342640f1c9e"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="3e1e21b0-c10d-4bcb-882c-ac1b239b9cb2"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Standard"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="3eb18b76-f51e-4ad2-9080-74b4a603667b"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Machinery and equipment"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="3fe9f04b-6a85-4a73-a138-ca90b6d8e61c"/> - <column name="SORT" valueNumeric="190"/> - <column name="TITLE" value="Public"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="41300a6c-8dc7-4b5a-9fb1-cecd3d5cbb8c"/> - <column name="SORT" valueNumeric="160"/> - <column name="TITLE" value="Electric"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="41d43723-7d19-4a7e-936a-df9013db7dfb"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Logistics"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="80c6ec8b-eb54-4d25-a4f5-0adaf4cdc84e"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="4285d598-06c0-435d-bb5e-28dec5f31521"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="high"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="970b251c-ca6e-43f4-9162-ebc5d1142a8b"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="47ca5b54-423f-4bf1-a4d6-a0c55a2488e6"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Commodity group 1"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="47ec3dbf-f8f6-4418-8dc2-0062510c1a28"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Sales"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="be76dab1-c6ab-4b1e-8322-8b052ccda4d9"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="4982ab85-0961-4d85-8fee-2b55887add96"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="high"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="4c8cfcec-f183-4d82-8a59-ae743ec772b4"/> - <column name="SORT" valueNumeric="130"/> - <column name="TITLE" value="Trade"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPERCENT" valueNumeric="20"/> - <column name="CLASSIFICATIONSCOREID" value="4d868dc5-747a-4f22-9134-638198d3084a"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="0-50"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="95396ee7-f0e2-41b4-995e-bac5749709ec"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="4ed5e22f-222a-4a51-83d3-597fa035d2df"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Negative"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="51575eb6-4005-42d2-96f3-b35dfd06a86b"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="101-250"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="80c6ec8b-eb54-4d25-a4f5-0adaf4cdc84e"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="5564a330-8c13-424f-a24b-5f97185a9036"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="low"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="56a56ec0-34c1-419f-81c2-1c1310d685d2"/> - <column name="SORT" valueNumeric="120"/> - <column name="TITLE" value="Education"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4d878689-15c0-46cc-acc8-3c524463db5c"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="5be4d454-1f3e-4a3d-b8a4-3eb49ce1bc35"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="high"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="5ca391a5-9de8-41e6-9792-17cf8deaa7e7"/> - <column name="SORT" valueNumeric="90"/> - <column name="TITLE" value="Energy"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="618bf0d1-18d4-4a96-900c-80a5a616da9b"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Logistics"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="2a702a31-9907-4f1b-abfd-3342640f1c9e"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="61fe4e4f-e64d-4195-87b5-658f36ce1736"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Individual"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="57604bc1-d99f-4d61-b28d-55218a72045b"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="636af750-fcd3-4480-bfe7-ead42bf85280"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Choice"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="6632b510-7094-45d6-b7ef-946e759429a3"/> - <column name="SORT" valueNumeric="140"/> - <column name="TITLE" value="Automotive"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="6bd19de4-691b-4e78-84dc-cf6f41231978"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Management/Sales Manager"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPERCENT" valueNumeric="20"/> - <column name="CLASSIFICATIONSCOREID" value="6d6653ae-024e-444c-aeae-561874d55569"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="50 to 99T"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="be76dab1-c6ab-4b1e-8322-8b052ccda4d9"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="6fe28489-2383-412b-9bbd-4f01a9421775"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="medium"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="733323d6-ff3d-4ccb-b179-ad1fea05dfe8"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="200-349 D€"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="54128957-c80b-4b5a-ad1b-cfce665dfb10"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="7d6f716a-97c7-417b-a8c0-3cb71e403dde"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Other"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="7e569319-5885-452e-9331-a507f3365236"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Overarching"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="839cd672-5981-4207-8a82-caddd00107e4"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="50-99 D€"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4d878689-15c0-46cc-acc8-3c524463db5c"/> - <column name="SCOREPERCENT" valueNumeric="0"/> - <column name="CLASSIFICATIONSCOREID" value="893720f9-3780-4868-af0c-cbef5a564024"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="low"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="037a9de1-fa6d-4895-9db3-82f7769682ae"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="8d7bc557-e020-42c9-83d9-ff84fcbd12b7"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Austria"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="90361317-d80e-4466-a45b-3021bf02e2f9"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="101 to 250"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="904e2dbe-49a1-42a0-a5db-0f274334dd7f"/> - <column name="SORT" valueNumeric="160"/> - <column name="TITLE" value="Electric"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="9181a683-dcab-47fc-af7b-e282505348d6"/> - <column name="SORT" valueNumeric="90"/> - <column name="TITLE" value="Energy"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPERCENT" valueNumeric="60"/> - <column name="CLASSIFICATIONSCOREID" value="92708239-fd7f-4699-8aaa-b6290fedaac0"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="251-1000"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="92c8f126-b31e-4011-bbf0-cb5e57bfc3e5"/> - <column name="SORT" valueNumeric="60"/> - <column name="TITLE" value="Finance"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="9a3183db-8a38-4cf1-a234-3e2cf20a4f77"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="IT"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="9ac96400-9c47-4d4f-be5b-e053f92a54ce"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="IT"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="8c1e8f81-145f-4efe-936f-3f4147f4d59a"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="a0c55ee2-0d15-4779-a5a6-93774d5bc393"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="OnPremise"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="a0fcd2e2-40c8-40b8-8a5b-e591154c248a"/> - <column name="SORT" valueNumeric="110"/> - <column name="TITLE" value="Lottery"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="54128957-c80b-4b5a-ad1b-cfce665dfb10"/> - <column name="SCOREPERCENT" valueNumeric="37"/> - <column name="CLASSIFICATIONSCOREID" value="a177b155-4665-4af1-b50e-0b59e8ac2752"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="Switzerland"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="95396ee7-f0e2-41b4-995e-bac5749709ec"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="a60aaf2d-88aa-4c72-9606-0eb3ac9493cf"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Positive"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="8c1e8f81-145f-4efe-936f-3f4147f4d59a"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="a61e3451-296b-4812-a7b2-425963176f80"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Cloud"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="a7e70abc-4d98-467d-a475-66bbd101de1d"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Head of IT"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="b1c55bcd-16c6-4b2f-8f73-e16397b40e93"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="from 1,000"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f4d3791e-1717-4473-987b-0cd751805387"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="b3792b08-4b07-4ed2-9bee-4673182b7349"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Within 6 months"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="970b251c-ca6e-43f4-9162-ebc5d1142a8b"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="b41e180f-db8c-44c3-9fbb-179ab58d5852"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Commodity group 3"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="037a9de1-fa6d-4895-9db3-82f7769682ae"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="b7b763d4-994d-483d-9a1c-6eb85786d61a"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Germany"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPERCENT" valueNumeric="60"/> - <column name="CLASSIFICATIONSCOREID" value="ba5d70c3-e77a-45ff-828b-7b3e0a61eec2"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="200 to 349T"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="33"/> - <column name="CLASSIFICATIONSCOREID" value="bf44ae05-a4c4-4ee9-ad6e-7d64474afeff"/> - <column name="SORT" valueNumeric="60"/> - <column name="TITLE" value="Finance"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="bf6b1757-11da-49a9-a02c-8340139968ee"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="Service Manager"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f4d3791e-1717-4473-987b-0cd751805387"/> - <column name="SCOREPERCENT" valueNumeric="33"/> - <column name="CLASSIFICATIONSCOREID" value="c328cb9e-5cef-4052-a3c1-98e1898eeb63"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="No date yet"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="c6300eeb-0494-4eba-89b1-23afdbb397e9"/> - <column name="SORT" valueNumeric="150"/> - <column name="TITLE" value="Publishing house"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="c9d4e28d-7935-42c5-9da5-5ce0b51b425a"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="CRM Manager"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="95396ee7-f0e2-41b4-995e-bac5749709ec"/> - <column name="SCOREPERCENT" valueNumeric="40"/> - <column name="CLASSIFICATIONSCOREID" value="cddaf52d-37b7-426c-b858-c986e58544e6"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Stagnated"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="d032f425-5739-4f0c-8103-e102fe0d3ccf"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="Skilled workers"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="80c6ec8b-eb54-4d25-a4f5-0adaf4cdc84e"/> - <column name="SCOREPERCENT" valueNumeric="33"/> - <column name="CLASSIFICATIONSCOREID" value="d0f5c576-e1cd-463e-82d2-e09c46ccb2a0"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="medium"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="75"/> - <column name="CLASSIFICATIONSCOREID" value="d2a75f81-d0b3-48ce-be97-5e6add962cbb"/> - <column name="SORT" valueNumeric="70"/> - <column name="TITLE" value="Consultation"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPERCENT" valueNumeric="60"/> - <column name="CLASSIFICATIONSCOREID" value="d578aa09-5d14-4ace-8cd0-572c5efcd82e"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="ab 1000"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="57604bc1-d99f-4d61-b28d-55218a72045b"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="d5beb18f-c53e-438d-8b0b-7699aa20fba7"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Rate"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPERCENT" valueNumeric="33"/> - <column name="CLASSIFICATIONSCOREID" value="d7d807a2-8a97-4a0e-9d1c-fb8c7a703599"/> - <column name="SORT" valueNumeric="40"/> - <column name="TITLE" value="50 to 100"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="df7ea293-1fd6-4e98-ba3f-7d975fa8eaeb"/> - <column name="SORT" valueNumeric="170"/> - <column name="TITLE" value="Environment"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="57604bc1-d99f-4d61-b28d-55218a72045b"/> - <column name="SCOREPERCENT" valueNumeric="16"/> - <column name="CLASSIFICATIONSCOREID" value="e6ab210e-6a26-4a12-9d50-ff8bd392c590"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Search"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="2031525e-6ca3-46b4-91d4-7f90cd31a630"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="e70a23b4-f2a9-4438-8ba6-742c6c17e5cc"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="No"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPERCENT" valueNumeric="40"/> - <column name="CLASSIFICATIONSCOREID" value="e824d7e3-dfbe-4f34-a5c7-8f2226aade7e"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="100 to 199T"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="e8741cb0-9ada-48dd-89d1-f00a1a755c38"/> - <column name="SORT" valueNumeric="60"/> - <column name="TITLE" value="Counsellor"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="ec51d975-bda6-415e-9b91-32f0e981ecd8"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Building and construction suppliers"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="54128957-c80b-4b5a-ad1b-cfce665dfb10"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="ecf421ef-66b2-4f9f-98c6-ee8a73e753da"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Austria"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="ed6a38f7-97bf-4e3d-a34c-4a1e636fa6a7"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="from 350T"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="efec90bd-c99f-49d9-bd52-df0ae6f938a3"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Machinery and equipment"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="f02cfd28-5a09-42ca-b805-07b7b38e3363"/> - <column name="SORT" valueNumeric="50"/> - <column name="TITLE" value="ab 350 D€"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="f1534026-34cc-4898-8711-41cbe4accb60"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="Marketing"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="f678b3e0-72c4-4b48-90c0-054bf3612dc2"/> - <column name="SORT" valueNumeric="130"/> - <column name="TITLE" value="Trade"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="fae1ef0a-5d07-4725-907f-4b2ac5814328"/> - <column name="SORT" valueNumeric="100"/> - <column name="TITLE" value="Industry"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="f4d3791e-1717-4473-987b-0cd751805387"/> - <column name="SCOREPERCENT" valueNumeric="66"/> - <column name="CLASSIFICATIONSCOREID" value="fb8cb769-d95b-468a-ac64-7ee0cefd46a7"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="unknown"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPERCENT" valueNumeric="25"/> - <column name="CLASSIFICATIONSCOREID" value="fd022500-4cbc-461f-abb9-b0ec3d8e1dd1"/> - <column name="SORT" valueNumeric="80"/> - <column name="TITLE" value="Food"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="970b251c-ca6e-43f4-9162-ebc5d1142a8b"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="fd8a348a-dc1f-414b-b95e-b1a6aeb9a8d4"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Commodity group 2"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="df4aacdc-7e17-484c-a96e-a07550a7220e"/> - <column name="SCOREPERCENT" valueNumeric="100"/> - <column name="CLASSIFICATIONSCOREID" value="4c769195-7bce-45e7-9176-782ff98de8d4"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Commodity group 1"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="df4aacdc-7e17-484c-a96e-a07550a7220e"/> - <column name="SCOREPERCENT" valueNumeric="50"/> - <column name="CLASSIFICATIONSCOREID" value="21697201-96ae-4c52-848e-e3d228e003b8"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Commodity group 2"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="b28846e6-befe-4318-93d8-de54fcae369c"/> - <column name="SCOREPERCENT" valueNumeric="10"/> - <column name="CLASSIFICATIONSCOREID" value="aa5f6e3a-3e0f-42bb-ba12-fc7483410f1e"/> - <column name="SORT" valueNumeric="10"/> - <column name="TITLE" value="Low"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="b28846e6-befe-4318-93d8-de54fcae369c"/> - <column name="SCOREPERCENT" valueNumeric="30"/> - <column name="CLASSIFICATIONSCOREID" value="cb8bee7a-5a18-421c-8c5d-6650d29e480e"/> - <column name="SORT" valueNumeric="20"/> - <column name="TITLE" value="Medium"/> - </insert> - <insert tableName="classificationscore"> - <column name="CLASSIFICATIONTYPE_ID" value="b28846e6-befe-4318-93d8-de54fcae369c"/> - <column name="SCOREPERCENT" valueNumeric="60"/> - <column name="CLASSIFICATIONSCOREID" value="124fd303-acb0-4e0b-a411-0473577a0da9"/> - <column name="SORT" valueNumeric="30"/> - <column name="TITLE" value="High"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="0"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="a2184688-5ace-428c-a0f9-d5103b8819bf"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="8"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="10"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="42f1303e-106a-4497-8021-3c3b892d9b45"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="70.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="60"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="fca4c9b7-3c93-4af9-8ccc-e39b072dcd09"/> + <column name="CLASSIFICATIONTYPE_ID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="40"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="e55496bf-3cdf-4413-8afd-4797f84536e0"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="10.00"/> + <column name="SORT" valueNumeric="6"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="2500"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="6d5ac2b0-5786-41a0-8a18-13802eb9733d"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="500000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="5b70d13a-2a74-4d92-8892-217d292be436"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="30.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="25000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="7701aa46-d3c9-4416-b355-54bb924d9746"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="75.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="750000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="e75a49ad-7f2b-47e6-b395-8a04e74c55d1"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="5.00"/> + <column name="SORT" valueNumeric="7"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="1000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="4832fd88-ecbc-424a-8821-53f600f22a9a"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="10000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="6b403a34-c926-4114-9d0d-d16ce253473c"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="15.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="5000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="63ca5f2c-38d0-42ad-96ae-bb2cd8cef80e"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="1.00"/> + <column name="SORT" valueNumeric="8"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="0"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="276841d7-eefb-48ce-8be6-dc3478633734"/> + <column name="CLASSIFICATIONTYPE_ID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORNUMBER" value="1000000"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="46682106-7b88-4f96-a1a5-2034106c570d"/> + <column name="CLASSIFICATIONTYPE_ID" value="fe91e86e-a0ec-4475-b006-f2b2fef8aabb"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImZkMzk2M2JjLThlNjAtNDExYS05OTExLWI5N2ViNzNlNWNmNyIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Bestandskunde","key":"be3b5fe2-2146-4eab-80a4-3c1cf4d6156a","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="c68596b1-7689-4d08-9954-862517ae2996"/> + <column name="CLASSIFICATIONTYPE_ID" value="fe91e86e-a0ec-4475-b006-f2b2fef8aabb"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImZkMzk2M2JjLThlNjAtNDExYS05OTExLWI5N2ViNzNlNWNmNyIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Intern","key":"3265f271-2e85-42b2-84af-c9e23e8a1e8c","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="3f76bf89-56e0-4ed0-9a76-73b46561d6d8"/> + <column name="CLASSIFICATIONTYPE_ID" value="fe91e86e-a0ec-4475-b006-f2b2fef8aabb"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImZkMzk2M2JjLThlNjAtNDExYS05OTExLWI5N2ViNzNlNWNmNyIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Interessent","key":"87204e4b-2db2-4eb4-b216-5e16b227561e","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="012e9028-cd1f-4d31-8858-4898a3ac97e7"/> + <column name="CLASSIFICATIONTYPE_ID" value="fe91e86e-a0ec-4475-b006-f2b2fef8aabb"/> + <column name="SCOREPERCENT" valueNumeric="50.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"#EXTENSION.Attribute_filter.eyJpZCI6ImZkMzk2M2JjLThlNjAtNDExYS05OTExLWI5N2ViNzNlNWNmNyIsInR5cGUiOiJDT01CTyJ9#TEXT","operator":"EQUAL","value":"Partner","key":"615d3850-ef32-4988-9a8d-7b702b489194","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="2276760a-43ca-4b0f-bbd8-f90769323e7f"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="sixMonthsAgo"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="2b71050c-c29f-4ff2-9388-2bcbf48e2acf"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="5"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="oneYearAgo"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="2519e132-e571-46be-8032-7496d7e091c8"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="nextMonth"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="f737993f-0e3a-4e5d-a331-c78181e1d09b"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="lastMonth"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="bda9a62d-53e2-4120-a8dc-b0190a9b64f0"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="inSixMonths"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="8f5976fe-0770-4e20-b29c-28f1a888aa06"/> + <column name="CLASSIFICATIONTYPE_ID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[]}}"/> + <column name="INDICATORTEXT" value="inOneYear"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="83b0f813-e475-4f6b-b322-6b21bc38fab9"/> + <column name="CLASSIFICATIONTYPE_ID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> + <column name="SCOREPERCENT" valueNumeric="80.00"/> + <column name="SORT" valueNumeric="1"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"PHASE","operator":"EQUAL","value":"Offer","key":"SALPROJPHASEOFFER","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="86a9fe82-c139-4b9c-b458-be2d8fb99fbf"/> + <column name="CLASSIFICATIONTYPE_ID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> + <column name="SCOREPERCENT" valueNumeric="40.00"/> + <column name="SORT" valueNumeric="3"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"PHASE","operator":"EQUAL","value":"Lead","key":"SALPROJPHASELEAD","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="827e0865-456a-4af9-8f04-bb2e720e41ec"/> + <column name="CLASSIFICATIONTYPE_ID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> + <column name="SCOREPERCENT" valueNumeric="60.00"/> + <column name="SORT" valueNumeric="2"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"PHASE","operator":"EQUAL","value":"Prospect","key":"SALPROJPHASEPROS","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="779119a0-2b43-42b6-8045-c8326652c39c"/> + <column name="CLASSIFICATIONTYPE_ID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> + <column name="SCOREPERCENT" valueNumeric="100.00"/> + <column name="SORT" valueNumeric="0"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"PHASE","operator":"EQUAL","value":"Negotiation","key":"SALPROJPHASENEGO","contenttype":"TEXT"}]}}"/> + </insert> + <insert tableName="CLASSIFICATIONSCORE"> + <column name="CLASSIFICATIONSCOREID" value="827dc207-acc9-4fcf-93c6-ad94a2d3ae5f"/> + <column name="CLASSIFICATIONTYPE_ID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> + <column name="SCOREPERCENT" valueNumeric="20.00"/> + <column name="SORT" valueNumeric="4"/> + <column name="FIELDVALUE" value="{"entity":"Salesproject_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"PHASE","operator":"EQUAL","value":"Contact","key":"SALPROJPHASECONTACT","contenttype":"TEXT"}]}}"/> </insert> </changeSet> </databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationstorage.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationstorage.xml index e212d1053b859475ea540c8c5759f3cefffd8670..32b733dd138909693a1274ce8e6cb324cd1740cc 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationstorage.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationstorage.xml @@ -2,186 +2,186 @@ <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="autogenerated" id="489ad8c4-660a-4043-b5ea-09969fee2252"> <delete tableName="classificationstorage"/> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="04b4ac80-a316-437a-b113-e7de14e181a8"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="ABB"/> + <column name="CLASSIFICATIONVALUE" value="AC"/> <column name="OBJECT_ROWID" value="7e2680f6-a438-45aa-956a-787363f85923"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="0adb8953-1685-45cf-bcf7-c2c2098aa215"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="AB"/> + <column name="CLASSIFICATIONVALUE" value="AC"/> <column name="OBJECT_ROWID" value="dec94545-2487-46d5-978d-26ee0fcf0f5f"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="1251e4b0-195d-4556-a10e-7942f1b0e337"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="AB"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="6efb4fab-64f9-4d8e-aa6f-a158d13fc273"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="166e729d-45c6-4dab-bff2-940d2b618f6b"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="ADB"/> + <column name="CLASSIFICATIONVALUE" value="BB"/> <column name="OBJECT_ROWID" value="438537db-0dc6-4aed-b1d1-813011baf88c"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="1aafcbf6-6feb-4916-a4fd-58c138eb8f8f"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="DBA"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="6d3d16cd-733e-41d1-ab6c-8a6cba63ba4a"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="25a1b340-538d-4c4f-8b1e-25126286cd53"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BB"/> <column name="OBJECT_ROWID" value="b219b58a-f120-42d8-9a64-0b176501eac7"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="2ab913d3-e1a8-4fe2-904b-77b02f6be689"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BA"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="fc465f2f-803b-4a1f-b79d-7b466d7ecff4"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="3893da8a-f357-46e0-a0b9-65aa58b0dfa6"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="777246d5-7a73-4c52-af14-84df66128e5d"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="42cc772e-53c6-4849-be29-ebb4e18ab860"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="ACB"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="d422ad81-717f-42b0-bd64-fc892744aac7"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="471aafd5-a348-453f-8b2a-64bb365fd0ee"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="ACB"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="ef7f4726-4476-4f59-97c2-706dc1e0046f"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="4ce62df5-f0ea-4593-a152-6704c61d7cef"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BD"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="2c14fb05-d48e-4eeb-8a7f-85d423746848"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="63dd36bb-74b8-487b-811f-521438ef9491"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="AC"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="019651a4-503e-4e06-aefd-e7e631bf3144"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="7a4762f5-90a3-4b6c-8a5d-93125381c18a"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="e83c45e0-c30b-436e-b445-00a8b58383b0"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="7b2eb62a-b686-4eaf-bde1-2e1dd1028f65"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="fb07cb0e-c391-4503-9c47-a39ec7388f4f"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="7e59d485-01a8-4e43-9655-ba751d5983a4"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="449080f6-b714-4189-a261-37439d0d4010"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="7f7dfe1d-cb98-44c8-8106-858d991d2b06"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="CLASSIFICATIONVALUE" value="ACA"/> + <column name="CLASSIFICATIONVALUE" value="CC"/> <column name="OBJECT_ROWID" value="ebb04ae2-d1f9-4ef3-bdfa-e9f562d215ba"/> + <column name="OBJECT_TYPE" value="Salesproject"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="80eac6e6-f237-455e-96fd-8484722a79d4"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BD"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="a3fd3c23-12e1-4820-b76e-2cd70103d94d"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="821c7eed-7bee-4879-97ec-44d2014a192b"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BD"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="33ae2997-7bff-4c3c-8038-2fa6781dbe9d"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="84a92c36-88df-4c06-a36a-650ed92d4d0a"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BD"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="8707accf-b1fd-4bde-97b1-ab44b75f66f9"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="8db70618-5840-4d4b-90e2-66e1919fc6c1"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="fd082db5-be43-4219-a705-588f9c06e59b"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="b4d2847f-0548-4cc8-b002-7723b5fc9184"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BD"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="e450d126-eab8-4517-ba7c-8b6804f8c859"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="bbc19466-8d76-4f35-be56-8458f677d4a9"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="BC"/> + <column name="CLASSIFICATIONVALUE" value="BB"/> <column name="OBJECT_ROWID" value="cabf6192-f9c3-4bd4-9366-ad2b073bdfa3"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="c64c9f31-a108-4df9-b515-6e523b1341c1"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="5a52304e-65e8-40ed-9aca-a76af6c8c3a0"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="e2142492-eeab-482d-a37e-b1c8fe7b2545"/> - <column name="OBJECT_TYPE" value="Organisation"/> <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="e6da1393-f46b-41a4-826b-2c7d22de2246"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="f451479f-97dc-4570-b342-c8d53f04b493"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="AC"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="8eecb5e5-40d9-4bf0-a152-1ca456795563"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> - <insert tableName="classificationstorage"> + <insert tableName="CLASSIFICATIONSTORAGE"> <column name="CLASSIFICATIONSTORAGEID" value="fc665249-9efc-4d90-839d-cdffb4c3f407"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="CLASSIFICATIONVALUE" value="AC"/> + <column name="CLASSIFICATIONVALUE" value="BC"/> <column name="OBJECT_ROWID" value="eda61ea6-35ed-4a92-a93c-6118fc67d533"/> + <column name="OBJECT_TYPE" value="Organisation"/> <column name="OUTDATED" valueNumeric="0"/> </insert> </changeSet> diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationtype.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationtype.xml index 979cafb44d5208bf64d951980d4ac11bce05b602..4463565946a22aec814fa3e63de2e8e5c8208f10 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/classificationtype.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/classificationtype.xml @@ -1,183 +1,156 @@ <?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="autogenerated" id="78633039-6630-4bd9-8498-98950ad97aa3"> - <delete tableName="classificationtype"/> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <delete tableName="CLASSIFICATIONTYPE"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="faab5c4e-6ef7-4cc2-9925-780263b03fa8"/> <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Headquarters"/> - <column name="CLASSIFICATIONTYPEID" value="037a9de1-fa6d-4895-9db3-82f7769682ae"/> - <column name="SCOREPOINTS" valueNumeric="35"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreCustomizing"/> - <column name="CLASSIFICATIONTYPEID" value="2031525e-6ca3-46b4-91d4-7f90cd31a630"/> - <column name="SCOREPOINTS" valueNumeric="25"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreStandard"/> - <column name="CLASSIFICATIONTYPEID" value="2a702a31-9907-4f1b-abfd-3342640f1c9e"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="OUTDATED" valueNumeric="1"/> <column name="SCOREPOINTS" valueNumeric="25"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="FIELD" value="TYPE"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="entityField"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreDepartment"/> - <column name="CLASSIFICATIONTYPEID" value="31c169aa-ba5b-4f9d-9dd3-b0d0e8d1b632"/> - <column name="SCOREPOINTS" valueNumeric="10"/> - <column name="OUTDATED" valueNumeric="0"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="9b9e51d8-c649-41f3-a1fb-660d768c8b5a"/> + <column name="OBJECT_TYPE" value="Organisation"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="eyJpZCI6ImRkMDI0ODgzLWM0OWUtNGQwOS04NWM4LTgyOWNmOWM5YzVlOSIsInR5cGUiOiJOVU1CRVIifQ=="/> + <column name="FIELDTYPE" value="number"/> + <column name="INDICATORTYPE" value="attribute"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreUsers"/> - <column name="CLASSIFICATIONTYPEID" value="382b311e-b2b2-49da-b6e1-339afae92657"/> - <column name="SCOREPOINTS" valueNumeric="25"/> - <column name="OUTDATED" valueNumeric="0"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="23c41492-5a65-4a7f-9283-457769f822c1"/> + <column name="OBJECT_TYPE" value="Organisation"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="40"/> + <column name="FIELD" value="eyJpZCI6IjdlOTkyN2E0LTQxZTQtNDI2Zi1iZGRkLWMzZTllZTNiMDkzZSIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> + </insert> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="6f179460-4b93-4bd4-b85d-5771dbad7289"/> + <column name="OBJECT_TYPE" value="Organisation"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="40"/> + <column name="FIELD" value="eyJpZCI6ImU3M2VkOTI5LTg2MzEtNDZkZS1iMjhmLWViMTQyM2FiYjgwOCIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> + </insert> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="8a2c4cf5-c2b7-4588-9a33-3387d784a90b"/> + <column name="OBJECT_TYPE" value="Organisation"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="eyJpZCI6ImYxMWY2NWQwLTQzNTItNGY4MS04NWQwLWJmZDAzNDI3NWUzNCIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> - <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreBranch"/> - <column name="CLASSIFICATIONTYPEID" value="4977ba88-074c-4fe5-b04a-97c9a5eae982"/> - <column name="SCOREPOINTS" valueNumeric="45"/> - <column name="OUTDATED" valueNumeric="0"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="2743f5cd-8510-487f-933c-4cdbebc5e449"/> + <column name="OBJECT_TYPE" value="Organisation"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="eyJpZCI6ImM3ZDI4Mzc3LThjYjEtNGY5Mi1hOWFjLWVkMDgwNDFhNzgyYiIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="72f8e3d4-b8ce-41c3-a3ea-d5ebca62a7e0"/> <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Number of employees"/> - <column name="CLASSIFICATIONTYPEID" value="4b72857e-863d-4254-accf-25281bb7bb64"/> - <column name="SCOREPOINTS" valueNumeric="25"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="4af7742e-e0dd-484b-a309-942fba546833"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="eyJpZCI6IjY5MTQ1MmVjLTNiOWYtNDNkYy05MWEyLTY0NWE5N2I3NzViMiIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="2e2ff9bc-6acf-4870-925b-be8f13571ddb"/> <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Loyalty"/> - <column name="CLASSIFICATIONTYPEID" value="4d878689-15c0-46cc-acc8-3c524463db5c"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="82be3659-917b-4a7e-bf31-33258af00a16"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="50"/> + <column name="FIELD" value="STATUS"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="entityField"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="9936a248-4eba-481c-9f1f-8607f89493bb"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreBased"/> - <column name="CLASSIFICATIONTYPEID" value="54128957-c80b-4b5a-ad1b-cfce665dfb10"/> - <column name="SCOREPOINTS" valueNumeric="15"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="40"/> + <column name="FIELD" value="VOLUME"/> + <column name="FIELDTYPE" value="number"/> + <column name="INDICATORTYPE" value="entityField"/> + </insert> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="15aa2654-330a-4b4d-9cfb-aa0c49f8df67"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreDecisionPhase"/> - <column name="CLASSIFICATIONTYPEID" value="57604bc1-d99f-4d61-b28d-55218a72045b"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + <column name="OUTDATED" valueNumeric="1"/> <column name="SCOREPOINTS" valueNumeric="30"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Creditworthiness"/> - <column name="CLASSIFICATIONTYPEID" value="80c6ec8b-eb54-4d25-a4f5-0adaf4cdc84e"/> - <column name="SCOREPOINTS" valueNumeric="15"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="FIELD" value="STATUS"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="entityField"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="3402e131-581e-4165-aa2a-a7dba56a4164"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreCloud"/> - <column name="CLASSIFICATIONTYPEID" value="8c1e8f81-145f-4efe-936f-3f4147f4d59a"/> - <column name="SCOREPOINTS" valueNumeric="10"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Business development"/> - <column name="CLASSIFICATIONTYPEID" value="95396ee7-f0e2-41b4-995e-bac5749709ec"/> + <column name="CLASSIFICATIONGROUP_ID" value="21af2b4d-34f7-4c03-8d4e-0a40bb17faf2"/> + <column name="OUTDATED" valueNumeric="1"/> <column name="SCOREPOINTS" valueNumeric="25"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="FIELD" value="PROBABILITY"/> + <column name="FIELDTYPE" value="number"/> + <column name="INDICATORTYPE" value="entityField"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Product preference"/> - <column name="CLASSIFICATIONTYPEID" value="970b251c-ca6e-43f4-9162-ebc5d1142a8b"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="2cc9700e-7a51-4a49-a42b-73e9289363b6"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScorePosition"/> - <column name="CLASSIFICATIONTYPEID" value="a43189fc-b712-45ed-9398-58d6e15760ca"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Current supply share"/> - <column name="CLASSIFICATIONTYPEID" value="be76dab1-c6ab-4b1e-8322-8b052ccda4d9"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Industry"/> - <column name="CLASSIFICATIONTYPEID" value="d67397c5-5e05-433b-b61d-12807906aa5a"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="forecastSum"/> + <column name="FIELDTYPE" value="number"/> + <column name="INDICATORTYPE" value="complex"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="b2126d9d-8d18-46d4-a48f-1a03fc456ddd"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="fe91e86e-a0ec-4475-b006-f2b2fef8aabb"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreBudget"/> - <column name="CLASSIFICATIONTYPEID" value="d8091374-f3fd-41dc-8468-91469618c6fc"/> - <column name="SCOREPOINTS" valueNumeric="50"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="c1305d16-320e-44f8-95f9-e4cff05d3cfb"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="40"/> + <column name="FIELD" value="eyJpZCI6ImZkMzk2M2JjLThlNjAtNDExYS05OTExLWI5N2ViNzNlNWNmNyIsInR5cGUiOiJDT01CTyJ9"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="attribute"/> + </insert> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="38326d5f-ecab-4d96-919c-dbf2d3a15d9f"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="ScoreProjectStart"/> - <column name="CLASSIFICATIONTYPEID" value="f4d3791e-1717-4473-987b-0cd751805387"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + <column name="OUTDATED" valueNumeric="1"/> <column name="SCOREPOINTS" valueNumeric="30"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="FIELD" value="salesprojectStart"/> + <column name="FIELDTYPE" value="date"/> + <column name="INDICATORTYPE" value="complex"/> </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="fb1349b6-6dc1-44b7-b7ea-03d5483e7fac"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Purchasing potential p. a."/> - <column name="CLASSIFICATIONTYPEID" value="f581dcb9-db6f-4a82-995c-695d0a7393d3"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="e3b0a84f-d2a7-4d7c-b734-82ab4b262e84"/> - <column name="OBJECT_TYPE" value="Organisation"/> - <column name="SCORETYPE" value="Focus"/> - <column name="CLASSIFICATIONTYPEID" value="df4aacdc-7e17-484c-a96e-a07550a7220e"/> - <column name="SCOREPOINTS" valueNumeric="20"/> - <column name="OUTDATED" valueNumeric="0"/> - <column name="FILTER" value='{"entity":"Organisation_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"TYPE","operator":"EQUAL","value":"Interessent","key":"ORGPROSPECT","contenttype":"TEXT"}]}}'/> - </insert> - <insert tableName="classificationtype"> - <column name="CLASSIFICATIONGROUP_ID" value="00cc7b8f-d99e-46bf-90c3-74e05b5af685"/> + <insert tableName="CLASSIFICATIONTYPE"> + <column name="CLASSIFICATIONTYPEID" value="3fd84231-20cb-4a85-8fe6-404f3015a134"/> <column name="OBJECT_TYPE" value="Salesproject"/> - <column name="SCORETYPE" value="Feasibility"/> - <column name="CLASSIFICATIONTYPEID" value="b28846e6-befe-4318-93d8-de54fcae369c"/> - <column name="SCOREPOINTS" valueNumeric="15"/> - <column name="OUTDATED" valueNumeric="0"/> + <column name="CLASSIFICATIONGROUP_ID" value="ab733ab7-f9b3-4b8f-9674-19e4340cc31a"/> + <column name="OUTDATED" valueNumeric="1"/> + <column name="SCOREPOINTS" valueNumeric="30"/> + <column name="FIELD" value="PHASE"/> + <column name="FIELDTYPE" value="dropDown"/> + <column name="INDICATORTYPE" value="entityField"/> </insert> </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 af12a5f42bba68e0cc502dfc86987511ad669ceb..90477aa5618a698c439ad7dda564241bac768b5d 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -9787,6 +9787,48 @@ <title></title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>INDICATORTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="64" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELDTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="64" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELD</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="100" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> </entityFields> </entityDb> <entityDb> @@ -9995,6 +10037,62 @@ <title></title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>FIELDVALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2005" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INDICATORTEXT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2005" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INDICATORINTEGER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2005" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INDICATORNUMBER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2005" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> </entityFields> </entityDb> <entityDb> diff --git a/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod b/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod index 264b4d4233d334aba1e1cad403bb530adb8fa557..6d1f4898e6c51d2ee284a1e1624d14c6e805d868 100644 --- a/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod +++ b/entity/ClassificationAdmin_entity/ClassificationAdmin_entity.aod @@ -91,9 +91,9 @@ <name>FilterviewActionGroup</name> <children> <entityActionField> - <name>UpdateClassification</name> + <name>UpdateClassifications</name> <title>Recalculate Classifications</title> - <onActionProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassification/onActionProcess.js</onActionProcess> + <onActionProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassifications/onActionProcess.js</onActionProcess> <iconId>VAADIN:AUTOMATION</iconId> <tooltip>Starts the server process manually, which will recalculate all (potentially) outdated classifications. This process should be executed after changes to the classification configuration.</tooltip> </entityActionField> @@ -114,13 +114,6 @@ <stateProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/sorting/stateProcess.js</stateProcess> <valueProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/sorting/valueProcess.js</valueProcess> </entityField> - <entityField> - <name>CLASSIFICATIONTYPEIDDISPLAYVALUE</name> - <title>Indicator</title> - <mandatory v="true" /> - <stateProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/stateProcess.js</stateProcess> - <valueProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/valueProcess.js</valueProcess> - </entityField> <entityField> <name>recordCategory</name> <valueProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/recordcategory/valueProcess.js</valueProcess> @@ -154,6 +147,25 @@ <mandatoryProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/scorepoints/mandatoryProcess.js</mandatoryProcess> <stateProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/scorepoints/stateProcess.js</stateProcess> </entityField> + <entityField> + <name>FIELD</name> + <title>Indicator</title> + <mandatory v="false" /> + <mandatoryProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/field/mandatoryProcess.js</mandatoryProcess> + <dropDownProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/field/dropDownProcess.js</dropDownProcess> + <stateProcess>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/field/stateProcess.js</stateProcess> + <onValueChange>%aditoprj%/entity/ClassificationAdmin_entity/entityfields/field/onValueChange.js</onValueChange> + </entityField> + <entityField> + <name>FIELDTYPE</name> + <title>Field Type</title> + <state>INVISIBLE</state> + </entityField> + <entityField> + <name>INDICATORTYPE</name> + <title>Indicator Type</title> + <state>INVISIBLE</state> + </entityField> </entityFields> <recordContainers> <jDitoRecordContainer> @@ -207,6 +219,18 @@ <jDitoRecordFieldMapping> <name>CLASSIFICATIONGROUPDISPLAYVALUE.value</name> </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>FIELD.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>FIELDTYPE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>INDICATORTYPE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>FIELD.displayValue</name> + </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/ClassificationAdmin_entity/documentation.adoc b/entity/ClassificationAdmin_entity/documentation.adoc index 52829958f6942c4a6c44173339b47fb1422aacfe..4fa1c03050eaae9015eb061ec991da4acc72b139 100644 --- a/entity/ClassificationAdmin_entity/documentation.adoc +++ b/entity/ClassificationAdmin_entity/documentation.adoc @@ -10,19 +10,19 @@ Purpose: This Entity gives the administrators an easy way to change the classification. Classifications get stored in the Classification table with their own uid, the ids of the classification type, classification score, object_rowId and object_type. - This entity displays the classifications (classificationGroup) and indicators (classificationType) and their usage(filter) grouped with the object_type in an treetable. + This entity displays the classifications (classificationGroup) and indicators (classificationType) and their max Points, usage(filter) grouped by the object_type in an treetable. with the object_type as the first group, followed by the classifications (classificationgroup) of that group and it's indicators. The grading of the classification can be changed in the preview of an classification. The possible values of an indicator can be changed when opening the preview of the indicator. TreeTable Example: - CLASSIFICATION INDICATOR USAGE + CLASSIFICATION INDICATOR MAX POINTS USAGE Organisation 1. Target Group - Industry No restrictions - Headquarters Filter set (ToDo: 1067241) - Product preference No restrictions + Status 30 No restrictions + Assessment / Target group 30 Filter set (ToDo: 1067241) + Assessment / Industry 40 No restrictions 2. Customer value Salesproject 1. Classification @@ -67,15 +67,16 @@ Adding the classification to other modules: -add CLASSIFICATIONSTORAGE_ID to the Filterview and Preview. -optional: check "filterable" if you want it filterable (probably not that useful) Add the reference to the ClassificationView to the Mainview Context (see als organsiation and salesproject) - Add both of the classificationFilterExtensionSets: - -"ClassificationType_filter" for filtering of the classificationTypes and it's values + Add the classificationFilterExtensionSet: -"ClassificationType_filter" for filtering of the achieved Classifications for each group + Add the entityFields you want to use to $ClassificationIndicatorRegistry.getEntityNumberFields() and $ClassificationIndicatorRegistry.getEntityDropDownFields() + And optionally add complex Fields in an registry like ClassificationIndicatorRegistry_basic + -> if you do add a new registry: don't forget to add its functions in ClassificationUpdate_lib Important: - -If you are deleting these datasets you always have to also delete the CLASSIFICATIONSTORAGE entry and the classification entries(if they exist), + -If you are deleting these datasets you always have to also delete the CLASSIFICATIONSTORAGE entry so add the these deleteconditions to all actions that delete those datasets: - newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", eigeneUid).deleteData(); - newWhere("CLASSIFICATION.OBJECT_ROWID", eigeneUid).deleteData(); + newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", uid).deleteData(); -Be sure to use WorkflowSignalSender.updated(); in the onUpdateProcess of the module and add the dependency mapping for classificationStorage in the Dependency_lib so the outdated flag of the classificationStorage dataset can automatically be set everytime an dataset get's modified @@ -87,10 +88,9 @@ Adding the classification to other modules: The groups now have their own table and we are using an uuid instead of the groupname for the classificationgroups We store classificationgrading with the the minPERCENT and the resulting grading for each classificationGroup dataset We can now store filter for classificationtype datasets - We now store the scorepoints for classificationtype datasets + We now store the max scorepoints for classificationtype datasets we are storing the achieved classifications (e.g. "ACD") in CLASSIFICATIONSTORAGE - and the stored classifiaction now also store the value(because it will be possible to also use things like attributes as classifications) and the - scorepoints (scorepercent of the linked classificationscore dataset * Scorepoints of the linked classificationtype dataset) + we don' persist the classifiaction values anymore We also added an outdated flag to both ClassificationStorage and ClassificationType -> so the updateClassificationsServerprocess knows what it has to update (see also documentationProperty of said process) - The ClassificationStorage one get's set via the onUpdate of the module (see above) diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/dropDownProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/dropDownProcess.js index 917fbdf4fd535892b9a297d66d82bd0e16e21c92..226ff90e56f9acc269d2d97a16337783fc5b7b7d 100644 --- a/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/dropDownProcess.js +++ b/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/dropDownProcess.js @@ -4,7 +4,8 @@ import("system.vars"); import("system.result"); //no Translation since the same logic as in the Keywords applies (Admin User is able to change the title) -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +//only when new, since it shouldn't be possible anymore to move the classificationTypes to another group, but the user should be able to rename a group +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) { var objectType = vars.get("$field.OBJECT_TYPE") if (objectType) diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/stateProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/stateProcess.js index 75628dd48b118ed61a38a10a7e1a96a2b58d8ec7..53859257bfdb74003197c82d0e006fc9b9b04d77 100644 --- a/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/stateProcess.js +++ b/entity/ClassificationAdmin_entity/entityfields/classificationgroupdisplayvalue/stateProcess.js @@ -3,9 +3,16 @@ import("system.vars"); import("system.result"); import("system.neon"); -if((vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW)) +if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW + || (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT && vars.get("$field.CLASSIFICATIONTYPEID") == $ClassificationPlaceholder.TOPSECRETPLACEHOLDER())) { - result.string(neon.COMPONENTSTATE_EDITABLE) + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT && vars.get("$field.CLASSIFICATIONTYPEID") != $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); } else - result.string(neon.COMPONENTSTATE_INVISIBLE) \ No newline at end of file +{ + result.string(neon.COMPONENTSTATE_INVISIBLE); +} \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationtypefilter/filterTreeExcludedFieldsProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationtypefilter/filterTreeExcludedFieldsProcess.js index cf03254dee3ad99700634720a48d4bbeb569bd23..448b8a68819d4a960edc23172c364ac973abc513 100644 --- a/entity/ClassificationAdmin_entity/entityfields/classificationtypefilter/filterTreeExcludedFieldsProcess.js +++ b/entity/ClassificationAdmin_entity/entityfields/classificationtypefilter/filterTreeExcludedFieldsProcess.js @@ -9,7 +9,7 @@ import("ClassificationFilter_lib"); import("Sql_lib"); import("system.result"); -if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT && vars.get("$field.CLASSIFICATIONTYPEID") != $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) { //We want to exclude all the classificationFilterFields. //Excluding via this process works by returning a array with all the fieldNames you want to exclude. diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/stateProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/stateProcess.js deleted file mode 100644 index 9366c2e0e8a8d10e0f2e70beb8f3c82662b588a1..0000000000000000000000000000000000000000 --- a/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/stateProcess.js +++ /dev/null @@ -1,12 +0,0 @@ -import("Classification_lib"); -import("system.vars"); -import("system.result"); -import("system.neon"); - -if((vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) - && vars.get("$this.value") != $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) -{ - result.string(neon.COMPONENTSTATE_EDITABLE) -} -else - result.string(neon.COMPONENTSTATE_INVISIBLE) \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/valueProcess.js b/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/valueProcess.js deleted file mode 100644 index 85208cfbe4e8e978e2a67702710029f6fbb49a71..0000000000000000000000000000000000000000 --- a/entity/ClassificationAdmin_entity/entityfields/classificationtypeiddisplayvalue/valueProcess.js +++ /dev/null @@ -1,21 +0,0 @@ -import("system.result"); -import("system.vars"); -import("system.translate"); -import("Sql_lib"); -import("Classification_lib"); - -var res = vars.get("$this.value"); -if(!res) -{ - var classificationTypeId = vars.get("$field.CLASSIFICATIONTYPEID"); - if(classificationTypeId != $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) - { - res = newSelect("CLASSIFICATIONTYPE.SCORETYPE") - .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypeId) - .cell(); - } - else - res = $ClassificationPlaceholder.TOPSECRETPLACEHOLDER(); -} -result.string(res); \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/field/dropDownProcess.js b/entity/ClassificationAdmin_entity/entityfields/field/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..cb06d13166cf7e1c2f662df466f67d08ad625bc1 --- /dev/null +++ b/entity/ClassificationAdmin_entity/entityfields/field/dropDownProcess.js @@ -0,0 +1,21 @@ +import("ClassificationComplexIndicatorRegistry_basic"); +import("ClassificationIndicatorFieldRegistry_basic"); +import("system.result"); +import("Classification_lib"); +import("system.neon"); +import("system.vars"); + + +var res = []; +//this field is only editable when craeting a new classificationtype, so we only need the dropDown when the operatingstate == neon.OPERATINGSTATE_NEW +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$field.OBJECT_TYPE")) +{ + var context = vars.get("$field.OBJECT_TYPE"); + res = ClassificationUtils.getEntityFields(context); + var attributeFilterFields = ClassificationUtils.getEntityAttributes(context); + var attributeFieldArray = ClassificationUtils.getEntityAttributesArray(attributeFilterFields); + res = res.concat(attributeFieldArray); + var complexIndicators = ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray(context); + res = res.concat(complexIndicators); +} +result.object(res); diff --git a/entity/ClassificationAdmin_entity/entityfields/field/mandatoryProcess.js b/entity/ClassificationAdmin_entity/entityfields/field/mandatoryProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..34103c074eb3e0d881a227628e7c54058b39672c --- /dev/null +++ b/entity/ClassificationAdmin_entity/entityfields/field/mandatoryProcess.js @@ -0,0 +1,10 @@ +import("system.result"); +import("Classification_lib"); +import("system.vars"); + +var mandatory = true; +if(vars.get("$field.CLASSIFICATIONTYPEID")== $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) +{ + mandatory = false; +} +result.string(mandatory); \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/field/onValueChange.js b/entity/ClassificationAdmin_entity/entityfields/field/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..f50ea67a8b44b813e3983223d495ddd124476ad9 --- /dev/null +++ b/entity/ClassificationAdmin_entity/entityfields/field/onValueChange.js @@ -0,0 +1,89 @@ +import("ClassificationComplexIndicatorRegistry_basic"); +import("ClassificationIndicatorFieldRegistry_basic"); +import("Attribute_lib"); +import("Classification_lib"); +import("system.neon"); +import("system.vars"); + +//We have different fieldTypes and indicatorTypes, depending on the field. +//So we have to determine the correct ones everytime the field changes. +if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") && vars.get("$field.OBJECT_TYPE")) +{ + var field = vars.get("$this.value"); + var objectType = vars.get("$field.OBJECT_TYPE"); + + //helper function to check if the pString is included in pArray + function _checkIfInArrays(pArray, pString) + { + var inArray = false; + inArray = pArray.some(function (attr){ + if (attr.includes(pString)) + { + return true; + } + else + { + return false; + } + }); + return inArray; + } + + //helper function to check if the pString is included in pArray + function _checkIfInAttributeArray (pArray, pString) + { + for (var i = 0; i < pArray.length; i++) + { + if (pArray[i]["name"] == pString) + { + return {"inArray": true + , "attributeArrayAtPosition": pArray[i]}; + } + } + return {"inArray": false + , "attributeArrayAtPosition": null}; + } + var position; + var attributeArray; + if (_checkIfInArrays($ClassificationIndicatorRegistry.getEntityNumberFields(objectType), field)) + { + neon.setFieldValues({ + "$field.FIELDTYPE": $ClassificationFieldTypes.NUMBER(), + "$field.INDICATORTYPE": $ClassificationIndicatorTypes.ENTITYFIELD() + }); + } + else if (_checkIfInArrays($ClassificationIndicatorRegistry.getEntityDropDownFields(objectType), field)) + { + neon.setFieldValues({ + "$field.FIELDTYPE": $ClassificationFieldTypes.DROPDOWN(), + "$field.INDICATORTYPE": $ClassificationIndicatorTypes.ENTITYFIELD() + }); + } + else if (_checkIfInAttributeArray(ClassificationUtils.getEntityAttributes(objectType), field)["inArray"]) + { + let arrayAtPosition = _checkIfInAttributeArray(ClassificationUtils.getEntityAttributes(objectType), field)["attributeArrayAtPosition"]; + neon.setFieldValue("$field.INDICATORTYPE", $ClassificationIndicatorTypes.ATTRIBUTE()); + if ((arrayAtPosition["contentType"] == AttributeTypes.TEXT() && arrayAtPosition["hasDropDownValues"] === true) + || attributeArray[position]["contentType"] == AttributeTypes.BOOLEAN() + || attributeArray[position]["contentType"] == AttributeTypes.COMBO() + || attributeArray[position]["contentType"] == AttributeTypes.KEYWORD()) + { + neon.setFieldValue("$field.FIELDTYPE", $ClassificationFieldTypes.DROPDOWN()); + } + else if (arrayAtPosition["contentType"] == AttributeTypes.NUMBER()) + { + neon.setFieldValue("$field.FIELDTYPE", $ClassificationFieldTypes.NUMBER()); + } + else if (arrayAtPosition["contentType"] == AttributeTypes.INTEGER()) + { + neon.setFieldValue("$field.FIELDTYPE", $ClassificationFieldTypes.INTEGER()); + } + } + else if (_checkIfInArrays(ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray(objectType), field)) + { + neon.setFieldValues({ + "$field.FIELDTYPE": $ClassificationComplexIndicatorRegistry[field]()["type"], + "$field.INDICATORTYPE": $ClassificationIndicatorTypes.COMPLEX() + }); + } +} \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/field/stateProcess.js b/entity/ClassificationAdmin_entity/entityfields/field/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7b0636d5c5191f8ebb2455d7a7ab062ba844287b --- /dev/null +++ b/entity/ClassificationAdmin_entity/entityfields/field/stateProcess.js @@ -0,0 +1,20 @@ +import("Classification_lib"); +import("system.vars"); +import("system.result"); +import("system.neon"); + +var state = neon.COMPONENTSTATE_EDITABLE; +var recordCategory = vars.get("$field.recordCategory"); + +if(vars.get("$sys.operatingstate") != neon.OPERATINGSTATE_NEW) +{ + state = neon.COMPONENTSTATE_DISABLED; +} +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT + && (recordCategory == $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP() + || recordCategory == $ClassificationRecordCategories.CLASSIFICATION_GROUP_DOESNT_EXIST())) +{ + +} + +result.string(state); \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateallclassifications/onActionProcess.js b/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateallclassifications/onActionProcess.js index a8ccdd28ccba6f9fe16b69d57538c16dc9898ba3..130f76a2297ba13fc73aa83143c85c4fcf8e5bb6 100644 --- a/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateallclassifications/onActionProcess.js +++ b/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateallclassifications/onActionProcess.js @@ -8,8 +8,6 @@ import("system.vars"); var execute = question.askYesNo(translate.text("Start Serveprocess"), translate.text("Are you sure you want to recalculate all classifications using the current classificationgradings? This can take some time, since ALL classifications will get freshly calculated and updated if needed."), false); if(execute) { - - var processConfig = process.createStartAsyncConfig() .setName("updateClassifications_serverProcess") .setUser( vars.get("$sys.user")) diff --git a/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassification/onActionProcess.js b/entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassifications/onActionProcess.js similarity index 100% rename from entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassification/onActionProcess.js rename to entity/ClassificationAdmin_entity/entityfields/filterviewactiongroup/children/updateclassifications/onActionProcess.js diff --git a/entity/ClassificationAdmin_entity/entityfields/object_type/onValueChange.js b/entity/ClassificationAdmin_entity/entityfields/object_type/onValueChange.js index 22539b26e09b6166510840fc3fd9c28e751c9a5f..1dbd39f8e4ecde189947a7845067b0f1bf684ada 100644 --- a/entity/ClassificationAdmin_entity/entityfields/object_type/onValueChange.js +++ b/entity/ClassificationAdmin_entity/entityfields/object_type/onValueChange.js @@ -1,3 +1,9 @@ import("system.neon"); -neon.setFieldValue("$field.CLASSIFICATIONGROUP", ""); \ No newline at end of file +neon.setFieldValues({ + "$field.CLASSIFICATIONGROUP": "" + ,"$field.CLASSIFICATIONGROUPDISPLAYVALUE": "" + ,"$field.FIELD": "" + ,"$field.FIELDTYPE": "" + ,"$field.INDICATORTYPE": "" + }); \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js index 4022fc575bdb2dd5b3884809e0bb4819285cc65b..8a2d00bece631016f8dcb5bffa88ac7024d87b6f 100644 --- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/contentProcess.js @@ -1,3 +1,5 @@ +import("ClassificationComplexIndicatorRegistry_basic"); +import("ClassificationIndicatorFieldRegistry_basic"); import("Context_lib"); import("JditoFilter_lib"); import("system.entities"); @@ -13,17 +15,17 @@ import("system.vars"); var idvalues = vars.get("$local.idvalues"); var decodedIdvalues, entity, groupTitle; var res = []; -if(idvalues) +if (idvalues) { - if(idvalues[0].charAt(0) != ";" && idvalues[0].charAt(idvalues[0].length) != ";") + if (idvalues[0].charAt(0) != ";" && idvalues[0].charAt(idvalues[0].length) != ";") { res.push([idvalues[0], "", "", "", "", "", idvalues[0], translate.text(idvalues[0]), - "", $ClassificationRecordCategories.CLASSIFICATION_OBJECT_TYPE(), "", "", "", ""]); + "", $ClassificationRecordCategories.CLASSIFICATION_OBJECT_TYPE(), "", "", "", "", "", "", "", ""]); } else { decodedIdvalues = text.decodeMS(idvalues[0]); - if(decodedIdvalues[0].charAt(0) != ";" && decodedIdvalues[0].charAt(decodedIdvalues[0].length) != ";") + if (decodedIdvalues[0].charAt(0) != ";" && decodedIdvalues[0].charAt(decodedIdvalues[0].length) != ";") { var groupName = newSelect("CLASSIFICATIONGROUP.TITLE") .from("CLASSIFICATIONGROUP") @@ -31,83 +33,103 @@ if(idvalues) .cell(); res.push([idvalues[0], decodedIdvalues[0], decodedIdvalues[1], translate.text(groupName), "", "", "", - "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP(), "", "", "", groupName]); + "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP(), "", "", "", groupName, "", "", "", ""]); } else { - var typeAndFilter = newSelect("OBJECT_TYPE, CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONTYPE.SCOREPOINTS") + var classificationType = newSelect("OBJECT_TYPE, CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONTYPE.SCOREPOINTS, CLASSIFICATIONTYPE.FIELD") .from("CLASSIFICATIONTYPE") .where("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", decodedIdvalues[1]) .orderBy("CLASSIFICATIONTYPE.SCORETYPE") .arrayRow(); - var filter = typeAndFilter[1]; + var filter = classificationType[1]; var filterDisplay = translate.text("Filter set"); //ToDo: "resolved" DisplayValue for the Filterstrings #1067160/1067241 - entity = ContextUtils.getEntity(typeAndFilter[0]); + entity = ContextUtils.getEntity(classificationType[0]); var emptyFilter = JditoFilterUtils.getEmptyFilter(entity) - if(filter == "") + if (filter == "") + { filter = emptyFilter; + } if (filter == emptyFilter) + { filterDisplay = translate.text("No Restrictions"); + } - var maxScore = typeAndFilter[3]; + var maxScore = classificationType[3]; groupTitle = newSelect("CLASSIFICATIONGROUP.TITLE") .from("CLASSIFICATIONGROUP") .where("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", text.decodeMS(decodedIdvalues[0])[1]) .cell(); + var classificationTypeFieldKeysWithDisplayValues = ClassificationUtils.getEntityFields(classificationType[0]) + .concat(ClassificationUtils.getEntityAttributesArray(ClassificationUtils.getEntityAttributes(classificationType[0]))) + .concat(ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray(classificationType[0])); //ToDo: "resolved" DisplayValue for the Filterstrings #1067160/1067241 - res.push([idvalues[0], decodedIdvalues[0], "", "", decodedIdvalues[1], translate.text(typeAndFilter[2]), - "", "","", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE(), filter, filterDisplay, maxScore, groupTitle]); + res.push([idvalues[0], decodedIdvalues[0], "", "", decodedIdvalues[1], translate.text(filterDisplay[2]), + "", "","", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE(), filter, filterDisplay, maxScore, groupTitle + , ClassificationUtils.getFieldDisplayValue(classificationTypeFieldKeysWithDisplayValues, classificationType[4]), "", "" + , ClassificationUtils.getFieldDisplayValue(classificationTypeFieldKeysWithDisplayValues, classificationType[4])]); } } } else { var savedData = new Set(); + var fields = {}; var classificationData = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, \n\ - CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.SCOREPOINTS") + CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.SCORETYPE\n\ + , CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.SCOREPOINTS, CLASSIFICATIONTYPE.FIELD\n\ + , CLASSIFICATIONTYPE.FIELDTYPE, CLASSIFICATIONTYPE.INDICATORTYPE") .from("CLASSIFICATIONGROUP") .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.SORTING") .table() //run trough the data and build the tree - classificationData.forEach(function ([objectType, classificationGroupId, classificationGroupName, classificationTypeId, classificationScoreType, classificationTypeFilter, classificationTypeScorePoints]) + classificationData.forEach(function ([objectType, classificationGroupId, classificationGroupName, classificationTypeId, classificationScoreType, classificationTypeFilter, classificationTypeScorePoints, field, fieldType, indicatorType]) { uidClassificationGroup = text.encodeMS([objectType, classificationGroupId]); uidClassificationType = text.encodeMS([uidClassificationGroup, classificationTypeId]); uidClassificationTypeFilter = text.encodeMS([uidClassificationType, util.getNewUUID()]); + if (!fields.hasOwnProperty(objectType)) + { + fields[objectType] = ClassificationUtils.getEntityFields(objectType) + .concat(ClassificationUtils.getEntityAttributesArray(ClassificationUtils.getEntityAttributes(objectType))) + .concat(ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray(objectType)); + } - if(!savedData.has(objectType)) //objectType + if (!savedData.has(objectType)) //objectType { res.push([objectType, "", "", "", "", "", objectType, translate.text(objectType), - "", $ClassificationRecordCategories.CLASSIFICATION_OBJECT_TYPE(), "", "", "", ""]); + "", $ClassificationRecordCategories.CLASSIFICATION_OBJECT_TYPE(), "", "", "", "", "", "", "", ""]); savedData.add(objectType); } - if(!savedData.has(classificationGroupId)) //classificationGroup + if (!savedData.has(classificationGroupId)) //classificationGroup { res.push([uidClassificationGroup, objectType, classificationGroupId, translate.text(classificationGroupName), "", "", "", - "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP(), "", "", "", ""]); + "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP(), "", "", "", "", "", "", "", ""]); savedData.add(classificationGroupId); } - if(!savedData.has(classificationTypeId)) //classificationType + if (!savedData.has(classificationTypeId)) //classificationType { var classificationTypeFilterDisplay = translate.text("Filter set"); //ToDo: "resolved" DisplayValue for the Filterstrings #1067160/1067241 entity = ContextUtils.getEntity(objectType); emptyFilter = JditoFilterUtils.getEmptyFilter(entity); - if(classificationTypeFilter == "") + if (classificationTypeFilter == "") { classificationTypeFilter = emptyFilter; } - if(classificationTypeFilter == emptyFilter) + if (classificationTypeFilter == emptyFilter) { classificationTypeFilterDisplay = translate.text("No Restrictions"); } res.push([uidClassificationType, uidClassificationGroup, "", "", classificationTypeId, translate.text(classificationScoreType), - "", "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE(), classificationTypeFilter, classificationTypeFilterDisplay, classificationTypeScorePoints, ""]); + "", "", "", $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE(), classificationTypeFilter + , classificationTypeFilterDisplay, classificationTypeScorePoints, "" + , field, fieldType, indicatorType, ClassificationUtils.getFieldDisplayValue(fields[objectType], field)]); savedData.add(classificationTypeId); } diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onDelete.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onDelete.js index 57378b99c786b9baab1443e999d675df3fb6a351..d436e8067ff123529390eed82aa901461716fb47 100644 --- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onDelete.js +++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onDelete.js @@ -1,3 +1,4 @@ +import("Util_lib"); import("system.entities"); import("Classification_lib"); import("Sql_lib"); @@ -22,32 +23,90 @@ function _delete() { var rowData = vars.get("$local.rowdata"); var classificationType = rowData["CLASSIFICATIONTYPEID.value"]; - var objectType = rowData["OBJECT_TYPE.value"]; - var table; - var columns; - var values; var classificationGroup = rowData["CLASSIFICATIONGROUP.value"]; var recordCategory = rowData["recordCategory.value"]; + var classificationTypes = []; - if(recordCategory == $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE()) // the deleted dataset must be an classificationType + if (recordCategory == $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE()) // the deleted dataset must be an classificationType { classificationGroup = ClassificationUtils.getClassificationGroup(classificationType); //get the group before deleting the classificationtype dataset newWhere("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", classificationType).deleteData(); //deletes the classificationscores that are linked to the classificationtype newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationType).deleteData(); //deletes the classificationtype newWhere("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationType).deleteData(); //deletes all the classifications + + //get all the classificationTypes of the group so we can set those as outdated + classificationTypes = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroup) + .and("CLASSIFICATIONTYPE.OUTDATED", 0) + .arrayColumn(); + + newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypes, SqlBuilder.IN()).updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [1]); + } - - else if(recordCategory == $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP()) //the deleted dataset must be an classificationGroup + else if (recordCategory == $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP()) //the deleted dataset must be an classificationGroup { - var classificationTypes = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") + classificationTypes = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroup) - + .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroup); + + var objectType = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroup) + .cell(); + + var existingGroups = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectType) + .arrayColumn(); + + //get the position of the deleted group, so we can update the stored classificationStrings + var position = 0; + if (existingGroups.length > 0) + { var groupPositions = newSelect("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .from("CLASSIFICATIONGROUP") + .where("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", existingGroups, SqlBuilder.IN()) + .orderBy("CLASSIFICATIONGROUP.SORTING") + .table(); + for (let i = 0; i < groupPositions.length; i++) + { + if (groupPositions[i] != classificationGroup) + { + position = position + 1; + } + else + { + break; + } + } + } + function _updateStringLengthFn(pBatchData, pBatchNum) + { + var statements = []; + for ( let i = 0; i < pBatchData.length; i++) + { + var oldString = pBatchData[i][1]; + var newString = StringUtils.replaceAt(oldString, position, "") + statements.push(["CLASSIFICATIONSTORAGE", ["CLASSIFICATIONVALUE"], null, [newString], + newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID", pBatchData[i][0]).build()]); + } + if (statements.length > 0) + { + db.execute(statements); + } + } + + newSelect("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID, CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE") + .from("CLASSIFICATIONSTORAGE") + .where("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectType) + .pageSize(400) + .forEachPage(_updateStringLengthFn); //update the storageStrings + //delete the classificationscores, types and that are linked to the classificationtypes of te classificationgroup newWhere("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", classificationTypes, SqlBuilder.IN()).deleteData(true, "CLASSIFICATIONSCORE"); newWhere("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationTypes, SqlBuilder.IN()).deleteData(true, "CLASSIFICATION"); - classificationTypes.deleteData(true, "CLASSIFICATIONTYPE"); + newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypes, SqlBuilder.IN()).deleteData(true, "CLASSIFICATIONTYPE"); newWhere("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID", classificationGroup).deleteData(); newWhere("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", classificationGroup).deleteData(); diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js index 687c5a1a474b6a974e613b30fdff2d4675d9a55d..63490869f508e748005b4c5a97991bcdded1796f 100644 --- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js +++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onInsert.js @@ -1,3 +1,4 @@ +import("Sql_lib"); import("system.entities"); import("system.util"); import("system.db"); @@ -20,7 +21,7 @@ function _insert() var rowData = vars.get("$local.rowdata"); var groupId; var groupValue = rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"]; - if(groupValue.length != 36 && (groupValue.match(/-/g) || []).length != 4) //if groupValue is no Id -> insert new group + if (groupValue.length != 36 && (groupValue.match(/-/g) || []).length != 4) //if groupValue is no Id -> insert new group { groupId = util.getNewUUID(); var groupValues = [ @@ -35,29 +36,89 @@ function _insert() "SORTING" ]; - db.insertData("CLASSIFICATIONGROUP", groupColumns, null, groupValues); + db.insertData("CLASSIFICATIONGROUP", groupColumns, null, groupValues);//insert the new classificationGroup + + var gradingCol = ["CLASSIFICATIONGRADINGID", "GRADING", "MINPERCENT", "CLASSIFICATIONGROUP_ID"]; + //also insert this dummy gradingtable + var gradingVal = [util.getNewUUID(), "A", 76, groupId]; + db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal); + gradingVal = [util.getNewUUID(), "B", 51, groupId]; + db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal); + gradingVal = [util.getNewUUID(), "C", 26, groupId]; + db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal); + gradingVal = [util.getNewUUID(), "D", 0, groupId]; + db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal); + + var existingGroups = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", rowData["OBJECT_TYPE.value"]) + .arrayColumn(); + var position = 0; + if (existingGroups.length > 0) + { var groupPositions = newSelect("CLASSIFICATIONGROUP.SORTING") + .from("CLASSIFICATIONGROUP") + .where("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", existingGroups, SqlBuilder.IN()) + .orderBy("CLASSIFICATIONGROUP.SORTING") + .arrayColumn(); + for (var i = 0; i < groupPositions.length; i++) + { + if (groupPositions[i] < rowData["SORTING.value"]) + { + position = position + 1; + } + } + } + //helper function to update the stored ClassificationStrings + function _updateStringLengthFn(pBatchData, pBatchNum) + { + var statements = []; + for (let i = 0; i < pBatchData.length; i++) + { + var oldString = pBatchData[i][1]; + oldString = oldString.split(''); + oldString.splice(position, 0, "-"); + var newString = oldString.join(''); + statements.push(["CLASSIFICATIONSTORAGE", ["CLASSIFICATIONVALUE"], null, [newString], + newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID", pBatchData[i][0]).build()]); + } + if (statements.length > 0) + { + db.execute(statements); + } + } + + newSelect("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID, CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE") + .from("CLASSIFICATIONSTORAGE") + .where("CLASSIFICATIONSTORAGE.OBJECT_TYPE", rowData["OBJECT_TYPE.value"]) + .pageSize(400) + .forEachPage(_updateStringLengthFn); + + } else { groupId = groupValue; //else the groupValue is the groupId } - var typeValues = [ - vars.get("$field.CLASSIFICATIONTYPEIDDISPLAYVALUE"), util.getNewUUID(), groupId, rowData["OBJECT_TYPE.value"], rowData["SCOREPOINTS.value"], - 1 + 1, + rowData["FIELD.value"], + rowData["FIELDTYPE.value"], + rowData["INDICATORTYPE.value"] ]; var typeColumns = [ - "SCORETYPE", "CLASSIFICATIONTYPEID", "CLASSIFICATIONGROUP_ID", "OBJECT_TYPE", "SCOREPOINTS", - "OUTDATED" + "OUTDATED", + "FIELD", + "FIELDTYPE", + "INDICATORTYPE" ]; db.insertData("CLASSIFICATIONTYPE", typeColumns, null, typeValues); // always insert the classificationtype } \ No newline at end of file diff --git a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js index 9a9e04cfd71ca1864d2663355453c080d3cc4d05..f54db92f296acd3faeebb24f29e7d57d964da2b7 100644 --- a/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js +++ b/entity/ClassificationAdmin_entity/recordcontainers/jdito/onUpdate.js @@ -8,7 +8,6 @@ import("system.text"); import("system.util"); import("system.vars"); - //always make sure that the cache is as valid as possible //ClassificationType_entity accesses the CLASSIFICATIONSCORE (max value of scores) so we need to update the cache to prevent inconsesty @@ -43,16 +42,12 @@ function _update() var cond, typeCond; var values = []; var columns = []; - var groupCol = []; - var groupVal = []; - var gradingCol = []; - var gradingVal = []; var i; var isGroupDataSet = false; -// the classificationtypeId.value has the placeholder set when editing a classificationgroup dataset to allow us -// to handle the updating differently depending on whether its an classifcation group dataset or an classification type dataset -// since you want changes to the name of groups to effect only the group name and changes to the group of an classificationtype to change it's group + //the classificationtypeId.value has the placeholder set when editing a classificationgroup dataset to allow us + //to handle the updating differently depending on whether its an classifcation group dataset or an classification type dataset + //since you want changes to the name of groups to effect only the group name if(rowData["CLASSIFICATIONTYPEID.value"] == $ClassificationPlaceholder.TOPSECRETPLACEHOLDER()) isGroupDataSet = true; @@ -71,39 +66,13 @@ function _update() var groupIds = ClassificationUtils.getAllGroups(rowData["OBJECT_TYPE.value"]); //gets all existing groups of the object_type var newGroupId; var newGroupName; - var insertGroup = false; - var groupChange = false; var markOutdated = false; var newId; var condition; - for (i = 0; i < columns.length; i++) { - - if(columns[i] == "CLASSIFICATIONGROUP_ID")//if the classificationgroup_Id changed: determine whether or not a new group has to be inserted - { - condition = true; - for (let ii = 0; ii < groupIds.length; ii++) { - if(groupIds[ii][1] == rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"]) - { - condition = false; - } - } - if(condition && rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"].length != 36) - { - newGroupName = rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"]; - newGroupId = util.getNewUUID(); - values[i] = newGroupId; - insertGroup = true; - groupChange = true; - } - else if(values[2] != rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"] && values[2] != rowData["CLASSIFICATIONGROUP.value"] && rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"].length == 36) - { - groupChange = true; - insertGroup = false; - values[i] = rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"]; - } - } - else if(columns[i] == "CLASSIFICATIONTYPEID") + for (i = 0; i < columns.length; i++) { + + if(columns[i] == "CLASSIFICATIONTYPEID") { columns.splice(i, 1); values.splice(i, 1); @@ -121,7 +90,9 @@ function _update() if(columns[i] == "FILTER") { if(JSON.parse(values[i]).filter.childs.length == 0) //insert "" intead of an empty filter + { values[i] = ""; + } } } else if(columns[i] == undefined || columns[i] == null || columns[i] == "") @@ -131,64 +102,35 @@ function _update() i = i-1; } } - if(insertGroup) // new group has to be inserted - { - groupVal = [newGroupId, newGroupName]; - groupCol = ["CLASSIFICATIONGROUPID", "TITLE"]; - db.insertData("CLASSIFICATIONGROUP", groupCol, null, groupVal) - - gradingCol = ["CLASSIFICATIONGRADINGID", "GRADING", "MINPERCENT", "CLASSIFICATIONGROUP_ID"]; - //also insert this dummy gradingtable - gradingVal = [util.getNewUUID(), "A", 76, newGroupId]; - db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal) - gradingVal = [util.getNewUUID(), "B", 51, newGroupId]; - db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal) - gradingVal = [util.getNewUUID(), "C", 26, newGroupId]; - db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal) - gradingVal = [util.getNewUUID(), "D", 0, newGroupId]; - db.insertData("CLASSIFICATIONGRADING", gradingCol, null, gradingVal) - } - - if(groupChange || insertGroup || markOutdated) + + if(markOutdated) { columns.push("OUTDATED"); - values.push(1) - if(groupChange || insertGroup) - { - var classificationTypesOfOldGroup = ClassificationUtils.getClassificationTypesOfGroup(rowData["CLASSIFICATIONGROUP.value"],rowData["CLASSIFICATIONTYPEID.value"], true) - - for (i = 0; i < classificationTypesOfOldGroup.length; i++) - { - typeCond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypesOfOldGroup[i]); - typeCond.updateData(true, "CLASSIFICATIONTYPE" , ["OUTDATED"], null, [1]); - } - } + values.push(1); } cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", text.decodeMS(uid)[1]); cond.updateData(true, table, columns, null, values); } - else //-> update the classification group dataset { var value = rowData["CLASSIFICATION_PARENT_ID.value"]; - if(value.charAt(0) != ";" && value.charAt(value.length) != ";") - id = text.decodeMS(uid)[1]; - - var classificationGroupId = newSelect("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .from("CLASSIFICATIONGROUP") - .where("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", id) - .cell(); + var classificationGroupId = text.decodeMS(uid)[1]; cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", classificationGroupId); var groupTable = "CLASSIFICATIONGROUP"; var groupColumns = ["SORTING", "TITLE"]; - var groupName = rowData["CLASSIFICATIONGROUP.value"] == classificationGroupId ? rowData["CLASSIFICATIONGROUP.displayValue"] : rowData["CLASSIFICATIONGROUP.value"]; + var groupName = rowData["CLASSIFICATIONGROUPDISPLAYVALUE.value"]; var groupValues = [rowData["SORTING.value"], groupName]; var groupCond = newWhereIfSet("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", classificationGroupId); groupCond.updateData(true, groupTable, groupColumns, null, groupValues); + + if(columns.includes("SORTING"))//set all classificationtypes of said Object as outdated if sorting changed + { + newWhere("CLASSIFICATIONTYPE.OBJECT_TYPE", rowData["OBJECT_TYPE.value"]).updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [1]); + } } } \ No newline at end of file diff --git a/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod b/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod index 2ade3b1f9769f8a6a7f4186dd483bc7cc2a158b1..bb15b3c717a84f26ac5040b1273ae9dc4cd56e28 100644 --- a/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod +++ b/entity/ClassificationGrading_entity/ClassificationGrading_entity.aod @@ -16,7 +16,7 @@ </entityField> <entityField> <name>GRADING</name> - <title>Scoretype</title> + <title>Grading</title> </entityField> <entityField> <name>CLASSIFICATIONGROUP_ID</name> @@ -44,7 +44,7 @@ <entityField> <name>MINPERCENT</name> <documentation>%aditoprj%/entity/ClassificationGrading_entity/entityfields/minpercent/documentation.adoc</documentation> - <title>Percent</title> + <title>from Percent</title> <displayValueProcess>%aditoprj%/entity/ClassificationGrading_entity/entityfields/minpercent/displayValueProcess.js</displayValueProcess> <onValidation>%aditoprj%/entity/ClassificationGrading_entity/entityfields/minpercent/onValidation.js</onValidation> </entityField> diff --git a/entity/ClassificationGrading_entity/documentation.adoc b/entity/ClassificationGrading_entity/documentation.adoc index 9638714b062297d11de3f9ae52382a81e9500040..3b060496fbf25e269ddef28594a154c021856a18 100644 --- a/entity/ClassificationGrading_entity/documentation.adoc +++ b/entity/ClassificationGrading_entity/documentation.adoc @@ -11,7 +11,7 @@ Purpose: This Entity gives the administrators an easy way to change the classification grading in the preview of classificationAdmin when selecting a classification (classificationGroup). The classificationgrading gets stored in the table classificationgrading with it's own classificationgradingId, the classificationGroup_id, - the grading (e.g. "A", "B", "C") and the min score you get this grade for. + the grading (e.g. "A", "B", "C") and the min score (in percent) you get this grade for. This entity only has one view: the ClassificationGradingMultipleEdit_view which has both the minPercent and the grading column. making it possible for the admin to configure something like this: diff --git a/entity/ClassificationGrading_entity/recordcontainers/db/onDBInsert.js b/entity/ClassificationGrading_entity/recordcontainers/db/onDBInsert.js index 9c06240960ec310a0b8dec6386a6bf8667ce396f..02b185c19d97718a367481e467165ab9a3e6934a 100644 --- a/entity/ClassificationGrading_entity/recordcontainers/db/onDBInsert.js +++ b/entity/ClassificationGrading_entity/recordcontainers/db/onDBInsert.js @@ -5,5 +5,5 @@ import("system.vars"); var classificationGroupId = vars.get("$field.CLASSIFICATIONGROUP_ID") var classificationTypeIds = ClassificationUtils.getClassificationTypesOfGroup(classificationGroupId, null, true) -var cond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypeIds); +var cond = newWhereIfSet("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypeIds); cond.updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [1]); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/ClassificationScore_entity.aod b/entity/ClassificationScore_entity/ClassificationScore_entity.aod index 55ab29ac71f190b584f6ab2bd5acbfedbabd506a..de2b879dbdc091ebd0f374cd1f13aa1391adfb5b 100644 --- a/entity/ClassificationScore_entity/ClassificationScore_entity.aod +++ b/entity/ClassificationScore_entity/ClassificationScore_entity.aod @@ -5,6 +5,7 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <documentation>%aditoprj%/entity/ClassificationScore_entity/documentation.adoc</documentation> <contentTitleProcess>%aditoprj%/entity/ClassificationScore_entity/contentTitleProcess.js</contentTitleProcess> + <onValidation>%aditoprj%/entity/ClassificationScore_entity/onValidation.js</onValidation> <titlePlural>Possible Values</titlePlural> <recordContainer>db</recordContainer> <entityFields> @@ -18,7 +19,7 @@ <entityField> <name>TITLE</name> <title>Title</title> - <mandatory v="true" /> + <mandatory v="false" /> <displayValueProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/title/displayValueProcess.js</displayValueProcess> </entityField> <entityField> @@ -90,6 +91,7 @@ <minValue v="0" /> <outputFormat>0.00'%'</outputFormat> <inputFormat>0.00</inputFormat> + <mandatory v="true" /> <onValidation>%aditoprj%/entity/ClassificationScore_entity/entityfields/scorepercent/onValidation.js</onValidation> </entityField> <entityField> @@ -100,6 +102,58 @@ <inputFormat>#,##0.00</inputFormat> <state>READONLY</state> <valueProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/scoreinpoints/valueProcess.js</valueProcess> + <onValueChangeTypes> + <element>MASK</element> + <element>PROCESS</element> + <element>PROCESS_SETVALUE</element> + </onValueChangeTypes> + </entityField> + <entityField> + <name>FIELDVALUE</name> + <title>Value</title> + <contentType>FILTER_TREE</contentType> + <filterTreeExcludedFieldsProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/fieldvalue/filterTreeExcludedFieldsProcess.js</filterTreeExcludedFieldsProcess> + <state>AUTO</state> + <stateProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/fieldvalue/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/fieldvalue/valueProcess.js</valueProcess> + <onValueChange>%aditoprj%/entity/ClassificationScore_entity/entityfields/fieldvalue/onValueChange.js</onValueChange> + <onValueChangeTypes> + <element>MASK</element> + <element>PROCESS</element> + <element>PROCESS_SETVALUE</element> + </onValueChangeTypes> + </entityField> + <entityField> + <name>INDICATORNUMBER</name> + <title>Value</title> + <contentType>NUMBER</contentType> + <mandatoryProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatornumber/mandatoryProcess.js</mandatoryProcess> + <stateProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatornumber/stateProcess.js</stateProcess> + </entityField> + <entityField> + <name>INDICATORINTEGER</name> + <title>Value</title> + <contentType>NUMBER</contentType> + <outputFormat>#0</outputFormat> + <mandatoryProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatorinteger/mandatoryProcess.js</mandatoryProcess> + <stateProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatorinteger/stateProcess.js</stateProcess> + </entityField> + <entityField> + <name>INDICATORTEXT</name> + <title>Value</title> + <mandatoryProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatortext/mandatoryProcess.js</mandatoryProcess> + <dropDownProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatortext/dropDownProcess.js</dropDownProcess> + <stateProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/indicatortext/stateProcess.js</stateProcess> + </entityField> + <entityParameter> + <name>ClassificationTypeInfo_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>displayValueForTitleField</name> + <state>READONLY</state> + <stateProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/valueProcess.js</valueProcess> </entityField> </entityFields> <recordContainers> @@ -108,6 +162,7 @@ <isPageable v="false" /> <conditionProcess>%aditoprj%/entity/ClassificationScore_entity/recordcontainers/db/conditionProcess.js</conditionProcess> <orderClauseProcess>%aditoprj%/entity/ClassificationScore_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> + <onDBInsert>%aditoprj%/entity/ClassificationScore_entity/recordcontainers/db/onDBInsert.js</onDBInsert> <onDBUpdate>%aditoprj%/entity/ClassificationScore_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate> <onDBDelete>%aditoprj%/entity/ClassificationScore_entity/recordcontainers/db/onDBDelete.js</onDBDelete> <alias>Data_alias</alias> @@ -138,6 +193,22 @@ <name>SCOREPERCENT.value</name> <recordfield>CLASSIFICATIONSCORE.SCOREPERCENT</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>FIELDVALUE.value</name> + <recordfield>CLASSIFICATIONSCORE.FIELDVALUE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INDICATORINTEGER.value</name> + <recordfield>CLASSIFICATIONSCORE.INDICATORINTEGER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INDICATORNUMBER.value</name> + <recordfield>CLASSIFICATIONSCORE.INDICATORNUMBER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INDICATORTEXT.value</name> + <recordfield>CLASSIFICATIONSCORE.INDICATORTEXT</recordfield> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> diff --git a/entity/ClassificationScore_entity/contentTitleProcess.js b/entity/ClassificationScore_entity/contentTitleProcess.js index a32d1c4fccfbd2b173010c5281709660619bd4cf..78abc419e0a661a3469d8ae80032e206e7cc4ce3 100644 --- a/entity/ClassificationScore_entity/contentTitleProcess.js +++ b/entity/ClassificationScore_entity/contentTitleProcess.js @@ -2,4 +2,6 @@ import("system.translate"); import("system.result"); import("system.vars"); -result.string(translate.text(vars.get("$field.TITLE"))); \ No newline at end of file +var title = vars.get("$field.INDICATORINTEGER") || vars.get("$field.INDICATORNUMBER") || translate.text(vars.get("$field.INDICATORTEXT")) || vars.get("$field.FIELDVALUE"); + +result.string(title); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/documentation.adoc b/entity/ClassificationScore_entity/documentation.adoc index 8d280e34f85ddcafd52b0ea546f64389b0ea40ee..2610527000dabfb503e620b1ec5d43080396c5d9 100644 --- a/entity/ClassificationScore_entity/documentation.adoc +++ b/entity/ClassificationScore_entity/documentation.adoc @@ -9,7 +9,8 @@ Purpose: This Entity gives the administrators an easy way to edit the possible values, their scorePercent and sorting in the preview of classificationAdmin when selecting a indicator (classificationType). - The values gets stored in the table classificationscore with their own classificationScoreId, the classificationType_Id, title, scorePercent and sort. + The values gets stored in the table classificationscore with their own classificationScoreId, the classificationType_Id, scorePercent and sort. + -> the value get's stored either in FIELDVALUE, INDICATORTEXT, INDICATORNUMBER or INDICATORINTEGER, depending on the indicatorType and fieldType This entity only has one view: the ClassificationScoreMultipleEdit_view which has title as the title field and score and sort as columns making it possible for the admin to configure something like this: @@ -18,21 +19,26 @@ Purpose: USAGE: Organisation CLASSIFICATION: 1. Target Group - INDICATOR: Headquarters + INDICATOR: Industry SCOREPOINTS: 35 - Germany 100%, 35,00 - Austria 100%, 35,00 - Switzerland 70%, 25,00 + Finance 100%, 40,00 + Logistics 60%, 24,00 + Trade 0%, 0,00 Other 0%, 0,00 Particularities: The reason why we use percent is because the classificationTypes of the group can have different filterconditions, which excludes them for some datasets -> we had to settle for percent - The score itself get's calculated by the adding all the archeived scores of the relevant classificationType datasets of the object + The score itself get's calculated by the adding all the achieved scores of the relevant classificationType datasets of the object (scorePercent of the classificationScore dataset * the scorePoints of the classificationType dataset) and matching it against the the sum of the best possible scores of each relevant classificationType of that group and calculating it via the classificationGrading minPercents If none of the classificationTypes of a group is relevant we ignore that group. + At the moment we only allow classificating with drop down values or number/integer values. + For the dropDownFields of the entity or attributes we use a FILTER_TREE field so the user has all the possible values as the selection and we can easily evaluate them. + The dropDownValues of complex indicators work trough a dropDownProcess. + The numbers have a simple numberfield so the user can specify how many percent the object get's from that many points. + We also have to set the outdated flag of the classificationtype dataset everytime we insert/update/delete diff --git a/entity/ClassificationScore_entity/entityfields/classificationscoreid/valueProcess.js b/entity/ClassificationScore_entity/entityfields/classificationscoreid/valueProcess.js index 394e2a4a036323a90283bed48ca7ee378dd6200c..24e8467f15a62bf30965849807daf8fb85977f2e 100644 --- a/entity/ClassificationScore_entity/entityfields/classificationscoreid/valueProcess.js +++ b/entity/ClassificationScore_entity/entityfields/classificationscoreid/valueProcess.js @@ -3,5 +3,7 @@ import("system.util"); import("system.result"); import("system.vars"); -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value")) - result.string(util.getNewUUID()); \ No newline at end of file +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) +{ + result.string(util.getNewUUID()); +} \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/classificationtype_id/valueProcess.js b/entity/ClassificationScore_entity/entityfields/classificationtype_id/valueProcess.js index 8806f470d922646ce6c4127ee42e945e86119076..186858e8e7cd2bbfca3a5ea52a8745e84c7de18d 100644 --- a/entity/ClassificationScore_entity/entityfields/classificationtype_id/valueProcess.js +++ b/entity/ClassificationScore_entity/entityfields/classificationtype_id/valueProcess.js @@ -2,5 +2,7 @@ import("system.result"); import("system.neon"); import("system.vars"); -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) - result.string(vars.get("$param.ClassificationTypeId_param")); \ No newline at end of file +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) +{ + result.string(vars.get("$param.ClassificationTypeId_param")); +} \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/stateProcess.js b/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ceb8b4c2e65dc2b6f8b05cc77b5b5b93ed241f4f --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/stateProcess.js @@ -0,0 +1,6 @@ +import("Classification_lib"); +import("system.result"); +import("system.vars"); + +var filterValue = vars.get("$field.FIELDVALUE"); +result.string(ClassificationUtils.getClassificationScoreStateProcess(vars.get("$sys.recordstate"), null, null, null, filterValue)); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/valueProcess.js b/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..03b0db7617bb790d394435b2fec5518ec070d0da --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/displayvaluefortitlefield/valueProcess.js @@ -0,0 +1,31 @@ +import("system.result"); +import("system.vars"); + + +var filterValue = vars.get("$field.FIELDVALUE"); +var integerValue = vars.get("$field.INDICATORINTEGER"); +var numberValue = vars.get("$field.INDICATORNUMBER"); +var textValue = vars.get("$field.INDICATORTEXT"); +var res = ""; + +if (integerValue) +{ + res = integerValue; +} +else if (numberValue) +{ + res = numberValue; +} +else if (textValue) +{ + res = vars.get("$property.INDICATORTEXT.dropDown")[textValue]; +} +else if (filterValue) +{ + if (JSON.parse(filterValue)["filter"]["childs"]["0"]) + { + res = JSON.parse(filterValue)["filter"]["childs"]["0"]["value"]; //always the first child, because we only allow simple filters with one child + } +} + +result.string(res); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/fieldvalue/filterTreeExcludedFieldsProcess.js b/entity/ClassificationScore_entity/entityfields/fieldvalue/filterTreeExcludedFieldsProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1741b0560dccf75ec963c8fa87b620647383a771 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/fieldvalue/filterTreeExcludedFieldsProcess.js @@ -0,0 +1,102 @@ +//TODO: Use this once possible, in the meantime: handle wrongly configured fieldvalues in the upadteProcess +// +// +// +////import("system.logging"); +//import("system.neon"); +//import("system.text"); +//import("Classification_lib"); +//import("system.vars"); +//import("Context_lib"); +//import("Dependency_lib"); +//import("system.project"); +//import("ClassificationFilter_lib"); +//import("Sql_lib"); +//import("system.result"); +// +// +//////if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) +//////{ +//// var classificationTypeInformation = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.FIELD, CLASSIFICATIONTYPE.FIELDTYPE, CLASSIFICATIONTYPE.INDICATORTYPE") +//// .from("CLASSIFICATIONTYPE") +//// .where("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", vars.get("$param.ClassificationTypeId_param")) +//// .arrayRow(); +//// var context = classificationTypeInformation[0]; +//// var fieldV = classificationTypeInformation[1]; +//// var fieldType = classificationTypeInformation[2]; +//// var indicatorType = classificationTypeInformation[3]; +//// var entity = ContextUtils.getEntity(context); +//// var fields = project.getEntityStructure(entity)["fields"]; +//// +//// +//// +//// //We want to exclude all the classificationFilterFields. +//// //Excluding via this process works by returning a array with all the fieldNames you want to exclude. +//// //The ClassificationFilters are ClassificationFilterExtensionSets so the name of one of these fields looks like this: +//// // "#EXTENSION." + Set-Name + "." + Field-Name + "#" + Contenttype +//// // e.g: "#EXTENSION.ClassificationType_filter.d67397c5-5e05-433b-b61d-12807906aa5a#TEXT"" +//// +//// var classificationTypes = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.OBJECT_TYPE") +//// .from("CLASSIFICATIONTYPE") +//// .join("CLASSIFICATIONGROUP", "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") +//// .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.SORTING") +//// .table(); +//// +//// var res = ["CLASSIFICATIONVALUE"]; +//// var groupObject = {}; +//// var sqlHelper = new SqlMaskingUtils(); +//// var ii; +//// var previousObjectType; +//// +//// for (let i = 0; i < classificationTypes.length; i++) { +//// +//// //classificationGroupFilterFields are a little complicated: +//// //it's the classificationGroupId + the correct SqlCondition (as String) encoded via ClassificationGroupFilterNameCoder +correct prefix and contenttype +//// if(!groupObject.hasOwnProperty(classificationTypes[i][1]))//only once per group +//// { +//// if(previousObjectType == null || previousObjectType != classificationTypes[i][2]) +//// { +//// ii = 0;// reset the position once we are done with that object_type (possible thanks to the orderBy of the select above +//// } +//// +//// var sqlConditionForGroup = SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE is null")) +//// .thenString("-") +//// .elseValue(sqlHelper.substring("CLASSIFICATIONVALUE", ii+1, 1)) +//// .toString(); +//// +//// res.push("#EXTENSION.ClassificationGroup_filter."+ClassificationGroupFilterNameCoder.encode(classificationTypes[i][1], sqlConditionForGroup)+"#TEXT"); +//// groupObject[classificationTypes[i][1]] = ""; +//// ii++;// used for the correct Position in the grading string (we need the exact same condition as in the filterExtensionSet +//// previousObjectType = classificationTypes[i][2]; +//// } +//// } +//// +//// //remove all the fields of consumers with no dependency set between the entity of the object_type and the consumer entity +//// +////// for (var field in fields) +////// { +////// if(fields[field]["fieldType"] == "CONSUMER") +////// { +////// var consumerEntity = fields[field]["entityName"]; +////// +////// if(!Dependency.getReverseDependency(entity).includes(consumerEntity)) +////// { +////// var consumerStructure = project.getEntityStructure(consumerEntity); +////// var consumerName = fields[field]["name"]; +////// var consumerFields = consumerStructure["fields"]; +////// +////// for (var consumerField in consumerFields) +////// { +////// //name of these filterFields = consumerName + '.' + fieldname +////// res.push(consumerName +"."+consumerFields[consumerField]["name"]); +////// } +////// } +////// } +////// } +//res = ["#EXTENSION.ClassificationGroup_filter.eyJjbGFzc2lmaWNhdGlvbkdyb3VwSWQiOiI4MmJlMzY1OS05MTdiLTRhN2UtYmYzMS0zMzI1OGFmMDBhMTYiLCJyZXByZXNlbnRpbmdTcWxFeHByZXNzaW9uIjoiY2FzZSB3aGVuICAoIENMQVNTSUZJQ0FUSU9OU1RPUkFHRS5DTEFTU0lGSUNBVElPTlZBTFVFIGlzIG51bGwgKSAgdGhlbiAnLScgZWxzZSBzdWJzdHIoQ0xBU1NJRklDQVRJT05WQUxVRSwgMSwgMSkgZW5kIn0=#TEXT" +// , "#EXTENSION.ClassificationGroup_filter.eyJjbGFzc2lmaWNhdGlvbkdyb3VwSWQiOiI0YWY3NzQyZS1lMGRkLTQ4NGItYTMwOS05NDJmYmE1NDY4MzMiLCJyZXByZXNlbnRpbmdTcWxFeHByZXNzaW9uIjoiY2FzZSB3aGVuICAoIENMQVNTSUZJQ0FUSU9OU1RPUkFHRS5DTEFTU0lGSUNBVElPTlZBTFVFIGlzIG51bGwgKSAgdGhlbiAnLScgZWxzZSBzdWJzdHIoQ0xBU1NJRklDQVRJT05WQUxVRSwgMiwgMSkgZW5kIn0=#TEXT" +// , "#EXTENSION.ClassificationGroup_filter.eyJjbGFzc2lmaWNhdGlvbkdyb3VwSWQiOiIyMWFmMmI0ZC0zNGY3LTRjMDMtOGQ0ZS0wYTQwYmIxN2ZhZjIiLCJyZXByZXNlbnRpbmdTcWxFeHByZXNzaW9uIjoiY2FzZSB3aGVuICAoIENMQVNTSUZJQ0FUSU9OU1RPUkFHRS5DTEFTU0lGSUNBVElPTlZBTFVFIGlzIG51bGwgKSAgdGhlbiAnLScgZWxzZSBzdWJzdHIoQ0xBU1NJRklDQVRJT05WQUxVRSwgMSwgMSkgZW5kIn0=#TEXT" +// , "#EXTENSION.ClassificationGroup_filter.eyJjbGFzc2lmaWNhdGlvbkdyb3VwSWQiOiJhYjczM2FiNy1mOWIzLTRiOGYtOTY3NC0xOWU0MzQwY2MzMWEiLCJyZXByZXNlbnRpbmdTcWxFeHByZXNzaW9uIjoiY2FzZSB3aGVuICAoIENMQVNTSUZJQ0FUSU9OU1RPUkFHRS5DTEFTU0lGSUNBVElPTlZBTFVFIGlzIG51bGwgKSAgdGhlbiAnLScgZWxzZSBzdWJzdHIoQ0xBU1NJRklDQVRJT05WQUxVRSwgMiwgMSkgZW5kIn0=#TEXT" +// ] +// result.object(res); +////} \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/fieldvalue/onValueChange.js b/entity/ClassificationScore_entity/entityfields/fieldvalue/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/entity/ClassificationScore_entity/entityfields/fieldvalue/stateProcess.js b/entity/ClassificationScore_entity/entityfields/fieldvalue/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..fa537cdef8c45aed0d625756c32da7d02d042bde --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/fieldvalue/stateProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +var state = ClassificationUtils.getClassificationScoreStateProcess(vars.get("$sys.recordstate") + , [$ClassificationFieldTypes.DROPDOWN()] + , JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")) + , [$ClassificationIndicatorTypes.ENTITYFIELD(), $ClassificationIndicatorTypes.ATTRIBUTE()]); +result.string(state); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/fieldvalue/valueProcess.js b/entity/ClassificationScore_entity/entityfields/fieldvalue/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..773f1925cc801f0bd56eee0e491a4175a0a94434 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/fieldvalue/valueProcess.js @@ -0,0 +1,18 @@ +import("system.neon"); +import("JditoFilter_lib"); +import("Sql_lib"); +import("system.result"); +import("Context_lib"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value")) +{ + var objectType = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", vars.getString("$field.CLASSIFICATIONTYPE_ID")) + .cell(); + + var entity = ContextUtils.getEntity(objectType); + var emptyFilter = JditoFilterUtils.getEmptyFilter(entity); + result.string(emptyFilter); +} \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatorinteger/mandatoryProcess.js b/entity/ClassificationScore_entity/entityfields/indicatorinteger/mandatoryProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..93d9930ec5ad3aa85d31478a628f23984bb61be8 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatorinteger/mandatoryProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +var fieldInfo = JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")); +var res = fieldInfo && fieldInfo["fieldType"] == $ClassificationFieldTypes.INTEGER(); + +result.string(res); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatorinteger/stateProcess.js b/entity/ClassificationScore_entity/entityfields/indicatorinteger/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..093ba4b941d1819399870d309b32b58880ceabf6 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatorinteger/stateProcess.js @@ -0,0 +1,7 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +result.string(ClassificationUtils.getClassificationScoreStateProcess(vars.get("$sys.recordstate") + , [$ClassificationFieldTypes.INTEGER()] + , JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")))); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatornumber/mandatoryProcess.js b/entity/ClassificationScore_entity/entityfields/indicatornumber/mandatoryProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..218dc09e20453ba5dde497481d6f306dbe2d3533 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatornumber/mandatoryProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +var fieldInfo = JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")); +var res = fieldInfo && fieldInfo["fieldType"] == $ClassificationFieldTypes.NUMBER(); + +result.string(res); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatornumber/stateProcess.js b/entity/ClassificationScore_entity/entityfields/indicatornumber/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..412a3e13378d200416035ef778174b31bb711ec8 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatornumber/stateProcess.js @@ -0,0 +1,7 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +result.string(ClassificationUtils.getClassificationScoreStateProcess(vars.get("$sys.recordstate") + , [$ClassificationFieldTypes.NUMBER()] + , JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")))); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatortext/dropDownProcess.js b/entity/ClassificationScore_entity/entityfields/indicatortext/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8fb59508d1502596e9215f822db2205ed8d67c11 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatortext/dropDownProcess.js @@ -0,0 +1,16 @@ +import("ClassificationComplexIndicatorRegistry_basic"); +import("system.result"); +import("Classification_lib"); +import("Sql_lib"); +import("system.vars"); + +var res = []; + +var fieldInfo = JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")); + +if(fieldInfo && (fieldInfo["fieldType"] == $ClassificationFieldTypes.DROPDOWN() || fieldInfo["fieldType"] == $ClassificationFieldTypes.DATE()) + && fieldInfo["indicatorType"] == $ClassificationIndicatorTypes.COMPLEX()) +{ + res = ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorValueArray(fieldInfo["field"]); +} +result.object(res); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatortext/mandatoryProcess.js b/entity/ClassificationScore_entity/entityfields/indicatortext/mandatoryProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8e4b65df0e79ff1ee2c330dc19a804695cca827b --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatortext/mandatoryProcess.js @@ -0,0 +1,14 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +var res = false; + +var fieldInfo = JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")); + +if(fieldInfo && fieldInfo["fieldType"] == $ClassificationFieldTypes.DROPDOWN() + && fieldInfo["indicatorType"] == $ClassificationIndicatorTypes.COMPLEX()) +{ + res = true; +} +result.string(res); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/entityfields/indicatortext/stateProcess.js b/entity/ClassificationScore_entity/entityfields/indicatortext/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c39e741b11259629c4eb56d2080b0abd77489cc7 --- /dev/null +++ b/entity/ClassificationScore_entity/entityfields/indicatortext/stateProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); +import("Classification_lib"); + +var state = ClassificationUtils.getClassificationScoreStateProcess(vars.get("$sys.recordstate") + , [$ClassificationFieldTypes.DROPDOWN(), $ClassificationFieldTypes.DATE()] + , JSON.parse(vars.getString("$param.ClassificationTypeInfo_param")) + , [$ClassificationIndicatorTypes.COMPLEX()]); +result.string(state); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/onValidation.js b/entity/ClassificationScore_entity/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/entity/ClassificationScore_entity/recordcontainers/db/onDBInsert.js b/entity/ClassificationScore_entity/recordcontainers/db/onDBInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..1d7a46d81d65023d1f0ce5acf224e6fb6362c040 --- /dev/null +++ b/entity/ClassificationScore_entity/recordcontainers/db/onDBInsert.js @@ -0,0 +1,8 @@ +import("Sql_lib"); +import("system.vars"); + +//we have to set the corresponding classificationType dataset as outdated everytime we insert a new classificationScore or edit an existing one +//quick reminder: the classifications are not calculated in realtime, so we have to set this flag so the serverprocess knows what has changed and can recalculate accordingly +var classificationTypeId = vars.get("$field.CLASSIFICATIONTYPE_ID"); +var cond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypeId); +cond.updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [1]); \ No newline at end of file diff --git a/entity/ClassificationScore_entity/recordcontainers/db/onDBUpdate.js b/entity/ClassificationScore_entity/recordcontainers/db/onDBUpdate.js index c9d29f0a6ed67c07d8974c97aa4318ff6f50cb8a..1d7a46d81d65023d1f0ce5acf224e6fb6362c040 100644 --- a/entity/ClassificationScore_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/ClassificationScore_entity/recordcontainers/db/onDBUpdate.js @@ -1,8 +1,8 @@ import("Sql_lib"); import("system.vars"); +//we have to set the corresponding classificationType dataset as outdated everytime we insert a new classificationScore or edit an existing one +//quick reminder: the classifications are not calculated in realtime, so we have to set this flag so the serverprocess knows what has changed and can recalculate accordingly var classificationTypeId = vars.get("$field.CLASSIFICATIONTYPE_ID"); - var cond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", classificationTypeId); - cond.updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [1]); \ No newline at end of file diff --git a/entity/ClassificationType_entity/ClassificationType_entity.aod b/entity/ClassificationType_entity/ClassificationType_entity.aod index 8284348cbdf37deead1514999be24c60ebbf2c9a..4aadb51b31db8f6c584d801d50ff1e99aac1eb80 100644 --- a/entity/ClassificationType_entity/ClassificationType_entity.aod +++ b/entity/ClassificationType_entity/ClassificationType_entity.aod @@ -32,6 +32,7 @@ <entityConsumer> <name>ClassificationScores</name> <refreshParent v="true" /> + <onValidation>%aditoprj%/entity/ClassificationType_entity/entityfields/classificationscores/onValidation.js</onValidation> <dependency> <name>dependency</name> <entityName>ClassificationScore_entity</entityName> @@ -46,6 +47,10 @@ <name>ClassificationGroup_param</name> <valueProcess>%aditoprj%/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationgroup_param/valueProcess.js</valueProcess> </entityParameter> + <entityParameter> + <name>ClassificationTypeInfo_param</name> + <valueProcess>%aditoprj%/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationtypeinfo_param/valueProcess.js</valueProcess> + </entityParameter> </children> </entityConsumer> <entityProvider> @@ -80,6 +85,15 @@ <entityField> <name>OUTDATED</name> </entityField> + <entityField> + <name>FIELD</name> + </entityField> + <entityField> + <name>FIELDTYPE</name> + </entityField> + <entityField> + <name>INDICATORTYPE</name> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -114,6 +128,18 @@ <name>SCOREPOINTS.value</name> <recordfield>CLASSIFICATIONTYPE.SCOREPOINTS</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>FIELD.value</name> + <recordfield>CLASSIFICATIONTYPE.FIELD</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>FIELDTYPE.value</name> + <recordfield>CLASSIFICATIONTYPE.FIELDTYPE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INDICATORTYPE.value</name> + <recordfield>CLASSIFICATIONTYPE.INDICATORTYPE</recordfield> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> diff --git a/entity/ClassificationType_entity/documentation.adoc b/entity/ClassificationType_entity/documentation.adoc index ec1b4d8a15791b2e5f541eb575bde404113fbc1b..e2fa391d6ffc725913910d1dce9c3daf53bb5d20 100644 --- a/entity/ClassificationType_entity/documentation.adoc +++ b/entity/ClassificationType_entity/documentation.adoc @@ -8,11 +8,11 @@ Definition: Purpose: This entity is used for storing the indicators and making it possible for the admin to change - the details of the indicator (classificationType) like the name, it's usage or it's classification (classificationGroup) + the details of the indicator (classificationType) the field, it's usage or it's classification (classificationGroup) This entity only has one view: the ClassificationTypePreview which has the usagePlace (object_type), - classification (classificationgroup_Id), title (scoretype), and the usagefilter to make it possible to have classificationTypes - that are only relevant for certain objects, scorepoints + classification (classificationgroup_Id), the usagefilter(to make it possible to have classificationTypes + that are only relevant for certain objects) and the scorepoints + the ClassificationScoreMultipleEdit_view. making it possible for the admin to configure something like this: @@ -33,7 +33,13 @@ Particularities: We also have to set the outdated flag of the classificationtype dataset everytime we insert/update it and set the flag for all the other classificationtypes of the group if we delete the current classificationType - + + We only classificate fields of the entity itself, it's attributes or the complex ones specified by customizing (see also ClassificationComplexIndicatorRegistry_basic) + At the moment we only allow classificating with drop down values or number/integer values. + For the dropDownFields of the entity or attributes we use a FILTER_TREE field so the user has all the possible values as the selection and we can easily evaluate them. + The dropDownValues of complex indicators work trough a dropDownProcess. + The numbers have a simple numberfield so the user can specify how many percent the object get's from that many points. + The Classification consists of the following entities: Classification_entity, ClassificationAdmin_entity, diff --git a/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationtypeinfo_param/valueProcess.js b/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationtypeinfo_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c40502a50f014e80b53a78e17c8944e80eff483f --- /dev/null +++ b/entity/ClassificationType_entity/entityfields/classificationscores/children/classificationtypeinfo_param/valueProcess.js @@ -0,0 +1,12 @@ +import("system.vars"); +import("system.result"); + +result.string( + JSON.stringify( + { + field: vars.get("$field.FIELD"), + fieldType: vars.get("$field.FIELDTYPE"), + indicatorType: vars.get("$field.INDICATORTYPE") + } + ) +); \ No newline at end of file diff --git a/entity/ClassificationType_entity/entityfields/classificationscores/onValidation.js b/entity/ClassificationType_entity/entityfields/classificationscores/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..d6bba218749fb3bc538990c9bcfc0cabad14bddb --- /dev/null +++ b/entity/ClassificationType_entity/entityfields/classificationscores/onValidation.js @@ -0,0 +1,56 @@ +import("AttributeFilter_lib"); +import("system.translate"); +import("system.result"); +import("Classification_lib"); +import("system.neon"); +import("system.project"); +import("Context_lib"); +import("system.vars"); +import("Sql_lib"); + +//this process doesn't always get triggered when changing the FIELDVALUE value. +//Because there are some bugs when it comes to triggering processes by FILTER_TREE fields in multiEdits +var fieldType = vars.get("$field.FIELDTYPE"); +var indicatorType = vars.get("$field.INDICATORTYPE"); + +if(fieldType == $ClassificationFieldTypes.DROPDOWN() + && (indicatorType == $ClassificationIndicatorTypes.ENTITYFIELD() + || indicatorType == $ClassificationIndicatorTypes.ATTRIBUTE())) +{ + //we only care about the newly inserted and the changed rows, since the ones we already have stored are valid and we don't care about the deleted ones' + var insertedRows = vars.get("$field.ClassificationScores.insertedRows"); + var changedRows = vars.get("$field.ClassificationScores.changedRows"); + var relevantRows = insertedRows.concat(changedRows); + + var field = vars.get("$field.FIELD"); + + var validationText = ""; + for (let i = 0; i < relevantRows.length; i++) + { + validationText = _getValidationString(JSON.parse(relevantRows[i]["FIELDVALUE"]), field, validationText, indicatorType); + } + if (validationText != "") + { + result.string(validationText); + } +} + +function _getValidationString (pFilter, pField, pValidationString, pIndicatorType) +{ + if(pFilter["filter"]["childs"].length != 1) + { + pValidationString += translate.text("only use simple filters") + "\n\ +"; + } + else if(pFilter["filter"]["childs"][0]["name"] != pField || (pIndicatorType == $ClassificationIndicatorTypes.ATTRIBUTE() && pField.includes(pFilter["filter"]["childs"][0]["name"]))) + { + pValidationString += translate.text("only filter using the specified indicatorfield")+ "\n\ +"; + } + else if(pFilter["filter"]["childs"][0]["operator"] != "EQUAL") + { + pValidationString += translate.text("please only filter using 'equal'")+ "\n\ +"; + } + return pValidationString; +} \ No newline at end of file diff --git a/entity/Classification_entity/Classification_entity.aod b/entity/Classification_entity/Classification_entity.aod index 086574ccbc525b4f8066a4b49a5c35ace1bb1b11..5dfcffcc838eaf10372aab1aba5f4a70a4e3926c 100644 --- a/entity/Classification_entity/Classification_entity.aod +++ b/entity/Classification_entity/Classification_entity.aod @@ -12,14 +12,10 @@ <entityProvider> <name>#PROVIDER</name> </entityProvider> - <entityField> - <name>CLASSIFICATIONID</name> - </entityField> <entityField> <name>VALUE</name> <title>Selection</title> <consumer>ClassificationScores</consumer> - <displayValueProcess>%aditoprj%/entity/Classification_entity/entityfields/value/displayValueProcess.js</displayValueProcess> </entityField> <entityParameter> <name>ClassificationType_param</name> @@ -46,9 +42,6 @@ <entityField> <name>CLASSIFICATIONTYPEID</name> <title>Indicator</title> - <consumer>KeywordClassificationTypes</consumer> - <stateProcess>%aditoprj%/entity/Classification_entity/entityfields/classificationtypeid/stateProcess.js</stateProcess> - <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/classificationtypeid/valueProcess.js</valueProcess> </entityField> <entityField> <name>CLASSIFICATIONGROUP</name> @@ -56,19 +49,11 @@ <title>Classification</title> <contentType>TEXT</contentType> <groupable v="true" /> - <mandatoryProcess>%aditoprj%/entity/Classification_entity/entityfields/classificationgroup/mandatoryProcess.js</mandatoryProcess> <textInputAllowed v="true" /> </entityField> - <entityField> - <name>OBJECT_ROWID</name> - <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/object_rowid/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>OBJECT_TYPE</name> - <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/object_type/valueProcess.js</valueProcess> - </entityField> <entityField> <name>UID</name> + <state>INVISIBLE</state> </entityField> <entityConsumer> <name>ClassificationScores</name> @@ -92,14 +77,6 @@ </entityParameter> </children> </entityConsumer> - <entityField> - <name>Info</name> - <title>Rating</title> - <contentType>HTML</contentType> - <groupable v="true" /> - <state>READONLY</state> - <displayValueProcess>%aditoprj%/entity/Classification_entity/entityfields/info/displayValueProcess.js</displayValueProcess> - </entityField> <entityField> <name>SCORE_RESULTS</name> </entityField> @@ -121,14 +98,6 @@ <name>SCORETYPE</name> <title>Indicator</title> <mandatory v="false" /> - <displayValueProcess>%aditoprj%/entity/Classification_entity/entityfields/scoretype/displayValueProcess.js</displayValueProcess> - </entityField> - <entityField> - <name>GroupScore</name> - <valueProcess>%aditoprj%/entity/Classification_entity/entityfields/groupscore/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>GRADINGVALUE</name> </entityField> <entityProvider> <name>#PROVIDER_AGGREGATES</name> @@ -137,26 +106,14 @@ <entityField> <name>SCOREPOINTS</name> <title>Points</title> - <contentType>NUMBER</contentType> + <contentType>TEXT</contentType> <outputFormat>#,##0.00</outputFormat> <inputFormat>#,##0.00</inputFormat> </entityField> - <entityField> - <name>DISPLAYVALUE</name> - </entityField> - <entityActionGroup> - <name>fitlerviewActionGroup</name> - <title>Action</title> - <children> - <entityActionField> - <name>refreshClassificationsOfThisDataset</name> - <title>refresh classifications</title> - <onActionProcess>%aditoprj%/entity/Classification_entity/entityfields/fitlerviewactiongroup/children/refreshclassificationsofthisdataset/onActionProcess.js</onActionProcess> - <isObjectAction v="false" /> - <iconId>VAADIN:REFRESH</iconId> - </entityActionField> - </children> - </entityActionGroup> + <entityParameter> + <name>ClassificationContent_param</name> + <expose v="true" /> + </entityParameter> </entityFields> <recordContainers> <jDitoRecordContainer> @@ -166,17 +123,10 @@ <isRequireContainerFiltering v="true" /> <contentProcess>%aditoprj%/entity/Classification_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <hasDependentRecords v="true" /> - <onUpdate>%aditoprj%/entity/Classification_entity/recordcontainers/jdito/onUpdate.js</onUpdate> <recordFieldMappings> <jDitoRecordFieldMapping> <name>UID.value</name> </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>CLASSIFICATIONTYPEID.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>CLASSIFICATIONID.value</name> - </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> <name>CLASSIFICATIONGROUP.value</name> </jDitoRecordFieldMapping> @@ -184,10 +134,10 @@ <name>CLASSIFICATIONGROUP.displayValue</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>CLASSIFICATIONTYPEID.displayValue</name> + <name>CLASSIFICATIONTYPEID.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>SCOREPOINTS.value</name> + <name>CLASSIFICATIONTYPEID.displayValue</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> <name>VALUE.value</name> @@ -196,10 +146,7 @@ <name>VALUE.displayValue</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>Info.displayValue</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>Info.value</name> + <name>SCOREPOINTS.value</name> </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> diff --git a/entity/Classification_entity/entityfields/classificationgroup/mandatoryProcess.js b/entity/Classification_entity/entityfields/classificationgroup/mandatoryProcess.js deleted file mode 100644 index 7bbc5aa02d8beaf00c4458e4297646209f00ad91..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/classificationgroup/mandatoryProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.neon"); -import("system.result"); -import("system.vars"); - -result.object(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT); \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/classificationscores/children/classificationtype_param/valueProcess.js b/entity/Classification_entity/entityfields/classificationscores/children/classificationtype_param/valueProcess.js index 66d1a9ae5a70ffada860ab15cf8caffd67aea623..49cfe957ff858694a0732c68ce0125a2630cd3d2 100644 --- a/entity/Classification_entity/entityfields/classificationscores/children/classificationtype_param/valueProcess.js +++ b/entity/Classification_entity/entityfields/classificationscores/children/classificationtype_param/valueProcess.js @@ -1,4 +1,2 @@ import("system.vars"); import("system.result"); - -result.string(vars.get("$field.OBJECT_TYPE")) \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/classificationtypeid/stateProcess.js b/entity/Classification_entity/entityfields/classificationtypeid/stateProcess.js deleted file mode 100644 index d2c0dd18db355cc71410e59b8fae386dc591254e..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/classificationtypeid/stateProcess.js +++ /dev/null @@ -1,8 +0,0 @@ -import("system.result"); -import("system.neon"); -import("system.vars"); - -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) - result.string(neon.COMPONENTSTATE_EDITABLE); -else - result.string(neon.COMPONENTSTATE_READONLY); \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/classificationtypeid/valueProcess.js b/entity/Classification_entity/entityfields/classificationtypeid/valueProcess.js deleted file mode 100644 index 2bccd5eb7fbb2311971da0e6ae2ed3b56ed21268..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/classificationtypeid/valueProcess.js +++ /dev/null @@ -1,8 +0,0 @@ -import("system.result"); -import("system.neon"); -import("system.vars"); - -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) -{ - result.string(vars.get("$param.ClassificationType_param")); -} \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/fitlerviewactiongroup/children/refreshclassificationsofthisdataset/onActionProcess.js b/entity/Classification_entity/entityfields/fitlerviewactiongroup/children/refreshclassificationsofthisdataset/onActionProcess.js deleted file mode 100644 index 10cfa6bda238dca910902b0b1a731d2e483336eb..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/fitlerviewactiongroup/children/refreshclassificationsofthisdataset/onActionProcess.js +++ /dev/null @@ -1,18 +0,0 @@ -import("system.process"); -import("system.util"); -import("system.vars"); - -var params = { - "refreshSingleRecord_param" : true, - "ObjectRowid_param" : vars.get("$param.ObjectRowid_param"), - "ObjectType_param" : vars.get("$param.ObjectType_param")} - -var processConfig = process.createStartAsyncConfig() - .setName("updateClassifications_serverProcess") - .setUser( vars.get("$sys.user")) - .setThreadPriority(process.THREADPRIORITY_LOW) - .setTimerType(process.TIMERTYPE_SERVER) - .setLocalVariables(params); - - -process.startAsync(processConfig); \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/groupscore/valueProcess.js b/entity/Classification_entity/entityfields/groupscore/valueProcess.js deleted file mode 100644 index f711050aab02378a519ccc866a44d5005e79f3e2..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/groupscore/valueProcess.js +++ /dev/null @@ -1,15 +0,0 @@ -import("system.vars"); -import("system.result"); -import("system.result"); - -if (vars.getString("$field.SCORE_RESULTS")) -{ - var score = JSON.parse(vars.getString("$field.SCORE_RESULTS"))[vars.getString("$field.CLASSIFICATIONGROUP")]; - - if (!score) - score = 0; - else - score = parseInt(score); - - result.string(score); -} diff --git a/entity/Classification_entity/entityfields/info/displayValueProcess.js b/entity/Classification_entity/entityfields/info/displayValueProcess.js deleted file mode 100644 index 8cc250e8c5e8bb966333b5dd0843cebbe01e2991..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/info/displayValueProcess.js +++ /dev/null @@ -1,26 +0,0 @@ -import("system.translate"); -import("system.neon"); -import("system.result"); -import("system.vars"); -import("Sql_lib"); - -if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) -{ - var classificationTypeId = vars.get("$field.CLASSIFICATIONTYPEID"); - var value = vars.get("$field.VALUE"); - if(classificationTypeId) - { - var select = newSelect(["CLASSIFICATIONSCORE.SCOREPERCENT/100*CLASSIFICATIONTYPE.SCOREPOINTS", - newSelect("max(CLASSIFICATIONSCORE.SCOREPERCENT)/100*CLASSIFICATIONTYPE.SCOREPOINTS") - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE on CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", classificationTypeId) - .groupBy("CLASSIFICATIONTYPE.SCOREPOINTS").cell()]) - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE on CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID", value) - .arrayRow(); - - result.string(Math.round(select[0] * 100) / 100 +"/"+Math.round(select[1] * 100) / 100 + " " +translate.text("Points")); - } -} \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/object_rowid/valueProcess.js b/entity/Classification_entity/entityfields/object_rowid/valueProcess.js deleted file mode 100644 index fe14f896ec8a83c8570a94ad6b64c9585c122e99..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/object_rowid/valueProcess.js +++ /dev/null @@ -1,8 +0,0 @@ -import("system.result"); -import("system.neon"); -import("system.vars"); - -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && vars.get("$this.value") == null && vars.get("$param.ObjectRowid_param")) -{ - result.string(vars.get("$param.ObjectRowid_param")); -} \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/object_type/valueProcess.js b/entity/Classification_entity/entityfields/object_type/valueProcess.js deleted file mode 100644 index f51252e64ad7fb10b50c67ab339385859219f11b..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/object_type/valueProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.result"); -import("system.neon"); -import("system.vars"); - -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT && vars.get("$this.value") == null) - result.string(vars.get("$param.ObjectType_param")); \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/scoretype/displayValueProcess.js b/entity/Classification_entity/entityfields/scoretype/displayValueProcess.js deleted file mode 100644 index 87d569a0e2dc50c0ef3859fdbc0f22c3d9ac89e3..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/scoretype/displayValueProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.vars"); -import("system.translate"); -import("system.result"); - -result.string(translate.text(vars.get("$field.SCORETYPE"))); \ No newline at end of file diff --git a/entity/Classification_entity/entityfields/value/displayValueProcess.js b/entity/Classification_entity/entityfields/value/displayValueProcess.js deleted file mode 100644 index 142bdf632c32fc623494dd125caca5f75abc104e..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/entityfields/value/displayValueProcess.js +++ /dev/null @@ -1,19 +0,0 @@ -import("system.vars"); -import("system.translate"); -import("Sql_lib"); -import("system.db"); -import("system.result"); - -// no need to load, if no classificationscore exists -if (vars.get("$field.VALUE")) -{ - // TODO: loadEntity / #Title - result.string(translate.text(newSelect("TITLE") - .from("CLASSIFICATIONSCORE") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID", "$field.VALUE") - .cell())); -} -else -{ - result.string(""); -} diff --git a/entity/Classification_entity/recordcontainers/jdito/contentProcess.js b/entity/Classification_entity/recordcontainers/jdito/contentProcess.js index 9012ad499cb17403800936f7ad257cca37b1d91b..241ef0e0133f813467bde62a324fcb2bb45fdc8d 100644 --- a/entity/Classification_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/Classification_entity/recordcontainers/jdito/contentProcess.js @@ -1,563 +1,8 @@ -import("Context_lib"); -import("Util_lib"); -import("system.eMath"); -import("system.entities"); -import("Organisation_lib"); -import("system.text"); -import("Classification_lib"); -import("Contact_lib"); -import("JditoFilter_lib"); -import("Sql_lib"); -import("system.db"); import("system.result"); -import("system.util"); import("system.vars"); -import("system.translate"); -//helper object for coding/decoding the uid of a record in this entity -function _UidEncoder(){} - -_UidEncoder.encode = function (pClassifactionTypeId, pObjectRowId, pObjectType) -{ - var res = text.encodeMS(Array.from(arguments)); - return res; -} - -_UidEncoder.decode = function (pEncodedUid) -{ - var vals = text.decodeMS(pEncodedUid); - return { - classifactionTypeId: vals[0], - objectRowId: vals[1], - objectType: vals[2] - }; -} - -//grouping is not done in this recordContainer but in it is done in the ClassificaitonTree_view via the defaultGroupFields - -var objectRowIdParam = vars.get("$param.ObjectRowid_param"); -var objectTypeParam = vars.get("$param.ObjectType_param"); - -var classificationTypeGroupDisplayCache = {}; -var gradingObject = {}; -var bestPossibleValuesObj = {}; -var achievedGroupScoresObj = {}; -var achievedGroupGradingsObj = {}; -var translatedClassificationTypesObj = {}; -var gradingTables = {}; -var maxScoresObj = {}; - -var resultSet = []; -var select; - -var classificationGroups = []; - -if (vars.exists("$local.idvalues") && vars.get("$local.idvalues")) -{ - var decodedId = _UidEncoder.decode(vars.get("$local.idvalues")); -} - -if(decodedId)//data selected -> only one select has to be done with the classificationtype (which we get from the uuid) in the condition -{ - select = newSelect(["CLASSIFICATION.CLASSIFICATIONID, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.SCORETYPE, \n\ - CLASSIFICATION.SCOREPOINTS, CLASSIFICATION.VALUE, CLASSIFICATIONSCORE.TITLE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", - newSelect("max(CLASSIFICATIONSCORE.SCOREPERCENT)*CLASSIFICATIONTYPE.SCOREPOINTS") - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE on CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", decodedId["classifactionTypeId"]) - .groupBy("CLASSIFICATIONTYPE.SCOREPOINTS").cell()]) - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATION", "CLASSIFICATION.VALUE = CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID") - .leftJoin("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .leftJoin("CLASSIFICATIONGROUP", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .where("CLASSIFICATION.CLASSIFICATIONTYPE_ID", decodedId["classifactionTypeId"]) - .and("CLASSIFICATION.OBJECT_TYPE", decodedId["objectType"]) - .and("CLASSIFICATION.OBJECT_ROWID", decodedId["objectRowId"]) - .arrayRow(); - - if(select.length == 0)//different select needed if no classifications have been stored for the current object_rowId (otherwise problem with the from clause) - { - select = newSelect(["CLASSIFICATION.CLASSIFICATIONID, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.SCORETYPE, \n\ - CLASSIFICATION.SCOREPOINTS, CLASSIFICATION.VALUE" - , SqlBuilder.caseWhen(newWhere("CLASSIFICATION.VALUE", "")) - .thenString("") - .elseValue("CLASSIFICATIONSCORE.TITLE") - .toString() - , "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID", - newSelect("max(CLASSIFICATIONSCORE.SCOREPERCENT)*CLASSIFICATIONTYPE.SCOREPOINTS") - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE on CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", decodedId["classifactionTypeId"]) - .groupBy("CLASSIFICATIONTYPE.SCOREPOINTS").cell()]) - .from("CLASSIFICATION") - .leftJoin("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .leftJoin("CLASSIFICATIONGROUP", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .where("CLASSIFICATION.CLASSIFICATIONTYPE_ID", decodedId["classifactionTypeId"]) - .and("CLASSIFICATION.OBJECT_TYPE", decodedId["objectType"]) - .and("CLASSIFICATION.OBJECT_ROWID", decodedId["objectRowId"]) - .arrayRow(); - } - - - var groupId = select[6]; - _buildMaxScore(); //builds maxScoresObj - maxTypeScoreObj = {}; - achievedScoresObj = {}; - var maxPointsArray = newSelect("CLASSIFICATION.SCOREPOINTS, CLASSIFICATION.CLASSIFICATIONTYPE_ID, CLASSIFICATIONTYPE.SCOREPOINTS") - .from("CLASSIFICATION") - .join("CLASSIFICATIONTYPE", "CLASSIFICATION.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .where("CLASSIFICATION.CLASSIFICATIONTYPE_ID", - newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupId), SqlBuilder.IN()) - .and("CLASSIFICATION.OBJECT_ROWID", objectRowIdParam) - .table(); - var maxScoreGroup = 0; - var achievedScoreGroup = 0; - for (let i = 0; i < maxPointsArray.length; i++) - { - [achievedScore, classificationTypeId, maxScore] = maxPointsArray[i]; - - - maxScoreGroup = eMath.addDec(maxScoreGroup, (maxScoresObj[classificationTypeId]*maxScore)); - - achievedScoreGroup = eMath.addDec(achievedScore, achievedScoreGroup); - } - - gradingTables = newSelect("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID, CLASSIFICATIONGRADING.MINPERCENT, CLASSIFICATIONGRADING.GRADING") - .from("CLASSIFICATIONGRADING") - .where("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID", groupId) - .orderBy("CLASSIFICATIONGRADING.MINPERCENT asc") - .table(); - - for (let i = 0; i < gradingTables.length; i++) - { - [groupId, minPercent, grading] = gradingTables[i]; - - if(gradingObject[groupId] == undefined) - gradingObject[groupId] = []; - - gradingObject[groupId].push([minPercent, grading]); - } - - displayString = ClassificationUtils.formatDisplaySummaryForGroup(achievedScoreGroup, maxScoreGroup, groupId, translate.text(select[1]), - ClassificationUtils.getGradingFromObject(gradingObject, groupId, achievedScoreGroup, maxScoreGroup)) - - resultSet.push([vars.get("$local.idvalues")[0] - , decodedId["classifactionTypeId"] - , select[0] - , groupId - , displayString - , translate.text(select[2]) - , select[3] - , select[4] - , translate.text(select[5]) - , Math.round(select[3] * 100) / 100 +"/"+Math.round(select[7]) / 100 + " " +translate.text("Points")//do this here instead of in the sql so we don't get a lot of zeros behind the comma - , groupId - ]); - -} -else//else -> build via stored classification datasets; if we don't have any: 1. we get all relevant classificationtypes (this can take some time due to the filters) -{ //2. insert empty values for them and then 3. load the selected classificationtypes - - // if the select that's done in _buildTreeFromPersistetData() doesnt't return any persisted classifications -> the context has never been opened - // for this dataset before and we need to load all relevant classificationTypes and persist them and return the data - if(!_buildTreeFromPersistetData()) - { - _buildMaxScore(); - - //get's all the the classificationtypes of the current objectType - var classificationTypeArray = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, \n\ - CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONTYPE.SCOREPOINTS, CLASSIFICATIONTYPE.FILTER") - .from("CLASSIFICATIONTYPE") - .join("CLASSIFICATIONGROUP", "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypeParam) - .orderBy("CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .table(); - - helperObject = {}; - classificationTypeObj = {}; - checkedFilterObj = {}; - for (let i = 0; i < classificationTypeArray.length; i++) - { - [groupId, classificationGroupTitle, typeId, classificationTypeScoreType, classificationTypeScorePoints, classificationTypeFilter] = classificationTypeArray[i]; - - if(!helperObject.hasOwnProperty(groupId)) //classificationGroup - { - classificationTypeObj[groupId] = {}; - classificationGroups.push(groupId); - helperObject[groupId] = ""; - } - if(!helperObject.hasOwnProperty(typeId)) //classificationType - { - if(_isRelevant()) - { - classificationTypeObj[groupId][typeId] = { "classificationGroupTitle": classificationGroupTitle - ,"classificationTypeScoreType": classificationTypeScoreType - ,"classificationTypeMaxPoints": Math.round(classificationTypeScorePoints*maxScoresObj[typeId] * 100) / 100}; - if(bestPossibleValuesObj[groupId] == undefined) - bestPossibleValuesObj[groupId] = 0; - bestPossibleValuesObj[groupId] = eMath.addDec(bestPossibleValuesObj[groupId], classificationTypeScorePoints) - } - helperObject[typeId] = ""; - } - } - - var columns = ["CLASSIFICATION.CLASSIFICATIONID" - , "CLASSIFICATION.VALUE" - , "CLASSIFICATION.CLASSIFICATIONTYPE_ID" - , "CLASSIFICATION.OBJECT_TYPE" - , "CLASSIFICATION.OBJECT_ROWID" - , "CLASSIFICATION.SCOREPOINTS" - ]; - - - //we loop trough all the relevant classificationtypes and insert classification datasets for every one of them. - //here we can easily build resultSet since we are already looping trough all the classificationTypes, so why not do it? - for (groupId in classificationTypeObj) - { - for (var typeId in classificationTypeObj[groupId]) - { - classificationId = util.getNewUUID(); - var values = [classificationId - , " " - , typeId - , objectTypeParam - , objectRowIdParam - , "0" - ]; - - db.insertData("CLASSIFICATION", columns, null, values);//insert into CLASSIFICATION for every relevant classificationtype - - //build resultSet: - uid = _UidEncoder.encode(typeId, objectRowIdParam, objectTypeParam); - resultSet.push([uid, typeId, classificationId, groupId, translate.text(classificationTypeObj[groupId][typeId]["classificationGroupTitle"]), - translate.text(classificationTypeObj[groupId][typeId]["classificationTypeScoreType"]), - "0", "", "", classificationTypeObj[groupId][typeId]["classificationTypeMaxPoints"]+" "+translate.text("Points")]); - } - } - } - - // get displayvalues, and build the infoString using gradingObj (this is relevant for every way of loading data) - - gradingTables = newSelect("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID, CLASSIFICATIONGRADING.MINPERCENT, CLASSIFICATIONGRADING.GRADING") - .from("CLASSIFICATIONGRADING") - .where("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID", classificationGroups, SqlBuilder.IN()) - .orderBy("CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID, MINPERCENT asc") - .table(); - - for (i = 0; i < gradingTables.length; i++) - { - [groupId, minPercent, grading] = gradingTables[i]; - - if(gradingObject[groupId] == undefined) - gradingObject[groupId] = []; - - gradingObject[groupId].push([minPercent, grading]); - } - - for (i = 0; i < classificationGroups.length; i++) - { - var classificatioGroupId = classificationGroups[i]; - if(achievedGroupScoresObj[classificatioGroupId] == undefined) - achievedGroupScoresObj[classificatioGroupId] = 0; - - achievedGroupGradingsObj[classificatioGroupId] = ClassificationUtils.getGradingFromObject(gradingObject, classificatioGroupId, - achievedGroupScoresObj[classificatioGroupId], bestPossibleValuesObj[classificatioGroupId]); - } - - - for (i = 0; i < resultSet.length; i++) { - groupId = resultSet[i][3]; - - //display value is the same for every groupId, so let's cache it that we do not need to load it in every row => better performance - if (classificationTypeGroupDisplayCache[groupId] == undefined) - { - classificationTypeGroupDisplayCache[groupId] = ClassificationUtils.formatDisplaySummaryForGroup(achievedGroupScoresObj[groupId] - ,bestPossibleValuesObj[groupId], groupId, resultSet[i][4], achievedGroupGradingsObj[groupId]); - } - resultSet[i][4] = classificationTypeGroupDisplayCache[groupId]; - resultSet[i][9] = ""; - resultSet[i][10] = ""; - } - - -} -var newStorageString = ""; -var oldStorageString = newSelect("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE") - .from("CLASSIFICATIONSTORAGE") - .where("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypeParam) - .and("CLASSIFICATIONSTORAGE.OBJECT_ROWID", objectRowIdParam) - .cell(); - -for(var groupid in classificationTypeGroupDisplayCache) -{ - newStorageString += classificationTypeGroupDisplayCache[groupid].slice(classificationTypeGroupDisplayCache[groupid].length-1) -} - -var update; -if(newStorageString != oldStorageString && !decodedId)//update the old string if the new one differs -{ - update = newWhere("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypeParam) - .and("CLASSIFICATIONSTORAGE.OBJECT_ROWID", objectRowIdParam) - .updateData(true, "CLASSIFICATIONSTORAGE", ["CLASSIFICATIONVALUE"], null, [newStorageString]);//don't set the OUTDATED flag to false since even our new value could be outdated! - - if(update == 0)//update wasnt succesfull -> the storage dataset doesnt exist yet -> insert - { - db.insertData("CLASSIFICATIONSTORAGE", ["CLASSIFICATIONSTORAGEID", "CLASSIFICATIONVALUE", "OBJECT_ROWID", "OBJECT_TYPE", "OUTDATED"], null, - [util.getNewUUID(), newStorageString, objectRowIdParam, objectTypeParam, 0]) - } -} -else if(decodedId)//different way of handling when data is selected since we can only check for the grading of the group of the current classificationtype -{ - var orderedGroups = newSelect("distinct CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.SORTING") - .from("CLASSIFICATION") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .join("CLASSIFICATIONGROUP", "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .where("CLASSIFICATION.OBJECT_ROWID", objectRowIdParam) - .orderBy("CLASSIFICATIONGROUP.SORTING") - .table(); - //get the of our grading in the string - var position = 0; - for (i = 0; i < orderedGroups.length; i++) { - if(orderedGroups[i][0] == groupId) - { - position = i; - break; - } - } - newStorageString = displayString.slice(displayString.length-1); //slice current grading from the displaystring - if(newStorageString != oldStorageString.slice(position, position+1)) // our letter/char/whatever differs from the one at the correct position of the storred string - { - newStorageString = StringUtils.replaceAt(oldStorageString, position, newStorageString) - update = newWhere("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypeParam) - .and("CLASSIFICATIONSTORAGE.OBJECT_ROWID", objectRowIdParam) - .updateData(true, "CLASSIFICATIONSTORAGE", ["CLASSIFICATIONVALUE"], null, [newStorageString]);//don't set the OUTDATED flag to false since even our new value could be outdated! - - if(update == 0)//update wasnt succesfull -> the storage dataset doesnt exist yet -> insert - { - db.insertData("CLASSIFICATIONSTORAGE", ["CLASSIFICATIONSTORAGEID", "CLASSIFICATIONVALUE", "OBJECT_ROWID", "OBJECT_TYPE", "OUTDATED"], null, - [util.getNewUUID(), newStorageString, objectRowIdParam, objectTypeParam, 0]) - } - } -} - -result.object(resultSet); - -/** - * Checks whether or not the classification is relevant for the current dataset - */ -function _isRelevant() +var contentParam = vars.get("$param.ClassificationContent_param"); +if(contentParam) { - var cond = ((classificationTypeFilter == "" || classificationTypeFilter == undefined || classificationTypeFilter == null) - && checkedFilterObj[classificationTypeFilter] == undefined) - || (checkedFilterObj[classificationTypeFilter] != undefined && checkedFilterObj[classificationTypeFilter] != false); - if(!cond)// return true if we don't have an filter set or already checked the filter and it's true - { - if(checkedFilterObj[classificationTypeFilter] != false) - { - var selectRelevance, loadConfig, row, filterFields, filterableRow, value, filteredRecs; - var res = false; - var entityField = true; - - parsedFilter = JSON.parse(classificationTypeFilter).filter; - - if(parsedFilter["childs"]["0"] != undefined) // ignore empty filters - { - //no "." in the name means its a field of the entity itself: use entities.getRow and JditoFilterUtils.filterRecords - //to check whether or not the Filter excludes this row - //else: currently a count is made whith the filtercondition as the where clause --> poor performance - if(parsedFilter["childs"]["0"]["name"].includes(".")) - { - entityField = false - parsedFilter = JSON.stringify(parsedFilter); - } - - if(objectTypeParam == "Organisation") - { - if(entityField == true) - { - filterFields = ["CUSTOMERCODE", "INFO", "LANGUAGE", "NAME", "STANDARD_CITY", "STANDARD_EMAIL_COMMUNICATION", "STANDARD_PHONE_COMMUNICATION", "STATUS", "TYPE"]; - } - else - { - selectRelevance = newSelect("count(*)") - .from("ORGANISATION") - .join("CONTACT", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null") - .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") - .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID") - .where(db.toFilterCondition(parsedFilter, "Organisation_entity")) - .and("ORGANISATION.ORGANISATIONID", OrgUtils.getPrivateOrganisationId(), SqlBuilder.NOT_EQUAL()) - .and("CONTACT.CONTACTID", objectRowIdParam) - } - } - else if(objectTypeParam == "Salesproject") - { - if(entityField == true) - { - filterFields = ["CONTACT_ID", "ENDDATE", "INFO", "PHASE", "PROBABILITY", "PROJECTCODE", "PROJECTTITLE", "REASONS", "STARTDATE", "STATUS", "VOLUME"]; - } - else - { - selectRelevance = newSelect("count(*)") - .from("Salesproject") - .leftJoin("CONTACT", "SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID") - .leftJoin("ORGANISATION", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID") - .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = SALESPROJECT.SAALESPROJECTID") - .where(db.toFilterCondition(parsedFilter, "Salesproject_entity")) - .and("SALESPROJECT.SALESPROJECTID", objectRowIdParam) - } - } - else - { - throw new Error("Classification_entity.jdito.contentProcess: objectType doesn't exist or is not implemented correctly, contact an administrator."); - } - - //if its a field of the entity itself: use entities.getRow and JditoFilterUtils.filterRecords to check whether or not the Filter excludes this row - if(entityField == true) - { - if(filterableRow == undefined)//filterableRow has only have to be done once per objectType -> cache for better performance - { - loadConfig = entities.createConfigForLoadingRows() - .entity(ContextUtils.getEntity(objectTypeParam)) - .uid(objectRowIdParam) - .fields(filterFields) - - row = entities.getRow(loadConfig) - - filterableRow = filterFields.map(function (field){ - value = null; - if (field in row) - value = row[field]; - return value; - }); - } - //filter gets used after using entities.getRow and not in the loadconfig, since we can have multiple filters - //and don't want to do entities.getRow for every single one - filteredRecs = JditoFilterUtils.filterRecords(filterFields, [filterableRow], parsedFilter); - if(filteredRecs.length > 0) - res = true; - } - //else: currently a count is made whith the filtercondition as the where clause --> poor performance - else - { - selectRelevance = selectRelevance.cell(); - - if(selectRelevance > 0) - res = true; - } - } - if(res == true) - { - checkedFilterObj[classificationTypeFilter] = true; - } - else - { - checkedFilterObj[classificationTypeFilter] = false; - res = false; - } - } - } - else - res = true; - - return res; -} - -/** - * Builds the Array using stored classification datasets; - * returns true after pushing into resultSet and false if there are no persistent datasets for the current object - */ -function _buildTreeFromPersistetData() -{ - var treeBuilt = false; - var maxPercents = newSelect("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID, max(CLASSIFICATIONSCORE.SCOREPERCENT)/100") - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypeParam) - .groupBy("CLASSIFICATIONTYPE_ID") - .table(); - - - //this is the main select for the data - select = newSelect("CLASSIFICATION.CLASSIFICATIONTYPE_ID, CLASSIFICATION.CLASSIFICATIONID, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, \n\ - CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATION.SCOREPOINTS, CLASSIFICATION.VALUE, \n\ - CLASSIFICATIONSCORE.TITLE, CLASSIFICATIONTYPE.SCOREPOINTS") - .from("CLASSIFICATIONTYPE") - .leftJoin("CLASSIFICATION", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .leftJoin("CLASSIFICATIONGROUP", "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID = CLASSIFICATION.VALUE") - .where("CLASSIFICATION.OBJECT_TYPE", objectTypeParam) - .and("CLASSIFICATION.OBJECT_ROWID", objectRowIdParam) - .orderBy("CLASSIFICATIONGROUP.SORTING, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - - - - /* After loading the data from the database some preparation for the record container is done like translating display values into the - * correct locale or calculating some values - */ - //declaration needs to be separated because if declaration is done in the deconstructioning the IDE (designer) autocomplete does not work anymore - var typeId, classificationId, groupId, classificationGroupTitle, classificationTypeScoreType - , classificationScorePoints, classificationValue, valueDisplayValue, uid, classificationTypeScorePoints, maxValue; - select.table().forEach(function (pRow){ - //deconstructioning for easy access when the selected data changes - [typeId, classificationId, groupId, classificationGroupTitle, classificationTypeScoreType, - classificationScorePoints, classificationValue, valueDisplayValue, classificationTypeScorePoints] = pRow; - - uid = _UidEncoder.encode(typeId, objectRowIdParam, objectTypeParam); - - if(translatedClassificationTypesObj[typeId] == undefined) - { - translatedClassificationTypesObj[typeId] = translate.text(classificationTypeScoreType) - } - classificationTypeScoreType = translatedClassificationTypesObj[typeId]; - - if (valueDisplayValue) - valueDisplayValue = translate.text(valueDisplayValue); - if (classificationGroupTitle) - classificationGroupTitle = translate.text(classificationGroupTitle); - - for (i = 0; i < maxPercents.length; i++) { - if(typeId == maxPercents[i][0]) - { - maxValue = classificationTypeScorePoints*maxPercents[i][1]; - break; - } - } - if(bestPossibleValuesObj[groupId] == undefined) - bestPossibleValuesObj[groupId] = 0; - bestPossibleValuesObj[groupId] = eMath.addDec(bestPossibleValuesObj[groupId], maxValue) - - if(achievedGroupScoresObj[groupId] == undefined) - { - achievedGroupScoresObj[groupId] = 0 - classificationGroups.push(groupId) - } - if(classificationScorePoints != undefined || classificationScorePoints != "") - achievedGroupScoresObj[groupId] = eMath.addDec(Number(achievedGroupScoresObj[groupId]), Number(classificationScorePoints)); - - treeBuilt = true; - resultSet.push([uid, typeId, classificationId, groupId, classificationGroupTitle, classificationTypeScoreType, - classificationScorePoints, classificationValue, valueDisplayValue, maxValue]); - }); - return treeBuilt; -} - -/** - * selects maxScoresArray and builds maxScoresObj (maxScoresObj[classificationTypeId] = maxScorePercent) - */ -function _buildMaxScore() -{ - var maxScoresArray = newSelect("max(CLASSIFICATIONSCORE.SCOREPERCENT)/100, CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .from("CLASSIFICATIONSCORE") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypeParam) - .groupBy("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID") - .table(); - - for (i = 0; i < maxScoresArray.length; i++) - { - maxScoresObj[maxScoresArray[i][1]] = maxScoresArray[i][0]; //build maxScoresObj using maxScoresArray (easier acces later) - } + result.object(JSON.parse(contentParam)); } \ No newline at end of file diff --git a/entity/Classification_entity/recordcontainers/jdito/onUpdate.js b/entity/Classification_entity/recordcontainers/jdito/onUpdate.js deleted file mode 100644 index cae77afa19642fa2f242928af66a796cb1141be7..0000000000000000000000000000000000000000 --- a/entity/Classification_entity/recordcontainers/jdito/onUpdate.js +++ /dev/null @@ -1,11 +0,0 @@ -import("Sql_lib"); -import("system.vars"); - -var changed = vars.get("$local.changed"); -if(changed) -{ - newWhere("CLASSIFICATION.CLASSIFICATIONID", "$field.CLASSIFICATIONID") - .updateFields({"VALUE" : vars.get("$field.VALUE") - ,"SCOREPOINTS" : vars.get("$field.Info.displayValue").slice(0, vars.get("$field.Info.displayValue").indexOf("/")) - }); -} \ No newline at end of file diff --git a/entity/Forecast_entity/Forecast_entity.aod b/entity/Forecast_entity/Forecast_entity.aod index 126a8bbcf9eef434e5fb2991405d498bb985f3cd..c5ca5ac38a15ff8769588eaae98adf074dc28e9e 100644 --- a/entity/Forecast_entity/Forecast_entity.aod +++ b/entity/Forecast_entity/Forecast_entity.aod @@ -127,6 +127,9 @@ <dbRecordContainer> <name>db</name> <conditionProcess>%aditoprj%/entity/Forecast_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <onDBInsert>%aditoprj%/entity/Forecast_entity/recordcontainers/db/onDBInsert.js</onDBInsert> + <onDBUpdate>%aditoprj%/entity/Forecast_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate> + <onDBDelete>%aditoprj%/entity/Forecast_entity/recordcontainers/db/onDBDelete.js</onDBDelete> <alias>Data_alias</alias> <recordFieldMappings> <dbRecordFieldMapping> diff --git a/entity/Forecast_entity/recordcontainers/db/onDBDelete.js b/entity/Forecast_entity/recordcontainers/db/onDBDelete.js new file mode 100644 index 0000000000000000000000000000000000000000..6ff91a5eb319120b527776868367d3cdb0f445f1 --- /dev/null +++ b/entity/Forecast_entity/recordcontainers/db/onDBDelete.js @@ -0,0 +1,3 @@ +import("Workflow_lib"); + +WorkflowSignalSender.deleted(); \ No newline at end of file diff --git a/entity/Forecast_entity/recordcontainers/db/onDBInsert.js b/entity/Forecast_entity/recordcontainers/db/onDBInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..54f0349c9f1ddaab6b25f85f758d52928df41847 --- /dev/null +++ b/entity/Forecast_entity/recordcontainers/db/onDBInsert.js @@ -0,0 +1,3 @@ +import("Workflow_lib"); + +WorkflowSignalSender.inserted(); \ No newline at end of file diff --git a/entity/Forecast_entity/recordcontainers/db/onDBUpdate.js b/entity/Forecast_entity/recordcontainers/db/onDBUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..2e53f3cad9a9edf21cc5bbc6fdecc00c5001dfee --- /dev/null +++ b/entity/Forecast_entity/recordcontainers/db/onDBUpdate.js @@ -0,0 +1,3 @@ +import("Workflow_lib"); + +WorkflowSignalSender.updated(); \ No newline at end of file diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod index 2d89d5020cdca26890707031121ff2f4f4e8976d..1d08483c9cc2c2bc110a4fb4eb94941e39d1bb81 100644 --- a/entity/Organisation_entity/Organisation_entity.aod +++ b/entity/Organisation_entity/Organisation_entity.aod @@ -1363,6 +1363,12 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openClassificationOverView</name> + <title>Show Classification</title> + <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/openclassificationoverview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:LIST_OL</iconId> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> @@ -1608,15 +1614,6 @@ <groupQueryProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/attribute_filter/groupQueryProcess.js</groupQueryProcess> <filtertype>BASIC</filtertype> </filterExtensionSet> - <filterExtensionSet> - <name>ClassificationType_filter</name> - <filterFieldsProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js</filterFieldsProcess> - <filterValuesProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js</filterValuesProcess> - <filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js</filterConditionProcess> - <isGroupable v="true" /> - <groupQueryProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js</groupQueryProcess> - <filtertype>BASIC</filtertype> - </filterExtensionSet> <filterExtensionSet> <name>ClassificationGroup_filter</name> <filterFieldsProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationgroup_filter/filterFieldsProcess.js</filterFieldsProcess> diff --git a/entity/Organisation_entity/entityfields/openclassificationoverview/onActionProcess.js b/entity/Organisation_entity/entityfields/openclassificationoverview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..20382b740f4628039b481ff7bd875e0a205cab33 --- /dev/null +++ b/entity/Organisation_entity/entityfields/openclassificationoverview/onActionProcess.js @@ -0,0 +1,7 @@ +import("system.neon"); +import("ClassificationUpdate_lib"); +import("system.vars"); + +var classificationData = ClassificationUtils.executeUpdating(false, vars.get("$field.CONTACTID"), "Organisation"); + +neon.openContext("Classification", "ClassificationTree_view", null, neon.OPERATINGSTATE_SEARCH, {"ClassificationContent_param": classificationData}, null); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js deleted file mode 100644 index 5875efb7699dfc5aaa3b567c912990895b03eded..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.result"); -import("ClassificationFilter_lib"); - -var sqlCond = ClassificationTypeFilterUtils.makeFilterConditionSql(); - -result.string(sqlCond); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js deleted file mode 100644 index eebe4d838230a9702e630d919349e7c5aceefb9f..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js +++ /dev/null @@ -1,8 +0,0 @@ -import("system.vars"); -import("system.result"); -import("ClassificationFilter_lib"); - -//this filterExtensionSet is for the Indicators (ClassificationTypes, e.g. Industry, Loyality, Number of employees...) -var fields = ClassificationTypeFilterUtils.getFilterFields(vars.get("$sys.currentcontextname")); - -result.string(fields); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js deleted file mode 100644 index 488499064a9bdd69b939b834b9a8c642bae09484..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.result"); -import("ClassificationFilter_lib"); - -var values = ClassificationTypeFilterUtils.makeFilterFields(); -result.object(values); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js deleted file mode 100644 index bffcdb6a1e0be8fb6cc55de23fc79701ba3d660d..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js +++ /dev/null @@ -1,28 +0,0 @@ -import("system.translate"); -import("Sql_lib"); -import("system.result"); -import("system.vars"); -import("system.logging"); - -var isCount = vars.get("$local.count"); // TRUE if the count of the records is needed -var columns = vars.get("$local.columnlist"); // The column, expected from the querry, see also AttributeFilter_lib -var condition = vars.get("$local.condition"); // The Condition that's beeing used, includes the grouphirachy -var groupedColumns = vars.get("$local.groupedlist") // The coloumns, used for grouping -var order = vars.get("$local.order"); // The order of the result -var classificationId = vars.get("$local.name"); -classificationId = classificationId.slice(classificationId.lastIndexOf(".") + 1, classificationId.length); - -var sql = newSelect(isCount ? "1" : columns) - .from("ORGANISATION") - .join("CONTACT", "ORGANISATIONID = ORGANISATION_ID and PERSON_ID is null") - .leftJoin("CLASSIFICATION", newWhere("CLASSIFICATION.OBJECT_ROWID = CONTACT.CONTACTID") - .and("CLASSIFICATION.OBJECT_TYPE", "Organisation") - .and("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationId)) - .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCOREID = CLASSIFICATION.VALUE") - .whereIfSet(condition.trim()) - .groupBy(groupedColumns); - -if (order != null && !isCount) - sql.orderBy(order); - -result.string(sql.toString()); \ No newline at end of file diff --git a/entity/Salesproject_entity/Salesproject_entity.aod b/entity/Salesproject_entity/Salesproject_entity.aod index 3b30e194f217324c212e273c3be15a19938c84a2..db4b360e280910583249fd834d818f7050b36eb5 100644 --- a/entity/Salesproject_entity/Salesproject_entity.aod +++ b/entity/Salesproject_entity/Salesproject_entity.aod @@ -849,6 +849,12 @@ </entityParameter> </children> </entityConsumer> + <entityActionField> + <name>openClassificationOverView</name> + <title>Show Classification</title> + <onActionProcess>%aditoprj%/entity/Salesproject_entity/entityfields/openclassificationoverview/onActionProcess.js</onActionProcess> + <iconId>VAADIN:LIST_OL</iconId> + </entityActionField> </entityFields> <recordContainers> <dbRecordContainer> @@ -1050,15 +1056,6 @@ <groupQueryProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationgroup_filter/groupQueryProcess.js</groupQueryProcess> <filtertype>BASIC</filtertype> </filterExtensionSet> - <filterExtensionSet> - <name>ClassificationType_filter</name> - <filterFieldsProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js</filterFieldsProcess> - <filterValuesProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js</filterValuesProcess> - <filterConditionProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js</filterConditionProcess> - <isGroupable v="true" /> - <groupQueryProcess>%aditoprj%/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js</groupQueryProcess> - <filtertype>BASIC</filtertype> - </filterExtensionSet> <filterExtension> <name>Phase_filterExtention</name> <title>Phase</title> diff --git a/entity/Salesproject_entity/entityfields/openclassificationoverview/onActionProcess.js b/entity/Salesproject_entity/entityfields/openclassificationoverview/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..409ae146ee56ad2bd7f74d1450e90f1dea097905 --- /dev/null +++ b/entity/Salesproject_entity/entityfields/openclassificationoverview/onActionProcess.js @@ -0,0 +1,7 @@ +import("system.neon"); +import("ClassificationUpdate_lib"); +import("system.vars"); + +var classificationData = ClassificationUtils.executeUpdating(false, vars.get("$field.SALESPROJECTID"), "Salesproject"); + +neon.openContext("Classification", "ClassificationTree_view", null, neon.OPERATINGSTATE_SEARCH, {"ClassificationContent_param": classificationData}, null); \ No newline at end of file diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js deleted file mode 100644 index 5875efb7699dfc5aaa3b567c912990895b03eded..0000000000000000000000000000000000000000 --- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterConditionProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.result"); -import("ClassificationFilter_lib"); - -var sqlCond = ClassificationTypeFilterUtils.makeFilterConditionSql(); - -result.string(sqlCond); \ No newline at end of file diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js deleted file mode 100644 index b2cf16be606711221d28048b4af26922e946c004..0000000000000000000000000000000000000000 --- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterFieldsProcess.js +++ /dev/null @@ -1,7 +0,0 @@ -import("system.vars"); -import("system.result"); -import("ClassificationFilter_lib"); - -var fields = ClassificationTypeFilterUtils.getFilterFields(vars.get("$sys.currentcontextname")); - -result.string(fields); \ No newline at end of file diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js deleted file mode 100644 index 541cc6c67ce6e4dc53ccc16714b3b7746eb0f097..0000000000000000000000000000000000000000 --- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/filterValuesProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.result"); -import("ClassificationFilter_lib"); - -var values = ClassificationTypeFilterUtils.makeFilterFields(); -result.object(values); diff --git a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js b/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js deleted file mode 100644 index 2120bd1a538559a9c50f8af3831405f0471cfb70..0000000000000000000000000000000000000000 --- a/entity/Salesproject_entity/recordcontainers/db/filterextensions/classificationtype_filter/groupQueryProcess.js +++ /dev/null @@ -1,26 +0,0 @@ -import("system.translate"); -import("Sql_lib"); -import("system.result"); -import("system.vars"); - -var isCount = vars.get("$local.count"); // TRUE if the count of the records is needed -var columns = vars.get("$local.columnlist"); // The column, expected from the querry, see also AttributeFilter_lib -var condition = vars.get("$local.condition"); // The Condition that's beeing used, includes the grouphirachy -var groupedColumns = vars.get("$local.groupedlist") // The coloumns, used for grouping -var order = vars.get("$local.order"); // The order of the result -var classificationId = vars.get("$local.name"); -classificationId = classificationId.slice(classificationId.lastIndexOf(".") + 1, classificationId.length); - -var sql = newSelect(isCount ? "1" : columns) - .from("SALESPROJECT") - .leftJoin("CLASSIFICATION", newWhere("CLASSIFICATION.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID") - .and("CLASSIFICATION.OBJECT_TYPE", "Salesproject") - .and("CLASSIFICATION.CLASSIFICATIONTYPE_ID", classificationId)) - .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID = CLASSIFICATION.VALUE") - .whereIfSet(condition.trim()) - .groupBy(groupedColumns); - -if (order != null && !isCount) - sql.orderBy(order); - -result.string(sql.toString()); \ No newline at end of file diff --git a/entity/Turnover_entity/Turnover_entity.aod b/entity/Turnover_entity/Turnover_entity.aod index 2cd511e1128dee22ee5fd0a3ce3f2bd903876012..b36977240a29d7e42a8237b7572b433ae6e46f88 100644 --- a/entity/Turnover_entity/Turnover_entity.aod +++ b/entity/Turnover_entity/Turnover_entity.aod @@ -310,13 +310,6 @@ <isGroupable v="false" /> <filtertype>EXTENDED</filtertype> </filterExtensionSet> - <filterExtensionSet> - <name>ClassificationType_filter</name> - <filterFieldsProcess>%aditoprj%/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterFieldsProcess.js</filterFieldsProcess> - <filterValuesProcess>%aditoprj%/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterValuesProcess.js</filterValuesProcess> - <isGroupable v="false" /> - <filtertype>EXTENDED</filtertype> - </filterExtensionSet> <filterExtension> <name>OrgCountry_filter</name> <title>Organisation Country</title> diff --git a/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterFieldsProcess.js b/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterFieldsProcess.js deleted file mode 100644 index 973583180e1c02048afa5b4ca6641e8c13ac2bf9..0000000000000000000000000000000000000000 --- a/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterFieldsProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.vars"); -import("system.result"); -import("ClassificationFilter_lib"); - -var fields = ClassificationTypeFilterUtils.getFilterFields("Organisation"); -result.string(fields); \ No newline at end of file diff --git a/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterValuesProcess.js b/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterValuesProcess.js deleted file mode 100644 index 488499064a9bdd69b939b834b9a8c642bae09484..0000000000000000000000000000000000000000 --- a/entity/Turnover_entity/recordcontainers/jditodynamicmultidatachart/filterextensions/classificationtype_filter/filterValuesProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.result"); -import("ClassificationFilter_lib"); - -var values = ClassificationTypeFilterUtils.makeFilterFields(); -result.object(values); \ No newline at end of file diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index e0f78e2de4e035895f198cfed81fae2c3b8427f6..f7ab04b50452ee9cffd3b4c941aaa295a051655d 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -8812,6 +8812,57 @@ <entry> <key>Open Mosaico</key> </entry> + <entry> + <key>Show Classification</key> + </entry> + <entry> + <key>District: Number</key> + </entry> + <entry> + <key>Industry of Organisation</key> + </entry> + <entry> + <key>District: Name</key> + </entry> + <entry> + <key>within the last six Months</key> + </entry> + <entry> + <key>within the next year</key> + </entry> + <entry> + <key>within the last Month</key> + </entry> + <entry> + <key>within the next Month</key> + </entry> + <entry> + <key>within the last year</key> + </entry> + <entry> + <key>within the next six Months</key> + </entry> + <entry> + <key>from Percent</key> + </entry> + <entry> + <key>Total of Forecasts</key> + </entry> + <entry> + <key>Communication Setting: %0</key> + </entry> + <entry> + <key>Campaign participation</key> + </entry> + <entry> + <key>Remove recipients with communication rejection</key> + </entry> + <entry> + <key>Chosen record is already in the campaign</key> + </entry> + <entry> + <key>Received Bulk Mail</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> <sqlModels> diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod index 3f4b2bc518ce771dcbb826af927bde1adbacc17a..1e9b406ae762034250df880b58d885e685c72a13 100644 --- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod +++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod @@ -10654,6 +10654,7 @@ Bitte Datumseingabe prüfen</value> </entry> <entry> <key>Employee count</key> + <value>Mitarbeiteranzahl</value> </entry> <entry> <key>Toggles the status of selected discussion between open and closed</key> @@ -10855,6 +10856,7 @@ Bitte Datumseingabe prüfen</value> </entry> <entry> <key>Percent</key> + <value>Prozent</value> </entry> <entry> <key>Prev</key> @@ -11571,6 +11573,70 @@ Bitte Datumseingabe prüfen</value> <entry> <key>Advertising count</key> </entry> + <entry> + <key>Show Classification</key> + <value>Klassifizierung anzeigen</value> + </entry> + <entry> + <key>Industry of Organisation</key> + <value>Branche der Firma</value> + </entry> + <entry> + <key>within the last year</key> + <value>Innerh. des letzten Jahres</value> + </entry> + <entry> + <key>within the last six Months</key> + <value>Innerh. der letzten sechs Monate</value> + </entry> + <entry> + <key>within the last Month</key> + <value>Innerh. des letzten Monats</value> + </entry> + <entry> + <key>within the next Month</key> + <value>Innerh. des nächsten Monats</value> + </entry> + <entry> + <key>within the next six Months</key> + <value>Innerh. der nächsten sechs Monate</value> + </entry> + <entry> + <key>within the next year</key> + <value>Innerh. des nächsten Jahres</value> + </entry> + <entry> + <key>only use simple filters</key> + <value>nur einfache Filter benutzen</value> + </entry> + <entry> + <key>only filter using the specified indicatorfield</key> + <value>nur mit dem festgelegten Kenngrößenfeld filtern</value> + </entry> + <entry> + <key>please only filter using 'equal'</key> + <value>bitte nur mit 'ist gleich' filtern</value> + </entry> + <entry> + <key>Total of Forecasts</key> + <value>Summe der Forecasts</value> + </entry> + <entry> + <key>District: Number</key> + </entry> + <entry> + <key>from Percent</key> + </entry> + <entry> + <key>District: Name</key> + </entry> + <entry> + <key>Remove recipients with advertising ban</key> + </entry> + <entry> + <key>wrong configuration for '%0'</key> + <value>falsche Konfiguration für '%0'</value> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod index c5438335a2259c6669124dbfdfd3cae485a95be3..2086f746b7f33247ad85ef57d1a95ea21badc81a 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -8897,6 +8897,57 @@ <entry> <key>Open Mosaico</key> </entry> + <entry> + <key>Show Classification</key> + </entry> + <entry> + <key>District: Number</key> + </entry> + <entry> + <key>Industry of Organisation</key> + </entry> + <entry> + <key>District: Name</key> + </entry> + <entry> + <key>within the last six Months</key> + </entry> + <entry> + <key>within the next year</key> + </entry> + <entry> + <key>within the last Month</key> + </entry> + <entry> + <key>within the next Month</key> + </entry> + <entry> + <key>within the last year</key> + </entry> + <entry> + <key>within the next six Months</key> + </entry> + <entry> + <key>from Percent</key> + </entry> + <entry> + <key>Total of Forecasts</key> + </entry> + <entry> + <key>Communication Setting: %0</key> + </entry> + <entry> + <key>Campaign participation</key> + </entry> + <entry> + <key>Remove recipients with communication rejection</key> + </entry> + <entry> + <key>Chosen record is already in the campaign</key> + </entry> + <entry> + <key>Received Bulk Mail</key> + </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> </language> diff --git a/neonContext/Classification/Classification.aod b/neonContext/Classification/Classification.aod index 07bc14712048df8b6962b9852069175b5954d472..30512179e47677f2a733d6c63920e9b5f64baec8 100644 --- a/neonContext/Classification/Classification.aod +++ b/neonContext/Classification/Classification.aod @@ -4,7 +4,6 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <documentation>%aditoprj%/neonContext/Classification/documentation.adoc</documentation> <filterView>ClassificationTree_view</filterView> - <previewView>ClassificationPreview_view</previewView> <entity>Classification_entity</entity> <references> <neonViewReference> @@ -13,7 +12,6 @@ </neonViewReference> <neonViewReference> <name>50c0d5c5-c84f-452d-9f77-41b82ac0319f</name> - <view>ClassificationPreview_view</view> </neonViewReference> </references> </neonContext> diff --git a/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod b/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod index 84950dabeabac46c65057266f1e87f9c5139a901..9a437afea6c159960b042acf5d95f5d049b1928c 100644 --- a/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod +++ b/neonView/ClassificationAdminEdit_view/ClassificationAdminEdit_view.aod @@ -39,8 +39,12 @@ <entityField>CLASSIFICATIONTYPEID</entityField> </entityFieldLink> <entityFieldLink> - <name>91f2555e-214c-44f0-8798-029b94be9c00</name> - <entityField>CLASSIFICATIONTYPEIDDISPLAYVALUE</entityField> + <name>b7dbdcec-d9bd-4b5c-8163-66761108e6b3</name> + <entityField>FIELD</entityField> + </entityFieldLink> + <entityFieldLink> + <name>a28ab6ff-0ccf-487a-8482-2c2da67c2adc</name> + <entityField>FIELDTYPE</entityField> </entityFieldLink> <entityFieldLink> <name>274fd441-b0c3-48c2-8b4e-d4cace69946c</name> @@ -50,6 +54,10 @@ <name>1d35951d-1661-4a5d-93bc-323f11f35667</name> <entityField>classificationTypeFilter</entityField> </entityFieldLink> + <entityFieldLink> + <name>e352d6cc-ccc6-4431-9958-5b67db9ef88b</name> + <entityField>INDICATORTYPE</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod b/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod index 14e2c433280ce0e447e3d8a838828b9d41be7b2b..e454baf2c5cfef94342236c0962cf419348277ca 100644 --- a/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod +++ b/neonView/ClassificationAdminFilter_view/ClassificationAdminFilter_view.aod @@ -21,6 +21,10 @@ <name>2e04e92e-9af8-46a6-9845-8bf822cd05f3</name> <entityField>#CONTENTTITLE</entityField> </neonTreeTableColumn> + <neonTreeTableColumn> + <name>96bdf771-6457-447d-847b-0365b105ed8c</name> + <entityField>FIELD</entityField> + </neonTreeTableColumn> <neonTreeTableColumn> <name>0d27f1ef-91e3-44fd-9514-e666ac10748e</name> <entityField>SCOREPOINTS</entityField> diff --git a/neonView/ClassificationPreview_view/ClassificationPreview_view.aod b/neonView/ClassificationPreview_view/ClassificationPreview_view.aod deleted file mode 100644 index f97be47068ba298e6853e008a2b91615f34701f2..0000000000000000000000000000000000000000 --- a/neonView/ClassificationPreview_view/ClassificationPreview_view.aod +++ /dev/null @@ -1,47 +0,0 @@ -<?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.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> - <name>ClassificationPreview_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <isOverlay v="false" /> - <overlayOrientation>PORTRAIT</overlayOrientation> - <layout> - <boxLayout> - <name>layout</name> - <autoHeight v="true" /> - </boxLayout> - </layout> - <children> - <genericViewTemplate> - <name>classification</name> - <showDrawer v="true" /> - <fixedDrawer v="true" /> - <hideLabels v="false" /> - <hideEmptyFields v="false" /> - <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>7e79491f-5891-4fd7-b6e1-1045865f36f6</name> - <entityField>CLASSIFICATIONTYPEID</entityField> - </entityFieldLink> - <entityFieldLink> - <name>dfdbc6f4-4859-495b-96e7-0853bdbc611f</name> - <entityField>VALUE</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> - <genericViewTemplate> - <name>info</name> - <showDrawer v="true" /> - <fixedDrawer v="true" /> - <entityField>#ENTITY</entityField> - <isEditable v="false" /> - <title></title> - <fields> - <entityFieldLink> - <name>2d1fae5e-1b2b-4e29-9bcb-646db9fd9653</name> - <entityField>Info</entityField> - </entityFieldLink> - </fields> - </genericViewTemplate> - </children> -</neonView> diff --git a/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod b/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod index ca2ae66ae11f424e21abb8c839b9122ef792978e..f0cb233d7aec7cbfe515560375b974039f3af1ac 100644 --- a/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod +++ b/neonView/ClassificationScoreMultipleEdit_view/ClassificationScoreMultipleEdit_view.aod @@ -10,10 +10,30 @@ <children> <titledListViewTemplate> <name>scores</name> - <titleField>TITLE</titleField> + <titleField>displayValueForTitleField</titleField> + <titleFieldFullWidth v="true" /> <autoNewRow v="true" /> <entityField>#ENTITY</entityField> <columns> + <neonTitledListTableColumn> + <name>82492094-bb4d-4f6f-81f2-79c2c9aba665</name> + <entityField>FIELDVALUE</entityField> + </neonTitledListTableColumn> + <neonTitledListTableColumn> + <name>7d3e0eac-8725-4eda-bdca-4db6030eb2d1</name> + <entityField>INDICATORTEXT</entityField> + <fullWidth v="true" /> + </neonTitledListTableColumn> + <neonTitledListTableColumn> + <name>66dc3147-2ea0-4e60-b987-54e878714698</name> + <entityField>INDICATORINTEGER</entityField> + <fullWidth v="true" /> + </neonTitledListTableColumn> + <neonTitledListTableColumn> + <name>7c66e805-cdbf-44c0-ae8d-d4bd2a017b14</name> + <entityField>INDICATORNUMBER</entityField> + <fullWidth v="true" /> + </neonTitledListTableColumn> <neonTitledListTableColumn> <name>8c04eb99-5721-49ff-8db1-90461e11e55e</name> <entityField>SCOREPERCENT</entityField> diff --git a/neonView/ClassificationTree_view/ClassificationTree_view.aod b/neonView/ClassificationTree_view/ClassificationTree_view.aod index 6607bad05945f397d4c55ebef9a1d8c545ea0680..d625b2e6f38c1e8366d8ff4d2915454077991571 100644 --- a/neonView/ClassificationTree_view/ClassificationTree_view.aod +++ b/neonView/ClassificationTree_view/ClassificationTree_view.aod @@ -2,6 +2,7 @@ <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> <name>ClassificationTree_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> + <isOverlay v="true" /> <layout> <groupLayout> <name>layout</name> @@ -12,22 +13,27 @@ <name>ClassificationTreeTable</name> <showChildrenCount v="false" /> <entityField>#ENTITY</entityField> - <favoriteActionGroup1>fitlerviewActionGroup</favoriteActionGroup1> - <linkedColumns /> <defaultGroupFields> <element>CLASSIFICATIONGROUP</element> </defaultGroupFields> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> <columns> <neonTreeTableColumn> <name>5541a641-81c8-46d4-a5c9-e32a8edb8f80</name> + <entityField>UID</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>6ce4567b-d3fb-4be1-9557-46e0f24108d0</name> <entityField>CLASSIFICATIONTYPEID</entityField> </neonTreeTableColumn> <neonTreeTableColumn> - <name>9a62baa4-71cf-4b9d-8cd6-883b233a9b84</name> + <name>42b5b2fd-5325-4340-b374-d8b12c851717</name> <entityField>VALUE</entityField> </neonTreeTableColumn> <neonTreeTableColumn> - <name>6ce4567b-d3fb-4be1-9557-46e0f24108d0</name> + <name>5bd197c6-9690-4eb8-9db5-5052c45d5d2a</name> <entityField>SCOREPOINTS</entityField> </neonTreeTableColumn> </columns> diff --git a/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod b/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod index e2b699ea8ff8cbca49f7577670d556ba43e43959..6d8252d4e02589356d278e3b4966df13f230ea23 100644 --- a/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod +++ b/neonView/ClassificationTypePreview_View/ClassificationTypePreview_View.aod @@ -42,9 +42,5 @@ <entityField>ClassificationScores</entityField> <view>ClassificationScoreMultipleEdit_view</view> </neonViewReference> - <actionsViewTemplate> - <name>action</name> - <entityField>#ENTITY</entityField> - </actionsViewTemplate> </children> </neonView> diff --git a/neonView/OrganisationMain_view/OrganisationMain_view.aod b/neonView/OrganisationMain_view/OrganisationMain_view.aod index 9cef248c5a7580e31e8529b4fffd149957d8bd28..fcdacbfe67c053e54e513221e2785378d0071689 100644 --- a/neonView/OrganisationMain_view/OrganisationMain_view.aod +++ b/neonView/OrganisationMain_view/OrganisationMain_view.aod @@ -40,11 +40,6 @@ <entityField>ObjectTrees</entityField> <view>ObjectTreeFilter_view</view> </neonViewReference> - <neonViewReference> - <name>0b618d7e-61e0-42f3-ad0b-176afb9f6da4</name> - <entityField>Classifications</entityField> - <view>ClassificationTree_view</view> - </neonViewReference> <neonViewReference> <name>45c0f486-e7df-48ac-a201-661ac07f5fed</name> <entityField>#ENTITY</entityField> diff --git a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod index c13e9fc067ad27e402e95027e86e82583a244e9e..4adb5c12f6e4fc72125319152126eb54b3621f02 100644 --- a/neonView/SalesprojectMain_view/SalesprojectMain_view.aod +++ b/neonView/SalesprojectMain_view/SalesprojectMain_view.aod @@ -24,11 +24,6 @@ <element>DESKTOP</element> </devices> </neonViewReference> - <neonViewReference> - <name>d0c1344f-c143-43b4-9c44-f823fb525eff</name> - <entityField>Classifications</entityField> - <view>ClassificationTree_view</view> - </neonViewReference> <neonViewReference> <name>8a83afee-e02c-4714-9641-13b62c95cea1</name> <entityField>#ENTITY</entityField> diff --git a/process/ClassificationComplexIndicatorRegistry_basic/ClassificationComplexIndicatorRegistry_basic.aod b/process/ClassificationComplexIndicatorRegistry_basic/ClassificationComplexIndicatorRegistry_basic.aod new file mode 100644 index 0000000000000000000000000000000000000000..05d0390e092ba8c9eec82b6700dc1bf25d157468 --- /dev/null +++ b/process/ClassificationComplexIndicatorRegistry_basic/ClassificationComplexIndicatorRegistry_basic.aod @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2"> + <name>ClassificationComplexIndicatorRegistry_basic</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/ClassificationComplexIndicatorRegistry_basic/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/ClassificationComplexIndicatorRegistry_basic/process.js b/process/ClassificationComplexIndicatorRegistry_basic/process.js new file mode 100644 index 0000000000000000000000000000000000000000..67ab0b2771fdfcb292ebdeb57644b3c10d3538ae --- /dev/null +++ b/process/ClassificationComplexIndicatorRegistry_basic/process.js @@ -0,0 +1,314 @@ +import("AttributeRegistry_basic"); +import("Classification_lib"); +import("Contact_lib"); +import("Sql_lib"); +import("system.datetime"); +import("system.eMath"); +import("system.translate"); +import("system.vars"); + +/** + * Provides a central place where all complex classificationIndications are defined. + * <p> + * All defined entries has to return a object of type "ClassificationIndicatior". + * <p> + * This object has the following attributes: + * <p> + * <u><b><i>name</i></u></b>: The name e.g: "forecastSum" -> has to be unique, so we can clearly identificate them and get a specific indicator using it's name + * <p> + * <u><b><i>title</i></u></b>: The translated title e.g: translate.text("Total of Forecasts") -> used for displaying in the client + * <p> + * <u><b><i>getValueFn</i></u></b>: This attribute is a function, that expects the objectType and the objectId and returns the value for said object (used in classificationUpdate to get the value for said organisation for example) + * <p> + * <u><b><i>type</i></u></b>: Field type, see also $ClassificationFieldTypes (different handling depending on the field type) + * <p> + * <u><b><i>getPossibileValuesFn</i></u></b>: This attribute is a function, that returns the possible values and their displayValues in an twodimensional array (as needed in a dropDownProcess) + * of the indicator (but only for indicators of the dropdown type, and not for numbers, since those work differently) + * <p> + * <u><b><i>objectType</i></u></b>: The object Type + * <p> + * <u><b><i>getActualDateValueFn</i></u></b>: This attribute is a function, for the date indicators that expects a keyValue of a date and returns the actual date (e.g: "inOneYear" returns "1651622400000" + * <p> + * + * @class + * + * @example + * $ClassificationComplexIndicatorRegistry.forecastSum() + */ +function $ClassificationComplexIndicatorRegistry(){} + +/* + * Total of forecasts: get's the best forecasts of each product and sums them up + * <p>type: $ClassificationFieldTypes.NUMBER() + */ +$ClassificationComplexIndicatorRegistry.forecastSum = function(){ + return{ + name: "forecastSum", + title: translate.text("Total of Forecasts"), + getValueFn: function(pObjectType, pObjectId){ + var bestForecasts = newSelect("max(FORECAST.VOLUME)") + .from("FORECAST") + .where("FORECAST.OBJECT_TYPE", pObjectType) + .and("FORECAST.OBJECT_ROWID", pObjectId) + .groupBy("FORECAST.GROUPCODE") + .arrayColumn(); + var forecastSum = 0; + bestForecasts.forEach(function(forecast) + { + forecastSum += forecast; + }) + return forecastSum; + }, + type: $ClassificationFieldTypes.NUMBER(), + getDisplayValueFn: function(pValue) + { + return pValue; + }, + objectType: "Salesproject" + }; +}; + +/* + * Industry of the the Organisation the salesproject belongs to. + * <p>type: $ClassificationFieldTypes.DROPDOWN() + */ +$ClassificationComplexIndicatorRegistry.salesprojOrgIndustry = function(){ + return{ + name: "salesprojOrgIndustry", + title: translate.text("Industry of Organisation"), + getValueFn: function(pObjectType, pObjectId){ + return newSelect("AB_ATTRIBUTERELATION.ID_VALUE") + .from("AB_ATTRIBUTERELATION") + .where("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", $AttributeRegistry.industry()) + .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", ContactUtils.getOrganisationContactId(newSelect("SALESPROJECT.CONTACT_ID") + .from("SALESPROJECT") + .where("SALESPROJECT.SALESPROJECTID", pObjectId).cell())) + .arrayRow(); + }, + getPossibileValuesFn: function() + { + return valueArray = ClassificationComplexIndicatorRegistryUtils.getAttributesByParentId($AttributeRegistry.industry()); + }, + type: $ClassificationFieldTypes.DROPDOWN(), + getDisplayValueFn: function(pValue) + { + return translate.text(newSelect("AB_ATTRIBUTE.ATTRIBUTE_NAME") + .from("AB_ATTRIBUTE") + .where("AB_ATTRIBUTE.AB_ATTRIBUTEID", pValue) + .cell()); + }, + objectType: "Salesproject" + + }; +}; + +/* + * Startdate of the salesproject. + * <p>type: $ClassificationFieldTypes.DATE(), + */ +$ClassificationComplexIndicatorRegistry.salesprojectStart = function(){ + return{ + name: "salesprojectStart", + title: translate.text("Project start"), + getValueFn: function(pObjectType, pObjectId){ + return newSelect("SALESPROJECT.STARTDATE") + .from("SALESPROJECT") + .where("SALESPROJECT.SALESPROJECTID", pObjectId) + .cell(); + }, + getPossibileValuesFn: function() + { + return ClassificationComplexIndicatorRegistryUtils.defaultDateStartValueArray(); + }, + type: $ClassificationFieldTypes.DATE(), + getDisplayValueFn: function(pValue) + { + var displayValueObject = ClassificationComplexIndicatorRegistryUtils.defaultDateDisplayObject(ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject()); + var val = displayValueObject != undefined && displayValueObject[pValue] != undefined ? displayValueObject[pValue] : "-"; + return val; + }, + getActualDateValueFn: function(pValue) + { + var defaultDateValue = ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject(); + var val = defaultDateValue[pValue] != undefined + && defaultDateValue[pValue][0] != undefined + ? defaultDateValue[pValue][0] : "-"; + return val; + }, + objectType: "Salesproject" + + }; +}; + +function ClassificationComplexIndicatorRegistryUtils(){} + +/* + * Returns a array of all existing complex indicators <br> + * <p> + * Used in a dropDownProcess for example to provide a + * selection of all possible complex indicators. + * Returns a array of all existing complex indicators <br> + * <p> + * @param {String} pObjectType <p/> the object type you want the complex indicators for + * + * @return {Array[][]} [[key, displayValue]] Array <br/> + */ +ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray = function(pObjectType){ + var rawList = Object.keys($ClassificationComplexIndicatorRegistry); + var complexIndicatorArray = []; + + rawList.forEach(function(pEntry){ + if ($ClassificationComplexIndicatorRegistry[pEntry]()["objectType"] == pObjectType) + { + complexIndicatorArray.push([$ClassificationComplexIndicatorRegistry[pEntry]()["name"], $ClassificationComplexIndicatorRegistry[pEntry]()["title"]]); + } + }); + + return complexIndicatorArray; +}; + +/* + * Returns the value array the parsed complex indicator <br> + * <p> + * Used in a dropDownProcess for example to provide a + * selection of all possible complex indicators. + * + * @param {String} pName <p/> name attribute of the complexIndicator you want the value array for + * + * @return {Array[][]} [[key, displayValue]] Array <br/> + */ +ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorValueArray = function(pName) +{ + var rawList = Object.keys($ClassificationComplexIndicatorRegistry); + var complexIndicatorValueArray = [[],[]]; + + rawList.forEach(function(pEntry){ + if ($ClassificationComplexIndicatorRegistry[pEntry]()["name"] == pName) + { + complexIndicatorValueArray = $ClassificationComplexIndicatorRegistry[pEntry]().getPossibileValuesFn(); + } + }); + + return complexIndicatorValueArray; +}; + +/* + * Complex Dates work using a dropDown with timespans so the user can't just specify any date as an value.<br> + * <p> + * This is an example of how this could look like (used for $ClassificationComplexIndicatorRegistry.salesprojectStart) + * <p> + * @return {Object{Array[][]}} Object with keys ("oneYearAgo") with their actual value ("1651622400000") and the displayValue (translate.text("within the last year")) in an two dimensional Array<br/> + */ +ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject = function() +{ + var today = vars.get("$sys.today"); + var lastMonth = eMath.subInt(today, datetime.ONE_WEEK * 4); + var sixMonthsAgo = eMath.subInt(today, datetime.ONE_WEEK * 4 * 6); + var oneYearAgo = eMath.subInt(today, datetime.ONE_WEEK * 4 * 12); + var nextMonth = eMath.addInt(today, datetime.ONE_WEEK * 4); + var inSixMonths = eMath.addInt(today, datetime.ONE_WEEK * 4 * 6); + var inOneYear = eMath.addInt(today, datetime.ONE_WEEK * 4 * 12); + + var resObject = {}; + resObject["oneYearAgo"] = []; + resObject["oneYearAgo"].push(oneYearAgo, translate.text("within the last year")); + resObject["sixMonthsAgo"] = []; + resObject["sixMonthsAgo"].push(sixMonthsAgo, translate.text("within the last six Months")); + resObject["lastMonth"] = []; + resObject["lastMonth"].push(lastMonth, translate.text("within the last Month")); + resObject["nextMonth"] = []; + resObject["nextMonth"].push(nextMonth, translate.text("within the next Month")); + resObject["inSixMonths"] = []; + resObject["inSixMonths"].push(inSixMonths, translate.text("within the next six Months")); + resObject["inOneYear"] = []; + resObject["inOneYear"].push(inOneYear, translate.text("within the next year")); + + return resObject; +}; + +/* + * Returns the possible values and their displayValues in an Object. + * <p> + * Watchout, because the key is using the actual Value ("1651622400000") and not the placeholder ("oneYearAgo"). + * (So the keys are changing everyday!) + * <br> + * <p> + * For more information see also ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject + * <p> + * + * @param {Array} pValueObject <p/> object with key ("oneYearAgo") and two dimensional array with actual value("1651622400000") + * and displayvalue(translate.text("within the last year")) e.g: ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject() + * + * @return {Array[][]} [[key, displayValue]] Array <br/> + */ +ClassificationComplexIndicatorRegistryUtils.defaultDateDisplayObject = function(pValueObject) +{ + var valueObject = pValueObject; + var displayValueObject = {}; + for(let key in valueObject) + { + displayValueObject[valueObject[key][0]] = valueObject[key][1]; + } + + return displayValueObject; +}; + +/* + * Returns the possible values and their displayValues in an twodimensional array. + * <p> + * Watchout, because the keyValue is the actual Value ("1651622400000") and not the placeholder ("oneYearAgo"). + * (So don't use it in an dropDownProcess, since the keys are changing everyday!) + * <br> + * <p> + * For more information see also ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject + * <p> + * @return {Array[][]} [[key, displayValue]] Array <br/> + */ +ClassificationComplexIndicatorRegistryUtils.defaultDateStartValueArray = function() +{ + var valueObject = ClassificationComplexIndicatorRegistryUtils.defaultDateValueObject(); + var resArray = []; + for(var key in valueObject) + { + resArray.push([key, valueObject[key][1]]); + } + return resArray; +}; + +/* + * Translates the parsed attribute Array. + * <br> + * + * @param {Array} pAttributeArray <p/> the attribute array + * + * @return {Array} pAttributeArray but with translated displayValues<br/> + */ +ClassificationComplexIndicatorRegistryUtils.translateAttributeArray = function(pAttributeArray) +{ + let attributeArray = pAttributeArray; + for (let i = 0; i < attributeArray.length; i++) + { + attributeArray[i][1] = translate.text(attributeArray[i][1]); + } + return attributeArray; +}; + +/* + * Get's all attributes of by their parent Id + * <br> + * + * @param {Array} pParentId <p/> the attribute parent id + * + * @return {Array} pAttributeArray but with translated displayValues<br/> + */ +ClassificationComplexIndicatorRegistryUtils.getAttributesByParentId = function(pParentId) +{ + let attributeArray = newSelect("AB_ATTRIBUTE.AB_ATTRIBUTEID, AB_ATTRIBUTE.ATTRIBUTE_NAME") + .from("AB_ATTRIBUTE") + .where("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", pParentId) + .and("AB_ATTRIBUTE.ATTRIBUTE_ACTIVE", 1) + .table(); + + attributeArray = ClassificationComplexIndicatorRegistryUtils.translateAttributeArray(attributeArray); + return attributeArray; +}; \ No newline at end of file diff --git a/process/ClassificationFilter_lib/process.js b/process/ClassificationFilter_lib/process.js index bf51b65574f70c95dfa2efeaa3bceb561751dbc5..b8f9200553dbaf817b3245ae3cd884102e43724e 100644 --- a/process/ClassificationFilter_lib/process.js +++ b/process/ClassificationFilter_lib/process.js @@ -1,158 +1,11 @@ import("Context_lib"); -import("Classification_lib"); import("Entity_lib"); import("Sql_lib"); import("system.entities"); -import("system.SQLTYPES"); -import("system.translate"); import("system.util"); import("system.vars"); import("Util_lib"); -/** - * Methods used for the classification type filter extension set - * Do not create an instance of this! - * - * @class - */ -function ClassificationTypeFilterUtils() {} - -/** - * fetches classificationtypes and transforms them into filter fields - * <br/> - * <br/> - * Important: - * <br/> - * Any changes to the name of the filterFields does also have to be changed in the filterTreeExcludeFieldsProcess of the filterField of the classificationAdmin_entity - * - * @param {String} pObjectType <p/> contextId of the context whoes classification types are used for providing the filter fields - * - * @return {String} <p/> field-definitions (array of objects) that are ready to use for a filterExtensionSet in a stringified form - * <br/> The object within the array contains the following properties: - * <ul> - * <li>name - classificationtypeid (UUID of the classificationtype)</li> - * <li>title - "classification: " + string of the classificationtype translated (for the end user)</li> - * <li>contentType - string of the neon-contentType (TEXT)</li> - * <li>hasDropDownValues - boolean if possible values have to be calculated or not (always true atm)</li> - * </ul> - * @static - */ -ClassificationTypeFilterUtils.getFilterFields = function(pObjectType) -{ - var res = []; - var scoreTypes = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONGROUP.TITLE") - .from("CLASSIFICATIONTYPE") - .join("CLASSIFICATIONGROUP", "CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID = CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", pObjectType) - .orderBy("CLASSIFICATIONTYPE.SCORETYPE asc") - .table(); - - var titleField = SqlUtils.translateStatementWithQuotes(ClassificationTypeFilterUtils.getTranslationSql()); - for (let i = 0; i < scoreTypes.length; i++) - { - res.push({ - name: scoreTypes[i][0], - title: translate.text(scoreTypes[i][2])+ ": " + translate.text(scoreTypes[i][1]), - contentType: "TEXT", - hasDropDownValues: true, - isGroupable: true, // These Fields are also able to be grouped - groupedRecordField: "CLASSIFICATION.VALUE", // The DB-field that is being grouped by (see also groupQueryProcess) - titleRecordField: titleField // The displayname (see also groupQueryProcess) - }); - } - - return JSON.stringify(res); -} - -/** - * fetches classificationscores that are filterable and transforms them into filter fields for the current context - * - * @see ClassificationTypeFilterUtils.getFilterFields for more details - * @static - */ -ClassificationTypeFilterUtils.makeFilterFields = function() -{ -var filter = JSON.parse(vars.getString("$local.filter")); - -var classificationTypeId = filter.name; - -var classificationValue = newSelect("CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID, CLASSIFICATIONSCORE.TITLE") - .from("CLASSIFICATIONSCORE") - .where("CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID", classificationTypeId) - .orderBy("CLASSIFICATIONSCORE.TITLE") - .table(); - - -for (let i = 0; i < classificationValue.length; i++) - classificationValue[i][1] = translate.text(classificationValue[i][1]) - -return classificationValue; -} - -/** - * Builds a Sql-condition for a classification filter extension set. This allows to filter for classificationtypes within a db-table - * - * @see ClassificationTypeFilterUtils.getFilterCondition for more details - * @static - */ -ClassificationTypeFilterUtils.makeFilterConditionSql = function() -{ - var filterCond = vars.get("$local.condition"); - var uidInfo = EntityUtils.parseUidColumn(vars.get("$sys.uidcolumn")); - var columnPlaceholder = vars.get("$local.columnPlaceholder"); - var res = ClassificationTypeFilterUtils.getFilterCondition(filterCond, uidInfo.table, uidInfo.column, columnPlaceholder); - - return res; -} - -/** - * Builds a Sql-condition that may be used in a filter extension set and allows to filter for classificationtypes within a db-table - * - * @param {String} pCondition <p/> a SQL-condition like it is given in the "$local.condition"-variable in filter extension sets - * @param {String} pIdTableName <p/> name of the db-table where the data shall be filtered - * @param {String} pIdColumnName <p/> name of the primarykey-column of the table that was given via pIdTablename - * @param {String} pColumnPlaceholder <p/> name of the placeholder where the columnname should be like it is given in the - * "$local.columnPlaceholder"-variable in filter extension sets - * - * @return {SqlBuilder} <p/> a SqlBuilder-condition that contains a sub-select and may be used for filtering data - * @static - */ -ClassificationTypeFilterUtils.getFilterCondition = function(pCondition, pIdTableName, pIdColumnName, pColumnPlaceholder) -{ - var resSql; - - var condition = StringUtils.replaceAll(pCondition, pColumnPlaceholder, "CLASSIFICATION.VALUE"); - - //a SqlBuilder.IN() in a newWhere is not used here since the subselect can contain a placeholder - //(the variable condition) that would break the function - resSql = pIdTableName + "." + pIdColumnName + " in (" + newSelect(pIdTableName + "." + pIdColumnName) - .from(pIdTableName) - .leftJoin("CLASSIFICATION", newWhere("CLASSIFICATION.OBJECT_ROWID = " + pIdTableName + "." + pIdColumnName)) - .where(condition) + ")"; - - return resSql; -}; - -/** -* gets all titletranslations of the classification scores -* -* -* @return {String} a SQL-expression (case-when-statement) that resolves the KEYID into the title -> as preparedSatement-elements -*/ -ClassificationTypeFilterUtils.getTranslationSql = function() -{ - - var config = entities.createConfigForLoadingRows().entity("ClassificationScore_entity") - .fields(["CLASSIFICATIONSCOREID", "translatedTitle"]); - - - var rows = entities.getRows(config); - var res = SqlUtils.getResolvingCaseWhenFromObject(rows, "CLASSIFICATIONSCOREID", "translatedTitle", "VALUE"); - return res; -} - - - /** * Procides static methods for en- or decoding classification group filter names * ClassifcationGroupFilter names are shared over several processes and contain therefore various information @@ -341,8 +194,10 @@ ClassificationGroupFilterUtils.getFilterCondition = function(pObjectType, pFilte //"or" needed since we want to filter both the ones that have no classification for said classificationgroup ("-") //and the ones that have null as the value (since not all datasets have a CLASSIFICATIONSTORAGE dataset) the same way // since both don't have an classification for that group - if(pOperatorName == "IS NULL") + if (pOperatorName == "IS NULL") + { condition += " OR " + decodedFilterName.representingSqlExpression +"='-'" ; + } return condition; }; @@ -436,11 +291,15 @@ ClassificationGroupFilterUtils.getDefaultGroupQuery = function(pIdTableName, pId { var condition = pCondition.trim(); if (condition) + { stmt.where(condition); + } } if (pOrder) + { stmt.orderBy(pOrder); + } stmt.groupBy(pGroupedColumns); return stmt; diff --git a/process/ClassificationIndicatorFieldRegistry_basic/ClassificationIndicatorFieldRegistry_basic.aod b/process/ClassificationIndicatorFieldRegistry_basic/ClassificationIndicatorFieldRegistry_basic.aod new file mode 100644 index 0000000000000000000000000000000000000000..daaa98ed0f3ff0b3703802ea2d422a5b56eabbb6 --- /dev/null +++ b/process/ClassificationIndicatorFieldRegistry_basic/ClassificationIndicatorFieldRegistry_basic.aod @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2"> + <name>ClassificationIndicatorFieldRegistry_basic</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/ClassificationIndicatorFieldRegistry_basic/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/ClassificationIndicatorFieldRegistry_basic/process.js b/process/ClassificationIndicatorFieldRegistry_basic/process.js new file mode 100644 index 0000000000000000000000000000000000000000..24d723a08394171c10996e4928200bc830e301a9 --- /dev/null +++ b/process/ClassificationIndicatorFieldRegistry_basic/process.js @@ -0,0 +1,68 @@ +import("Context_lib"); +import("system.project"); +import("system.translate"); + +/** + * Provides a central place where all classificationIndicatiorFields are defined. + * <p> + * Currently there is no option to gett all the dropdown and number fields of an entity so we have to define them by hand. + * Feel free to change this once it becomes possible! + * <p> + * @class + * + */ +function $ClassificationIndicatorRegistry(){} + +/** + * Returns the entity dropdown fields of pObjectType + * <p/> + * @param {Object} pObjectType <p/> object type we want the fields for + * + * @return {Array} Array with array of [[value], [displayvalue]] (like in a dropdownproess) + */ +$ClassificationIndicatorRegistry.getEntityDropDownFields = function(pObjectType) +{ + let res = []; + let entity = ContextUtils.getEntity(pObjectType); + if (pObjectType == "Organisation") + { + res = [ + ["STATUS", project.getEntityStructure(entity)["fields"]["STATUS"]["title"]], + ["TYPE", project.getEntityStructure(entity)["fields"]["TYPE"]["title"]] + ]; + } + else if (pObjectType == "Salesproject") + { + res = [ + ["CONTACT_ID", project.getEntityStructure(entity)["fields"]["CONTACT_ID"]["title"]], + ["PHASE", project.getEntityStructure(entity)["fields"]["PHASE"]["title"]], + ["STATUS", project.getEntityStructure(entity)["fields"]["STATUS"]["title"]] + ]; + + } + return res; +}; + +/** + * Returns the entity number fields of pObjectType + * <p/> + * @param {Object} pObjectType <p/> object type we want the fields for + * + * @return {Array} Array with array of [[value], [displayvalue]] (like in a dropdownproess) + */ +$ClassificationIndicatorRegistry.getEntityNumberFields = function (pObjectType) +{ + let res = []; + if (pObjectType == "Organisation") + { + res = []; + } + else if (pObjectType == "Salesproject") + { + res = [ + ["PROBABILITY", translate.text("Probability")],//number + ["VOLUME", translate.text("Volume")]//number]; + ]; + } + return res; +} \ No newline at end of file diff --git a/process/ClassificationUpdate_lib/ClassificationUpdate_lib.aod b/process/ClassificationUpdate_lib/ClassificationUpdate_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..b288b713658fef5046085f038e4f7481e42d6747 --- /dev/null +++ b/process/ClassificationUpdate_lib/ClassificationUpdate_lib.aod @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<process xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/process/1.2.2"> + <name>ClassificationUpdate_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/ClassificationUpdate_lib/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/ClassificationUpdate_lib/process.js b/process/ClassificationUpdate_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..7f287cfef0b607302ede8f245da2fbda5bc1354e --- /dev/null +++ b/process/ClassificationUpdate_lib/process.js @@ -0,0 +1,1756 @@ +import("AttributeFilter_lib"); +import("ClassificationComplexIndicatorRegistry_basic"); +import("ClassificationIndicatorFieldRegistry_basic"); +import("Classification_lib"); +import("Context_lib"); +import("JditoFilter_lib"); +import("Organisation_lib"); +import("Sql_lib"); +import("Util_lib"); +import("system.db"); +import("system.eMath"); +import("system.entities"); +import("system.logging"); +import("system.translate"); +import("system.util"); + +/** + * Methods to manage classifications.<br> + * <b>Do not create an instance of this!</b> + * + * @class + */ +function ClassificationUpdateUtils() {} + +/** + * Refresh function that get's used by the updateClassifications_serverProcess and the openClassificationOverView Actions at Organisation and Salesproject.<br> + * There are three ways to run this: only recalculating the outdated data (and updating if needed), only for a specific object and returning it's classification (and updating it's stored classification) or recalculating ALL the classifications (and updating if needed).<br> + * ClassificationTypes are being flagged as Outdated accordingly, everytime someone configures something in ClassificationAdmin.<br> + * The classificationStorageDatasets are being flagged as outdated as soon as you update anything regarding the corresponding object or insert/update + * anything with a dependency set to said object.<br> + * + * Calling this function without any params leads to it updating only for the datasets that have been flagged as outdated. + * <p> + * First it checks whether outdated classificationStorages and outdated classificationTypes exist + * and always updates the classificationStorages first before updating the for the outdated classificationTypes. + * + * -In the classificationStorage runtrough it calculates the complete classification for every outdated classificationStorage, entirely + * from scratch and updates the classificationStorage + * -In the classificationType runtrough it also updates the classificationStorage dataset, but this time + * -for every object of said objectType + * -only recalculates the flagged ones and relies on the already stored values of the not flagged classificationTypes if they are from another classificationGroup + * <p> + * When recalculateAll_param is set to true: now the outdated flag is being ignored and all classificationtypes as outdated (only one runtrough needed) + * <p> + * When pSingleRefreshRowId we only update said object and return the achieved classifications (the stored classificationStorage string is also being updated if needed) + * + * @param {Boolean}[pRefreshAll] <p> + * Whether or not to recalculate and refresh all classifications<br> + * + * @param {String}[pSingleRefreshRowId] <p> + * object row id of the dataset you want the classification for (also returns the + * classification as formatted Object for Classification_entity jDito contentprocess)<br> + * + * @param {String}[pObjectType] <p> + * The Object type of the object row id. (Mandatory if pSingleRefreshRowId is set!)<br> + * This is normally just the Context name<br> + * + * @return {Object} <p> + * If pSingleRefreshRowId is set: Formatted Object to return to Classification_entity jDito + * contentprocess to show the achieved classifications (the stored classificationStorage string + * is also being updated if needed)<br> + * Else: Output in log how many Datasets have and have not been updated. + */ +ClassificationUtils.executeUpdating = function(pRefreshAll, pSingleRefreshRowId, pObjectType) +{ + var outputInfo = "updateClassifications_serverProcess output is:\n";//information how much data has been modified + var singleRefreshRowId = false; + var recalculateAll = false; + var objectType_param; + + if (pSingleRefreshRowId) + { + singleRefreshRowId = pSingleRefreshRowId; + objectType_param = pObjectType; + } + else if (pRefreshAll) + { + recalculateAll = pRefreshAll; + } + + var buildClassificationObjects = ClassificationUpdateHelper._buildClassificationFilterObjects(recalculateAll, singleRefreshRowId); + var stopper = false; + var buildOutdatedStoredClassificationObjects = ClassificationUpdateHelper._buildOutdatedStoredClassificationObject(recalculateAll, singleRefreshRowId, pObjectType); + + if (buildOutdatedStoredClassificationObjects && buildOutdatedStoredClassificationObjects["objectTypes"] + && buildOutdatedStoredClassificationObjects["objectTypes"].length > 0) + { + while(buildOutdatedStoredClassificationObjects["objectTypes"].length > 0 && !stopper) + { + if (singleRefreshRowId) + { + stopper = true; + } + var returnAfterUpdate = ClassificationUpdateHelper._updateOutdatedDatasets(null, buildOutdatedStoredClassificationObjects, singleRefreshRowId, outputInfo);//run updating for this set of Datasets + if(returnAfterUpdate && returnAfterUpdate["outputInfo"]) + { + outputInfo = returnAfterUpdate["outputInfo"]; + } + if (buildOutdatedStoredClassificationObjects["objectTypes"].length > 0 && !stopper) + { + buildOutdatedStoredClassificationObjects = ClassificationUpdateHelper._buildOutdatedStoredClassificationObject(recalculateAll, singleRefreshRowId, objectType_param); + } + } + + } + if (buildClassificationObjects["objectTypesThatNeedUpdate"] && buildClassificationObjects["objectTypesThatNeedUpdate"].length > 0 && !singleRefreshRowId) + { + var update = ClassificationUpdateHelper._updateOutdatedDatasets(buildClassificationObjects, null, null, outputInfo);//run updating for this set of Datasets + outputInfo = update["outputInfo"]; + } + else if(!returnAfterUpdate || !returnAfterUpdate["outputInfo"]) + { + outputInfo = outputInfo + "No Data has been updated, everything already up-to-date"; + } + + if (returnAfterUpdate && !returnAfterUpdate["outputInfo"]) + { + return ClassificationUpdateHelper._formatOutputForDisplayingValues(returnAfterUpdate, singleRefreshRowId); + } + logging.log(outputInfo); //return outputInformation in log instead of returning + + return null; +}; + +/** +* Throws an error if one of the values is configured the wrong way (more than one children, wrong condition or even wrong filterfield)<p><br> +* +* @param {Object}pClassificationType <p> +* classificationType as built as from pIndicatorObj<br> +* +* @param {Boolean}[pIsAttribute] <p> +* Whether or not it's an attribute<br> +* +*/ +ClassificationUtils.validateUserSetValues = function(pClassificationType, pIsAttribute) +{ + var errorMessage = ""; + if(pClassificationType["fieldType"] == $ClassificationFieldTypes.DROPDOWN()) + { + for (var filterValue in pClassificationType["values"]) + { + var parsedFilter = JSON.parse(filterValue); + if(parsedFilter["filter"]["childs"].length != 1) + { + errorMessage += translate.withArguments("wrong configuration for '%0'", [pClassificationType["field"]]) + " " + translate.text("only use simple filters") +"\n"; + } + else if((!pIsAttribute && parsedFilter["filter"]["childs"][0]["name"] != pClassificationType["field"]) || (pIsAttribute && !parsedFilter["filter"]["childs"][0]["name"].includes(pClassificationType["field"]))) + { + errorMessage += translate.withArguments("wrong configuration for '%0'", [pClassificationType["field"]]) + " " + translate.text("only filter using the specified indicatorfield") +"\n"; + } + else if(parsedFilter["filter"]["childs"][0]["operator"] != "EQUAL") + { + errorMessage += translate.withArguments("wrong configuration for '%0'", [pClassificationType["field"]]) + " " + translate.text("please only filter using 'equal'") +"\n"; + } + } + } + if(errorMessage != "") + { + throw errorMessage; + } +} + + +function ClassificationUpdateHelper() {} + +/** +* Searches for pClassificationTypeId in pIndicatorObj and returns it's object<p><br> +* +* @param {Object}pClassificationTypeId <p> +* condition of which classificationtypes to update<br> +* +* @param {Object}pIndicatorObj <p> +* return of buildindicatorObj()[objectType].<br> +* +* +* @return {Object} <p> (empty Strings and Objects if not found) +* {"classificationGroupId": classificationGroupId +* , "fieldType": fieldType +* , "field": field +* , "maxPercent": maxPercent +* , "points": points +* , "values": {value: pointsForValue}}<br> +*/ +ClassificationUpdateHelper._searchIndicatorObj = function(pClassificationTypeId, pIndicatorObj) +{ + for(var typeKind in pIndicatorObj) + { + for(var classificationTypeId in pIndicatorObj[typeKind]) + { + if (pClassificationTypeId == classificationTypeId) + { + if (typeKind != $ClassificationIndicatorTypes.ATTRIBUTE()) + { + return pIndicatorObj[typeKind][classificationTypeId]; + } + else + { + pIndicatorObj[typeKind][classificationTypeId]["field"] = newSelect("ATTRIBUTE_NAME") + .from("AB_ATTRIBUTE") + .where("AB_ATTRIBUTE.AB_ATTRIBUTEID", AttributeSearchNameCoder.decode(pIndicatorObj[typeKind][classificationTypeId]["field"])["id"]).cell(); + return pIndicatorObj[typeKind][classificationTypeId]; + } + } + } + } + return {"classificationGroupId": "" + , "fieldType": "" + , "field": "" + , "maxPercent": "" + , "points": "" + , "values": {}}; +}; + +/** +* Formats the output in an TwoDimensional array for Classification_entity and returns it (stringified!)<p><br> +* +* @param {Object}pReturn <p> +* return of ClassificationUpdateHelper._updateOutdatedDatasets()<br> +* +* @param {Object}pUid <p> +* objectRowId we want to show the classifications for<br> +* +* +* @return {String} <p> stringified contentProcessArray<br> +*/ +ClassificationUpdateHelper._formatOutputForDisplayingValues = function(pReturn, pUid) +{ + var indicatorObj = pReturn["indicatorObj"]; + var achievedScoresObject = pReturn["achievedScoresObject"][pUid]; + var orderedGroups = pReturn["orderedGroups"]; + var classificationString = pReturn["newGradingString"]; + var groupNameObj = {}; + var contentProcessArray = []; + var groupNames = newSelect("CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.TITLE") + .from("CLASSIFICATIONGROUP") + .table(); + for (let i = 0; i < groupNames.length; i++) + { + groupNameObj[groupNames[i][0]] = ""; + groupNameObj[groupNames[i][0]] = groupNames[i][1]; + } + var groupResultObj = {}; + for (var group in orderedGroups) + { + var groupId = orderedGroups[group]["0"]; + groupResultObj[groupId] = {}; + groupResultObj[groupId]["points"] = 0; + groupResultObj[groupId]["maxPoints"] = 0; + contentProcessArray.push([util.getNewUUID(), groupId, translate.text(groupNameObj[groupId]), "", "", "", "", ""]); + for (var typeId in achievedScoresObject[groupId]) + { + var typeInfo = ClassificationUpdateHelper._searchIndicatorObj(typeId, indicatorObj); + + if (achievedScoresObject[groupId][typeId]["key"] || achievedScoresObject[groupId][typeId]["key"] == "0") + { + contentProcessArray.push([util.getNewUUID(), groupId, "", typeId, achievedScoresObject[groupId][typeId]["fieldDisplay"], achievedScoresObject[groupId][typeId]["key"] + , achievedScoresObject[groupId][typeId]["value"], achievedScoresObject[groupId][typeId]["points"] + "/" + achievedScoresObject[groupId][typeId]["maxPoints"] + " " + translate.text("Points")]); + groupResultObj[groupId]["points"] = eMath.addInt(parseInt(groupResultObj[groupId]["points"]), parseInt(achievedScoresObject[groupId][typeId]["points"])); + groupResultObj[groupId]["maxPoints"] = eMath.addInt(parseInt(groupResultObj[groupId]["maxPoints"]), parseInt(achievedScoresObject[groupId][typeId]["maxPoints"])); + } + else + { + contentProcessArray.push([util.getNewUUID(), groupId, "", typeId, achievedScoresObject[groupId][typeId]["fieldDisplay"], "-" + , "-", "0" + "/" + typeInfo["points"] * typeInfo["maxPercent"] / 100 + " " + translate.text("Points")]); + groupResultObj[groupId]["points"] = eMath.addInt(parseInt(groupResultObj[groupId]["points"]), parseInt(0)); + groupResultObj[groupId]["maxPoints"] = eMath.addInt(parseInt(groupResultObj[groupId]["maxPoints"]), parseInt(typeInfo["points"] * typeInfo["maxPercent"] / 100)); + } + } + } + var position = 0; + for (let i = 0; i < contentProcessArray.length; i++) + { + if (contentProcessArray[i][2] && contentProcessArray[i][2] != "") + { + contentProcessArray[i][2] = ClassificationUtils.formatDisplaySummaryForGroup(groupResultObj[contentProcessArray[i][1]]["points"], groupResultObj[contentProcessArray[i][1]]["maxPoints"], contentProcessArray[i][2], classificationString.substring(position, position + 1)) + position++; + } + } + + return JSON.stringify(contentProcessArray); +}; + +/** +* Helper function, this get's used in ClassificationUpdateHelper._handleEntityFields, ClassificationUpdateHelper._handleAttributes an ClassificationUpdateHelper._handleComplex to get the correct value of the numbervalue<p><br> +* +* @param {Array}pAttributeValues <p> +* All values this object has for this attribute<br> +* +* @param {Object}pClassificationType <p> +* as returned by buildindicatorObj()<br> +* +* @param {Object}pColumns <p> +* columns of the objectType<br> +* +* @param {Object}pRows <p> +* rows of the dataset<br> +* +* @param {String}pValue <p> +* the valeu depending on the indicatortype<br> +* +* @param {boolean}pIsDate <p> +* true if date, since we handle those a little different<br> +* +* @return {Object} <p>{"key": 0 +* , "percent": 0 +* , "value": "-"} <- if none, else the actual values; +*/ +ClassificationUpdateHelper._getCorrectNumberValue = function(pAttributeValues, pClassificationType, pColumns, pRows, pValue, pIsDate) +{ + var storedValues; + if (pAttributeValues == undefined)//this record doesn't have a value for that attribute + { + storedValues = "ignoreThis"; + } + else if (pAttributeValues)//atleast one value exists for this attribute + { + storedValues = pAttributeValues; + } + else if (pColumns)//fieldValue -> get from pRows + { + storedValues = [pRows[pColumns.indexOf(pClassificationType["field"], 0)]]; + } + else + { + storedValues = [pValue]; + } + var achievedPercent = {}; + achievedPercent = {"key": 0 + , "percent": 0 + , "value": "-"}; + + if (pIsDate) + { + var orderedObject = {}; + Object.keys(pClassificationType["values"]) + .sort() + .forEach(function(v, i) { + orderedObject[v] = pClassificationType["values"][v]; + }); + pClassificationType["values"] = orderedObject; + } + + for(var value in pClassificationType["values"]) + { + if (storedValues != "ignoreThis") + { + for (var val in storedValues) + { + if (parseInt(storedValues[val]) >= parseInt(value) && parseInt(storedValues[val]) > parseInt(achievedPercent["key"])) + { + + achievedPercent = {}; + achievedPercent["key"] = value; + achievedPercent["value"] = storedValues[val]; + achievedPercent["percent"] = pClassificationType["values"][value]; + } + } + } + } + + return{"key": achievedPercent["key"] + , "value": achievedPercent["value"] + , "maxPoints": pClassificationType["maxPercent"]/100*pClassificationType["points"] + , "points": achievedPercent["percent"]/100*pClassificationType["points"] + }; +}; + +/** +* Builds the updateStatments.<p><br> +* +* @param {Object}pAchievedScores <p> +* AchievedScoresObject built by handlEntityFields(), handleAttributes() and handleComplex()<br> +* +* @param {Object}pGradingObject <p> +* gradingObject as returned by ClassificationUpdateHelper._buildGradingObject()<br> +* +* @param {Object}pOrderedGroups <p> +* classificationGroups in the correct order (so we can update at the correct positions)<br> +* +* @param {Object}pCurrentValue <p> +* current classificationStorage string<br> +* +* @param {String}pRowId <p> +* row Id of the current dataset<br> +* +* @param {boolean}pRowType <p> +* true if date, since we handle those a little different<br> +* +* @param {boolean}pUpdateStatements <p> +* the updateStatements we already have, we simply add ours to those<br> +* +* @param {String}pOutputInformation <p> +* we pass the outputinformation trough so we can add to the string<br> +* +* @return {Object} <p>{"updateStatements": updateStatements +* , "outputInformation": outputInformation +* , "newGradingString": newGradingString}; +*/ +ClassificationUpdateHelper._buildUpdateClassificationValueStatements = function(pAchievedScores, pGradingObject, pOrderedGroups, pCurrentValue, pRowId, pRowType, pUpdateStatements, pOutputInformation) +{ + var pointsPerGroupObj = {}; + var newGradingString = pCurrentValue; + for(var position in pOrderedGroups) + { + var groupId = pOrderedGroups[position][0]; + for(var type in pAchievedScores[groupId]) + { + if (pAchievedScores[groupId][type]["points"] || pAchievedScores[groupId][type]["points"] == 0) + { + if (!pointsPerGroupObj.hasOwnProperty(groupId)) + { + pointsPerGroupObj[groupId] = {}; + pointsPerGroupObj[groupId]["points"] = 0; + pointsPerGroupObj[groupId]["maxPoints"] = 0; + } + pointsPerGroupObj[groupId]["points"] = eMath.addInt(parseInt(pointsPerGroupObj[groupId]["points"]), parseInt(pAchievedScores[groupId][type]["points"])); + pointsPerGroupObj[groupId]["maxPoints"] = eMath.addInt(parseInt(pointsPerGroupObj[groupId]["maxPoints"]), parseInt(pAchievedScores[groupId][type]["maxPoints"])); + } + } + if (pointsPerGroupObj && pointsPerGroupObj[groupId]) + { + newGradingString = StringUtils.replaceAt(newGradingString, position, ClassificationUtils.getGradingFromObject(pGradingObject, groupId, pointsPerGroupObj[groupId]["points"], pointsPerGroupObj[groupId]["maxPoints"])); + } + } + + if (pCurrentValue != newGradingString) + { + pUpdateStatements.push(["CLASSIFICATIONSTORAGE", ["CLASSIFICATIONVALUE", "OUTDATED"], null, [newGradingString, "0"], newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", pRowId).build()]); + pOutputInformation[pRowType].updatedElements += 1; + } + else + { + pUpdateStatements.push(["CLASSIFICATIONSTORAGE", ["OUTDATED"], null, ["0"], newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", pRowId).build()]); + pOutputInformation[pRowType].nonChangedElements++; + } + + return {"updateStatements": pUpdateStatements + , "outputInformation": pOutputInformation + , "newGradingString": newGradingString}; +}; + +/** +* Builds the updateStatments.<p><br> +* +* @param {Array}pRowIds <p> +* rowIds of datasets<br> +* +* @param {String}pCurrentObjectType <p> +* current Object Type we want the attributeObject for<br> +* +* @return {Object} <p>attributeObj[objectRowId][encodedName] = [values];; +*/ +ClassificationUpdateHelper._buildAttributeObject = function(pRowIds, pCurrentObjectType) +{ + var idColumn = pCurrentObjectType.toUpperCase() + "ID"; + if (pCurrentObjectType == "Organisation") + { + idColumn = "CONTACTID"; + } + var attributeObj = {}; + if (pRowIds && pRowIds.length > 0) + { + var objectRowIds = []; + for (let i = 0; i < pRowIds.length; i++) + { + objectRowIds.push(pRowIds[i][idColumn]); + } + + //select attributevalues for the objectRowIds + var attributeArray = newSelect(["AB_ATTRIBUTERELATION.OBJECT_ROWID", "AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", "AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", + SqlBuilder.caseWhen(newWhere("AB_ATTRIBUTERELATION.CHAR_VALUE is not null")) + .then("AB_ATTRIBUTERELATION.CHAR_VALUE") + .elseValue(SqlBuilder.caseWhen(newWhere("AB_ATTRIBUTERELATION.ID_VALUE is not null")) + .then("AB_ATTRIBUTERELATION.ID_VALUE") + .elseValue("null") + .toString()) + .toString() + ,SqlBuilder.caseWhen(newWhere("AB_ATTRIBUTERELATION.INT_VALUE is not null")) + .then("AB_ATTRIBUTERELATION.INT_VALUE") + .elseValue(SqlBuilder.caseWhen(newWhere("AB_ATTRIBUTERELATION.NUMBER_VALUE is not null")) + .then("AB_ATTRIBUTERELATION.NUMBER_VALUE") + .elseValue("null") + .toString()) + .toString() + , "AB_ATTRIBUTE.ATTRIBUTE_TYPE"]) + .from("AB_ATTRIBUTERELATION") + .join("AB_ATTRIBUTE", "AB_ATTRIBUTE_ID = AB_ATTRIBUTEID") + .where("AB_ATTRIBUTERELATION.OBJECT_ROWID", objectRowIds, SqlBuilder.IN()) + .table(); + + + + var helperObject = {}; + let objectRowId, attributeId, attributeRelationId, value, numericValue, attributeType; + //assign them to attributeObj for easier access + for (let element in attributeArray) + { + [objectRowId, attributeId, attributeRelationId, value, numericValue, attributeType] = element; + var encodedName = AttributeSearchNameCoder.encode(attributeId, attributeType); + + if (!helperObject.hasOwnProperty(objectRowId)) + { + attributeObj[objectRowId] = {}; + helperObject[objectRowId] = ""; + + } + if (!helperObject.hasOwnProperty(objectRowId + encodedName)) + { + attributeObj[objectRowId][encodedName] = []; //same logic as before + helperObject[objectRowId + encodedName] = ""; + } + if (!helperObject.hasOwnProperty(attributeRelationId)) //objectRowId + { + let valueToPush = value && value != "" ? value : numericValue; + attributeObj[objectRowId][encodedName].push(valueToPush); + + helperObject[attributeRelationId] = ""; + } + } + } + return attributeObj; +}; + +//helper Function for better code-readability +ClassificationUpdateHelper._processObjectValuesBatchFn = function(pBatchData, pIndicatorObj, pAchievedScoresObject, pGradingObject, pOrderedGroups, pCurrentObjectType, pOutputInformation, pFieldDisplayObject, pFilteredRecsObj, pClassificationTypesNoFilterObj) +{ + var achievedScoresObject = pAchievedScoresObject; + var attributeObj = ClassificationUpdateHelper._buildAttributeObject(pBatchData, pCurrentObjectType);//call for every "page" + var updateStatements = []; + + var idColumn = pCurrentObjectType.toUpperCase() + "ID" + if (pCurrentObjectType == "Organisation") + { + idColumn = "CONTACTID"; + } + //logic from above applies here aswell + for (let ii = 0; ii < pBatchData.length; ii++) + { + var currentDataset = pBatchData[ii]; + if (currentDataset["CLASSIFICATIONVALUE"] && currentDataset["CLASSIFICATIONVALUE"] != "") + { + var columns = []; + var values = []; + + for (var property in currentDataset) + { + if (!currentDataset.hasOwnProperty(property)) + { + continue; + } + columns.push(property); + values.push(currentDataset[property]); + } + + achievedScoresObject = ClassificationUpdateHelper._handleEntityFields(pIndicatorObj[$ClassificationIndicatorTypes.ENTITYFIELD()], values, columns, currentDataset[idColumn], achievedScoresObject, pFieldDisplayObject[pCurrentObjectType], pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType); + achievedScoresObject = ClassificationUpdateHelper._handleAttributes(pIndicatorObj[$ClassificationIndicatorTypes.ATTRIBUTE()], attributeObj, currentDataset[idColumn], achievedScoresObject, pFieldDisplayObject[pCurrentObjectType], pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType); + achievedScoresObject = ClassificationUpdateHelper._handleComplex(pIndicatorObj[$ClassificationIndicatorTypes.COMPLEX()], pCurrentObjectType, currentDataset[idColumn], achievedScoresObject, pFieldDisplayObject[pCurrentObjectType], pFilteredRecsObj, pClassificationTypesNoFilterObj); + + var buildUpdateClassificationValueStatements = ClassificationUpdateHelper._buildUpdateClassificationValueStatements(achievedScoresObject[currentDataset[idColumn]], pGradingObject, pOrderedGroups, currentDataset["CLASSIFICATIONVALUE"], currentDataset[idColumn], pCurrentObjectType, updateStatements, pOutputInformation); + updateStatements = buildUpdateClassificationValueStatements["updateStatements"]; + pOutputInformation = buildUpdateClassificationValueStatements["outputInformation"]; + + } + } + db.execute(updateStatements); + var gradingString = buildUpdateClassificationValueStatements != undefined ? buildUpdateClassificationValueStatements["newGradingString"] : ""; + return {"achievedScoresObject": achievedScoresObject + , "outputInformation": pOutputInformation + , "newGradingString": gradingString}; +}; + + +/** +* Get's the entityfields of pCurrentObjectType by using ClassificationUtils.getEntityFields(), adds the uid column to it and returns it as array<p><br> +* +* @param {Array}pCurrentObjectType <p> +* Object type you want the fields for<br> +* +* @return {Array} <p>fields; +*/ +ClassificationUpdateHelper._getEntityFields = function(pCurrentObjectType) +{ + var fieldArray = []; + var entityFields = ClassificationUtils.getEntityFields(pCurrentObjectType); + for(var field in entityFields) + { + fieldArray.push(entityFields[field][0]); + } + fieldArray.push("CLASSIFICATIONVALUE"); + if (pCurrentObjectType == "Organisation") + { + fieldArray.push("CONTACTID"); + } + else + { + fieldArray.push(pCurrentObjectType.toUpperCase() + "ID"); + } + + + return fieldArray; +}; + +/** + * handles the complex indicators so you can add them to achievedScoresObject <p><br> + * + * @param {Object}pClassificationTypes <p> + * as returned by buildindicatorObj()<br> + * + * @param {String}pObject <p> + * current Object Type<br> + * + * @param {String}pUid <p> + * current Object uid<br> + * + * @param {Object}pAchievedScoresObject <p> + * achievedScoresObj we add ours to this<br> + * + * @param {Array[[][]]}pFieldDisplayObject <p> + * twodimensional array with value and key so we can get the displayValues<br> + * + * @param {Object}pFilteredRecsObj <p> + * as returned by ClassificationUpdateHelper._buildFilteredRecsObject()<br> + * + * @param {Object}pClassificationTypesNoFilterObj <p> + * as built by ClassificationUpdateHelper._buildFilterAndNoFilterObj()<br> + * + * @return {Object} <p>pAchievedScoresObject; + */ + ClassificationUpdateHelper._handleComplex = function(pClassificationTypes, pObject, pUid, pAchievedScoresObject, pFieldDisplayObject, pFilteredRecsObj, pClassificationTypesNoFilterObj) + { + for(var type in pClassificationTypes) + { + if(ClassificationUpdateHelper._isRelevant(type, pUid, pClassificationTypes[type]["filter"], pFilteredRecsObj, pClassificationTypesNoFilterObj, pObject)) + { + var achievedValueArray = $ClassificationComplexIndicatorRegistry[pClassificationTypes[type]["field"]]().getValueFn(pObject, pUid); + + for (var valueScore in pClassificationTypes[type]["values"]) + { + if (!pAchievedScoresObject.hasOwnProperty(pUid)) + { + pAchievedScoresObject[pUid] = {}; + } + if (!pAchievedScoresObject[pUid].hasOwnProperty(pClassificationTypes[type]["classificationGroupId"])) + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]] = {}; + } + + if (!pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]].hasOwnProperty(type)) + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type] = {}; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = "-"; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = "-"; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = pClassificationTypes[type]["maxPercent"] / 100 * pClassificationTypes[type]["points"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = 0; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + } + + for (var value in achievedValueArray) + { + if (pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.NUMBER() || pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.INTEGER() + || pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.DATE()) + { + var numberValue; + if (pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.DATE()) + { + numberValue = ClassificationUpdateHelper._getCorrectNumberValue(false, pClassificationTypes[type], false, null, parseInt(achievedValueArray), true); + } + else + { + numberValue = ClassificationUpdateHelper._getCorrectNumberValue(false, pClassificationTypes[type], false, null, parseInt(achievedValueArray)); + } + + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = numberValue["key"]; + if (pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.DATE()) + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = $ClassificationComplexIndicatorRegistry[pClassificationTypes[type]["field"]]().getDisplayValueFn(numberValue["key"].toString()); + } + else + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = numberValue["value"]; + } + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = numberValue["maxPoints"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = numberValue["points"]; + } + else + { + if (achievedValueArray[value] == valueScore) + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = pClassificationTypes[type]["maxPercent"] / 100 * pClassificationTypes[type]["points"]; + //replace if the value is greater than the one we already have + if (parseInt(pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"]) < parseInt(pClassificationTypes[type]["values"][valueScore])*parseInt(pClassificationTypes[type]["points"]) / 100) + { + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = parseInt(pClassificationTypes[type]["values"][valueScore]) * parseInt(pClassificationTypes[type]["points"]) / 100; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = valueScore; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = $ClassificationComplexIndicatorRegistry[pClassificationTypes[type]["field"]]().getDisplayValueFn(valueScore); + + } + } + } + } + } + } + } + return pAchievedScoresObject; + }; + +/** +* handles the attribute indicators so you can add them to achievedScoresObject <p><br> +* +* @param {Object}pClassificationTypes <p> +* as returned by buildindicatorObj()<br> +* +* @param {Object}attributeObj <p> +* as returned by ClassificationUpdateHelper._buildAttributeObject()<br> +* +* @param {String}pUid <p> +* current Object uid<br> +* +* @param {Object}pAchievedScoresObject <p> +* achievedScoresObj we add ours to this<br> +* +* @param {Array[[][]]}pFieldDisplayObject <p> +* twodimensional array with value and key so we can get the displayValues<br> +* +* @param {Object}pFilteredRecsObj <p> +* as returned by ClassificationUpdateHelper._buildFilteredRecsObject()<br> +* +* @param {Object}pClassificationTypesNoFilterObj <p> +* as built by ClassificationUpdateHelper._buildFilterAndNoFilterObj()<br> +* +* @param {String}pCurrentObjectType <p> +* current Object Type<br> +* +* @return {Object} <p>pAchievedScoresObject; +*/ +ClassificationUpdateHelper._handleAttributes = function(pClassificationTypes, attributeObj, pUid, pAchievedScoresObject, pFieldDisplayObject, pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType) +{ + var classificationTypes = pClassificationTypes; + var currentAttributes = attributeObj[pUid]; + + for(var type in classificationTypes) + { + if(ClassificationUpdateHelper._isRelevant(type, pUid, pClassificationTypes[type]["filter"], pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType)) + { + ClassificationUtils.validateUserSetValues(classificationTypes[type], true); + if (!pAchievedScoresObject.hasOwnProperty(pUid)) + { + pAchievedScoresObject[pUid] = {}; + } + if (!pAchievedScoresObject[pUid].hasOwnProperty(classificationTypes[type]["classificationGroupId"])) + { + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]] = {}; + } + if (!pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]].hasOwnProperty(type)) + { + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type] = {}; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["points"] = 0; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["key"] = "-"; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["value"] = "-"; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = classificationTypes[type]["maxPercent"] / 100 * classificationTypes[type]["points"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + } + + for (var filter in classificationTypes[type]["values"]) + { + for (var attribute in currentAttributes) + { + if (classificationTypes[type]["fieldType"] == $ClassificationFieldTypes.NUMBER() || classificationTypes[type]["fieldType"] == $ClassificationFieldTypes.INTEGER()) + { + var numberValue = ClassificationUpdateHelper._getCorrectNumberValue(currentAttributes[classificationTypes[type]["field"]], pClassificationTypes[type]); + + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type] = {}; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = numberValue["key"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = numberValue["value"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = numberValue["maxPoints"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = numberValue["points"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + } + else + { + var currentValue = JSON.parse(filter)["filter"]["childs"][0]["key"]; + for (var attributeValue in currentAttributes[attribute]) + { + if (currentAttributes[attribute][attributeValue] == currentValue) + { + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type] = {}; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["points"] = classificationTypes[type]["values"][filter]*classificationTypes[type]["points"] / 100; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["key"] = JSON.parse(filter)["filter"]["childs"]["0"]["key"]; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["value"] = JSON.parse(filter)["filter"]["childs"]["0"]["value"]; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = classificationTypes[type]["maxPercent"] / 100 * classificationTypes[type]["points"]; + pAchievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + + //replace if the value is greater than the one we already have + if (parseInt(pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["points"]) < parseInt(classificationTypes[type]["values"][filter])*parseInt(classificationTypes[type]["points"]) / 100) + { + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["points"] = parseInt(classificationTypes[type]["values"][filter])*parseInt(classificationTypes[type]["points"]) / 100; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["key"] = JSON.parse(filter)["filter"]["childs"]["0"]["key"]; + pAchievedScoresObject[pUid][classificationTypes[type]["classificationGroupId"]][type]["value"] = JSON.parse(filter)["filter"]["childs"]["0"]["value"]; + } + } + } + } + } + } + } + } + return pAchievedScoresObject; +}; + +/** + * handles the entityfield indicators so you can add them to achievedScoresObject <p><br> + * + * @param {Object}pClassificationTypes <p> + * as returned by buildindicatorObj()<br> + * + * @param {Object}pColumns <p> + * columns of the objectType<br> + * + * @param {Object}pRows <p> + * rows of the dataset<br> + * + * @param {String}pUid <p> + * current Object uid<br> + * + * @param {Object}pAchievedScoresObject <p> + * achievedScoresObj we add ours to this<br> + * + * @param {Array[[][]]}pFieldDisplayObject <p> + * twodimensional array with value and key so we can get the displayValues<br> + * + * @param {Object}pFilteredRecsObj <p> + * as returned by ClassificationUpdateHelper._buildFilteredRecsObject()<br> + * + * @param {Object}pClassificationTypesNoFilterObj <p> + * as built by ClassificationUpdateHelper._buildFilterAndNoFilterObj()<br> + * + * @param {String}pCurrentObjectType <p> + * current Object Type<br> + * + * @return {Object} <p>pAchievedScoresObject; + */ + ClassificationUpdateHelper._handleEntityFields = function(pClassificationTypes, pRows, pColumns, pUid, pAchievedScoresObject, pFieldDisplayObject, pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType) + { + var achievedScoresObject = pAchievedScoresObject; + var helperObject = {}; + for (var type in pClassificationTypes) + { + if(ClassificationUpdateHelper._isRelevant(type, pUid, pClassificationTypes[type]["filter"], pFilteredRecsObj, pClassificationTypesNoFilterObj, pCurrentObjectType)) + { + var valueSet = false; + ClassificationUtils.validateUserSetValues(pClassificationTypes[type]); + for (var filter in pClassificationTypes[type]["values"]) + { + if (!valueSet) + { + if (!helperObject.hasOwnProperty(pUid)) + { + helperObject[pUid] = {}; + achievedScoresObject[pUid] = {}; + } + if (!helperObject.hasOwnProperty(pUid + pClassificationTypes[type]["classificationGroupId"])) + { + helperObject[pUid + pClassificationTypes[type]["classificationGroupId"]] = {}; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]] = {}; + } + if (!helperObject.hasOwnProperty(pUid + type)) + { + helperObject[pUid + type] = {}; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type] = 0; + } + if (pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.NUMBER() || pClassificationTypes[type]["fieldType"] == $ClassificationFieldTypes.INTEGER()) + { + var numberValue = ClassificationUpdateHelper._getCorrectNumberValue(false, pClassificationTypes[type], pColumns, pRows); + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type] = {}; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = numberValue["key"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = numberValue["value"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = numberValue["maxPoints"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = numberValue["points"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + } + else + { + if(achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] == undefined) + { + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type] = {}; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["fieldDisplay"] = ClassificationUtils.getFieldDisplayValue(pFieldDisplayObject, pClassificationTypes[type]["field"]); + } + + var filterValue = JditoFilterUtils.filterRecords(pColumns, [pRows], JSON.parse(filter).filter); + if (filterValue.length > 0) + { + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["key"] = JSON.parse(filter)["filter"]["childs"]["0"]["key"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["value"] = JSON.parse(filter)["filter"]["childs"]["0"]["value"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["maxPoints"] = pClassificationTypes[type]["maxPercent"] / 100 * pClassificationTypes[type]["points"]; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = 0; + achievedScoresObject[pUid][pClassificationTypes[type]["classificationGroupId"]][type]["points"] = parseInt(pClassificationTypes[type]["values"][filter]) * parseInt(pClassificationTypes[type]["points"]) / 100; + valueSet = true; + } + } + } + } + } + } + return achievedScoresObject; + }; + +/** +* builds the indicatorObject, which stores all the classificationTypes we need with all their information like value, displayvalue, indicatortype, fieldType, maxpoints, max percents and their possible values and their percent <p><br> +* +* +* @param {Object}pCurrentObjectType <p> +* Object Type (needed, altough we have the object table, since organisation as example uses contact as it's table<br> +* +* @return {Object} <p>indicatorObj[indicatorType][typeId] = {"classificationGroupId": classificationGroupId +* , "fieldType": fieldType +* , "field": field +* , "maxPercent": maxPercent +* , "points": points +* , "filter": filter +* , "values": {value: percent} +*/ +ClassificationUpdateHelper._buildindicatorObj = function(pCurrentObjectType) +{ + var currentObjectType = pCurrentObjectType; + var indicatorObj = {}; + var helperObj2 = {}; + indicatorObj[$ClassificationIndicatorTypes.ENTITYFIELD()] = {}; + indicatorObj[$ClassificationIndicatorTypes.ATTRIBUTE()] = {}; + indicatorObj[$ClassificationIndicatorTypes.COMPLEX()] = {}; + + + var classificationTypeScorePoints = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID\n\ + , CASE WHEN CLASSIFICATIONSCORE.INDICATORTEXT is not null THEN CLASSIFICATIONSCORE.INDICATORTEXT ELSE \n\ + CASE WHEN CLASSIFICATIONSCORE.INDICATORNUMBER is not null THEN CLASSIFICATIONSCORE.INDICATORNUMBER ELSE \n\ + CASE WHEN CLASSIFICATIONSCORE.INDICATORINTEGER is not null THEN CLASSIFICATIONSCORE.INDICATORINTEGER ELSE \n\ + CASE WHEN CLASSIFICATIONSCORE.FIELDVALUE is not null THEN CLASSIFICATIONSCORE.FIELDVALUE ELSE null \n\ + end\n\ + end\n\ + end\n\ + END\n\ + , CLASSIFICATIONTYPE.SCOREPOINTS, CLASSIFICATIONTYPE.FIELD, CLASSIFICATIONTYPE.FIELDTYPE \n\ + , CLASSIFICATIONTYPE.INDICATORTYPE, CLASSIFICATIONSCORE.SCOREPERCENT, CLASSIFICATIONTYPE.SCOREPOINTS, CLASSIFICATIONTYPE.FILTER") + .from("CLASSIFICATIONSCORE") + .join("CLASSIFICATIONTYPE", "CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", currentObjectType) + .orderBy("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") + .table(); + for (let i = 0; i < classificationTypeScorePoints.length; i++) + { + var typeId = classificationTypeScorePoints[i][1]; + + if (classificationTypeScorePoints[i][7] && classificationTypeScorePoints[i][6] != "") + { + if (!helperObj2.hasOwnProperty(typeId)) + { + indicatorObj[classificationTypeScorePoints[i][7]][typeId] = {"classificationGroupId": classificationTypeScorePoints[i][0] + , "fieldType": classificationTypeScorePoints[i][6] + , "field": classificationTypeScorePoints[i][5] + , "maxPercent": classificationTypeScorePoints[i][8] + , "points": classificationTypeScorePoints[i][9] + , "filter": classificationTypeScorePoints[i][10] + , "values": {} + }; + helperObj2[typeId] = ""; + } + + if (classificationTypeScorePoints[i][7] == $ClassificationIndicatorTypes.COMPLEX() && classificationTypeScorePoints[i][6] == $ClassificationFieldTypes.DATE()) // we don't use the actual value as the key for the dates, since they change daily + { + indicatorObj[classificationTypeScorePoints[i][7]][typeId]["values"][$ClassificationComplexIndicatorRegistry[classificationTypeScorePoints[i][5]]().getActualDateValueFn(classificationTypeScorePoints[i][3].toString())] = classificationTypeScorePoints[i][8]; + } + else + { + indicatorObj[classificationTypeScorePoints[i][7]][typeId]["values"][classificationTypeScorePoints[i][3]] = classificationTypeScorePoints[i][8]; + } + if (parseFloat(indicatorObj[classificationTypeScorePoints[i][7]][typeId]["maxPercent"]) < parseFloat(classificationTypeScorePoints[i][8])) + { + indicatorObj[classificationTypeScorePoints[i][7]][typeId]["maxPercent"] = classificationTypeScorePoints[i][8]; + } + } + } + return indicatorObj; +}; + +/** + * Builds filteredRecsObj Object which stores all the included Datasets to the specific filter. + * (loops trough classificationTypesFilterObj and uses either entites.getRow or an select for every different filter) + */ +ClassificationUpdateHelper._buildFilteredRecsObject = function(pClassificationTypesFilterObj, pCurrentObjectType, pFilterFields) +{ + var currentObjectType = pCurrentObjectType; + var filteredRecsObj = {}; //reset for every objectType + var executeGetRows = true; //reset for every objectTyp + + for (var index in pClassificationTypesFilterObj[currentObjectType]) + { + for (var indexIndex in pClassificationTypesFilterObj[currentObjectType][index]) + { + var unparsedFilter = pClassificationTypesFilterObj[currentObjectType][index][indexIndex]; + var filter = JSON.parse(unparsedFilter).filter; + //filteredRecsObj uses the filter as the key -> if multiple indicators use the exact same filtercondition we only have to get these rows once + if (filteredRecsObj[pClassificationTypesFilterObj[currentObjectType][index][indexIndex]] == undefined) + { + if (filter["childs"]["0"] != undefined) // ignore empty filters + { + //no "." in the name means its a field of the entity itself: use entities.getRow and JditoFilterUtils.filterRecords + //to check whether or not the Filter excludes this row + if (!filter["childs"]["0"]["name"].includes(".")) + { + if (executeGetRows) //only do this once for every object type, since the rows don't change depending on the filter + { + var loadConfig = entities.createConfigForLoadingRows() + .entity(ContextUtils.getEntity(currentObjectType)) + .fields(pFilterFields); + + var rows = entities.getRows(loadConfig); + var value; + var filterableRows = []; + for (let ii = 0; ii < rows.length; ii++) { + filterableRows[ii] = pFilterFields.map(function (field) + { + value = null; + if (field in rows[ii]) + { + value = rows[ii][field]; + } + return value; + }); + } + executeGetRows = false; + } + //filter gets used after using entities.getRow and not in the loadconfig, since we can have multiple filters + //and don't want to do entities.getRow for every single one + filteredRecsObj[unparsedFilter] = JditoFilterUtils.filterRecords(pFilterFields, filterableRows, filter); + } + else //else: currently a count is made whith the filtercondition as the where clause --> poor performance + { + if (currentObjectType == "Organisation") + { + filteredRecsObj[unparsedFilter] = newSelect("CONTACT.CONTACTID") + .from("ORGANISATION") + .join("CONTACT", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null") + .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") + .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID") + .where(db.toFilterCondition(JSON.stringify(filter), "Organisation_entity")) + .and("ORGANISATION.ORGANISATIONID", OrgUtils.getPrivateOrganisationId(), SqlBuilder.NOT_EQUAL()) + .table(); + } + else if (currentObjectType == "Salesproject") + { + filteredRecsObj[unparsedFilter] = newSelect("SALESPROJECT.SALESPROJECTID") + .from("SALESPROJECT") + .leftJoin("CONTACT", "SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID") + .leftJoin("ORGANISATION", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID") + .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID") + .where(db.toFilterCondition(JSON.stringify(filter), "Salesproject_entity")) + .table(); + } + } + } + } + } + } + return filteredRecsObj; +}; + +/** +* Get's scoreArray and builds scoreObject, classificationTypesFilterObj and classificationTypesNoFilterObj and returns them in an object with their name as key<p><br> +* +* @param {SqlBuilderCondition}pCorrectCondition <p> +* condition of which classificationt storage datasets to get<br> +* +* @return {Object}gradingObject <p> +* gradingObject[objectType][classificationGroupId][classificationTypeId] = [minPercent, classificationGrading];<br> +*/ +ClassificationUpdateHelper._buildGradingObject = function(pCorrectCondition) +{ + //All the gradings of the classification groups that have either 1: atleast one classificationType with the outdated flag or 2: have classificationtypes + //of the objectTypes that we need for updating for the outdated classificationStorage (depends on the condition, see above) + var gradingArray = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, \n\ + CLASSIFICATIONGRADING.CLASSIFICATIONGRADINGID, CLASSIFICATIONGRADING.MINPERCENT, CLASSIFICATIONGRADING.GRADING") + .from("CLASSIFICATIONGROUP") + .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .where(pCorrectCondition) + .join("CLASSIFICATIONGRADING", "CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONGROUP.SORTING, \n\ + CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONGRADING.MINPERCENT asc") + .table(); + + let gradingObject = {}; + let helperObject = {}; //resets the helper object + + let objectType, classificationGroupId, classificationTypeId, minPercent, classificationGrading; + //logic from above applies here aswell + for (let element in gradingArray) + { + [objectType, classificationGroupId, classificationTypeId, minPercent, classificationGrading] = element; + if (!helperObject.hasOwnProperty(objectType)) //objectType + { + gradingObject[objectType] = {}; + helperObject[objectType] = ""; + } + if (!helperObject.hasOwnProperty(classificationGroupId)) //classificationGroup + { + gradingObject[objectType][classificationGroupId] = {}; + helperObject[classificationGroupId] = ""; + } + if (!helperObject.hasOwnProperty(classificationTypeId)) //classificationGrading + { + gradingObject[objectType][classificationGroupId][classificationTypeId] = [minPercent, classificationGrading]; //minPercent + helperObject[classificationTypeId] = ""; + } + } + return gradingObject; +}; + +/** +* Get's scoreArray and builds scoreObject, classificationTypesFilterObj and classificationTypesNoFilterObj and returns them in an object with their name as key<p><br> +* +* @param {Object}pCorrectCondition <p> +* condition of which classificationtypes to update<br> +* +* @param {Object}[pOutdatedStoredClassificationObjects] <p> +* return of ClassificationUpdateHelper._buildOutdatedStoredClassificationObject().<br> +* +* +* @return {Object} <p> +* If pSingleRefreshRowId is set: +* {"scoreObject": object +* , "scoreArray": array +* , "classificationTypesFilterObj": object +* , "classificationTypesNoFilterObj": object}<br> +*/ +ClassificationUpdateHelper._buildFilterAndNoFilterObj = function(pCorrectCondition, pOutdatedStoredClassificationObjects) +{ + let classificationTypesFilterObj = {}; + let classificationTypesNoFilterObj = {}; + //All the possible scores of 1: the outdated classification types or 2: of all the classificationtypes of the outdated classificationStorages + let scoreArray = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, \n\ + CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID, CLASSIFICATIONSCORE.SCOREPERCENT/100, CLASSIFICATIONTYPE.FILTER") + .from("CLASSIFICATIONGROUP") + .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .join("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") + .where(pCorrectCondition) + .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONGROUP.SORTING, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONSCORE.SORT") + .table(); + var helperObject = {}; + var objectTypes = []; + let objectType, classificationGroupId, classificationTypeId, classificationScoreId, classificationScore, classificationTypeFilter; + //build scoreObject out of scoreArray + for (let element in scoreArray) + { + [objectType, classificationGroupId, classificationTypeId, classificationScoreId, classificationScore, classificationTypeFilter] = element; + if (!helperObject.hasOwnProperty(objectType)) //objectType + { + helperObject[objectType] = ""; + if (!pOutdatedStoredClassificationObjects) + { + objectTypes.push(objectType); //also push all the objectTypes in an Array for later (the updating happens one objectType at a time) + } + + if (classificationTypesFilterObj[objectType] == undefined) + { + classificationTypesFilterObj[objectType] = {}; //initializing for later use + } + if (classificationTypesNoFilterObj[objectType] == undefined) + { + classificationTypesNoFilterObj[objectType] = {}; //initializing for later use + } + } + if (!helperObject.hasOwnProperty(classificationGroupId)) //classificationGroup + { + helperObject[classificationGroupId] = ""; + + if (classificationTypesFilterObj[objectType][classificationGroupId] == undefined) + { + classificationTypesFilterObj[objectType][classificationGroupId] = {}; //initializing + } + if (classificationTypesNoFilterObj[objectType][classificationGroupId] == undefined) + { + classificationTypesNoFilterObj[objectType][classificationGroupId] = {}; //initializing + } + } + if (!helperObject.hasOwnProperty(classificationTypeId)) //classificationType + { + helperObject[classificationTypeId] = ""; + + if (classificationTypeFilter == "" || classificationTypeFilter == JditoFilterUtils.getEmptyFilter(ContextUtils.getEntity(objectType))) //also push all the indicators that have a filter set into classificationTypesFilterObj + { + if (classificationTypesNoFilterObj[objectType][classificationGroupId][classificationTypeId] == undefined) + { + classificationTypesNoFilterObj[objectType][classificationGroupId][classificationTypeId] = classificationTypeFilter; + } + } + else //and the ones without a filter into classificationTypesNoFilterObj + { + if (classificationTypesFilterObj[objectType][classificationGroupId][classificationTypeId] == undefined) + { + classificationTypesFilterObj[objectType][classificationGroupId][classificationTypeId] = classificationTypeFilter; + } + } + } + } + return {"classificationTypesFilterObj": classificationTypesFilterObj + , "classificationTypesNoFilterObj": classificationTypesNoFilterObj}; +}; + +/** + * Builds and returns the following Objects/Arrays and retuns them in an Object with their names as keys: <p> + * classificationTypesFilterObj: object, <p> + * classificationTypesNoFilterObj: object, <p> + * objectTypesThatNeedUpdate: array, <p> + * groupsThatNeedUpdate: array, <p><br> + * + * @param {Boolean}[pRecalculateAll] <p> + * If set: handles all the classificationTypes as outdated -> returns all groups, objectTypes and classificationTypes<br> + * + * @param {Boolean}[pSingleRefreshRowId] <p> + * object row id of the dataset you want the classification for.<br> + * If set: returns null for all the objects. We don't need any classificationTypes, instead we are getting the classification + * using "ClassificationUpdateHelper._buildOutdatedStoredClassificationObject" as outdated so we are already updating it's + * classificationStorage dataset) + * + * + * @return {Object} <p> + * {classificationTypesFilterObj: object, <p> + * classificationTypesNoFilterObj: object, <p> + * objectTypesThatNeedUpdate: array, <p> + * groupsThatNeedUpdate: array, } + */ +ClassificationUpdateHelper._buildClassificationFilterObjects = function(pRecalculateAll, pSingleRefreshRowId) +{ + let outdatedGroupsAndObjectTypes; + if (pSingleRefreshRowId) + { + return {"classificationTypesFilterObj": null + ,"classificationTypesNoFilterObj": null + ,"objectTypesThatNeedUpdate": null + , "groupsThatNeedUpdate": null}; + } + else if (pRecalculateAll) + { + outdatedGroupsAndObjectTypes = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.FIELD, CLASSIFICATIONTYPE.FIELDTYPE, CLASSIFICATIONTYPE.INDICATORTYPE") + .from("CLASSIFICATIONTYPE") + .table(); + } + else //all classificationgroups and their objectType that have atleast one classificationtype with the outdated flag set + { + outdatedGroupsAndObjectTypes = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.FILTER, CLASSIFICATIONTYPE.FIELD, CLASSIFICATIONTYPE.FIELDTYPE, CLASSIFICATIONTYPE.INDICATORTYPE") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.OUTDATED", 1) + .table(); + } + + let objectTypesThatNeedUpdate = []; + let outdatedClassificationTypeObj = {}; + let classificationTypesFilterObj = {}; + let classificationTypesNoFilterObj = {}; + let groupsThatNeedUpdate = []; + var helperObject = {}; + let objectType, classificationGroupId, classificationTypeId, classificationTypeFilter, classificationTypeField, classificationTypeFieldType, classificationTypeIndicatorType; + for (let element in outdatedGroupsAndObjectTypes) + { + [objectType, classificationGroupId, classificationTypeId, classificationTypeFilter, classificationTypeField, classificationTypeFieldType, classificationTypeIndicatorType] = element; + if (!helperObject.hasOwnProperty(objectType)) //objectType + { + outdatedClassificationTypeObj[objectType] = {}; //puts objectType in classificationStorageObject and already initializes the object that later get's filled with the groups and their types + objectTypesThatNeedUpdate.push(objectType); + + classificationTypesFilterObj[objectType] = {}; //initializing for later use + classificationTypesNoFilterObj[objectType] = {}; //initializing for later use + + helperObject[objectType] = ""; + + } + if (!helperObject.hasOwnProperty(classificationGroupId)) //objectRowId + { + outdatedClassificationTypeObj[objectType][classificationGroupId] = {}; //same logic as before + groupsThatNeedUpdate.push(classificationGroupId); + + classificationTypesFilterObj[objectType][classificationGroupId] = {}; //initializing + classificationTypesNoFilterObj[objectType][classificationGroupId] = {}; //initializing + + helperObject[classificationGroupId] = ""; + } + if (!helperObject.hasOwnProperty(classificationTypeId)) //objectRowId + { + outdatedClassificationTypeObj[objectType][classificationGroupId][classificationTypeId] = {"classificationTypeFilter": classificationTypeFilter}; //same logic as before + + if (classificationTypeFilter == "" || classificationTypeFilter == JditoFilterUtils.getEmptyFilter(ContextUtils.getEntity(objectType))) //also push all the indicators that have no filter set into classificationTypesNoFilterObj + { + classificationTypesNoFilterObj[objectType][classificationGroupId][classificationTypeId] = {}; + classificationTypesNoFilterObj[objectType][classificationGroupId][classificationTypeId] = {"classificationTypeFilter": classificationTypeFilter + , "classificationTypeField": classificationTypeField + , "classificationTypeFieldType": classificationTypeFieldType + , "classificationTypeIndicatorType": classificationTypeIndicatorType}; + } + else //and the ones with a filter into classificationTypesFilterObj + { + classificationTypesFilterObj[objectType][classificationGroupId][classificationTypeId] = {}; + classificationTypesFilterObj[objectType][classificationGroupId][classificationTypeId] = {"classificationTypeFilter": classificationTypeFilter + , "classificationTypeField": classificationTypeField + , "classificationTypeFieldType": classificationTypeFieldType + , "classificationTypeIndicatorType": classificationTypeIndicatorType}; + } + + helperObject[classificationTypeId] = ""; + } + } + return {"classificationTypesFilterObj": classificationTypesFilterObj + ,"classificationTypesNoFilterObj": classificationTypesNoFilterObj + ,"objectTypesThatNeedUpdate": objectTypesThatNeedUpdate + , "groupsThatNeedUpdate": groupsThatNeedUpdate}; +}; + +/** + * Builds and returns the following Objects/Arrays and retuns them in an Object with their names as keys: <p> + * objectRowIdArray: array of ObjectRowIds <p> + * objectTypes: array of objectTypes<p> + * doneSelecting: boolean used to know when to stop (This function is used in a loop because it's only selecting a set amount of data (paging)<p><br> + * + * @param {Boolean}[pRecalculateAll] <p> + * If set: returns null for all the objects (instead we are getting all the classificationtypes + * using "ClassificationUpdateHelper._buildClassificationFilterObjects" as outdated so we are already updating all the + * classificationStorage datasets that exist)<br> + * + * @param {Boolean}[pSingleRefreshRowId] <p> + * object row id of the dataset you want the classification for.<br> + * If set: returns the object but with only it's object in there.<br> + * + * @param {Boolean}[pObjectType] <p> + * The Object type of the object row id. (Mandatory if pSingleRefreshRowId is set!)<br> + * This is normally just the Context name<br> + * + * @return {Object} <p> + * {objectRowIdArray: array, <p> + * objectTypes: array, <p> + * doneSelecting: boolean} + */ +ClassificationUpdateHelper._buildOutdatedStoredClassificationObject = function(pRecalculateAll, pSingleRefreshRowId, pObjectType) +{ + var doneSelecting = false; + if (pRecalculateAll) + { + return {"objectRowIdArray": null + , "objectTypes": null + , "doneSelecting": false}; + } + else + { + var outdatedStoredClassifications = []; + var objectTypes = []; + var objectRowIdArray = []; + + if (pSingleRefreshRowId) + { + outdatedStoredClassifications = newSelect("CLASSIFICATIONSTORAGE.OBJECT_TYPE, CLASSIFICATIONSTORAGE.OBJECT_ROWID") + .from("CLASSIFICATIONSTORAGE") + .where("CLASSIFICATIONSTORAGE.OBJECT_ROWID", pSingleRefreshRowId) + .orderBy("CLASSIFICATIONSTORAGE.OBJECT_TYPE, CLASSIFICATIONSTORAGE.OBJECT_ROWID") + .table(); + + if (outdatedStoredClassifications.length == 0) //insert the classificationString if none exists + { + let amountOfGroups = newSelect("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") + .from("CLASSIFICATIONTYPE") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", pObjectType) + .groupBy("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID").arrayColumn().length; + var newString = ""; + for (let i = 0; i < amountOfGroups; i++) + { + newString = newString + "-"; + } + outdatedStoredClassifications = [[pObjectType, pSingleRefreshRowId]]; + db.insertData("CLASSIFICATIONSTORAGE", ["CLASSIFICATIONSTORAGEID" + , "CLASSIFICATIONVALUE" + , "OBJECT_ROWID" + , "OBJECT_TYPE" + , "OUTDATED" + ], null, [util.getNewUUID() + , newString + , pSingleRefreshRowId + , pObjectType + , 1 + ]); + } + + } + else + { + outdatedStoredClassifications = newSelect("CLASSIFICATIONSTORAGE.OBJECT_TYPE, CLASSIFICATIONSTORAGE.OBJECT_ROWID") + .from("CLASSIFICATIONSTORAGE") + .where("CLASSIFICATIONSTORAGE.OUTDATED", 1) + .pageSize(400) + .orderBy("CLASSIFICATIONSTORAGE.OBJECT_TYPE, CLASSIFICATIONSTORAGE.OBJECT_ROWID") + .nextTablePage(); + } + + if (outdatedStoredClassifications.length != 5) + { + doneSelecting = true; + } + + let helperObject = {}; + if (outdatedStoredClassifications) + { + let objectType, objectRowId; + //build objectTypes out of outdatedStoredClassifications + for (let element in outdatedStoredClassifications) + { + [objectType, objectRowId] = element; + if (!helperObject.hasOwnProperty(objectType)) //objectType + { + helperObject[objectType] = ""; + objectTypes.push(objectType); //also push all the objectTypes in an Array for later (the updating happens one objectType at a time) + + } + if (!helperObject.hasOwnProperty(objectRowId)) //objectRowId + { + helperObject[objectRowId] = ""; + objectRowIdArray.push(objectRowId); //also push all the objectTypes in an Array for later + } + } + } + return {"objectRowIdArray": objectRowIdArray + , "objectTypes": objectTypes + , "doneSelecting": doneSelecting}; + } +}; + + +/** +* Adds pTableName to every column in pColumnArray (with a dot "." inbetween the tablename and the columnname)<p><br> +* +* @param {Array}pColumnArray <p> +* Array of columns<br> +* +* @param {String}pTableName <p> +* Name of the table you want to add<br> +* +* @return {Array} <p> +* pColumnArray with the added tablename for each element<br> +*/ +ClassificationUpdateHelper._addTablenameToColumns = function(pColumnArray, pTableName) +{ + let columnArray = Utils.clone(pColumnArray); + for (let i = 0; i < columnArray.length; i++) + { + columnArray[i] = pTableName + "." + columnArray[i]; + } + + return columnArray; +}; + +/** + * Checks whether or not the classificationType is relevant for the current dataset, + * (loops trough filteredRecsObj to check whether or not the filter excluded the dataset) + * returns true/false + * +* @param {Object}pUid <p> +* Uid of the dataset (needed, because pClassificationTypesFilter uses the objectUids<br> +* +* @param {String}pFilter <p> +* filter of the classification type dataset<br> +* +* @param {Object}pClassificationTypesFilter <p> +* Object with the filter as key and the uids of the included datasets as values. As built by ClassificationUpdateHelper._buildFilteredRecsObject()<br> +* +* +* @return {Boolean} <p> +* If relevant: true, else: false<br> +* +*/ +ClassificationUpdateHelper._isRelevantFilter = function(pUid, pFilter, pClassificationTypesFilter) +{ + var include = false; + var recs = pClassificationTypesFilter[pFilter]; + if (recs != undefined) + { + include = recs.some(function (rec) {return rec[0] == pUid}); + } + return include; +} + +/** + * Checks whether or not the classificationType is relevant for the current dataset + * (looping trough pClassificationTypesNoFilter if it's included there: no filter is set and it's relevant, + * othwerwises uses ClassificationUpdateHelper.ClassificationUpdateHelper._isRelevantFilter() to check whether or not it get's excluded by the set filter) + * returns true/false +* @param {Object}pTypeId <p> +* classification type id whose relevance is being checked<br> +* +* @param {Object}pUid <p> +* Uid of the dataset (needed, because pClassificationTypesFilter uses the objectUids<br> +* +* @param {String}pFilter <p> +* filter of the classification type dataset<br> +* +* @param {Object}pClassificationTypesFilter <p> +* Object with the filter as key and the uids of the included datasets as values. As built by ClassificationUpdateHelper._buildFilteredRecsObject()<br> +* +* @param {Object}pClassificationTypesNoFilter <p> +* Object with objectType, classificationgroup and it's classificationType Ids underneath. As built by ClassificationUpdateHelper._buildFilterAndNoFilterObj()<br> +* +* @param {String}pCurrentObjectType <p> +* object type (e.g: Organisation)<br> +* +* @return {Boolean} <p> +* If relevant: true, else: false<br> +* +*/ +ClassificationUpdateHelper._isRelevant = function(pTypeId, pUid, pFilter, pClassificationTypesFilter, pClassificationTypesNoFilter, pCurrentObjectType) +{ + var include = false; + + if (pFilter == "" || pFilter == undefined) + { + for (var groupId in pClassificationTypesNoFilter[pCurrentObjectType]) + { + for (var typeId in pClassificationTypesNoFilter[pCurrentObjectType][groupId]) + { + if (typeId == pTypeId) + { + include = true; + break; + } + } + } + } + else + { + include = ClassificationUpdateHelper._isRelevantFilter(pUid, pFilter, pClassificationTypesFilter); + } + return include; +}; + +/** +* Calculates the classifications for the parsed Object and updates them if needed.<p><br> +* +* @param {Object}[pClassificationObjects] <p> +* return of ClassificationUpdateHelper._buildClassificationFilterObjects()<br> +* +* @param {Object}[pOutdatedStoredClassificationObjects] <p> +* return of ClassificationUpdateHelper._buildOutdatedStoredClassificationObject().<br> +* +* @param {String}[pSingleRefreshRowId] <p> +* object row id of the dataset you want the classification for.<br> +* +* @param {String}[pOutputInfo] <p> +* The output Info as string, so we can concat the new on onto it.<br> +* +* +* @return {Object} <p> +* If pSingleRefreshRowId is set: +* {"achievedScoresObject": object +* , "indicatorObj": object +* , "orderedGroups": array +* , "newGradingString": String}<br> +* else: +* {"outputInfo": object} +* +*/ +ClassificationUpdateHelper._updateOutdatedDatasets = function(pClassificationObjects, pOutdatedStoredClassificationObjects, pSingleRefreshRowId, pOutputInfo) +{ + var correctCondition; + var objectTypes = []; + if (pClassificationObjects) //if the param exists: assign values accordingly + { + var classificationTypesFilterObj = pClassificationObjects["classificationTypesFilterObj"]; + var classificationTypesNoFilterObj = pClassificationObjects["classificationTypesNoFilterObj"]; + var objectTypesThatNeedUpdate = pClassificationObjects["objectTypesThatNeedUpdate"]; + var groupsThatNeedUpdate = pClassificationObjects["groupsThatNeedUpdate"]; + + objectTypes = objectTypesThatNeedUpdate; + + + correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN());//and set condition accordingly + } + else if (pOutdatedStoredClassificationObjects) //if the param exists: assign values accordingly + { + var objectRowIdArray = pOutdatedStoredClassificationObjects["objectRowIdArray"]; + objectTypes = pOutdatedStoredClassificationObjects["objectTypes"]; + correctCondition = newWhere("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypes, SqlBuilder.IN());//and set condition accordingly + } + + var filterObjects = ClassificationUpdateHelper._buildFilterAndNoFilterObj(correctCondition, pOutdatedStoredClassificationObjects); + + classificationTypesNoFilterObj = filterObjects["classificationTypesNoFilterObj"]; + classificationTypesFilterObj = filterObjects["classificationTypesFilterObj"]; + + if (!pOutdatedStoredClassificationObjects) + { + correctCondition = newWhere("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypesThatNeedUpdate, SqlBuilder.IN()); + } + + var gradingObject = ClassificationUpdateHelper._buildGradingObject(correctCondition); + + if (!pOutdatedStoredClassificationObjects) //Important to do this after ClassificationUpdateHelper._buildGradingObject! + { + correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()); + } + + var outputInformation = {}; + var fieldDisplayObject = {}; + + for (var currentObjectType in objectTypes) //update for each objectType + { + var isOrganisation = false; + var currentObjectTable; + var currentObjectColumn; + if (objectTypes[currentObjectType] == "Organisation") + { + currentObjectTable = "CONTACT"; + currentObjectColumn = "CONTACT.CONTACTID"; + isOrganisation = true; + } + else + { + currentObjectTable = objectTypes[currentObjectType]; + currentObjectColumn = objectTypes[currentObjectType] + "." + objectTypes[currentObjectType] +"ID"; + } + + outputInformation[objectTypes[currentObjectType]] = { + updatedElements: 0, + nonChangedElements: 0 + }; + + var filterFields = []; + if (isOrganisation) + { + filterFields = ["CONTACTID", "CUSTOMERCODE", "INFO", "LANGUAGE", "NAME", "STANDARD_CITY", "STANDARD_EMAIL_COMMUNICATION", "STANDARD_PHONE_COMMUNICATION", "STATUS", "TYPE"]; + } + else if (currentObjectTable == "Salesproject") + { + filterFields = ["SALESPROJECTID", "CONTACT_ID", "ENDDATE", "INFO", "PHASE", "PROBABILITY", "PROJECTCODE", "PROJECTTITLE", "REASONS", "STARTDATE", "STATUS", "VOLUME"]; + } + else + { + throw new Error("updateClassifications_serverProcess: objectType doesn't exist or is not implemented correctly, contact an administrator."); + } + + //get an two dimensional array with all the values and displayvalues and store it in fieldDisplayObject with the objectType as key: + //e.g: {"Organisation":[["STATUS","Status"],["TYPE","Typ"],["eyJpZCI6IjU0N2I4YjlkLTg4YmEtNDU5MC05ZTAxLTM0ZDJhNTgxMTZjYyIsInR5cGUiOiJDT01CTyJ9","Besuchsplanung / Besuchsfrequenz"]...]} + fieldDisplayObject[objectTypes[currentObjectType]] = ClassificationUtils.getEntityFields(objectTypes[currentObjectType]) + .concat(ClassificationUtils.getEntityAttributesArray(ClassificationUtils.getEntityAttributes(objectTypes[currentObjectType]))) + .concat(ClassificationComplexIndicatorRegistryUtils.getComplexIndicatorArray(objectTypes[currentObjectType])); + + //private function for code readability (get's called once for every objectType) + var filteredRecsObj = ClassificationUpdateHelper._buildFilteredRecsObject(classificationTypesFilterObj, objectTypes[currentObjectType], filterFields); + + + //all groups of the objectType in the correct order, needed later to also add the "-" gradings if no classificationType has been set under that group + orderedGroups = newSelect("distinct CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.SORTING") + .from("CLASSIFICATIONGROUP") + .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypes[currentObjectType]) + .orderBy("CLASSIFICATIONGROUP.SORTING") + .table(); + + if (pSingleRefreshRowId) + { + correctCondition = newWhere(currentObjectColumn, pSingleRefreshRowId); + } + else if (pOutdatedStoredClassificationObjects) + { + correctCondition = newWhere(currentObjectColumn, objectRowIdArray, SqlBuilder.IN()); + } + else + { + correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()); + } + + //get Columns + var objectColumns = db.getColumns(String.toUpperCase(objectTypes[currentObjectType]), db.getCurrentAlias()); + //add tablename + var objectColumnsWithTablename = ClassificationUpdateHelper._addTablenameToColumns(objectColumns, String.toUpperCase(objectTypes[currentObjectType])); + + if (isOrganisation) + { + //get Columns + var contactColumns = db.getColumns(String.toUpperCase("CONTACT"), db.getCurrentAlias()); + //add tablename + objectColumnsWithTablename = objectColumnsWithTablename.concat(ClassificationUpdateHelper._addTablenameToColumns(contactColumns, "CONTACT")); + } + + var indicatorObj = ClassificationUpdateHelper._buildindicatorObj(objectTypes[currentObjectType]); + + var startRow = 0; + var stop = false; + var entityFields = ClassificationUpdateHelper._getEntityFields(objectTypes[currentObjectType]); + + var orderedGroups = newSelect("distinct CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.SORTING") + .from("CLASSIFICATIONGROUP") + .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") + .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypes[currentObjectType]) + .orderBy("CLASSIFICATIONGROUP.SORTING") + .table(); + + var achievedScoresObject = {}; + var pagingSize = 400;//in variable so there is only one place to edit + //page entities.getRows instead of getting all at once + while(!stop) + { + var objectValuesLoadConfig = entities.createConfigForLoadingRows() + .fields(entityFields) + .ignorePermissions(true) + .entity(ContextUtils.getEntity(objectTypes[currentObjectType])); + if (objectRowIdArray && !pSingleRefreshRowId)//objectRowIdArray is already paged + { + objectValuesLoadConfig = objectValuesLoadConfig.uids(objectRowIdArray); + stop = true; + } + else + { + objectValuesLoadConfig = objectValuesLoadConfig + .startrow(startRow) + .count(pagingSize); + + if (pSingleRefreshRowId) + { + objectValuesLoadConfig = objectValuesLoadConfig.uid(pSingleRefreshRowId); + } + } + var rows = entities.getRows(objectValuesLoadConfig); + + if (rows.length == pagingSize) + { + startRow = eMath.addInt(startRow, pagingSize); + } + else + { + stop = true; + } + //helper Function for better code-readability + var processValues = ClassificationUpdateHelper._processObjectValuesBatchFn(rows, indicatorObj, achievedScoresObject, gradingObject[objectTypes[currentObjectType]], orderedGroups, objectTypes[currentObjectType], outputInformation, fieldDisplayObject, filteredRecsObj, classificationTypesNoFilterObj); + achievedScoresObject = processValues["achievedScoresObject"]; + outputInformation = processValues["outputInformation"]; + + if (pSingleRefreshRowId) + { + return {"achievedScoresObject": achievedScoresObject + , "indicatorObj": indicatorObj + , "orderedGroups": orderedGroups + , "newGradingString": processValues["newGradingString"]}; + } + } + } + + var outputInfo = pOutputInfo + JSON.stringify(outputInformation) + "\n"; + + if (groupsThatNeedUpdate) + { + var cond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()); + cond.updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [0]); + } + return {"outputInfo": outputInfo}; +}; \ No newline at end of file diff --git a/process/Classification_lib/process.js b/process/Classification_lib/process.js index 25419ec3b80a5f2d41f83626ad8c6d50cfb1d8cf..db81046fd76e0b880f2b589d5e09f7790f10bef2 100644 --- a/process/Classification_lib/process.js +++ b/process/Classification_lib/process.js @@ -1,14 +1,14 @@ +import("ClassificationIndicatorFieldRegistry_basic"); +import("AttributeFilter_lib"); +import("Attribute_lib"); import("Dependency_lib"); +import("Sql_lib"); +import("system.db"); +import("system.neon"); import("system.text"); import("system.translate"); -import("system.result"); -import("system.entities"); -import("system.eMath"); import("system.util"); import("system.vars"); -import("system.db"); -import("Sql_lib"); -import("Util_lib"); /** * Methods to manage classifications.<br> @@ -20,25 +20,23 @@ function ClassificationUtils() {} /** * Formats the summary title for one specific group <br/> - * This is done by + * e.g: "1. Target Group: 45/120 points = B" + * so: groupName: achievedPoints/possibleMaxPoints points = gradingChar * * @param {Number|String} pAchievedScore <p/>Current score that is reached for a group, e.g. 45 - * @param {Number|String} pbestPossibleScore <p/>Current score that is reached for a group, e.g. 45 - * @param {String} pGroupId <p/>UID of the classification group where the display value is determined. <br/> - * This is used for determing the maximum value of the group and the resulting - * classificaiton value (for example: "B") + * @param {Number|String} pBestPossibleScore <p/>Current score that is reached for a group, e.g. 45 * @param {String} pGroupName <p/>Name of the group that was passed as ID. This is used as display value and will not be translated, * you have to pass this value already translated to the target locale. <br/> * The reason for not loading this value based on the groupId is: better performance optimization * @param {Number|String} pGrading <p/>Current score that is reached for a group, e.g. 45 * @return {String} <p/>formated and translated title, e.g.: "1. Target Group: 45/120 points = B" */ -ClassificationUtils.formatDisplaySummaryForGroup = function(pAchievedScore, pbestPossibleScore, pGroupId, pGroupName, pGrading) +ClassificationUtils.formatDisplaySummaryForGroup = function(pAchievedScore, pBestPossibleScore, pGroupName, pGrading) { pCurrentScore = text.formatDouble(pAchievedScore, "#"); - pbestPossibleScore = text.formatDouble(pbestPossibleScore, "#"); - var res = translate.withArguments("%0: %1/%2 points = %3", [pGroupName, pAchievedScore, pbestPossibleScore, pGrading]); + pBestPossibleScore = text.formatDouble(pBestPossibleScore, "#"); + var res = translate.withArguments("%0: %1/%2 points = %3", [pGroupName, pAchievedScore, pBestPossibleScore, pGrading]); return res; }; @@ -108,8 +106,10 @@ ClassificationUtils.getGradingTableByGroupId = function(pClassificationGroupId) for (let i = 0; i < gradingTable.length; i++) { - if(gradingObject[classificationGroupId] == undefined) + if (gradingObject[classificationGroupId] == undefined) + { gradingObject[classificationGroupId] = []; + } gradingObject[classificationGroupId].push([gradingTable[i][1], gradingTable[i][2]]); } @@ -169,7 +169,7 @@ ClassificationUtils.getClassificationType = function(pClassificationScoreId) ClassificationUtils.getGradingFromObject = function(pGradingObject, pGroupId, pScore, pMaxPossibleScore) { var gradingObject = pGradingObject; - if(gradingObject == null) + if (gradingObject == null) { gradingObject = ClassificationUtils.getGradingTableByGroupId(pGroupId); } @@ -179,7 +179,7 @@ ClassificationUtils.getGradingFromObject = function(pGradingObject, pGroupId, pS var grading = "-"; for (var index in gradingObject[groupId]) { - if(Number(scorePercent) >= Number(gradingObject[groupId][index][0]) && scorePercent != 0) + if (Number(scorePercent) >= Number(gradingObject[groupId][index][0]) && scorePercent != 0) { grading = gradingObject[groupId][index][1]; } @@ -187,78 +187,8 @@ ClassificationUtils.getGradingFromObject = function(pGradingObject, pGroupId, pS return grading; } - -/** - * decodes a string that was encoded with AttributeSearchNameCoder.encode - * - * - * @param {String} pEncodedString <p/> string that shall be decoded; the origin of the name has to be a filter-object - * - * @return {Object} <p/> an object that contains all keys and values that have been encoded with AttributeSearchNameCoder.encode - * @static - */ -ClassificationUtils.decode = function (pEncodedString) -{ - var value = pEncodedString; - if(value == undefined) - res = $ClassificationRecordCategories.CLASSIFICATION_OBJECT_TYPE; - else if(value.charAt(0) != ";" && value.charAt(value.length) != ";") - res = $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_GROUP(); - else - { - var decodedIdvalues = text.decodeMS(value); - if(decodedIdvalues[0].charAt(0) != ";" && decodedIdvalues[0].charAt(decodedIdvalues[0].length) != ";") - res = $ClassificationRecordCategories.CLASSIFICATION_CLASSIFICATION_TYPE(); - } - if(res) - result.string(res); - return res -}; - -/** - * gets the translated Info text for the ClassificationtypePreview - * - * @return {String} <p/> the translated InfoText - * @static - */ -ClassificationUtils.getTranslatedInfo = function () -{ -return translate.text("Keep in Mind that changes to the Value with the greatest score directly affect the Classification Gradings of the Classification!"); -}; - -/** - * Gets all the ClassificationTypeIds of the specified group - * - * - * @param {String} pClassificationGroupId <p/> The groupId of the group you want the classificationTypes of - * @param {String} pExcludeClassificationTypeID (optional) <p/> Array of ClassificatioNTypeId you don't want to get back - * @param {Boolean} pOnlyUptoDate (optional) <p/> if true = condition get's added to only return the types where outdated != 1 - * - * @return {Object} <p/> an object that contains all keys and values that have been encoded with AttributeSearchNameCoder.encode - * @static - */ -ClassificationUtils.getClassificationTypesOfGroup = function (pClassificationGroupId, pExcludeClassificationTypeID, pOnlyUptoDate) -{ - var classificationTypesOfOldGroup = newSelect("CLASSIFICATIONTYPEID") - .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", pClassificationGroupId) - - if (pExcludeClassificationTypeID != null) - { - classificationTypesOfOldGroup = classificationTypesOfOldGroup - .and("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", pExcludeClassificationTypeID, SqlBuilder.NOT_EQUAL()) - } - if (pOnlyUptoDate) - { - classificationTypesOfOldGroup = classificationTypesOfOldGroup - .and("CLASSIFICATIONTYPE.OUTDATED", 1, SqlBuilder.NOT_EQUAL()) - } - - return classificationTypesOfOldGroup.arrayColumn(); -}; - /** - * This function get's used in the workflowExtention_serverProcess. + * This function is used in the workflowExtention_serverProcess. * It checks whether or not the change has any influence on stored classificationStorage datasets * by checking if the entity itself is classificationRelevant or the entity has an relation with an classificationRelevant entity * <p/> @@ -279,17 +209,17 @@ ClassificationUtils.setClassificationStorageDatasetsOutdated = function (pTarget var classificationStorageIds = []; var entityName = pEntityName; - if(entityName == "Organisation_entity" || entityName == "Salesproject_entity") + if (entityName == "Organisation_entity" || entityName == "Salesproject_entity") { relevantForClassification = true; classificationStorageIds.push(pTargetIds); } - if(Dependency.getDependency(entityName).includes("Organisation_entity")) + if (Dependency.getDependency(entityName).includes("Organisation_entity")) { relevantForClassification = true; classificationStorageIds.push(Dependency.mapping()[entityName]["Organisation_entity"].getUIDsfn(pRowData, pChangedRows)); } - if(Dependency.getDependency(entityName).includes("Salesproject_entity")) + if (Dependency.getDependency(entityName).includes("Salesproject_entity")) { relevantForClassification = true; classificationStorageIds.push(Dependency.mapping()[entityName]["Salesproject_entity"].getUIDsfn(pRowData, pChangedRows)); @@ -299,7 +229,7 @@ ClassificationUtils.setClassificationStorageDatasetsOutdated = function (pTarget //empty arrays occur when e.g. inserting something that doesn't have any classificationStorageIds even though it is classificationrelevant for (let i = 0; i < classificationStorageIds.length; i++) { - if(classificationStorageIds[i][0] == undefined) + if (classificationStorageIds[i][0] == undefined) { classificationStorageIds.splice(i, 1); i--; @@ -307,9 +237,9 @@ ClassificationUtils.setClassificationStorageDatasetsOutdated = function (pTarget } //set outdated flag for the classificationStorage datasets - if(relevantForClassification && classificationStorageIds.length > 0) // also check for the classificationStorageIds.length since it could be empty + if (relevantForClassification && classificationStorageIds.length > 0) // also check for the classificationStorageIds.length since it could be empty { - for (i = 0; i < classificationStorageIds.length; i++) + for (let i = 0; i < classificationStorageIds.length; i++) { var cond = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", classificationStorageIds[i], SqlBuilder.IN()); cond.updateData(true, "CLASSIFICATIONSTORAGE", ["OUTDATED"], null, [1]); @@ -317,9 +247,135 @@ ClassificationUtils.setClassificationStorageDatasetsOutdated = function (pTarget } }; +/** + * This function is used in the FIELD.dropDownProcess in ClassificationAdmin. + * Concats and reruns the entityfields specified in $ClassificationIndicatorRegistry.getEntityNumberFields(), $ClassificationIndicatorRegistry.getEntityDropDownFields() + * <p/> + * @param {Object} pObjectType <p/> object type we want the fields for + * + * @return {Array} Array with array of [[value], [displayvalue]] (like in a dropdownproess) + */ +ClassificationUtils.getEntityFields = function (pObjectType) +{ + var entityNumberFields = $ClassificationIndicatorRegistry.getEntityNumberFields(pObjectType); + var entityDropDownFields = $ClassificationIndicatorRegistry.getEntityDropDownFields(pObjectType); + var res = entityNumberFields.concat(entityDropDownFields); + + return res; +}; +/** + * Returns the entity dropdown fields of pObjectType + * <p/> + * @param {Array[][]} pFields <p/> two dimensional Array with key and displayvalue + * @param {String} pKey <p/> key we want the displayvalue for + * + * @return {String} displayvalue, empty string if pKey isn't included in pFields + */ +ClassificationUtils.getFieldDisplayValue = function (pFields, pKey) +{ + for (let i = 0; i < pFields.length; i++) + { + if (pFields[i][0] == pKey) + { + return pFields[i][1]; + } + } + return ""; +} + +/** + * Returns the attribute dropdown, number and integer fields of pObjectType using AttributeFilterExtensionMaker.makeFilterFields(pObjectType) and checking for their contentType + * <p/> + * @param {Object} pObjectType <p/> object type we want the Attributes for + * + * @return {Array} Array with Objects for each attribute (see also AttributeFilterExtensionMaker.makeFilterFields()) + */ +ClassificationUtils.getEntityAttributes = function (pObjectType) +{ + let attributeFields = JSON.parse(AttributeFilterExtensionMaker.makeFilterFields(pObjectType)); + for (i = 0; i < attributeFields.length; i++) + { + if (!(attributeFields[i]["contentType"] == AttributeTypes.TEXT() && attributeFields[i]["hasDropDownValues"] === true) + && !(attributeFields[i]["contentType"] == AttributeTypes.BOOLEAN()) + && !(attributeFields[i]["contentType"] == AttributeTypes.COMBO()) + && !(attributeFields[i]["contentType"] == AttributeTypes.KEYWORD()) + && !(attributeFields[i]["contentType"] == AttributeTypes.NUMBER()) + && !(attributeFields[i]["contentType"] == AttributeTypes.INTEGER())) + { + attributeFields.splice(i, 1); + i--; + } + } + return attributeFields; +}; +/** + * This function is used in the FIELD.dropDownProcess in ClassificationAdmin. + * Turns the object array that ClassificationUtils.getEntityAttributes() returns into a useable twodimensional Array + * <p/> + * @param {Object} pAttributeFilterFields <p/> object you get from ClassificationUtils.getEntityAttributes() + * + * @return {Array} Array with array of [[value], [displayvalue]] (like in a dropdownproess) + */ +ClassificationUtils.getEntityAttributesArray = function (pAttributeFilterFields) +{ + var attributeFields = pAttributeFilterFields; + var resArray = []; + for (i = 0; i < attributeFields.length; i++) + { + resArray.push([attributeFields[i]["name"], attributeFields[i]["title"]]); + } + + return resArray; +}; + +/** + * This function is used in the stateprocess of multiple fields of classificationScore_entity + * We check if the pFieldTypes includes the one we have in pClassificationTypeInfo and set the recordstate according to the current pRecordState + * <p/> + * @param {String} pRecordState <p/> the record state as in the $sys.recordState-variable; e.g. neon.OPERATINGSTATE_NEW + * + * @param {Array} pFieldTypes <p/> the field types + * + * @param {Object} pClassificationTypeInfo <p/> classification type info (object with field, fieldType and IndicatorType) (JSON.parse(vars.getString("$param.ClassificationTypeInfo_param"))) + * + * @param {Array} [pIndicatorTypes] <p/> the indicator types (see also $ClassificationIndicatorTypes) + * + * @param {Object} [pFilterValue] <p/> filter value (only needed for displayValueForTitleField) + * + * @return {String} resulting recordState<br/> + */ +ClassificationUtils.getClassificationScoreStateProcess = function (pRecordState, pFieldTypes, pClassificationTypeInfo, pIndicatorTypes, pFilterValue) +{ + var state = neon.COMPONENTSTATE_INVISIBLE; + if (!pFieldTypes)//special case for displayValueForTitleField + { + state = neon.COMPONENTSTATE_INVISIBLE; + if (pRecordState == neon.OPERATINGSTATE_VIEW + || ((pRecordState == neon.OPERATINGSTATE_NEW || pRecordState == neon.OPERATINGSTATE_EDIT) + && pFilterValue && JSON.parse(filterValue)["filter"]["childs"].length > 0)) + { + state = neon.COMPONENTSTATE_READONLY; + } + return state; + } + + var fieldType = pClassificationTypeInfo["fieldType"]; + var indicatorType = pClassificationTypeInfo["indicatorType"]; + + if (pRecordState == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + { + if (pFieldTypes.includes(fieldType) && (!pIndicatorTypes || pIndicatorTypes.length == 0 || pIndicatorTypes.includes(indicatorType))) + { + state = neon.COMPONENTSTATE_EDITABLE; + } + } + + return state; +}; + /*this is right now (2020-08-15) the only way to get something like a constant with - a prober name - autocomplete support within the ADITO Designer @@ -333,4 +389,15 @@ $ClassificationRecordCategories.CLASSIFICATION_GROUP_EXISTS = functio $ClassificationRecordCategories.CLASSIFICATION_GROUP_DOESNT_EXIST = function(){return "ClassificationGroupDoesntExist"}; function $ClassificationPlaceholder(){} -$ClassificationPlaceholder.TOPSECRETPLACEHOLDER = function(){return "T0PS3CR3TPL4CEH0LD3R"}; \ No newline at end of file +$ClassificationPlaceholder.TOPSECRETPLACEHOLDER = function(){return "T0PS3CR3TPL4CEH0LD3R"}; + +function $ClassificationFieldTypes(){} +$ClassificationFieldTypes.NUMBER = function(){return "number"}; +$ClassificationFieldTypes.INTEGER = function(){return "integer"}; +$ClassificationFieldTypes.DROPDOWN = function(){return "dropDown"}; +$ClassificationFieldTypes.DATE = function(){return "date"}; + +function $ClassificationIndicatorTypes(){} +$ClassificationIndicatorTypes.ENTITYFIELD = function(){return "entityField"}; +$ClassificationIndicatorTypes.ATTRIBUTE = function(){return "attribute"}; +$ClassificationIndicatorTypes.COMPLEX = function(){return "complex"}; \ No newline at end of file diff --git a/process/updateClassifications_serverProcess/documentation.adoc b/process/updateClassifications_serverProcess/documentation.adoc index fd053e82fca0a65c6687ffaf4ee013100dc5fcad..67d5c667ce67aa86e74466822229273c7865d8b2 100644 --- a/process/updateClassifications_serverProcess/documentation.adoc +++ b/process/updateClassifications_serverProcess/documentation.adoc @@ -1,8 +1,10 @@ = updateClassifications_serverProcess -For updating the values of CLASSIFICATIONSTORAGE and the persistent data stored in CLASSIFICATION. +see also(ClassificationUtils.executeUpdating) + +For updating the values of CLASSIFICATIONSTORAGE. Should probably run in intervals (like once a week) to update all outdated data, -but the user can also start it manually via an action at the Classification Admin Context. +but the user can also start it manually via two actions at the Classification Admin Context. We are storing the strings of the achieved classifications (e.g. "ACD") in ClassificationStorage. Every time we change something for of an classification relevant object (which has an ClassificationStorage dataset) or an linked object with an @@ -13,10 +15,12 @@ The classificationType datasets also have an outdated flag get set for changes i This Process now updates both of these: First it checks whether outdated classificationStorages and outdated classificationTypes exist -and always updates the classificationStorages first before updating the for the classificationTypes. +and always updates the classificationStorages first before updating the for the outdated classificationTypes. -In the classificationStorage runtrough it calculates the complete classification for every outdated classificationStorage, entirely - from scratch (and inserts "new" relevant ones), and updates both the classificationStorage dataset aswell as the classification datasets --In the classificationType runtrough it also updates both the classificationStorage dataset aswell as the classification datasets but + from scratch and updates the classificationStorage +-In the classificationType runtrough it also updates the classificationStorage dataset -for every object of said object_type - -only recalculates the flagged ones and relies on the already stored values of the not flagged classificationTypes (and inserts "new" relevant ones) \ No newline at end of file + -only recalculates the flagged ones and relies on the already stored values of the not flagged classificationTypes if they are from another classificationGroup + +There is also another action that starts this process with the recalculateAll_param set to true: now the outdated flag is being ignored and all classificationtypes as outdated (only one runtrough needed) diff --git a/process/updateClassifications_serverProcess/process.js b/process/updateClassifications_serverProcess/process.js index 5777f187a61715e11b00e6f4e3edc2e14cd7fa1b..237a3c92b9ee0454a3744247f209f5b192ae2275 100644 --- a/process/updateClassifications_serverProcess/process.js +++ b/process/updateClassifications_serverProcess/process.js @@ -1,947 +1,17 @@ +import("ClassificationUpdate_lib"); import("system.vars"); -import("Context_lib"); -import("system.util"); -import("Util_lib"); -import("JditoFilter_lib"); -import("system.entities"); -import("system.logging"); -import("Classification_lib"); -import("Sql_lib"); -import("Organisation_lib"); -import("system.db"); -import("system.eMath"); -var outputInformation = {};//information how much data has been modified -var outputInfo = "updateClassifications_serverProcess output is:\n"; - -var helperObject = {}; //used to check whether or not the data has already been added -//object to store all the gradings of the classification groups that have either 1: atleast one classificationType with the outdated flag or -//2: have classificationtypes of the object_types that we need for updating for the outdated classificationStorage -var gradingObject = {}; -var scoreObject = {}; //object to store all the classificationScores (with the same logic as above) -var classificationTypesFilterObj = {}; //object to store all the classificationTypes with filters (logic from above) -var classificationTypesNoFilterObj = {}; //object to store all the classificationTypes without filters (logic from above) -var bestPossibleScoresObj = {}; //object to store all the best possible scores of classificationTypes (logic from above) -var bestPossibleScoresGroupObj = {}; //object to store all the best possible scores of classificationGroups of datasets (logic from above) -var achievedScoresObj = {}; //object to store all the achieved classificationscores of the classificationgroups (logic from above) (achievedScoresObj[objId][groupId][Score, Grade]) -var achievedScoresTypeObj = {}; //object to store all the achieved classifications (logic from above) (achievedScoresTypeObj[objId][groupId][classificationTypeId][int]) -var staticClassificationsObject = {}; //object to store all the classificationTypes none of the classificationtypes has the outdated flag set (onlyn eeded when storedClassificationFlag == 0, see below) -var classificationStorageObject = {}; //object to store the classificationstorageStrings (e.g: "ACD") -var groupObject = {}; //groupObject is another helper object to store all the groupIds -var outdatedClassificationTypeObj = {};//object to store all outdated classificationtypes (need so we can add empty persisted data later -var alreadyUpdatedTypesObj = {}; -var storedClassificationValues = {}; - -//arrays mainly used for filling the objects -var objectTypes = []; -var orderedGroups = []; -var bestPossibleScoresArray = []; -var classificationStorageArray = []; -var groupsThatNeedUpdate = []; -var outdatedGroupsAndObjectTypes = []; -var gradingArray = []; -var scoreArray = []; -var objectTypesThatNeedUpdate = []; -var outdatedStoredClassifications = []; -var objectRowIdArray = []; -var objectsThatWillBeUpdated = []; - -var object_type, classificationGroupId, classificationTypeId, classificationScoreId, classificationScore, classificationGradingId, score, cond, -classificationGradingMaxScore, classificationGrading, chainedGrading, currentObjectColumn, currentObjectTable, isOrganisation, bestValue, minPercent, -idsWithoutStoredClassification, classificationScorePercent, classificationScoreSaved, classificationScoreTitle, i, ii, iii, deleteCond, count, -achievedScoresStmt, position, bestPossibleScoreStmt, storedClassificationFlag, deleted, uid; -var table = "CLASSIFICATIONSTORAGE"; -var column = ["CLASSIFICATIONVALUE"]; -var runUpdating = 0; var singleRefresh = false; var recalculateAll = false; +var objectType_param; if(vars.exists("$local.refreshSingleRecord_param") && vars.get("$local.refreshSingleRecord_param")) { singleRefresh = vars.get("$local.refreshSingleRecord_param"); + objectType_param = vars.get("$local.ObjectType_param"); } else if(vars.exists("$local.recalculateAll_param") && vars.get("$local.recalculateAll_param")) { recalculateAll = vars.get("$local.recalculateAll_param"); } - - -if(singleRefresh) -{ - outdatedGroupsAndObjectTypes = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.FILTER") - .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", vars.get("$local.ObjectType_param")) - .table(); -} -else if(recalculateAll) -{ - outdatedGroupsAndObjectTypes = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.FILTER") - .from("CLASSIFICATIONTYPE") - .table(); -} -else //all classificationgroups and their object_type that have atleast one classificationtype with the outdated flag set -{ - outdatedGroupsAndObjectTypes = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, CLASSIFICATIONTYPE.FILTER") - .from("CLASSIFICATIONTYPE") - .where("CLASSIFICATIONTYPE.OUTDATED", 1) - .table(); -} - -objectTypesThatNeedUpdate = []; -for (i = 0; i < outdatedGroupsAndObjectTypes.length; i++) -{ - [object_type, classificationGroupId, classificationTypeId, classificationTypeFilter] = outdatedGroupsAndObjectTypes[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - outdatedClassificationTypeObj[object_type] = {}; //puts objectType in classificationStorageObject and already initializes the object that later get's filled with the groups and their types - objectTypesThatNeedUpdate.push(object_type) - - classificationTypesFilterObj[object_type] = {}; //initializing for later use - classificationTypesNoFilterObj[object_type] = {}; //initializing for later use - - helperObject[object_type] = ""; - - } - if(!helperObject.hasOwnProperty(classificationGroupId)) //objectRowId - { - outdatedClassificationTypeObj[object_type][classificationGroupId] = {}; //same logic as before - groupsThatNeedUpdate.push(classificationGroupId) - - classificationTypesFilterObj[object_type][classificationGroupId] = {}; //initializing - classificationTypesNoFilterObj[object_type][classificationGroupId] = {}; //initializing - - helperObject[classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(classificationTypeId)) //objectRowId - { - outdatedClassificationTypeObj[object_type][classificationGroupId][classificationTypeId] = {"classificationTypeFilter": classificationTypeFilter}; //same logic as before - - if(classificationTypeFilter == "" || classificationTypeFilter == JditoFilterUtils.getEmptyFilter(ContextUtils.getEntity(object_type))) //also push all the indicators that have a filter set into classificationTypesFilterObj - classificationTypesNoFilterObj[object_type][classificationGroupId][classificationTypeId] = classificationTypeFilter; - else //and the ones without a filter into classificationTypesNoFilterObj - classificationTypesFilterObj[object_type][classificationGroupId][classificationTypeId] = classificationTypeFilter; - - helperObject[classificationTypeId] = ""; - } -} -if(!singleRefresh) -{ - if(recalculateAll) - { - outdatedStoredClassifications = newSelect("CLASSIFICATION.OBJECT_TYPE, CLASSIFICATION.OBJECT_ROWID\n\ - ,"+ SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID is null")) - .then("''") - .elseValue("CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID") - .toString()+ "\n\ - ,"+ SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE is null")) - .then("''") - .elseValue("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE") - .toString()+ - ", CLASSIFICATION.CLASSIFICATIONTYPE_ID, CLASSIFICATION.VALUE, CLASSIFICATION.SCOREPOINTS") - .from("CLASSIFICATION") - .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CLASSIFICATION.OBJECT_ROWID") - .orderBy("CLASSIFICATION.OBJECT_TYPE, CLASSIFICATION.OBJECT_ROWID") - .table(); - } - else - { - //object_type, object_rowId, classificationstorageId and the classificationstring (e.g. "ACB") of the classificationStorage datasets that habe the outdated flag set - outdatedStoredClassifications = newSelect("CLASSIFICATIONSTORAGE.OBJECT_TYPE, CLASSIFICATIONSTORAGE.OBJECT_ROWID, \n\ - CLASSIFICATIONSTORAGE.CLASSIFICATIONSTORAGEID, CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE") - .from("CLASSIFICATIONSTORAGE") - .where("CLASSIFICATIONSTORAGE.OUTDATED", 1) - .orderBy("OBJECT_TYPE") - .table(); - } - - var storedClassificationStorageValues = {}; - if(recalculateAll) - { - let storedValuesArray = newSelect("CLASSIFICATIONSTORAGE.OBJECT_ROWID") - .from("CLASSIFICATIONSTORAGE") - .arrayColumn(); - storedValuesArray.map(function(objRowId){ - storedClassificationStorageValues[objRowId] = ""; - }); - } - - helperObject = {}; - if(outdatedStoredClassifications) - { - //build classificationStorageObject out of outdatedStoredClassifications - for (i = 0; i < outdatedStoredClassifications.length; i++) - { - for (ii = 0; ii < outdatedStoredClassifications[i].length; ii++) - { - [object_type, object_rowId, classificationStorageId, classificationScore, classificationTypeId, classificationValue, classificationScorePoints] = outdatedStoredClassifications[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - classificationStorageObject[object_type] = {}; //puts objectType in classificationStorageObject and already initializes the object that later get's filled with the groups and their types - helperObject[object_type] = ""; - objectTypes.push(object_type); //also push all the objectTypes in an Array for later (the updating happens one objectType at a time) - if(recalculateAll) - { - storedClassificationValues[object_type] = {}; - } - - } - if(!helperObject.hasOwnProperty(object_rowId)) //objectRowId - { - classificationStorageObject[object_type][object_rowId] = [classificationStorageId, classificationScore]; //same logic as before - helperObject[object_rowId] = ""; - objectRowIdArray.push(object_rowId); //also push all the objectTypes in an Array for later - if(recalculateAll) - { - storedClassificationValues[object_type][object_rowId] = {"classificationTypeId": classificationTypeId, "classificationValue": classificationValue, "classificationScorePoints":classificationScorePoints}; - if(!storedClassificationStorageValues.hasOwnProperty(object_rowId))//if the dataset doesn't have an classificationStorage dataset but does have classification datasets -> insert it here - { - db.insertData("CLASSIFICATIONSTORAGE", ["CLASSIFICATIONSTORAGEID", "CLASSIFICATIONVALUE", "OBJECT_ROWID", "OBJECT_TYPE", "OUTDATED"], null, [util.getNewUUID(), "-", object_rowId, object_type, 1]) - } - } - } - } - } - } -} - -if(outdatedStoredClassifications.length > 0 && !recalculateAll) -{ storedClassificationFlag = true; //this variable can easily be checked to see what we are updating - runUpdating++; -} - -if(groupsThatNeedUpdate.length > 0) -{ - runUpdating++; -} - -//if runUpdating == 0: noting has to be updated -//if runUpdating > 0: run the updating this often (possible values: 1 or 2 -> either only for the classificationStorage that's outdated, -// or only the classificationgroups with atleast one outdated classificationType or both)) -// --> we always start with the updating for the outdated classificationStorage datasets by using the storedClassificationFlag as way of -// checking what we are updating (the flag get's set to true if we have atleast one outdated classificationStorage (see above) and to false after the first loop) -for (xyz = 0; xyz < runUpdating; xyz++) -{ - if(!storedClassificationFlag) //flag = false: we are not updating classificationStorage -> different condition needed (this logic get's used a lot) - { - objectTypes = []; - staticClassificationTypes = newSelect("CLASSIFICATION.OBJECT_TYPE, CLASSIFICATION.OBJECT_ROWID, CLASSIFICATION.CLASSIFICATIONTYPE_ID, CLASSIFICATION.SCOREPOINTS") - .from("CLASSIFICATION") - .join("CLASSIFICATIONTYPE", "CLASSIFICATION.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.NOT_IN()) - .table(); - correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()) - } - else - { - correctCondition = newWhere("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypes, SqlBuilder.IN()) - } - //All the possible scores of 1: the outdated classification types or 2: of all the classificationtypes of the outdated classificationStorages - scoreArray = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, \n\ - CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID, CLASSIFICATIONSCORE.SCOREPERCENT/100, CLASSIFICATIONTYPE.FILTER") - .from("CLASSIFICATIONGROUP") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .join("CLASSIFICATIONSCORE", "CLASSIFICATIONSCORE.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .where(correctCondition) - .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONGROUP.SORTING, CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONSCORE.SORT") - .table(); - helperObject = {}; - //build scoreObject out of scoreArray and also build classificationTypesFilterObj and classificationTypesNoFilterObj - for (i = 0; i < scoreArray.length; i++) - { - for (ii = 0; ii < scoreArray[i].length; ii++) - { - [object_type, classificationGroupId, classificationTypeId, classificationScoreId, classificationScore] = scoreArray[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - scoreObject[object_type] = {}; //puts objectType in scoreObject and already initializes the object that later get's filled with the groups and their types - helperObject[object_type] = ""; - if(!storedClassificationFlag) - objectTypes.push(object_type); //also push all the objectTypes in an Array for later (the updating happens one objectType at a time) - - if(classificationTypesFilterObj[object_type] == undefined) - classificationTypesFilterObj[object_type] = {}; //initializing for later use - if(classificationTypesNoFilterObj[object_type] == undefined) - classificationTypesNoFilterObj[object_type] = {}; //initializing for later use - } - if(!helperObject.hasOwnProperty(classificationGroupId)) //classificationGroup - { - scoreObject[object_type][classificationGroupId] = {}; //same logic as before - helperObject[classificationGroupId] = ""; - - if(classificationTypesFilterObj[object_type][classificationGroupId] == undefined) - classificationTypesFilterObj[object_type][classificationGroupId] = {}; //initializing - if(classificationTypesNoFilterObj[object_type][classificationGroupId] == undefined) - classificationTypesNoFilterObj[object_type][classificationGroupId] = {}; //initializing - } - if(!helperObject.hasOwnProperty(classificationTypeId)) //classificationType - { - scoreObject[object_type][classificationGroupId][classificationTypeId] = {}; //same logic as before - helperObject[classificationTypeId] = ""; - if(scoreArray[i][5] == "" || scoreArray[i][5] == JditoFilterUtils.getEmptyFilter(ContextUtils.getEntity(object_type))) //also push all the indicators that have a filter set into classificationTypesFilterObj - { - if(classificationTypesNoFilterObj[object_type][classificationGroupId][classificationTypeId] == undefined) - classificationTypesNoFilterObj[object_type][classificationGroupId][classificationTypeId] = scoreArray[i][5]; - } - else //and the ones without a filter into classificationTypesNoFilterObj - { - if(classificationTypesFilterObj[object_type][classificationGroupId][classificationTypeId] == undefined) - classificationTypesFilterObj[object_type][classificationGroupId][classificationTypeId] = scoreArray[i][5]; - } - } - if(!helperObject.hasOwnProperty(scoreArray[i][3])) //classificationScore - { - scoreObject[object_type][classificationGroupId][classificationTypeId][scoreArray[i][3]] = scoreArray[i][4]; //score - helperObject[scoreArray[i][3]] = ""; - } - } - } - if(!storedClassificationFlag) // we already habe the classificationStorageObject if we are updating for the outdated classificationStorage - { - let condIfSingle; - if(vars.exists("$local.ObjectRowid_param") && vars.get("$local.ObjectRowid_param")) - { - condIfSingle = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", vars.get("$local.ObjectRowid_param")); - } - classificationStorageArray = newSelect("OBJECT_TYPE, OBJECT_ROWID, CLASSIFICATIONSTORAGEID, CLASSIFICATIONVALUE") - .from("CLASSIFICATIONSTORAGE") - .whereIfSet(condIfSingle) - .orderBy("OBJECT_TYPE") - .table(); - helperObject = {}; //resets the helper object - for (i = 0; i < classificationStorageArray.length; i++) - { - for (ii = 0; ii < classificationStorageArray[i].length; ii++) - { - [object_type, object_rowId, classificationStorageId, classificationValue] = classificationStorageArray[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - classificationStorageObject[object_type] = []; //same logic as before - helperObject[object_type] = ""; - } - if(!helperObject.hasOwnProperty(object_rowId)) //objectType - { - classificationStorageObject[object_type][object_rowId] = []; //same logic as before - helperObject[object_rowId] = ""; - } - if(!helperObject.hasOwnProperty(object_rowId + classificationStorageId)) //objectRowId - { - classificationStorageObject[object_type][object_rowId] = [classificationStorageId, classificationValue]; //same logic as before - helperObject[object_rowId + classificationStorageId] = ""; - } - - } - } - } - if(!storedClassificationFlag) //we don't have any static classifications if we are updating for the outdated classificationStorage - { - staticClassificationsArray = newSelect("CLASSIFICATION.OBJECT_TYPE, CLASSIFICATION.OBJECT_ROWID, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, \n\ - CLASSIFICATION.CLASSIFICATIONTYPE_ID, CLASSIFICATION.SCOREPOINTS") - .from("CLASSIFICATION") - .join("CLASSIFICATIONTYPE", "CLASSIFICATION.CLASSIFICATIONTYPE_ID = CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID") - .where("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.NOT_IN()) - .orderBy("CLASSIFICATION.OBJECT_TYPE, CLASSIFICATION.OBJECT_ROWID, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .table(); - - helperObject = {}; //resets the helper object - //build staticClassificationsObject out of scoreArray and also build classificationTypesFilterObj - for (i = 0; i < staticClassificationsArray.length; i++) - { - for (ii = 0; ii < staticClassificationsArray[i].length; ii++) - { - [object_type, object_rowId, classificationGroupId, classificationTypeId, classificationScorePoints] = staticClassificationsArray[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - staticClassificationsObject[object_type] = {}; //same logic as before - helperObject[object_type] = ""; - } - if(!helperObject.hasOwnProperty(object_rowId)) //objectRowId - { - staticClassificationsObject[object_type][object_rowId] = {}; //same logic as before - helperObject[object_rowId] = ""; - } - if(!helperObject.hasOwnProperty(object_rowId + classificationGroupId)) //classificationGroupId - { - staticClassificationsObject[object_type][object_rowId][classificationGroupId] = {}; //same logic as before - helperObject[object_rowId + classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(object_rowId + classificationTypeId)) //classificationScore - { - if(staticClassificationsObject[object_type][object_rowId][classificationGroupId][classificationTypeId] == undefined) - staticClassificationsObject[object_type][object_rowId][classificationGroupId][classificationTypeId] = classificationScorePoints; - else - staticClassificationsObject[object_type][object_rowId][classificationGroupId][classificationTypeId] = eMath.addInt(Number(staticClassificationsObject[object_type][object_rowId][classificationGroupId][classificationTypeId]), Number(classificationScorePoints)) - helperObject[object_rowId + classificationTypeId] = ""; - } - } - } - } - - if(!storedClassificationFlag) - { - correctCondition = newWhere("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypesThatNeedUpdate, SqlBuilder.IN()) - } - - //All the gradings of the classification groups that have either 1: atleast one classificationType with the outdated flag or 2: have classificationtypes - //of the object_types that we need for updating for the outdated classificationStorage (depends on the condition, see above) - gradingArray = newSelect("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, \n\ - CLASSIFICATIONGRADING.CLASSIFICATIONGRADINGID, CLASSIFICATIONGRADING.MINPERCENT, CLASSIFICATIONGRADING.GRADING") - .from("CLASSIFICATIONGROUP") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .where(correctCondition) - .join("CLASSIFICATIONGRADING", "CLASSIFICATIONGRADING.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .orderBy("CLASSIFICATIONTYPE.OBJECT_TYPE, CLASSIFICATIONGROUP.TITLE, CLASSIFICATIONGROUP.SORTING, \n\ - CLASSIFICATIONTYPE.SCORETYPE, CLASSIFICATIONGRADING.MINPERCENT asc") - .table(); - - helperObject = {}; //resets the helper object - - //logic from above applies here aswell - for (i = 0; i < gradingArray.length; i++) - { - [object_type, classificationGroupId, classificationTypeId, minPercent, classificationGrading] = gradingArray[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - gradingObject[object_type] = {}; - helperObject[object_type] = ""; - } - if(!helperObject.hasOwnProperty(classificationGroupId)) //classificationGroup - { - gradingObject[object_type][classificationGroupId] = {}; - helperObject[classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(classificationTypeId)) //classificationGrading - { - gradingObject[object_type][classificationGroupId][classificationTypeId] = [minPercent, classificationGrading]; //minPercent - helperObject[classificationTypeId] = ""; - } - } - - if(!storedClassificationFlag) - { - correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()); - } - - bestPossibleScoresArray = newSelect("OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID, \n\ - CLASSIFICATIONTYPE.SCOREPOINTS *(select max(CLASSIFICATIONSCORE.SCOREPERCENT)/100 from CLASSIFICATIONSCORE)") - .from("CLASSIFICATIONTYPE") - .where(correctCondition) - .orderBy("OBJECT_TYPE, CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID") - .table(); - - helperObject = {}; //resets the helper object - - //logic from above applies here aswell - for (i = 0; i < bestPossibleScoresArray.length; i++) - { - [object_type, classificationGroupId, classificationTypeId, bestValue] = bestPossibleScoresArray[i]; - - if(!helperObject.hasOwnProperty(object_type)) //objectType - { - bestPossibleScoresObj[object_type] = {}; - helperObject[object_type] = ""; - } - if(!helperObject.hasOwnProperty(classificationGroupId)) //classificationGroup - { - bestPossibleScoresObj[object_type][classificationGroupId] = {}; - helperObject[classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(classificationTypeId)) //classificationType - { - bestPossibleScoresObj[object_type][classificationGroupId][classificationTypeId] = bestValue; //best possible value - helperObject[classificationTypeId] = ""; - } - } - - for (i = 0; i < objectTypes.length; i++) - { - - outputInformation[objectTypes[i]] = { - updatedElements: 0, - nonChangedElements: 0, - checkedElements: 0, - persistentDatasetsUpdated: 0 - }; - } - - for (i = 0; i < objectTypes.length; i++) //update for each object_type - { - isOrganisation = false; - if(objectTypes[i] == "Organisation") - { - currentObjectTable = "CONTACT"; - currentObjectColumn = "CONTACT.CONTACTID"; - isOrganisation = true; - } - else - { - currentObjectTable = objectTypes[i]; - currentObjectColumn = objectTypes[i] + "." + objectTypes[i] +"ID"; - } - - if(isOrganisation) - filterFields = ["CONTACTID", "CUSTOMERCODE", "INFO", "LANGUAGE", "NAME", "STANDARD_CITY", "STANDARD_EMAIL_COMMUNICATION", "STANDARD_PHONE_COMMUNICATION", "STATUS", "TYPE"]; - else if(currentObjectTable == "Salesproject") - filterFields = ["SALESPROJECTID", "CONTACT_ID", "ENDDATE", "INFO", "PHASE", "PROBABILITY", "PROJECTCODE", "PROJECTTITLE", "REASONS", "STARTDATE", "STATUS", "VOLUME"]; - else - throw new Error("updateClassifications_serverProcess: objectType doesn't exist or is not implemented correctly, contact an administrator."); - - //private function for code readability (get's called once for every object_type) - _buildFilteredRecsObject(); - - //this is the "upgrade" part of this process: - //Update all entries with correct classificaiton values - - //all groups of the objectType in the correct order, needed later to also add the "-" gradings if no classificationType has been set under that group - orderedGroups = newSelect("distinct CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID, CLASSIFICATIONGROUP.SORTING") - .from("CLASSIFICATIONGROUP") - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID = CLASSIFICATIONGROUP.CLASSIFICATIONGROUPID") - .where("CLASSIFICATIONTYPE.OBJECT_TYPE", objectTypes[i]) - .orderBy("CLASSIFICATIONGROUP.SORTING") - .table(); - - var persistedClassificationObj = {} - //private callback function that processes the achieved scores per object type - function _processAchievedScoresBatchFn(pBatchData, pBatchNum) - { - //logic from above applies here aswell - for (ii = 0; ii < pBatchData.length; ii++) - { - [uid, classificationGroupId, classificationTypeId, classificationScore, classificationScorePercent, classificationScoreSaved, classificationTypeFilter, classificationId, classificationScoreTitle] = pBatchData[ii]; - - if(!helperObject.hasOwnProperty(uid)) //uid - { - achievedScoresObj[uid] = {}; - groupObject[uid] = ""; //groupObject is another helper object to store all the groupIds - achievedScoresTypeObj[uid] = {}; - persistedClassificationObj[uid] = {}; - helperObject[uid] = ""; - } - if(!helperObject.hasOwnProperty(uid + classificationGroupId)) //classificationGroup - { - groupObject[uid] = groupObject[uid].toString() + classificationGroupId.toString() +" "; - achievedScoresObj[uid][classificationGroupId] = {}; - achievedScoresTypeObj[uid][classificationGroupId] = {}; - persistedClassificationObj[uid][classificationGroupId] = {}; - helperObject[uid + classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(uid + classificationTypeId)) //classificationType - { - if(_isRelevant()) - { - if(achievedScoresObj[uid][classificationGroupId]["Score"] == undefined) - achievedScoresObj[uid][classificationGroupId]["Score"] = 0; - score = eMath.addDec(parseFloat(achievedScoresObj[uid][classificationGroupId]["Score"]), parseFloat(classificationScore)); - achievedScoresObj[uid][classificationGroupId]["Score"] = score; - achievedScoresObj[uid][classificationGroupId]["Grade"] = ClassificationUtils.getGradingFromObject( - gradingObject[objectTypes[i]], classificationGroupId, score, bestPossibleScoresGroupObj[uid][classificationGroupId]); - - if(parseFloat(classificationScore) != parseFloat(classificationScoreSaved) && classificationScore != undefined) - { - - achievedScoresTypeObj[uid][classificationGroupId][classificationId] = [parseFloat(classificationScore)]; - } - persistedClassificationObj[uid][classificationGroupId][classificationTypeId] = {};//store all classificationtypes that we have for that dataset in persistedClassificationObj - helperObject[uid + classificationTypeId] = ""; - } - else - { - deleteCond = newWhere("CLASSIFICATION.CLASSIFICATIONID", classificationId); - deleteCond.deleteData(true, "CLASSIFICATION"); - outputInformation[objectTypes[i]].persistentDatasetsUpdated++; - - helperObject[uid + classificationTypeId] = ""; - - if(recalculateAll) - { -// if(storedClassificationValues[objectTypes[i]][uid][""]) - } - } - } - } - } - if(singleRefresh) - { - correctCondition = newWhere(currentObjectColumn, vars.get("$local.ObjectRowid_param")); - } - else if(storedClassificationFlag) - { - correctCondition = newWhere(currentObjectColumn, objectRowIdArray, SqlBuilder.IN()); - } - else - { - correctCondition = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID", groupsThatNeedUpdate, SqlBuilder.IN()); - } - - achievedScoresStmt = newSelect(currentObjectColumn + ", CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, \n\ - CLASSIFICATION.CLASSIFICATIONTYPE_ID, "+ SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSCORE.SCOREPERCENT/100*CLASSIFICATIONTYPE.SCOREPOINTS is null")) - .then("0") - .elseValue("CLASSIFICATIONSCORE.SCOREPERCENT/100*CLASSIFICATIONTYPE.SCOREPOINTS") - .toString()+ ", \n\ - "+SqlBuilder.caseWhen(newWhere("CLASSIFICATIONSCORE.SCOREPERCENT/100 is null")) - .then("0") - .elseValue("CLASSIFICATIONSCORE.SCOREPERCENT/100") - .toString()+", CLASSIFICATION.SCOREPOINTS, CLASSIFICATIONTYPE.FILTER, \n\ - CLASSIFICATION.CLASSIFICATIONID, CLASSIFICATIONSCORE.TITLE") - .from(currentObjectTable) - .join("CLASSIFICATION", "CLASSIFICATION.OBJECT_ROWID = " + currentObjectColumn) - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .leftJoin("CLASSIFICATIONSCORE", "CLASSIFICATION.VALUE = CLASSIFICATIONSCORE.CLASSIFICATIONSCOREID") - .where(correctCondition); - - if(isOrganisation) - achievedScoresStmt.and("CONTACT.PERSON_ID is null"); - - achievedScoresStmt.orderBy(currentObjectColumn + ", CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATIONSCORE.SCOREPERCENT asc"); - - bestPossibleScoreStmt = newSelect(currentObjectColumn + ", CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID, CLASSIFICATION.CLASSIFICATIONTYPE_ID,\n\ - CLASSIFICATIONTYPE.FILTER") - .from(currentObjectTable) - .join("CLASSIFICATION", "CLASSIFICATION.OBJECT_ROWID = " + currentObjectColumn) - .join("CLASSIFICATIONTYPE", "CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID = CLASSIFICATION.CLASSIFICATIONTYPE_ID") - .where(correctCondition); - if(isOrganisation) - bestPossibleScoreStmt.and("CONTACT.PERSON_ID is null"); - - bestPossibleScoreStmt.orderBy(currentObjectColumn + ", CLASSIFICATIONTYPE.CLASSIFICATIONGROUP_ID"); - - bestPossibleScoresGroupObj = {}; - helperObject = {}; - bestPossibleScoreStmt.pageSize(100) - .forEachPage(_buildBestPossibleScoresGroupObjFn); - - achievedScoresTypeObj = {}; - helperObject = {}; - achievedScoresObj = {}; - achievedScoresStmt.pageSize(100) - .forEachPage(_processAchievedScoresBatchFn); - - if(storedClassificationFlag != true) - _insertPersistendClassificationDataIfNeeded(); - //do this after all the data is collected since the achievedScoresStmt returns several records for each rowId. - //If this would be done in the batch function it would result in false classificationstorage-results because not all records for a rowId have been used - for (var row_Id in achievedScoresObj) - { - chainedGrading = classificationStorageObject[objectTypes[i]][row_Id][1]; - - for (var groupId in achievedScoresObj[row_Id]) - { - position = 0; - - for (ii = 0; ii < orderedGroups.length; ii++) { - if (orderedGroups[ii][0] == groupId) - { - position = ii; //current position - break; - } - } - while(chainedGrading.length < position + 1) - { - chainedGrading += "-" - } - if(achievedScoresObj[row_Id][groupId]["Grade"] != undefined) - chainedGrading = StringUtils.replaceAt(chainedGrading, position, achievedScoresObj[row_Id][groupId]["Grade"]); //update the stored classificationString for each dataset - else - { - chainedGrading = StringUtils.replaceAt(chainedGrading, position, "-"); //update the stored classificationString -> remove for irrelevant groups - } - } - - for (ii = 0; iii < orderedGroups.length; ii++) //the empty gradings have been ignored, but should be filled with "-" - { - if(!groupObject[row_Id].toString().includes(orderedGroups[ii][0].toString())) //check which ones aren't included and add "-" for those at correct the position - { - chainedGrading = chainedGrading.substring(0, ii) + "-" + chainedGrading.substring(ii, chainedGrading.length); - } - } - - //update the specified dataset if the already stored ClassificatioNValue differs from the freshly calculated one - cond = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", row_Id) - .and("CLASSIFICATIONSTORAGE.OBJECT_TYPE", objectTypes[i]) - .and("CLASSIFICATIONSTORAGE.CLASSIFICATIONVALUE", chainedGrading, SqlBuilder.NOT_EQUAL()); - if(new RegExp("^-+$").test(chainedGrading) == true || chainedGrading == "-") - { - count = newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", row_Id).deleteData(true, "CLASSIFICATIONSTORAGE"); - deleted = true; - } - else - { - count = Number(cond.updateData(true, table, column, null, [chainedGrading])); - deleted = false; - } - - outputInformation[objectTypes[i]].checkedElements++; - if(storedClassificationFlag && !deleted) - { - newWhere("CLASSIFICATIONSTORAGE.OBJECT_ROWID", row_Id).updateData(true, "CLASSIFICATIONSTORAGE", ["OUTDATED"], null, [0]) - } - if (count > 0) - { - outputInformation[objectTypes[i]].updatedElements += count; - } - else - { - outputInformation[objectTypes[i]].nonChangedElements++; - } - } - - if(achievedScoresObj.length == 0) - { - _insertPersistendClassificationDataIfNeeded2() - } - - //loop trough achievedScoresTypeObj and update the stored (persistent) data if needed - for (var index in achievedScoresTypeObj) - { - for (var indexII in achievedScoresTypeObj[index]) - { - for (var indexIII in achievedScoresTypeObj[index][indexII]) - { - var scorepoints; - var columns = []; - var values = []; - if(Array.isArray(achievedScoresTypeObj[index][indexII][indexIII])) //if isArray == true: scorepoints have to be updated - { - scorepoints = Number(achievedScoresTypeObj[index][indexII][indexIII][0]); - } - - cond = newWhere("CLASSIFICATION.CLASSIFICATIONID", indexIII); - - if(scorepoints != undefined) - { - columns.push("SCOREPOINTS"); - values.push(scorepoints); - } - cond.updateData(true, "CLASSIFICATION", columns, null, values); - outputInformation[objectTypes[i]].persistentDatasetsUpdated++; - } - } - } - } - - if(!storedClassificationFlag && !singleRefresh) - { for (i = 0; i < scoreArray.length; i++) - { - let cond = newWhere("CLASSIFICATIONTYPE.CLASSIFICATIONTYPEID", scoreArray[i][2]); - cond.updateData(true, "CLASSIFICATIONTYPE", ["OUTDATED"], null, [0]); - } - } - - outputInfo = outputInfo + JSON.stringify(outputInformation) + "\n"; - storedClassificationFlag = false; -} -if(runUpdating == 0) -{ - outputInfo = outputInfo + "No Data has been updated, everything already up-to-date" -} -logging.log(outputInfo); - - -/** - * Builds filteredRecsObj Object which stores all the included Datasets to the specific filter. - * (loops trough classificationTypesFilterObj and uses either entites.getRow or an select for every different filter) - */ -function _buildFilteredRecsObject() -{ - filteredRecsObj = {}; //reset for every objectType - executeGetRows = true; //reset for every objectTyp - - for (var index in classificationTypesFilterObj[objectTypes[i]]) - { - for (var indexIndex in classificationTypesFilterObj[objectTypes[i]][index]) - { - var unparsedFilter = classificationTypesFilterObj[objectTypes[i]][index][indexIndex]; - var filter = JSON.parse(unparsedFilter).filter; - //filteredRecsObj uses the filter as the key -> if multiple indicators use the exact same filtercondition we only have to get these rows once - if(filteredRecsObj[classificationTypesFilterObj[objectTypes[i]][index][indexIndex]] == undefined) - { - if(filter["childs"]["0"] != undefined) // ignore empty filters - { - //no "." in the name means its a field of the entity itself: use entities.getRow and JditoFilterUtils.filterRecords - //to check whether or not the Filter excludes this row - if(!filter["childs"]["0"]["name"].includes(".")) - { - if(executeGetRows) //only do this once for every object type, since the rows don't change depending on the filter - { - var loadConfig = entities.createConfigForLoadingRows() - .entity(ContextUtils.getEntity(objectTypes[i])) - .fields(filterFields); - - var rows = entities.getRows(loadConfig); - var filterableRows = []; - for (ii = 0; ii < rows.length; ii++) { - filterableRows[ii] = filterFields.map(function (field) - { - value = null; - if (field in rows[ii]) - value = rows[ii][field]; - return value; - }); - } - executeGetRows = false; - } - //filter gets used after using entities.getRow and not in the loadconfig, since we can have multiple filters - //and don't want to do entities.getRow for every single one - filteredRecsObj[unparsedFilter] = JditoFilterUtils.filterRecords(filterFields, filterableRows, filter); - } - else //else: currently a count is made whith the filtercondition as the where clause --> poor performance - { - if(objectTypes[i] == "Organisation") - { - filteredRecsObj[unparsedFilter] = newSelect("CONTACT.CONTACTID") - .from("ORGANISATION") - .join("CONTACT", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID and CONTACT.PERSON_ID is null") - .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") - .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID") - .where(db.toFilterCondition(JSON.stringify(filter), "Organisation_entity")) - .and("ORGANISATION.ORGANISATIONID", OrgUtils.getPrivateOrganisationId(), SqlBuilder.NOT_EQUAL()) - .table(); - } - else if(objectTypes[i] == "Salesproject") - { - filteredRecsObj[unparsedFilter] = newSelect("SALESPROJECT.SALESPROJECTID") - .from("SALESPROJECT") - .leftJoin("CONTACT", "SALESPROJECT.CONTACT_ID = CONTACT.CONTACTID") - .leftJoin("ORGANISATION", "CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID") - .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = SALESPROJECT.SALESPROJECTID") - .where(db.toFilterCondition(JSON.stringify(filter), "Salesproject_entity")) - .table(); - } - } - } - } - } - } -} - -/** - * Checks whether or not the classificationType is relevant for the current dataset - * (looping trough classificationTypesNoFilterObj if it's included there: no filter is set and it's relevant, - * othwerwises uses _isRelevantFilter() to check whether or not it get's excluded by the set filter) - * returns true/false - */ -function _isRelevant() -{ - var include = false; - - if(classificationTypeFilter == "" || classificationTypeFilter == undefined) - { - for (var index in classificationTypesNoFilterObj[objectTypes[i]]) - { - for (var indexIndex in classificationTypesNoFilterObj[objectTypes[i]][index]) - { - if(classificationTypesNoFilterObj[objectTypes[i]][index][indexIndex] != undefined) - { - include = true; - break; - } - } - } - } - else - { - include = _isRelevantFilter(); - } - return include; -} - -/** - * Checks whether or not the classificationType is relevant for the current dataset, - * (loops trough filteredRecsObj to check whether or not the filter excluded the dataset) - * returns true/false - */ -function _isRelevantFilter() -{ - var include = false; - var recs = filteredRecsObj[classificationTypeFilter]; - if(recs != undefined) - { - include = recs.some(function (rec) {return rec[0] == uid}); - } - return include; -} - - -function _buildBestPossibleScoresGroupObjFn(pBatchData, pBatchNum) -{ - //logic from above applies here aswell - for (ii = 0; ii < pBatchData.length; ii++) - { - [uid, classificationGroupId, classificationTypeId, classificationTypeFilter, classificationScoreTitle, classificationTypeFilter] = pBatchData[ii]; - - if(!helperObject.hasOwnProperty(uid)) //uid - { - bestPossibleScoresGroupObj[uid] = {}; - helperObject[uid] = ""; - } - if(!helperObject.hasOwnProperty(uid + classificationGroupId)) //classificationGroup - { - bestPossibleScoresGroupObj[uid][classificationGroupId] = ""; - helperObject[uid + classificationGroupId] = ""; - } - if(!helperObject.hasOwnProperty(uid + classificationTypeId)) //classificationType - { - if(_isRelevant()) - { - if(bestPossibleScoresGroupObj[uid][classificationGroupId] == "") - bestPossibleScoresGroupObj[uid][classificationGroupId] = 0; - if(bestPossibleScoresObj[objectTypes[i]][classificationGroupId] != undefined && bestPossibleScoresObj[objectTypes[i]][classificationGroupId][classificationTypeId] != undefined) - bestPossibleScoresGroupObj[uid][classificationGroupId] = eMath.addInt(Number(bestPossibleScoresGroupObj[uid][classificationGroupId]), Number(bestPossibleScoresObj[objectTypes[i]][classificationGroupId][classificationTypeId])); - - helperObject[uid + classificationTypeId] = ""; - } - } - } -} - -function _insertPersistendClassificationDataIfNeeded() -{ - var objectsWithClassification; - if(singleRefresh) - { - objectsWithClassification = [vars.get("$local.ObjectRowid_param")]; - } - else - { - objectsWithClassification = newSelect("distinct CLASSIFICATION.OBJECT_ROWID") - .from("CLASSIFICATION") - .where("CLASSIFICATION.OBJECT_TYPE", objectTypes[i]) - .arrayColumn(); - } - for (z = 0; z < objectsWithClassification.length; z++) { - - uid = objectsWithClassification[z]; - var columns = ["CLASSIFICATION.CLASSIFICATIONID" - , "CLASSIFICATION.VALUE" - , "CLASSIFICATION.CLASSIFICATIONTYPE_ID" - , "CLASSIFICATION.OBJECT_TYPE" - , "CLASSIFICATION.OBJECT_ROWID" - , "CLASSIFICATION.SCOREPOINTS" - ]; - - for (var groupId in outdatedClassificationTypeObj[objectTypes[i]]) - { - for (var typeId in outdatedClassificationTypeObj[objectTypes[i]][groupId]) - { - classificationTypeFilter = outdatedClassificationTypeObj[objectTypes[i]][groupId][typeId]["classificationTypeFilter"]; - if(_isRelevant() && (persistedClassificationObj[uid][groupId] == undefined || !persistedClassificationObj[uid][groupId].hasOwnProperty(typeId))) - { - var values = [util.getNewUUID() - , " " - , typeId - , objectTypes[i] - , uid - , "0" - ]; - db.insertData("CLASSIFICATION", columns, null, values); - outputInformation[objectTypes[i]].persistentDatasetsUpdated++; - } - } - } - } -} \ No newline at end of file +ClassificationUtils.executeUpdating(recalculateAll, singleRefresh, objectType_param); \ No newline at end of file