diff --git a/.liquibase/Data_alias/basic/2021.0.2/Checklists/alter_ChecklistEntry.xml b/.liquibase/Data_alias/basic/2021.0.2/Checklists/alter_ChecklistEntry.xml index 924c2b6c716d96449847bc94fe8df2f991ba1749..440e5ab493cf19b4a250828eb4a71d3f73cd2dab 100644 --- a/.liquibase/Data_alias/basic/2021.0.2/Checklists/alter_ChecklistEntry.xml +++ b/.liquibase/Data_alias/basic/2021.0.2/Checklists/alter_ChecklistEntry.xml @@ -22,6 +22,13 @@ <param value="AUTO"/> </whereParams> </update> + <update tableName="CHECKLISTENTRY"> + <column name="AUTO" valueNumeric="0"/> + <where>TYPE = ?</where> + <whereParams> + <param value="MANUAL"/> + </whereParams> + </update> <!--and add not Null constraint--> <addNotNullConstraint columnDataType="TINYINT" diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AddBulkmailStatus.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AddBulkmailStatus.xml new file mode 100644 index 0000000000000000000000000000000000000000..4b54ddabd2a1777757f964e588df9e4be00e43ee --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AddBulkmailStatus.xml @@ -0,0 +1,27 @@ +<?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="m.groppe" id="3a4158da-b715-49c7-9f53-850990382b2c"> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="a7d5d212-f99f-4200-8872-b24e7de2cc37"/> + <column name="KEYID" value="BULKMAILPLANNED"/> + <column name="TITLE" value="Planned"/> + <column name="CONTAINER" value="BulkMailStatus"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="76fc02b9-a1b6-4c76-bdd5-a52d0e1ef286"/> + <column name="SORTING" valueNumeric="4"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="1f257472-bf37-4c66-972d-8bbb5ffcd883"/> + <column name="KEYID" value="BULKMAILMISSED"/> + <column name="TITLE" value="Missed"/> + <column name="CONTAINER" value="BulkMailStatus"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="76fc02b9-a1b6-4c76-bdd5-a52d0e1ef286"/> + <column name="SORTING" valueNumeric="5"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmail.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmail.xml new file mode 100644 index 0000000000000000000000000000000000000000..ebacbeeb5e5d87e136ee320d79dbba2b3d10d184 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmail.xml @@ -0,0 +1,10 @@ +<?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="m.groppe" id="96816f54-3067-470d-b698-dc7ad7685d84"> + <addColumn tableName="BULKMAIL"> + <column name="DATE_TO_SEND" type="DATETIME"/> + <column name="INTEREST_ID" type="char(36)"/> + </addColumn> + <renameColumn tableName="BULKMAIL" oldColumnName="SENDER" newColumnName="SENDER_EMAIL_ADDRESS" columnDataType ="varchar(50)"/> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmailRecipient.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmailRecipient.xml new file mode 100644 index 0000000000000000000000000000000000000000..ba4cce665048da9703c2ede240607bf0f5bc52d7 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/AlterBulkmailRecipient.xml @@ -0,0 +1,8 @@ +<?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="m.groppe" id="5d43aca9-3344-4b54-981d-73306123e18f"> + <addColumn tableName="BULKMAILRECIPIENT"> + <column name="IS_TEST_RECIPIENT" type="TINYINT"/> + </addColumn> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/addDeviceTypeKeyword.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/addDeviceTypeKeyword.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e5fef20dcf00f187275ba5a7d3ccc3b5bc4cc3c --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/addDeviceTypeKeyword.xml @@ -0,0 +1,65 @@ +<?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="m.groppe" id="15e13453-42c1-413e-bc0d-611a23486890"> + + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="NAME" value="DeviceType"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="54b767c8-5347-4e1d-95db-96f6d40f9fb7"/> + <column name="KEYID" value="console"/> + <column name="TITLE" value="Console"/> + <column name="CONTAINER" value="DeviceType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="SORTING" valueNumeric="0"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="de0f5a77-bbb4-4109-bf93-3c0807239980"/> + <column name="KEYID" value="mobile"/> + <column name="TITLE" value="Mobile"/> + <column name="CONTAINER" value="DeviceType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="806143e9-be70-47ff-ba37-5bc64fa88f3b"/> + <column name="KEYID" value="tablet"/> + <column name="TITLE" value="Tablet"/> + <column name="CONTAINER" value="DeviceType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="689e5978-ddb2-46f8-98a0-97ec0a95ee6f"/> + <column name="KEYID" value="smarttv"/> + <column name="TITLE" value="Smart TV"/> + <column name="CONTAINER" value="DeviceType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="SORTING" valueNumeric="3"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="fba7888e-a1a6-45f4-8389-e5c4b98ca13b"/> + <column name="KEYID" value="desktop"/> + <column name="TITLE" value="Desktop"/> + <column name="CONTAINER" value="DeviceType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="d37c3935-c029-44d5-b19d-af7c3a2a21dd"/> + <column name="SORTING" valueNumeric="4"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..2453f645af3dea1fee40c51ddedc5b32196d829d --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/changelog.xml @@ -0,0 +1,13 @@ +<?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"> + <include relativeToChangelogFile="true" file="createLinkClicks.xml"/> + <include relativeToChangelogFile="true" file="AlterBulkmail.xml"/> + <include relativeToChangelogFile="true" file="AddBulkmailStatus"/> + <include relativeToChangelogFile="true" file="createMailLog.xml"/> + <include relativeToChangelogFile="true" file="createMailRun.xml"/> + <include relativeToChangelogFile="true" file="createBulkMailTestRecipient.xml"/> + <include relativeToChangelogFile="true" file="AlterBulkmailRecipient.xml"/> + <include relativeToChangelogFile="true" file="addDeviceTypeKeyword.xml"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createBulkMailTestRecipient.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createBulkMailTestRecipient.xml new file mode 100644 index 0000000000000000000000000000000000000000..da84568e13322b6868c6374d3af60b59942210f1 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createBulkMailTestRecipient.xml @@ -0,0 +1,13 @@ +<?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-4.1.xsd"> + <changeSet author="m.groppe" id="6e4507c7-32fe-4f6b-a7c2-80d379ef364b"> + <createTable tableName="BULKMAILTESTRECIPIENT"> + <column name="BULKMAILTESTRECIPIENTID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true"/> + </column> + <column name="BULKMAIL_ID" type="CHAR(36)"/> + <column name="CONTACT_ID" type="CHAR(36)"/> + <column name="EMAIL_ADDRESS" type="VARCHAR(255)"/> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createLinkClicks.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createLinkClicks.xml new file mode 100644 index 0000000000000000000000000000000000000000..be5283ebc30f1f5ca9c58d5bfb451b6186d8c2f1 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createLinkClicks.xml @@ -0,0 +1,20 @@ +<?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-4.1.xsd"> + <changeSet author="m.groppe" id="e60dc52b-87dc-4f73-80e7-adc5b46d6935"> + <createTable tableName="WEBLINK_CLICK"> + <column name="WEBLINK_CLICKID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_WEBLINK_CLICKID"/> + </column> + <column name="IP_ADDRESS" type="VARCHAR(50)"/> + <column name="WEBLINK_ID" type="CHAR(36)"/> + <column name="MAIL_LOG_ID" type="CHAR(36)"/> + <column name="DEVICE_TYPE" type="VARCHAR(255)"/> + <column name="OPERATING_SYSTEM" type="VARCHAR(255)"/> + <column name="BROWSER" type="VARCHAR(255)"/> + <column name="DATE_OPENED" type="datetime"/> + </createTable> + <createIndex tableName="WEBLINK_CLICK" indexName="IDX_WEBLINK_CLICK_MAIL_LOG_ID"> + <column name="MAIL_LOG_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailLog.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailLog.xml new file mode 100644 index 0000000000000000000000000000000000000000..3e7a43a293c8cff35cd5e05932adec880938aa7f --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailLog.xml @@ -0,0 +1,25 @@ +<?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-4.1.xsd"> + <changeSet author="m.groppe" id="9d8f3580-92c5-423e-b709-09383969ccf0"> + <createTable tableName="MAIL_LOG"> + <column name="MAIL_LOGID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true"/> + </column> + <column name="MAIL_RUN_ID" type="CHAR(36)"/> + <column name="CONTACT_ID" type="CHAR(36)"/> + <column name="STATUS" type="VARCHAR(36)"/> + <column name="ERRORMESSAGE" type="NCLOB"/> + <column name="SENDER_EMAIL" type="VARCHAR(255)"/> + <column name="RECIPIENT_EMAIL" type="VARCHAR(255)"/> + <column name="MAILING_SUBJECT" type="VARCHAR(100)"/> + <column name="DATE_SEND" type ="DATETIME"/> + <column name="OPENER_LINK_CLICK_ID" type="char(36)"/> + </createTable> + <createIndex tableName="MAIL_LOG" indexName="IDX_MAIL_LOG_MAIL_RUN_ID"> + <column name="MAIL_RUN_ID"/> + </createIndex> + <createIndex tableName="MAIL_LOG" indexName="IDX_OPENER_LINK_CLICK_ID"> + <column name="OPENER_LINK_CLICK_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailRun.xml b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailRun.xml new file mode 100644 index 0000000000000000000000000000000000000000..7ac6729001459d9f30a229b65219231d5f025333 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Bulkmail/createMailRun.xml @@ -0,0 +1,20 @@ +<?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-4.1.xsd"> + <changeSet author="m.groppe" id="6c910d60-43b1-400b-8e31-e3a1a93155e6"> + <createTable tableName="MAIL_RUN"> + <column name="MAIL_RUNID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true"/> + </column> + <column name="OBJECT_ROWID" type="CHAR(36)"/> + <column name="OBJECT_TYPE" type="VARCHAR(63)"/> + <column name="STATUS" type="VARCHAR(100)"/> + <column name="TESTRUN" type= "smallint"/> + <column name="INTEREST_ID" type="CHAR(36)"/> + <column name="DATE_RUN_START" type="datetime"/> + <column name="DATE_RUN_FINISHED" type="datetime"/> + </createTable> + <createIndex tableName="MAIL_RUN" indexName="IDX_MAIL_RUN_INTEREST_ID"> + <column name="INTEREST_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..de169ea5bfc61c615c96663b65dea30519245fff --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/changelog.xml @@ -0,0 +1,7 @@ +<?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"> + <include relativeToChangelogFile="true" file="create_communicationBlacklist.xml"/> + <include relativeToChangelogFile="true" file="insert_blacklistTypeKeyword.xml"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/create_communicationBlacklist.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/create_communicationBlacklist.xml new file mode 100644 index 0000000000000000000000000000000000000000..faf00d8192c66f4d93f76288fd73a64243d37807 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/create_communicationBlacklist.xml @@ -0,0 +1,27 @@ +<?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="s.listl" id="9415eb4f-ea93-433c-8a69-1bdb77c6ec87"> + <createTable tableName="COMMUNICATIONBLACKLIST"> + <column name="COMMUNICATIONBLACKLISTID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_COMMUNICATIONBLACKLISTID"/> + </column> + <column name="BLACKLIST_TYPE" type="VARCHAR(36)"> + <constraints nullable="false"/> + </column> + <column name="BLACKLIST_FILTER" type="NCLOB"/> + <column name="REASON" type="NVARCHAR(500)"/> + <column name="START_DATE" type="DATETIME"/> + <column name="END_DATE" type="DATETIME"/> + <column name="DATE_NEW" type="DATETIME"> + <constraints nullable="false"/> + </column> + <column name="USER_NEW" type="VARCHAR(50)"> + <constraints nullable="false"/> + </column> + <column name="DATE_EDIT" type="DATETIME"/> + <column name="USER_EDIT" type="VARCHAR(50)"/> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/insert_blacklistTypeKeyword.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/insert_blacklistTypeKeyword.xml new file mode 100644 index 0000000000000000000000000000000000000000..c2a6c8057c98bad7b41e2298ed807dbb4032dfc7 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationBlacklist/insert_blacklistTypeKeyword.xml @@ -0,0 +1,23 @@ +<?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="s.listl" id="89ba3828-288c-4af7-bf98-feccc01ce312"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="e980999c-0f8e-484b-852b-92d60c38c14f"/> + <column name="NAME" value="CommunicationBlacklistType"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="a1c8d2c6-54c7-4e9d-9792-dd576ac6f43e"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="e980999c-0f8e-484b-852b-92d60c38c14f"/> + <column name="KEYID" value="BLACKLIST_TYPE_EMAILRECIPIENT_FILTER"/> + <column name="TITLE" value="Recipient filter"/> + <column name="CONTAINER" value="CommunicationBlacklistType"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..985bb74bdd6da48d4b5b6f467fbfb81027763e42 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/changelog.xml @@ -0,0 +1,10 @@ +<?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"> + <include relativeToChangelogFile="true" file="create_communicationSettings.xml"/> + <include relativeToChangelogFile="true" file="insert_communicationChannel.xml"/> + <include relativeToChangelogFile="true" file="insert_communicationSettingsStatus.xml"/> + <include relativeToChangelogFile="true" file="insert_commMediumCampaignCategory.xml"/> + <include relativeToChangelogFile="true" file="create_communicationLegalBase.xml"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationLegalBase.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationLegalBase.xml new file mode 100644 index 0000000000000000000000000000000000000000..2b488709ebc598b84da09daa27ee50aa3ae2f0a1 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationLegalBase.xml @@ -0,0 +1,33 @@ +<?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="s.listl" id="b63d334e-6d3b-428f-b394-797e52e48313"> + <createTable tableName="COMMUNICATIONLEGALBASE"> + <column name="COMMUNICATIONLEGALBASEID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_COMMUNICATIONLEGALBASEID"/> + </column> + <column name="COMMUNICATIONSETTINGS_ID" type="CHAR(36)"> + <constraints nullable="false"/> + </column> + <column name="INFO" type="NVARCHAR(250)"/> + <column name="VERSION" type="INTEGER"> + <constraints nullable="false"/> + </column> + <column name="DATE_NEW" type="DATETIME"> + <constraints nullable="false"/> + </column> + <column name="USER_NEW" type="NVARCHAR(50)"> + <constraints nullable="false"/> + </column> + <column name="DATE_EDIT" type="DATETIME"/> + <column name="USER_EDIT" type="NVARCHAR(50)"/> + </createTable> + <createIndex tableName="COMMUNICATIONLEGALBASE" indexName="IDX_COMMLEGALBASE_SETTINGS_ID"> + <column name="COMMUNICATIONSETTINGS_ID"/> + </createIndex> + <createIndex tableName="COMMUNICATIONLEGALBASE" indexName="IDX_COMMLEGALBASE_DATE_NEW"> + <column name="DATE_NEW"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationSettings.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationSettings.xml new file mode 100644 index 0000000000000000000000000000000000000000..aefe001ae7e2899bd2ef4f06de7e8a030d1025eb --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/create_communicationSettings.xml @@ -0,0 +1,40 @@ +<?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="s.listl" id="7a78532b-83d4-484e-a07d-23ae78ba364d"> + <createTable tableName="COMMUNICATIONSETTINGS"> + <column name="COMMUNICATIONSETTINGSID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_COMMUNICATIONSETTINGSID"/> + </column> + <column name="CONTACT_ID" type="CHAR(36)"> + <constraints nullable="false"/> + </column> + <column name="MEDIUM" type="VARCHAR(36)"/> + <column name="CHANNEL_TYPE" type="VARCHAR(36)"> + <constraints nullable="false"/> + </column> + <column name="CHANNEL_ID" type="VARCHAR(36)"/> + <column name="STATUS" type="VARCHAR(36)"> + <constraints nullable="false"/> + </column> + <column name="DATE_NEW" type="DATETIME"> + <constraints nullable="false"/> + </column> + <column name="USER_NEW" type="VARCHAR(50)"> + <constraints nullable="false"/> + </column> + <column name="DATE_EDIT" type="DATETIME"/> + <column name="USER_EDIT" type="VARCHAR(50)"/> + </createTable> + <createIndex tableName="COMMUNICATIONSETTINGS" indexName="IDX_COMMSETTINGS_CONTACT_ID"> + <column name="CONTACT_ID"/> + </createIndex> + <createIndex tableName="COMMUNICATIONSETTINGS" indexName="IDX_COMMSETTINGS_MEDIUM"> + <column name="MEDIUM"/> + </createIndex> + <createIndex tableName="COMMUNICATIONSETTINGS" indexName="IDX_COMMSETTINGS_CHANNEL_ID"> + <column name="CHANNEL_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_commMediumCampaignCategory.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_commMediumCampaignCategory.xml new file mode 100644 index 0000000000000000000000000000000000000000..c938477cbe2fa539555aaeeceaebd874537437d7 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_commMediumCampaignCategory.xml @@ -0,0 +1,44 @@ +<?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="s.listl" id="fa4ac9a6-3194-4a1a-8a51-7ed46ef11ef7"> + <insert tableName="AB_KEYWORD_ATTRIBUTE"> + <column name="AB_KEYWORD_ATTRIBUTEID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="cda60290-b041-450c-8397-6e462c45835f"/> + <column name="CONTAINER" value=""/> + <column name="KIND" value="CHAR_VALUE"/> + <column name="NAME" value="category"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="2ad2a9ac-7e26-471e-b1d8-2c5594fed717"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_ENTRY_ID" value="2acd3694-ccef-4d0b-ae7a-b3d31f8d9cc0"/> + <column name="CHAR_VALUE" value="PHONE"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="76b7befa-d89b-41df-915a-4ac28e010f28"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_ENTRY_ID" value="cb07397b-a976-4960-b8e5-9edf189c5caf"/> + <column name="CHAR_VALUE" value="EMAIL"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="b0d6fc6b-3e97-44fe-a717-be12af65c081"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_ENTRY_ID" value="990a03e0-aeb4-4bdb-9d22-09b66eee6b85"/> + <column name="CHAR_VALUE" value="OTHER"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="2a86f19c-45d4-46a9-aa9a-1dee1dfd567d"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_ENTRY_ID" value="51085b8b-ded0-4d1d-9e85-ae89bd1480fe"/> + <column name="CHAR_VALUE" value="PHONE"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="88e944af-4951-4e5e-904a-aa26da278c78"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="14d30a19-cdeb-4042-8f20-06224a6f8180"/> + <column name="AB_KEYWORD_ENTRY_ID" value="b72ba2f5-612b-4ef6-832e-62089892b8d7"/> + <column name="CHAR_VALUE" value="PHONE"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationChannel.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationChannel.xml new file mode 100644 index 0000000000000000000000000000000000000000..1d9a93f985b68e18a0332ced9d1877a4af8c1cf3 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationChannel.xml @@ -0,0 +1,53 @@ +<?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="s.listl" id="29ca783c-89ab-4955-8720-ee15ca963237"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="40390bad-8079-49de-89e5-cf030b2f191c"/> + <column name="NAME" value="CommunicationChannelType"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="a395d73b-6780-41d2-9934-70d4f4a021ff"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="40390bad-8079-49de-89e5-cf030b2f191c"/> + <column name="KEYID" value="COMMUNICATIONCHANNEL_PROFILING"/> + <column name="TITLE" value="Profiling"/> + <column name="CONTAINER" value="CommunicationChannelType"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="10451ef3-9fee-41f9-88f2-8e3c0b326dab"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="40390bad-8079-49de-89e5-cf030b2f191c"/> + <column name="KEYID" value="COMMUNICATIONCHANNEL_GLOBAL"/> + <column name="TITLE" value="Global"/> + <column name="CONTAINER" value="CommunicationChannelType"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="49786329-801b-4adf-b5f9-34234d65111b"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="40390bad-8079-49de-89e5-cf030b2f191c"/> + <column name="KEYID" value="COMMUNICATIONCHANNEL_ADDRESS"/> + <column name="TITLE" value="Address"/> + <column name="CONTAINER" value="CommunicationChannelType"/> + <column name="SORTING" valueNumeric="3"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="b1234ea8-f560-401d-b63a-06497c873fec"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="40390bad-8079-49de-89e5-cf030b2f191c"/> + <column name="KEYID" value="COMMUNICATIONCHANNEL_COMMUNICATION"/> + <column name="TITLE" value="Communication"/> + <column name="CONTAINER" value="CommunicationChannelType"/> + <column name="SORTING" valueNumeric="4"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationSettingsStatus.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationSettingsStatus.xml new file mode 100644 index 0000000000000000000000000000000000000000..b56f70514256c91a7e1344ca2b10e155e48465f5 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_communicationSettingsStatus.xml @@ -0,0 +1,43 @@ +<?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="s.listl" id="67049212-747b-45c9-a556-219c8180db5f"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="4a7065d8-3ccc-49c5-bd50-1a7546e8a84d"/> + <column name="NAME" value="CommunicationSettingStatus"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="6afeb45a-c64b-4c6c-93bb-7378b0551729"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="4a7065d8-3ccc-49c5-bd50-1a7546e8a84d"/> + <column name="KEYID" value="COMMUNICATION_PENDING"/> + <column name="TITLE" value="Pending"/> + <column name="CONTAINER" value="CommunicationSettingStatus"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="77aa26ef-7938-4c0d-9ff2-5eadc0aa282d"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="4a7065d8-3ccc-49c5-bd50-1a7546e8a84d"/> + <column name="KEYID" value="COMMUNICATION_ALLOWED"/> + <column name="TITLE" value="Allowed"/> + <column name="CONTAINER" value="CommunicationSettingStatus"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="c2c117ac-d94f-4da2-a7a4-2e36e537a8b8"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="4a7065d8-3ccc-49c5-bd50-1a7546e8a84d"/> + <column name="KEYID" value="COMMUNICATION_REJECTED"/> + <column name="TITLE" value="Rejected"/> + <column name="CONTAINER" value="CommunicationSettingStatus"/> + <column name="SORTING" valueNumeric="3"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_iconsCommChannelType.xml b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_iconsCommChannelType.xml new file mode 100644 index 0000000000000000000000000000000000000000..7e4a3495dfda00d915cb2ac679dd024e8eba0c94 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/CommunicationSettings/insert_iconsCommChannelType.xml @@ -0,0 +1,38 @@ +<?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="s.listl" id="6f8ade49-21aa-4ac6-8a7f-3ddd1c619d95"> + <insert tableName="AB_KEYWORD_ATTRIBUTE"> + <column name="AB_KEYWORD_ATTRIBUTEID" value="f1841bca-e937-44f6-ba94-0e321e81e960"/> + <column name="AB_KEYWORD_CATEGORY_ID" value=""/> + <column name="CONTAINER" value=""/> + <column name="KIND" value="CHAR_VALUE"/> + <column name="NAME" value="iconApproved"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="c497054c-93ff-4436-9cb5-94661fe99a7c"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="f1841bca-e937-44f6-ba94-0e321e81e960"/> + <column name="AB_KEYWORD_ENTRY_ID" value="a395d73b-6780-41d2-9934-70d4f4a021ff"/> + <column name="CHAR_VALUE" value="VAADIN:USER"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="c640739d-c38f-456b-9083-f3fedb0ddaaa"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="f1841bca-e937-44f6-ba94-0e321e81e960"/> + <column name="AB_KEYWORD_ENTRY_ID" value="10451ef3-9fee-41f9-88f2-8e3c0b326dab"/> + <column name="CHAR_VALUE" value=""/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="a8c8208c-b1e7-41ed-9b9d-829912930a1b"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="f1841bca-e937-44f6-ba94-0e321e81e960"/> + <column name="AB_KEYWORD_ENTRY_ID" value="49786329-801b-4adf-b5f9-34234d65111b"/> + <column name="CHAR_VALUE" value=""/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="c9a818a2-12c1-424b-9f9b-d731eb91d1f6"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="f1841bca-e937-44f6-ba94-0e321e81e960"/> + <column name="AB_KEYWORD_ENTRY_ID" value="b1234ea8-f560-401d-b63a-06497c873fec"/> + <column name="CHAR_VALUE" value=""/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/add_DSGVOType.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/add_DSGVOType.xml new file mode 100644 index 0000000000000000000000000000000000000000..615a86a2a82e703ef7e7184df4863451f693c1ae --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/add_DSGVOType.xml @@ -0,0 +1,17 @@ +<?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="s.pongratz" id="e96a018a-66ea-4659-a8eb-3d987dd28e14"> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="5b6b36b8-b77b-4dcf-92a8-65cf9cacf20b"/> + <column name="KEYID" value="TYPE_PRIVACY_NOTICE"/> + <column name="TITLE" value="Privacy Notice"/> + <column name="CONTAINER" value="DSGVOType"/> + <column name="SORTING" valueNumeric="5"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="18e6262a-80a0-4f71-baeb-36a6937e356a"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..b2007f77236c81d8bee0aa1e251b0d1756d9e4ea --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/changelog.xml @@ -0,0 +1,12 @@ +<?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"> + <include relativeToChangelogFile="true" file="create_DSGVOConfiguration.xml"/> + <include relativeToChangelogFile="true" file="create_DSGVODeleteFlag.xml"/> + <include relativeToChangelogFile="true" file="insert_DSGVOReasonKeywords.xml"/> + <include relativeToChangelogFile="true" file="insert_DSGVOReasonKeywordCategory.xml"/> + <include relativeToChangelogFile="true" file="insert_ContactStatusDelete.xml"/> + <include relativeToChangelogFile="true" file="insert_DSGVOConfigKeyword.xml"/> + <include relativeToChangelogFile="true" file="add_DSGVOType.xml"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVOConfiguration.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVOConfiguration.xml new file mode 100644 index 0000000000000000000000000000000000000000..97170f5219f052726a2100e78b3531fb23138b4d --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVOConfiguration.xml @@ -0,0 +1,17 @@ +<?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="s.pongratz" id="f0cb3cff-5f03-4c59-a67e-082147cb2242"> + <createTable tableName="DSGVOCONFIGURATION"> + <column name="DSGVOCONFIGURATIONID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_DSGVOCONFIGURATION_DSGVOCONFIGURATIONID"/> + </column> + <column name="FILTER" type="NCLOB"/> + <column name="REASON" type="CHAR(36)"/> + + <column name="USER_NEW" type="NVARCHAR(50)" /> + <column name="DATE_NEW" type="DATETIME" /> + <column name="USER_EDIT" type="NVARCHAR(50)" /> + <column name="DATE_EDIT" type="DATETIME" /> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVODeleteFlag.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVODeleteFlag.xml new file mode 100644 index 0000000000000000000000000000000000000000..b633ff087812d6595c9bfb1336ff6e34c4dee6a0 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/create_DSGVODeleteFlag.xml @@ -0,0 +1,17 @@ +<?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="s.pongratz" id="24712f1e-f3f2-48c7-956b-3bf8a708a7d6"> + <createTable tableName="DSGVODELETEFLAG"> + <column name="DSGVODELETEFLAGID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_DSGVODELETEFLAG_DSGVODELETEFLAGID"/> + </column> + <column name="REASON" type="CHAR(36)"/> + <column name="CONTACT_ID" type="CHAR(36)"/> + <column name="USER_NEW" type="NVARCHAR(50)" /> + <column name="DATE_NEW" type="DATETIME" /> + </createTable> + <createIndex tableName="DSGVODELETEFLAG" indexName="IDX_DSGVODELETEFLAG_CONTACT_ID"> + <column name="CONTACT_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_ContactStatusDelete.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_ContactStatusDelete.xml new file mode 100644 index 0000000000000000000000000000000000000000..29de89e9eb037bce2201473c5b4d08c54278e8dd --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_ContactStatusDelete.xml @@ -0,0 +1,17 @@ +<?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="s.pongratz" id="047ccccc-da80-42d4-8d6f-e664785fc9cb"> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="43e2ec97-43ae-4c32-bf86-19e171cbe597"/> + <column name="KEYID" value="CONTACTSTATDELETE"/> + <column name="TITLE" value="To Delete"/> + <column name="CONTAINER" value="ContactStatus"/> + <column name="SORTING" valueNumeric="3"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="1f3bde3a-7d74-4335-abd3-561028a1e0c3"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOConfigKeyword.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOConfigKeyword.xml new file mode 100644 index 0000000000000000000000000000000000000000..d565392a6e7976e9ea334a7a9e3aa5a2c3b13467 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOConfigKeyword.xml @@ -0,0 +1,36 @@ +<?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="s.pongratz" id="71f9e4c9-7950-4276-9f4c-2e42256a5e32"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="248a5fc3-7949-4d24-b5d2-6d9a1b2e54a7"/> + <column name="NAME" value="DSGVOConfiguration"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="51f106b6-b593-4279-bf39-c8d226ebc607"/> + <column name="KEYID" value="DSGVO_CONFIGURATION"/> + <column name="TITLE" value="DSGVO Configuration"/> + <column name="CONTAINER" value="DSGVOConfiguration"/> + <column name="SORTING" valueNumeric="0"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="248a5fc3-7949-4d24-b5d2-6d9a1b2e54a7"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTE"> + <column name="AB_KEYWORD_ATTRIBUTEID" value="da1227b0-7bda-4aad-a2d5-ba438cac355a"/> + <column name="NAME" value="Delete Delay in Days"/> + <column name="CONTAINER" value="DSGVOConfiguration"/> + <column name="KIND" value="NUMBER_VALUE"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="248a5fc3-7949-4d24-b5d2-6d9a1b2e54a7"/> + </insert> + <insert tableName="AB_KEYWORD_ATTRIBUTERELATION"> + <column name="AB_KEYWORD_ATTRIBUTERELATIONID" value="ddf253e2-e6e1-477e-89e3-1d5d34a47540"/> + <column name="AB_KEYWORD_ENTRY_ID" value="51f106b6-b593-4279-bf39-c8d226ebc607"/> + <column name="AB_KEYWORD_ATTRIBUTE_ID" value="da1227b0-7bda-4aad-a2d5-ba438cac355a"/> + <column name="NUMBER_VALUE" valueNumeric="7"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywordCategory.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywordCategory.xml new file mode 100644 index 0000000000000000000000000000000000000000..5c7ecb0382e8bc0b5bb2bbb4afdc687c681c918b --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywordCategory.xml @@ -0,0 +1,13 @@ +<?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="s.pongratz" id="b3407931-7898-4e61-872c-89516c7878c0"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="6443344e-8f0b-4699-8d38-5e26dff06b23"/> + <column name="NAME" value="DSGVOReason"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywords.xml b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywords.xml new file mode 100644 index 0000000000000000000000000000000000000000..b3fce728b5a9a540985f50c4d78f4adc5a77da5d --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/DSGVO/insert_DSGVOReasonKeywords.xml @@ -0,0 +1,37 @@ +<?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="s.pongratz" id="7141cd6c-61bc-4fbc-bba5-220d860b982c"> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="607cfce8-1cc3-466e-9a69-4f0c9cf7e391"/> + <column name="KEYID" value="607cfce8-1cc3-466e-9a69-4f0c9cf7e391"/> + <column name="TITLE" value="Manually set"/> + <column name="CONTAINER" value="DSGVOReason"/> + <column name="SORTING" valueNumeric="0"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6443344e-8f0b-4699-8d38-5e26dff06b23"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="e9928b0b-3a31-4dfc-9f9a-782ad78db290"/> + <column name="KEYID" value="e9928b0b-3a31-4dfc-9f9a-782ad78db290"/> + <column name="TITLE" value="No valid sales contract"/> + <column name="CONTAINER" value="DSGVOReason"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6443344e-8f0b-4699-8d38-5e26dff06b23"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="980bf3ad-715d-4e2c-9f3b-ada996ced361"/> + <column name="KEYID" value="980bf3ad-715d-4e2c-9f3b-ada996ced361"/> + <column name="TITLE" value="No customer since creation > 3 years"/> + <column name="CONTAINER" value="DSGVOReason"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6443344e-8f0b-4699-8d38-5e26dff06b23"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/alter_unrelatedduplicates.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/alter_unrelatedduplicates.xml new file mode 100644 index 0000000000000000000000000000000000000000..b6e59bdbd9153071bac10d9f15d87c48b7c2b300 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/alter_unrelatedduplicates.xml @@ -0,0 +1,24 @@ +<?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="p.neub" id="082919b2-ebfd-4864-9839-89e593fb6f2d"> + <dropColumn tableName="UNRELATEDDUPLICATES"> + <column name="CLUSTERID"/> + </dropColumn> + <addColumn tableName="UNRELATEDDUPLICATES"> + <column name="DUPLICATETYPE" type="NVARCHAR(63)"/> + </addColumn> + <createIndex indexName="IDX_UNRELATEDDUPLICATES_DUPLICATETYPE" tableName="UNRELATEDDUPLICATES"> + <column name="DUPLICATETYPE"/> + </createIndex> + <createIndex indexName="IDX_UNRELATEDDUPLICATES_SOURCEDUPLICATEID" tableName="UNRELATEDDUPLICATES"> + <column name="SOURCEDUPLICATEID"/> + </createIndex> + <createIndex indexName="IDX_UNRELATEDDUPLICATES" tableName="UNRELATEDDUPLICATES"> + <column name="DUPLICATETYPE"/> + <column name="SOURCEDUPLICATEID"/> + <column name="UNRELATEDDUPLICATEID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..10ee1b9cc2cb6cd02db3b863cb695a114c9625d1 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/changelog.xml @@ -0,0 +1,10 @@ +<?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"> + <include relativeToChangelogFile="true" file="create_hasduplicate.xml"/> + <include relativeToChangelogFile="true" file="drop_duplicateclusters.xml"/> + <include relativeToChangelogFile="true" file="drop_duplicatescannerresultfieldconfig.xml"/> + <include relativeToChangelogFile="true" file="alter_unrelatedduplicates.xml"/> + <include relativeToChangelogFile="true" file="migrate_unrelatedduplicates.xml"/> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/create_hasduplicate.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/create_hasduplicate.xml new file mode 100644 index 0000000000000000000000000000000000000000..f61d512d35ce13c2928fc3e6922ac8f25058542d --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/create_hasduplicate.xml @@ -0,0 +1,21 @@ +<?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"> + <changeSet author="p.neub" id="db282e4c-01c2-4b55-aa85-01306f4b1f7a"> + <createTable tableName="HASDUPLICATE"> + <column name="HASDUPLICATEID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_HASDUPLICATE_HASDUPLICATEID"></constraints> + </column> + + <column name="OBJECT_TYPE" type="NVARCHAR(63)"/> + <column name="OBJECT_ROWID" type="CHAR(36)"/> + <column name="DUPLICATECOUNT" type="INTEGER"/> + </createTable> + <createIndex indexName="IDX_HASDUPLICATE" tableName="HASDUPLICATE"> + <column name="OBJECT_TYPE"/> + <column name="OBJECT_ROWID"/> + </createIndex> + <createIndex indexName="IDX_HASDUPLICATE_OBJECT_ROWID" tableName="HASDUPLICATE"> + <column name="OBJECT_ROWID"/> + </createIndex> + </changeSet> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicateclusters.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicateclusters.xml new file mode 100644 index 0000000000000000000000000000000000000000..b61e7cb651dec4c502d4956f3caf44b7640bbb1c --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicateclusters.xml @@ -0,0 +1,6 @@ +<?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"> + <changeSet author="p.neub" id="45db014f-922d-4619-b69f-9bf3a36285f4"> + <dropTable tableName="DUPLICATECLUSTERS"/> + </changeSet> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicatescannerresultfieldconfig.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicatescannerresultfieldconfig.xml new file mode 100644 index 0000000000000000000000000000000000000000..6804c4345d4c745de74f6850985649c4329e11bb --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/drop_duplicatescannerresultfieldconfig.xml @@ -0,0 +1,6 @@ +<?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"> + <changeSet author="p.neub" id="fcf592c4-e07c-4919-bfba-0bf99db161ec"> + <dropTable tableName="DUPLICATESCANNERRESULTFIELDCONFIG"/> + </changeSet> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2021.0.3/Duplicate/migrate_unrelatedduplicates.xml b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/migrate_unrelatedduplicates.xml new file mode 100644 index 0000000000000000000000000000000000000000..ac72a09e145674f5a0774b07bd80a1d1b7db5d50 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Duplicate/migrate_unrelatedduplicates.xml @@ -0,0 +1,23 @@ +<?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="p.neub" id="587e1ed7-b7c8-46f0-9058-01521ed97fd5"> + <update tableName="UNRELATEDDUPLICATES"> + <column name="DUPLICATETYPE" value="Person_entity"/> + <where> + DUPLICATETYPE is null and + (select PERSON_ID from CONTACT where CONTACTID = SOURCEDUPLICATEID) + is not null + </where> + </update> + <update tableName="UNRELATEDDUPLICATES"> + <column name="DUPLICATETYPE" value="Organisation_entity"/> + <where> + DUPLICATETYPE is null and + (select PERSON_ID from CONTACT where CONTACTID = SOURCEDUPLICATEID) + is null + </where> + </update> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d964ae108c243c9bca975b36ac913476b0d17da --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/changelog.xml @@ -0,0 +1,9 @@ +<?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"> + <include relativeToChangelogFile="true" file="create_interest.xml"/> + <include relativeToChangelogFile="true" file="create_interestLink.xml"/> + <include relativeToChangelogFile="true" file="insert_interestStatusKeyword.xml"/> + <include relativeToChangelogFile="true" file="insert_interestLinkStatusKeyword.xml"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interest.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interest.xml new file mode 100644 index 0000000000000000000000000000000000000000..811ce863daab8ffe20c807af1127f7aeca2fbeda --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interest.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="s.listl" id="7ec72a70-aa7c-41a5-b7ed-1e28ee2fb506"> + <createTable tableName="INTEREST"> + <column name="INTERESTID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_INTERESTID"/> + </column> + <column name="TITLE" type="NVARCHAR(50)"/> + <column name="DESCRIPTION" type="NVARCHAR(500)"/> + <column name="STATUS" type="VARCHAR(36)"/> + <column name="IS_DEFAULT" type="TINYINT"/> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestLink.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestLink.xml new file mode 100644 index 0000000000000000000000000000000000000000..38e31408a97efc914eed735b5ea03d7d4c6a0b43 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestLink.xml @@ -0,0 +1,21 @@ +<?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="s.listl" id="9e7aab7e-fbe5-4c62-9229-c7d0cf57605f"> + <createTable tableName="INTERESTLINK"> + <column name="INTERESTLINKID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_INTERESTLINKID"/> + </column> + <column name="INTEREST_ID" type="CHAR(36)"/> + <column name="CONTACT_ID" type="CHAR(36)"/> + <column name="STATUS" type="VARCHAR(36)"/> + </createTable> + <createIndex tableName="INTERESTLINK" indexName="IDX_INTERESTLINK_INTEREST_ID"> + <column name="INTEREST_ID"/> + </createIndex> + <createIndex tableName="INTERESTLINK" indexName="IDX_INTERESTLINK_CONTACT_ID"> + <column name="CONTACT_ID"/> + </createIndex> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestUnsubscribe.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestUnsubscribe.xml new file mode 100644 index 0000000000000000000000000000000000000000..63c2dcad95a2416e41986e82150394a722997456 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/create_interestUnsubscribe.xml @@ -0,0 +1,13 @@ +<?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="s.listl" id="c7223a3d-5951-4632-8e39-805fe660c90f"> + <createTable tableName="INTERESTUNSUBSCRIBE"> + <column name="INTERESTUNSUBSCRIBEID" type="CHAR(36)"> + <constraints nullable="false" primaryKey="true" primaryKeyName="PK_INTERESTUNSUBSCRIBEID"/> + </column> + <column name="INTERESTLINK_ID" type="CHAR(36)"/> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestLinkStatusKeyword.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestLinkStatusKeyword.xml new file mode 100644 index 0000000000000000000000000000000000000000..8de05d4b7521be8a9235d6337b090bd709c336fb --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestLinkStatusKeyword.xml @@ -0,0 +1,34 @@ +<?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="s.listl" id="bea56786-cd38-4926-bad7-7f2bd37a17ef"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="9eba38ce-72ba-485a-9a81-f800f8ce6575"/> + <column name="NAME" value="InterestLinkStatus"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="5c723271-ee7f-4daa-9bb3-ca1f81174168"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="9eba38ce-72ba-485a-9a81-f800f8ce6575"/> + <column name="KEYID" value="INTERESTLINK_SUBSCRIBED"/> + <column name="TITLE" value="Subscribed"/> + <column name="CONTAINER" value="InterestLinkStatus"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="5f0e6420-14b9-43e4-bbe3-c156d6519c02"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="9eba38ce-72ba-485a-9a81-f800f8ce6575"/> + <column name="KEYID" value="INTERESTLINK_NOTSUBSCRIBED"/> + <column name="TITLE" value="Not subscribed"/> + <column name="CONTAINER" value="InterestLinkStatus"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestStatusKeyword.xml b/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestStatusKeyword.xml new file mode 100644 index 0000000000000000000000000000000000000000..28f0b1fb5fde8b66916d6041d43352f2348713c7 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/Interest/insert_interestStatusKeyword.xml @@ -0,0 +1,33 @@ +<?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="s.listl" id="0281fbff-e05e-4091-8c66-e8b12022057b"> + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="442c93e4-5df2-444e-a946-2d8cb07bc43a"/> + <column name="NAME" value="InterestStatus"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="7f2b0d66-6051-441b-b975-9369a6a96e24"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="442c93e4-5df2-444e-a946-2d8cb07bc43a"/> + <column name="KEYID" value="INTEREST_ACTIVE"/> + <column name="TITLE" value="Active"/> + <column name="CONTAINER" value="InterestStatus"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="37412d1c-1ccb-41c3-a1b9-5c0276d8d5b6"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="442c93e4-5df2-444e-a946-2d8cb07bc43a"/> + <column name="KEYID" value="INTEREST_INACTIVE"/> + <column name="TITLE" value="Inactive"/> + <column name="CONTAINER" value="InterestStatus"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="0"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblink.xml b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblink.xml new file mode 100644 index 0000000000000000000000000000000000000000..7561299704af4a8cd9e17a78f82ee22b304efd1e --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblink.xml @@ -0,0 +1,22 @@ +<?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="m.groppe" id="1e4d2e89-646c-479b-97a9-d105878de4ae"> + <createTable tableName="WEBLINK"> + <column name="WEBLINKID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_WEBLINK_WEBLINKID"/> + </column> + <column name="URL" type="VARCHAR(512)"/> + <column name="LINKTYPE" type="VARCHAR(50)"/> + <column name="PLACEHOLDER" type = "VARCHAR(50)"/> + <column name="SCORE" type = "INTEGER"/> + <column name="USER_NEW" type="NVARCHAR(50)"/> + <column name="DATE_NEW" type="DATETIME"/> + <column name="USER_EDIT" type="NVARCHAR(50)"/> + <column name="DATE_EDIT" type="DATETIME"/> + <column name="ISREDIRECT" type="TINYINT"/> + <column name="WORKFLOWPROCESSDEFINITION_KEY" type="VARCHAR(255)"/> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblinktags.xml b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblinktags.xml new file mode 100644 index 0000000000000000000000000000000000000000..69df405c0435083c50d55207c2afe35217b31e98 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/CreateWeblinktags.xml @@ -0,0 +1,18 @@ +<?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="m.groppe" id="80490c55-8708-4bf0-a9e7-077ffb0501ef"> + <createTable tableName="WEBLINKTAG"> + <column name="WEBLINKTAGID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_WEBLINKTAG_WEBLINKTAGID"/> + </column> + <column name="WEBLINK_ID" type="char(36)"/> + <column name="TAG" type="VARCHAR(100)" /> + <column name="USER_NEW" type="NVARCHAR(50)" /> + <column name="DATE_NEW" type="DATETIME" /> + <column name="USER_EDIT" type="NVARCHAR(50)" /> + <column name="DATE_EDIT" type="DATETIME" /> + </createTable> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/addLinkManagementKeywords.xml b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/addLinkManagementKeywords.xml new file mode 100644 index 0000000000000000000000000000000000000000..4bf9b7e01884701fe98930cd8e51d521501e8568 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/addLinkManagementKeywords.xml @@ -0,0 +1,76 @@ +<?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="m.groppe" id="04500816-ee95-4a7c-acbb-0b97e2cfcb0d"> + + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="6511a68f-f776-4995-816b-1db011e9e6af"/> + <column name="NAME" value="WeblinkTags"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="398d472c-fb36-4ba6-9c66-44119a32c598"/> + <column name="KEYID" value="SALES"/> + <column name="TITLE" value="Sales"/> + <column name="CONTAINER" value="WeblinkTags"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6511a68f-f776-4995-816b-1db011e9e6af"/> + <column name="SORTING" valueNumeric="0"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="b04ffc41-457b-42ca-a2a9-04386f0e586f"/> + <column name="KEYID" value="MARKETING"/> + <column name="TITLE" value="Marketing"/> + <column name="CONTAINER" value="WeblinkTags"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6511a68f-f776-4995-816b-1db011e9e6af"/> + <column name="SORTING" valueNumeric="1"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="76970f2c-7ca4-4723-832b-c06e92217174"/> + <column name="KEYID" value="SERVICE"/> + <column name="TITLE" value="Service"/> + <column name="CONTAINER" value="WeblinkTags"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6511a68f-f776-4995-816b-1db011e9e6af"/> + <column name="SORTING" valueNumeric="2"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="33003876-9c63-4fa6-927c-1e71b4aaa077"/> + <column name="KEYID" value="TRADE"/> + <column name="TITLE" value="Trade"/> + <column name="CONTAINER" value="WeblinkTags"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="6511a68f-f776-4995-816b-1db011e9e6af"/> + <column name="SORTING" valueNumeric="3"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + </changeSet> + + <changeSet id="83cea193-681f-4dde-9bb6-c0d8ed7b0d72" author="m.groppe"> + + <insert tableName="AB_KEYWORD_CATEGORY"> + <column name="AB_KEYWORD_CATEGORYID" value="c2034fe5-6157-4fb2-b774-4aaeda302b15"/> + <column name="NAME" value="WeblinkType"/> + <column name="SORTINGBY" valueNumeric="0"/> + <column name="SORTINGDIRECTION" value="ASC"/> + </insert> + + <insert tableName="AB_KEYWORD_ENTRY"> + <column name="AB_KEYWORD_ENTRYID" value="126953bc-1219-43d7-a0a0-f2e0631e062f"/> + <column name="KEYID" value="WEBLINK_EMAIL"/> + <column name="TITLE" value="E-Mail"/> + <column name="CONTAINER" value="WeblinkType"/> + <column name="AB_KEYWORD_CATEGORY_ID" value="c2034fe5-6157-4fb2-b774-4aaeda302b15"/> + <column name="SORTING" valueNumeric="0"/> + <column name="ISACTIVE" valueNumeric="1"/> + <column name="ISESSENTIAL" valueNumeric="1"/> + </insert> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..4c8697f98d68ce33dceb605ef75ffa81eccb7a72 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/LinkManagement/changelog.xml @@ -0,0 +1,6 @@ +<?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="addLinkManagementKeywords.xml" relativeToChangelogFile="true"/> + <include file="CreateWeblink.xml" relativeToChangelogFile="true"/> + <include file="CreateWeblinktags.xml" relativeToChangelogFile="true"/> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/alter_origin_attribute.xml b/.liquibase/Data_alias/basic/2021.0.3/alter_origin_attribute.xml new file mode 100644 index 0000000000000000000000000000000000000000..dc6eb66e9654e7231e0550f30c99cf524d10da84 --- /dev/null +++ b/.liquibase/Data_alias/basic/2021.0.3/alter_origin_attribute.xml @@ -0,0 +1,21 @@ +<?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="p.neub" id="7af7aa80-0830-4185-a9cd-bb51b3d0c432"> + <update tableName="AB_ATTRIBUTE"> + <column name="ATTRIBUTE_TYPE" value="COMBO"/> + <where>AB_ATTRIBUTEID = ?</where> + <whereParams> + <param value="d0ae40d2-1a7f-45f6-bb0c-20ce6ae7efe2"/> + </whereParams> + </update> + <update tableName="AB_ATTRIBUTE"> + <column name="ATTRIBUTE_TYPE" value="COMBOVALUE"/> + <where>ATTRIBUTE_PARENT_ID = ?</where> + <whereParams> + <param value="d0ae40d2-1a7f-45f6-bb0c-20ce6ae7efe2"/> + </whereParams> + </update> + </changeSet> +</databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/2021.0.3/changelog.xml b/.liquibase/Data_alias/basic/2021.0.3/changelog.xml index 4abf91ed480dd034b9ff2f9c53ef9a4fcb933f57..33011d5d959969ac0617d0f0e0fa6b84635b75fe 100644 --- a/.liquibase/Data_alias/basic/2021.0.3/changelog.xml +++ b/.liquibase/Data_alias/basic/2021.0.3/changelog.xml @@ -1,7 +1,14 @@ <?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"> + 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="Bulkmail/changelog.xml"/> + <include relativeToChangelogFile="true" file="LinkManagement/changelog.xml"/> + <include relativeToChangelogFile="true" file="CommunicationSettings/changelog.xml"/> + <include relativeToChangelogFile="true" file="Interest/changelog.xml"/> + <include relativeToChangelogFile="true" file="CommunicationBlacklist/changelog.xml"/> <include relativeToChangelogFile="true" file="Checklists/changelog.xml"/> <include relativeToChangelogFile="true" file="Planning/changelog.xml"/> + <include relativeToChangelogFile="true" file="alter_origin_attribute.xml"/> + <include relativeToChangelogFile="true" file="Duplicate/changelog.xml"/> + <include relativeToChangelogFile="true" file="DSGVO/changelog.xml"/> </databaseChangeLog> \ No newline at end of file diff --git a/.liquibase/Data_alias/basic/_demoData/generatedData/bulkmail.xml b/.liquibase/Data_alias/basic/_demoData/generatedData/bulkmail.xml index b3142a2cae6c09150008a62cdf5495ed7369e04f..d124f793b431215d0fb76156fe55123cc7cd09ff 100644 --- a/.liquibase/Data_alias/basic/_demoData/generatedData/bulkmail.xml +++ b/.liquibase/Data_alias/basic/_demoData/generatedData/bulkmail.xml @@ -5,7 +5,7 @@ <insert tableName="bulkmail"> <column name="CREATEACTIVITIES" valueNumeric="1"/> <column name="BULKMAILID" value="2acfd3da-e986-414f-87cf-7ad2b46e5c59"/> - <column name="SENDER" value="tadmin@meine-firma.de"/> + <column name="SENDER_EMAIL_ADDRESS" value="tadmin@meine-firma.de"/> <column name="SUBJECT" value="Erstkontakt meineFirma"/> <column name="DOCUMENTTEMPLATE_ID" value="1cabdde7-870e-4094-a0f7-a335ded3536a"/> <column name="NAME" value="Serienmail - Newsletter"/> @@ -14,7 +14,7 @@ <insert tableName="bulkmail"> <column name="CREATEACTIVITIES" valueNumeric="1"/> <column name="BULKMAILID" value="bbb832fe-8ae4-403a-816a-b24d496933f2"/> - <column name="SENDER" value="tadmin@meine-firma.de"/> + <column name="SENDER_EMAIL_ADDRESS" value="tadmin@meine-firma.de"/> <column name="SUBJECT" value="Email Vorlage Erstkontakt"/> <column name="DOCUMENTTEMPLATE_ID" value="12da39a8-6fc9-4220-b09d-179cd611a814"/> <column name="NAME" value="Produktinformationen"/> @@ -23,7 +23,7 @@ <insert tableName="bulkmail"> <column name="CREATEACTIVITIES" valueNumeric="1"/> <column name="BULKMAILID" value="c4bd88c3-6205-4b91-8ba6-fd44fda2f19d"/> - <column name="SENDER" value="tadmin@meine-firma.de"/> + <column name="SENDER_EMAIL_ADDRESS" value="tadmin@meine-firma.de"/> <column name="SUBJECT" value="Email Vorlage Erstkontakt"/> <column name="DOCUMENTTEMPLATE_ID" value="12da39a8-6fc9-4220-b09d-179cd611a814"/> <column name="NAME" value="Erstkontakt ADITO"/> diff --git a/.liquibase/_____SYSTEMALIAS/basic/_demoData/example_asys_users/insert_asys_users-admin.xml b/.liquibase/_____SYSTEMALIAS/basic/_demoData/example_asys_users/insert_asys_users-admin.xml index 78c7b235bd72a71679d121cac1e8dc31a59256a6..a05e5910ca511396ca56c60f745143bd0b3876ce 100644 --- a/.liquibase/_____SYSTEMALIAS/basic/_demoData/example_asys_users/insert_asys_users-admin.xml +++ b/.liquibase/_____SYSTEMALIAS/basic/_demoData/example_asys_users/insert_asys_users-admin.xml @@ -145,6 +145,15 @@ <column name="PROPKEY" value="roleNames"/> <column name="DATE_NEW" valueDate="2019-07-12T02:00:00"/> </insert> + <insert tableName="ASYS_USERS"> + <column name="GROUPID" value="ROLE"/> + <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/> + <column name="DATE_EDIT" valueDate="2021-03-23T16:09:00"/> + <column name="ID" value="1ac7f51f-4e3d-4af3-857a-add69502aaaa"/> + <column name="PROPVAL" value="PROJECT_DSGVO"/> + <column name="PROPKEY" value="roleNames"/> + <column name="DATE_NEW" valueDate="2021-03-23T16:09:00"/> + </insert> <insert tableName="ASYS_USERS"> <column name="GROUPID" value="PASSWORD"/> <column name="NAME" value="_____USER_bcdfb521-c7d0-4ef1-8916-78e7d3232046"/> diff --git a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_aliasconfig.xml b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_aliasconfig.xml index 017cb8a587875706dcd111a717478dd086ab69b2..0368177e798ed872124001bf5941c04c88658c37 100644 --- a/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_aliasconfig.xml +++ b/.liquibase/_____SYSTEMALIAS/basic/init/data/insert_asys_aliasconfig.xml @@ -62,5 +62,18 @@ <column name="DATE_EDIT" valueDate="2020-09-28T04:50:36"/> <column name="ID" value="c1664cb5-c128-4b93-b3e4-274b97d305e6"/> </insert> + <insert tableName="ASYS_ALIASCONFIG"> + <column name="KIND" valueNumeric="105"/> + <column name="DESCRIPTION" value="jdbc:derby://localhost:1527/basic_data"/> + <column name="USER_EDIT" value="_____DESIGNERANONYM"/> + <column name="SERVERID" value="default"/> + <column name="XMLDATA" valueBlobFile="defaultBlob/data_alias.xml"/> + <column name="USER_NEW" value="_____DESIGNERANONYM"/> + <column name="DATE_NEW" valueDate="2020-09-28T04:50:35"/> + <column name="ALIASID" value="Data_alias_noAudit"/> + <column name="NAME" value="147ccd88-62cb-41a6-a2b8-2784adc6cec0"/> + <column name="DATE_EDIT" valueDate="2020-09-28T04:50:36"/> + <column name="ID" value="52b8cce2-d023-4925-beaf-95503ae93a2f"/> + </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 52da7066094e0a0c99b4e5df78c7500cb370a432..aec7ecad42bf0be47e143e6c9c5d17d9a04b447c 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -9952,7 +9952,7 @@ <description></description> <auditSyncConfig> <name>auditSyncConfig</name> - <auditMode v="0" /> + <auditMode v="2" /> <syncActive v="false" /> <syncComplete v="true" /> <syncDirection v="1" /> @@ -9972,6 +9972,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customStringProperty> + <name>tableRef</name> + <global v="false" /> + <property>SALESPROJECT</property> + </customStringProperty> + </customProperties> <dependencies> <entityDependency> <name>a1759554-192b-49fa-b6a8-b982115f71ab</name> @@ -9993,6 +10000,18 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + <customStringProperty> + <name>keyword</name> + <global v="false" /> + <property>ProductGroupcode</property> + </customStringProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>FORECASTID</name> @@ -10021,6 +10040,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>DATE_START</name> @@ -10049,6 +10075,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>OBJECT_TYPE</name> @@ -10091,6 +10124,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>FORECAST_YEAR</name> @@ -10105,6 +10145,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>STATUS</name> @@ -10119,6 +10166,13 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> <entityFieldDb> <name>RESPONSIBLE_CONTACT_ID</name> @@ -10133,6 +10187,12 @@ <documentation></documentation> <title></title> <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + </customBooleanProperty> + </customProperties> </entityFieldDb> </entityFields> </entityDb> @@ -10529,31 +10589,38 @@ </customProperties> </entityFieldDb> <entityFieldDb> - <name>SENDER</name> + <name>STATUS</name> <dbName></dbName> <primaryKey v="false" /> <columnType v="12" /> - <size v="50" /> + <size v="36" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <documentation></documentation> - <title>Sender</title> + <title></title> <description></description> - <customProperties> - <customBooleanProperty> - <name>log</name> - <global v="false" /> - <property v="true" /> - </customBooleanProperty> - </customProperties> </entityFieldDb> <entityFieldDb> - <name>STATUS</name> + <name>CREATEACTIVITIES</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="12" /> + <columnType v="-6" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TESTING_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> <size v="36" /> <scale v="0" /> <notNull v="false" /> @@ -10564,11 +10631,11 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>CREATEACTIVITIES</name> + <name>TESTING_EMAIL_ADDRESS</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="5" /> - <size v="5" /> + <columnType v="12" /> + <size v="50" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -10578,11 +10645,11 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>TESTING_CONTACT_ID</name> + <name>USE_TEMPLATE_ATTACHMENTS</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="1" /> - <size v="36" /> + <columnType v="-6" /> + <size v="3" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -10592,7 +10659,21 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>TESTING_EMAIL_ADDRESS</name> + <name>DATE_TO_SEND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENDER_EMAIL_ADDRESS</name> <dbName></dbName> <primaryKey v="false" /> <columnType v="12" /> @@ -10606,11 +10687,11 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>USE_TEMPLATE_ATTACHMENTS</name> + <name>INTEREST_ID</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="5" /> - <size v="5" /> + <columnType v="1" /> + <size v="36" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -10714,8 +10795,8 @@ <dbName></dbName> <primaryKey v="false" /> <columnType v="93" /> - <size v="29" /> - <scale v="9" /> + <size v="19" /> + <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> <index v="false" /> @@ -10751,6 +10832,20 @@ <title></title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>IS_TEST_RECIPIENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="-6" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> </entityFields> </entityDb> <entityDb> @@ -12082,7 +12177,7 @@ </entityFields> </entityDb> <entityDb> - <name>DUPLICATECLUSTERS</name> + <name>UNRELATEDDUPLICATES</name> <dbName></dbName> <idColumn>ID</idColumn> <idGeneratorType v="0" /> @@ -12100,7 +12195,7 @@ </auditSyncConfig> <entityFields> <entityFieldDb> - <name>DUPLICATEID</name> + <name>SOURCEDUPLICATEID</name> <dbName></dbName> <primaryKey v="false" /> <columnType v="1" /> @@ -12114,39 +12209,39 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>CLUSTERID</name> + <name>ID</name> <dbName></dbName> - <primaryKey v="false" /> + <primaryKey v="true" /> <columnType v="1" /> <size v="36" /> <scale v="0" /> <notNull v="true" /> - <isUnique v="false" /> - <index v="false" /> + <isUnique v="true" /> + <index v="true" /> <documentation></documentation> <title></title> <description></description> </entityFieldDb> <entityFieldDb> - <name>ID</name> + <name>UNRELATEDDUPLICATEID</name> <dbName></dbName> - <primaryKey v="true" /> + <primaryKey v="false" /> <columnType v="1" /> <size v="36" /> <scale v="0" /> <notNull v="true" /> - <isUnique v="true" /> - <index v="true" /> + <isUnique v="false" /> + <index v="false" /> <documentation></documentation> <title></title> <description></description> </entityFieldDb> <entityFieldDb> - <name>TARGET_ENTITY</name> + <name>DUPLICATETYPE</name> <dbName></dbName> <primaryKey v="false" /> <columnType v="12" /> - <size v="200" /> + <size v="63" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -12158,12 +12253,12 @@ </entityFields> </entityDb> <entityDb> - <name>UNRELATEDDUPLICATES</name> + <name>LEADLOG</name> <dbName></dbName> - <idColumn>ID</idColumn> + <idColumn>LEADLOGID</idColumn> <idGeneratorType v="0" /> <idGeneratorInterval v="1" /> - <documentation></documentation> + <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/leadlog/documentation.adoc</documentation> <title></title> <description></description> <auditSyncConfig> @@ -12176,41 +12271,13 @@ </auditSyncConfig> <entityFields> <entityFieldDb> - <name>SOURCEDUPLICATEID</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="1" /> - <size v="36" /> - <scale v="0" /> - <notNull v="true" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>ID</name> - <dbName></dbName> - <primaryKey v="true" /> - <columnType v="1" /> - <size v="36" /> - <scale v="0" /> - <notNull v="true" /> - <isUnique v="true" /> - <index v="true" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>UNRELATEDDUPLICATEID</name> + <name>ROWSINSERTED</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="1" /> - <size v="36" /> + <columnType v="4" /> + <size v="10" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <documentation></documentation> @@ -12218,11 +12285,11 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>CLUSTERID</name> + <name>IMPORTSOURCE</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="1" /> - <size v="36" /> + <columnType v="12" /> + <size v="500" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -12231,26 +12298,6 @@ <title></title> <description></description> </entityFieldDb> - </entityFields> - </entityDb> - <entityDb> - <name>DUPLICATESCANNERRESULTFIELDCONFIG</name> - <dbName></dbName> - <idColumn>ID</idColumn> - <idGeneratorType v="0" /> - <idGeneratorInterval v="1" /> - <documentation></documentation> - <title></title> - <description></description> - <auditSyncConfig> - <name>auditSyncConfig</name> - <auditMode v="0" /> - <syncActive v="false" /> - <syncComplete v="true" /> - <syncDirection v="1" /> - <syncIds></syncIds> - </auditSyncConfig> - <entityFields> <entityFieldDb> <name>DATE_EDIT</name> <dbName></dbName> @@ -12266,34 +12313,13 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>DUPLICATESCANNER_ID</name> + <name>IMPORTERRORS</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="1" /> - <size v="36" /> + <columnType v="4" /> + <size v="10" /> <scale v="0" /> - <notNull v="true" /> - <isUnique v="false" /> - <index v="true" /> - <documentation></documentation> - <title></title> - <description></description> - <dependencies> - <entityDependency> - <name>9b123a17-2f41-49f8-9492-f386ece46f7c</name> - <entityName>DUPLICATESCANNER</entityName> - <fieldName>ID</fieldName> - </entityDependency> - </dependencies> - </entityFieldDb> - <entityFieldDb> - <name>DATE_NEW</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="93" /> - <size v="29" /> - <scale v="9" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <documentation></documentation> @@ -12301,7 +12327,7 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>ID</name> + <name>LEADLOGID</name> <dbName></dbName> <primaryKey v="true" /> <columnType v="1" /> @@ -12315,13 +12341,13 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>USER_NEW</name> + <name>IMPORTCANCELED</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="12" /> - <size v="50" /> + <columnType v="1" /> + <size v="1" /> <scale v="0" /> - <notNull v="true" /> + <notNull v="false" /> <isUnique v="false" /> <index v="false" /> <documentation></documentation> @@ -12329,139 +12355,7 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>ENTITY_FIELD_NAME</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> - <entityFieldDb> - <name>USER_EDIT</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="12" /> - <size v="50" /> - <scale v="0" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - </entityFields> - </entityDb> - <entityDb> - <name>LEADLOG</name> - <dbName></dbName> - <idColumn>LEADLOGID</idColumn> - <idGeneratorType v="0" /> - <idGeneratorInterval v="1" /> - <documentation>%aditoprj%/aliasDefinition/Data_alias/aliasdefinitionsub/entitygroup/entities/leadlog/documentation.adoc</documentation> - <title></title> - <description></description> - <auditSyncConfig> - <name>auditSyncConfig</name> - <auditMode v="0" /> - <syncActive v="false" /> - <syncComplete v="true" /> - <syncDirection v="1" /> - <syncIds></syncIds> - </auditSyncConfig> - <entityFields> - <entityFieldDb> - <name>ROWSINSERTED</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="4" /> - <size v="10" /> - <scale v="0" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>IMPORTSOURCE</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="12" /> - <size v="500" /> - <scale v="0" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>DATE_EDIT</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="93" /> - <size v="29" /> - <scale v="9" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>IMPORTERRORS</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="4" /> - <size v="10" /> - <scale v="0" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>LEADLOGID</name> - <dbName></dbName> - <primaryKey v="true" /> - <columnType v="1" /> - <size v="36" /> - <scale v="0" /> - <notNull v="true" /> - <isUnique v="true" /> - <index v="true" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>IMPORTCANCELED</name> - <dbName></dbName> - <primaryKey v="false" /> - <columnType v="1" /> - <size v="1" /> - <scale v="0" /> - <notNull v="false" /> - <isUnique v="false" /> - <index v="false" /> - <documentation></documentation> - <title></title> - <description></description> - </entityFieldDb> - <entityFieldDb> - <name>DATE_NEW</name> + <name>DATE_NEW</name> <dbName></dbName> <primaryKey v="false" /> <columnType v="93" /> @@ -18438,6 +18332,82 @@ </entityFieldDb> </entityFields> </entityDb> + <entityDb> + <name>HASDUPLICATE</name> + <dbName></dbName> + <idColumn>HASDUPLICATEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUPLICATECOUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HASDUPLICATEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> <entityDb> <name>AB_SYNCCONTACT</name> <dbName></dbName> @@ -18571,9 +18541,9 @@ </entityFields> </entityDb> <entityDb> - <name>PLANNING_MONTH</name> + <name>WEBLINK</name> <dbName></dbName> - <idColumn>PLANNING_MONTHID</idColumn> + <idColumn>WEBLINKID</idColumn> <idGeneratorType v="0" /> <idGeneratorInterval v="1" /> <documentation></documentation> @@ -18589,26 +18559,26 @@ </auditSyncConfig> <entityFields> <entityFieldDb> - <name>PLANNING_MONTHID</name> + <name>SCORE</name> <dbName></dbName> - <primaryKey v="true" /> - <columnType v="1" /> - <size v="36" /> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> <scale v="0" /> - <notNull v="true" /> - <isUnique v="true" /> - <index v="true" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> <documentation></documentation> <title></title> <description></description> </entityFieldDb> <entityFieldDb> - <name>MONTH_FACTOR</name> + <name>DATE_EDIT</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="4" /> - <size v="10" /> - <scale v="0" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> <notNull v="false" /> <isUnique v="false" /> <index v="false" /> @@ -18617,11 +18587,11 @@ <description></description> </entityFieldDb> <entityFieldDb> - <name>MONTH_NUMBER</name> + <name>LINKTYPE</name> <dbName></dbName> <primaryKey v="false" /> - <columnType v="4" /> - <size v="10" /> + <columnType v="12" /> + <size v="50" /> <scale v="0" /> <notNull v="false" /> <isUnique v="false" /> @@ -18630,6 +18600,1669 @@ <title></title> <description></description> </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEBLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>URL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PLACEHOLDER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WORKFLOWPROCESSDEFINITION_KEY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISREDIRECT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>WEBLINKTAG</name> + <dbName></dbName> + <idColumn>WEBLINKTAGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEBLINK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TAG</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> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEBLINKTAGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>MAIL_LOG</name> + <dbName></dbName> + <idColumn>MAIL_LOGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ERRORMESSAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="-1" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAIL_LOGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENDER_EMAIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RECIPIENT_EMAIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAILING_SUBJECT</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> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FILEPATH</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAIL_RUN_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_SEND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="23" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OPENER_LINK_CLICK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>MAIL_RUN</name> + <dbName></dbName> + <idColumn>MAIL_RUNID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>MAIL_RUNID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</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> + <entityFieldDb> + <name>INTEREST_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_RUN_START</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_RUN_FINISHED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TESTRUN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMMUNICATIONSETTINGS</name> + <dbName></dbName> + <idColumn>COMMUNICATIONSETTINGSID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHANNEL_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHANNEL_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMMUNICATIONSETTINGSID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MEDIUM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMMUNICATIONLEGALBASE</name> + <dbName></dbName> + <idColumn>COMMUNICATIONLEGALBASEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>COMMUNICATIONSETTINGS_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMMUNICATIONLEGALBASEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VERSION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>BULKMAILTESTRECIPIENT</name> + <dbName></dbName> + <idColumn>BULKMAILTESTRECIPIENTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>BULKMAIL_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMAIL_ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BULKMAILTESTRECIPIENTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>INTERESTLINK</name> + <dbName></dbName> + <idColumn>INTERESTLINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INTEREST_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INTERESTLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>INTEREST</name> + <dbName></dbName> + <idColumn>INTERESTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INTERESTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IS_DEFAULT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="-6" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>WEBLINK_CLICK</name> + <dbName></dbName> + <idColumn>WEBLINK_CLICKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>BROWSER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DEVICE_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEBLINK_CLICKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAIL_LOG_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IP_ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEBLINK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OPERATING_SYSTEM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_OPENED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMMUNICATIONBLACKLIST</name> + <dbName></dbName> + <idColumn>COMMUNICATIONBLACKLISTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>BLACKLIST_FILTER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="-1" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>END_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>START_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="19" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMMUNICATIONBLACKLISTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BLACKLIST_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>PLANNING_MONTH</name> + <dbName></dbName> + <idColumn>PLANNING_MONTHID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>PLANNING_MONTHID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MONTH_FACTOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MONTH_NUMBER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DSGVOCONFIGURATION</name> + <dbName></dbName> + <idColumn>DSGVOCONFIGURATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>FILTER</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DSGVOCONFIGURATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DSGVODELETEFLAG</name> + <dbName></dbName> + <idColumn>DSGVODELETEFLAGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="1" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DSGVODELETEFLAGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title>Contact Id</title> + <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="false" /> + </customBooleanProperty> + <customStringProperty> + <name>tableRef</name> + <global v="false" /> + <property>CONTACT</property> + </customStringProperty> + </customProperties> + <dependencies> + <entityDependency> + <name>2278befb-de66-4f45-98c2-619eb686d999</name> + <entityName>CONTACT</entityName> + <fieldName>CONTACTID</fieldName> + </entityDependency> + </dependencies> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title>Reason</title> + <description></description> + <customProperties> + <customBooleanProperty> + <name>log</name> + <global v="false" /> + <property v="true" /> + </customBooleanProperty> + <customStringProperty> + <name>keyword</name> + <global v="false" /> + <property>DSGVOReason</property> + </customStringProperty> + </customProperties> + </entityFieldDb> </entityFields> </entityDb> </entities> diff --git a/aliasDefinition/Data_alias_noAudit/Data_alias_noAudit.aod b/aliasDefinition/Data_alias_noAudit/Data_alias_noAudit.aod new file mode 100644 index 0000000000000000000000000000000000000000..1c4215342d4256568e37babf86ad9e3b8292c788 --- /dev/null +++ b/aliasDefinition/Data_alias_noAudit/Data_alias_noAudit.aod @@ -0,0 +1,16142 @@ +<?xml version="1.0" encoding="UTF-8"?> +<aliasDefinition xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/aliasDefinition/1.2.0"> + <name>Data_alias_noAudit</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <datasourceType v="0" /> + <aliasDefinitionSub> + <aliasDefDb> + <auditActive v="false" /> + <entityGroup> + <name>entityGroup</name> + <entities> + <entityDb> + <name>DUPLICATESCANNERRESULTFIELDCONFIG</name> + <dbName></dbName> + <idColumn>ID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUPLICATESCANNER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTITY_FIELD_NAME</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> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGEDISCUSSION</name> + <dbName></dbName> + <idColumn>KNOWLEDGEDISCUSSIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>PARENTENTRY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCUSSIONTEXT</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEDISCUSSIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AUTHOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SALESPROJECTPHASEDEFINITION</name> + <dbName></dbName> + <idColumn>SALESPROJECTPHASEDEFINITIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>PHASE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHECKLIST_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESPROJECTPHASEDEFINITIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>EXPORTTEMPLATEPLACEOFUSE</name> + <dbName></dbName> + <idColumn>EXPORTTEMPLATEPLACEOFUSEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>EXPORTTEMPLATEPLACEOFUSEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PLACEOFUSE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXPORTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>IMPORTFIELD</name> + <dbName></dbName> + <idColumn>IMPORTFIELDID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>IMPORTFIELDID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELDNAME</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> + <entityFieldDb> + <name>MAPPINGFIELD</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> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELDNUMBER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADIMPORT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGELINK</name> + <dbName></dbName> + <idColumn>KNOWLEDGELINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>KNOWLEDGELINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</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> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ROW_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CHECKLISTENTRY</name> + <dbName></dbName> + <idColumn>CHECKLISTENTRYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CHECKLISTENTRYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AUTO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHECKLIST_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</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> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_PERMISSIONCALENDAR</name> + <dbName></dbName> + <idColumn>AB_PERMISSIONCALENDARID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>PERMISSION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERMISSIONPROCURER_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_PERMISSIONCALENDARID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERMISSIONPROCURER_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERMISSIONDEALER_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERMISSIONDEALER_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_ATTRIBUTEUSAGE</name> + <dbName></dbName> + <idColumn>AB_ATTRIBUTEUSAGEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>AB_ATTRIBUTEUSAGEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MIN_COUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAX_COUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_ATTRIBUTE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_SYNCCONTACT</name> + <dbName></dbName> + <idColumn>SYNCCONTACTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXCHANGEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ASYS_FAVORITEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="46" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SYNCCONTACTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_DEL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATIONTYPE</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONTYPEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SCORETYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FILTER</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>CLASSIFICATIONTYPEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONGROUP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OUTDATED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SCOREPOINTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_KEYWORD_CATEGORY</name> + <dbName></dbName> + <idColumn>AB_KEYWORD_CATEGORYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SORTINGBY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_CATEGORYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTINGDIRECTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="4" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>PERSON</name> + <dbName></dbName> + <idColumn>PERSONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>PERSONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLESUFFIX</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PICTURE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2004" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIRSTNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MIDDLENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATEOFBIRTH</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="91" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LASTNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="16" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GENDER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_UNLINKEDMAIL</name> + <dbName></dbName> + <idColumn>AB_UNLINKEDMAILID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>MAIL</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENDER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="1000" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SUBJECT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_UNLINKEDMAILID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RECIPIENTS</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>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENTDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATION</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CLASSIFICATIONTYPE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SCOREPOINTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATIONGRADING</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONGRADINGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CLASSIFICATIONGRADINGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONGROUP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MINPERCENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GRADING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="1" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CAMPAIGNPARTICIPANTLOG</name> + <dbName></dbName> + <idColumn>CAMPAIGNPARTICIPANTLOGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CAMPAIGN_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNPARTICIPANT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PREVIOUS_CAMPAIGNSTEP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNPARTICIPANTLOGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNSTEP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>WORKFLOWSTARTCONFIG</name> + <dbName></dbName> + <idColumn>WORKFLOWSTARTCONFIGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>TRIGGER_EVENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WORKFLOWSTARTCONFIGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROCESSDEFINITION_KEY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DSGVOINFO</name> + <dbName></dbName> + <idColumn>DSGVOINFOID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>RECIPIENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GUARANTEE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRANSMISSION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DSGVOINFOID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATASOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>PRODUCTPRICE</name> + <dbName></dbName> + <idColumn>PRODUCTPRICEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CURRENCY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_TO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRICE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FROMQUANTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRICELIST</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BUYSELL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRODUCT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_FROM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRODUCTPRICEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SALESPROJECT_TOUCHPOINT</name> + <dbName></dbName> + <idColumn>SALESPROJECT_TOUCHPOINTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SALESPROJECT_TOUCHPOINTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TOUCHPOINT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTRYDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>SALESPROJECT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGEROLES</name> + <dbName></dbName> + <idColumn>KNOWLEDGEROLESID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>KNOWLEDGEROLESID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ROLENAME</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> + <name>DSGVOCONFIGURATION</name> + <dbName></dbName> + <idColumn>DSGVOCONFIGURATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>FILTER</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DSGVOCONFIGURATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>OFFER</name> + <dbName></dbName> + <idColumn>OFFERID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNTED_VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VERSNR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HEADER</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>INFO</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>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LETTERSALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CURRENCY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYMENTTERMS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DELIVERYTERMS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FOOTER</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>OFFERDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFERID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFERCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNTED_NET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROBABILITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="3" /> + <size v="6" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESS</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>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>OFFERITEM</name> + <dbName></dbName> + <idColumn>OFFERITEMID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>UNIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRICE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>QUANTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFERITEMID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>PRODUCT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMPOSITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OPTIONAL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GROUPCODEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMSORT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ASSIGNEDTO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>VISITPLANEMPLOYEEWEEK</name> + <dbName></dbName> + <idColumn>VISITPLANEMPLOYEEWEEKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>VISITPLANEMPLOYEEWEEKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VISITPLAN_WEEK</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>VISITPLAN_YEAR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>STOCK</name> + <dbName></dbName> + <idColumn>STOCKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>REFNUMBER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STOCKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WAREHOUSE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>QUANTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTRYDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRODUCT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IN_OUT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DSGVODELETEFLAG</name> + <dbName></dbName> + <idColumn>DSGVODELETEFLAGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DSGVODELETEFLAGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DISTRICT</name> + <dbName></dbName> + <idColumn>DISTRICTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISO3</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_INFO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_AUTOADD</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENTDISTRICT_DISTRICTID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_NUMBER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_FILTER</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> + <name>AB_COUNTRYINFO</name> + <dbName></dbName> + <idColumn>ISO2</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ADDR_FORMAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME_LATIN</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> + <entityFieldDb> + <name>NAME_NATIVE</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> + <entityFieldDb> + <name>FLAG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2004" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISO3</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REQUIRED_FIELDS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ZIP_REGEX</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="1000" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISO2</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="2" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DUPLICATESCANNER</name> + <dbName></dbName> + <idColumn>ID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ID_FIELD_NAME</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> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SCAN_PATTERN</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>FILTER_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTITY_TO_SCAN_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXTERNAL_SERVICE_USAGE_ALLOWED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CAMPAIGN</name> + <dbName></dbName> + <idColumn>CAMPAIGNID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CURRENCY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LOCATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EVENT_BEGIN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EVENTTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMPLOYEE_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EVENT_END</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DOCUMENTTEMPLATE</name> + <dbName></dbName> + <idColumn>DOCUMENTTEMPLATEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DOCUMENTTEMPLATEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KIND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REPLACEMENTNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CHECKLIST</name> + <dbName></dbName> + <idColumn>CHECKLISTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CHECKLISTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_LANGUAGE</name> + <dbName></dbName> + <idColumn>ISO3</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>NAME_LATIN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="100" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME_NATIVE</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> + <entityFieldDb> + <name>ISO3</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISACTIVE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISO2</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="2" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LEADIMPORTMAPPINGASSISTANT</name> + <dbName></dbName> + <idColumn>LEADIMPORTMAPPINGASSISTANTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>LEADIMPORTMAPPINGASSISTANTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELDNAME</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> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INPUTVALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OUTPUTVALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADIMPORT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SERIALLETTER</name> + <dbName></dbName> + <idColumn>SERIALLETTERID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DOCUMENTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SERIALLETTERID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_KEYWORD_ATTRIBUTERELATION</name> + <dbName></dbName> + <idColumn>AB_KEYWORD_ATTRIBUTERELATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CHAR_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LONG_CHAR_VALUE</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>BOOL_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_ATTRIBUTERELATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NUMBER_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_ATTRIBUTE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_ENTRY_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>EXPORTTEMPLATESELECTION</name> + <dbName></dbName> + <idColumn>EXPORTTEMPLATESELECTIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>EXPORTTEMPLATESELECTIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXPORTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FILENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="33" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>TICKET</name> + <dbName></dbName> + <idColumn>TICKETID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TICKETTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TICKETID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TASK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DATABASECHANGELOG</name> + <dbName></dbName> + <idColumn></idColumn> + <idGeneratorType v="1" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>EXECTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATEEXECUTED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORDEREXECUTED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMMENTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AUTHOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTEXTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MD5SUM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="35" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LIQUIBASE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="20" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DEPLOYMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TAG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LABELS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FILENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>VISITPLANENTRY</name> + <dbName></dbName> + <idColumn>VISITPLANENTRYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>END_TIME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="92" /> + <size v="8" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BEGIN_TIME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="92" /> + <size v="8" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VISITPLANEMPLOYEEWEEK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VISITRECOMMENDATION_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS_APPOINTMENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VISITPLANENTRYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>APPOINTMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTRYDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="91" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGANISATION_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATIONSCORE</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONSCOREID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CLASSIFICATIONTYPE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONSCOREID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SCOREPERCENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="10" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DISTRICTCONTACT</name> + <dbName></dbName> + <idColumn>DISTRICTCONTACTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ADVISER_ROLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICTCONTACTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_UNTIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORIGIN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADVISER_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_FROM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LEAD</name> + <dbName></dbName> + <idColumn>LEADID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ZIP</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CUSTOMERCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIRSTNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE_LOYALTY</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> + <entityFieldDb> + <name>DUPLICAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMINTERNET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MIDDLENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COUNTRY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="2" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LASTNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TAXCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGCOUNTRYCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMXING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADIMPORT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMLINKEDIN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BUILDINGNO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE_INDUSTRY</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> + <entityFieldDb> + <name>CONTACTPOSITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE03</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> + <entityFieldDb> + <name>ATTRIBUTE02</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> + <entityFieldDb> + <name>CONTACTROLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="60" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMBLOG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERSINFO</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>DEPARTMENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REGION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMXING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERSON_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMPHONE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMMOBIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMINTERNET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEGALFORM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMEMAIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMLINKEDIN</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUPSTATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="20" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>O_COMMBLOG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GENDER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE04</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> + <entityFieldDb> + <name>LETTERSALUTATION</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> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMPHONE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGANISATION_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMMOBIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATEOFBIRTH</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VATCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>P_COMMEMAIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGINFO</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>PROVINCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CONTACT</name> + <dbName></dbName> + <idColumn>CONTACTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACTPOSITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACTROLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGANISATION_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DEPARTMENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PERSON_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LETTERSALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESS_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LEADLOG</name> + <dbName></dbName> + <idColumn>LEADLOGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ROWSINSERTED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORTSOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORTERRORS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADLOGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORTCANCELED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="1" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADIMPORT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LEADTEMP</name> + <dbName></dbName> + <idColumn>LEADTEMPID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>COLUMN18</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN17</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN19</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN14</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN13</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN16</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN15</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN10</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN12</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN11</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN30</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADTEMPID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>POSITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORT_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN07</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN29</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN06</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN28</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN09</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN08</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN03</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN25</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN02</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN24</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN05</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN27</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN04</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN26</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN21</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN20</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN01</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN23</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COLUMN22</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="300" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ROW_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>BULKMAILRECIPIENT</name> + <dbName></dbName> + <idColumn>BULKMAILRECIPIENTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BULKMAIL_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMAIL_ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROBLEM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BULKMAILRECIPIENTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENTDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LEADIMPORT</name> + <dbName></dbName> + <idColumn>LEADIMPORTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RECORD_SEPARATOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELD_SEPARATOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LEADIMPORTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORTEMPLOYEE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORTSOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IMPORT_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELD_DELIMITER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HEADLINE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="1" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>FORECAST</name> + <dbName></dbName> + <idColumn>FORECASTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GROUPCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FORECASTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VOLUME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_START</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>VISITRECOMMENDATION</name> + <dbName></dbName> + <idColumn>VISITRECOMMENDATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>RESPONSIBLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUE_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VISITRECOMMENDATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRIORITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_PERSON_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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> + <name>OBSERVATION</name> + <dbName></dbName> + <idColumn>OBSERVATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_FILTER</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBSERVATION_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NOTIFICATION_PRIO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBSERVATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGEREVENTDELETE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGEREVENTINSERT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGEREVENTUPDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBSERVER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_FIELD</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> + <name>SALUTATION</name> + <dbName></dbName> + <idColumn>SALUTATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SEX</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALUTATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HEADLINE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LETTERSALUTATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATIONSTORAGE</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONSTORAGEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONVALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="20" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLASSIFICATIONSTORAGEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OUTDATED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMPETITION</name> + <dbName></dbName> + <idColumn>COMPETITIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PHASE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMPETITIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</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>DATE_CANCELLED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>MST_TEAM</name> + <dbName></dbName> + <idColumn>MST_TEAMID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>MST_TEAMID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IS_ARCHIVED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SERVICE_URL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TEAMNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GENERAL_CHANNELID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="48" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WEB_URL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>PRODUCT</name> + <dbName></dbName> + <idColumn>PRODUCTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>UNIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PICTURE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2004" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADVERTISING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="1" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRODUCTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRODUCTNAME</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> + <entityFieldDb> + <name>PRODUCTCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="100" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MINSTOCK</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GROUPCODEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>TASK</name> + <dbName></dbName> + <idColumn>TASKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>REQUESTOR_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRIORITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>START_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MATURITY_DATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TASKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</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>KIND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROGRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EDITOR_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SUBJECT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROTECTIONLEVEL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENT_CONTEXT</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> + </entityFields> + </entityDb> + <entityDb> + <name>AB_KEYWORD_ENTRY</name> + <dbName></dbName> + <idColumn>AB_KEYWORD_ENTRYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ISESSENTIAL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTAINER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="100" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KEYID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISACTIVE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_CATEGORY_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_ENTRYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_OBJECTRELATIONTYPE</name> + <dbName></dbName> + <idColumn>AB_OBJECTRELATIONTYPEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>AB_OBJECTRELATIONTYPEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SIDE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RELATION_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ICON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RELATION_TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HIERARCHY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CLASSIFICATIONGROUP</name> + <dbName></dbName> + <idColumn>CLASSIFICATIONGROUPID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CLASSIFICATIONGROUPID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_APPOINTMENTLINK</name> + <dbName></dbName> + <idColumn>AB_APPOINTMENTLINK_ID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_APPOINTMENTLINK_ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>APPOINTMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CAMPAIGNSTEP</name> + <dbName></dbName> + <idColumn>CAMPAIGNSTEPID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CAMPAIGN_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PREDECESSORSTEP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNSTEPID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STEPMEDIUM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_START</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="91" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMPLOYEE_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MAXPARTICIPANTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_END</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="91" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>ORGANISATION</name> + <dbName></dbName> + <idColumn>ORGANISATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CUSTOMERCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PICTURE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2004" /> + <size v="2147483647" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KIND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>SALESAREA</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ORGANISATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CAMPAIGNCOST</name> + <dbName></dbName> + <idColumn>CAMPAIGNCOSTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CAMPAIGN_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNCOSTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CATEGORY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNSTEP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DSGVO</name> + <dbName></dbName> + <idColumn>DSGVOID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DSGVOTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_TO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUORITYSOURCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DSGVOID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PURPOSE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ROW_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_ATTRIBUTERELATION</name> + <dbName></dbName> + <idColumn>AB_ATTRIBUTERELATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>INT_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NUMBER_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_ATTRIBUTERELATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHAR_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_ATTRIBUTE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID_VALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>ACTIVITYLINK</name> + <dbName></dbName> + <idColumn>ACTIVITYLINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ACTIVITYLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ACTIVITY_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>ADDRESS</name> + <dbName></dbName> + <idColumn>ADDRESSID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ZIP</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="3" /> + <size v="11" /> + <scale v="8" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDR_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REGION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESSADDITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="60" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COUNTRY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="2" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESSID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROVINCE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRIDENTIFIER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="60" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="3" /> + <size v="10" /> + <scale v="8" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BUILDINGNO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DOCUMENTTEMPLATELINK</name> + <dbName></dbName> + <idColumn>DOCUMENTTEMPLATELINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DOCUMENTTEMPLATE_ID_PARENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DOCUMENTTEMPLATELINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DOCUMENTTEMPLATE_ID_CHILD</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>WORKFLOWSIGNAL</name> + <dbName></dbName> + <idColumn>WORKFLOWSIGNALID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SIGNAL_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WORKFLOWSIGNALID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGER_EVENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_CONDITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROCESSDEFINITION_KEY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VARIABLES</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGEMANAGEMENT</name> + <dbName></dbName> + <idColumn>KNOWLEDGEMANAGEMENTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CONTENTDECODED</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>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AUTHOR_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTENT</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>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PUBLISH</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RESPONSIBLE_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>BULKMAIL</name> + <dbName></dbName> + <idColumn>BULKMAILID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DOCUMENTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USE_TEMPLATE_ATTACHMENTS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>BULKMAILID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="500" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENDER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TESTING_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SUBJECT</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> + <entityFieldDb> + <name>TESTING_EMAIL_ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CREATEACTIVITIES</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMMUNICATION</name> + <dbName></dbName> + <idColumn>COMMUNICATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ISSTANDARD</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MEDIUM_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>COMMUNICATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_OBJECTRELATION</name> + <dbName></dbName> + <idColumn>AB_OBJECTRELATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>AB_OBJECTRELATIONTYPE1</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_OBJECTRELATIONTYPE2</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT2_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>OBJECT1_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_OBJECTRELATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>UNRELATEDDUPLICATES</name> + <dbName></dbName> + <idColumn>ID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CLUSTERID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SOURCEDUPLICATEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>UNRELATEDDUPLICATEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGEGITINTERFACE</name> + <dbName></dbName> + <idColumn>KNOWLEDGEGITINTERFACEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEGITINTERFACEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GITCOMMIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SYSTEMNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>TASKLINK</name> + <dbName></dbName> + <idColumn>TASKLINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TASKLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TASK_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGETAG</name> + <dbName></dbName> + <idColumn>KNOWLEDGETAGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>KNOWLEDGETAGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TAG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DOCUMENTTEMPLATEPLACEOFUSE</name> + <dbName></dbName> + <idColumn>DOCUMENTTEMPLATEPLACEOFUSEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DOCUMENTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PLACEOFUSE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DOCUMENTTEMPLATEPLACEOFUSEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>LETTERRECIPIENT</name> + <dbName></dbName> + <idColumn>LETTERRECIPIENTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SERIALLETTER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LETTERRECIPIENTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>MST_TEAMLINK</name> + <dbName></dbName> + <idColumn>MST_TEAMLINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MST_TEAM_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MST_TEAMLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CONTRACT</name> + <dbName></dbName> + <idColumn>CONTRACTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CONTRACTCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTDUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYMENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTSTATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTEND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTRACTSTART</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REMARK</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> + <name>SALESPROJECT</name> + <dbName></dbName> + <idColumn>SALESPROJECTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STARTDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VOLUME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>ENDDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PHASE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROBABILITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="3" /> + <size v="6" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROJECTCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASONS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="498" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESPROJECTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROJECTTITLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="150" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CAMPAIGNPARTICIPANT</name> + <dbName></dbName> + <idColumn>CAMPAIGNPARTICIPANTID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>CAMPAIGN_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNPARTICIPANTID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>RESPONSIBLE_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CAMPAIGNSTEP_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DESCRIPTIONTRANSLATION</name> + <dbName></dbName> + <idColumn>DESCRIPTIONTRANSLATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTIONTRANSLATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</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>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LANG</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DISTRICTRESPONSIBLE</name> + <dbName></dbName> + <idColumn>DISTRICTRESPONSIBLEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ADVISER_STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICTRESPONSIBLEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADVISER_ROLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DEPARTMENT_ATTRIBUTE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISTRICT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMPLOYEE_CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_FROM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALID_UNTIL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SALESPROJECT_MILESTONE</name> + <dbName></dbName> + <idColumn>SALESPROJECT_MILESTONEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>MILESTONEVALUE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KIND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESPROJECT_MILESTONEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_START</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESPROJECT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_END</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>COMMRESTRICTION</name> + <dbName></dbName> + <idColumn>COMMRESTRICTIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>COMMRESTRICTIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MEDIUM</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>STARTDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EMPLOYEE_INVOLVED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>REASON</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>OBJECTMEMBER</name> + <dbName></dbName> + <idColumn>OBJECTMEMBERID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECTMEMBERID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ONSITE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>MEMBERROLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DUPLICATECLUSTERS</name> + <dbName></dbName> + <idColumn>ID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DUPLICATEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CLUSTERID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TARGET_ENTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="200" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>EXPORTTEMPLATE</name> + <dbName></dbName> + <idColumn>EXPORTTEMPLATEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>FIELDSEPARATOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="1337" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXPORTTEMPLATEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FIELDDELIMITER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TITLE</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> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SENTENCESEPARATOR</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>PROD2PROD</name> + <dbName></dbName> + <idColumn>PROD2PRODID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OPTIONAL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TAKEPRICE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SOURCE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>QUANTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DEST_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROD2PRODID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>TIMETRACKING</name> + <dbName></dbName> + <idColumn>TIMETRACKINGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>TIMETRACKINGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRACKINGMINUTES</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>TRACKINGDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ROW_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_ATTRIBUTE</name> + <dbName></dbName> + <idColumn>AB_ATTRIBUTEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>ATTRIBUTE_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DROPDOWNDEFINITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_ATTRIBUTEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE_ACTIVE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VALIDATIONPARAMETERS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DROPDOWNFILTER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ATTRIBUTE_INFO</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>ATTRIBUTE_PARENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_KEYWORD_ATTRIBUTE</name> + <dbName></dbName> + <idColumn>AB_KEYWORD_ATTRIBUTEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>AB_KEYWORD_ATTRIBUTEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KIND</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTAINER</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="80" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_KEYWORD_CATEGORY_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="100" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>CHECKLISTENTRYVALUE</name> + <dbName></dbName> + <idColumn>CHECKLISTENTRYVALUEID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>IS_FULFILLED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHECKLISTENTRYVALUEID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CHECKLISTENTRY_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_LOGHISTORY</name> + <dbName></dbName> + <idColumn>AB_LOGHISTORYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>TABLENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DESCRIPTION</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>SOURCE_TABLENAMEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LOGTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="1" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SOURCE_TABLENAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_LOGHISTORYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TABLENAMEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>EXPORTTEMPLATEFIELD</name> + <dbName></dbName> + <idColumn>EXPORTTEMPLATEFIELDID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>FIELD</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXPORTTEMPLATEFIELDID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SORTING</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>EXPORTTEMPLATE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGETAGLINK</name> + <dbName></dbName> + <idColumn>KNOWLEDGETAGLINKID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGETAGLINKID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGETAG_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>DATABASECHANGELOGLOCK</name> + <dbName></dbName> + <idColumn>ID</idColumn> + <idGeneratorType v="1" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>LOCKGRANTED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LOCKED</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="16" /> + <size v="1" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>LOCKEDBY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SALESORDER</name> + <dbName></dbName> + <idColumn>SALESORDERID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>NOTICE</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>DISCOUNTED_VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYDUEDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>HEADER</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>SALESORDERCODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CANCELLATION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUNNINGTEXT</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>SALESORDERDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESORDER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUNNINGLEVEL</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESORDERID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DUNNINGDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CURRENCY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ISOLANGUAGE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="3" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYMENTTERMS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DELIVERYTERMS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_ROWID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAYMENTADDRESS</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>ORDERTYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OFFER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PAID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="3" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>FOOTER</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>DISCOUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNTED_NET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DELIVERYADDRESS</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>ORDERSTATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="5" /> + <size v="5" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>NET</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>KNOWLEDGEMANAGEMENTTAGMODERATION</name> + <dbName></dbName> + <idColumn>KNOWLEDGEMANAGEMENTTAGMODERATIONID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>STATUS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>AB_ATTRIBUTE_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>KNOWLEDGEMANAGEMENTTAGMODERATIONID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>SALESORDERITEM</name> + <dbName></dbName> + <idColumn>SALESORDERITEMID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>UNIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PRICE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>QUANTITY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>VAT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>PRODUCT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DISCOUNT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="2" /> + <size v="14" /> + <scale v="2" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMPOSITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>GROUPCODEID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMSORT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="4" /> + <size v="10" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESORDER_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ASSIGNEDTO</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SALESORDERITEMID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ITEMNAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="250" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>AB_CTILOG</name> + <dbName></dbName> + <idColumn>AB_CTILOGID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>AB_CTILOGID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ANSWERMODE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CALLID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="64" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ADDRESS</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="30" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DIRECTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CONTACT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> + <entityDb> + <name>ACTIVITY</name> + <dbName></dbName> + <idColumn>ACTIVITYID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>RESPONSIBLE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DIRECTION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ENTRYDATE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>INFO</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>USER_EDIT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>ACTIVITYID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENT_ID</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="true" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>CATEGORY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>SUBJECT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="254" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>DATE_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="93" /> + <size v="29" /> + <scale v="9" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>USER_NEW</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="50" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PARENT_CONTEXT</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> + </entityFields> + </entityDb> + </entities> + </entityGroup> + </aliasDefDb> + </aliasDefinitionSub> +</aliasDefinition> diff --git a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod index d67029e7214916e37526a955729915a48c2b80a0..25b0e7dfca8fb6805941e079c2a1ac0e066fad53 100644 --- a/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod +++ b/application/_____SYSTEM_APPLICATION_NEON/_____SYSTEM_APPLICATION_NEON.aod @@ -196,6 +196,18 @@ <name>DocumentTemplate</name> <kind v="10077" /> </entityNode> + <entityNode> + <name>Weblink</name> + <kind v="10077" /> + </entityNode> + <entityNode> + <name>Interest</name> + <kind v="10077" /> + </entityNode> + <entityNode> + <name>CommunicationBlacklist</name> + <kind v="10077" /> + </entityNode> </childNodes> </entityNode> <entityNode> @@ -318,11 +330,6 @@ <kind v="10077" /> <title></title> </entityNode> - <entityNode> - <name>Duplicates</name> - <kind v="10077" /> - <title></title> - </entityNode> <entityNode> <name>AuditLogHistory</name> <kind v="10077" /> @@ -350,6 +357,24 @@ </entityNode> </childNodes> </entityNode> + <entityNode> + <name>Group13</name> + <kind v="123" /> + <childNodes> + <entityNode> + <name>INTERNAL_ADMINISTRATOR</name> + <kind v="159" /> + </entityNode> + <entityNode> + <name>DSGVOConfiguration</name> + <kind v="10077" /> + </entityNode> + <entityNode> + <name>PROJECT_DSGVO</name> + <kind v="159" /> + </entityNode> + </childNodes> + </entityNode> </childNodes> </entityNode> <entityNode> diff --git a/entity/360Degree_entity/entityfields/newmodule/stateProcess.js b/entity/360Degree_entity/entityfields/newmodule/stateProcess.js index 0b02ed053a7ba32d8f740031e0c5ceb72f1c3716..bb33b08a687ae6dc0ba285fbef672ba7f8f701e8 100644 --- a/entity/360Degree_entity/entityfields/newmodule/stateProcess.js +++ b/entity/360Degree_entity/entityfields/newmodule/stateProcess.js @@ -5,5 +5,7 @@ import("KeywordRegistry_basic"); var objectStatusParam = vars.get("$param.ObjectStatus_param"); -if (objectStatusParam == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (objectStatusParam == $KeywordRegistry.contactStatus$inactive() || objectStatusParam == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Address_entity/Address_entity.aod b/entity/Address_entity/Address_entity.aod index 6a673e9aac4d858ba63d07b76b4105d4cb90a7e6..320df4d9ebd700114e5e2eb57420bef95bc7089e 100644 --- a/entity/Address_entity/Address_entity.aod +++ b/entity/Address_entity/Address_entity.aod @@ -146,6 +146,12 @@ <fieldName>ContactAddresses</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>03534109-04a7-4deb-b139-5c548aa2fd00</name> + <entityName>CommunicationChannel_entity</entityName> + <fieldName>Addresses</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/Address_entity/afterOperatingState.js b/entity/Address_entity/afterOperatingState.js index 23f607ff7d13f5153ef6e252d1f8e6b185218040..83cbe277d0eae36e6744186d6d70f35fb00f42f8 100644 --- a/entity/Address_entity/afterOperatingState.js +++ b/entity/Address_entity/afterOperatingState.js @@ -3,4 +3,12 @@ import("system.neon"); //in some cases, the field does not exist yet/not anymore when the afterOperatingState process is called if (vars.exists("$field.AddressSearch")) - neon.setFieldValue("$field.AddressSearch", "");//why is this needed? \ No newline at end of file +{ + neon.setFieldValue("$field.AddressSearch", "");//why is this needed? +} + +if(vars.exists("$sys.operatingstate") && vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_VIEW) +{ + vars.set("$context.PushDataPrivacyNotification", "false"); +} + diff --git a/entity/Address_entity/recordcontainers/db/onDBInsert.js b/entity/Address_entity/recordcontainers/db/onDBInsert.js index cddb15a9f8fd75177c6a219a72f240d56a1b257b..b088c7a1b3db64fb4592621cdb93bd95298c94d8 100644 --- a/entity/Address_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Address_entity/recordcontainers/db/onDBInsert.js @@ -49,7 +49,11 @@ if(scopeType == "Organisation") } } -DataPrivacyUtils.notifyNeedDataPrivacyUpdate(rowdata["ADDRESS.CONTACT_ID"], vars.get("$param.ShowDsgvoMessage_param")); +if(vars.exists("$context.PushDataPrivacyNotification") && vars.get("$context.PushDataPrivacyNotification") == "false" && vars.get("$sys.isclient")) +{ + DataPrivacyUtils.notifyNeedDataPrivacyUpdate(rowdata["COMMUNICATION.CONTACT_ID"], vars.get("$param.ShowDsgvoMessage_param")); + vars.set("$context.PushDataPrivacyNotification", "true"); +} var address = new AddressObject(rowdata["ADDRESS.ADDRESS"], rowdata["ADDRESS.BUILDINGNO"], rowdata["ADDRESS.ZIP"], rowdata["ADDRESS.CITY"], rowdata["ADDRESS.COUNTRY"], rowdata["ADDRESS.STATE"]); var addressLocation = new LocationFinder().getGeoLocation(address); diff --git a/entity/Address_entity/recordcontainers/db/onDBUpdate.js b/entity/Address_entity/recordcontainers/db/onDBUpdate.js index 87c3f2c27180a26dfb2d548acf385067807800a8..8ce04bc6f3d87c4b41a081af756c2a384f522a8f 100644 --- a/entity/Address_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/Address_entity/recordcontainers/db/onDBUpdate.js @@ -7,7 +7,11 @@ import("DataPrivacy_lib"); var rowdata = vars.get("$local.rowdata"); -DataPrivacyUtils.notifyNeedDataPrivacyUpdate(rowdata["ADDRESS.CONTACT_ID"], vars.get("$param.ShowDsgvoMessage_param")); +if(vars.exists("$context.PushDataPrivacyNotification") && vars.get("$context.PushDataPrivacyNotification") == "false" && vars.get("$sys.isclient")) +{ + DataPrivacyUtils.notifyNeedDataPrivacyUpdate(rowdata["COMMUNICATION.CONTACT_ID"], vars.get("$param.ShowDsgvoMessage_param")); + vars.set("$context.PushDataPrivacyNotification", "true"); +} var changed = vars.get("$local.changed"); var isAddressChanged = changed.includes("ADDRESS.ADDRESS") diff --git a/entity/AdminViewRow_entity/AdminViewRow_entity.aod b/entity/AdminViewRow_entity/AdminViewRow_entity.aod index eb56b773bae0329432467ddd786d80a0b7805dc6..3310f1bc7a250aa6498e057dd5f132e0dd0c6e91 100644 --- a/entity/AdminViewRow_entity/AdminViewRow_entity.aod +++ b/entity/AdminViewRow_entity/AdminViewRow_entity.aod @@ -48,6 +48,9 @@ <onActionProcess>%aditoprj%/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js</onActionProcess> <iconId>VAADIN:CLIPBOARD</iconId> </entityActionField> + <entityParameter> + <name>CopiedField_param</name> + </entityParameter> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js b/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js index dd853d9ace41d189f6b152f075fee9c1038e0ecb..2704822e2a27ba7a04b04e33f7e5d1e8e39214fa 100644 --- a/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js +++ b/entity/AdminViewRow_entity/entityfields/copyvaluetoclipboard/onActionProcess.js @@ -8,4 +8,8 @@ var row = fieldValues.find(function ([id]) return id === fieldId; }); if (row) - neon.copyToClipboard(row[2]); \ No newline at end of file +{ + neon.copyToClipboard(row[2]); + vars.set("$param.CopiedField_param", fieldId); + neon.refresh(); +} \ No newline at end of file diff --git a/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js index 1aa381774a2bfaf28ac963e84c63dda45cbf7192..032f17fc800e63291177f9c488a0d7a3410db446 100644 --- a/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/AdminViewRow_entity/recordcontainers/jdito/contentProcess.js @@ -1,4 +1,12 @@ import("system.vars"); import("system.result"); -result.object(JSON.parse(vars.getString("$param.Rows_param"))); \ No newline at end of file +var rows = JSON.parse(vars.getString("$param.Rows_param")); +var copiedField = vars.get("$param.CopiedField_param"); +if (copiedField) +{ + var copiedRow = rows.find(function ([uid]) {return uid == copiedField;}); + if (copiedRow) + copiedRow[1] = copiedRow[1] + " (Copied!)"; +} +result.object(rows); \ No newline at end of file diff --git a/entity/AnyContact_entity/AnyContact_entity.aod b/entity/AnyContact_entity/AnyContact_entity.aod index f5301bfdd0b5e89907e2e6d06ff321acb8bf70a2..f074dfa8dc592f164be35e53187aabf2766c7bdb 100644 --- a/entity/AnyContact_entity/AnyContact_entity.aod +++ b/entity/AnyContact_entity/AnyContact_entity.aod @@ -78,6 +78,24 @@ <fieldName>AnyContacts</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>b3cf7b34-6ea4-411a-8123-34afd7e10cfc</name> + <entityName>MailLog_entity</entityName> + <fieldName>Contacts</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>578dbb91-ea76-40ec-9dbd-9acf462ceba7</name> + <entityName>BulkMailTestRecipient_entity</entityName> + <fieldName>Contacts</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>cb874ee2-e147-4311-bdf1-a94df537bb9e</name> + <entityName>WeblinkClick_entity</entityName> + <fieldName>Contacts</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> <entityProvider> diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js b/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js index 2836dcd5bc7ee17da8d0d75e560f05b6117a36ea..f456452e9d7bbb00db08bf0ddc83ee8b955bb20a 100644 --- a/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js +++ b/entity/AttributeRelation_entity/recordcontainers/jdito/onInsert.js @@ -1,3 +1,4 @@ +import("Sql_lib"); import("Workflow_lib"); import("DataPrivacy_lib"); import("system.datetime"); @@ -39,7 +40,14 @@ if (valueField) } db.insertData("AB_ATTRIBUTERELATION", columns, null, values); -if (vars.get("$param.ObjectType_param") == "Person") +let countDSGVOUsage = parseInt(newSelect("COUNT(*)") +.from("AB_ATTRIBUTEUSAGE") +.where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "DSGVO") +.and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", rowdata["AB_ATTRIBUTE_ID.value"]).cell()); + +if (vars.get("$param.ObjectType_param") == "Person" && countDSGVOUsage) +{ DataPrivacyUtils.notifyNeedDataPrivacyUpdate(vars.get("$param.ObjectRowId_param"), vars.get("$param.ShowDsgvoMessage_param")); +} WorkflowSignalSender.inserted(); \ No newline at end of file diff --git a/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js b/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js index e88af46b5b0766cd413f835d6435b7b19609693c..5dc936c76f55f5fc24ab8c8464e2fe25c57f9ed1 100644 --- a/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js +++ b/entity/AttributeRelation_entity/recordcontainers/jdito/onUpdate.js @@ -11,27 +11,27 @@ var attributeId = rowdata["AB_ATTRIBUTE_ID.value"] var type = AttributeUtil.getAttributeType(attributeId); var showEmpty = vars.getString("$param.ShowEmpty_param") == "true"; var attributeRelationId = showEmpty - ? JSON.parse(vars.get("$local.uid"))[0] - : vars.get("$local.uid"); +? JSON.parse(vars.get("$local.uid"))[0] +: vars.get("$local.uid"); if (showEmpty && !rowdata["AB_ATTRIBUTERELATIONID.value"].trim()) { var columns = [ - "AB_ATTRIBUTERELATIONID", - "AB_ATTRIBUTE_ID", - "OBJECT_ROWID", - "OBJECT_TYPE", - "DATE_NEW", - "USER_NEW" + "AB_ATTRIBUTERELATIONID", + "AB_ATTRIBUTE_ID", + "OBJECT_ROWID", + "OBJECT_TYPE", + "DATE_NEW", + "USER_NEW" ]; var values = [ - attributeRelationId, - attributeId, - vars.get("$param.ObjectRowId_param"), - vars.get("$param.ObjectType_param"), - vars.get("$sys.date"), - vars.get("$sys.user") + attributeRelationId, + attributeId, + vars.get("$param.ObjectRowId_param"), + vars.get("$param.ObjectType_param"), + vars.get("$sys.date"), + vars.get("$sys.user") ]; var valueField = AttributeTypeUtil.getDatabaseField(type); var value; @@ -61,15 +61,22 @@ else }); var attributeValue = AttributeTypeUtil.useLookup(type) - ? rowdata["VALUE_LOOKUP.value"] - : rowdata["VALUE.value"]; + ? rowdata["VALUE_LOOKUP.value"] + : rowdata["VALUE.value"]; fieldValues[AttributeTypeUtil.getDatabaseField(type)] = attributeValue; var attributeCondition = newWhere("AB_ATTRIBUTERELATION.AB_ATTRIBUTERELATIONID", attributeRelationId); attributeCondition.updateFields(fieldValues); } -if (vars.get("$param.ObjectType_param") == "Person") +let countDSGVOUsage = parseInt(newSelect("COUNT(*)") + .from("AB_ATTRIBUTEUSAGE") + .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "DSGVO") + .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", attributeId).cell()); + +if (vars.get("$param.ObjectType_param") == "Person" && countDSGVOUsage) +{ DataPrivacyUtils.notifyNeedDataPrivacyUpdate(vars.get("$param.ObjectRowId_param"), vars.get("$param.ShowDsgvoMessage_param")); +} WorkflowSignalSender.updated(); \ No newline at end of file diff --git a/entity/AttributeUsage_entity/AttributeUsage_entity.aod b/entity/AttributeUsage_entity/AttributeUsage_entity.aod index 7537ce268732fefca76ffe7f04f87d7b4e5d98fa..19cd75197be85fa49cad58cd153a5f9b7eca05f1 100644 --- a/entity/AttributeUsage_entity/AttributeUsage_entity.aod +++ b/entity/AttributeUsage_entity/AttributeUsage_entity.aod @@ -17,6 +17,7 @@ <name>OBJECT_TYPE</name> <title>Module</title> <consumer>Context</consumer> + <groupable v="true" /> <mandatory v="true" /> <displayValueProcess>%aditoprj%/entity/AttributeUsage_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess> <onValueChangeTypes> diff --git a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js index 9f76fa5aee84c3a16afea2c3efe3900b03cf64c1..ba69144b21acba47c5eb7ade4dbad30ec0402bed 100644 --- a/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/Attribute_entity/recordcontainers/jdito/contentProcess.js @@ -1,232 +1,232 @@ -import("Context_lib"); -import("system.translate"); -import("Util_lib"); -import("JditoFilter_lib"); -import("KeywordRegistry_basic"); -import("Keyword_lib"); -import("system.db"); -import("system.vars"); -import("system.result"); -import("Sql_lib"); -import("Attribute_lib"); - -var childId = vars.get("$param.ChildId_param"); -var childType = vars.get("$param.ChildType_param"); - -var objectType = vars.get("$param.ObjectType_param"); -var filteredIds = Utils.parseJSON(vars.get("$param.FilteredAttributeIds_param")); -var attributeCountObj = Utils.parseJSON(vars.get("$param.AttributeCount_param")); -var displaySimpleName = Utils.toBoolean(vars.get("$param.DisplaySimpleName_param")); - -var themeObjectRowId = vars.get("$param.ThemeObjectRowId_param"); - -var parentId = vars.get("$param.ParentId_param"); -var includeParentRecord = Utils.toBoolean(vars.get("$param.IncludeParentRecord_param")); -var onlyFirstLevelChildren = Utils.toBoolean(vars.get("$param.GetOnlyFirstLevelChildren_param")); - -var fetchUsages = false; -var translateName = false; - -var condition = newWhere(); - -if (vars.exists("$local.idvalues") && vars.get("$local.idvalues")) -{ - condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", vars.get("$local.idvalues"), SqlBuilder.IN()); - fetchUsages = true; -} -else if (childId) //if a childId is given, it is the lookup for selecting the superordinate attribute -{ - condition.and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypeUtil.getGroupTypes(childType), SqlBuilder.IN()); - - //filter out the child and all children of the child, because an attribute can't have itself or a subordinate attribute as parent - condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", [childId].concat(AttributeUtil.getAllChildren(childId)), SqlBuilder.NOT_IN()); -} -else if (objectType) //if there's an objectType, it comes from the AttributeRelation entity (lookup for the attribute selection) -{ - translateName = true; - - var attributeIds = AttributeUtil.getPossibleAttributes(objectType, true, filteredIds, attributeCountObj); - - if (Utils.isEmpty(attributeIds)) - condition.noResult(); - else - condition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeIds, SqlBuilder.IN()) - .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.THEME(), !themeObjectRowId ? SqlBuilder.NOT_EQUAL() : undefined); -} -else if (parentId) -{ - if (onlyFirstLevelChildren) - condition.and("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", parentId); - else - { - condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", AttributeUtil.getAllChildren(parentId), SqlBuilder.IN()); - translateName = true; - if(includeParentRecord) - condition.or("AB_ATTRIBUTE.AB_ATTRIBUTEID", parentId); - } -} -else -{ - fetchUsages = true; -} - -var filterCondition = new FilterSqlTranslator(vars.get("$local.filter"), "AB_ATTRIBUTE") - .addSpecialFieldConditionFn("USAGE_FILTER", function (pValue, pOperator) - { - var cond = newWhere(); - var subSelect = newSelect("1").from("AB_ATTRIBUTEUSAGE", "attrUse").where("attrUse.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"); - - switch (pOperator) - { - case "EQUAL": - case "NOT_EQUAL": - subSelect.and(["AB_ATTRIBUTEUSAGE", "OBJECT_TYPE", "attrUse"], pValue); - case "ISNULL": - case "ISNOTNULL": - return cond.and(null, subSelect, pOperator == "NOT_EQUAL" || pOperator == "ISNULL" ? SqlBuilder.NOT_EXISTS() : SqlBuilder.EXISTS()); - } - return cond; - }) - .getSqlCondition(); -condition.andIfSet(filterCondition); - -var usageLoader = new AttributeUsageLoader(); -if (fetchUsages) - usageLoader.fetchUsages(condition); - -var attributes = newSelect([ - "AB_ATTRIBUTEID", - "ATTRIBUTE_PARENT_ID", - "ATTRIBUTE_NAME", - "ATTRIBUTE_ACTIVE", - "DROPDOWNDEFINITION", - "DROPDOWNFILTER", - "VALIDATIONPARAMETERS", - "SORTING", - "ATTRIBUTE_TYPE", - KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "ATTRIBUTE_TYPE") - ]) - .from("AB_ATTRIBUTE") - .whereIfSet(condition) - .orderBy(["ATTRIBUTE_PARENT_ID", "SORTING", "ATTRIBUTE_NAME"]) - .table(); - -var nameResolver = new AttributeNameResolver(); -if (attributes.length !== 0) - nameResolver.fetchNames(translateName); - -var attributesById = new Map(); -attributes.forEach(function ([attributeId, parentId, simpleName, isActive, - dropDownDefinition, dropDownFilter, validationParameters, sorting, type, typeName]) -{ - attributesById.set(attributeId, [ - attributeId, - simpleName, - displaySimpleName ? nameResolver.getSimpleName(attributeId) : nameResolver.getFullName(attributeId), - parentId, - nameResolver.getFullName(parentId), - type, - typeName, - isActive, - sorting, - dropDownDefinition, - dropDownFilter, - validationParameters, - type != AttributeTypes.COMBOVALUE() ? usageLoader.getUsageSummary(attributeId) : "", - "usageFilter", - false - ]); -}); - -var resultTable = []; -do { - var oldSize = resultTable.length; - attributesById.forEach(function (row, id) - { - var parentId = row[3]; - //rows that are already in the result array are removed from the attributesById Map, so if the parentId is in that Map, - //the parent has not been added yet - if (!parentId || !attributesById.has(parentId)) - { - resultTable.push(row); - attributesById["delete"](id); - } - }); -} while (oldSize != resultTable.length); //stops the loop when no new items were added so that recursive relations between attributes don't cause an infinite loop - -result.object(resultTable); - - -function AttributeNameResolver () -{ - this.cache = new Map(); - this.nameData = new Map(); - this.fetchNames = function (pTranslateNames) - { - var allNames = newSelect(["AB_ATTRIBUTEID", "ATTRIBUTE_PARENT_ID", "ATTRIBUTE_NAME"]) - .from("AB_ATTRIBUTE") - .table(); - allNames.forEach(function ([attributeId, parentId, attributeName]) - { - this.nameData.set(attributeId, { - parentId: parentId, - name: pTranslateNames ? translate.text(attributeName) : attributeName - }); - }, this); - } - this.getSimpleName = function (pAttributeId) - { - if (this.nameData.has(pAttributeId)) - return this.nameData.get(pAttributeId).name; - return ""; - } - this.getFullName = function (pAttributeId) - { - if (!pAttributeId || !this.nameData.has(pAttributeId)) //if the id is not in this.nameData, it does not exist - return ""; - if (this.cache.has(pAttributeId)) - return this.cache.get(pAttributeId); - - var attributeData = this.nameData.get(pAttributeId); - var fullName = attributeData.name; - if (attributeData.parentId) - { - var parentName = this.getFullName(attributeData.parentId); - if (parentName) - fullName = parentName + " / " + fullName; - } - this.cache.set(pAttributeId, fullName); - return fullName; - } -} - -function AttributeUsageLoader () -{ - this.usageData = new Map(); - this.fetchUsages = function (pCondition) - { - var usages = newSelect(["AB_ATTRIBUTE_ID", "OBJECT_TYPE"]) - .from("AB_ATTRIBUTEUSAGE") - .join("AB_ATTRIBUTE", "AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID") - .whereIfSet(pCondition) - .table(); - usages.forEach(function ([attributeId, objectType]) - { - if (this.usageData.has(attributeId)) - this.usageData.get(attributeId).push(objectType); - else - this.usageData.set(attributeId, [objectType]); - }, this); - } - this.getUsages = function (pAttributeId) - { - return this.usageData.get(pAttributeId) || []; - } - this.getUsageSummary = function (pAttributeId) - { - return this.getUsages(pAttributeId).map(function (usage) - { - return ContextUtils.getTitle(usage, true); - }).join(", "); - } +import("Context_lib"); +import("system.translate"); +import("Util_lib"); +import("JditoFilter_lib"); +import("KeywordRegistry_basic"); +import("Keyword_lib"); +import("system.db"); +import("system.vars"); +import("system.result"); +import("Sql_lib"); +import("Attribute_lib"); + +var childId = vars.get("$param.ChildId_param"); +var childType = vars.get("$param.ChildType_param"); + +var objectType = vars.get("$param.ObjectType_param"); +var filteredIds = Utils.parseJSON(vars.get("$param.FilteredAttributeIds_param")); +var attributeCountObj = Utils.parseJSON(vars.get("$param.AttributeCount_param")); +var displaySimpleName = Utils.toBoolean(vars.get("$param.DisplaySimpleName_param")); + +var themeObjectRowId = vars.get("$param.ThemeObjectRowId_param"); + +var parentId = vars.get("$param.ParentId_param"); +var includeParentRecord = Utils.toBoolean(vars.get("$param.IncludeParentRecord_param")); +var onlyFirstLevelChildren = Utils.toBoolean(vars.get("$param.GetOnlyFirstLevelChildren_param")); + +var fetchUsages = false; +var translateName = false; + +var condition = newWhere(); + +if (vars.exists("$local.idvalues") && vars.get("$local.idvalues")) +{ + condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", vars.get("$local.idvalues"), SqlBuilder.IN()); + fetchUsages = true; +} +else if (childId) //if a childId is given, it is the lookup for selecting the superordinate attribute +{ + condition.and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypeUtil.getGroupTypes(childType), SqlBuilder.IN()); + + //filter out the child and all children of the child, because an attribute can't have itself or a subordinate attribute as parent + condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", [childId].concat(AttributeUtil.getAllChildren(childId)), SqlBuilder.NOT_IN()); +} +else if (objectType) //if there's an objectType, it comes from the AttributeRelation entity (lookup for the attribute selection) +{ + translateName = true; + + var attributeIds = AttributeUtil.getPossibleAttributes(objectType, true, filteredIds, attributeCountObj); + + if (Utils.isEmpty(attributeIds)) + condition.noResult(); + else + condition.and("AB_ATTRIBUTE.AB_ATTRIBUTEID", attributeIds, SqlBuilder.IN()) + .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.THEME(), !themeObjectRowId ? SqlBuilder.NOT_EQUAL() : undefined); +} +else if (parentId) +{ + if (onlyFirstLevelChildren) + condition.and("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID", parentId); + else + { + condition.andIfSet("AB_ATTRIBUTE.AB_ATTRIBUTEID", AttributeUtil.getAllChildren(parentId), SqlBuilder.IN()); + translateName = true; + if(includeParentRecord) + condition.or("AB_ATTRIBUTE.AB_ATTRIBUTEID", parentId); + } +} +else +{ + fetchUsages = true; +} + +var filterCondition = new FilterSqlTranslator(vars.get("$local.filter"), "AB_ATTRIBUTE") + .addSpecialFieldConditionFn("USAGE_FILTER", function (pValue, pOperator) + { + var cond = newWhere(); + var subSelect = newSelect("1").from("AB_ATTRIBUTEUSAGE", "attrUse").where("attrUse.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID"); + + switch (pOperator) + { + case "EQUAL": + case "NOT_EQUAL": + subSelect.and(["AB_ATTRIBUTEUSAGE", "OBJECT_TYPE", "attrUse"], pValue); + case "ISNULL": + case "ISNOTNULL": + return cond.and(null, subSelect, pOperator == "NOT_EQUAL" || pOperator == "ISNULL" ? SqlBuilder.NOT_EXISTS() : SqlBuilder.EXISTS()); + } + return cond; + }) + .getSqlCondition(); +condition.andIfSet(filterCondition); + +var usageLoader = new AttributeUsageLoader(); +if (fetchUsages) + usageLoader.fetchUsages(condition); + +var attributes = newSelect([ + "AB_ATTRIBUTEID", + "ATTRIBUTE_PARENT_ID", + "ATTRIBUTE_NAME", + "ATTRIBUTE_ACTIVE", + "DROPDOWNDEFINITION", + "DROPDOWNFILTER", + "VALIDATIONPARAMETERS", + "SORTING", + "ATTRIBUTE_TYPE", + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.attributeType(), "ATTRIBUTE_TYPE") + ]) + .from("AB_ATTRIBUTE") + .whereIfSet(condition) + .orderBy(["ATTRIBUTE_PARENT_ID", "SORTING", "ATTRIBUTE_NAME"]) + .table(); + +var nameResolver = new AttributeNameResolver(); +if (attributes.length !== 0) + nameResolver.fetchNames(translateName); + +var attributesById = new Map(); +attributes.forEach(function ([attributeId, parentId, simpleName, isActive, + dropDownDefinition, dropDownFilter, validationParameters, sorting, type, typeName]) +{ + attributesById.set(attributeId, [ + attributeId, + simpleName, + displaySimpleName ? nameResolver.getSimpleName(attributeId) : nameResolver.getFullName(attributeId), + parentId, + nameResolver.getFullName(parentId), + type, + typeName, + isActive, + sorting, + dropDownDefinition, + dropDownFilter, + validationParameters, + type != AttributeTypes.COMBOVALUE() ? usageLoader.getUsageSummary(attributeId) : "", + "usageFilter", + false + ]); +}); + +var resultTable = []; +do { + var oldSize = resultTable.length; + attributesById.forEach(function (row, id) + { + var parentId = row[3]; + //rows that are already in the result array are removed from the attributesById Map, so if the parentId is in that Map, + //the parent has not been added yet + if (!parentId || !attributesById.has(parentId)) + { + resultTable.push(row); + attributesById["delete"](id); + } + }); +} while (oldSize != resultTable.length); //stops the loop when no new items were added so that recursive relations between attributes don't cause an infinite loop + +result.object(resultTable); + + +function AttributeNameResolver () +{ + this.cache = new Map(); + this.nameData = new Map(); + this.fetchNames = function (pTranslateNames) + { + var allNames = newSelect(["AB_ATTRIBUTEID", "ATTRIBUTE_PARENT_ID", "ATTRIBUTE_NAME"]) + .from("AB_ATTRIBUTE") + .table(); + allNames.forEach(function ([attributeId, parentId, attributeName]) + { + this.nameData.set(attributeId, { + parentId: parentId, + name: pTranslateNames ? translate.text(attributeName) : attributeName + }); + }, this); + } + this.getSimpleName = function (pAttributeId) + { + if (this.nameData.has(pAttributeId)) + return this.nameData.get(pAttributeId).name; + return ""; + } + this.getFullName = function (pAttributeId) + { + if (!pAttributeId || !this.nameData.has(pAttributeId)) //if the id is not in this.nameData, it does not exist + return ""; + if (this.cache.has(pAttributeId)) + return this.cache.get(pAttributeId); + + var attributeData = this.nameData.get(pAttributeId); + var fullName = attributeData.name; + if (attributeData.parentId) + { + var parentName = this.getFullName(attributeData.parentId); + if (parentName) + fullName = parentName + " / " + fullName; + } + this.cache.set(pAttributeId, fullName); + return fullName; + } +} + +function AttributeUsageLoader () +{ + this.usageData = new Map(); + this.fetchUsages = function (pCondition) + { + var usages = newSelect(["AB_ATTRIBUTE_ID", "OBJECT_TYPE"]) + .from("AB_ATTRIBUTEUSAGE") + .join("AB_ATTRIBUTE", "AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID") + .whereIfSet(pCondition) + .table(); + usages.forEach(function ([attributeId, objectType]) + { + if (this.usageData.has(attributeId)) + this.usageData.get(attributeId).push(objectType); + else + this.usageData.set(attributeId, [objectType]); + }, this); + } + this.getUsages = function (pAttributeId) + { + return this.usageData.get(pAttributeId) || []; + } + this.getUsageSummary = function (pAttributeId) + { + return this.getUsages(pAttributeId).map(function (usage) + { + return ContextUtils.getTitle(usage, true); + }).join(", "); + } } \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod index 1d001090085c21d4535df8e8b11fbd770655ad08..337022169fdce959d28689ea9863bfbed69bc841 100644 --- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod +++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod @@ -82,7 +82,6 @@ <entityField> <name>EMAIL_ADDRESS</name> <title>Email</title> - <consumer>EmailAdresses</consumer> <textInputAllowed v="true" /> <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/email_address/valueProcess.js</valueProcess> <displayValueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/email_address/displayValueProcess.js</displayValueProcess> @@ -108,7 +107,7 @@ <state>READONLY</state> </entityField> <entityField> - <name>HASCOMMRESTRICTION</name> + <name>HASCOMMUNICATIONREJECTION</name> <title>Advertising ban</title> </entityField> <entityActionGroup> @@ -152,6 +151,60 @@ <name>#PROVIDER_AGGREGATES</name> <useAggregates v="true" /> </entityProvider> + <entityField> + <name>IS_TEST_RECIPIENT</name> + <title>Test</title> + <contentType>BOOLEAN</contentType> + <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/is_test_recipient/valueProcess.js</valueProcess> + </entityField> + <entityActionGroup> + <name>testRunActions</name> + <title>Test Run Actions</title> + <children> + <entityActionField> + <name>setTestRecipient</name> + <title>Use for test run</title> + <onActionProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/settestrecipient/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + </entityActionField> + <entityActionField> + <name>removeTestRecipient</name> + <title>Don't use for test run</title> + <onActionProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/removetestrecipient/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + </entityActionField> + </children> + </entityActionGroup> + <entityParameter> + <name>ExcludeCommunicationRejecting_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ExcludedStatus_param</name> + <expose v="true" /> + </entityParameter> + <entityProvider> + <name>RecipientsToBeMailed</name> + <children> + <entityParameter> + <name>ExcludedStatus_param</name> + <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludedstatus_param/valueProcess.js</valueProcess> + <expose v="false" /> + </entityParameter> + <entityParameter> + <name>ExcludeCommunicationRejecting_param</name> + <valueProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludecommunicationrejecting_param/valueProcess.js</valueProcess> + <expose v="false" /> + </entityParameter> + </children> + </entityProvider> + <entityParameter> + <name>IsTestMail_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ExcludeBlacklisted_param</name> + </entityParameter> </entityFields> <recordContainers> <dbRecordContainer> @@ -208,13 +261,10 @@ <name>CONTACT_ID.displayValue</name> <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression> </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>HASCOMMRESTRICTION.value</name> - <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js</expression> - </dbRecordFieldMapping> <dbRecordFieldMapping> <name>EMAIL_ADDRESS.value</name> <recordfield>BULKMAILRECIPIENT.EMAIL_ADDRESS</recordfield> + <isFilterable v="true" /> </dbRecordFieldMapping> <dbRecordFieldMapping> <name>PROBLEM.value</name> @@ -224,6 +274,14 @@ <name>PROBLEM.displayValue</name> <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/problem.displayvalue/expression.js</expression> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>IS_TEST_RECIPIENT.value</name> + <recordfield>BULKMAILRECIPIENT.IS_TEST_RECIPIENT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>HASCOMMUNICATIONREJECTION.value</name> + <expression>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommunicationrejection.value/expression.js</expression> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> @@ -255,6 +313,16 @@ <readonly v="true" /> </linkInformation> </linkInformation> + <filterExtensions> + <filterExtension> + <name>Blacklist_filter</name> + <title>Blacklist</title> + <contentType>BOOLEAN</contentType> + <filterValuesProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterValuesProcess.js</filterValuesProcess> + <filterConditionProcess>%aditoprj%/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterConditionProcess.js</filterConditionProcess> + <filtertype>BASIC</filtertype> + </filterExtension> + </filterExtensions> </dbRecordContainer> </recordContainers> </entity> diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js index f4a5d6a797f85b33b0d1d819d44e0015a28d24c9..32b81b7db33e5508f206cc74db74609c9adae950 100644 --- a/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js +++ b/entity/BulkMailRecipient_entity/entityfields/icon/colorProcess.js @@ -2,5 +2,5 @@ import("system.vars"); import("system.result"); import("system.neon"); -if (vars.get("$field.HASCOMMRESTRICTION") == "true" || !vars.get("$field.EMAIL_ADDRESS")) +if (vars.get("$field.HASCOMMUNICATIONREJECTION") == "true" || !vars.get("$field.EMAIL_ADDRESS")) result.string(neon.PRIORITY_HIGH_COLOR); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js index c67e7c5712da325df0f23f47eee957ce28a3ed54..9c601f430b9bc4dec127fcc3e36e2cd6b9be2cf9 100644 --- a/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js +++ b/entity/BulkMailRecipient_entity/entityfields/icon/valueProcess.js @@ -1,10 +1,12 @@ +import("Util_lib"); import("system.vars"); import("system.result"); import("Contact_lib"); var type = ContactUtils.getContactTypeByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID")); +var hasCommunicationRejection = Utils.toBoolean(vars.get("$field.HASCOMMUNICATIONREJECTION")); var icon; -if (vars.get("$field.HASCOMMRESTRICTION") == "true") +if (hasCommunicationRejection) icon = "VAADIN:BAN"; else if (type == 1) icon = "VAADIN:BUILDING"; diff --git a/entity/BulkMailRecipient_entity/entityfields/is_test_recipient/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/is_test_recipient/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a435bfbd638098da63046add8f824e4b77e4bc51 --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/is_test_recipient/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(0); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludecommunicationrejecting_param/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludecommunicationrejecting_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..40effa0178464da0c7850912345f19c7fa95975a --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludecommunicationrejecting_param/valueProcess.js @@ -0,0 +1,3 @@ +import("system.result"); + +result.string(true); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludedstatus_param/valueProcess.js b/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludedstatus_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ae0c566f408d9f9a4bd2181699b7fadeab9a02a4 --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/recipientstobemailed/children/excludedstatus_param/valueProcess.js @@ -0,0 +1,6 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string(JSON.stringify([ + $KeywordRegistry.bulkMailRecipientStatus$sent() +])); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/removetestrecipient/onActionProcess.js b/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/removetestrecipient/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b19f093933f83c39b3bca1779f28b1a9240aacd3 --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/removetestrecipient/onActionProcess.js @@ -0,0 +1,9 @@ +import("Sql_lib"); +import("system.vars"); +import("system.neon"); + +newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", vars.get("$sys.selection"), SqlBuilder.IN()) + .updateData(true, "BULKMAILRECIPIENT", ["IS_TEST_RECIPIENT"], null, [0]); + +neon.refreshAll(); + \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/settestrecipient/onActionProcess.js b/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/settestrecipient/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..69f831c2f7a1a5dfca2708c9fbee266e552f6773 --- /dev/null +++ b/entity/BulkMailRecipient_entity/entityfields/testrunactions/children/settestrecipient/onActionProcess.js @@ -0,0 +1,9 @@ +import("Sql_lib"); +import("system.vars"); +import("system.neon"); + +newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", vars.get("$sys.selection"), SqlBuilder.IN()) + .updateData(true, "BULKMAILRECIPIENT", ["IS_TEST_RECIPIENT"], null, [1]); + +neon.refreshAll(); + \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js index 01d4a5dc9c76ee5f350521eea0f4a2bb6016a3ec..da5905dd40d05e6350fa2decc5da91f870a689f7 100644 --- a/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/conditionProcess.js @@ -1,5 +1,39 @@ +import("KeywordRegistry_basic"); +import("system.vars"); +import("Util_lib"); import("system.db"); import("system.result"); import("Sql_lib"); +import("MarketingCondition_lib"); -result.string(newWhere("BULKMAILRECIPIENT.BULKMAIL_ID", "$param.BulkMailId_param").toString()); \ No newline at end of file +var excludeWithCommunicationRejection = Utils.toBoolean(vars.get("$param.ExcludeCommunicationRejecting_param")); +var excludeBlacklisted = Utils.toBoolean(vars.get("$param.ExcludeBlacklisted_param")); +var excludedStatus = Utils.parseJSON(vars.get("$param.ExcludedStatus_param")); +var isTestMail = Utils.toBoolean(vars.get("$param.IsTestMail_param")); + +var condition = newWhere("BULKMAILRECIPIENT.BULKMAIL_ID", "$param.BulkMailId_param"); +if (isTestMail) +{ + condition.and("BULKMAILRECIPIENT.IS_TEST_RECIPIENT", 1); +} +else +{ + if (excludeWithCommunicationRejection) + { + condition.and(new CommunicationSettingsCondition() + .medium($KeywordRegistry.communicationMediumCampaign$mail(), "BULKMAILRECIPIENT.EMAIL_ADDRESS") + .rejected() + .existNoSettings() + .getCondition()); + } + if (excludeBlacklisted) + { + condition.and("not (" + CommunicationBlacklist.getMailRecipientBlacklist().buildCondition() + ")"); + } + if (!Utils.isNullOrEmpty(excludedStatus)) + { + condition.and("BULKMAILRECIPIENT.STATUS", excludedStatus, SqlBuilder.NOT_IN()); + } +} + +result.string(condition.toString()); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterConditionProcess.js b/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..35124c1297165b4c16601cd12bce262eb098d07e --- /dev/null +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterConditionProcess.js @@ -0,0 +1,31 @@ +import("Sql_lib"); +import("system.result"); +import("Util_lib"); +import("system.vars"); +import("MarketingCondition_lib"); + +var operator = vars.get("$local.operator2").trim(); +var fetchBlacklisted = Utils.toBoolean(vars.get("$local.rawvalue")); +var condition = newWhere(); + +if (operator == "<>") +{ + fetchBlacklisted = !fetchBlacklisted; + operator = "="; +} +if (operator == "=") +{ + var blacklistCondition = CommunicationBlacklist.getMailRecipientBlacklist().getCondition(); + if (fetchBlacklisted && blacklistCondition.hasCondition()) + condition.and(blacklistCondition); + else if (fetchBlacklisted) + condition.noResult(); + else if (blacklistCondition.hasCondition()) + condition.and(null, blacklistCondition, SqlBuilder.NOT()); +} +else +{ + condition.noResult(); +} + +result.string(condition.toString("1=1")); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterValuesProcess.js b/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterValuesProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..25006aba8d3e6134f97bc10454a6d1888c2fa986 --- /dev/null +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/filterextensions/blacklist_filter/filterValuesProcess.js @@ -0,0 +1,8 @@ +import("system.translate"); +import("system.result"); +import("system.translate"); + +result.object([ + ["true", translate.text("Yes")], + ["false", translate.text("No")] +]); \ No newline at end of file diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js deleted file mode 100644 index 04cd6d4dc91c5a7e36cd82b78301acf456fc05ff..0000000000000000000000000000000000000000 --- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommrestriction.value/expression.js +++ /dev/null @@ -1,9 +0,0 @@ -import("Sql_lib"); -import("KeywordRegistry_basic"); -import("Contact_lib"); -import("system.db"); -import("system.result"); - -var commRestrictionCond = ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail()); -var sql = SqlBuilder.caseWhen(commRestrictionCond).thenString("true").elseString("false"); -result.string(sql.toString()); diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommunicationrejection.value/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommunicationrejection.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..7517b5a5ded16c4697dab1ccd9826f5e77b9a42c --- /dev/null +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/hascommunicationrejection.value/expression.js @@ -0,0 +1,26 @@ +import("system.vars"); +import("Util_lib"); +import("MarketingCondition_lib"); +import("Sql_lib"); +import("KeywordRegistry_basic"); +import("Contact_lib"); +import("system.db"); +import("system.result"); + +var sql; +//if recipients with communication restriction are excluded by the where-condition, this can never be true +if (Utils.toBoolean(vars.get("$param.ExcludeCommunicationRejecting_param"))) +{ + sql = "'false'"; +} +else +{ + var communicationSettingsCondition = new CommunicationSettingsCondition() + .medium($KeywordRegistry.communicationMediumCampaign$mail(), "BULKMAILRECIPIENT.EMAIL_ADDRESS") + .rejected() + .existSettings() + .buildCondition(); + sql = SqlBuilder.caseWhen(communicationSettingsCondition).thenString("true").elseString("false").toString(); +} + +result.string(sql); diff --git a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js index 49b6fefd59233f6aa50934a21ce43f06a3a61172..2b9b21b9b789c2d7823fc09837e0bac6469a8c68 100644 --- a/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js +++ b/entity/BulkMailRecipient_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -1,12 +1,30 @@ +import("system.vars"); +import("Util_lib"); import("Sql_lib"); import("Contact_lib"); import("system.translate"); import("system.result"); import("Keyword_lib"); import("KeywordRegistry_basic"); +import("MarketingCondition_lib"); -var commRestrictionCond = ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail()); var keywordSql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "BULKMAILRECIPIENT.STATUS"); +var sql; +if (!Utils.toBoolean(vars.get("$param.ExcludeCommunicationRejecting_param"))) +{ + var communicationSettingsCondition = new CommunicationSettingsCondition() + .medium($KeywordRegistry.communicationMediumCampaign$mail(), "BULKMAILRECIPIENT.EMAIL_ADDRESS") + .rejected() + .existSettings() + .buildCondition(); -var sql = SqlBuilder.caseWhen(commRestrictionCond).thenString(translate.text("Advertising ban")).elseValue(keywordSql); + sql = SqlBuilder.caseWhen(communicationSettingsCondition) + .thenString(translate.text("Advertising ban")) + .elseValue(keywordSql); +} +else +{ + sql = keywordSql; +} + result.string(sql.toString()); diff --git a/entity/BulkMailTestRecipient_entity/BulkMailTestRecipient_entity.aod b/entity/BulkMailTestRecipient_entity/BulkMailTestRecipient_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..8181a5415a373706ce729488e80b5629e3b604e7 --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/BulkMailTestRecipient_entity.aod @@ -0,0 +1,119 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>BulkMailTestRecipient_entity</name> + <title>Test Recipient</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <titlePlural>Test Recipients</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityParameter> + <name>BulkMailId_param</name> + <expose v="true" /> + <mandatory v="false" /> + </entityParameter> + <entityField> + <name>BULKMAILTESTRECIPIENTID</name> + </entityField> + <entityField> + <name>BULKMAIL_ID</name> + <valueProcess>%aditoprj%/entity/BulkMailTestRecipient_entity/entityfields/bulkmail_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>EMAIL_ADDRESS</name> + <title>Email</title> + <valueProcess>%aditoprj%/entity/BulkMailTestRecipient_entity/entityfields/email_address/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>CONTACT_ID</name> + <title>Contact</title> + <consumer>Contacts</consumer> + <linkedContextProcess>%aditoprj%/entity/BulkMailTestRecipient_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess> + </entityField> + <entityProvider> + <name>BulkMailTestRecipients</name> + <dependencies> + <entityDependency> + <name>bf4102ef-e33c-4bdc-b62d-844f466f8617</name> + <entityName>BulkMail_entity</entityName> + <fieldName>BulkMailTestRecipients</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityConsumer> + <name>Contacts</name> + <dependency> + <name>dependency</name> + <entityName>AnyContact_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>PERSON_ID</name> + </entityField> + <entityField> + <name>ORGANISATION_ID</name> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <fromClauseProcess>%aditoprj%/entity/BulkMailTestRecipient_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/BulkMailTestRecipient_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>BULKMAIL_ID.value</name> + <recordfield>BULKMAILTESTRECIPIENT.BULKMAIL_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>BULKMAILTESTRECIPIENTID.value</name> + <recordfield>BULKMAILTESTRECIPIENT.BULKMAILTESTRECIPIENTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>BULKMAILTESTRECIPIENT.CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>EMAIL_ADDRESS.value</name> + <recordfield>BULKMAILTESTRECIPIENT.EMAIL_ADDRESS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/BulkMailTestRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PERSON_ID.value</name> + <recordfield>CONTACT.PERSON_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGANISATION_ID.value</name> + <recordfield>CONTACT.ORGANISATION_ID</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>e9b90ccc-0edd-4968-b6bf-966f8e0d5bc2</name> + <tableName>BULKMAILTESTRECIPIENT</tableName> + <primaryKey>BULKMAILTESTRECIPIENTID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + <linkInformation> + <name>566ef9cf-6427-4f60-aa04-e514517c3324</name> + <tableName>CONTACT</tableName> + <primaryKey>CONTACTID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/BulkMailTestRecipient_entity/entityfields/bulkmail_id/valueProcess.js b/entity/BulkMailTestRecipient_entity/entityfields/bulkmail_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..cea362d78f9084fe85f7764b09d0a1fde3065017 --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/entityfields/bulkmail_id/valueProcess.js @@ -0,0 +1,10 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +{ + if (vars.exists("$param.BulkMailId_param") && vars.get("$param.BulkMailId_param")) + result.string(vars.getString("$param.BulkMailId_param")); +} + diff --git a/entity/BulkMailTestRecipient_entity/entityfields/contact_id/linkedContextProcess.js b/entity/BulkMailTestRecipient_entity/entityfields/contact_id/linkedContextProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2e48676daf3e661032b7d9aaf896c5bfbdd51e2d --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/entityfields/contact_id/linkedContextProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Contact_lib"); + +result.string(ContactUtils.getContextByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID"))); \ No newline at end of file diff --git a/entity/BulkMailTestRecipient_entity/entityfields/email_address/valueProcess.js b/entity/BulkMailTestRecipient_entity/entityfields/email_address/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c55cc06cb71e30c5ffe76fbcf38ddc6e92e68a8e --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/entityfields/email_address/valueProcess.js @@ -0,0 +1,7 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); +import("Communication_lib"); + +if (vars.get("$field.CONTACT_ID") && vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string(CommUtil.getStandardMail(vars.get("$field.CONTACT_ID"))); \ No newline at end of file diff --git a/entity/BulkMailTestRecipient_entity/recordcontainers/db/conditionProcess.js b/entity/BulkMailTestRecipient_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..52cfaea96c15eb2e4ff0c0dcb5281874098355d2 --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,5 @@ +import("system.db"); +import("system.result"); +import("Sql_lib"); + +result.string(newWhere("BULKMAILTESTRECIPIENT.BULKMAIL_ID", "$param.BulkMailId_param").toString()); \ No newline at end of file diff --git a/entity/BulkMailTestRecipient_entity/recordcontainers/db/fromClauseProcess.js b/entity/BulkMailTestRecipient_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b281df21b69e52ecbfe7fe636d423d55887e1634 --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,5 @@ +import("system.result"); + +result.string("BULKMAILTESTRECIPIENT join CONTACT on BULKMAILTESTRECIPIENT.CONTACT_ID = CONTACT.CONTACTID \ + left join PERSON on CONTACT.PERSON_ID = PERSON.PERSONID \ + left join ORGANISATION on CONTACT.ORGANISATION_ID = ORGANISATION.ORGANISATIONID"); \ No newline at end of file diff --git a/entity/BulkMailTestRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js b/entity/BulkMailTestRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..35781ff56c5ad7469f74111e5dd20b738a87ec18 --- /dev/null +++ b/entity/BulkMailTestRecipient_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js @@ -0,0 +1,4 @@ +import("Contact_lib"); +import("system.result"); + +result.string(ContactUtils.getResolvingDisplaySubSql("BULKMAILTESTRECIPIENT.CONTACT_ID")); \ No newline at end of file diff --git a/entity/BulkMail_entity/BulkMail_entity.aod b/entity/BulkMail_entity/BulkMail_entity.aod index 3b728ee07f40467fe2f9f1caddd74ca12e531a4f..ea3b4e898599c3ed856f256d7d9d629d78b7bafc 100644 --- a/entity/BulkMail_entity/BulkMail_entity.aod +++ b/entity/BulkMail_entity/BulkMail_entity.aod @@ -55,6 +55,7 @@ </entityField> <entityConsumer> <name>Recipients</name> + <selectionMode>MULTI</selectionMode> <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/recipients/stateProcess.js</stateProcess> <dependency> <name>dependency</name> @@ -323,6 +324,78 @@ <iconId>VAADIN:CURLY_BRACKETS</iconId> <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/openadminview/stateProcess.js</stateProcess> </entityActionField> + <entityField> + <name>DATE_TO_SEND</name> + <title>Send Date</title> + <contentType>DATE</contentType> + <resolution>MINUTE</resolution> + <stateProcess>%aditoprj%/entity/BulkMail_entity/entityfields/date_to_send/stateProcess.js</stateProcess> + <onValidation>%aditoprj%/entity/BulkMail_entity/entityfields/date_to_send/onValidation.js</onValidation> + </entityField> + <entityConsumer> + <name>MailLogs</name> + <dependency> + <name>dependency</name> + <entityName>MailLog_entity</entityName> + <fieldName>MailLogs</fieldName> + </dependency> + <children> + <entityParameter> + <name>ObjectRowId_param</name> + <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/maillogs/children/objectrowid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ObjectType_param</name> + <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>BulkMailTestRecipients</name> + <dependency> + <name>dependency</name> + <entityName>BulkMailTestRecipient_entity</entityName> + <fieldName>BulkMailTestRecipients</fieldName> + </dependency> + <children> + <entityParameter> + <name>BulkMailId_param</name> + <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/bulkmailtestrecipients/children/bulkmailid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>Clicks</name> + <dependency> + <name>dependency</name> + <entityName>WeblinkClick_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + <children> + <entityParameter> + <name>ObjectRowId_param</name> + <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/clicks/children/objectrowid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ObjectType_param</name> + <valueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/clicks/children/objecttype_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>INTEREST_ID</name> + <title>Interest</title> + <consumer>Interests</consumer> + <displayValueProcess>%aditoprj%/entity/BulkMail_entity/entityfields/interests_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityConsumer> + <name>Interests</name> + <dependency> + <name>dependency</name> + <entityName>Interest_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> </entityFields> <recordContainers> <dbRecordContainer> @@ -362,7 +435,7 @@ </dbRecordFieldMapping> <dbRecordFieldMapping> <name>SENDER.value</name> - <recordfield>BULKMAIL.SENDER</recordfield> + <recordfield>BULKMAIL.SENDER_EMAIL_ADDRESS</recordfield> <isFilterable v="true" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> @@ -400,6 +473,14 @@ <name>USE_TEMPLATE_ATTACHMENTS.value</name> <recordfield>BULKMAIL.USE_TEMPLATE_ATTACHMENTS</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_TO_SEND.value</name> + <recordfield>BULKMAIL.DATE_TO_SEND</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTEREST_ID.value</name> + <recordfield>BULKMAIL.INTEREST_ID</recordfield> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> diff --git a/entity/BulkMail_entity/entityfields/bulkmailtestrecipients/children/bulkmailid_param/valueProcess.js b/entity/BulkMail_entity/entityfields/bulkmailtestrecipients/children/bulkmailid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2a12b8389ba83e397d6b9ae10eb59989a25590fe --- /dev/null +++ b/entity/BulkMail_entity/entityfields/bulkmailtestrecipients/children/bulkmailid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.BULKMAILID")); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/clicks/children/objectrowid_param/valueProcess.js b/entity/BulkMail_entity/entityfields/clicks/children/objectrowid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8aa64f3404b7d77bd5dfade6cc48235558f0d988 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/clicks/children/objectrowid_param/valueProcess.js @@ -0,0 +1,3 @@ +import("system.vars"); +import("system.result"); +result.string(vars.get("$field.BULKMAILID")); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/clicks/children/objecttype_param/valueProcess.js b/entity/BulkMail_entity/entityfields/clicks/children/objecttype_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..008915f61deac19ccdd40fff81701de63eb3b6a2 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/clicks/children/objecttype_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getCurrentContextId()); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/date_to_send/onValidation.js b/entity/BulkMail_entity/entityfields/date_to_send/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..a14234910f2dd2ff5ffdb94f34a939b6268f0379 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/date_to_send/onValidation.js @@ -0,0 +1,7 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); + +if (vars.get("$field.STATUS") == $KeywordRegistry.bulkMailStatus$planned() && vars.get("$sys.date") > vars.get("local.value")) + result.string("Send date already passed."); +else result.string(""); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/date_to_send/stateProcess.js b/entity/BulkMail_entity/entityfields/date_to_send/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..12d91284a8492b11f3f657f03775a4240f5306a9 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/date_to_send/stateProcess.js @@ -0,0 +1,18 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.neon"); + +var status = vars.get("$field.STATUS"); +var fieldState = neon.COMPONENTSTATE_INVISIBLE; + +if (status == $KeywordRegistry.bulkMailStatus$planned()) +{ + fieldState = neon.COMPONENTSTATE_EDITABLE; +} +else if (status == $KeywordRegistry.bulkMailStatus$missed()) +{ + fieldState = neon.COMPONENTSTATE_READONLY; +} + +result.string(fieldState); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/interests_id/displayValueProcess.js b/entity/BulkMail_entity/entityfields/interests_id/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e2c5bbf9152d5d220ccba334f4f7b8d2bb15e8f1 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/interests_id/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.loadContentTitle("Interest_entity", vars.get("$field.INTEREST_ID"))); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/maillogs/children/objectrowid_param/valueProcess.js b/entity/BulkMail_entity/entityfields/maillogs/children/objectrowid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8aa64f3404b7d77bd5dfade6cc48235558f0d988 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/maillogs/children/objectrowid_param/valueProcess.js @@ -0,0 +1,3 @@ +import("system.vars"); +import("system.result"); +result.string(vars.get("$field.BULKMAILID")); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js b/entity/BulkMail_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..008915f61deac19ccdd40fff81701de63eb3b6a2 --- /dev/null +++ b/entity/BulkMail_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getCurrentContextId()); \ No newline at end of file diff --git a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js index 3845e374537d50e6e9ab706741a4a672d7208d04..a77b2d89d480dd2f0018295bfd128955abe390b4 100644 --- a/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js +++ b/entity/BulkMail_entity/entityfields/testmail/onActionProcess.js @@ -1,17 +1,7 @@ -import("system.neon"); -import("system.db"); -import("Employee_lib"); import("system.vars"); import("Bulkmail_lib"); -var testingContact = vars.get("$field.TESTING_CONTACT_ID"); -var testingEmail = vars.get("$field.TESTING_EMAIL_ADDRESS"); -if (testingContact && testingEmail) - BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID"), [[testingContact, testingEmail]]); -else - neon.openContext("BulkMailTesting", "BulkMailTesting_view", null, neon.OPERATINGSTATE_VIEW, { - "BulkMailId_param" : vars.get("$field.BULKMAILID") - }); +BulkMailUtils.sendBulkMailOnServer(vars.get("$field.BULKMAILID"), true); diff --git a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod index 8f088d36615ee56043631b62277a508976268c50..76ea4711ebda2c2dfbaa5585ed538ad0583f06d3 100644 --- a/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod +++ b/entity/CampaignAddParticipants_entity/CampaignAddParticipants_entity.aod @@ -19,6 +19,7 @@ <consumer>CampaignConsumer</consumer> <mandatory v="true" /> <state>EDITABLE</state> + <stateProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/stateProcess.js</stateProcess> <valueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/valueProcess.js</valueProcess> <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/displayValueProcess.js</displayValueProcess> <onValueChange>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValueChange.js</onValueChange> @@ -38,6 +39,7 @@ <state>EDITABLE</state> <displayValueProcess>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/displayValueProcess.js</displayValueProcess> <onValueChange>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValueChange.js</onValueChange> + <onValidation>%aditoprj%/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js</onValidation> </entityField> <entityField> <name>campaignParticipantMessage</name> diff --git a/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js b/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js index b299466750aeaa2162df03031f3dc9098cdf5967..ceeb7e8662d98a71b9a214fd5cd0fbb100c5c8c3 100644 --- a/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js +++ b/entity/CampaignAddParticipants_entity/entityfields/addparticipants/onActionProcess.js @@ -1,3 +1,5 @@ +import("system.logging"); +import("Util_lib"); import("system.neon"); import("Sql_lib"); import("system.vars"); @@ -7,67 +9,32 @@ import("Campaign_lib"); var cols = []; -var participantCondition = ""; -var participantRowIds = JSON.parse(vars.getString("$param.campaignParticipantsRowIds_param")); -var conditionSourceTableName = vars.getString("$param.dataSourceTableName_param"); -var isUpdate = vars.get("$field.isUpdate"); + +var contactIds = JSON.parse(vars.get("$field.campaignparticipantContactIds")); +var isUpdate = Utils.toBoolean(vars.get("$param.isUpdate_param")); + var campaignId = vars.getString("$field.CAMPAIGN_ID"); var newCampaignStepId = vars.getString("$field.CAMPAIGNSTEP_ID"); var colNamesCampaignParticipantLog = CampaignUtils.getParticipantLogInsertColumnNames(); -if(participantRowIds != null && participantRowIds.length > 0) -{ - var contactIdsToHandle = participantRowIds; - - if(isUpdate == "false") - contactIdsToHandle = JSON.parse(vars.get("$field.campaignparticipantContactIds")); - - _handleRowIds(contactIdsToHandle, campaignId); -} -else +if(contactIds != null && contactIds.length > 0) { - participantCondition = JSON.parse(vars.getString("$param.campaignParticipantsCondition_param")).condition; - _handleCondition(campaignId, conditionSourceTableName, participantCondition); + _handleRowIds(contactIds, campaignId); } + neon.refreshAll(); if (!vars.exists("$param.currentCampaignId_param") || !vars.get("$param.currentCampaignId_param")) neon.openContext("Campaign", "CampaignMain_view", [campaignId], neon.OPERATINGSTATE_VIEW, null); -function _handleCondition(pCampaignId, pTargetTableName, pCondition) -{ - var contactIdsToHandle = []; - var contextComingFrom = "Person"; - - if(pTargetTableName == "ORGANISATION") - { - pCondition += " and PERSON.PERSONID is NULL"; - contextComingFrom = "Organisation"; - } - - /* - * If it's an update of participants, get the participants defined by the condition in the selected campaign - * Because they already are participants, no restrictions apply to the affected IDs. - * - * Otherwise the participants ought to be inserted. The only restriction right now is, hat the participants to be inserted - * can't already be in this specific campaign. Therefore all IDs hat are defined by the condition and not in the campaign are selected. - */ - if(isUpdate == "true") - { - contactIdsToHandle = CampaignUtils.GetContactIdsInCampaignByCondition(pCampaignId, pCondition); - } - else - contactIdsToHandle = CampaignUtils.GetContactIdsNotInCampaignByCondition(pCampaignId, pCondition, contextComingFrom); - - _handleRowIds(contactIdsToHandle, pCampaignId); -} + function _handleRowIds(pParticipantRowIds, pCampaignId) { var oldStepIds = {}; - if(isUpdate == "true") + if(isUpdate) { cols = [ "CAMPAIGNSTEP_ID", @@ -75,7 +42,7 @@ function _handleRowIds(pParticipantRowIds, pCampaignId) "DATE_EDIT" ]; - var oldSteps = newSelect("CAMPAIGNPARTICIPANTID, CAMPAIGNSTEP_ID") + var oldSteps = newSelect("CONTACT_ID, CAMPAIGNSTEP_ID") .from("CAMPAIGNPARTICIPANT") .whereIfSet("CAMPAIGNPARTICIPANT.CONTACT_ID", pParticipantRowIds, SqlBuilder.IN()) .and("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", pCampaignId) @@ -105,9 +72,10 @@ function _handleRowIds(pParticipantRowIds, pCampaignId) { var campaignParticipantLogId = util.getNewUUID(); var valsCampaignParticipantLog; - if(isUpdate == "true") + if(isUpdate) { var oldCampaignStepId = oldStepIds[pParticipantRowIds[participant]] || ""; + var updatedValues = [ newCampaignStepId, @@ -116,8 +84,7 @@ function _handleRowIds(pParticipantRowIds, pCampaignId) ]; var condition = newWhere("CAMPAIGNPARTICIPANT.CONTACT_ID", pParticipantRowIds[participant]) - .and("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", pCampaignId) - .or("CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID", pParticipantRowIds[participant]); + .and("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", pCampaignId); valsCampaignParticipantLog = [ campaignParticipantLogId, @@ -159,8 +126,7 @@ function _handleRowIds(pParticipantRowIds, pCampaignId) logArray.push(["CAMPAIGNPARTICIPANTLOG", colNamesCampaignParticipantLog, null, valsCampaignParticipantLog]); } } - - if(isUpdate == "true") + if(isUpdate) { db.updates(statementArray) } diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js index c596003e424ef1b3ec890598ce9a8ecadedc4ec4..f4f7ad8fa87f0ce1c5983c6913e0c14fc7d4f3ff 100644 --- a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js +++ b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/onValidation.js @@ -1,24 +1,17 @@ +import("Util_lib"); import("system.vars"); import("system.result"); import("Sql_lib"); import("system.translate"); +var validCount = JSON.parse(vars.get("$field.campaignparticipantContactIds")).length; +var maxCount = vars.get("$field.campaignStepMaxParticipantCount"); +var isUpdate = Utils.toBoolean(vars.get("$param.isUpdate_param")); -if (vars.get("$param.campaignParticipantsRowIds_param") != null && vars.get("$param.campaignParticipantsRowIds_param") != "") -{ - let participants = JSON.parse(vars.get("$param.campaignParticipantsRowIds_param")); +if (vars.get("$field.CAMPAIGN_ID")){ - if(participants.length > 0) - { - let thisParticipantCount = newSelect("COUNT(*)") - .from("CAMPAIGNPARTICIPANT") - .where("CAMPAIGNPARTICIPANT.CAMPAIGN_ID", vars.get("$field.CAMPAIGN_ID")) - .and("CAMPAIGNPARTICIPANT.CONTACT_ID", participants, SqlBuilder.IN()) - .cell(); - - if(parseInt(thisParticipantCount) > 0) - { - result.string(translate.text("Participant is already participating")); - } + + if (validCount == 0 && !isUpdate){ + result.string(translate.text("All of the chosen records are already in the campaign")); } } diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaign_id/stateProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..31931105f9e8011ac8e49b1ec3e9443c6ec2095b --- /dev/null +++ b/entity/CampaignAddParticipants_entity/entityfields/campaign_id/stateProcess.js @@ -0,0 +1,10 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + + +if(vars.exists("$param.currentCampaignId_param") && vars.get("$param.currentCampaignId_param")) +{ + result.string(neon.COMPONENTSTATE_READONLY); +} +else result.string(neon.COMPONENTSTATE_EDITABLE); \ No newline at end of file diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js index d1c7824536e06bed2ffb8d47a1b93cc8f1260253..6511d5abbe134859e02af1b780da968a76fdd7ba 100644 --- a/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js +++ b/entity/CampaignAddParticipants_entity/entityfields/campaignparticipantcontactids/valueProcess.js @@ -1,3 +1,4 @@ +import("Util_lib"); import("system.eMath"); import("system.result"); import("system.vars"); @@ -6,10 +7,10 @@ import("FilterViewAction_lib"); import("Campaign_lib"); -if(vars.get("$field.CAMPAIGN_ID")) +if(vars.get("$field.CAMPAIGN_ID") && vars.get("$field.CAMPAIGNSTEP_ID")) { var contactIds, filteredContactIds; - var isUpdate = vars.getString("$param.isUpdate_param"); + var isUpdate = Utils.toBoolean(vars.get("$param.isUpdate_param")); var comingfrom = vars.getString("$param.dataSourceTableName_param"); var selection = JSON.parse(vars.getString("$param.campaignParticipantsRowIds_param")); @@ -28,17 +29,18 @@ if(vars.get("$field.CAMPAIGN_ID")) { if (vars.get("$param.campaignParticipantsCondition_param")) { + var contactFilterCondition = JSON.parse(vars.get("$param.campaignParticipantsCondition_param")).condition; - contactIds = CampaignUtils.GetContactIdsInCampaignByCondition(vars.get("$field.CAMPAIGN_ID"), contactFilterCondition); + contactIds = CampaignUtils.GetContactIdsNotInCampaignStepByCondition(vars.get("$field.CAMPAIGNSTEP_ID"),vars.get("$field.CAMPAIGN_ID"), contactFilterCondition); } else { - contactIds = selection; + contactIds = CampaignUtils.GetContactIdsNotInCampaignStepByRowIds(vars.get("$field.CAMPAIGNSTEP_ID"), selection); } } else { - contactIds = CampaignUtils.GetContactIdsNotInCampaignByRowIds(vars.get("$field.CAMPAIGN_ID"), JSON.parse(selection)); + contactIds = CampaignUtils.GetContactIdsNotInCampaignByRowIds(vars.get("$field.CAMPAIGN_ID"), selection); } result.string(JSON.stringify(contactIds)); diff --git a/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..29f8f42cc56cd1e466728103419fe1cc5a893226 --- /dev/null +++ b/entity/CampaignAddParticipants_entity/entityfields/campaignstep_id/onValidation.js @@ -0,0 +1,21 @@ +import("Campaign_lib"); +import("Util_lib"); +import("system.vars"); +import("system.result"); +import("Sql_lib"); +import("system.translate"); + +var validCount = JSON.parse(vars.get("$field.campaignparticipantContactIds")).length; +var maxCount = vars.get("$field.campaignStepMaxParticipantCount"); + +var isUpdate = Utils.toBoolean(vars.get("$param.isUpdate_param")); + +if (vars.get("$field.CAMPAIGN_ID")){ + var currentCount = CampaignUtils.getParticipantCountForStep(vars.get("$field.CAMPAIGNSTEP_ID"),vars.get("$field.CAMPAIGN_ID")); + if ( (validCount+currentCount) > maxCount) + result.string(translate.text("Not enough room in campaignstep")); + + if (validCount == 0 && isUpdate){ + result.string(translate.text("All of the chosen records are already in the campaignstep")); + } +} \ No newline at end of file diff --git a/entity/Campaign_entity/Campaign_entity.aod b/entity/Campaign_entity/Campaign_entity.aod index ab1ebaa775b6f01cf20840381913eae2b48065d8..a7d5b31ea8b7b7d5f57bfe49ba6b3aafdef8a982 100644 --- a/entity/Campaign_entity/Campaign_entity.aod +++ b/entity/Campaign_entity/Campaign_entity.aod @@ -195,6 +195,12 @@ <fieldName>CampaignConsumer</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>3cc06d94-0274-49be-8d1b-7a5f2a3a689e</name> + <entityName>Person_entity</entityName> + <fieldName>Campaigns</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> <entityConsumer> diff --git a/entity/ChecklistEntryValue_entity/ChecklistEntryValue_entity.aod b/entity/ChecklistEntryValue_entity/ChecklistEntryValue_entity.aod index d883abe34f2f787be5becd750d6a0116cb12cbee..33a0522dbead26e0b28e023d1dab41f40ae0633c 100644 --- a/entity/ChecklistEntryValue_entity/ChecklistEntryValue_entity.aod +++ b/entity/ChecklistEntryValue_entity/ChecklistEntryValue_entity.aod @@ -5,7 +5,7 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <icon>NEON:MQL</icon> <imageProcess>%aditoprj%/entity/ChecklistEntryValue_entity/imageProcess.js</imageProcess> - <recordContainer>jdito</recordContainer> + <recordContainer>jDito</recordContainer> <entityFields> <entityProvider> <name>#PROVIDER</name> @@ -14,9 +14,6 @@ <name>#PROVIDER_AGGREGATES</name> <useAggregates v="true" /> </entityProvider> - <entityField> - <name>CHECKLISTENTRYVALUEID</name> - </entityField> <entityField> <name>CHECKLISTENTRY_ID</name> <title>Checklist entry</title> @@ -48,6 +45,7 @@ <entityParameter> <name>ObjectRowId_param</name> <expose v="true" /> + <mandatory v="true" /> </entityParameter> <entityParameter> <name>ObjectType_param</name> @@ -60,7 +58,6 @@ <entityProvider> <name>ChecklistEntryValues</name> <titlePlural>Checklist entries</titlePlural> - <recordContainer>jdito</recordContainer> <dependencies> <entityDependency> <name>7eae9b1e-cea7-4688-898a-754dba82eac7</name> @@ -76,13 +73,6 @@ </entityDependency> </dependencies> </entityProvider> - <entityParameter> - <name>Verifier_param</name> - <valueProcess>%aditoprj%/entity/ChecklistEntryValue_entity/entityfields/verifier_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>VerifierFnName_param</name> - </entityParameter> <entityField> <name>UID</name> </entityField> @@ -104,33 +94,26 @@ <entityField> <name>AUTO</name> <title>Automatically</title> + <contentType>BOOLEAN</contentType> </entityField> - <entityParameter> - <name>ChecklistEntryValueId_param</name> - <expose v="true" /> - </entityParameter> </entityFields> <recordContainers> <jDitoRecordContainer> - <name>jdito</name> + <name>jDito</name> <jDitoRecordAlias>Data_alias</jDitoRecordAlias> <contentProcess>%aditoprj%/entity/ChecklistEntryValue_entity/recordcontainers/jdito/contentProcess.js</contentProcess> - <onUpdate>%aditoprj%/entity/ChecklistEntryValue_entity/recordcontainers/jdito/onUpdate.js</onUpdate> <recordFieldMappings> <jDitoRecordFieldMapping> <name>UID.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>CHECKLISTENTRY_ID.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>CHECKLISTENTRYVALUEID.value</name> + <name>AUTO.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>DATE_EDIT.value</name> + <name>CHECKLISTENTRY_ID.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>DATE_NEW.value</name> + <name>CHECKLISTENTRY_ID.displayValue</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> <name>IS_FULFILLED.value</name> @@ -142,19 +125,16 @@ <name>OBJECT_TYPE.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>USER_EDIT.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>USER_NEW.value</name> + <name>DATE_EDIT.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>CHECKLISTENTRY_ID.displayValue</name> + <name>DATE_NEW.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>AUTO.value</name> + <name>USER_EDIT.value</name> </jDitoRecordFieldMapping> <jDitoRecordFieldMapping> - <name>AUTO.displayValue</name> + <name>USER_NEW.value</name> </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> diff --git a/entity/ChecklistEntryValue_entity/entityfields/setchecklistentrycompleted/children/setcompleted/onActionProcess.js b/entity/ChecklistEntryValue_entity/entityfields/setchecklistentrycompleted/children/setcompleted/onActionProcess.js index 86551188b3435613792827d85700777731b72092..ccff131335c861fe9e09bb9f170e0485cf631dcb 100644 --- a/entity/ChecklistEntryValue_entity/entityfields/setchecklistentrycompleted/children/setcompleted/onActionProcess.js +++ b/entity/ChecklistEntryValue_entity/entityfields/setchecklistentrycompleted/children/setcompleted/onActionProcess.js @@ -1,7 +1,29 @@ +import("Util_lib"); +import("Sql_lib"); import("system.vars"); import("system.neon"); -import("Sql_lib"); -newWhere("CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", "$field.CHECKLISTENTRYVALUEID") - .updateFields({"IS_FULFILLED": parseInt(vars.get("$field.IS_FULFILLED")) > 0 ? 0 : 1}); -neon.refresh(); \ No newline at end of file +var fulfilledValue = Utils.toBoolean(vars.get("$field.IS_FULFILLED")) ? "0" : "1"; +var cond = newWhere("CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", vars.get("$field.UID")).toString(); + +if(Utils.toBoolean(newSelect("count(*)").from("CHECKLISTENTRYVALUE").where(cond).cell())) +{ + newWhere(cond).updateFields({ + IS_FULFILLED: fulfilledValue + }, "CHECKLISTENTRYVALUE"); +} +else +{ + new SqlBuilder().insertFields({ + CHECKLISTENTRYVALUEID: vars.get("$field.UID"), + CHECKLISTENTRY_ID: vars.get("$field.CHECKLISTENTRY_ID"), + IS_FULFILLED: fulfilledValue, + OBJECT_TYPE: vars.get("$field.OBJECT_TYPE"), + OBJECT_ROWID: vars.get("$field.OBJECT_ROWID"), + DATE_EDIT: vars.get("$field.DATE_EDIT"), + DATE_NEW: vars.get("$field.DATE_NEW"), + USER_EDIT: vars.get("$field.USER_EDIT"), + USER_NEW: vars.get("$field.USER_NEW") + }, "CHECKLISTENTRYVALUE"); +} +neon.refresh(); diff --git a/entity/ChecklistEntryValue_entity/entityfields/verifier_param/valueProcess.js b/entity/ChecklistEntryValue_entity/entityfields/verifier_param/valueProcess.js deleted file mode 100644 index bd99ebeed2027694251b6959689c55508a87b6bb..0000000000000000000000000000000000000000 --- a/entity/ChecklistEntryValue_entity/entityfields/verifier_param/valueProcess.js +++ /dev/null @@ -1,14 +0,0 @@ -import("Util_lib"); -import("system.result"); -import("system.vars"); -import("ChecklistEntryRegistry_basic"); - - -var fnName = vars.get("$param.VerifierFnName_param"); -var objectRowId = vars.get("$param.ObjectRowId_param"); -var isFulfilledFn = $ChecklistEntryRegistry[fnName]; - -if (Utils.isFunction(isFulfilledFn)) - result.string(isFulfilledFn().verifierFn(objectRowId)); - - diff --git a/entity/ChecklistEntryValue_entity/recordcontainers/jdito/contentProcess.js b/entity/ChecklistEntryValue_entity/recordcontainers/jdito/contentProcess.js index a17f5785d37a462f4d534cf5770264812e1d2cfe..16a48ff0220dc6c9f068c46556ac69b6eb2864f5 100644 --- a/entity/ChecklistEntryValue_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/ChecklistEntryValue_entity/recordcontainers/jdito/contentProcess.js @@ -1,172 +1,46 @@ -import("system.translate"); -import("system.result"); -import("system.vars"); import("system.util"); -import("system.db"); -import("KeywordRegistry_basic"); -import("Util_lib"); +import("system.vars"); +import("system.result"); +import("system.datetime"); import("Sql_lib"); import("ChecklistEntryRegistry_basic"); -var newUid; -var doesExist; -var checklistEntryIds = []; -var preparedStatements = []; -var checklistEntryValues = []; -var manualChecklistEntries = []; -var manualChecklistEntryValues = []; -var cols = ["CHECKLISTENTRYVALUEID", "CHECKLISTENTRY_ID", "OBJECT_ROWID", "OBJECT_TYPE", - "IS_FULFILLED", "USER_NEW", "USER_EDIT", "DATE_NEW", "DATE_EDIT"]; - -var checklistId = vars.get("$param.ChecklistId_param"); -var objectRowId = vars.get("$param.ObjectRowId_param"); -var checklistEntries = []; -var checklistEntryValueId = vars.get("$param.ChecklistEntryValueId_param"); -if (checklistEntryValueId) -{ - //get all entries of the current checklist - checklistEntries = newSelect([ - "CHECKLISTENTRY.CHECKLISTENTRYID", - "CHECKLISTENTRY.CHECKLIST_ID", - "CHECKLISTENTRY.TITLE", - "CHECKLISTENTRY.AUTO", - "CHECKLISTENTRY.USER_NEW", - "CHECKLISTENTRY.USER_EDIT", - "CHECKLISTENTRY.DATE_NEW", - "CHECKLISTENTRY.DATE_EDIT"]) - .from("CHECKLISTENTRY") - .join("CHECKLISTENTRYVALUE", "CHECKLISTENTRYVALUE.CHECKLISTENTRY_ID = CHECKLISTENTRY.CHECKLISTENTRYID") - .where("CHECKLISTENTRY.CHECKLIST_ID", checklistId) - .and("CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", checklistEntryValueId) - .table(); - - checklistEntries.forEach(function(pRow){ - if (pRow[0]) - { - checklistEntryIds.push(pRow[0]); - } - }); -} -else if (checklistId) -{ - //get all entries of the current checklist - checklistEntries = newSelect([ - "CHECKLISTENTRY.CHECKLISTENTRYID", - "CHECKLISTENTRY.CHECKLIST_ID", - "CHECKLISTENTRY.TITLE", - "CHECKLISTENTRY.AUTO", - "CHECKLISTENTRY.USER_NEW", - "CHECKLISTENTRY.USER_EDIT", - "CHECKLISTENTRY.DATE_NEW", - "CHECKLISTENTRY.DATE_EDIT"]) - .from("CHECKLISTENTRY") - .where("CHECKLISTENTRY.CHECKLIST_ID", checklistId) - .table(); - - checklistEntries.forEach(function(pRow){ - if (pRow[0]) - { - checklistEntryIds.push(pRow[0]); - } - }); -} - -//loop trough the checklistEntries and handle them according to their type -for (let i = 0; i < checklistEntries.length; i++) +var data = newSelect([ + "CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", + "CHECKLISTENTRY.AUTO", + "CHECKLISTENTRY.CHECKLISTENTRYID", + "CHECKLISTENTRY.TITLE", + "CHECKLISTENTRYVALUE.IS_FULFILLED", + "CHECKLISTENTRYVALUE.OBJECT_ROWID", + "CHECKLISTENTRYVALUE.OBJECT_TYPE", + "CHECKLISTENTRYVALUE.DATE_EDIT", + "CHECKLISTENTRYVALUE.DATE_NEW", + "CHECKLISTENTRYVALUE.USER_EDIT", + "CHECKLISTENTRYVALUE.USER_NEW" +]).from("CHECKLISTENTRY") +.leftJoin( + "CHECKLISTENTRYVALUE", + newWhere("CHECKLISTENTRYVALUE.CHECKLISTENTRY_ID = CHECKLISTENTRY.CHECKLISTENTRYID") + .and("CHECKLISTENTRYVALUE.OBJECT_ROWID", vars.get("$param.ObjectRowId_param")) + .andIfSet("CHECKLISTENTRYVALUE.OBJECT_TYPE", vars.get("$param.ObjectType_param")) +).whereIfSet("CHECKLISTENTRY.CHECKLIST_ID", vars.get("$param.ChecklistId_param")) +.table(); + +for(let i = 0; i < data.length; i++) { - for (let ii = 0; ii < checklistEntries[i].length; ii++) + data[i][0] = data[i][0] || util.getNewUUID(); + data[i][4] = data[i][4] || "0"; + data[i][5] = data[i][5] || vars.get("$param.ObjectRowId_param"); + data[i][6] = data[i][6] || vars.get("$param.ObjectType_param"); + data[i][8] = data[i][8] || datetime.date(); + data[i][10] = data[i][10] || vars.get("$sys.user"); + + if(parseInt(data[i][1])) { - checklistEntryValues[i] = new Array(13); - - if (checklistEntries[i][3] == 1)//if auto == true - { - newUid = util.getNewUUID(); - vars.set("$param.VerifierFnName_param", checklistEntries[i][2]); - checklistEntryValues[i] = [newUid, checklistEntries[i][0], newUid, "", vars.get("$sys.date"), - Utils.toBoolean(vars.get("$param.Verifier_param")) ? 1 : 0, objectRowId, - "", "null", vars.get("$sys.user")]; - } - else//else manual - { - doesExist = newSelect([ - "CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", - "CHECKLISTENTRYVALUE.CHECKLISTENTRY_ID", - "CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", - "CHECKLISTENTRYVALUE.DATE_EDIT", - "CHECKLISTENTRYVALUE.DATE_NEW", - "CHECKLISTENTRYVALUE.IS_FULFILLED", - "CHECKLISTENTRYVALUE.OBJECT_ROWID", - "CHECKLISTENTRYVALUE.OBJECT_TYPE", - "CHECKLISTENTRYVALUE.USER_EDIT", - "CHECKLISTENTRYVALUE.USER_NEW"]) - .from("CHECKLISTENTRYVALUE") - .where("CHECKLISTENTRYVALUE.CHECKLISTENTRY_ID", checklistEntries[i][0]) - .and("CHECKLISTENTRYVALUE.OBJECT_ROWID", objectRowId) - .arrayRow(); - if (doesExist.length > 0) - { - checklistEntryValues[i] = doesExist; - } - else - { - newUid = util.getNewUUID(); - checklistEntryValues[i] = [newUid, checklistEntries[i][0], newUid, "", vars.get("$sys.date"), "0", objectRowId, "", - "null", vars.get("$sys.user"), ""]; - doesExist = preparedStatements.some(function(pPreparedStatement){ - return pPreparedStatement[3].includes(checklistEntries[i][0]) && pPreparedStatement[3].includes(objectRowId); - }); - - if (!doesExist) - { - preparedStatements.push(["CHECKLISTENTRYVALUE", - cols, - db.getColumnTypes("CHECKLISTENTRYVALUE", cols), - [checklistEntryValues[i][0], - checklistEntryValues[i][1], - checklistEntryValues[i][6], - checklistEntryValues[i][7], - checklistEntryValues[i][5].toString(), - checklistEntryValues[i][9], - checklistEntryValues[i][8], - checklistEntryValues[i][4], - checklistEntryValues[i][3]]]); - } - } - } + var checklistEntry = $ChecklistEntryRegistry[data[i][3]](); + data[i][3] = checklistEntry.title; + data[i][4] = checklistEntry.verifierFn(vars.get("$param.ObjectRowId_param")) ? "1" : "0"; } - checklistEntryValues[i][10] = _checklistEntryDisplayValue(checklistEntries[i][2]); - checklistEntryValues[i][11] = checklistEntries[i][3]; - checklistEntryValues[i][12] = _autoDisplayValue(checklistEntries[i][3]); -} - -db.inserts(preparedStatements);//insert the ones that don't already exist -result.object(checklistEntryValues); - - -function _checklistEntryDisplayValue(pChecklistEntryTitle) -{ - var displayValue; - var verfierFnName = pChecklistEntryTitle; - - var verifierFn = $ChecklistEntryRegistry[verfierFnName]; - - - if (Utils.isFunction(verifierFn)) - displayValue = verifierFn().title; - else{ - displayValue = translate.text(verfierFnName); - } - return displayValue; } -function _autoDisplayValue(pAutoValue) -{ - if(pAutoValue == 1) - { - return translate.text("Automatically"); - } - else - { - return translate.text("Manually"); - } -} \ No newline at end of file +result.object(data); diff --git a/entity/ChecklistEntryValue_entity/recordcontainers/jdito/onUpdate.js b/entity/ChecklistEntryValue_entity/recordcontainers/jdito/onUpdate.js deleted file mode 100644 index 666ee575b4538a2df8721203cf2feaea2a61158e..0000000000000000000000000000000000000000 --- a/entity/ChecklistEntryValue_entity/recordcontainers/jdito/onUpdate.js +++ /dev/null @@ -1,10 +0,0 @@ -import("Sql_lib"); -import("system.vars"); - -var changed = vars.get("$local.changed"); - -if(changed) -{ - newWhere("CHECKLISTENTRYVALUE.CHECKLISTENTRYVALUEID", "$field.CHECKLISTENTRYVALUEID") - .updateFields({"IS_FULFILLED" : vars.get("$field.IS_FULFILLED")}); -} \ No newline at end of file diff --git a/entity/ChecklistEntry_entity/ChecklistEntry_entity.aod b/entity/ChecklistEntry_entity/ChecklistEntry_entity.aod index 3385604c588240288d04438c5f6946dc6b7b6d22..d484cdac8c4b5700221c38e0fcff424c2615bd85 100644 --- a/entity/ChecklistEntry_entity/ChecklistEntry_entity.aod +++ b/entity/ChecklistEntry_entity/ChecklistEntry_entity.aod @@ -30,6 +30,9 @@ <placeholderProcess>%aditoprj%/entity/ChecklistEntry_entity/entityfields/auto/placeholderProcess.js</placeholderProcess> <displayValueProcess>%aditoprj%/entity/ChecklistEntry_entity/entityfields/auto/displayValueProcess.js</displayValueProcess> <onValueChange>%aditoprj%/entity/ChecklistEntry_entity/entityfields/auto/onValueChange.js</onValueChange> + <onValueChangeTypes> + <element>MASK</element> + </onValueChangeTypes> </entityField> <entityField> <name>USER_EDIT</name> diff --git a/entity/CommunicationBlacklist_entity/CommunicationBlacklist_entity.aod b/entity/CommunicationBlacklist_entity/CommunicationBlacklist_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..0b6d0eedc3e5dfada987166ab52fedb1ece253c0 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/CommunicationBlacklist_entity.aod @@ -0,0 +1,130 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>CommunicationBlacklist_entity</name> + <title>Blacklist</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <onValidation>%aditoprj%/entity/CommunicationBlacklist_entity/onValidation.js</onValidation> + <iconId>VAADIN:BAN</iconId> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>COMMUNICATIONBLACKLISTID</name> + </entityField> + <entityField> + <name>START_DATE</name> + <title>Start date</title> + <contentType>DATE</contentType> + <resolution>DAY</resolution> + </entityField> + <entityField> + <name>END_DATE</name> + <title>End date</title> + <contentType>DATE</contentType> + <resolution>DAY</resolution> + </entityField> + <entityField> + <name>BLACKLIST_FILTER</name> + <title>Condition</title> + <contentType>FILTER_TREE</contentType> + <stateProcess>%aditoprj%/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>REASON</name> + <title>Reason</title> + <contentType>LONG_TEXT</contentType> + <mandatory v="true" /> + </entityField> + <entityField> + <name>BLACKLIST_TYPE</name> + <title>Type</title> + <consumer>BlacklistTypeKeyword</consumer> + <mandatory v="true" /> + </entityField> + <entityConsumer> + <name>BlacklistTypeKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/CommunicationBlacklist_entity/entityfields/blacklisttypekeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>DATE_NEW</name> + <valueProcess>%aditoprj%/entity/CommunicationBlacklist_entity/entityfields/date_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_NEW</name> + <valueProcess>%aditoprj%/entity/CommunicationBlacklist_entity/entityfields/user_new/valueProcess.js</valueProcess> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>BLACKLIST_FILTER.value</name> + <recordfield>COMMUNICATIONBLACKLIST.BLACKLIST_FILTER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>BLACKLIST_TYPE.value</name> + <recordfield>COMMUNICATIONBLACKLIST.BLACKLIST_TYPE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COMMUNICATIONBLACKLISTID.value</name> + <recordfield>COMMUNICATIONBLACKLIST.COMMUNICATIONBLACKLISTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>END_DATE.value</name> + <recordfield>COMMUNICATIONBLACKLIST.END_DATE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>REASON.value</name> + <recordfield>COMMUNICATIONBLACKLIST.REASON</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>START_DATE.value</name> + <recordfield>COMMUNICATIONBLACKLIST.START_DATE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>COMMUNICATIONBLACKLIST.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>COMMUNICATIONBLACKLIST.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>BLACKLIST_TYPE.displayValue</name> + <expression>%aditoprj%/entity/CommunicationBlacklist_entity/recordcontainers/db/recordfieldmappings/blacklist_type.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>007ad42a-0a7a-49a9-a71d-917ee3c94aa7</name> + <tableName>COMMUNICATIONBLACKLIST</tableName> + <primaryKey>COMMUNICATIONBLACKLISTID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/stateProcess.js b/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..234a26e9827c511b12b09fbbe1f5552bfd78f912 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/stateProcess.js @@ -0,0 +1,12 @@ +import("system.result"); +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.neon"); + +var state = neon.COMPONENTSTATE_INVISIBLE; +if (vars.get("$field.BLACKLIST_TYPE") == $KeywordRegistry.communicationBlacklistType$emailRecipientFilter()) +{ + state = neon.COMPONENTSTATE_EDITABLE; +} + +result.string(state); \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/valueProcess.js b/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..0bb45e823a21888b77385d2950bfb48fc5d530d9 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/entityfields/blacklist_filter/valueProcess.js @@ -0,0 +1,9 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (!vars.get("$this.value") && (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT)) +{ + var emptyFilter = {entity: "BulkMailRecipient_entity", filter: {type: "group", operator: "AND", childs: []}}; + result.string(JSON.stringify(emptyFilter)); +} \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/entityfields/blacklisttypekeyword/children/containername_param/valueProcess.js b/entity/CommunicationBlacklist_entity/entityfields/blacklisttypekeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1e28921b3c32d79d55a29aebe44878a9c766c91d --- /dev/null +++ b/entity/CommunicationBlacklist_entity/entityfields/blacklisttypekeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.communicationBlacklistType()); \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/entityfields/date_new/valueProcess.js b/entity/CommunicationBlacklist_entity/entityfields/date_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1dbb1c3887f7cdc3e41fc6ddd1bcb3c4032843c5 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/entityfields/date_new/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/entityfields/user_new/valueProcess.js b/entity/CommunicationBlacklist_entity/entityfields/user_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8d9eb72f007f3af16b698a9483ed117730ec3680 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/entityfields/user_new/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/onValidation.js b/entity/CommunicationBlacklist_entity/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..0652d9c0f9ff0ba032e0b7561c04ee345ba99223 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/onValidation.js @@ -0,0 +1,15 @@ +import("system.translate"); +import("Util_lib"); +import("system.result"); +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.neon"); +import("JditoFilter_lib"); + +if (vars.get("$field.BLACKLIST_TYPE") == $KeywordRegistry.communicationBlacklistType$emailRecipientFilter()) +{ + var filter = Utils.parseJSON(vars.get("$field.BLACKLIST_FILTER")); + filter = new FilterConditionGroup(filter); + if (filter.isEmpty()) + result.string(translate.text("Filter can't be empty")); +} \ No newline at end of file diff --git a/entity/CommunicationBlacklist_entity/recordcontainers/db/recordfieldmappings/blacklist_type.displayvalue/expression.js b/entity/CommunicationBlacklist_entity/recordcontainers/db/recordfieldmappings/blacklist_type.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..6cf151ddba7fdaa25222f92a4fe98aba79c4b803 --- /dev/null +++ b/entity/CommunicationBlacklist_entity/recordcontainers/db/recordfieldmappings/blacklist_type.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationBlacklistType(), "COMMUNICATIONBLACKLIST.BLACKLIST_TYPE")); \ No newline at end of file diff --git a/entity/CommunicationChannel_entity/CommunicationChannel_entity.aod b/entity/CommunicationChannel_entity/CommunicationChannel_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..1ad20c2a04f2e19d21325dbc1628c55e6589771b --- /dev/null +++ b/entity/CommunicationChannel_entity/CommunicationChannel_entity.aod @@ -0,0 +1,71 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>CommunicationChannel_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityParameter> + <name>ContactId_param</name> + <expose v="true" /> + </entityParameter> + <entityConsumer> + <name>Addresses</name> + <dependency> + <name>dependency</name> + <entityName>Address_entity</entityName> + <fieldName>ContactAddresses</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/CommunicationChannel_entity/entityfields/addresses/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>Communications</name> + <dependency> + <name>dependency</name> + <entityName>Communication_entity</entityName> + <fieldName>AllCommunications</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/CommunicationChannel_entity/entityfields/communications/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>CommCategory_param</name> + <valueProcess>%aditoprj%/entity/CommunicationChannel_entity/entityfields/communications/children/commcategory_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityProvider> + <name>ContactCommunicationChannels</name> + <targetConsumerProcess>%aditoprj%/entity/CommunicationChannel_entity/entityfields/contactcommunicationchannels/targetConsumerProcess.js</targetConsumerProcess> + <dependencies> + <entityDependency> + <name>a1ac784e-a932-48a5-9aa5-285f8c9ad483</name> + <entityName>CommunicationSettings_entity</entityName> + <fieldName>CommunicationChannels</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityParameter> + <name>CommunicationChannelType_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityParameter> + <name>CommunicationCategory_param</name> + <expose v="true" /> + </entityParameter> + </entityFields> +</entity> diff --git a/entity/CommunicationChannel_entity/entityfields/addresses/children/contactid_param/valueProcess.js b/entity/CommunicationChannel_entity/entityfields/addresses/children/contactid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2f392d5c2e143090012fa5b4cc765d8e5ba278ac --- /dev/null +++ b/entity/CommunicationChannel_entity/entityfields/addresses/children/contactid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$param.ContactId_param")); \ No newline at end of file diff --git a/entity/CommunicationChannel_entity/entityfields/communications/children/commcategory_param/valueProcess.js b/entity/CommunicationChannel_entity/entityfields/communications/children/commcategory_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f113cc9898867b3769345d93eb25eaf25e89ee31 --- /dev/null +++ b/entity/CommunicationChannel_entity/entityfields/communications/children/commcategory_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.vars"); + +result.string(vars.get("$param.CommunicationCategory_param")); \ No newline at end of file diff --git a/entity/CommunicationChannel_entity/entityfields/communications/children/contactid_param/valueProcess.js b/entity/CommunicationChannel_entity/entityfields/communications/children/contactid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2f392d5c2e143090012fa5b4cc765d8e5ba278ac --- /dev/null +++ b/entity/CommunicationChannel_entity/entityfields/communications/children/contactid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$param.ContactId_param")); \ No newline at end of file diff --git a/entity/CommunicationChannel_entity/entityfields/contactcommunicationchannels/targetConsumerProcess.js b/entity/CommunicationChannel_entity/entityfields/contactcommunicationchannels/targetConsumerProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..87fa13898fe7efe1acb5adc1ad3c941c2b6a4bc3 --- /dev/null +++ b/entity/CommunicationChannel_entity/entityfields/contactcommunicationchannels/targetConsumerProcess.js @@ -0,0 +1,12 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); + +var channelType = vars.get("$param.CommunicationChannelType_param"); +var consumer = "Communications"; //fallback +if (channelType == $KeywordRegistry.communicationChannelType$communication()) + consumer = "Communications"; +else if (channelType == $KeywordRegistry.communicationChannelType$address()) + consumer = "Addresses"; + +result.string(consumer); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod b/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..09065e34bb370b7d14806ff55e393df36c67093f --- /dev/null +++ b/entity/CommunicationSettings_entity/CommunicationSettings_entity.aod @@ -0,0 +1,324 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>CommunicationSettings_entity</name> + <title>Communication Settings</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <contentTitleProcess>%aditoprj%/entity/CommunicationSettings_entity/contentTitleProcess.js</contentTitleProcess> + <iconIdProcess>%aditoprj%/entity/CommunicationSettings_entity/iconIdProcess.js</iconIdProcess> + <titlePlural>Communication Settings</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityProvider> + <name>SettingsForContact</name> + <dependencies> + <entityDependency> + <name>811c8c4c-20f8-4e20-9ae3-9aa7ae5e1dc0</name> + <entityName>Person_entity</entityName> + <fieldName>ContactCommunicationSettings</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>COMMUNICATIONSETTINGSID</name> + </entityField> + <entityField> + <name>USER_NEW</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/user_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_EDIT</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/user_edit/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_NEW</name> + <title>Created on</title> + <contentType>DATE</contentType> + <state>READONLY</state> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/date_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_EDIT</name> + <title>Last change</title> + <contentType>DATE</contentType> + <state>READONLY</state> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/date_edit/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>CONTACT_ID</name> + <title>Contact</title> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/contact_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>STATUS</name> + <title>Status</title> + <consumer>StatusKeyword</consumer> + <groupable v="true" /> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/status/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/status/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>MEDIUM</name> + <title>Medium</title> + <consumer>MediumKeyword</consumer> + <groupable v="true" /> + <stateProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/medium/stateProcess.js</stateProcess> + <displayValueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/medium/displayValueProcess.js</displayValueProcess> + <onValueChange>%aditoprj%/entity/CommunicationSettings_entity/entityfields/medium/onValueChange.js</onValueChange> + <onValueChangeTypes> + <element>MASK</element> + </onValueChangeTypes> + </entityField> + <entityField> + <name>CHANNEL_TYPE</name> + <title>Channel type</title> + <consumer>ChannelTypeKeyword</consumer> + <groupable v="true" /> + <mandatory v="true" /> + <onValueChange>%aditoprj%/entity/CommunicationSettings_entity/entityfields/channel_type/onValueChange.js</onValueChange> + <onValueChangeTypes> + <element>MASK</element> + </onValueChangeTypes> + </entityField> + <entityField> + <name>CHANNEL_ID</name> + <title>Channel</title> + <consumer>CommunicationChannels</consumer> + <stateProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/channel_id/stateProcess.js</stateProcess> + <titleProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/channel_id/titleProcess.js</titleProcess> + <displayValueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/channel_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityConsumer> + <name>StatusKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityParameter> + <name>ContactId_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityConsumer> + <name>ChannelTypeKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/channeltypekeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>MediumKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/mediumkeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>CommunicationChannels</name> + <dependency> + <name>dependency</name> + <entityName>CommunicationChannel_entity</entityName> + <fieldName>ContactCommunicationChannels</fieldName> + </dependency> + <children> + <entityParameter> + <name>CommunicationChannelType_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationchanneltype_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>CommunicationCategory_param</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationmedium_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>ICON</name> + <contentType>IMAGE</contentType> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/icon/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>COMMUNICATIONLEGALBASEID</name> + </entityField> + <entityField> + <name>INFO</name> + <title>Info</title> + <contentType>LONG_TEXT</contentType> + </entityField> + <entityField> + <name>COMMUNICATIONSETTINGS_ID</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/communicationsettings_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_NEW_LEGALBASE</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/date_new_legalbase/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_NEW_LEGALBASE</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/user_new_legalbase/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_EDIT_LEGALBASE</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/user_edit_legalbase/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_EDIT_LEGALBASE</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/date_edit_legalbase/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>VERSION</name> + <valueProcess>%aditoprj%/entity/CommunicationSettings_entity/entityfields/version/valueProcess.js</valueProcess> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <fromClauseProcess>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>CHANNEL_ID.value</name> + <recordfield>COMMUNICATIONSETTINGS.CHANNEL_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CHANNEL_TYPE.value</name> + <recordfield>COMMUNICATIONSETTINGS.CHANNEL_TYPE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COMMUNICATIONSETTINGSID.value</name> + <recordfield>COMMUNICATIONSETTINGS.COMMUNICATIONSETTINGSID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>COMMUNICATIONSETTINGS.CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MEDIUM.value</name> + <recordfield>COMMUNICATIONSETTINGS.MEDIUM</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>COMMUNICATIONSETTINGS.STATUS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CHANNEL_TYPE.displayValue</name> + <expression>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_type.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MEDIUM.displayValue</name> + <expression>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/medium_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CHANNEL_ID.displayValue</name> + <expression>%aditoprj%/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INFO.value</name> + <recordfield>COMMUNICATIONLEGALBASE.INFO</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_EDIT.value</name> + <recordfield>COMMUNICATIONSETTINGS.DATE_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>COMMUNICATIONSETTINGS.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_EDIT.value</name> + <recordfield>COMMUNICATIONSETTINGS.USER_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>COMMUNICATIONSETTINGS.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COMMUNICATIONLEGALBASEID.value</name> + <recordfield>COMMUNICATIONLEGALBASE.COMMUNICATIONLEGALBASEID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COMMUNICATIONSETTINGS_ID.value</name> + <recordfield>COMMUNICATIONLEGALBASE.COMMUNICATIONSETTINGS_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_EDIT_LEGALBASE.value</name> + <recordfield>COMMUNICATIONLEGALBASE.DATE_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW_LEGALBASE.value</name> + <recordfield>COMMUNICATIONLEGALBASE.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_EDIT_LEGALBASE.value</name> + <recordfield>COMMUNICATIONLEGALBASE.USER_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW_LEGALBASE.value</name> + <recordfield>COMMUNICATIONLEGALBASE.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>VERSION.value</name> + <recordfield>COMMUNICATIONLEGALBASE.VERSION</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>c618d72c-9ae5-4f24-bfc7-92911df8ee67</name> + <tableName>COMMUNICATIONSETTINGS</tableName> + <primaryKey>COMMUNICATIONSETTINGSID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + <linkInformation> + <name>ce7a5962-18b9-4840-9c64-3b05a111a4b0</name> + <tableName>COMMUNICATIONLEGALBASE</tableName> + <primaryKey>COMMUNICATIONLEGALBASEID</primaryKey> + <isUIDTable v="false" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/CommunicationSettings_entity/contentTitleProcess.js b/entity/CommunicationSettings_entity/contentTitleProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8d8c4734469b997363f4f33fa17b92701bfca98a --- /dev/null +++ b/entity/CommunicationSettings_entity/contentTitleProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.MEDIUM.displayValue") || vars.get("$field.CHANNEL_TYPE.displayValue")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/channel_id/displayValueProcess.js b/entity/CommunicationSettings_entity/entityfields/channel_id/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..da04d27adcdef470f0549ab22050affb126be286 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/channel_id/displayValueProcess.js @@ -0,0 +1,17 @@ +import("PostalAddress_lib"); +import("system.vars"); +import("system.result"); +import("KeywordRegistry_basic"); +import("Sql_lib"); + +var channelType = vars.get("$field.CHANNEL_TYPE"); +var channel = vars.get("$field.CHANNEL_ID"); + +if (channelType == $KeywordRegistry.communicationChannelType$address()) +{ + result.string(AddressUtils.getFormattedOnlineAddressById(channel)); +} +else if (channelType == $KeywordRegistry.communicationChannelType$communication()) +{ + result.string(newSelect("ADDR").from("COMMUNICATION").where("COMMUNICATION.COMMUNICATIONID", channel).cell()); +} \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/channel_id/stateProcess.js b/entity/CommunicationSettings_entity/entityfields/channel_id/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9caec77e4d7a7a9fc66d0d97fb57ce87f0752279 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/channel_id/stateProcess.js @@ -0,0 +1,15 @@ +import("system.result"); +import("KeywordRegistry_basic"); +import("system.neon"); +import("system.vars"); + +if ((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + && vars.get("$field.CHANNEL_TYPE") != $KeywordRegistry.communicationChannelType$communication() + && vars.get("$field.CHANNEL_TYPE") != $KeywordRegistry.communicationChannelType$address()) +{ + result.string(neon.COMPONENTSTATE_INVISIBLE); +} +else +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/channel_id/titleProcess.js b/entity/CommunicationSettings_entity/entityfields/channel_id/titleProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..67d56550550b8196260ba8942cc2d377a6b6a3c6 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/channel_id/titleProcess.js @@ -0,0 +1,10 @@ +import("system.translate"); +import("KeywordRegistry_basic"); +import("system.result"); +import("system.vars"); + +var type = vars.get("$field.CHANNEL_TYPE"); +if (type == $KeywordRegistry.communicationChannelType$communication()) + result.string(translate.text("Communication")); +else if (type == $KeywordRegistry.communicationChannelType$address()) + result.string(translate.text("Address")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/channel_type/onValueChange.js b/entity/CommunicationSettings_entity/entityfields/channel_type/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..a37d392eb37dd225820f7a7d6f3c9ea390dd2ebb --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/channel_type/onValueChange.js @@ -0,0 +1,6 @@ +import("system.neon"); + +neon.setFieldValues({ + "$field.MEDIUM": "", + "$field.CHANNEL_ID": "" +}); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/channeltypekeyword/children/containername_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/channeltypekeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..353ea6f4bf85e804015624dbf0c96655491125f8 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/channeltypekeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.communicationChannelType()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationchanneltype_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationchanneltype_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..fc362f395eb7ce08a4386585b8c3276ac6d5a5dd --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationchanneltype_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.CHANNEL_TYPE")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationmedium_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationmedium_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..92dc282c45a62faa071d7ccb0b88ca26570da90d --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/communicationmedium_param/valueProcess.js @@ -0,0 +1,12 @@ +import("system.vars"); +import("system.result"); +import("Keyword_lib") +import("KeywordRegistry_basic"); + +var medium = vars.get("$field.MEDIUM"); +if (medium) +{ + var categoryAttribute = new KeywordAttribute($KeywordRegistry.communicationMediumCampaign(), "category"); + var category = categoryAttribute.getValue(medium); + result.string(category); +} \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/contactid_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/contactid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ef0d5bcac51027b862291e5abd61c0c05773a8df --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/communicationchannels/children/contactid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.CONTACT_ID")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/communicationsettings_id/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/communicationsettings_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1b3c724dc990b3caf81399f58b86abf6c71cf1fe --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/communicationsettings_id/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$field.COMMUNICATIONSETTINGSID")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/contact_id/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/contact_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d877bfcaca49d927d93af76a0600ce037fe93bf8 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/contact_id/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$param.ContactId_param")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/date_edit/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/date_edit/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2194ba21bc59d11cfba9d4f1b84375b73ec67525 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/date_edit/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/date_edit_legalbase/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/date_edit_legalbase/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2194ba21bc59d11cfba9d4f1b84375b73ec67525 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/date_edit_legalbase/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/date_new/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/date_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1dbb1c3887f7cdc3e41fc6ddd1bcb3c4032843c5 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/date_new/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/date_new_legalbase/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/date_new_legalbase/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1dbb1c3887f7cdc3e41fc6ddd1bcb3c4032843c5 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/date_new_legalbase/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/icon/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/icon/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4483d06c910b2a47246299abe962b7387d38d6e9 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/icon/valueProcess.js @@ -0,0 +1,13 @@ +import("system.result"); +import("system.vars"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var medium = vars.getString("$field.MEDIUM"); +var icon = ""; +if (medium) +{ + var keywordAttributes = KeywordUtils.getAttributeRelationsByKey(medium, $KeywordRegistry.communicationMediumCampaign()); + icon = keywordAttributes.AdvertisingBanIcon; +} +result.string(icon); diff --git a/entity/CommunicationSettings_entity/entityfields/medium/displayValueProcess.js b/entity/CommunicationSettings_entity/entityfields/medium/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..496cea3abe31f14d58f44eee73b6f870e43e206f --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/medium/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getViewValue($KeywordRegistry.communicationMediumCampaign(), vars.get("$field.MEDIUM"))); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/medium/onValueChange.js b/entity/CommunicationSettings_entity/entityfields/medium/onValueChange.js new file mode 100644 index 0000000000000000000000000000000000000000..c9d056e37f40741c4ad66405d2e11c328aaf1d5d --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/medium/onValueChange.js @@ -0,0 +1,5 @@ +import("system.neon"); +import("system.vars"); + +if (vars.get("$local.value")) + neon.setFieldValue("$field.CHANNEL_ID", ""); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/medium/stateProcess.js b/entity/CommunicationSettings_entity/entityfields/medium/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..58b2b7867af34f2d3a13d59798bc14ad040a0854 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/medium/stateProcess.js @@ -0,0 +1,14 @@ +import("system.result"); +import("KeywordRegistry_basic"); +import("system.neon"); +import("system.vars"); + +if ((vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + && vars.get("$field.CHANNEL_TYPE") != $KeywordRegistry.communicationChannelType$communication()) +{ + result.string(neon.COMPONENTSTATE_INVISIBLE); +} +else +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/mediumkeyword/children/containername_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/mediumkeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a7553cb4bb5d328f447bc621fa071696d8418b6e --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/mediumkeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.communicationMediumCampaign()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/status/displayValueProcess.js b/entity/CommunicationSettings_entity/entityfields/status/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d3ac19b3e9138d5e98a5772ba56a104449011868 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/status/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getViewValue($KeywordRegistry.communicationSettingStatus(), vars.get("$field.STATUS"))); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/status/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/status/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..bd4556b964af6e506db2dd34ff8419b542db23c9 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/status/valueProcess.js @@ -0,0 +1,7 @@ +import("KeywordRegistry_basic"); +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string($KeywordRegistry.communicationSettingStatus$pending()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..6e9094784904aeb14e3231ab86844965215e4481 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.communicationSettingStatus()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/user_edit/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/user_edit/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..47a3dbd1201377ecf0a93083e23b7706175c359f --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/user_edit/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/user_edit_legalbase/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/user_edit_legalbase/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..47a3dbd1201377ecf0a93083e23b7706175c359f --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/user_edit_legalbase/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/user_new/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/user_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8d9eb72f007f3af16b698a9483ed117730ec3680 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/user_new/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/user_new_legalbase/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/user_new_legalbase/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8d9eb72f007f3af16b698a9483ed117730ec3680 --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/user_new_legalbase/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/entityfields/version/valueProcess.js b/entity/CommunicationSettings_entity/entityfields/version/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..fd82c76775cd61c184add5a2ad4ac153a00b16fe --- /dev/null +++ b/entity/CommunicationSettings_entity/entityfields/version/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string("1"); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/targetentity/valueProcess.js b/entity/CommunicationSettings_entity/iconIdProcess.js similarity index 55% rename from entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/targetentity/valueProcess.js rename to entity/CommunicationSettings_entity/iconIdProcess.js index f8b07f56abc4e6b2df8800916a77fa58b50e99bf..f86b12ac2a9815380d0355d333a56acb87083bb0 100644 --- a/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/targetentity/valueProcess.js +++ b/entity/CommunicationSettings_entity/iconIdProcess.js @@ -1,4 +1,4 @@ import("system.vars"); import("system.result"); -result.string("Person_entity"); \ No newline at end of file +result.string(vars.get("$field.ICON")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/conditionProcess.js b/entity/CommunicationSettings_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7e2c1224ac30a3a48370f694af38d97653922684 --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Sql_lib"); + +var condition = newWhere("COMMUNICATIONSETTINGS.CONTACT_ID", "$param.ContactId_param"); + +result.string(condition.toString()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/fromClauseProcess.js b/entity/CommunicationSettings_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d178b505c1a0cd0177f4253deac9784d7152eca2 --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,15 @@ +import("system.result"); +import("Sql_lib"); + +var from = new SqlBuilder() + .from("COMMUNICATIONSETTINGS") + .join("COMMUNICATIONLEGALBASE", new SqlBuilder() + .where("COMMUNICATIONSETTINGS.COMMUNICATIONSETTINGSID = COMMUNICATIONLEGALBASE.COMMUNICATIONSETTINGS_ID") + .and(null, new SqlBuilder() + .select("fresher.COMMUNICATIONLEGALBASEID") + .from("COMMUNICATIONLEGALBASE", "fresher") + .where("fresher.COMMUNICATIONSETTINGS_ID = COMMUNICATIONSETTINGS.COMMUNICATIONSETTINGSID") + .and("fresher.DATE_NEW > COMMUNICATIONLEGALBASE.DATE_NEW"), + SqlBuilder.NOT_EXISTS())); + +result.string(from.toString()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_id.displayvalue/expression.js b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..aff37a959f83f072af80884f84351b32c2c6103a --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_id.displayvalue/expression.js @@ -0,0 +1,18 @@ +import("system.result"); +import("KeywordRegistry_basic"); +import("Sql_lib"); +import("PostalAddress_lib"); + +var displayValueSql = SqlBuilder.caseStatement() + .when("COMMUNICATIONSETTINGS.CHANNEL_TYPE", $KeywordRegistry.communicationChannelType$address()) + .then(new SqlBuilder() + .select(AddressUtils.formatOnelineSql()) + .from("ADDRESS") + .where("ADDRESS.ADDRESSID = COMMUNICATIONSETTINGS.CHANNEL_ID")) + .when("COMMUNICATIONSETTINGS.CHANNEL_TYPE", $KeywordRegistry.communicationChannelType$communication()) + .then(new SqlBuilder() + .select("ADDR") + .from("COMMUNICATION") + .where("COMMUNICATIONID = COMMUNICATIONSETTINGS.CHANNEL_ID")); + +result.string(displayValueSql.toString()); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_type.displayvalue/expression.js b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_type.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..c2b7346dd81d0b28adc307f0d533740ae06d0fc9 --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/channel_type.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationChannelType(), "COMMUNICATIONSETTINGS.CHANNEL_TYPE")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/medium_id.displayvalue/expression.js b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/medium_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..531e372f98c68180b2883f8702140dbe8dac4c6e --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/medium_id.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationMediumCampaign(), "COMMUNICATIONSETTINGS.MEDIUM")); \ No newline at end of file diff --git a/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..47b4114fc5c2961b0af902a8401d06551d9c3bd5 --- /dev/null +++ b/entity/CommunicationSettings_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationSettingStatus(), "COMMUNICATIONSETTINGS.STATUS")); \ No newline at end of file diff --git a/entity/Communication_entity/Communication_entity.aod b/entity/Communication_entity/Communication_entity.aod index 31f48ebaa3a51281176d95c6a40ea1c27f54c59d..d05064079162def233cf42c06700e32a33ee3914 100644 --- a/entity/Communication_entity/Communication_entity.aod +++ b/entity/Communication_entity/Communication_entity.aod @@ -90,6 +90,12 @@ Usually this is used for filtering COMMUNICATION-entries by a specified contact <fieldName>Communications</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>8266f568-f15d-42c5-8ba3-5254fed7fd99</name> + <entityName>CommunicationChannel_entity</entityName> + <fieldName>Communications</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/Communication_entity/afterOperatingState.js b/entity/Communication_entity/afterOperatingState.js index 7085e9f853c10e7ebaadcd76f44b8786c5d621ed..8c0033867c1e45e42fa9b62d26f0d6218a48452d 100644 --- a/entity/Communication_entity/afterOperatingState.js +++ b/entity/Communication_entity/afterOperatingState.js @@ -2,4 +2,7 @@ import("system.vars"); import("system.neon"); if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_VIEW) - vars.set("$context.PushDataPrivacyNotification", "false"); \ No newline at end of file +{ + vars.set("$context.PushDataPrivacyNotification", "false"); +} + \ No newline at end of file diff --git a/entity/Contact_entity/recordcontainers/db/onDBDelete.js b/entity/Contact_entity/recordcontainers/db/onDBDelete.js index 61afa46ba950988b60515de3cae0e732553cfe69..c7b08f7110800f03efb3ca755622080493d3fd48 100644 --- a/entity/Contact_entity/recordcontainers/db/onDBDelete.js +++ b/entity/Contact_entity/recordcontainers/db/onDBDelete.js @@ -5,7 +5,8 @@ import("system.vars"); import("DuplicateScanner_lib"); var contactId = vars.get("$field.CONTACTID"); -DuplicateScannerUtils.deleteCachedDuplicate(contactId); +DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [contactId]); +DuplicateScannerUtils.deleteHasDuplicateEntries("Organisation_entity", [contactId]); new AttributeRelationQuery(contactId, null, "Person") .deleteAllAttributes(); diff --git a/entity/DSGVOConfigurationAttribute_entity/DSGVOConfigurationAttribute_entity.aod b/entity/DSGVOConfigurationAttribute_entity/DSGVOConfigurationAttribute_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..b9124ce356f046cabb41c785bba831062c024234 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/DSGVOConfigurationAttribute_entity.aod @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>DSGVOConfigurationAttribute_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <documentation>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/documentation.adoc</documentation> + <recordContainer>jdito</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>UID</name> + </entityField> + <entityField> + <name>ATTRIBUTE_PARENT_ID</name> + </entityField> + <entityField> + <name>ATTRIBUTE_NAME</name> + <title>Name</title> + <displayValueProcess>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/entityfields/attribute_name/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>isDSGVORelevant</name> + <title>is DSGVO Relevant</title> + <contentType>BOOLEAN</contentType> + <valueProcess>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/entityfields/isdsgvorelevant/valueProcess.js</valueProcess> + </entityField> + <entityProvider> + <name>DSGVOAttributeConfig</name> + <dependencies> + <entityDependency> + <name>96e9f7e0-1f47-47d5-beee-0e28b3e203e1</name> + <entityName>DSGVOConfiguration_entity</entityName> + <fieldName>DSGVOConfigurationAttributes</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityActionGroup> + <name>FilterActions</name> + <state>DISABLED</state> + <stateProcess>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/stateProcess.js</stateProcess> + <children> + <entityActionField> + <name>changeDSGVORelevance</name> + <title>change DSGVO Relevance</title> + <onActionProcess>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/children/changedsgvorelevance/onActionProcess.js</onActionProcess> + <isMenuAction v="true" /> + <isSelectionAction v="true" /> + </entityActionField> + </children> + </entityActionGroup> + </entityFields> + <recordContainers> + <jDitoRecordContainer> + <name>jdito</name> + <jDitoRecordAlias>Data_alias</jDitoRecordAlias> + <contentProcess>%aditoprj%/entity/DSGVOConfigurationAttribute_entity/recordcontainers/jdito/contentProcess.js</contentProcess> + <recordFieldMappings> + <jDitoRecordFieldMapping> + <name>UID.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ATTRIBUTE_NAME.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ATTRIBUTE_PARENT_ID.value</name> + </jDitoRecordFieldMapping> + </recordFieldMappings> + </jDitoRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DSGVOConfigurationAttribute_entity/documentation.adoc b/entity/DSGVOConfigurationAttribute_entity/documentation.adoc new file mode 100644 index 0000000000000000000000000000000000000000..4441147717e0c61613ba2e247db2e3f0c5828431 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/documentation.adoc @@ -0,0 +1,5 @@ += DSGVOConfigurationAttribute_entity + +The entity shows all attributes relevant to the person and it is for the configuration of the GDPR-relevant attributes. +If a attribute is markt as GDPR-relevant you get a data privacy message, when you update or insert one in the persons. +Also these attributes are shown in the data privacy tap of the person. diff --git a/entity/DSGVOConfigurationAttribute_entity/entityfields/attribute_name/displayValueProcess.js b/entity/DSGVOConfigurationAttribute_entity/entityfields/attribute_name/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a5717eabb76417046c488939aadcfa7beb915dcd --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/entityfields/attribute_name/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.translate"); +import("system.result"); + +result.string(translate.text(vars.get("$this.value"))); \ No newline at end of file diff --git a/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/children/changedsgvorelevance/onActionProcess.js b/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/children/changedsgvorelevance/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..0c425285f1ac351bf2327587da08f930c866eef7 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/children/changedsgvorelevance/onActionProcess.js @@ -0,0 +1,34 @@ +import("system.neon"); +import("Sql_lib"); +import("system.entities"); +import("system.vars"); + + +if (vars.get("$field.isDSGVORelevant") == "0") +{ + let fields = { + "OBJECT_TYPE" : "DSGVO", + "AB_ATTRIBUTE_ID" : vars.get("$field.UID"), + "MAX_COUNT": "1" + } + + let createRowConfig = entities.createConfigForAddingRows() + .entity("AttributeUsage_entity"); + entities.createRow(createRowConfig.fieldValues(fields)); +} +else +{ + newSelect("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTEUSAGEID") + .from("AB_ATTRIBUTEUSAGE") + .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "DSGVO") + .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", vars.get("$field.UID")) + .arrayColumn() + .forEach(function (pUsageId) { + let deleteRowConfig = entities.createConfigForDeletingRows() + .uid(pUsageId) + .entity("AttributeUsage_entity"); + entities.deleteRow(deleteRowConfig); + }); +} + +neon.refreshAll(); \ No newline at end of file diff --git a/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/stateProcess.js b/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7bc43bb218f1477c70b73958cf6784458b2714f0 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/entityfields/filteractions/stateProcess.js @@ -0,0 +1,8 @@ +import("system.neon"); +import("system.result"); +import("system.vars"); + +if (vars.get("$sys.selection").length > 0) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} \ No newline at end of file diff --git a/entity/DSGVOConfigurationAttribute_entity/entityfields/isdsgvorelevant/valueProcess.js b/entity/DSGVOConfigurationAttribute_entity/entityfields/isdsgvorelevant/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..10bd0fec530097f2fabb20287cc417d16b1f8946 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/entityfields/isdsgvorelevant/valueProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("system.vars"); +import("Sql_lib"); + +result.string( newSelect("COUNT(*)") +.from("AB_ATTRIBUTEUSAGE") +.where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "DSGVO") +.and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", vars.get("$field.UID")).cell()); diff --git a/entity/DSGVOConfigurationAttribute_entity/recordcontainers/jdito/contentProcess.js b/entity/DSGVOConfigurationAttribute_entity/recordcontainers/jdito/contentProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..bd4950c921fc7cc464cc4e86555ea9970df6d009 --- /dev/null +++ b/entity/DSGVOConfigurationAttribute_entity/recordcontainers/jdito/contentProcess.js @@ -0,0 +1,12 @@ +import("system.result"); +import("Attribute_lib"); +import("Sql_lib"); + + +result.object(newSelect(["AB_ATTRIBUTE.AB_ATTRIBUTEID", "AB_ATTRIBUTE.ATTRIBUTE_NAME", "AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID"]) + .from("AB_ATTRIBUTE") + .join("AB_ATTRIBUTEUSAGE", "AB_ATTRIBUTE.AB_ATTRIBUTEID = AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID") + .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "Person") + .and("AB_ATTRIBUTE.ATTRIBUTE_TYPE", AttributeTypes.COMBOVALUE(), SqlBuilder.NOT_EQUAL()) + .and("ATTRIBUTE_ACTIVE = 1") + .orderBy("AB_ATTRIBUTE.ATTRIBUTE_PARENT_ID DESC").table()); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/DSGVOConfiguration_entity.aod b/entity/DSGVOConfiguration_entity/DSGVOConfiguration_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..5336dde6e7664ffbc2df7cb8f90be75f87ac4239 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/DSGVOConfiguration_entity.aod @@ -0,0 +1,187 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>DSGVOConfiguration_entity</name> + <title>DSGVO Configuration</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <documentation>%aditoprj%/entity/DSGVOConfiguration_entity/documentation.adoc</documentation> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>DATE_EDIT</name> + <contentType>DATE</contentType> + <mandatory v="false" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/date_edit/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_NEW</name> + <contentType>DATE</contentType> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/date_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DSGVOCONFIGURATIONID</name> + </entityField> + <entityField> + <name>FILTER</name> + <title>Filter</title> + <contentType>FILTER_TREE</contentType> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/filter/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>REASON</name> + <title>Reason</title> + <mandatory v="true" /> + <dropDownProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/reason/dropDownProcess.js</dropDownProcess> + <textInputAllowed v="true" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/reason/valueProcess.js</valueProcess> + <onValidation>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/reason/onValidation.js</onValidation> + </entityField> + <entityField> + <name>USER_EDIT</name> + <mandatory v="false" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/user_edit/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_NEW</name> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/user_new/valueProcess.js</valueProcess> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>entity</name> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/entity/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>alreadyMarked</name> + <title>Marked for deletion</title> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/alreadymarked/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>COUNT_USAGE</name> + <title>Count Usage</title> + <state>READONLY</state> + <stateProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/count_usage/stateProcess.js</stateProcess> + </entityField> + <entityConsumer> + <name>Persons</name> + <dependency> + <name>dependency</name> + <entityName>Person_entity</entityName> + <fieldName>Contacts</fieldName> + </dependency> + </entityConsumer> + <entityActionGroup> + <name>FilterConfigActions</name> + <children> + <entityActionField> + <name>MarkToDelete</name> + <title>Mark to Delete</title> + <onActionProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/onActionProcess.js</onActionProcess> + <isObjectAction v="true" /> + <iconId>NEON:SAL</iconId> + <titleProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/titleProcess.js</titleProcess> + </entityActionField> + <entityActionField> + <name>AnonymizePersons</name> + <title>anonymize Persons</title> + <onActionProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/anonymizepersons/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + <iconId>NEON:TRASH</iconId> + </entityActionField> + </children> + </entityActionGroup> + <entityActionField> + <name>OpenContacts</name> + <title>Open Contacts</title> + <onActionProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/opencontacts/onActionProcess.js</onActionProcess> + <isMenuAction v="true" /> + <isSelectionAction v="false" /> + <iconId>VAADIN:USERS</iconId> + </entityActionField> + <entityConsumer> + <name>ConfigKeywordAttributeRelation</name> + <dependency> + <name>dependency</name> + <entityName>KeywordAttributeRelation_entity</entityName> + <fieldName>AttributesForKeywordEntry</fieldName> + </dependency> + <children> + <entityParameter> + <name>KeywordEntryId_param</name> + <valueProcess>%aditoprj%/entity/DSGVOConfiguration_entity/entityfields/configkeywordattributerelation/children/keywordentryid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>DSGVOConfigurationAttributes</name> + <dependency> + <name>dependency</name> + <entityName>DSGVOConfigurationAttribute_entity</entityName> + <fieldName>DSGVOAttributeConfig</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>REASONID</name> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <isPageable v="true" /> + <onDBInsert>%aditoprj%/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBInsert.js</onDBInsert> + <onDBUpdate>%aditoprj%/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBUpdate.js</onDBUpdate> + <onDBDelete>%aditoprj%/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBDelete.js</onDBDelete> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>DATE_EDIT.value</name> + <recordfield>DSGVOCONFIGURATION.DATE_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>DSGVOCONFIGURATION.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DSGVOCONFIGURATIONID.value</name> + <recordfield>DSGVOCONFIGURATION.DSGVOCONFIGURATIONID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_EDIT.value</name> + <recordfield>DSGVOCONFIGURATION.USER_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>DSGVOCONFIGURATION.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>FILTER.value</name> + <recordfield>DSGVOCONFIGURATION.FILTER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>COUNT_USAGE.value</name> + <expression>%aditoprj%/entity/DSGVOConfiguration_entity/recordcontainers/db/recordfieldmappings/count_usage.value/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>REASONID.value</name> + <recordfield>DSGVOCONFIGURATION.REASON</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>6efbaa15-d5ef-49d5-b2fc-ca21f55b110a</name> + <tableName>DSGVOCONFIGURATION</tableName> + <primaryKey>DSGVOCONFIGURATIONID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DSGVOConfiguration_entity/documentation.adoc b/entity/DSGVOConfiguration_entity/documentation.adoc new file mode 100644 index 0000000000000000000000000000000000000000..0c451d61a372f05803f38408206387690b2f4309 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/documentation.adoc @@ -0,0 +1,8 @@ += DSGVOConfiguration_entity + +This entity is for the configurations of the filter to set the marks for deletion in the persons. +In the filter_view also can start the two processes. + +- The prozess to mark all to delete +- and then anonymize the persons with the second prozess + diff --git a/entity/DSGVOConfiguration_entity/entityfields/alreadymarked/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/alreadymarked/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2689a33903eceb090cc1103977eac0c779804fe0 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/alreadymarked/valueProcess.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Sql_lib"); + +result.string(parseInt(newSelect("COUNT(*)").from("CONTACT").where("CONTACT.STATUS", $KeywordRegistry.contactStatus$markToDelete()).cell())); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/configkeywordattributerelation/children/keywordentryid_param/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/configkeywordattributerelation/children/keywordentryid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..abbda7b1960a316165e5285f1c5c12875b696db4 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/configkeywordattributerelation/children/keywordentryid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.dsgvoConfiguration$configId()); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/count_usage/stateProcess.js b/entity/DSGVOConfiguration_entity/entityfields/count_usage/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..fb8e12bf234d636a35da74d064f5ddaf2f3a4369 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/count_usage/stateProcess.js @@ -0,0 +1,12 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +var res = neon.COMPONENTSTATE_INVISIBLE + +if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_EDIT && vars.get("$sys.recordstate") != neon.OPERATINGSTATE_EDIT) +{ + res = neon.COMPONENTSTATE_READONLY; +} + +result.string(res); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/date_edit/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/date_edit/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1cd90b34ea56f1e22f023e13710fed73f62d2c78 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/date_edit/valueProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +{ + result.string(vars.get("$sys.date")); +} + \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/date_new/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/date_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..0c68e0b1ce5d1bcb6519f306dfa01de18c10be7c --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/date_new/valueProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +{ + result.string(vars.get("$sys.date")); +} + \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/targetentity/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/entity/valueProcess.js similarity index 98% rename from entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/targetentity/valueProcess.js rename to entity/DSGVOConfiguration_entity/entityfields/entity/valueProcess.js index 0f7bee25ea3bd34aeeceff7f47f7f9118e69b7ba..c8fadb7380feb48636999dc2c70bd9b79ef5927e 100644 --- a/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/targetentity/valueProcess.js +++ b/entity/DSGVOConfiguration_entity/entityfields/entity/valueProcess.js @@ -1,2 +1,3 @@ import("system.result"); + result.string("Person_entity"); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/filter/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/filter/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1d66c48f85bd3a672a0c4f094b134377989e1a5c --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/filter/valueProcess.js @@ -0,0 +1,23 @@ +import("system.translate"); +import("system.vars"); +import("system.result"); + +if (!vars.get("$this.value")) +{ + result.string(JSON.stringify({ + entity: "" + vars.get("$field.entity") + "", + filter: { + type: "group", + operator: "AND", + childs: [{ + "type":"row", + "name":"#EXTENSION.IsEmployee_filter.IsEmployee_filter#BOOLEAN", + "operator":"EQUAL", + "value":translate.text("No"), + "key":"false", + "contenttype":"BOOLEAN" + }] + } + })); +} + diff --git a/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/anonymizepersons/onActionProcess.js b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/anonymizepersons/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..84cb5f3efd8a922cf45861cbc260fa2170398cc9 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/anonymizepersons/onActionProcess.js @@ -0,0 +1,18 @@ +import("system.translate"); +import("system.question"); +import("system.neon"); +import("system.vars"); +import("system.process"); + +let deleteFlags = question.askYesNo(translate.text("DSGVO"), translate.text("Do you really want to anonymize all marked persons?"), false); + +if (deleteFlags) +{ + var processConfig = process.createStartAsyncConfig() + .setShowErrorDialog(true) + .setName("DSGVOAnonymize_serverProcess"); + + process.startAsync(processConfig); +} + + diff --git a/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/onActionProcess.js b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d811e528c09a14d498ebbc9774f22a779d33b6fe --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/onActionProcess.js @@ -0,0 +1,15 @@ +import("system.translate"); +import("system.question"); +import("system.neon"); +import("system.vars"); +import("system.process"); + +let deleteFlags = question.askYesNo(translate.text("DSGVO"), translate.text("Do you want to delete the flags of the already maked Persons?"), false); + +var processConfig = process.createStartConfig() +.setLocalVariables({"deleteFlags" : deleteFlags, "tableSelection": JSON.stringify(vars.get("$sys.selection"))}) +.setName("DSGVOSetDeleteFlags_serverProcess"); + +process.start(processConfig); + +neon.refreshAll(); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/titleProcess.js b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/titleProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9c5b8ed9a40d00d0d8ccc0a55708200a0b0a7164 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/filterconfigactions/children/marktodelete/titleProcess.js @@ -0,0 +1,12 @@ +import("system.translate"); +import("system.result"); +import("system.vars"); + +if (vars.get("$sys.selection").length) +{ + result.string(translate.text("Mark selection to delete")); +} +else +{ + result.string(translate.text("Mark all to delete")); +} \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/opencontacts/onActionProcess.js b/entity/DSGVOConfiguration_entity/entityfields/opencontacts/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..36f8bf311d6d36d3c7f19d97c0df4c02ad6ae438 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/opencontacts/onActionProcess.js @@ -0,0 +1,7 @@ +import("system.translate"); +import("system.vars"); +import("system.neon"); + +neon.openContext("Person", "PersonFilterOverlay_view", null, neon.OPERATINGSTATE_SEARCH , { + FilterPreSet_param: JSON.stringify(JSON.parse(vars.get("$field.FILTER")).filter) +}); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/reason/dropDownProcess.js b/entity/DSGVOConfiguration_entity/entityfields/reason/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..11968ec24ef3cae230df9e488fdc909dade2ef4b --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/reason/dropDownProcess.js @@ -0,0 +1,12 @@ +import("system.logging"); +import("system.result"); +import("KeywordRegistry_basic"); +import("Keyword_lib"); + +let keywords = KeywordUtils.getEntryNamesAndIdsByContainer($KeywordRegistry.dsgvoReason()); + +keywords.shift(); + +logging.log(JSON.stringify(keywords)); + +result.object(keywords); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/reason/onValidation.js b/entity/DSGVOConfiguration_entity/entityfields/reason/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..315525a5cb90558f9db0c496138b193c93fcbdcb --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/reason/onValidation.js @@ -0,0 +1,8 @@ +import("system.vars"); +import("system.translate"); +import("system.result"); + +if (vars.getString("$local.value") && vars.getString("$local.value").length > 100) +{ + result.string(translate.text("Characters to use")); +} diff --git a/entity/DSGVOConfiguration_entity/entityfields/reason/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/reason/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..13e5f3cef514c67ebdd301630820e4d50cb80ce2 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/reason/valueProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("Sql_lib"); +import("system.vars"); + +if (!vars.get("$this.value") && vars.get("$field.REASONID")) +{ + result.string(vars.get("$field.REASONID")); +} \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/user_edit/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/user_edit/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4b5364ae7513fbd76d26cbb9bfe34adc90541764 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/user_edit/valueProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +{ + result.string(vars.get("$sys.user")); +} + \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/entityfields/user_new/valueProcess.js b/entity/DSGVOConfiguration_entity/entityfields/user_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..821388b7f44d42e12179d8886bd3f42b59c984b1 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/entityfields/user_new/valueProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +{ + result.string(vars.get("$sys.user")); +} + \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBDelete.js b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBDelete.js new file mode 100644 index 0000000000000000000000000000000000000000..e291fe5c7e99d2b8cb2b8bc39621fd5dd980b8dc --- /dev/null +++ b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBDelete.js @@ -0,0 +1,17 @@ +import("KeywordRegistry_basic"); +import("Sql_lib"); +import("system.vars"); + +let reason = vars.get("$local.rowdata")["DSGVOCONFIGURATION.REASON"]; + +newWhereIfSet("CONTACT.STATUS", $KeywordRegistry.contactStatus$markToDelete()) + .and("CONTACT.CONTACTID", + newSelect("DSGVODELETEFLAG.CONTACT_ID") + .from("DSGVODELETEFLAG") + .where("DSGVODELETEFLAG.REASON", reason), + SqlBuilder.IN()) + .updateData(true, "CONTACT", ["STATUS"], null, [$KeywordRegistry.contactStatus$active()]); + +newWhereIfSet("DSGVODELETEFLAG.REASON", reason) + .deleteData(true, "DSGVODELETEFLAG"); + diff --git a/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBInsert.js b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..d5181af765a21d043dd354ba9ba2858ee01caaf0 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBInsert.js @@ -0,0 +1,36 @@ +import("Sql_lib"); +import("system.entities"); +import("KeywordRegistry_basic"); +import("Keyword_lib"); +import("system.util"); +import("system.vars"); + +let rowdata = vars.get("$local.rowdata"); +let reason = vars.get("$field.REASON"); +let reasonID; + +if ( vars.get("$property.REASON.dropDown")[reason] == reason ) +{ + let newUID = util.getNewUUID(); + + let fields = { + "AB_KEYWORD_CATEGORY_ID" : KeywordUtils.getCategoryIdByName($KeywordRegistry.dsgvoReason()), + "TITLE" : reason, + "ISACTIVE": "1", + "KEYID" : newUID, + "AB_KEYWORD_ENTRYID": newUID + } + + let createRowConfig = entities.createConfigForAddingRows() + .entity("KeywordEntry_entity"); + entities.createRow(createRowConfig.fieldValues(fields)); + + reasonID = newUID; +} else { + reasonID = reason; +} + + newWhere("DSGVOCONFIGURATION.DSGVOCONFIGURATIONID", rowdata["DSGVOCONFIGURATION.DSGVOCONFIGURATIONID"]) + .updateFields({ + "DSGVOCONFIGURATION.REASON" : reasonID + }, "DSGVOCONFIGURATION"); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBUpdate.js b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..d5181af765a21d043dd354ba9ba2858ee01caaf0 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/recordcontainers/db/onDBUpdate.js @@ -0,0 +1,36 @@ +import("Sql_lib"); +import("system.entities"); +import("KeywordRegistry_basic"); +import("Keyword_lib"); +import("system.util"); +import("system.vars"); + +let rowdata = vars.get("$local.rowdata"); +let reason = vars.get("$field.REASON"); +let reasonID; + +if ( vars.get("$property.REASON.dropDown")[reason] == reason ) +{ + let newUID = util.getNewUUID(); + + let fields = { + "AB_KEYWORD_CATEGORY_ID" : KeywordUtils.getCategoryIdByName($KeywordRegistry.dsgvoReason()), + "TITLE" : reason, + "ISACTIVE": "1", + "KEYID" : newUID, + "AB_KEYWORD_ENTRYID": newUID + } + + let createRowConfig = entities.createConfigForAddingRows() + .entity("KeywordEntry_entity"); + entities.createRow(createRowConfig.fieldValues(fields)); + + reasonID = newUID; +} else { + reasonID = reason; +} + + newWhere("DSGVOCONFIGURATION.DSGVOCONFIGURATIONID", rowdata["DSGVOCONFIGURATION.DSGVOCONFIGURATIONID"]) + .updateFields({ + "DSGVOCONFIGURATION.REASON" : reasonID + }, "DSGVOCONFIGURATION"); \ No newline at end of file diff --git a/entity/DSGVOConfiguration_entity/recordcontainers/db/recordfieldmappings/count_usage.value/expression.js b/entity/DSGVOConfiguration_entity/recordcontainers/db/recordfieldmappings/count_usage.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..d2be7823837c0c6680941efd8f3c746c7e90efa3 --- /dev/null +++ b/entity/DSGVOConfiguration_entity/recordcontainers/db/recordfieldmappings/count_usage.value/expression.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Sql_lib"); + +result.string(newSelect("COUNT(*)").from("DSGVODELETEFLAG").where("DSGVOCONFIGURATION.REASON = DSGVODELETEFLAG.REASON").toString()) \ No newline at end of file diff --git a/entity/DSGVODeleteFlag_entity/DSGVODeleteFlag_entity.aod b/entity/DSGVODeleteFlag_entity/DSGVODeleteFlag_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..2689a96d7cdbfef9a422fdc07b7c5f5012c8fb47 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/DSGVODeleteFlag_entity.aod @@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>DSGVODeleteFlag_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <documentation>%aditoprj%/entity/DSGVODeleteFlag_entity/documentation.adoc</documentation> + <siblings> + <element>Person_entity</element> + <element>LogHistory_entity</element> + </siblings> + <grantUpdate v="false" /> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>DATE_NEW</name> + <title>Date</title> + <contentType>DATE</contentType> + <mandatory v="true" /> + </entityField> + <entityField> + <name>DSGVODELETEFLAGID</name> + </entityField> + <entityField> + <name>REASON</name> + <title>Reason</title> + <consumer>DSGVOReasonKeywords</consumer> + <mandatory v="true" /> + <state>READONLY</state> + <displayValueProcess>%aditoprj%/entity/DSGVODeleteFlag_entity/entityfields/reason/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>USER_NEW</name> + <title>User</title> + <mandatory v="true" /> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>CONTACT_ID</name> + </entityField> + <entityProvider> + <name>DSGVODeleteFlags</name> + <dependencies> + <entityDependency> + <name>94915ca8-aca8-457a-ac12-05408ba8ab37</name> + <entityName>Person_entity</entityName> + <fieldName>DSGVODeleteFlags</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityParameter> + <name>ContactId_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityConsumer> + <name>DSGVOReasonKeywords</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>OrderedBySortingFieldKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/DSGVODeleteFlag_entity/entityfields/dsgvoreasonkeywords/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityActionGroup> + <name>FilterActions</name> + <children> + <entityActionField> + <name>AddManualDeleteFlag</name> + <title>Add Manual Delete Flag</title> + <onActionProcess>%aditoprj%/entity/DSGVODeleteFlag_entity/entityfields/filteractions/children/addmanualdeleteflag/onActionProcess.js</onActionProcess> + <iconId>VAADIN:PLUS</iconId> + </entityActionField> + </children> + </entityActionGroup> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <conditionProcess>%aditoprj%/entity/DSGVODeleteFlag_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <onDBDelete>%aditoprj%/entity/DSGVODeleteFlag_entity/recordcontainers/db/onDBDelete.js</onDBDelete> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>DSGVODELETEFLAG.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DSGVODELETEFLAGID.value</name> + <recordfield>DSGVODELETEFLAG.DSGVODELETEFLAGID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>REASON.value</name> + <recordfield>DSGVODELETEFLAG.REASON</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>DSGVODELETEFLAG.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>DSGVODELETEFLAG.CONTACT_ID</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>883f262d-bb32-48ca-a3b0-5256df85bf59</name> + <tableName>DSGVODELETEFLAG</tableName> + <primaryKey>DSGVODELETEFLAGID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DSGVODeleteFlag_entity/documentation.adoc b/entity/DSGVODeleteFlag_entity/documentation.adoc new file mode 100644 index 0000000000000000000000000000000000000000..415fdca25d9a77d239b9ac97d03d6288321058d6 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/documentation.adoc @@ -0,0 +1,9 @@ += DSGVODeleteFlag_entity + +This Entity handles the Delete Flags for a Person and you can set it manually or delete the already set ones. +If one Delete Flag is set, the Person Status will set to "mark to delete". +If all Delete Flags was removed, the Status of the Person will set to "active". + + + + diff --git a/entity/DSGVODeleteFlag_entity/entityfields/dsgvoreasonkeywords/children/containername_param/valueProcess.js b/entity/DSGVODeleteFlag_entity/entityfields/dsgvoreasonkeywords/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7aca2ec20585e17c01b70bee2aa7e852b84e6a88 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/entityfields/dsgvoreasonkeywords/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.dsgvoReason()); \ No newline at end of file diff --git a/entity/DSGVODeleteFlag_entity/entityfields/filteractions/children/addmanualdeleteflag/onActionProcess.js b/entity/DSGVODeleteFlag_entity/entityfields/filteractions/children/addmanualdeleteflag/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9601edb7847d4f03e9ac2b2b55e1af4ff2833455 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/entityfields/filteractions/children/addmanualdeleteflag/onActionProcess.js @@ -0,0 +1,15 @@ +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.util"); +import("system.entities"); +import("Sql_lib"); + +new SqlBuilder().insertData("DSGVODELETEFLAG", ["DSGVODELETEFLAGID","REASON", "CONTACT_ID", "USER_NEW", "DATE_NEW"], null, [util.getNewUUID(), $KeywordRegistry.dsgvoReason$manuel(), vars.get("$param.ContactId_param"), vars.get("$sys.user"), vars.get("$sys.date")]); + +let config = entities.createConfigForUpdatingRows() +.ignorePermissions(true) +.entity("Person_entity") +.fieldValues({"STATUS": $KeywordRegistry.contactStatus$markToDelete() }) +.uid(vars.get("$param.ContactId_param")); + +entities.updateRow(config); \ No newline at end of file diff --git a/entity/DSGVODeleteFlag_entity/entityfields/reason/displayValueProcess.js b/entity/DSGVODeleteFlag_entity/entityfields/reason/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7e63a5beb356861619d2729e0598b7ca8bc1651d --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/entityfields/reason/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.vars"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string(KeywordUtils.getViewValue($KeywordRegistry.dsgvoReason(), vars.get("$this.value"))); \ No newline at end of file diff --git a/entity/DSGVODeleteFlag_entity/recordcontainers/db/conditionProcess.js b/entity/DSGVODeleteFlag_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a7c168d2d17b472e51c40d06b642d103dad36a38 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,8 @@ +import("system.vars"); +import("system.db"); +import("system.result"); +import("Sql_lib"); + +var cond = newWhereIfSet("DSGVODELETEFLAG.CONTACT_ID", "$param.ContactId_param", SqlBuilder.EQUAL()); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/DSGVODeleteFlag_entity/recordcontainers/db/onDBDelete.js b/entity/DSGVODeleteFlag_entity/recordcontainers/db/onDBDelete.js new file mode 100644 index 0000000000000000000000000000000000000000..b6365c6f9fc7804381168a37c33b86a7240597f7 --- /dev/null +++ b/entity/DSGVODeleteFlag_entity/recordcontainers/db/onDBDelete.js @@ -0,0 +1,19 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.entities"); +import("Sql_lib"); + +let contactId = vars.get("$param.ContactId_param"); + +if (parseInt(newSelect(["Count(*)"]).from("DSGVODELETEFLAG").where("DSGVODELETEFLAG.CONTACT_ID", contactId).cell()) == 1) +{ + let config = entities.createConfigForUpdatingRows() + .ignorePermissions(true) + .entity("Person_entity") + .fieldValues({ + "STATUS": $KeywordRegistry.contactStatus$active() + }) + .uid(contactId); + + entities.updateRow(config); +} \ No newline at end of file diff --git a/entity/DSGVOReport_entity/entityfields/dsgvoreportdispatch/children/dispatchdsgvoreport/onActionProcess.js b/entity/DSGVOReport_entity/entityfields/dsgvoreportdispatch/children/dispatchdsgvoreport/onActionProcess.js index e7ffc71bedc55beb9053abc8da900f809680228c..14f74060919a8c1a315722141e9c31f814003bc7 100644 --- a/entity/DSGVOReport_entity/entityfields/dsgvoreportdispatch/children/dispatchdsgvoreport/onActionProcess.js +++ b/entity/DSGVOReport_entity/entityfields/dsgvoreportdispatch/children/dispatchdsgvoreport/onActionProcess.js @@ -1,3 +1,4 @@ +import("KeywordRegistry_basic"); import("system.logging"); import("system.translate"); import("system.vars"); @@ -19,10 +20,12 @@ var emailFilename = translate.text(reportType == "DSGVO_Disclosure_report" ? "Di var fullname = ContactUtils.getTitleByContactId(contactId); emailFilename = emailFilename + " " + fullname; -dsgvoReport.content = reportData; +dsgvoReport.content = reportData.substr(1); dsgvoReport.mimeType = MimeTypes.PDF(); dsgvoReport.filename = emailFilename + ".pdf"; attachmentArray[0] = dsgvoReport; -EmailWritingUtils.sendReportAsMail(recipient, attachmentArray, "DSGVOReport", null, emailFilename, null, null); + +EmailWritingUtils.sendReportAsMail(recipient, attachmentArray, "DSGVOReport", null, emailFilename, null, null, + $KeywordRegistry.documentTemplateTypeCategory$single()); \ No newline at end of file diff --git a/entity/DSGVO_entity/DSGVO_entity.aod b/entity/DSGVO_entity/DSGVO_entity.aod index be47ef0d4009d01d94464151a2e7ecf970b46d83..1e6d35b7292ed57e384ff29bf2687f5bf70387fd 100644 --- a/entity/DSGVO_entity/DSGVO_entity.aod +++ b/entity/DSGVO_entity/DSGVO_entity.aod @@ -52,6 +52,17 @@ <name>ROW_ID</name> <valueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/row_id/valueProcess.js</valueProcess> </entityField> + <entityField> + <name>bindata</name> + <title>File</title> + <contentType>FILE</contentType> + <mandatory v="true" /> + <mandatoryProcess>%aditoprj%/entity/DSGVO_entity/entityfields/bindata/mandatoryProcess.js</mandatoryProcess> + <state>INVISIBLE</state> + <stateProcess>%aditoprj%/entity/DSGVO_entity/entityfields/bindata/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/bindata/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/DSGVO_entity/entityfields/bindata/displayValueProcess.js</displayValueProcess> + </entityField> <entityField> <name>STATUORITYSOURCE</name> <title>DataPrivacy Right</title> diff --git a/entity/DSGVO_entity/entityfields/bindata/displayValueProcess.js b/entity/DSGVO_entity/entityfields/bindata/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..82d715638aff20681723c714a0b94f32702ed2cc --- /dev/null +++ b/entity/DSGVO_entity/entityfields/bindata/displayValueProcess.js @@ -0,0 +1,15 @@ +import("Sql_lib"); +import("system.result"); +import("system.vars"); +import("system.db"); + +var binMetadatas = db.getBinaryMetadata("CONTACT", "DOCUMENT", vars.get("$field.CONTACT_ID"), false, SqlUtils.getBinariesAlias(), "PRIVACY_NOTICE"); + +if (binMetadatas.length > 0) +{ + result.string(binMetadatas[0].filename); +} +else +{ + result.string("FILE MISSING"); +} \ No newline at end of file diff --git a/entity/DSGVO_entity/entityfields/bindata/mandatoryProcess.js b/entity/DSGVO_entity/entityfields/bindata/mandatoryProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4ec1aa1eb03e216f66ff40491d918f9cfa6213da --- /dev/null +++ b/entity/DSGVO_entity/entityfields/bindata/mandatoryProcess.js @@ -0,0 +1,13 @@ +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.result"); +import("system.neon"); + +var res = "false"; + +if (vars.get("$field.DSGVOTYPE") == $KeywordRegistry.dsgvoType$privacyNotice()) +{ + res = "true"; +} + +result.string(res); \ No newline at end of file diff --git a/entity/DSGVO_entity/entityfields/bindata/stateProcess.js b/entity/DSGVO_entity/entityfields/bindata/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..51bae3fa772a47011ab6cf8eb7e6c6ceaaf39925 --- /dev/null +++ b/entity/DSGVO_entity/entityfields/bindata/stateProcess.js @@ -0,0 +1,10 @@ +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.result"); +import("system.neon"); + +if (vars.get("$field.DSGVOTYPE") == $KeywordRegistry.dsgvoType$privacyNotice()) +{ + result.string("EDITABLE"); +} + \ No newline at end of file diff --git a/entity/DSGVO_entity/entityfields/bindata/valueProcess.js b/entity/DSGVO_entity/entityfields/bindata/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..5a5737b0600a4fc027888b6a571c4fa94ba022bf --- /dev/null +++ b/entity/DSGVO_entity/entityfields/bindata/valueProcess.js @@ -0,0 +1,18 @@ +import("system.translate"); +import("system.result"); +import("system.neon"); +import("Sql_lib"); +import("system.db"); +import("system.vars"); + +if (vars.get("$sys.recordstate") && vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) +{ + var binMetadatas = db.getBinaryMetadata("CONTACT", "DOCUMENT", vars.get("$field.CONTACT_ID"), false, SqlUtils.getBinariesAlias(), "PRIVACY_NOTICE"); + if (binMetadatas.length > 0) + { + // preset the field. This is to allow just editing the other fields without uploading a file (because this field is mandatory) + // if the user did not upload a file "FILE NOT CHANGED" will be still in the field in onDBUpdate and nothing has to be done there + // --> this is a marking that the field didn't change + result.string(translate.text("FILE NOT CHANGED")); + } +} \ No newline at end of file diff --git a/entity/DSGVO_entity/entityfields/dsgvoactions/children/anonymperson/onActionProcess.js b/entity/DSGVO_entity/entityfields/dsgvoactions/children/anonymperson/onActionProcess.js index 154dd846f477bee30e3d50c88b73a9f1be840acb..d5f013ed1b214e04593755cf0e405b91c1e84e6a 100644 --- a/entity/DSGVO_entity/entityfields/dsgvoactions/children/anonymperson/onActionProcess.js +++ b/entity/DSGVO_entity/entityfields/dsgvoactions/children/anonymperson/onActionProcess.js @@ -2,4 +2,4 @@ import("system.vars"); import("DataPrivacy_lib"); // TODO open View DSGVOPreviewAnonym_view mit Auswahl an Kategorien -//DataPrivacyUtils.dsgvoMkDataAnonymous(vars.get("$field.CONTACT_ID"), vars.get("$field.ROW_ID")); \ No newline at end of file +// DataPrivacyUtils.dsgvoMkDataAnonymous(vars.get("$field.CONTACT_ID"), vars.get("$field.ROW_ID")); \ No newline at end of file diff --git a/entity/DSGVO_entity/recordcontainers/jdito/onUpdate.js b/entity/DSGVO_entity/recordcontainers/jdito/onUpdate.js index 5197563de59cb12e5b47e19d0800de70288d720e..014592cb299052ba5248bbec35950c038e4e69fc 100644 --- a/entity/DSGVO_entity/recordcontainers/jdito/onUpdate.js +++ b/entity/DSGVO_entity/recordcontainers/jdito/onUpdate.js @@ -1,8 +1,29 @@ +import("Binary_lib"); +import("Document_lib"); import("system.neon"); import("system.db"); import("Sql_lib"); import("system.vars"); +var binMetadata = db.getBinaryMetadata("CONTACT", "DOCUMENT", vars.get("$field.CONTACT_ID"), false, SqlUtils.getBinariesAlias(), "PRIVACY_NOTICE"); +var assignmentRowId = vars.get("$field.CONTACT_ID"); + +// "FILE NOT CHANGED" is set in the value process of the field to indicate that the user didn't upload a new file +if (vars.get("$field.bindata") != "FILE NOT CHANGED") +{ + let bindata = DocumentUtil.getBindataFromUpload(vars.get("$field.bindata")); + let filename = DocumentUtil.getFilenameFromUpload(vars.get("$field.bindata")); + + if(bindata != '' && filename != '') + { + if (binMetadata.length == 1) + { + db.updateBinaryMetadata(binMetadata[0].id, "", binMetadata[0].filename, "", "", SqlUtils.getBinariesAlias()); + } + db.insertBinary("CONTACT", "DOCUMENT", assignmentRowId, "", bindata, filename, "", "PRIVACY_NOTICE", SqlUtils.getBinariesAlias()); + } +} + var columns = [ "STATUORITYSOURCE", "PURPOSE", diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod index db44542e1140ab1217d412a752b85812417d5935..59a71017299588752f9f8091e7c54f78059ce7cc 100644 --- a/entity/Document_entity/Document_entity.aod +++ b/entity/Document_entity/Document_entity.aod @@ -68,19 +68,6 @@ </onValueChangeTypes> <onValidation>%aditoprj%/entity/Document_entity/entityfields/bindata_upload/onValidation.js</onValidation> </entityField> - <entityActionGroup> - <name>Document_actions</name> - <children> - <entityActionField> - <name>downloadFilesAction</name> - <title>Download</title> - <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/document_actions/children/downloadfilesaction/onActionProcess.js</onActionProcess> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>VAADIN:DOWNLOAD</iconId> - </entityActionField> - </children> - </entityActionGroup> <entityParameter> <name>AssignmentTable_param</name> <expose v="true" /> @@ -124,6 +111,7 @@ <title>Main document</title> <contentType>BOOLEAN</contentType> <placeholderProcess>%aditoprj%/entity/Document_entity/entityfields/is_main_document/placeholderProcess.js</placeholderProcess> + <stateProcess>%aditoprj%/entity/Document_entity/entityfields/is_main_document/stateProcess.js</stateProcess> <valueProcess>%aditoprj%/entity/Document_entity/entityfields/is_main_document/valueProcess.js</valueProcess> <onValueChange>%aditoprj%/entity/Document_entity/entityfields/is_main_document/onValueChange.js</onValueChange> <onValueChangeTypes> @@ -136,12 +124,6 @@ <mandatory v="false" /> <description>PARAMETER</description> </entityParameter> - <entityActionField> - <name>downloadSingleFileAction</name> - <title>Download</title> - <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/downloadsinglefileaction/onActionProcess.js</onActionProcess> - <iconId>VAADIN:DOWNLOAD</iconId> - </entityActionField> <entityProvider> <name>Documents</name> <documentation>%aditoprj%/entity/Document_entity/entityfields/documents/documentation.adoc</documentation> @@ -376,6 +358,56 @@ <name>#PROVIDER_AGGREGATES</name> <useAggregates v="true" /> </entityProvider> + <entityParameter> + <name>MSTTeamId_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>assignmentRowID</name> + <valueProcess>%aditoprj%/entity/Document_entity/entityfields/assignmentrowid/valueProcess.js</valueProcess> + </entityField> + <entityActionGroup> + <name>Document_actions</name> + <title>Document actions</title> + <children> + <entityActionField> + <name>openFileAction</name> + <title>${ACTION_DO_OPEN}</title> + <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/document_actions/children/openfileaction/onActionProcess.js</onActionProcess> + <isMenuAction v="true" /> + <isObjectAction v="false" /> + <isSelectionAction v="true" /> + <isSaveAction v="false" /> + <iconId>VAADIN:FOLDER_OPEN</iconId> + <state>AUTO</state> + <stateProcess>%aditoprj%/entity/Document_entity/entityfields/document_actions/children/openfileaction/stateProcess.js</stateProcess> + </entityActionField> + <entityActionField> + <name>downloadFilesAction</name> + <title>Download</title> + <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/document_actions/children/downloadfilesaction/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + <isSelectionAction v="true" /> + <iconId>VAADIN:DOWNLOAD</iconId> + <state>EDITABLE</state> + </entityActionField> + </children> + </entityActionGroup> + <entityActionField> + <name>openSingleFileAction</name> + <title>${ACTION_DO_OPEN}</title> + <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/opensinglefileaction/onActionProcess.js</onActionProcess> + <isSelectionAction v="false" /> + <iconId>VAADIN:FOLDER_OPEN</iconId> + <state>AUTO</state> + <stateProcess>%aditoprj%/entity/Document_entity/entityfields/opensinglefileaction/stateProcess.js</stateProcess> + </entityActionField> + <entityActionField> + <name>downloadSingleFileAction</name> + <title>Download</title> + <onActionProcess>%aditoprj%/entity/Document_entity/entityfields/downloadsinglefileaction/onActionProcess.js</onActionProcess> + <iconId>VAADIN:DOWNLOAD</iconId> + </entityActionField> <entityActionGroup> <name>MSTeam</name> <title>MS Teams</title> @@ -390,14 +422,6 @@ </entityActionField> </children> </entityActionGroup> - <entityParameter> - <name>MSTTeamId_param</name> - <expose v="true" /> - </entityParameter> - <entityField> - <name>assignmentRowID</name> - <valueProcess>%aditoprj%/entity/Document_entity/entityfields/assignmentrowid/valueProcess.js</valueProcess> - </entityField> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/Document_entity/entityfields/document_actions/children/openfileaction/onActionProcess.js b/entity/Document_entity/entityfields/document_actions/children/openfileaction/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b33a4fd30ed0c36f55a21b834ff8580c7110ecb5 --- /dev/null +++ b/entity/Document_entity/entityfields/document_actions/children/openfileaction/onActionProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("Document_lib"); + +DocumentUtil.openSelectedDocument(vars.get("$param.AssignmentName_param")); \ No newline at end of file diff --git a/entity/Document_entity/entityfields/document_actions/children/openfileaction/stateProcess.js b/entity/Document_entity/entityfields/document_actions/children/openfileaction/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d29ab3ca86a4675ae8d22a18bdad6bfd7b3c49f9 --- /dev/null +++ b/entity/Document_entity/entityfields/document_actions/children/openfileaction/stateProcess.js @@ -0,0 +1,11 @@ +import("system.neon"); +import("system.result"); +import("Document_lib"); + +var openFileState; +if(DocumentUtil.canOpenSelectedDocument()) + openFileState = neon.COMPONENTSTATE_EDITABLE; +else + openFileState = neon.COMPONENTSTATE_INVISIBLE; + +result.string(openFileState); \ No newline at end of file diff --git a/entity/Document_entity/entityfields/is_main_document/stateProcess.js b/entity/Document_entity/entityfields/is_main_document/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e938ad58641a89586b266f8c509d02aefe402237 --- /dev/null +++ b/entity/Document_entity/entityfields/is_main_document/stateProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); +import("system.neon"); + +if(vars.get("$field.KEYWORD") == 'PRIVACY_NOTICE') +{ + result.string(neon.COMPONENTSTATE_READONLY); +} + \ No newline at end of file diff --git a/entity/Document_entity/entityfields/is_main_document/valueProcess.js b/entity/Document_entity/entityfields/is_main_document/valueProcess.js index 044f5d99f80a775c390b772a5d8e1cf875c87479..e835769e69dd948edc744ace57110039ee884e0f 100644 --- a/entity/Document_entity/entityfields/is_main_document/valueProcess.js +++ b/entity/Document_entity/entityfields/is_main_document/valueProcess.js @@ -1,7 +1,11 @@ import("system.vars"); import("system.result"); -if(vars.get("$field.KEYWORD") == 'MAINDOCUMENT') - result.string("1"); -else - result.string("0"); \ No newline at end of file +var res = "0" + +if(vars.get("$field.KEYWORD") == 'MAINDOCUMENT' || vars.get("$field.KEYWORD") == 'PRIVACY_NOTICE') +{ + res = "1"; +} + +result.string(res); \ No newline at end of file diff --git a/entity/Document_entity/entityfields/opensinglefileaction/onActionProcess.js b/entity/Document_entity/entityfields/opensinglefileaction/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b33a4fd30ed0c36f55a21b834ff8580c7110ecb5 --- /dev/null +++ b/entity/Document_entity/entityfields/opensinglefileaction/onActionProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("Document_lib"); + +DocumentUtil.openSelectedDocument(vars.get("$param.AssignmentName_param")); \ No newline at end of file diff --git a/entity/Document_entity/entityfields/opensinglefileaction/stateProcess.js b/entity/Document_entity/entityfields/opensinglefileaction/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d29ab3ca86a4675ae8d22a18bdad6bfd7b3c49f9 --- /dev/null +++ b/entity/Document_entity/entityfields/opensinglefileaction/stateProcess.js @@ -0,0 +1,11 @@ +import("system.neon"); +import("system.result"); +import("Document_lib"); + +var openFileState; +if(DocumentUtil.canOpenSelectedDocument()) + openFileState = neon.COMPONENTSTATE_EDITABLE; +else + openFileState = neon.COMPONENTSTATE_INVISIBLE; + +result.string(openFileState); \ No newline at end of file diff --git a/entity/DuplicateOrganisation_entity/DuplicateOrganisation_entity.aod b/entity/DuplicateOrganisation_entity/DuplicateOrganisation_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..eb3318d1aad761ad8f944dd5596c80d20a8999b3 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/DuplicateOrganisation_entity.aod @@ -0,0 +1,241 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>DuplicateOrganisation_entity</name> + <title>Duplicate</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <grantCreate v="false" /> + <grantUpdate v="false" /> + <grantDelete v="false" /> + <initFilterProcess>%aditoprj%/entity/DuplicateOrganisation_entity/initFilterProcess.js</initFilterProcess> + <titlePlural>Duplicates</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + <targetContextField>targetContext</targetContextField> + <targetIdField>CONTACTID</targetIdField> + <dependencies> + <entityDependency> + <name>a666bb24-2875-481a-879e-86b8e8517c1e</name> + <entityName>Organisation_entity</entityName> + <fieldName>Duplicates</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>CONTACTID</name> + <linkedContext>Organisation</linkedContext> + </entityField> + <entityField> + <name>ORGNAME</name> + <title>Name</title> + <linkedContext>Organisation</linkedContext> + </entityField> + <entityParameter> + <name>Id_param</name> + <valueProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/id_param/valueProcess.js</valueProcess> + <mandatory v="true" /> + </entityParameter> + <entityParameter> + <name>Obj_param</name> + <expose v="true" /> + <mandatory v="true" /> + <description>Contains a name value object of all variables that can be used to scan for duplicates</description> + </entityParameter> + <entityActionGroup> + <name>filterActions</name> + <children> + <entityActionField> + <name>ignoreDuplicates</name> + <title>${IGNORE_DUPLICATE}</title> + <onActionProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + <isSelectionAction v="true" /> + <iconId>VAADIN:CLOSE</iconId> + <titleProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js</titleProcess> + </entityActionField> + <entityActionField> + <name>mergeselectedintocurrent</name> + <title>Integrate selected into current contact</title> + <onActionProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js</onActionProcess> + <isSelectionAction v="true" /> + <iconId>NEON:IMPORT</iconId> + </entityActionField> + <entityActionField> + <name>mergecurrentintoselected</name> + <title>Integrate current into selected contact</title> + <onActionProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js</onActionProcess> + <isSelectionAction v="true" /> + <iconId>NEON:EXPORT</iconId> + </entityActionField> + </children> + </entityActionGroup> + <entityField> + <name>STATUS</name> + <title>Status</title> + <consumer>KeywordContactStates</consumer> + </entityField> + <entityField> + <name>CUSTOMERCODE</name> + <title>Customercode</title> + </entityField> + <entityConsumer> + <name>KeywordContactStates</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>TYPE</name> + <title>Type</title> + <consumer>KeywordOrganisationTypes</consumer> + </entityField> + <entityField> + <name>STANDARD_EMAIL_COMMUNICATION</name> + <title>E-Mail</title> + </entityField> + <entityField> + <name>STANDARD_PHONE_COMMUNICATION</name> + <title>Phone</title> + </entityField> + <entityField> + <name>STANDARD_ADDRESS</name> + <title>Address</title> + </entityField> + <entityConsumer> + <name>KeywordOrganisationTypes</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/keywordorganisationtypes/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>targetContext</name> + <valueProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/targetcontext/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DUPLICATE</name> + <title>Duplicate</title> + <contentType>BOOLEAN</contentType> + </entityField> + <entityField> + <name>PICTURE</name> + <title>Picture</title> + <contentType>IMAGE</contentType> + <displayValueProcess>%aditoprj%/entity/DuplicateOrganisation_entity/entityfields/picture/displayValueProcess.js</displayValueProcess> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <isReadOnly v="true" /> + <fromClauseProcess>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>CONTACTID.value</name> + <recordfield>CONTACT.CONTACTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGNAME.value</name> + <recordfield>CONTACT.CONTACTID</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGNAME.displayValue</name> + <recordfield>ORGANISATION.NAME</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CUSTOMERCODE.value</name> + <recordfield>ORGANISATION.CUSTOMERCODE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>CONTACT.STATUS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_EMAIL_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_PHONE_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_ADDRESS.value</name> + <recordfield>ADDRESS.ADDRESS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TYPE.value</name> + <recordfield>ORGANISATION.KIND</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TYPE.displayValue</name> + <expression>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DUPLICATE.value</name> + <expression>%aditoprj%/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PICTURE.value</name> + <recordfield>ORGANISATION.PICTURE</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>49ea0faa-d04e-4d9d-b489-5a7b815e9e89</name> + <tableName>ORGANISATION</tableName> + <primaryKey>ORGANISATIONID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>523f6891-14ee-49ba-952d-7d5981e14b0c</name> + <tableName>CONTACT</tableName> + <primaryKey>CONTACTID</primaryKey> + <isUIDTable v="true" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>6b73b998-a194-4fb6-8659-42eac09e20cc</name> + <tableName>ADDRESS</tableName> + <primaryKey>ADDRESSID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a070181a8e991188f1a7ff62ab87423364cdb5a6 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js @@ -0,0 +1,7 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateIgnored("Organisation_entity", vars.get("$param.Id_param"), vars.get("$sys.selection"), parseInt(vars.get("$field.DUPLICATE"))); +neon.refreshAll(); // Update the rows, because UNRELATEDDUPLICATES wont trigger a refresh even with write entities diff --git a/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4c5ccfffeb0e7b5efc940eba237fbdc99ab9b603 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js @@ -0,0 +1,9 @@ +import("system.translate"); +import("system.vars"); +import("system.result"); + +result.string( + parseInt(vars.get("$field.DUPLICATE")) ? + translate.text("${IGNORE_DUPLICATE}") : + translate.text("${UNIGNORE_DUPLICATE}") +); diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js similarity index 51% rename from entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js rename to entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js index 29dab7b72c8898044cfabd79426552733f9f7dc4..b23396c01c1214f15be0e2bae435e1e9da91c702 100644 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js +++ b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js @@ -1,20 +1,29 @@ +import("system.translate"); +import("system.question"); import("Employee_lib"); import("system.vars"); import("system.neon"); -import("DuplicateScanner_lib"); +import("DuplicateMerge_lib"); -let sourceContactId = vars.get("$param.DuplicateCurrentContactId_param"); +if(vars.get("$sys.selection").length == 1) +{ +let sourceContactId = vars.get("$param.Id_param"); let targetContactId = vars.get("$sys.selection")[0]; //todo the actual merge ought to happen in a separate view where the contact infos can be merged manually by the user. -let mergeSuccess = DuplicateScannerUtils.mergeOrganisation(sourceContactId, targetContactId); +let mergeSuccess = DuplicateMergeUtils.mergeOrganisation(sourceContactId, targetContactId); if(mergeSuccess) { let currentContactId = EmployeeUtils.getCurrentContactId(); if(currentContactId == null) currentContactId = ""; - DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Organisation"); + DuplicateMergeUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Organisation"); neon.openContext("Organisation", "OrganisationMain_view", [targetContactId], neon.OPERATINGSTATE_VIEW, null) -} \ No newline at end of file +} +} +else +{ + question.showMessage(translate.text("Please select only one element")); +} diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js similarity index 61% rename from entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js rename to entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js index 5ac58579f1326724bf4e6340a751ee86b12850b4..ac1a9260b226c00b472e5222a97c0c4f8286bfad 100644 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js +++ b/entity/DuplicateOrganisation_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js @@ -1,22 +1,31 @@ +import("system.translate"); +import("system.question"); import("Employee_lib"); import("system.vars"); import("system.neon"); -import("DuplicateScanner_lib"); +import("DuplicateMerge_lib"); -let targetContactId = vars.get("$param.DuplicateCurrentContactId_param"); +if(vars.get("$sys.selection").length == 1) +{ +let targetContactId = vars.get("$param.Id_param"); let sourceContactId = vars.get("$sys.selection")[0]; //todo the actual merge ought to happen in a separate view where the contact infos can be merged manually by the user. -let mergeSuccess = DuplicateScannerUtils.mergeOrganisation(sourceContactId, targetContactId); +let mergeSuccess = DuplicateMergeUtils.mergeOrganisation(sourceContactId, targetContactId); if(mergeSuccess) { let currentContactId = EmployeeUtils.getCurrentContactId(); if(currentContactId == null) currentContactId = ""; - DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Organisation"); + DuplicateMergeUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Organisation"); //neon.refresh() with no fields will refresh the current image (and all sub images) but NOT the preview. neon.refreshAll() would refresh both, //why it would lead to an error because it's trying to load the already opened preview of the duplicateContact which just got deleted //and does not exist any more which results in an exception neon.refresh(); -} \ No newline at end of file +} +} +else +{ + question.showMessage(translate.text("Please select only one element")); +} diff --git a/entity/DuplicateOrganisation_entity/entityfields/id_param/valueProcess.js b/entity/DuplicateOrganisation_entity/entityfields/id_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..bffe18eb097c82b9fa662880ad23d5d1ee32f7ff --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/id_param/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("system.vars"); + +var jsonObj = JSON.parse(vars.get("$param.Obj_param")); +result.string(jsonObj["CONTACTID"]); diff --git a/entity/DuplicateOrganisation_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js b/entity/DuplicateOrganisation_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..43e8d27c6a6cdd11f092f8b404a97dc237577a38 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.contactStatus()); diff --git a/entity/DuplicateOrganisation_entity/entityfields/keywordorganisationtypes/children/containername_param/valueProcess.js b/entity/DuplicateOrganisation_entity/entityfields/keywordorganisationtypes/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9f418ef99a76f73e9ce0e06b98eb299c5431d63c --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/keywordorganisationtypes/children/containername_param/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.organisationType()); diff --git a/entity/DuplicateOrganisation_entity/entityfields/picture/displayValueProcess.js b/entity/DuplicateOrganisation_entity/entityfields/picture/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..aa69acba15ba5aa0635f9e0a4a391a04c5819c2f --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/picture/displayValueProcess.js @@ -0,0 +1,11 @@ +import("system.result"); +import("system.vars"); + +if (vars.get("$field.PICTURE")) +{ + result.string(vars.get("$field.PICTURE")); +} +else +{ + result.string("TEXT:" + vars.getString("$field.ORGNAME.displayValue").trim()); +} diff --git a/entity/DuplicateOrganisation_entity/entityfields/targetcontext/valueProcess.js b/entity/DuplicateOrganisation_entity/entityfields/targetcontext/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..84e4b61c2566393178456e74db7e36eb6abdaf80 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/entityfields/targetcontext/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getContextName("Organisation")); diff --git a/entity/DuplicateOrganisation_entity/initFilterProcess.js b/entity/DuplicateOrganisation_entity/initFilterProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..92797e84dbb193011bf821bb4ecc828681a2d414 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/initFilterProcess.js @@ -0,0 +1,15 @@ +import("system.translate"); +import("system.result"); + +result.string(JSON.stringify({ + type: "group", + operator: "AND", + childs: [{ + type: "row", + name: "DUPLICATE", + operator: "EQUAL", + contenttype: "BOOLEAN", + key: "1", + value: translate.text("Yes") + }] +})); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/conditionProcess.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e53fabe5b3f46c2048bdb6500df6f37ca9300d61 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,8 @@ +import("system.vars"); +import("Sql_lib"); +import("DuplicateScanner_lib"); +import("system.result"); + +var duplicateIds = DuplicateScannerUtils.getDuplicateIdsByEntityObj("Organisation_entity", JSON.parse(vars.get("$param.Obj_param"))); +duplicateIds.push("-"); // workaround empty arrays +result.string(newWhere("CONTACT.CONTACTID", duplicateIds, SqlBuilder.IN()).toString()); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/fromClauseProcess.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..5412501fe024b394c16299840fb75b9997368d1f --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,14 @@ +import("Sql_lib"); +import("system.vars"); +import("system.result"); + +var unrelatedCondition = newWhere("UNRELATEDDUPLICATES.DUPLICATETYPE", "Organisation_entity") + .and("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", vars.get("$param.Id_param")) + .and("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID = CONTACT.CONTACTID"); + +result.string( + "ORGANISATION " + + "join CONTACT on (ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID) " + + "left join ADDRESS on (ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID) " + + "left join UNRELATEDDUPLICATES on " + unrelatedCondition.toString() +); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..8f7063b2ac8e637e6618ccc1ff745653daf0b339 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js @@ -0,0 +1,7 @@ +import("system.result"); +import("Sql_lib"); + +var statement = SqlBuilder.caseStatement() + .when("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID is not null") + .thenString("0").elseString("1"); +result.string(statement); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..5827c59c416c332ba9281a60756f919fcb75c0a2 --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Communication_lib"); + +result.string(CommUtil.getStandardSubSqlMail()); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..0f438c2535b21180c5ad03637de90f577f2c736e --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Communication_lib"); + +result.string(CommUtil.getStandardSubSqlPhone()); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..b63b2d57742bc29e8f35acd8bae539ec0a560c9c --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contactStatus(), "CONTACT.STATUS"); +result.string(sql); diff --git a/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..7ab8eb06526a4f6be6502246408fe7891c4dc46d --- /dev/null +++ b/entity/DuplicateOrganisation_entity/recordcontainers/db/recordfieldmappings/type.displayvalue/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.organisationType(), "ORGANISATION.KIND"); +result.string(sql); diff --git a/entity/DuplicatePerson_entity/DuplicatePerson_entity.aod b/entity/DuplicatePerson_entity/DuplicatePerson_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..2d5dd73d048c99ae42a4b422275198df818f39d1 --- /dev/null +++ b/entity/DuplicatePerson_entity/DuplicatePerson_entity.aod @@ -0,0 +1,270 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>DuplicatePerson_entity</name> + <title>Duplicate</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <grantCreate v="false" /> + <grantUpdate v="false" /> + <grantDelete v="false" /> + <initFilterProcess>%aditoprj%/entity/DuplicatePerson_entity/initFilterProcess.js</initFilterProcess> + <titlePlural>Duplicates</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + <targetContextField>parentContext</targetContextField> + <targetIdField>CONTACTID</targetIdField> + <dependencies> + <entityDependency> + <name>7f8210c4-644f-4c45-a571-e232582f8d34</name> + <entityName>Person_entity</entityName> + <fieldName>Duplicates</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>fd3253c7-f3f8-483f-8f49-6192f4e75979</name> + <entityName>Person_entity</entityName> + <fieldName>Duplicates</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityParameter> + <name>Obj_param</name> + <expose v="true" /> + <mandatory v="true" /> + <description>Contains a name value object of all variables that can be used to scan for duplicates</description> + </entityParameter> + <entityActionGroup> + <name>filterActions</name> + <children> + <entityActionField> + <name>ignoreDuplicates</name> + <title>${IGNORE_DUPLICATE}</title> + <onActionProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + <isSelectionAction v="true" /> + <iconId>VAADIN:CLOSE</iconId> + <titleProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js</titleProcess> + </entityActionField> + <entityActionField> + <name>mergeselectedintocurrent</name> + <title>Integrate selected into current contact</title> + <onActionProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js</onActionProcess> + <isSelectionAction v="true" /> + <iconId>NEON:IMPORT</iconId> + </entityActionField> + <entityActionField> + <name>mergecurrentintoselected</name> + <title>Integrate current into selected contact</title> + <onActionProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js</onActionProcess> + <isSelectionAction v="true" /> + <iconId>NEON:EXPORT</iconId> + </entityActionField> + </children> + </entityActionGroup> + <entityField> + <name>CONTACTID</name> + <linkedContext>Person</linkedContext> + </entityField> + <entityParameter> + <name>Id_param</name> + <valueProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/id_param/valueProcess.js</valueProcess> + <mandatory v="true" /> + </entityParameter> + <entityField> + <name>FIRSTNAME</name> + <title>Firstname</title> + </entityField> + <entityField> + <name>LASTNAME</name> + <title>Lastname</title> + <linkedContext>Person</linkedContext> + </entityField> + <entityField> + <name>MIDDLENAME</name> + <title>Middlename</title> + </entityField> + <entityField> + <name>LETTERSALUTATION</name> + <title>Salutation</title> + </entityField> + <entityField> + <name>TITLE</name> + <title>Title</title> + </entityField> + <entityField> + <name>PICTURE</name> + <title>Picture</title> + <contentType>IMAGE</contentType> + <displayValueProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/picture/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>STANDARD_EMAIL_COMMUNICATION</name> + <title>E-Mail</title> + </entityField> + <entityField> + <name>STANDARD_PHONE_COMMUNICATION</name> + <title>Phone</title> + </entityField> + <entityField> + <name>ORGANISATION_ID</name> + <title>Company</title> + <consumer>Organisations</consumer> + <linkedContext>Organisation</linkedContext> + </entityField> + <entityConsumer> + <name>Organisations</name> + <dependency> + <name>dependency</name> + <entityName>Organisation_entity</entityName> + <fieldName>Organisations</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>STATUS</name> + <title>Status</title> + <consumer>KeywordContactStates</consumer> + </entityField> + <entityConsumer> + <name>KeywordContactStates</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>STANDARD_ADDRESS</name> + <title>Address</title> + </entityField> + <entityField> + <name>parentContext</name> + <valueProcess>%aditoprj%/entity/DuplicatePerson_entity/entityfields/parentcontext/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DUPLICATE</name> + <title>Duplicate</title> + <contentType>BOOLEAN</contentType> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <isReadOnly v="true" /> + <fromClauseProcess>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>CONTACTID.value</name> + <recordfield>CONTACT.CONTACTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MIDDLENAME.value</name> + <recordfield>PERSON.MIDDLENAME</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>LASTNAME.value</name> + <recordfield>CONTACT.CONTACTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>FIRSTNAME.value</name> + <recordfield>PERSON.FIRSTNAME</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>LETTERSALUTATION.value</name> + <recordfield>PERSON.SALUTATION</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>LASTNAME.displayValue</name> + <recordfield>PERSON.LASTNAME</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TITLE.value</name> + <recordfield>PERSON.TITLE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PICTURE.value</name> + <recordfield>PERSON.PICTURE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_PHONE_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_EMAIL_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGANISATION_ID.value</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>CONTACT.STATUS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STANDARD_ADDRESS.value</name> + <recordfield>ADDRESS.ADDRESS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGANISATION_ID.displayValue</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DUPLICATE.value</name> + <expression>%aditoprj%/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>93f86a28-8c69-491e-8f62-79f5840e23a5</name> + <tableName>PERSON</tableName> + <primaryKey>PERSONID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>c989f19d-d211-4f54-9ea5-ddf16e5a13a0</name> + <tableName>CONTACT</tableName> + <primaryKey>CONTACTID</primaryKey> + <isUIDTable v="true" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>7ff69154-f1ff-4e33-8cd4-5a88e3b18269</name> + <tableName>ADDRESS</tableName> + <primaryKey>ADDRESSID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js b/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..69c03d7bc979275e8276e8bc9700787e0e513f13 --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/onActionProcess.js @@ -0,0 +1,7 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateIgnored("Person_entity", vars.get("$param.Id_param"), vars.get("$sys.selection"), parseInt(vars.get("$field.DUPLICATE"))); +neon.refreshAll(); // Update the rows, because UNRELATEDDUPLICATES wont trigger a refresh even with write entities diff --git a/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js b/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4c5ccfffeb0e7b5efc940eba237fbdc99ab9b603 --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/filteractions/children/ignoreduplicates/titleProcess.js @@ -0,0 +1,9 @@ +import("system.translate"); +import("system.vars"); +import("system.result"); + +result.string( + parseInt(vars.get("$field.DUPLICATE")) ? + translate.text("${IGNORE_DUPLICATE}") : + translate.text("${UNIGNORE_DUPLICATE}") +); diff --git a/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js b/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js similarity index 60% rename from entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js rename to entity/DuplicatePerson_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js index d5f864db525910dd0635ee2ab84279e3346599b6..8e96e7fcea38ebc093da5fceaaa9ad34a9a5c7a9 100644 --- a/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js +++ b/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergecurrentintoselected/onActionProcess.js @@ -1,14 +1,18 @@ +import("system.translate"); +import("system.question"); import("system.tools"); import("Employee_lib"); import("system.vars"); import("system.neon"); -import("DuplicateScanner_lib"); +import("DuplicateMerge_lib"); -var sourceContactId = vars.get("$param.DuplicateCurrentContactId_param"); +if(vars.get("$sys.selection").length == 1) +{ +var sourceContactId = vars.get("$param.Id_param"); var targetContactId = vars.get("$sys.selection")[0]; //todo the actual merge ought to happen in a separate view where the contact infos can be merged manually by the user. -var mergeSuccess = DuplicateScannerUtils.mergePerson(sourceContactId, targetContactId); +var mergeSuccess = DuplicateMergeUtils.mergePerson(sourceContactId, targetContactId); if(mergeSuccess) { @@ -21,7 +25,12 @@ if(mergeSuccess) var currentContactId = EmployeeUtils.getCurrentContactId(); if(currentContactId == null) currentContactId = ""; - DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Person"); + DuplicateMergeUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Person"); neon.openContext("Person", "PersonMain_view", [targetContactId], neon.OPERATINGSTATE_VIEW, null) -} \ No newline at end of file +} +} +else +{ + question.showMessage(translate.text("Please select only one element")); +} diff --git a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js b/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js similarity index 70% rename from entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js rename to entity/DuplicatePerson_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js index 6a9f2ac39a7238d7dd5fbaec53e41c57eabec241..30d97b1c8023db93074e3cee7b3f30487e920aad 100644 --- a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js +++ b/entity/DuplicatePerson_entity/entityfields/filteractions/children/mergeselectedintocurrent/onActionProcess.js @@ -1,3 +1,5 @@ +import("system.translate"); +import("system.question"); import("system.tools"); import("system.db"); import("Employee_lib"); @@ -5,14 +7,16 @@ import("KeywordRegistry_basic"); import("ActivityTask_lib"); import("system.vars"); import("system.neon"); -import("DuplicateScanner_lib"); +import("DuplicateMerge_lib"); -var targetContactId = vars.get("$param.DuplicateCurrentContactId_param"); +if(vars.get("$sys.selection").length == 1) +{ +var targetContactId = vars.get("$param.Id_param"); var sourceContactIdArray = vars.get("$sys.selection"); var sourceContactId = sourceContactIdArray[0]; //todo the actual merge ought to happen in a separate view where the contact infos can be merged manually by the user. -var mergeSuccess = DuplicateScannerUtils.mergePerson(sourceContactId, targetContactId); +var mergeSuccess = DuplicateMergeUtils.mergePerson(sourceContactId, targetContactId); if(mergeSuccess) { @@ -25,9 +29,14 @@ if(mergeSuccess) var currentContactId = EmployeeUtils.getCurrentContactId(); if(currentContactId == null) currentContactId = ""; - DuplicateScannerUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Person"); + DuplicateMergeUtils.createMergeSuccessActivity(sourceContactId, targetContactId, currentContactId, "Person"); //neon.refresh() with no fields will refresh the current image (and all sub images) but NOT the preview. neon.refreshAll() would refresh both, //why it would lead to an error because it's trying to load the already opened preview of the duplicateContact which just got deleted //and does not exist any more which results in an exception neon.refresh(); -} \ No newline at end of file +} +} +else +{ + question.showMessage(translate.text("Please select only one element")); +} diff --git a/entity/DuplicatePerson_entity/entityfields/id_param/valueProcess.js b/entity/DuplicatePerson_entity/entityfields/id_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..bffe18eb097c82b9fa662880ad23d5d1ee32f7ff --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/id_param/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("system.vars"); + +var jsonObj = JSON.parse(vars.get("$param.Obj_param")); +result.string(jsonObj["CONTACTID"]); diff --git a/entity/DuplicatePerson_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js b/entity/DuplicatePerson_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..43e8d27c6a6cdd11f092f8b404a97dc237577a38 --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.contactStatus()); diff --git a/entity/DuplicatePerson_entity/entityfields/parentcontext/valueProcess.js b/entity/DuplicatePerson_entity/entityfields/parentcontext/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f7baa76a6be6f585b2829869961b69b1ca4a5e15 --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/parentcontext/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getContextName("Person")); diff --git a/entity/DuplicatePerson_entity/entityfields/picture/displayValueProcess.js b/entity/DuplicatePerson_entity/entityfields/picture/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e09fa2ae490ce0756966fd490af0150cc05e726f --- /dev/null +++ b/entity/DuplicatePerson_entity/entityfields/picture/displayValueProcess.js @@ -0,0 +1,11 @@ +import("system.result"); +import("system.vars"); + +if (vars.get("$field.PICTURE")) +{ + result.string(vars.get("$field.PICTURE")); +} +else +{ + result.string("TEXT:" + (vars.getString("$field.FIRSTNAME") + " " + vars.getString("$field.LASTNAME")).trim()); +} diff --git a/entity/DuplicatePerson_entity/initFilterProcess.js b/entity/DuplicatePerson_entity/initFilterProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..92797e84dbb193011bf821bb4ecc828681a2d414 --- /dev/null +++ b/entity/DuplicatePerson_entity/initFilterProcess.js @@ -0,0 +1,15 @@ +import("system.translate"); +import("system.result"); + +result.string(JSON.stringify({ + type: "group", + operator: "AND", + childs: [{ + type: "row", + name: "DUPLICATE", + operator: "EQUAL", + contenttype: "BOOLEAN", + key: "1", + value: translate.text("Yes") + }] +})); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/conditionProcess.js b/entity/DuplicatePerson_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..658b1af578f9b7fb2d68728d73cef7393c3a7740 --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,8 @@ +import("system.vars"); +import("Sql_lib"); +import("DuplicateScanner_lib"); +import("system.result"); + +var duplicateIds = DuplicateScannerUtils.getDuplicateIdsByEntityObj("Person_entity", JSON.parse(vars.get("$param.Obj_param"))); +duplicateIds.push("-"); // workaround empty arrays +result.string(newWhere("CONTACT.CONTACTID", duplicateIds, SqlBuilder.IN()).toString()); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/fromClauseProcess.js b/entity/DuplicatePerson_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2205f0c5af7cbe0439abdf3017bae42b6e9be2cd --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,14 @@ +import("Sql_lib"); +import("system.vars"); +import("system.result"); + +var unrelatedCondition = newWhere("UNRELATEDDUPLICATES.DUPLICATETYPE", "Person_entity") + .and("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", vars.get("$param.Id_param")) + .and("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID = CONTACT.CONTACTID"); + +result.string( + "PERSON " + + "join CONTACT on (PERSON.PERSONID = CONTACT.PERSON_ID) " + + "left join ADDRESS on (ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID) " + + "left join UNRELATEDDUPLICATES on " + unrelatedCondition.toString() +); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..8f7063b2ac8e637e6618ccc1ff745653daf0b339 --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/duplicate.value/expression.js @@ -0,0 +1,7 @@ +import("system.result"); +import("Sql_lib"); + +var statement = SqlBuilder.caseStatement() + .when("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID is not null") + .thenString("0").elseString("1"); +result.string(statement); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.displayvalue/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..64f71be666b2bbb3421d182e2fe8b25d989a3316 --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("Sql_lib"); +import("system.result"); + +result.string(newSelect("ORGANISATION.NAME").from("ORGANISATION") + .where("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").toString()); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.value/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..e37273248e57bcb47a83af87693aa9cca2ed5636 --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/organisation_id.value/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Sql_lib"); + +result.string(newSelect("c.CONTACTID").from("CONTACT as c") + .where("c.ORGANISATION_ID = CONTACT.ORGANISATION_ID") + .and("c.PERSON_ID is null").toString()); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..5827c59c416c332ba9281a60756f919fcb75c0a2 --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Communication_lib"); + +result.string(CommUtil.getStandardSubSqlMail()); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..0f438c2535b21180c5ad03637de90f577f2c736e --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Communication_lib"); + +result.string(CommUtil.getStandardSubSqlPhone()); diff --git a/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..50433a35e5f298cf550485a4d9ea33ac405a6ebd --- /dev/null +++ b/entity/DuplicatePerson_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.contactStatus(), "CONTACT.STATUS")); diff --git a/entity/DuplicateScannerResultFieldConfig_entity/DuplicateScannerResultFieldConfig_entity.aod b/entity/DuplicateScannerResultFieldConfig_entity/DuplicateScannerResultFieldConfig_entity.aod deleted file mode 100644 index b336a59f809d6d5834741fc16f8a6034815597b2..0000000000000000000000000000000000000000 --- a/entity/DuplicateScannerResultFieldConfig_entity/DuplicateScannerResultFieldConfig_entity.aod +++ /dev/null @@ -1,104 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> - <name>DuplicateScannerResultFieldConfig_entity</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <recordContainer>recordContainer</recordContainer> - <entityFields> - <entityProvider> - <name>#PROVIDER</name> - </entityProvider> - <entityField> - <name>UID</name> - </entityField> - <entityField> - <name>ENTITY_FIELD_NAME</name> - <title>Entity field name</title> - </entityField> - <entityField> - <name>DATE_EDIT</name> - <valueProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_edit/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>DATE_NEW</name> - <valueProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_new/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>USER_NEW</name> - <valueProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_new/valueProcess.js</valueProcess> - </entityField> - <entityField> - <name>USER_EDIT</name> - <valueProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_edit/valueProcess.js</valueProcess> - </entityField> - <entityParameter> - <name>DuplicateScannerId_param</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityProvider> - <name>ScannerResultFieldConfigProvider</name> - <dependencies> - <entityDependency> - <name>119b48a5-ce78-4169-bd31-76e524cece99</name> - <entityName>DuplicateScanner_entity</entityName> - <fieldName>ScannerResultFieldsConfig_Consumer</fieldName> - <isConsumer v="false" /> - </entityDependency> - </dependencies> - </entityProvider> - <entityField> - <name>DUPLICATESCANNER_ID</name> - <valueProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/entityfields/duplicatescanner_id/valueProcess.js</valueProcess> - </entityField> - <entityProvider> - <name>#PROVIDER_AGGREGATES</name> - <useAggregates v="true" /> - </entityProvider> - </entityFields> - <recordContainers> - <dbRecordContainer> - <name>recordContainer</name> - <conditionProcess>%aditoprj%/entity/DuplicateScannerResultFieldConfig_entity/recordcontainers/recordcontainer/conditionProcess.js</conditionProcess> - <alias>Data_alias</alias> - <recordFieldMappings> - <dbRecordFieldMapping> - <name>DATE_EDIT.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.DATE_EDIT</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>DATE_NEW.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.DATE_NEW</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>ENTITY_FIELD_NAME.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.ENTITY_FIELD_NAME</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>UID.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.ID</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>USER_EDIT.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.USER_EDIT</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>USER_NEW.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.USER_NEW</recordfield> - </dbRecordFieldMapping> - <dbRecordFieldMapping> - <name>DUPLICATESCANNER_ID.value</name> - <recordfield>DUPLICATESCANNERRESULTFIELDCONFIG.DUPLICATESCANNER_ID</recordfield> - </dbRecordFieldMapping> - </recordFieldMappings> - <linkInformation> - <linkInformation> - <name>f7126f94-9e4c-46a0-8dc9-9e52fda1c7c0</name> - <tableName>DUPLICATESCANNERRESULTFIELDCONFIG</tableName> - <primaryKey>ID</primaryKey> - <isUIDTable v="false" /> - <readonly v="false" /> - </linkInformation> - </linkInformation> - </dbRecordContainer> - </recordContainers> -</entity> diff --git a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/duplicatescanner_id/valueProcess.js b/entity/DuplicateScannerResultFieldConfig_entity/entityfields/duplicatescanner_id/valueProcess.js deleted file mode 100644 index b8c682ad670116ff553d3774001f92eeec9478ce..0000000000000000000000000000000000000000 --- a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/duplicatescanner_id/valueProcess.js +++ /dev/null @@ -1,7 +0,0 @@ -import("system.result"); -import("system.vars"); - -if(vars.get("$this.value") == null || vars.get("$this.value") == "") -{ - result.string(vars.get("$param.DuplicateScannerId_param")); -} \ No newline at end of file diff --git a/entity/DuplicateScannerResultFieldConfig_entity/recordcontainers/recordcontainer/conditionProcess.js b/entity/DuplicateScannerResultFieldConfig_entity/recordcontainers/recordcontainer/conditionProcess.js deleted file mode 100644 index b9bff609c91222abb6c3b0292492600907585487..0000000000000000000000000000000000000000 --- a/entity/DuplicateScannerResultFieldConfig_entity/recordcontainers/recordcontainer/conditionProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.vars"); -import("system.result"); - -if (vars.get("$param.DuplicateScannerId_param")) - result.string(newWhere("DUPLICATESCANNERRESULTFIELDCONFIG.DUPLICATESCANNER_ID", "$param.DuplicateScannerId_param").toString()); \ No newline at end of file diff --git a/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod b/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod index 34fb0577dfe0c9ee42cc2f58458267359bd8f094..220ca8da86b7ff352ba94fa259602a9f004e9585 100644 --- a/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod +++ b/entity/DuplicateScanner_entity/DuplicateScanner_entity.aod @@ -33,16 +33,6 @@ <contentType>BOOLEAN</contentType> <valueProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/external_service_usage_allowed/valueProcess.js</valueProcess> </entityField> - <entityActionGroup> - <name>TestActionGroup</name> - <children> - <entityActionField> - <name>TestDuplicateScanner</name> - <title>Test DuplicateSearch</title> - <onActionProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/testactiongroup/children/testduplicatescanner/onActionProcess.js</onActionProcess> - </entityActionField> - </children> - </entityActionGroup> <entityField> <name>USER_NEW</name> <valueProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/user_new/valueProcess.js</valueProcess> @@ -71,40 +61,36 @@ <state>AUTO</state> <stateProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/scan_pattern/stateProcess.js</stateProcess> </entityField> - <entityConsumer> - <name>ScannerResultFieldsConfig_Consumer</name> - <dependency> - <name>dependency</name> - <entityName>DuplicateScannerResultFieldConfig_entity</entityName> - <fieldName>ScannerResultFieldConfigProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>DuplicateScannerId_param</name> - <valueProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/scannerresultfieldsconfig_consumer/children/duplicatescannerid_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> <entityActionGroup> - <name>RunActionGroup</name> - <documentation>%aditoprj%/entity/DuplicateScanner_entity/entityfields/runactiongroup/documentation.adoc</documentation> + <name>FilterActions</name> <children> <entityActionField> - <name>RebuildPersonDuplicatesCache</name> - <title>Rebuild Person duplicates cache</title> - <onActionProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildpersonduplicatescache/onActionProcess.js</onActionProcess> + <name>rebuild</name> + <title>Rebuild selected entries</title> + <onActionProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/filteractions/children/rebuild/onActionProcess.js</onActionProcess> + <isObjectAction v="false" /> + <isSelectionAction v="true" /> + <iconId>VAADIN:CALC</iconId> + <tooltip>Rebuild all duplicates from the selected scanners</tooltip> </entityActionField> <entityActionField> - <name>RebuildOrganisationDuplicatesCache</name> - <title>Rebuild Organisation duplicates cache</title> - <onActionProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildorganisationduplicatescache/onActionProcess.js</onActionProcess> + <name>viewDuplicates</name> + <title>View duplicates</title> + <onActionProcess>%aditoprj%/entity/DuplicateScanner_entity/entityfields/filteractions/children/viewduplicates/onActionProcess.js</onActionProcess> + <isSelectionAction v="true" /> + <iconId>VAADIN:TABLE</iconId> + <tooltip>View all duplicates from this scanner</tooltip> </entityActionField> </children> </entityActionGroup> - <entityProvider> - <name>#PROVIDER_AGGREGATES</name> - <useAggregates v="true" /> - </entityProvider> + <entityField> + <name>DUPLICATECOUNT</name> + <title>Count</title> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -154,6 +140,11 @@ <name>SCAN_PATTERN.value</name> <recordfield>DUPLICATESCANNER.SCAN_PATTERN</recordfield> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DUPLICATECOUNT.value</name> + <expression>%aditoprj%/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/recordfieldmappings/duplicatecount.value/expression.js</expression> + <isFilterable v="true" /> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> diff --git a/entity/DuplicateScanner_entity/entityfields/filteractions/children/rebuild/onActionProcess.js b/entity/DuplicateScanner_entity/entityfields/filteractions/children/rebuild/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..fc6ae65d2d318b7ba951ae069442ed54db022857 --- /dev/null +++ b/entity/DuplicateScanner_entity/entityfields/filteractions/children/rebuild/onActionProcess.js @@ -0,0 +1,34 @@ +import("system.process"); +import("system.logging"); +import("system.entities"); +import("system.vars"); +import("DuplicateScanner_lib"); + +var selectedIds = vars.get("$sys.selection"); +var loadConfig = entities.createConfigForLoadingRows() + .entity("DuplicateScanner_entity") + .uids(selectedIds) + .fields(["FILTER_NAME", "ENTITY_TO_SCAN_NAME", "ID_FIELD_NAME", "SCAN_PATTERN"]); +var selectedEntries = entities.getRows(loadConfig); +logging.log("Rebuilding " + selectedEntries.length + " entries"); + +selectedEntries.forEach(function(currEntry) +{ + var filterName = currEntry["FILTER_NAME"]; + var targetEntity = currEntry["ENTITY_TO_SCAN_NAME"]; + var targetIdField = currEntry["ID_FIELD_NAME"]; + var filter = JSON.parse(currEntry["SCAN_PATTERN"]); + + var startConfig = process.createStartAsyncConfig() + .setName("rebuildDuplicates_serverProcess") + .setShowErrorDialog(true) + .setLocalVariables({ + filterName: filterName, + targetEntity: targetEntity, + targetIdField: targetIdField, + filter: JSON.stringify(filter.filter) + }) + .setUser(vars.get("$sys.user")) + .setTimerType(process.TIMERTYPE_SERVER); + process.startAsync(startConfig); +}); diff --git a/entity/DuplicateScanner_entity/entityfields/filteractions/children/viewduplicates/onActionProcess.js b/entity/DuplicateScanner_entity/entityfields/filteractions/children/viewduplicates/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..064e1f6c17fd9f84dc46723d329baf5a181ddc6d --- /dev/null +++ b/entity/DuplicateScanner_entity/entityfields/filteractions/children/viewduplicates/onActionProcess.js @@ -0,0 +1,35 @@ +import("system.translate"); +import("system.question"); +import("system.vars"); +import("system.neon"); +import("system.entities"); +import("Context_lib"); + +if(vars.get("$sys.selection").length == 1) +{ + var config = entities.createConfigForLoadingRows() + .entity("DuplicateScanner_entity") + .uid(vars.get("$sys.selection")[0]) + .fields(["ENTITY_TO_SCAN_NAME"]); + var scanner = entities.getRow(config); + var contextId = ContextUtils.getContextName(ContextUtils.getContextId(scanner["ENTITY_TO_SCAN_NAME"])); + + neon.openContext(contextId, null, null, neon.OPERATINGSTATE_SEARCH, { + FilterPreSet_param: JSON.stringify({ + type: "group", + operator: "AND", + childs: [{ + type: "row", + name: "#EXTENSION.Duplicates_filter.Duplicates_filter#NUMBER", + operator: "GREATER", + value: "All Duplicates", + key: "0", + contenttype: "NUMBER" + }] + }) + }); +} +else +{ + question.showMessage(translate.text("Please select only one element")); +} diff --git a/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildorganisationduplicatescache/onActionProcess.js b/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildorganisationduplicatescache/onActionProcess.js deleted file mode 100644 index e391b4c1938da96eddca596f8fb2211dd3d681ab..0000000000000000000000000000000000000000 --- a/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildorganisationduplicatescache/onActionProcess.js +++ /dev/null @@ -1,18 +0,0 @@ -import("system.logging"); -import("system.logging"); -import("DuplicateScanner_lib"); - -var filterName = "OrganisationDuplicates"; -var targetEntity = "Organisation_entity"; -var recordBlockSize = DuplicateScannerUtils.getBlockSize(); - -logging.log(filterName + ": Delete duplicates -> "); -DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); - -logging.log(filterName + ": Recalculate duplicates -> "); -DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, recordBlockSize, null); - -logging.log(filterName + ": Refresh unrelated duplicates -> "); -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -logging.log(filterName + ": Done rebuilding "); \ No newline at end of file diff --git a/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildpersonduplicatescache/onActionProcess.js b/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildpersonduplicatescache/onActionProcess.js deleted file mode 100644 index cad8736382338846edff77ef164f85488513731d..0000000000000000000000000000000000000000 --- a/entity/DuplicateScanner_entity/entityfields/runactiongroup/children/rebuildpersonduplicatescache/onActionProcess.js +++ /dev/null @@ -1,18 +0,0 @@ -import("system.project"); -import("system.logging"); -import("DuplicateScanner_lib"); - -var filterName = "PersonDuplicates"; -var targetEntity = "Person_entity"; -var recordBlockSize = DuplicateScannerUtils.getBlockSize(); - -logging.log(filterName + ": Delete duplicates -> "); -DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); - -logging.log(filterName + ": Recalculate duplicates -> "); -DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, recordBlockSize, null); - -logging.log(filterName + ": Refresh unrelated duplicates -> "); -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -logging.log(filterName + ": Done rebuilding "); \ No newline at end of file diff --git a/entity/DuplicateScanner_entity/entityfields/runactiongroup/documentation.adoc b/entity/DuplicateScanner_entity/entityfields/runactiongroup/documentation.adoc deleted file mode 100644 index f998dfcc78c6497f121cd16b294c8d01e6e1c1c7..0000000000000000000000000000000000000000 --- a/entity/DuplicateScanner_entity/entityfields/runactiongroup/documentation.adoc +++ /dev/null @@ -1 +0,0 @@ -Since duplicate caching is disabled there is no need to show this action group within views at the moment. \ No newline at end of file diff --git a/entity/DuplicateScanner_entity/entityfields/testactiongroup/children/testduplicatescanner/onActionProcess.js b/entity/DuplicateScanner_entity/entityfields/testactiongroup/children/testduplicatescanner/onActionProcess.js deleted file mode 100644 index af7cd56a2472c2305bf914b22fc59c89a7ba03a8..0000000000000000000000000000000000000000 --- a/entity/DuplicateScanner_entity/entityfields/testactiongroup/children/testduplicatescanner/onActionProcess.js +++ /dev/null @@ -1,432 +0,0 @@ -import("system.process"); -import("KeywordRegistry_basic"); -import("system.db"); -import("ActivityTask_lib"); -import("Employee_lib"); -import("system.util"); -import("system.notification"); -import("system.notificationtypes"); -import("system.entities"); -import("system.project"); -import("system.indexsearch"); -import("system.question"); -import("system.logging"); -import("DuplicateScanner_lib"); -import("JditoFilter_lib"); - -//let testFields = []; -//let filters = DuplicateScannerUtils.loadFilters("PersonDuplicates", "Person_entity") -//logging.log("filters -> " + filters); -// -//for (let i = 0; i < filters.length; i++) -//{ -// logging.log("filters[i] -> " + filters[i]); -// let filter = JSON.parse(filters[i][0]).filter; -// let fields = JditoFilterUtils.getFilterFields(filter.childs); -// testFields = testFields.concat(fields); -//} -//logging.log("testFields -> " + testFields); - - -//##############################Test Duplicate Scan###################################################### - -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -//var resultFieldsIdFieldName = "CONTACTID"; -// -//var tmpFieldsInFilterRay = ["CONTACTID", "FIRSTNAME", "LASTNAME", "GENDER"]; -//var queryPersonContactIds = "select CONTACTID, FIRSTNAME, LASTNAME, GENDER from CONTACT" -// + " join PERSON on PERSONID = PERSON_ID"; -// -// -//var filterFieldValueRays = [["CONTACTID", "29271db0-4253-46c9-b7c2-5e25376b9d19"], ["FIRSTNAME", "Narkus"], ["LASTNAME", "Bltinger"], ["GENDER", "m"]]; -// -////DuplicateScannerUtils.ScanForDuplicatesIndex = function(pFilterName, pTargetEntity, pFilterFieldValueRays, -////pTargetEntityResultFields, pRecordIdFieldToIgnore, pRecordIdValueToIgnore) -// -///* -// * -// */ -// -// -// -//let duplicateFieldsConfig = DuplicateScannerUtils.LoadDuplicateIndexFieldsConfiguration(filterName, targetEntity); -// -//let querySelectFields = ""; -//for (let i = 0; i < duplicateFieldsConfig.length; i++) -//{ -// querySelectFields += duplicateFieldsConfig[i][0]; -// -// if(i < duplicateFieldsConfig.length) -// querySelectFields += ", "; -//} -// -//let queryPersonFieldData = "select " + querySelectFields + " from CONTACT" -// + " join PERSON on PERSONID = PERSON_ID"; -// -//DuplicateScannerUtils.GetEntityFieldNameValueMap(duplicateFieldsConfig); -// -//DuplicateScannerUtils.ScanForDuplicatesIndex(filterName, targetEntity, -//filterFieldValueRays, [], resultFieldsIdFieldName, "29271db0-4253-46c9-b7c2-5e25376b9d19"); - - -//##############################ANs Beispiel###################################################### - - -//logging.log("TEST INDEX API with Entities"); -//logging.log(indexsearch.lookupIndexField("Person_entity", "FIRSTNAME")); -//logging.log(indexsearch.lookupIndexField("Person_entity", "FIRSTNAME.value")); -//logging.log(indexsearch.lookupIndexField("Person_entity", "PersAddresses.CITY")); -//logging.log(indexsearch.lookupIndexField("Person_entity", "PersAddresses.CITY.value")); -//logging.log(indexsearch.lookupIndexField(null, "Person_entity.FIRSTNAME.value")); -//logging.log(indexsearch.lookupIndexField(null, "Person_entity.PersAddresses.CITY.value")); -//var json = '{"entity":"Person_entity","filter":{"type":"group","operator":"AND","childs":[{"type":"row","name":"FIRSTNAME","operator":"STARTSWITH","value":"asd","key":"","contenttype":"TEXT"},{"type":"group","operator":"OR","childs":[{"type":"row","name":"LASTNAME","operator":"STARTSWITH","value":"L","key":"","contenttype":"TEXT"}]}]}}'; -//logging.log(indexsearch.buildQueryFromSearchCondition(json)); -// -//var t1 = indexsearch.createTerm("lisa").setEntityField("Person_entity.FIRSTNAME"); -//var t2 = indexsearch.createTerm("sommer").setEntityField("Person_entity.LASTNAME"); -//var t3 = indexsearch.createWildcardTerm("L").setEntityField("Person_entity.PersAddresses.CITY"); -// -//var patternConf = indexsearch.createPatternConfig().or(t1).or(t2).or(t3); -//var pattern = indexsearch.buildPatternString(patternConf); -//logging.log(pattern); -// -//var query = indexsearch.createIndexQuery() -//.setPattern(pattern) -//.setEntities("Person_entity") -////.addResultIndexFields(indexsearch.FIELD_ID) -//.addResultFields("Person_entity.FIRSTNAME") -//.addSearchFields("Person_entity.FIRSTNAME", "Person_entity.LASTNAME"); -// -//var res = indexsearch.searchIndex(query); -//logging.log("" + res); - - - -//######################################Demosuche nach Datensatz############################################## - - - - -// -//let indexQuery = indexsearch.createIndexQuery() -// .setPattern("(+(-contactid_value:(29271db0-4253-46c9-b7c2-5e25376b9d19)) +gender_value:m*)") -// .setEntities(["Person_entity"]) -// .addResultFields("Person_entity.FIRSTNAME") -// .setRows(50); -// -// -//let filterTerm1 = indexsearch.createTerm("Barkus") -// .setIndexField("firstname_value") -// .setFuzzySearchFactor(0); -////let filterTerm2 = indexsearch.createTerm("Altinger") -//// .setIndexField("lastname_value") -//// .setFuzzySearchFactor(0); -// -//let filterPatternConfig = indexsearch.createPatternConfig().and(filterTerm1); -// -//let filterPatternString = indexsearch.buildPatternString(filterPatternConfig); -//logging.log("Hauptsuche filterPatternString -> " + filterPatternString); -//indexQuery = indexQuery.addFilter(filterPatternString); -// -//let searchResult = indexsearch.searchIndex(indexQuery); -//logging.log("searchResult -> " + searchResult); -// -//logging.log("searchResults hits length -> " + searchResult[indexsearch.HITS].length); -// -//for (let i = 0; i < searchResult[indexsearch.HITS].length; i++) -//{ -// logging.log("Treffer Nr -> " + i); -// //searchResults hits 0 -> {#ADITO_SEARCH_ID=1868bd3a-05af-4b7f-a633-e3aec50ac45c, _index_group_=Person, #ADITO_SEARCH_TYPE=Person, firstname_value=Peter, _local_id_=1868bd3a-05af-4b7f-a633-e3aec50ac45c} -// let localId = searchResult[indexsearch.HITS][i]["_local_id_"]; -// let firstname = searchResult[indexsearch.HITS][i]["firstname_value"]; -// let indexGroup = searchResult[indexsearch.HITS][i]["_index_group_"]; -// logging.log("localId -> " + localId); -// logging.log("firstname -> " + firstname); -// logging.log("indexGroup -> " + indexGroup); -//} - - - - - -//#################################################################################### - - -// -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -//var resultFieldsIdFieldName = "CONTACTID"; -//var queryPersonContactIds = "select CONTACTID, FIRSTNAME, LASTNAME, GENDER from CONTACT" -// + " join PERSON on PERSONID = PERSON_ID"; -//var tmpFieldsInFilterRay = ["CONTACTID", "FIRSTNAME", "LASTNAME", "GENDER"]; -// -//logging.log("Löschen von PERSON Dubletten -> "); -//DuplicateScannerUtils.deleteClustersByTargetEntity("Person_entity"); -// -//logging.log("Neu berechnen von PERSON Dubletten -> "); -//DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, queryPersonContactIds, -//tmpFieldsInFilterRay, resultFieldsIdFieldName); -// -//DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -//############################################################################## - -//filterName = "OrganisationDuplicates"; -//targetEntity = "Organisation_entity"; -//resultFieldsIdFieldName = "CONTACTID"; -//queryPersonContactIds = "select CONTACTID, ORGANISATION.NAME from ORGANISATION" -// + " join CONTACT on CONTACT.CONTACTID = ORGANISATION.ORGANISATIONID" -// + " where CONTACTID != '0'"; -//tmpFieldsInFilterRay = ["CONTACTID", "NAME"]; -// -// -//logging.log("Löschen von ORGANISATION Dubletten -> "); -//DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity) -// -//logging.log("Neu berechnen von ORGANISATION Dubletten -> "); -//DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, queryPersonContactIds, -//tmpFieldsInFilterRay, resultFieldsIdFieldName); -// -//DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - - -//####################################Rebuild person duplicates########################################## - -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -// -//let duplicateFieldsConfig = DuplicateScannerUtils.LoadIndexFieldsConfiguration(filterName, targetEntity); -//let resultFields = DuplicateScannerUtils.getResultFields(filterName, targetEntity); -// -//logging.log("duplicateFieldsConfig -> " + duplicateFieldsConfig); -//logging.log("resultFields -> " + resultFields); -// -//let querySelectFields = DuplicateScannerUtils.BuildSqlSelectFieldsFromFieldConfig(duplicateFieldsConfig); -//logging.log("querySelectFields -> " + querySelectFields); -// -//let queryPersonFieldData = "select " + querySelectFields + " from CONTACT" -// + " join PERSON on PERSONID = PERSON_ID" -// + " left join ADDRESS on ADDRESS.CONTACT_ID = CONTACT.CONTACTID"; -// -//logging.log("Löschen von PERSON Dubletten -> "); -//DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); -// -//let formatToJsonAndCallWsCallback = function(pPossibleDuplicatesRay) -//{ -// let indexResultFields = DuplicateScannerUtils.translateEntityToIndexFields(targetEntity, resultFields) -// -// //Run thru every duplicate result an read out the resultfields -// for (let i = 0; i < pPossibleDuplicatesRay.length; i++) -// { -// for (let b = 0; b < resultFields.length; b++) -// { -// let entityFieldName = resultFields[b]; -// let indexFieldName = indexResultFields[entityFieldName]; -// //logging.log("Entity Field -> "+ pPossibleDuplicatesRay[i][indexFieldName]); -// //format values -// } -// } -// //call webservice -// //reformat results to same structure as before -// return pPossibleDuplicatesRay; -//}; -// -//logging.log("Neu berechnen von PERSON Dubletten -> "); -//DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, queryPersonFieldData, -//duplicateFieldsConfig, resultFields, formatToJsonAndCallWsCallback); -// -//DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - - - - - -//##################################single scanForDuplicates####################################################################### - - -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -// -////Values to check, the same fields as configured -//let valuesToCheck = {}; -//valuesToCheck["CONTACTID"] = "c7ddf982-0e58-4152-b82b-8f5673b0b729"; -//valuesToCheck["FIRSTNAME"] = "Tim"; -//valuesToCheck["GENDER"] = "m "; -// -////The result values can be accessed as seen above in "formatToJsonAndCallWsCallback" -//let pPossibleDuplicatesRay = DuplicateScannerUtils.scanForDuplicates(filterName, targetEntity, valuesToCheck, null); -// -//logging.log(" pPossibleDuplicatesRay-> " + pPossibleDuplicatesRay); -// -//for (let i = 0; i < pPossibleDuplicatesRay.length; i++) -//{ -// logging.log("pPossibleDuplicatesRay[i] -> " + pPossibleDuplicatesRay[i]); -//} -// - - -//################################ entity structure auslesen ############################################## - - -//var model = project.getEntityStructure("Person_entity"); -//logging.log("Name: " + model.name); -//logging.log("Title: " + model.title); -//logging.log("Description: " + model.description); -//logging.log("UsePermissions: " + model.usePermissions); -// -//for (fieldname in model.fields) -//{ -// field = model.fields[fieldname]; -// if(field.fieldType == project.ENTITYFIELDTYPE_FIELD) -// { -// logging.log(" Name: " + field.name); -// logging.log(" Type: " + field.fieldType); -// logging.log(" Title: " + field.title); -// logging.log(" Description: " + field.description); -// logging.log(" UsePermissions: " + field.usePermissions); -// logging.log("###################### -> "); -// } -// if(field.fieldType == project.ENTITYFIELDTYPE_CONSUMER) -// { -// let consumerEntity = field.entityName; -// -// if(consumerEntity == null || consumerEntity == "") -// continue; -// -// let consumerEntityFields = project.getEntityStructure(consumerEntity); -// for (consumerEntityFieldname in consumerEntityFields.fields) -// { -// consumerField = consumerEntityFields.fields[consumerEntityFieldname]; -// if(consumerField.fieldType == project.ENTITYFIELDTYPE_FIELD) -// { -// logging.log(" Name: " + consumerField.name); -// logging.log(" Type: " + consumerField.fieldType); -// logging.log(" Title: " + consumerField.title); -// logging.log(" Description: " + consumerField.description); -// logging.log(" UsePermissions: " + consumerField.usePermissions); -// logging.log("###################### -> "); -// } -// } -// } -//} - -//############################################################################## - -//var model = project.getEntityStructure("Person_entity"); -//let duplicateFieldsConfig = DuplicateScannerUtils.LoadIndexFieldsConfiguration(filterName, targetEntity); -// -//let combinedData = [] -//let entityFieldsToLoad = []; -//for (field in duplicateFieldsConfig) -//{ -// let entityFieldName = duplicateFieldsConfig[field][0]; -// let isIdField = duplicateFieldsConfig[field][1]; -// let useForIndexSearch = duplicateFieldsConfig[field][2]; -// let entityFieldData = model[entiyFieldName]; -// combinedData.push(entityFieldName, isIdField, useForIndexSearch, entityFieldData); -//} -// -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -//DuplicateScannerUtils.getEntityRecords(targetEntity, entityFieldsToLoad, 0, 50); - -//Beispiel 1: -//Feld mit verknüpftem Consumer - -//[entity, feldname, consumerName, ProviderName] -//let test = ["Communication_entity", "STANDARD_EMAIL_COMMUNICATION", "EmailCommunications", "EmailCommunications"]; -// -//let testrow = entities.createConfigForLoadingRows() -// .fields([test[1]]) -// .entity(test[0]) -// .provider(test[3]) -// .addParameter("ContactId_param", "d4c1bec3-656f-45ec-ae03-1c4d729d99fe") -// //.uid() -//let resultTest = entities.getRows(testrow); -//logging.log("resultTest -> " + JSON.stringify(resultTest)); - - - -//Beispiel 2: -//Feld direkt von anderem Entity -//let testrow = entities.createConfigForLoadingRows() -// .fields(["ZIP"]) -// .entity("Address_entity") -// .uid("1a67eaa7-21da-4a18-97ab-755ac5cb74f7") -// -//let resultTest = entities.getRows(testrow); -//logging.log("resultTest Beispiel 2 -> " + JSON.stringify(resultTest)); - - -//indexsearch.runIndexer(["Person"]); - - - - -//let resultClusterId = DuplicateScannerUtils.GetClusterWithDuplicates(["7a34d9d0-04c7-478c-a8e2-f584fe625c45", "c7ddf982-0e58-4152-b82b-8f5673b0b729"]); -//logging.log("resultClusterId -> " + resultClusterId); - - -// -//var filterName = "PersonDuplicates"; -//var targetEntity = "Person_entity"; -//var recordBlockSize = DuplicateScannerUtils.GetBlockSizeForScanner(filterName, targetEntity); -// -//logging.log("recordBlockSize -> " + recordBlockSize); - -//try -//{ -// let sourceContactId = "sourceContactId"; -// let targetContactId = "targetContactId"; -// -// var activityDataForInsert = { -// subject: "Es wurde ein Personendatensatz in diesen integriert", -// content: "Person mit ID " + sourceContactId + " wurde in Person mit ID " + targetContactId + " integriert", -// //categoryKeywordId: $KeywordRegistry.ac -// directionKeywordId: "x", -// responsibleContactId: EmployeeUtils.getCurrentContactId() -// }; -// -// var activityLinks = [["Person", "6e667085-bb97-4039-8dfe-2230002985e0"]] -// -// //activityLinks = ArrayUtils.distinct2d(activityLinks);//TODO: better check before adding the elements into the array if it already exists there -// -// var activityRes = ActivityUtils.insertNewActivity(activityDataForInsert, activityLinks, null, db.getCurrentAlias()); -//} -//catch (exception) -//{ -// logging.log("exception -> " + exception); -//} - -////notification.addNotification(util.getNewUUID(), null, null, null, notification., notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description); - - -//let currentContactId = EmployeeUtils.getCurrentContactId(); -//DuplicateScannerUtils.CreateMergeSuccessActivity("a2e084e2-d68a-4f1e-a1bb-f8d46ad6293d", "6e667085-bb97-4039-8dfe-2230002985e0", currentContactId, "Person"); - - -//logging.log("$KeywordRegistry.activityDirection$internal() -> " + $KeywordRegistry.activityDirection$internal()); - - - -//let processParameters = { -// filterName: "PersonDuplicates", -// targetEntity: "Person_entity" //process.execute is only able to handle strings -//} -//let userId = EmployeeUtils.getCurrentUserId(); -//if(userId == null) -// userId == ""; -//try -//{ -// let processId = "manualrun_rebuild_duplicatecache_" + util.getNewUUID(); -// process.executeTimer(processId, "RebuildAllDuplicatesCache_serverProcess", 0, true, false, process.TIMERTYPE_SERVER_RUN, userId, false, process.THREADPRIORITY_LOW) -// process.stopTimer(processId); -// logging.log("test -> "); -// process.executeAsync("RebuildAllDuplicateCaches_serverProcess", processParameters, false, userId, process.THREADPRIORITY_LOW) -// logging.log("test2 -> "); -//} -//catch (exception) -//{ -// logging.log(" exception-> " + exception); -//} diff --git a/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/recordfieldmappings/duplicatecount.value/expression.js b/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/recordfieldmappings/duplicatecount.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..a49f1a0db948473f671384d79a28219c3a23cd17 --- /dev/null +++ b/entity/DuplicateScanner_entity/recordcontainers/dbrecordcontainer/recordfieldmappings/duplicatecount.value/expression.js @@ -0,0 +1,13 @@ +import("system.result"); +import("Sql_lib"); + +var subselect = newSelect("count(*)").from("UNRELATEDDUPLICATES") +.where("UNRELATEDDUPLICATES.DUPLICATETYPE = HASDUPLICATE.OBJECT_TYPE") +.and("UNRELATEDDUPLICATES.SOURCEDUPLICATEID = HASDUPLICATE.OBJECT_ROWID"); +result.string( + newSelect("count(*)") + .from("HASDUPLICATE") + .where("HASDUPLICATE.OBJECT_TYPE = DUPLICATESCANNER.ENTITY_TO_SCAN_NAME") + .and("(HASDUPLICATE.DUPLICATECOUNT - (" + subselect.toString() + ")) > 0") + .toString() +); diff --git a/entity/DuplicatesUnrelated_entity/DuplicatesUnrelated_entity.aod b/entity/DuplicatesUnrelated_entity/DuplicatesUnrelated_entity.aod deleted file mode 100644 index 7d2241b72c2014a236b28f81f3f8a49060a1f768..0000000000000000000000000000000000000000 --- a/entity/DuplicatesUnrelated_entity/DuplicatesUnrelated_entity.aod +++ /dev/null @@ -1,91 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> - <name>DuplicatesUnrelated_entity</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <documentation>%aditoprj%/entity/DuplicatesUnrelated_entity/documentation.adoc</documentation> - <siblings> - <element>Duplicates_entity</element> - </siblings> - <recordContainer>jditoRecordContainer</recordContainer> - <entityFields> - <entityProvider> - <name>#PROVIDER</name> - </entityProvider> - <entityProvider> - <name>UnrelatedPersonsProvider</name> - <titlePlural>Unrelated person duplicates</titlePlural> - <children> - <entityParameter> - <name>TargetEntity</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <expose v="true" /> - <mandatory v="false" /> - </entityParameter> - </children> - </entityProvider> - <entityParameter> - <name>TargetEntity</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityProvider> - <name>UnrelatedOrganisationsProvider</name> - <titlePlural>Unrelated organisations duplicates</titlePlural> - <children> - <entityParameter> - <name>TargetEntity</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <expose v="true" /> - <mandatory v="false" /> - </entityParameter> - </children> - </entityProvider> - <entityField> - <name>SourceDuplicateDescription</name> - <title>Source duplicate</title> - </entityField> - <entityField> - <name>UnrelatedDuplicateDescription</name> - <title>Unrelated duplicate</title> - </entityField> - <entityField> - <name>UID</name> - </entityField> - <entityParameter> - <name>ClusterId_param</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityProvider> - <name>#PROVIDER_AGGREGATES</name> - <useAggregates v="true" /> - </entityProvider> - </entityFields> - <recordContainers> - <jDitoRecordContainer> - <name>jditoRecordContainer</name> - <jDitoRecordAlias>Data_alias</jDitoRecordAlias> - <contentProcess>%aditoprj%/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/contentProcess.js</contentProcess> - <onDelete>%aditoprj%/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/onDelete.js</onDelete> - <recordFieldMappings> - <jDitoRecordFieldMapping> - <name>UID.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>SourceDuplicateDescription.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>UnrelatedDuplicateDescription.value</name> - </jDitoRecordFieldMapping> - </recordFieldMappings> - </jDitoRecordContainer> - </recordContainers> -</entity> diff --git a/entity/DuplicatesUnrelated_entity/documentation.adoc b/entity/DuplicatesUnrelated_entity/documentation.adoc deleted file mode 100644 index 06d0fa27494b89bf6d02bef96f9872cb1409c379..0000000000000000000000000000000000000000 --- a/entity/DuplicatesUnrelated_entity/documentation.adoc +++ /dev/null @@ -1,3 +0,0 @@ -=DuplicateUnrelated_entity - -These Duplicates not related to another Entity. \ No newline at end of file diff --git a/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/contentProcess.js b/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/contentProcess.js deleted file mode 100644 index 7f6beb6cd3e8fff07df2f33aa29835976eedc12d..0000000000000000000000000000000000000000 --- a/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/contentProcess.js +++ /dev/null @@ -1,73 +0,0 @@ -import("system.result"); -import("system.vars"); -import("system.db"); -import("Sql_lib"); - -var INDEX_ID = 0; -var INDEX_SOURCE_INFO1 = 1; -var INDEX_SOURCE_INFO2 = 3; -var INDEX_UNRELATED_INFO1 = 2; -var INDEX_UNRELATED_INFO2 = 4; -var INDEX_SOURCE_INFO = 1; -var INDEX_UNRELATED_INFO = 2; - - -let unrelatedDuplicates = []; -let resultUnrelatedDuplicates = []; -let targetEntity = vars.get("$param.TargetEntity"); -let clusterId = vars.get("$param.ClusterId_param"); -let querySelect = new SqlBuilder(); - -if(targetEntity == 'Person_entity') -{ - querySelect.select("ud.ID," - + " pSource.FIRSTNAME, pUnrelated.FIRSTNAME," - + " pSource.LASTNAME, pUnrelated.LASTNAME") - .from("UNRELATEDDUPLICATES", "ud") - .join("CONTACT", "cUnrelated.CONTACTID = ud.UNRELATEDDUPLICATEID", "cUnrelated") - .join("PERSON", "pUnrelated.PERSONID = cUnrelated.PERSON_ID", "pUnrelated") - .join("CONTACT", "cSource.CONTACTID = ud.SOURCEDUPLICATEID", "cSource") - .join("PERSON", "pSource.PERSONID = cSource.PERSON_ID", "pSource") - //If the clusterid parameter is present, only load the duplicates for this particular cluster - .whereIfSet(["UNRELATEDDUPLICATES", "CLUSTERID", "ud"], clusterId); - -} -else -{ - querySelect.select("ud.ID," - + " oSource.\"NAME\"," - + " oUnrelated.\"NAME\"") - .from("UNRELATEDDUPLICATES", "ud") - .join("CONTACT", "cUnrelated.CONTACTID = ud.UNRELATEDDUPLICATEID", "cUnrelated") - .join("ORGANISATION", "oUnrelated.ORGANISATIONID = cUnrelated.CONTACTID", "oUnrelated") - .join("CONTACT", "cSource.CONTACTID = ud.SOURCEDUPLICATEID", "cSource") - .join("ORGANISATION", "oSource.ORGANISATIONID = cSource.CONTACTID", "oSource") - //If the clusterid parameter is present, only load the duplicates for this particular cluster - .whereIfSet(["UNRELATEDDUPLICATES", "CLUSTERID", "ud"], clusterId); -} - -unrelatedDuplicates = querySelect.table(); - -for (let i = 0; i < unrelatedDuplicates.length; i++) -{ - let id = unrelatedDuplicates[i][INDEX_ID]; - let sourceInfo = ""; - let unrelatedInfo = ""; - - let sourceInfo1 = unrelatedDuplicates[i][INDEX_SOURCE_INFO1]; - let sourceInfo2 = unrelatedDuplicates[i][INDEX_SOURCE_INFO2]; - let unrelatedInfo1 = unrelatedDuplicates[i][INDEX_UNRELATED_INFO1]; - let unrelatedInfo2 = unrelatedDuplicates[i][INDEX_UNRELATED_INFO2]; - - sourceInfo = sourceInfo1; - if(sourceInfo2 != undefined) - sourceInfo += " " + sourceInfo2; - - unrelatedInfo = unrelatedInfo1; - if(unrelatedInfo2 != undefined) - unrelatedInfo += " " + unrelatedInfo2; - - resultUnrelatedDuplicates.push([id, sourceInfo, unrelatedInfo]); -} - -result.object(resultUnrelatedDuplicates); \ No newline at end of file diff --git a/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/onDelete.js b/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/onDelete.js deleted file mode 100644 index 4cb5ca4f2a88d7144b24d27ecf99028f547ca144..0000000000000000000000000000000000000000 --- a/entity/DuplicatesUnrelated_entity/recordcontainers/jditorecordcontainer/onDelete.js +++ /dev/null @@ -1,3 +0,0 @@ -import("Sql_lib"); - -newWhere("UNRELATEDDUPLICATES.ID", "$local.uid").deleteData(); \ No newline at end of file diff --git a/entity/Duplicates_entity/Duplicates_entity.aod b/entity/Duplicates_entity/Duplicates_entity.aod deleted file mode 100644 index fe9a19485083c678b01823430ae02631da122683..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/Duplicates_entity.aod +++ /dev/null @@ -1,234 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> - <name>Duplicates_entity</name> - <title>Duplicates</title> - <majorModelMode>DISTRIBUTED</majorModelMode> - <documentation>%aditoprj%/entity/Duplicates_entity/documentation.adoc</documentation> - <siblings> - <element>DuplicatesUnrelated_entity</element> - </siblings> - <iconId>VAADIN:DATABASE</iconId> - <recordContainer>recordContainer</recordContainer> - <entityFields> - <entityProvider> - <name>#PROVIDER</name> - </entityProvider> - <entityField> - <name>CLUSTER_DESCRIPTION</name> - <title>Cluster description</title> - </entityField> - <entityField> - <name>COUNT_DUPLICATES_IN_CLUSTER</name> - <title>Count duplicates in cluster</title> - <contentType>NUMBER</contentType> - </entityField> - <entityField> - <name>TARGET_ENTITY</name> - </entityField> - <entityField> - <name>UID</name> - </entityField> - <entityProvider> - <name>SelfPersonDuplicatesProvider</name> - <titlePluralProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selfpersonduplicatesprovider/titlePluralProcess.js</titlePluralProcess> - <titlePlural>Person duplicates</titlePlural> - <children> - <entityParameter> - <name>TargetEntity</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - </children> - </entityProvider> - <entityConsumer> - <name>SelfPersonDuplicatesConsumer</name> - <dependency> - <name>dependency</name> - <entityName>Duplicates_entity</entityName> - <fieldName>SelfPersonDuplicatesProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>TargetEntity</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/targetentity/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/clusterid_param/valueProcess.js</valueProcess> - <title></title> - </entityParameter> - </children> - </entityConsumer> - <entityParameter> - <name>TargetEntity</name> - <expose v="true" /> - <mandatory v="true" /> - </entityParameter> - <entityConsumer> - <name>SelfOrganisationDuplicatesConsumer</name> - <dependency> - <name>dependency</name> - <entityName>Duplicates_entity</entityName> - <fieldName>SelfOrganisationDuplicatesProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>TargetEntity</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/targetentity/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/clusterid_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityProvider> - <name>SelfOrganisationDuplicatesProvider</name> - <titlePlural>Organisation duplicates</titlePlural> - </entityProvider> - <entityConsumer> - <name>DuplicatesUnrelatedPersonConsumer</name> - <dependency> - <name>dependency</name> - <entityName>DuplicatesUnrelated_entity</entityName> - <fieldName>UnrelatedPersonsProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>TargetEntity</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/targetentity/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/clusterid_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityField> - <name>CLUSTER_ID</name> - </entityField> - <entityConsumer> - <name>DuplicatePersonsConsumer</name> - <dependency> - <name>dependency</name> - <entityName>Person_entity</entityName> - <fieldName>NonselfDuplicates</fieldName> - </dependency> - <children> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/onlyshowcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/duplicateactionscontrol_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityActionGroup> - <name>DuplicateClusterActionGroup</name> - <title>Duplicate actions</title> - <children> - <entityActionField> - <name>IgnoreWholeCluster</name> - <title>Ignore whole cluster</title> - <onActionProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicateclusteractiongroup/children/ignorewholecluster/onActionProcess.js</onActionProcess> - <isSelectionAction v="true" /> - <iconId>VAADIN:CLOSE</iconId> - </entityActionField> - </children> - </entityActionGroup> - <entityConsumer> - <name>DuplicatesUnrelatedOrganisationConsumer</name> - <dependency> - <name>dependency</name> - <entityName>DuplicatesUnrelated_entity</entityName> - <fieldName>UnrelatedOrganisationsProvider</fieldName> - </dependency> - <children> - <entityParameter> - <name>TargetEntity</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/targetentity/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ClusterId_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/clusterid_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityActionGroup> - <name>PersonOpenClusterDetailActionGroup</name> - <children> - <entityActionField> - <name>PersonOpenClusterDetail</name> - <title></title> - <onActionProcess>%aditoprj%/entity/Duplicates_entity/entityfields/personopenclusterdetailactiongroup/children/personopenclusterdetail/onActionProcess.js</onActionProcess> - <isSelectionAction v="true" /> - <iconId>VAADIN:FOLDER_OPEN</iconId> - </entityActionField> - </children> - </entityActionGroup> - <entityParameter> - <name>ClusterId_param</name> - <expose v="true" /> - </entityParameter> - <entityActionGroup> - <name>OrganisationOpenClusterDetailActionGroup</name> - <children> - <entityActionField> - <name>OrganisationOpenClusterDetail</name> - <title>Open cluster detail</title> - <onActionProcess>%aditoprj%/entity/Duplicates_entity/entityfields/organisationopenclusterdetailactiongroup/children/organisationopenclusterdetail/onActionProcess.js</onActionProcess> - <isSelectionAction v="true" /> - <iconId>VAADIN:FOLDER_OPEN</iconId> - </entityActionField> - </children> - </entityActionGroup> - <entityConsumer> - <name>DuplicateOrganisationsConsumer</name> - <dependency> - <name>dependency</name> - <entityName>Organisation_entity</entityName> - <fieldName>NonselfDuplicates</fieldName> - </dependency> - <children> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/duplicateactionscontrol_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <valueProcess>%aditoprj%/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/onlyshowcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> - <entityProvider> - <name>#PROVIDER_AGGREGATES</name> - <useAggregates v="true" /> - </entityProvider> - </entityFields> - <recordContainers> - <jDitoRecordContainer> - <name>recordContainer</name> - <jDitoRecordAlias>Data_alias</jDitoRecordAlias> - <contentProcess>%aditoprj%/entity/Duplicates_entity/recordcontainers/recordcontainer/contentProcess.js</contentProcess> - <recordFieldMappings> - <jDitoRecordFieldMapping> - <name>UID.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>CLUSTER_DESCRIPTION.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>COUNT_DUPLICATES_IN_CLUSTER.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>TARGET_ENTITY.value</name> - </jDitoRecordFieldMapping> - <jDitoRecordFieldMapping> - <name>CLUSTER_ID.value</name> - </jDitoRecordFieldMapping> - </recordFieldMappings> - </jDitoRecordContainer> - </recordContainers> -</entity> diff --git a/entity/Duplicates_entity/documentation.adoc b/entity/Duplicates_entity/documentation.adoc deleted file mode 100644 index aa8d46c4a31d622c6ed142e3e92422218a302ae9..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/documentation.adoc +++ /dev/null @@ -1,3 +0,0 @@ -=Duplicates_entity - -This Entity shows the Duplicates of \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/duplicateclusteractiongroup/children/ignorewholecluster/onActionProcess.js b/entity/Duplicates_entity/entityfields/duplicateclusteractiongroup/children/ignorewholecluster/onActionProcess.js deleted file mode 100644 index 77822dbca0461d5ffccc31af058b9a5750002a4b..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicateclusteractiongroup/children/ignorewholecluster/onActionProcess.js +++ /dev/null @@ -1,27 +0,0 @@ -import("system.logging"); -import("system.neon"); -import("system.vars"); -import("DuplicateScanner_lib"); -import("system.notification"); - -let clusterId = vars.get("$sys.selection"); - -let duplicateContactIdsInClusterRay = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterId) - -if(duplicateContactIdsInClusterRay.length > 1) -{ - let referenceDuplicateId = duplicateContactIdsInClusterRay[0]; - for (let i = 1; i < duplicateContactIdsInClusterRay.length; i++) - { - DuplicateScannerUtils.createUnrelatedDuplicateRelation(referenceDuplicateId, duplicateContactIdsInClusterRay[i], clusterId); - } - //notification.createConfig().notificationType(notification.t) - //neon.refresh(["$field.SelfPersonDuplicatesConsumer"]) - - //todo Temporary!!! In the first refresh is the record via idValue selected and gets refreshed but stays visible in the record container - //todo Temporary!!! on the second refresh, no selecten remains and the container loads the remaining records as expected - neon.refreshAll(); - neon.refreshAll(); -} - - diff --git a/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/duplicateactionscontrol_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/duplicateactionscontrol_param/valueProcess.js deleted file mode 100644 index 5267adbe23e51fbb6b2c1c2aa44c947c3c3e7c34..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/duplicateactionscontrol_param/valueProcess.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("2");//todo exchange with keyword diff --git a/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/onlyshowcontactids_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/onlyshowcontactids_param/valueProcess.js deleted file mode 100644 index ecb8c518cd40068c5e36606b64c83765a69962f6..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicateorganisationsconsumer/children/onlyshowcontactids_param/valueProcess.js +++ /dev/null @@ -1,18 +0,0 @@ -import("system.logging"); -import("system.result"); -import("system.vars"); -import("DuplicateScanner_lib"); - -let clusterRecordId = vars.get("$field.UID"); - -let contactIdsInCluster = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterRecordId); - -/* - * To achieve that if there are no duplicates, no contacts should be shown and therefore returned by the - * recordcontainer, an invalid id gets returned. It then is used in the conditionProcess to load the duplicates. - * Because of its invalidity, no records are shown. -*/ -if(contactIdsInCluster.length == 0) - result.string(JSON.stringify(["nodata"])); -else - result.string(JSON.stringify(contactIdsInCluster)); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/duplicateactionscontrol_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/duplicateactionscontrol_param/valueProcess.js deleted file mode 100644 index 5267adbe23e51fbb6b2c1c2aa44c947c3c3e7c34..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/duplicateactionscontrol_param/valueProcess.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("2");//todo exchange with keyword diff --git a/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/onlyshowcontactids_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/onlyshowcontactids_param/valueProcess.js deleted file mode 100644 index ecb8c518cd40068c5e36606b64c83765a69962f6..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicatepersonsconsumer/children/onlyshowcontactids_param/valueProcess.js +++ /dev/null @@ -1,18 +0,0 @@ -import("system.logging"); -import("system.result"); -import("system.vars"); -import("DuplicateScanner_lib"); - -let clusterRecordId = vars.get("$field.UID"); - -let contactIdsInCluster = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterRecordId); - -/* - * To achieve that if there are no duplicates, no contacts should be shown and therefore returned by the - * recordcontainer, an invalid id gets returned. It then is used in the conditionProcess to load the duplicates. - * Because of its invalidity, no records are shown. -*/ -if(contactIdsInCluster.length == 0) - result.string(JSON.stringify(["nodata"])); -else - result.string(JSON.stringify(contactIdsInCluster)); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/clusterid_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/clusterid_param/valueProcess.js deleted file mode 100644 index 152dfe0324a75ddba53552148d86b4af97acc6dd..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/clusterid_param/valueProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.vars"); -import("system.result"); - -let clusterId = vars.get("$field.UID"); -result.string(clusterId); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/clusterid_param/valueProcess.js b/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/clusterid_param/valueProcess.js deleted file mode 100644 index 03d5df5be8044683b94f306002bcbeada25b8737..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/duplicatesunrelatedpersonconsumer/children/clusterid_param/valueProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.vars"); -import("system.result"); - -//let clusterId = vars.get("$field.UID"); -let clusterId = vars.get("$param.ClusterId_param"); -result.string(clusterId); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/organisationopenclusterdetailactiongroup/children/organisationopenclusterdetail/onActionProcess.js b/entity/Duplicates_entity/entityfields/organisationopenclusterdetailactiongroup/children/organisationopenclusterdetail/onActionProcess.js deleted file mode 100644 index f599915bdc2dbbb45a9b52bb92e7de622c74f618..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/organisationopenclusterdetailactiongroup/children/organisationopenclusterdetail/onActionProcess.js +++ /dev/null @@ -1,12 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); - -let contextName = "Duplicates"; -let viewName = "OrganisationClusterMain_view"; - -var params = {}; -params["ClusterId_param"] = vars.get("$sys.selection")[0]; -params["TargetEntity"] = "Organisation_entity"; - -neon.openContext(contextName, viewName, null, neon.OPERATINGSTATE_VIEW, params); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/personopenclusterdetailactiongroup/children/personopenclusterdetail/onActionProcess.js b/entity/Duplicates_entity/entityfields/personopenclusterdetailactiongroup/children/personopenclusterdetail/onActionProcess.js deleted file mode 100644 index 9d5cf8d6da175cc02200a6874c07f460589f6745..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/personopenclusterdetailactiongroup/children/personopenclusterdetail/onActionProcess.js +++ /dev/null @@ -1,12 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); - -let contextName = "Duplicates"; -let viewName = "PersonClusterMain_view"; - -var params = {}; -params["ClusterId_param"] = vars.get("$sys.selection")[0]; -params["TargetEntity"] = "Person_entity"; - -neon.openContext(contextName, viewName, null, neon.OPERATINGSTATE_VIEW, params); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/clusterid_param/valueProcess.js b/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/clusterid_param/valueProcess.js deleted file mode 100644 index 8ef7b768764a4f534b886492c99ec2e9408c00e5..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/clusterid_param/valueProcess.js +++ /dev/null @@ -1,5 +0,0 @@ -import("system.vars"); -import("system.result"); - -let clusterId = vars.get("$param.ClusterId_param"); -result.string(clusterId); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/targetentity/valueProcess.js b/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/targetentity/valueProcess.js deleted file mode 100644 index e781fb72fd248164b8b63a98008094744aee7460..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/selforganisationduplicatesconsumer/children/targetentity/valueProcess.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("Organisation_entity"); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/clusterid_param/valueProcess.js b/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/clusterid_param/valueProcess.js deleted file mode 100644 index 258d52e236265f259b354a56fd04b1a3d2fcb566..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/selfpersonduplicatesconsumer/children/clusterid_param/valueProcess.js +++ /dev/null @@ -1,6 +0,0 @@ -import("system.vars"); -import("system.result"); - -//let clusterId = vars.get("$sys.selection"); -let clusterId = vars.get("$param.ClusterId_param"); -result.string(clusterId); \ No newline at end of file diff --git a/entity/Duplicates_entity/entityfields/selfpersonduplicatesprovider/titlePluralProcess.js b/entity/Duplicates_entity/entityfields/selfpersonduplicatesprovider/titlePluralProcess.js deleted file mode 100644 index b213a20410d97225b6a299a51857dcf0057ba50c..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/entityfields/selfpersonduplicatesprovider/titlePluralProcess.js +++ /dev/null @@ -1,3 +0,0 @@ -import("system.result"); -import("system.translate"); -result.string(translate.text("Person duplicates")); \ No newline at end of file diff --git a/entity/Duplicates_entity/recordcontainers/recordcontainer/contentProcess.js b/entity/Duplicates_entity/recordcontainers/recordcontainer/contentProcess.js deleted file mode 100644 index fc29941db97b09cd069a88b166304eb2be952b1e..0000000000000000000000000000000000000000 --- a/entity/Duplicates_entity/recordcontainers/recordcontainer/contentProcess.js +++ /dev/null @@ -1,121 +0,0 @@ -import("Sql_lib"); -import("system.logging"); -import("system.db"); -import("system.vars"); -import("system.result"); - -var INDEX_CLUSTERID = 0; -var INDEX_FIRSTNAME = 1; -var INDEX_LASTNAME = 2; -var INDEX_ORGNAME = 1; - -let targetEntity = vars.get("$param.TargetEntity"); -let duplicates = []; - -let selectedClusterId = vars.get("$param.ClusterId_param"); - -let duplicateInfosQuery = new SqlBuilder(); - -let selectedId = vars.get("$local.idvalues"); - -if(selectedId) -{ - /* - * Definitely a todo. - * Support for the action "Ignore whole cluster" - * If this action is used two times in a row, an error occurs on the second time. - * Although the selected record isn't present in the recordcontainer any more, the core tries to load a record with the same id. - * As a result an error gets thrown. If a dummy record gets returned here, it plays along with the current internal logic and doesn't throw an error. - * If a preview should be shown, this part of the container has to be extended. - */ - duplicates.push([selectedId, "", "", "", ""]); - result.object(duplicates); -} -else -{ - if(targetEntity == "Person_entity") - { - duplicateInfosQuery.select("CLUSTERID, FIRSTNAME, LASTNAME") - .from("DUPLICATECLUSTERS") - .join("CONTACT", "CONTACT.CONTACTID = DUPLICATEID") - .join("PERSON", "PERSON.PERSONID = CONTACT.PERSON_ID") - .where("DUPLICATEID not in (select UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID from UNRELATEDDUPLICATES)") - .andIfSet("DUPLICATECLUSTERS.CLUSTERID", selectedClusterId) - .orderBy("CLUSTERID"); - } - else - { - duplicateInfosQuery.select("CLUSTERID, ORGANISATION.\"NAME\"") - .from("DUPLICATECLUSTERS") - .join("CONTACT", "CONTACT.CONTACTID = DUPLICATEID") - .join("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID") - .where("DUPLICATEID not in (select UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID from UNRELATEDDUPLICATES)") - .andIfSet("DUPLICATECLUSTERS.CLUSTERID", vars.get("$local.idvalues"), SqlBuilder.IN()) - .orderBy("CLUSTERID"); - } - let duplicateInfos = duplicateInfosQuery.table(); - - let MAX_SHOW_CLUSTER_RECORDS = 4; - let recordClusterId = ""; - let recordDescription = ""; - let recordDuplicateInClusterCount = 0; - - for (let i = 0; i < duplicateInfos.length; i++) - { - let currentClusterId = duplicateInfos[i][INDEX_CLUSTERID]; - let currentDescription = ""; - - //Build the description depending on the targetEntity - if(targetEntity == "Person_entity") - currentDescription = duplicateInfos[i][INDEX_FIRSTNAME] + " " + duplicateInfos[i][INDEX_LASTNAME]; - else - currentDescription = duplicateInfos[i][INDEX_ORGNAME]; - - if(i == 0) - { - recordClusterId = currentClusterId; - recordDescription = currentDescription; - recordDuplicateInClusterCount = 1; - continue; - } - - //If the record belongs to the same Cluster as the one before, append its value and increase the counter - //otherwise write the clusters record an start a new record. - if(recordClusterId == currentClusterId) - { - if(recordDuplicateInClusterCount < MAX_SHOW_CLUSTER_RECORDS) - recordDescription += ", " + currentDescription; - if(recordDuplicateInClusterCount == MAX_SHOW_CLUSTER_RECORDS) - recordDescription += ", ..." - recordDuplicateInClusterCount++; - - /* - * Finish the current record if its the last duplicate. - * It has to be checked wether or not more than one element is currently in the cluster: - * Normally, there are always at least 2 elements in a cluster. If then a duplicate relation - * is beign ignored, there's only one record left in this particluar cluster. - * As there are then no interactions possible (and a cluster of one is no cluster), this cluster musn't be shown in the list. - */ - if(i == duplicateInfos.length-1 && recordDuplicateInClusterCount > 1) - duplicates.push([recordClusterId, recordDescription, recordDuplicateInClusterCount, targetEntity, recordClusterId]); - } - else - { - /* - * Finish the current record if its the next cluster. - * It has to be checked wether or not more than one element is currently in the cluster: - * Normally, there are always at least 2 elements in a cluster. If then a duplicate relation - * is beign ignored, there's only one record left in this particluar cluster. - * As there would be no interactions possible (and a cluster of one is no cluster), this cluster musn't be shown in the list. - */ - if(recordDuplicateInClusterCount > 1) - duplicates.push([recordClusterId, recordDescription, recordDuplicateInClusterCount, targetEntity, recordClusterId]); - - recordClusterId = currentClusterId - recordDescription = currentDescription - recordDuplicateInClusterCount = 1; - } - } - - result.object(duplicates); -} diff --git a/entity/Favorite_entity/Favorite_entity.aod b/entity/Favorite_entity/Favorite_entity.aod index 4d3a729393f10f8feb1957675d44092d7a05ba30..9ce8f7b4045ccc69f83b71c3922e47957267050d 100644 --- a/entity/Favorite_entity/Favorite_entity.aod +++ b/entity/Favorite_entity/Favorite_entity.aod @@ -71,7 +71,7 @@ <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias> <isFilterable v="true" /> <isGroupable v="true" /> - <isSortable v="true" /> + <isSortable v="false" /> <contentProcess>%aditoprj%/entity/Favorite_entity/recordcontainers/jditorecordcontainer/contentProcess.js</contentProcess> <onDelete>%aditoprj%/entity/Favorite_entity/recordcontainers/jditorecordcontainer/onDelete.js</onDelete> <recordFieldMappings> diff --git a/entity/InterestLink_entity/InterestLink_entity.aod b/entity/InterestLink_entity/InterestLink_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..7f4c396f063b7d9e1f693af97fc79b101abbd226 --- /dev/null +++ b/entity/InterestLink_entity/InterestLink_entity.aod @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>InterestLink_entity</name> + <title>Interest</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <titlePlural>Interests</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>INTEREST_ID</name> + <title>Interest</title> + <consumer>Interests</consumer> + <displayValueProcess>%aditoprj%/entity/InterestLink_entity/entityfields/interest_id/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>INTERESTLINKID</name> + </entityField> + <entityField> + <name>CONTACT_ID</name> + <valueProcess>%aditoprj%/entity/InterestLink_entity/entityfields/contact_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>STATUS</name> + <title>Status</title> + <consumer>StatusKeyword</consumer> + <valueProcess>%aditoprj%/entity/InterestLink_entity/entityfields/status/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/InterestLink_entity/entityfields/status/displayValueProcess.js</displayValueProcess> + </entityField> + <entityConsumer> + <name>Interests</name> + <dependency> + <name>dependency</name> + <entityName>Interest_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + <entityConsumer> + <name>StatusKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/InterestLink_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityParameter> + <name>ContactId_param</name> + <expose v="true" /> + <mandatory v="true" /> + </entityParameter> + <entityProvider> + <name>InterestsForContact</name> + <dependencies> + <entityDependency> + <name>97de1501-3646-475b-bf3c-2fec20843ee4</name> + <entityName>Person_entity</entityName> + <fieldName>InterestLinks</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>DESCRIPTION</name> + <title>Description</title> + <state>READONLY</state> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <fromClauseProcess>%aditoprj%/entity/InterestLink_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/InterestLink_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>INTERESTLINK.CONTACT_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DESCRIPTION.value</name> + <recordfield>INTEREST.DESCRIPTION</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTEREST_ID.value</name> + <recordfield>INTERESTLINK.INTEREST_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTERESTLINKID.value</name> + <recordfield>INTERESTLINK.INTERESTLINKID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>INTERESTLINK.STATUS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTEREST_ID.displayValue</name> + <recordfield>INTEREST.TITLE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>085ae9b5-3760-460a-911c-cb4b8ffb336f</name> + <tableName>INTERESTLINK</tableName> + <primaryKey>INTERESTLINKID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + <linkInformation> + <name>f8e78ecd-8d26-4285-95c8-093a08877374</name> + <tableName>INTEREST</tableName> + <primaryKey>INTERESTID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/InterestLink_entity/entityfields/contact_id/valueProcess.js b/entity/InterestLink_entity/entityfields/contact_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..d877bfcaca49d927d93af76a0600ce037fe93bf8 --- /dev/null +++ b/entity/InterestLink_entity/entityfields/contact_id/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$param.ContactId_param")); \ No newline at end of file diff --git a/entity/InterestLink_entity/entityfields/interest_id/displayValueProcess.js b/entity/InterestLink_entity/entityfields/interest_id/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e2c5bbf9152d5d220ccba334f4f7b8d2bb15e8f1 --- /dev/null +++ b/entity/InterestLink_entity/entityfields/interest_id/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.loadContentTitle("Interest_entity", vars.get("$field.INTEREST_ID"))); \ No newline at end of file diff --git a/entity/InterestLink_entity/entityfields/status/displayValueProcess.js b/entity/InterestLink_entity/entityfields/status/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..99daaad8a4f81f5e36f990ce8230fefd42f01029 --- /dev/null +++ b/entity/InterestLink_entity/entityfields/status/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getViewValue($KeywordRegistry.interestLinkStatus(), vars.get("$field.STATUS"))); \ No newline at end of file diff --git a/entity/InterestLink_entity/entityfields/status/valueProcess.js b/entity/InterestLink_entity/entityfields/status/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..544c9707223d3140fcd7f1d04a87f9ea362d954a --- /dev/null +++ b/entity/InterestLink_entity/entityfields/status/valueProcess.js @@ -0,0 +1,7 @@ +import("KeywordRegistry_basic"); +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string($KeywordRegistry.interestLinkStatus$subscribed()); \ No newline at end of file diff --git a/entity/InterestLink_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js b/entity/InterestLink_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e9b1fd0fbd8593e28529bef2a05cc48ff5874276 --- /dev/null +++ b/entity/InterestLink_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.interestLinkStatus()); \ No newline at end of file diff --git a/entity/InterestLink_entity/recordcontainers/db/conditionProcess.js b/entity/InterestLink_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..23abeb0f0cd7dcf2cf1cc63a56165555c2071c9c --- /dev/null +++ b/entity/InterestLink_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Sql_lib"); + +var condition = newWhere("INTERESTLINK.CONTACT_ID", "$param.ContactId_param"); + +result.string(condition.toString()); \ No newline at end of file diff --git a/entity/InterestLink_entity/recordcontainers/db/fromClauseProcess.js b/entity/InterestLink_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..3f4a87ce8c145477940f84f29238b1dc3730f5e3 --- /dev/null +++ b/entity/InterestLink_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("Sql_lib"); + +var from = new SqlBuilder() + .from("INTEREST") + .join("INTERESTLINK", "INTEREST.INTERESTID = INTERESTLINK.INTEREST_ID"); + +result.string(from.toString()); \ No newline at end of file diff --git a/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..4d9a79c193a877db1499d034091c56605d9ee994 --- /dev/null +++ b/entity/InterestLink_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.interestLinkStatus(), "INTERESTLINK.STATUS")); \ No newline at end of file diff --git a/entity/Interest_entity/Interest_entity.aod b/entity/Interest_entity/Interest_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..f2485ca1f25930f9712a6e510a4c5ee0dd1769bc --- /dev/null +++ b/entity/Interest_entity/Interest_entity.aod @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>Interest_entity</name> + <title>Interest</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <contentTitleProcess>%aditoprj%/entity/Interest_entity/contentTitleProcess.js</contentTitleProcess> + <contentDescriptionProcess>%aditoprj%/entity/Interest_entity/contentDescriptionProcess.js</contentDescriptionProcess> + <iconId>VAADIN:GAMEPAD</iconId> + <titlePlural>Interests</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + <dependencies> + <entityDependency> + <name>a7f69959-a663-4089-828f-71cdc461262b</name> + <entityName>InterestLink_entity</entityName> + <fieldName>Interests</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>3b09958b-0175-47fa-9528-2d5570c21162</name> + <entityName>BulkMail_entity</entityName> + <fieldName>Interests</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>INTERESTID</name> + </entityField> + <entityField> + <name>TITLE</name> + <title>Title</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>DESCRIPTION</name> + <title>Description</title> + <contentType>LONG_TEXT</contentType> + </entityField> + <entityField> + <name>STATUS</name> + <title>Status</title> + <consumer>StatusKeyword</consumer> + <mandatory v="true" /> + <valueProcess>%aditoprj%/entity/Interest_entity/entityfields/status/valueProcess.js</valueProcess> + <displayValueProcess>%aditoprj%/entity/Interest_entity/entityfields/status/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>IS_DEFAULT</name> + <title>Default</title> + <contentType>BOOLEAN</contentType> + </entityField> + <entityConsumer> + <name>StatusKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/Interest_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>DESCRIPTION.value</name> + <recordfield>INTEREST.DESCRIPTION</recordfield> + <isFilterable v="true" /> + <isLookupFilter v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTERESTID.value</name> + <recordfield>INTEREST.INTERESTID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>IS_DEFAULT.value</name> + <recordfield>INTEREST.IS_DEFAULT</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>INTEREST.STATUS</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TITLE.value</name> + <recordfield>INTEREST.TITLE</recordfield> + <isFilterable v="true" /> + <isLookupFilter v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/Interest_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>62b56e0f-e284-4d95-ac45-4e23a33d7758</name> + <tableName>INTEREST</tableName> + <primaryKey>INTERESTID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/Interest_entity/contentDescriptionProcess.js b/entity/Interest_entity/contentDescriptionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..06a46eb63894622c07e5021280fbb098c3d4385c --- /dev/null +++ b/entity/Interest_entity/contentDescriptionProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.DESCRIPTION")); \ No newline at end of file diff --git a/entity/DuplicateScanner_entity/entityfields/scannerresultfieldsconfig_consumer/children/duplicatescannerid_param/valueProcess.js b/entity/Interest_entity/contentTitleProcess.js similarity index 53% rename from entity/DuplicateScanner_entity/entityfields/scannerresultfieldsconfig_consumer/children/duplicatescannerid_param/valueProcess.js rename to entity/Interest_entity/contentTitleProcess.js index 3c559d42002c59103607e03f79eb792d99d74d31..94f61859cc64100bb6a6dcd445efc67835002c1a 100644 --- a/entity/DuplicateScanner_entity/entityfields/scannerresultfieldsconfig_consumer/children/duplicatescannerid_param/valueProcess.js +++ b/entity/Interest_entity/contentTitleProcess.js @@ -1,3 +1,4 @@ import("system.vars"); import("system.result"); -result.string(vars.get("$field.UID")); \ No newline at end of file + +result.string(vars.get("$field.TITLE")); \ No newline at end of file diff --git a/entity/Interest_entity/entityfields/status/displayValueProcess.js b/entity/Interest_entity/entityfields/status/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ef495661f151f322c852e7655df9bbb2ae22d397 --- /dev/null +++ b/entity/Interest_entity/entityfields/status/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getViewValue($KeywordRegistry.interestStatus(), vars.get("$field.STATUS"))); \ No newline at end of file diff --git a/entity/Interest_entity/entityfields/status/valueProcess.js b/entity/Interest_entity/entityfields/status/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f7e43680cde9693212cb0123d4685a3455ee1663 --- /dev/null +++ b/entity/Interest_entity/entityfields/status/valueProcess.js @@ -0,0 +1,7 @@ +import("KeywordRegistry_basic"); +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string($KeywordRegistry.interestStatus$active()); \ No newline at end of file diff --git a/entity/Interest_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js b/entity/Interest_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e99e16494cb8494d0fd4d749c57805325ae1b14b --- /dev/null +++ b/entity/Interest_entity/entityfields/statuskeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.interestStatus()); \ No newline at end of file diff --git a/entity/Interest_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/Interest_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..a1072f1cee61b8fbadeec10d4efb9826f450f69d --- /dev/null +++ b/entity/Interest_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("Keyword_lib"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.interestStatus(), "INTEREST.STATUS")); \ No newline at end of file diff --git a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod index b5a77caf977897ec0e18eeab0f316384718fc55e..c21c9e8558f3698e9184b5f1fad67a257dcfc2cc 100644 --- a/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod +++ b/entity/KeywordAttributeRelation_entity/KeywordAttributeRelation_entity.aod @@ -58,6 +58,12 @@ <fieldName>KeywordAttributeRelations</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>e6e2abfd-b504-47ff-bdb3-5927aaf9df5c</name> + <entityName>DSGVOConfiguration_entity</entityName> + <fieldName>ConfigKeywordAttributeRelation</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod index 995222aa8beb491c011f3d9ec0dc3116a4648788..41dd1030625cf58109578092224a874c04ba1507 100644 --- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod +++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod @@ -103,12 +103,6 @@ <documentation>%aditoprj%/entity/KeywordEntry_entity/entityfields/specificcontainerkeywords/documentation.adoc</documentation> <recordContainer>jDito</recordContainer> <dependencies> - <entityDependency> - <name>bb48a3ee-f340-4fd4-8c80-ef73b765ab58</name> - <entityName>Organisation_entity</entityName> - <fieldName>KeywordContactStates</fieldName> - <isConsumer v="false" /> - </entityDependency> <entityDependency> <name>4b1d1def-36d3-45e9-9ed5-eaef12d1ec82</name> <entityName>Activity_entity</entityName> @@ -343,12 +337,6 @@ <fieldName>KeywordPaymentTerm</fieldName> <isConsumer v="false" /> </entityDependency> - <entityDependency> - <name>77be3cca-8b50-4810-9549-3fd3e6fdf220</name> - <entityName>Person_entity</entityName> - <fieldName>KeywordContactStates</fieldName> - <isConsumer v="false" /> - </entityDependency> <entityDependency> <name>7945545b-f1e6-446d-84c3-ef68486652f4</name> <entityName>Contact_entity</entityName> @@ -637,6 +625,77 @@ <fieldName>KeywordPhases</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>414ad662-727b-4e9f-9e86-0659d92ec60d</name> + <entityName>DuplicatePerson_entity</entityName> + <fieldName>KeywordContactStates</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>0f8f9bfc-379c-4f05-8364-8270e718fe9a</name> + <entityName>DuplicateOrganisation_entity</entityName> + <fieldName>KeywordContactStates</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>b78c0dd7-a35c-4d9b-9a23-1a20e7e41464</name> + <entityName>DuplicateOrganisation_entity</entityName> + <fieldName>KeywordOrganisationTypes</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>98608b12-9927-4197-adfe-1398a388bcb0</name> + <entityName>WebtrackingTag_entity</entityName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>8cfca9b8-3128-4e31-bb77-358d500c4b9a</name> + <entityName>Weblink_entity</entityName> + <fieldName>KeywordLinkType</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>7a7e6cc4-3e5b-4a2b-8ed9-1e84436cac15</name> + <entityName>WeblinkTag_entity</entityName> + <fieldName>KeywordLinkTags</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>f85bfcbc-627a-4746-acc1-e228b56ab122</name> + <entityName>CommunicationSettings_entity</entityName> + <fieldName>StatusKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>d6fe81c3-fadc-444d-8962-53c64b8ecd33</name> + <entityName>CommunicationSettings_entity</entityName> + <fieldName>MediumKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>81b5b8f4-74a7-42fe-84d1-05211ddcd221</name> + <entityName>CommunicationSettings_entity</entityName> + <fieldName>ChannelTypeKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>23da94c2-910f-4b89-a92e-0826e00fe293</name> + <entityName>Interest_entity</entityName> + <fieldName>StatusKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>9afcf60e-4854-45bb-a9f9-924926be7b25</name> + <entityName>InterestLink_entity</entityName> + <fieldName>StatusKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>a4d04777-82dc-4384-a4a5-c6a4a71e7a65</name> + <entityName>CommunicationBlacklist_entity</entityName> + <fieldName>BlacklistTypeKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> <entityDependency> <name>bf774c79-2902-4fdb-a8d2-8a157294bc27</name> <entityName>Planning_entity</entityName> @@ -778,6 +837,24 @@ <fieldName>OrderedBySortingFieldKeywordsConsumer</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>815a5b03-64ec-4480-8a2b-f02077386158</name> + <entityName>Organisation_entity</entityName> + <fieldName>KeywordContactStates</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>51a15faf-a4a8-45be-8aae-416e6288439f</name> + <entityName>DSGVODeleteFlag_entity</entityName> + <fieldName>DSGVOReasonKeywords</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>a96898c5-5af2-4e91-84b0-ed079bbfbe06</name> + <entityName>Person_entity</entityName> + <fieldName>KeywordContactStates</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js index d564b4d76feb764e6f7db9d65f92c66db58a1a28..e78831577965cb8f629169b00cf80af0fae5a171 100644 --- a/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js +++ b/entity/KeywordEntry_entity/entityfields/openadminview/onActionProcess.js @@ -1,6 +1,4 @@ import("system.vars"); import("Context_lib"); -AdminViewUtils.open("AB_KEYWORD_ENTRYID", [ - ["KEYID", vars.get("$field.KEYID")] -]); \ No newline at end of file +AdminViewUtils.open("AB_KEYWORD_ENTRYID", ["KEYID", "AB_KEYWORD_CATEGORY_ID"]); \ No newline at end of file diff --git a/entity/MailLog_entity/MailLog_entity.aod b/entity/MailLog_entity/MailLog_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..37a6fcbb87d0ffe78e25a1818ff8b9d15ba206af --- /dev/null +++ b/entity/MailLog_entity/MailLog_entity.aod @@ -0,0 +1,249 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>MailLog_entity</name> + <title>Maillog</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <grantCreate v="false" /> + <grantUpdate v="false" /> + <grantDelete v="false" /> + <titlePlural>Maillogs</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>CONTACT_ID</name> + <title>Contact</title> + <consumer>Contacts</consumer> + <groupable v="true" /> + <linkedContextProcess>%aditoprj%/entity/MailLog_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess> + <mandatory v="true" /> + </entityField> + <entityField> + <name>MAILING_SUBJECT</name> + <title>Subject</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>RECIPIENT_EMAIL</name> + <title>Recipient</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>SENDER_EMAIL</name> + <title>Sender</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>OBJECT_ROWID</name> + <mandatory v="true" /> + </entityField> + <entityField> + <name>OBJECT_TYPE</name> + <mandatory v="true" /> + </entityField> + <entityField> + <name>MAIL_RUNID</name> + </entityField> + <entityField> + <name>MAIL_LOGID</name> + </entityField> + <entityField> + <name>STATUS</name> + <title>Status</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>BCC_EMAIL</name> + <mandatory v="true" /> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>PERSON_ID</name> + </entityField> + <entityField> + <name>ORGANISATION_ID</name> + </entityField> + <entityParameter> + <name>ObjectType_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ObjectRowId_param</name> + <expose v="true" /> + </entityParameter> + <entityProvider> + <name>MailLogs</name> + <dependencies> + <entityDependency> + <name>f089388e-d3b7-49b5-bcb6-69de2229b1d3</name> + <entityName>BulkMail_entity</entityName> + <fieldName>MailLogs</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + <children> + <entityParameter> + <name>ObjectType_param</name> + <valueProcess>%aditoprj%/entity/MailLog_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityProvider> + <entityField> + <name>DATE_SEND</name> + <title>Send Date</title> + <contentType>DATE</contentType> + <resolution>MINUTE</resolution> + </entityField> + <entityActionGroup> + <name>RecipientActions</name> + <children> + <entityActionField> + <name>DownloadEml</name> + <title>Download</title> + <onActionProcess>%aditoprj%/entity/MailLog_entity/entityfields/recipientactions/children/downloademl/onActionProcess.js</onActionProcess> + <isMenuAction v="true" /> + <isObjectAction v="true" /> + <isSelectionAction v="true" /> + </entityActionField> + </children> + </entityActionGroup> + <entityConsumer> + <name>Contacts</name> + <dependency> + <name>dependency</name> + <entityName>AnyContact_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>TESTRUN</name> + <title>Test Run</title> + <contentType>BOOLEAN</contentType> + </entityField> + <entityField> + <name>DATE_OPENED</name> + <title>Opening Date</title> + <contentType>DATE</contentType> + <resolution>MINUTE</resolution> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <fromClauseProcess>%aditoprj%/entity/MailLog_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/MailLog_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <orderClauseProcess>%aditoprj%/entity/MailLog_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>MAIL_LOG.CONTACT_ID</recordfield> + <isFilterable v="true" /> + <isLookupFilter v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MAILING_SUBJECT.value</name> + <recordfield>MAIL_LOG.MAILING_SUBJECT</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>RECIPIENT_EMAIL.value</name> + <recordfield>MAIL_LOG.RECIPIENT_EMAIL</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>SENDER_EMAIL.value</name> + <recordfield>MAIL_LOG.SENDER_EMAIL</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_ROWID.value</name> + <recordfield>MAIL_RUN.OBJECT_ROWID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_TYPE.value</name> + <recordfield>MAIL_RUN.OBJECT_TYPE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MAIL_RUNID.value</name> + <recordfield>MAIL_RUN.MAIL_RUNID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>MAIL_LOGID.value</name> + <recordfield>MAIL_LOG.MAIL_LOGID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.value</name> + <recordfield>MAIL_LOG.STATUS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>BCC_EMAIL.value</name> + <recordfield>MAIL_LOG.BCC_EMAIL</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PERSON_ID.value</name> + <recordfield>CONTACT.PERSON_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGANISATION_ID.value</name> + <recordfield>CONTACT.ORGANISATION_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_SEND.value</name> + <recordfield>MAIL_LOG.DATE_SEND</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>STATUS.displayValue</name> + <expression>%aditoprj%/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TESTRUN.value</name> + <recordfield>MAIL_RUN.TESTRUN</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_OPENED.value</name> + <recordfield>WEBLINK_CLICK.DATE_OPENED</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>6b1b4cc2-cdc1-4c15-a1d7-6b1236332884</name> + <tableName>MAIL_LOG</tableName> + <primaryKey>MAIL_LOGID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + <linkInformation> + <name>f3319573-943a-40e8-85b7-e01192c55c1d</name> + <tableName>MAIL_RUN</tableName> + <primaryKey>MAIL_RUNID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>04a01533-28bc-4b89-b3f2-b06b7c12f393</name> + <tableName>CONTACT</tableName> + <primaryKey>CONTACTID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>ad7f427d-fdd8-426d-b068-ce89e2dbeeda</name> + <tableName>WEBLINK_CLICK</tableName> + <primaryKey>WEBLINK_CLICKID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/MailLog_entity/entityfields/contact_id/linkedContextProcess.js b/entity/MailLog_entity/entityfields/contact_id/linkedContextProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2e48676daf3e661032b7d9aaf896c5bfbdd51e2d --- /dev/null +++ b/entity/MailLog_entity/entityfields/contact_id/linkedContextProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Contact_lib"); + +result.string(ContactUtils.getContextByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID"))); \ No newline at end of file diff --git a/entity/MailLog_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js b/entity/MailLog_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e8b4e72e74a0a4696ff39e83135aa6100ef908c0 --- /dev/null +++ b/entity/MailLog_entity/entityfields/maillogs/children/objecttype_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.getCurrentContextId()); diff --git a/entity/MailLog_entity/entityfields/recipientactions/children/downloademl/onActionProcess.js b/entity/MailLog_entity/entityfields/recipientactions/children/downloademl/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..ec52de0578cce8142d206552c2e34f5a18bca2de --- /dev/null +++ b/entity/MailLog_entity/entityfields/recipientactions/children/downloademl/onActionProcess.js @@ -0,0 +1,5 @@ +import("system.neon"); +import("system.vars"); +import("Bulkmail_lib"); + +neon.download(BulkMailUtils.getEmlFile(vars.get("$field.OBJECT_ROWID"), vars.get("$field.MAIL_RUNID"), vars.get("$field.MAIL_LOGID")),"test.eml"); diff --git a/entity/MailLog_entity/recordcontainers/db/conditionProcess.js b/entity/MailLog_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..3abd921bd5cf8ea0a7ad4d1a8ca63ee6e7222037 --- /dev/null +++ b/entity/MailLog_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,7 @@ +import("system.result"); +import("Sql_lib"); + +var cond = newWhereIfSet("MAIL_RUN.OBJECT_TYPE", "$param.ObjectType_param") + .andIfSet("MAIL_RUN.OBJECT_ROWID", "$param.ObjectRowId_param"); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/MailLog_entity/recordcontainers/db/fromClauseProcess.js b/entity/MailLog_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..5403f0c7eeded52578dbbf92b605b1a5fa2c4081 --- /dev/null +++ b/entity/MailLog_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +result.string("MAIL_LOG join MAIL_RUN on MAIL_LOG.MAIL_RUN_ID = MAIL_RUN.MAIL_RUNID\n\ + join CONTACT on CONTACT.CONTACTID = MAIL_LOG.CONTACT_ID\n\ + left join WEBLINK_CLICK on WEBLINK_CLICK.WEBLINK_CLICKID = MAIL_LOG.OPENER_LINK_CLICK_ID"); \ No newline at end of file diff --git a/entity/MailLog_entity/recordcontainers/db/orderClauseProcess.js b/entity/MailLog_entity/recordcontainers/db/orderClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..294f3ffbb2105339dab7ddf91efefc4ccc903f36 --- /dev/null +++ b/entity/MailLog_entity/recordcontainers/db/orderClauseProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("system.db"); + +result.object({"MAIL_LOG.DATE_SEND": db.DESCENDING}); \ No newline at end of file diff --git a/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js b/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..72d1600cff8a2f7f9cd33dd3551e372cdec7790c --- /dev/null +++ b/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js @@ -0,0 +1,4 @@ +import("Contact_lib"); +import("system.result"); + +result.string(ContactUtils.getResolvingDisplaySubSql("MAIL_LOG.CONTACT_ID")); \ No newline at end of file diff --git a/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js b/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..7ea51e488a10108e55122b9f9f0f3b8cdca09e93 --- /dev/null +++ b/entity/MailLog_entity/recordcontainers/db/recordfieldmappings/status.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string( KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.bulkMailRecipientStatus(), "MAIL_LOG.STATUS")); diff --git a/entity/Member_entity/Member_entity.aod b/entity/Member_entity/Member_entity.aod index 2352659698a9a46d1b461716f2e1ec4289f38284..1db580cf75752e04b8a82ba431f103da3b9ce518 100644 --- a/entity/Member_entity/Member_entity.aod +++ b/entity/Member_entity/Member_entity.aod @@ -321,6 +321,12 @@ <name>ObjectSubType_param</name> <expose v="true" /> </entityParameter> + <entityField> + <name>PERSON_ATTR_LOYALTY</name> + <title>Loyalty</title> + <groupable v="true" /> + <displayValueProcess>%aditoprj%/entity/Member_entity/entityfields/person_attr_loyalty/displayValueProcess.js</displayValueProcess> + </entityField> </entityFields> <recordContainers> <dbRecordContainer> @@ -420,6 +426,10 @@ <recordfield>OBJECTMEMBER.ONSITE</recordfield> <isFilterable v="true" /> </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PERSON_ATTR_LOYALTY.value</name> + <expression>%aditoprj%/entity/Member_entity/recordcontainers/db/recordfieldmappings/person_attr_loyalty.value/expression.js</expression> + </dbRecordFieldMapping> </recordFieldMappings> <linkInformation> <linkInformation> @@ -533,6 +543,9 @@ <jDitoRecordFieldMapping> <name>MST_MEMBERROLE.value</name> </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>PERSON_ATTR_LOYALTY.value</name> + </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/Member_entity/entityfields/person_attr_loyalty/displayValueProcess.js b/entity/Member_entity/entityfields/person_attr_loyalty/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b8857b8ffd70bbb62ff1dce0e3eff18072071bc1 --- /dev/null +++ b/entity/Member_entity/entityfields/person_attr_loyalty/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.translate"); +import("system.result"); + +result.string(translate.text(vars.get("$this.value"))); diff --git a/entity/Member_entity/recordcontainers/db/recordfieldmappings/person_attr_loyalty.value/expression.js b/entity/Member_entity/recordcontainers/db/recordfieldmappings/person_attr_loyalty.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..16ce5832a5e2bbd32e7488db9bf20bb5611f8211 --- /dev/null +++ b/entity/Member_entity/recordcontainers/db/recordfieldmappings/person_attr_loyalty.value/expression.js @@ -0,0 +1,12 @@ +import("Attribute_lib"); +import("AttributeRegistry_basic"); +import("Sql_lib"); +import("system.result"); + +var attrSql = newSelect("COMBOVAL.ATTRIBUTE_NAME") + .from("AB_ATTRIBUTERELATION") + .join("AB_ATTRIBUTE", "AB_ATTRIBUTE_ID = AB_ATTRIBUTE.AB_ATTRIBUTEID") + .leftJoin("AB_ATTRIBUTE COMBOVAL", AttributeTypes.COMBO.databaseField + " = COMBOVAL.AB_ATTRIBUTEID") + .where("AB_ATTRIBUTERELATION.OBJECT_ROWID = OBJECTMEMBER.CONTACT_ID") + .and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", $AttributeRegistry.loyalty()); +result.string("(" + attrSql.toString() + ")"); diff --git a/entity/Member_entity/recordcontainers/jdito/contentProcess.js b/entity/Member_entity/recordcontainers/jdito/contentProcess.js index 6a0466b6f9cb9866935d6039e83c9f64148033ae..707685adc1efda30c4003bf494fe1876533334a4 100644 --- a/entity/Member_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/Member_entity/recordcontainers/jdito/contentProcess.js @@ -1,3 +1,4 @@ +import("AttributeRegistry_basic"); import("Util_lib"); import("system.translate"); import("system.result"); @@ -17,7 +18,7 @@ var memberLoadingConfig = entities.createConfigForLoadingRows() "MEMBERROLE", "MEMBERROLE.displayValue", "OBJECT_ROWID", "OBJECT_TYPE", "OBJECTMEMBERID", "ORG_ORGID", "ORGANISATION_NAME", "PERSON_FIRSTNAME", "PERSON_FULL_NAME", "PERSON_LASTNAME", "PERSON_PERSID", "PERSON_SALUTATION", "PERSON_TITLE", "POSITION", "TARGETCONTEXT", - "recordType", "MST_MEMBERROLE"]); + "recordType", "MST_MEMBERROLE", "PERSON_ATTR_LOYALTY"]); if (idValues) { @@ -56,7 +57,8 @@ memberRows = memberRows.map(function(row) row["POSITION"], row["TARGETCONTEXT"], row["recordType"], - row["MST_MEMBERROLE"] + row["MST_MEMBERROLE"], + row["PERSON_ATTR_LOYALTY"] ]; }); @@ -150,7 +152,11 @@ if (Utils.isNullOrEmpty(idValues) || memberRows.length === 0) persRows[counter][7], null, "DistrictResponsible", - "" + "", + (new AttributeRelationQuery( + row[3], + $AttributeRegistry.loyalty() + ).includeDisplayValue().getSingleAttribute() || {displayValue: ""}).displayValue ]); }); } diff --git a/entity/Offer_entity/contentDescriptionProcess.js b/entity/Offer_entity/contentDescriptionProcess.js index f1afab18db7ad38a661329de19f0554dac92285c..57c6fc7fc6df77618a3524295f67a7edef4b7236 100644 --- a/entity/Offer_entity/contentDescriptionProcess.js +++ b/entity/Offer_entity/contentDescriptionProcess.js @@ -6,7 +6,7 @@ import("system.vars"); import("system.result"); var res = [translate.text("Total gross") + ": " + vars.get("$field.TotalGross.displayValue"), - translate.text("Probability") + ": " + vars.get("$field.PROBABILITY.displayValue"), + translate.text("Probability") + ": " + vars.get("$field.PROBABILITY") + "%", translate.text("Creation date") + ": " + datetime.toDate(vars.get("$field.DATE_NEW"), translate.text("dd.MM.yyyy"))]; result.string(res.join(" | ")); \ No newline at end of file diff --git a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js index 820659874926c9870e401c3898695443e6c2a075..c9be3c889870754bed49436e6818a86aebc8ca22 100644 --- a/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js +++ b/entity/Offer_entity/entityfields/offerreportdispatch/children/dispatchofferreport/onActionProcess.js @@ -16,7 +16,6 @@ var notificationMsg = translate.text("The status of the offer was changed to \"s var contactId = vars.get("$field.CONTACT_ID"); var arrayReport = OfferUtils.buildOfferReport(vars.get("$field.OFFERID")); var emailFilename = translate.text("Offerrequest"); -var offerId = vars.get("$field.OFFERID") var additionalPlaceholders = [ new Placeholder("offerCode", Placeholder.types.FIXEDVALUE, vars.get("$field.FullOfferCode")) ]; @@ -29,4 +28,5 @@ offerReport.filename = translate.text("Offer No.") + vars.get("$field.#CONTENTTI attachmentArray[0] = offerReport; -EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Offer", notificationMsg, emailFilename, additionalPlaceholders, updateStatements); +EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Offer", notificationMsg, emailFilename, additionalPlaceholders, updateStatements, + $KeywordRegistry.documentTemplateTypeCategory$single()); diff --git a/entity/Offer_entity/entityfields/probability/valueProcess.js b/entity/Offer_entity/entityfields/probability/valueProcess.js index ad82690b022e8c95df71cc2a924d30b643efcacc..72e0517304f96f7d2aa94f10a9e938d71b4fef50 100644 --- a/entity/Offer_entity/entityfields/probability/valueProcess.js +++ b/entity/Offer_entity/entityfields/probability/valueProcess.js @@ -2,7 +2,7 @@ import("system.neon"); import("system.result"); import("system.vars"); -if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) { result.string("0.00"); } \ No newline at end of file diff --git a/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js b/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js index 7310f91eb38e14a7e2bf37c40acaec12e1e58116..e78ed8f9e28022f4232709ca1a9c97cbea10b41d 100644 --- a/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Offeritem_entity/recordcontainers/db/onDBInsert.js @@ -16,34 +16,25 @@ if(oid != "") var insertStatements = JSON.parse(vars.get("$field.itemInsertStatements"));//insert statements get set by insertPartsList in the onvalueChanges of product_id and quantity var statements = []; - if(insertStatements) - { - statements = statements.concat(insertStatements); - } //update offer price var vals = oiUtils.getNetAndVat(); var discountedVals = OfferItemUtils.getDiscountedNet(null, oid, discount); if(discountedVals) { - insertStatements.push( - newWhere("OFFERITEM.OFFERITEMID", rowdata["OFFERITEM.OFFERITEMID"]).buildUpdateStatement({ - "NET": vals[0], - "VAT": vals[1], - "DISCOUNTED_NET": discountedVals[0], - "DISCOUNTED_VAT": discountedVals[1] - }) - ) + statements.push( + newWhere("OFFER.OFFERID", rowdata["OFFERITEM.OFFER_ID"]).buildUpdateStatement({ + "NET": vals[0], + "VAT": vals[1], + "DISCOUNTED_NET": discountedVals[0], + "DISCOUNTED_VAT": discountedVals[1] + }) + ) } - else + + if(insertStatements) { - insertStatements.push( - newWhere("OFFERITEMID", rowdata["OFFERITEM.OFFERITEMID"]) - .buildUpdateStatement({ - "NET": vals[0], - "VAT": vals[1] - }) - ) + statements = statements.concat(insertStatements); } db.execute(statements, "Data_alias", 10000000); diff --git a/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js b/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js index 53225e7adf9f1876a1494a42cda2bf08e726f5b0..ae3cb6d2522110a36f98cf2dfd10124bd90fe50c 100644 --- a/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js +++ b/entity/Order_entity/entityfields/orderreportdispatch/children/dispatchorderreport/onActionProcess.js @@ -2,6 +2,7 @@ import("system.question"); import("system.translate"); import("system.vars"); import("system.db"); +import("KeywordRegistry_basic"); import("MimeType_lib"); import("Email_lib"); import("Sql_lib"); @@ -13,10 +14,7 @@ var notificationMsg = translate.text("The status of the order was changed to \"s var contactId = vars.get("$field.CONTACT_ID"); var orgContactId = vars.get("$field.CONTACT_ORG_ID"); var reportData = vars.get("$field.ORDER_REPORT_DATA"); -var emailFilename = vars.get("$field.#CONTENTTITLE"); -var orderNo = emailFilename.substring(emailFilename.indexOf(" ", 0)+1, emailFilename.length); -emailFilename = emailFilename.substring(0, emailFilename.indexOf(" ", 0)); -emailFilename = emailFilename + " " + orderNo; +var emailFilename = vars.get("$field.ORDERTYPE.displayValue") + " " + vars.get("$field.SALESORDERCODE"); if (contactId == null || "") contactId = orgContactId; @@ -27,4 +25,4 @@ orderReport.filename = emailFilename + ".pdf"; attachmentArray[0] = orderReport; -EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Order", notificationMsg, emailFilename, null, updateStatements); +EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Order", notificationMsg, emailFilename, null, updateStatements, $KeywordRegistry.documentTemplateTypeCategory$single()); diff --git a/entity/Order_entity/entityfields/reminderreportdispatch/children/dispatchreminderreport/onActionProcess.js b/entity/Order_entity/entityfields/reminderreportdispatch/children/dispatchreminderreport/onActionProcess.js index 7538162cacd9d49220e1ded198b3293f6dc46564..17b33080116cffcaee2512c24b460a663eb8e478 100644 --- a/entity/Order_entity/entityfields/reminderreportdispatch/children/dispatchreminderreport/onActionProcess.js +++ b/entity/Order_entity/entityfields/reminderreportdispatch/children/dispatchreminderreport/onActionProcess.js @@ -2,6 +2,7 @@ import("system.question"); import("system.translate"); import("system.vars"); import("system.db"); +import("KeywordRegistry_basic"); import("MimeType_lib"); import("Email_lib"); import("Order_lib"); @@ -25,4 +26,5 @@ orderReport.filename = emailFilename + ".pdf"; attachmentArray[0] = orderReport; -EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Order", null, emailFilename, null, null); +EmailWritingUtils.sendReportAsMail(contactId, attachmentArray, "Order", null, emailFilename, null, null, + $KeywordRegistry.documentTemplateTypeCategory$single()) diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod index be40c333adc19fbc28ccd8715d0596b2f151a47f..e0b542fa6018fa159f9893c39c7452b98f2dd6c9 100644 --- a/entity/Organisation_entity/Organisation_entity.aod +++ b/entity/Organisation_entity/Organisation_entity.aod @@ -186,6 +186,12 @@ <fieldName>OrganisationConsumer</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>fa1b6124-1e00-4fa0-8c04-debc19f58d95</name> + <entityName>DuplicatePerson_entity</entityName> + <fieldName>Organisations</fieldName> + <isConsumer v="false" /> + </entityDependency> <entityDependency> <name>640a8509-1972-4dc5-980e-68832f1c03c5</name> <entityName>Planning_entity</entityName> @@ -226,14 +232,6 @@ <name>AttributeId_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>MapViewAdditionalFeatures_param</name> <expose v="false" /> @@ -460,7 +458,7 @@ <dependency> <name>dependency</name> <entityName>KeywordEntry_entity</entityName> - <fieldName>SpecificContainerKeywords</fieldName> + <fieldName>OrderedBySortingFieldKeywords</fieldName> </dependency> <children> <entityParameter> @@ -468,6 +466,10 @@ <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess> <expose v="false" /> </entityParameter> + <entityParameter> + <name>BlacklistIds_param</name> + <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js</valueProcess> + </entityParameter> </children> </entityConsumer> <entityConsumer> @@ -699,14 +701,6 @@ <name>ExcludedContactIds_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>MapViewAdditionalFeatures_param</name> <expose v="false" /> @@ -770,14 +764,6 @@ <name>ExcludedContactIds_param</name> <expose v="true" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>MapViewAdditionalFeatures_param</name> <expose v="false" /> @@ -955,65 +941,10 @@ <colorProcess>%aditoprj%/entity/Organisation_entity/entityfields/lastactivity/colorProcess.js</colorProcess> <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/lastactivity/valueProcess.js</valueProcess> </entityField> - <entityProvider> - <name>SelfDuplicates</name> - <documentation>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicates/documentation.adoc</documentation> - <titlePlural>Duplicates</titlePlural> - <children> - <entityParameter> - <name>AttributeId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>AttributeKeyId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>FilterPreSet_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OrganisationType_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>WithPrivate_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OnlyOwnSupervised_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>ExcludeOrganisationsByPersonId</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewAdditionalFeatures_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewCenterLat_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewCenterLon_param</name> - <expose v="false" /> - </entityParameter> - </children> - </entityProvider> <entityParameter> <name>OnlyShowContactIds_param</name> <expose v="true" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="true" /> - </entityParameter> <entityField> <name>STANDARD_COUNTRY</name> <title>Standard Country</title> @@ -1023,33 +954,6 @@ <name>OnlyOwnSupervised_param</name> <expose v="true" /> </entityParameter> - <entityConsumer> - <name>SelfDuplicatesUncached</name> - <dependency> - <name>dependency</name> - <entityName>Organisation_entity</entityName> - <fieldName>SelfDuplicates</fieldName> - </dependency> - <children> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js</valueProcess> - <title></title> - </entityParameter> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ExcludedContactIds_param</name> - <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> <entityConsumer> <name>CommRestrictions</name> <dependency> @@ -1153,14 +1057,6 @@ <name>AttributeKeyId_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>ExcludedContactIds_param</name> <expose v="false" /> @@ -1226,10 +1122,6 @@ <name>OnlyShowContactIds_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>ExcludeOrganisationsByPersonId</name> <expose v="false" /> @@ -1282,52 +1174,6 @@ <name>FilterPreSet_param</name> <expose v="true" /> </entityParameter> - <entityProvider> - <name>NonselfDuplicates</name> - <documentation>%aditoprj%/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc</documentation> - <dependencies> - <entityDependency> - <name>2e410b9e-5ebc-48ea-9562-da386202d7e8</name> - <entityName>Duplicates_entity</entityName> - <fieldName>DuplicateOrganisationsConsumer</fieldName> - <isConsumer v="false" /> - </entityDependency> - </dependencies> - <children> - <entityParameter> - <name>AttributeKeyId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>ExcludedContactIds_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>OnlyOwnSupervised_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewAdditionalFeatures_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewCenterLon_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>MapViewCenterLat_param</name> - <expose v="false" /> - </entityParameter> - </children> - </entityProvider> <entityConsumer> <name>AttributesFilter</name> <dependency> @@ -1526,52 +1372,6 @@ <iconId>VAADIN:ENVELOPE</iconId> <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/newletter/stateProcess.js</stateProcess> </entityActionField> - <entityActionGroup> - <name>DuplicateActions</name> - <title>Duplicate actions</title> - <state>AUTO</state> - <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/stateProcess.js</stateProcess> - <children> - <entityActionField> - <name>IntegrateSelectedIntoCurrentAction</name> - <title>Integrate selected into current contact</title> - <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>NEON:IMPORT</iconId> - <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IntegrateCurrentIntoSelectedAction</name> - <title>Integrate current into selected contact</title> - <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>NEON:EXPORT</iconId> - <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IgnoreDuplicate</name> - <title>Ignore Duplicate</title> - <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>VAADIN:CLOSE</iconId> - <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IgnoreWholeCluster</name> - <title>Ignore whole Cluster</title> - <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js</onActionProcess> - <isObjectAction v="false" /> - <iconId>VAADIN:CLOSE</iconId> - <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js</stateProcess> - </entityActionField> - </children> - </entityActionGroup> <entityActionField> <name>startWorkflow</name> <title>Start workflow</title> @@ -1629,6 +1429,22 @@ <iconId>VAADIN:CURLY_BRACKETS</iconId> <stateProcess>%aditoprj%/entity/Organisation_entity/entityfields/openadminview/stateProcess.js</stateProcess> </entityActionField> + <entityConsumer> + <name>Duplicates</name> + <selectionMode>MULTI</selectionMode> + <selectionModeProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicates/selectionModeProcess.js</selectionModeProcess> + <dependency> + <name>dependency</name> + <entityName>DuplicateOrganisation_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + <children> + <entityParameter> + <name>Obj_param</name> + <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/duplicates/children/obj_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> <entityConsumer> <name>Plannings</name> <dependency> @@ -1787,11 +1603,13 @@ </dbRecordFieldMapping> <dbRecordFieldMapping> <name>STANDARD_EMAIL_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression> <isFilterable v="false" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> <dbRecordFieldMapping> <name>STANDARD_PHONE_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression> <isFilterable v="false" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> @@ -1943,6 +1761,13 @@ <filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/responsibleassignment/filterConditionProcess.js</filterConditionProcess> <filtertype>EXTENDED</filtertype> </filterExtension> + <filterExtension> + <name>Duplicates_filter</name> + <title>Duplicates</title> + <contentType>NUMBER</contentType> + <filterConditionProcess>%aditoprj%/entity/Organisation_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js</filterConditionProcess> + <filtertype>BASIC</filtertype> + </filterExtension> <filterExtension> <name>Communication_Mail_filter</name> <title>Communication: Mail</title> diff --git a/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js b/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js index 04b4079531ba7cc7a965aa5162e950e6213ecfdf..e02b6634f4b41a21ddba3d197f3429978f4fb0c9 100644 --- a/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js +++ b/entity/Organisation_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js @@ -1,7 +1,21 @@ +import("Entity_lib"); import("system.logging"); import("system.vars"); import("system.result"); +//references needed for auto refresh: +"$field.Addresses.insertedRows"; +"$field.Addresses.changedRows"; +"$field.Addresses.deletedRows"; + var country = vars.get("$field.STANDARD_COUNTRY"); if (country) - result.string(country); \ No newline at end of file +{ + result.string(country); +} +else +{ + var addressRows = EntityConsumerRowsHelper.getCurrentConsumerRows("Addresses", ["COUNTRY"]); + if(addressRows.length > 0) + result.string(addressRows[0]["COUNTRY"]); +} diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js deleted file mode 100644 index c9289cbd0ef896d7dbcf5eae668bac8a87e861da..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js +++ /dev/null @@ -1,10 +0,0 @@ -import("system.neon"); -import("system.vars"); -import("DuplicateScanner_lib"); - -let sourceContactId = vars.get("$param.DuplicateCurrentContactId_param"); -let selectedContactId = vars.get("$sys.selection"); -let clusterId = DuplicateScannerUtils.getClusterId(sourceContactId); -DuplicateScannerUtils.createUnrelatedDuplicateRelation(sourceContactId, selectedContactId, clusterId); - -neon.refreshAll(); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js deleted file mode 100644 index 99d7f55925b3fed54dc2d5e20604793b6e9fd862..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js +++ /dev/null @@ -1,21 +0,0 @@ -import("system.logging"); -import("system.neon"); -import("system.vars"); -import("DuplicateScanner_lib"); -import("system.notification"); - -let contactId = vars.get("$field.CONTACTID"); -let clusterId = DuplicateScannerUtils.getClusterId(contactId); - -let duplicateContactIdsInClusterRay = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterId) - -if(duplicateContactIdsInClusterRay.length > 1) -{ - let referenceDuplicateId = duplicateContactIdsInClusterRay[0]; - for (let i = 1; i < duplicateContactIdsInClusterRay.length; i++) - { - DuplicateScannerUtils.createUnrelatedDuplicateRelation(referenceDuplicateId, duplicateContactIdsInClusterRay[i], clusterId); - } -} - - diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js deleted file mode 100644 index fdd913ad06bf2815da3127d405d21b258c4ad795..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "2")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicateactions/stateProcess.js b/entity/Organisation_entity/entityfields/duplicateactions/stateProcess.js deleted file mode 100644 index 5b8b24021ddfcba34a258bf7af7d4ec5ec65852a..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/duplicateactions/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState == null || actionState == "0")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/duplicates/children/obj_param/valueProcess.js b/entity/Organisation_entity/entityfields/duplicates/children/obj_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..39bdfae5361be160d838627fc4e4de2d45eb9b82 --- /dev/null +++ b/entity/Organisation_entity/entityfields/duplicates/children/obj_param/valueProcess.js @@ -0,0 +1,20 @@ +import("system.vars"); +import("system.result"); + +result.string(JSON.stringify({ + CONTACTID: vars.get("$field.CONTACTID"), + NAME: vars.get("$field.NAME"), + ADDRESS_ID: vars.get("$field.ADDRESS_ID"), + CUSTOMERCODE: vars.get("$field.CUSTOMERCODE"), + LANGUAGE: vars.get("$field.LANGUAGE"), + TYPE: vars.get("$field.TYPE"), + STATUS: vars.get("$field.STATUS"), + STANDARD_ADDRESS: vars.get("$field.STANDARD_ADDRESS"), + STANDARD_CITY: vars.get("$field.STANDARD_CITY"), + STANDARD_COUNTRY: vars.get("$field.STANDARD_COUNTRY"), + STANDARD_EMAIL_COMMUNICATION: vars.get("$field.STANDARD_EMAIL_COMMUNICATION"), + STANDARD_LAT: vars.get("$field.STANDARD_LAT"), + STANDARD_LON: vars.get("$field.STANDARD_LON"), + STANDARD_PHONE_COMMUNICATION: vars.get("$field.STANDARD_PHONE_COMMUNICATION"), + STANDARD_ZIP: vars.get("$field.STANDARD_ZIP") +})); diff --git a/entity/Organisation_entity/entityfields/duplicates/selectionModeProcess.js b/entity/Organisation_entity/entityfields/duplicates/selectionModeProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c92317456ba1a7476401171e875526c8eff6fa76 --- /dev/null +++ b/entity/Organisation_entity/entityfields/duplicates/selectionModeProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); +import("system.neon"); + +result.string( + vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || + vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT ? + "NONE" : "MULTI" +); diff --git a/entity/Organisation_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js b/entity/Organisation_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a52cc0873588ad599c0efe525b8ec15716c7ec07 --- /dev/null +++ b/entity/Organisation_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.object([$KeywordRegistry.contactStatus$markToDelete()]); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/newemail/onActionProcess.js b/entity/Organisation_entity/entityfields/newemail/onActionProcess.js index a46efc111ddcfd413f0dcfff1c46e9fc6562b64e..ae42fcf1dfba4735bfe64eff2b80bfc9b7fb2686 100644 --- a/entity/Organisation_entity/entityfields/newemail/onActionProcess.js +++ b/entity/Organisation_entity/entityfields/newemail/onActionProcess.js @@ -2,4 +2,5 @@ import("system.vars"); import("Email_lib"); import("KeywordRegistry_basic"); -EmailWritingUtils.openNewMail(vars.getString("$field.CONTACTID"), null, vars.get("$sys.currentcontextname"), null, null, null, null, null, $KeywordRegistry.documentTemplateTypeCategory$single()); \ No newline at end of file +EmailWritingUtils.openNewMail(vars.getString("$field.CONTACTID"), null, vars.get("$sys.currentcontextname"), null, null, null, null, null, + $KeywordRegistry.documentTemplateTypeCategory$single()); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/newemail/stateProcess.js b/entity/Organisation_entity/entityfields/newemail/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Organisation_entity/entityfields/newemail/stateProcess.js +++ b/entity/Organisation_entity/entityfields/newemail/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc b/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc deleted file mode 100644 index dc35980c12405163da2417e0472197dd9e3c7285..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/nonselfduplicates/documentation.adoc +++ /dev/null @@ -1,3 +0,0 @@ -Provides organisation duplicate-records without the `Organisation_entity` scope, for example for the `Duplicates_entity`. - -The provider is named `NonselfDuplicates` to differentiate this provider and the `SelfDuplicates`-provider. \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/orgreportdispatch/children/dispatchorgreport/onActionProcess.js b/entity/Organisation_entity/entityfields/orgreportdispatch/children/dispatchorgreport/onActionProcess.js index ca54b8d0ce3503663165304eea9856fae5ff423c..f5b721ea2e143660d01fa2502a898d7154263f09 100644 --- a/entity/Organisation_entity/entityfields/orgreportdispatch/children/dispatchorgreport/onActionProcess.js +++ b/entity/Organisation_entity/entityfields/orgreportdispatch/children/dispatchorgreport/onActionProcess.js @@ -1,8 +1,9 @@ import("system.logging"); -import("Organisation_lib"); import("system.translate"); import("system.vars"); import("system.db"); +import("KeywordRegistry_basic"); +import("Organisation_lib"); import("MimeType_lib"); import("Email_lib"); import("Order_lib"); @@ -21,4 +22,5 @@ orgReport.filename = emailFilename + ".pdf"; attachmentArray[0] = orgReport; -EmailWritingUtils.sendReportAsMail(orgContactId, attachmentArray, "Organisation", null, emailFilename, null, null); +EmailWritingUtils.sendReportAsMail(orgContactId, attachmentArray, "Organisation", null, emailFilename, null, null, + $KeywordRegistry.documentTemplateTypeCategory$single()) diff --git a/entity/Organisation_entity/entityfields/selfduplicates/documentation.adoc b/entity/Organisation_entity/entityfields/selfduplicates/documentation.adoc deleted file mode 100644 index 396162acb9e2db72c8c1090f4fdda9eb84a95738..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/selfduplicates/documentation.adoc +++ /dev/null @@ -1 +0,0 @@ -Provides organisation duplicate-records within the `Organisation_entity` scope itself. \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js b/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js deleted file mode 100644 index 81570217c3ecd3cf76deb5e14d7ac0a6121a59bb..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("1");//todo use keyword \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js b/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js deleted file mode 100644 index 849632882bbabd4e65dfb25c7dc984366bde5116..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js +++ /dev/null @@ -1,7 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.result"); -import("DuplicateScanner_lib"); - -let unrelatedIds = DuplicateScannerUtils.getUnrelatedRelationsForDuplicate(vars.get("$field.CONTACTID")); -result.string(JSON.stringify(unrelatedIds)); \ No newline at end of file diff --git a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js b/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js deleted file mode 100644 index 77f449d52a0995e5bb7e8ba94746a1659bf36001..0000000000000000000000000000000000000000 --- a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js +++ /dev/null @@ -1,55 +0,0 @@ -import("system.project"); -import("system.indexsearch"); -import("system.vars"); -import("DuplicateScanner_lib"); -import("system.result"); - -var scannerName = "OrganisationDuplicates"; -var targetEntity = "Organisation_entity"; -var valuesToCheck = {}; -var entityFieldsToLoad = DuplicateScannerUtils.getEntityFieldObjectFromConfig(scannerName, targetEntity); - -var idsForEmptyResult = JSON.stringify(["nodata"]); - -if (entityFieldsToLoad == null) - result.string(idsForEmptyResult); -else -{ - //Read the values of all available entity fields and write the fieldname7value combination - //as key/value pairs into an object. This is used to trigger the scan for duplicates - - vars.get("$field.NAME") - vars.get("$field.STANDARD_CITY"); - vars.get("$field.STANDARD_ZIP"); - vars.get("$field.STANDARD_ADDRESS"); - - var allFieldsToLoad = entityFieldsToLoad.entityFields.concat(entityFieldsToLoad.entityIdField); - allFieldsToLoad.forEach(function (field) - { - var fieldValue = vars.get("$field." + field); - if (fieldValue) - valuesToCheck[field] = fieldValue; - }); - - var scanResults = []; - - //don't search if only the id field has a value - var fieldsToCheck = Object.keys(valuesToCheck); - if (!(fieldsToCheck.length === 0 || (fieldsToCheck.length === 1 && entityFieldsToLoad.entityIdField in valuesToCheck))) - scanResults = DuplicateScannerUtils.scanForDuplicates(scannerName, targetEntity, valuesToCheck, null) || []; - - var duplicateIds = scanResults.map(function (scanResult) - { - return scanResult[indexsearch.FIELD_ID]; - }); - - /* - * To achieve that if there are no duplicates, no contacts should be shown and therefore returned by the - * recordcontainer, an invalid id gets returned. It then is used in the conditionProcess to load the duplicates. - * Because of its invalidity, no records are shown. - */ - if (duplicateIds.length == 0) - result.string(idsForEmptyResult); - else - result.string(JSON.stringify(duplicateIds)); -} \ No newline at end of file diff --git a/entity/Organisation_entity/initFilterProcess.js b/entity/Organisation_entity/initFilterProcess.js index 936a623f599055fc4fb5fa81c850fc7d323bff22..afecc1ede02d6f412681545610696b1efa17dc90 100644 --- a/entity/Organisation_entity/initFilterProcess.js +++ b/entity/Organisation_entity/initFilterProcess.js @@ -5,15 +5,10 @@ import("KeywordRegistry_basic"); import("system.result"); var filter = vars.get("$param.FilterPreSet_param"); - -var res; -if (filter) - res = filter; -else if (vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) +if(!filter && vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) { var statusInactive = $KeywordRegistry.contactStatus$inactive(); - - filter = { + filter = JSON.stringify({ type: "group", operator: "AND", childs: [{ @@ -24,9 +19,9 @@ else if (vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FIL key: statusInactive, value: KeywordUtils.getViewValue($KeywordRegistry.contactStatus(), statusInactive) }] - }; - res = JSON.stringify(filter); + }); +} +if(filter) +{ + result.string(filter); } - -if (res) - result.string(res); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js b/entity/Organisation_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..96f185ae76701ab39777fe91db3d18baf328b614 --- /dev/null +++ b/entity/Organisation_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js @@ -0,0 +1,16 @@ +import("system.result"); +import("Sql_lib"); +import("system.vars"); +import("DuplicateScanner_lib"); + +var sqlOperator = SqlUtils.getSqlConditionalOperator(vars.get("$local.operator")); + +result.string(newWhere( + "CONTACT.CONTACTID", + DuplicateScannerUtils.getDuplicateConditionalListSql( + ["Organisation_entity"], + vars.get("$local.rawvalue"), + sqlOperator, true + ), + SqlBuilder.IN() +)); diff --git a/entity/Organisation_entity/recordcontainers/db/onDBDelete.js b/entity/Organisation_entity/recordcontainers/db/onDBDelete.js index 00e50690d485216c4b4956f416b688ab433e68a8..320f4e3329fa4fd7195da03495b3cd7e5812a9d6 100644 --- a/entity/Organisation_entity/recordcontainers/db/onDBDelete.js +++ b/entity/Organisation_entity/recordcontainers/db/onDBDelete.js @@ -7,7 +7,7 @@ import("Attribute_lib"); // TODO: enable when duplicate-module is finalized let contactId = vars.get("$field.CONTACTID"); -DuplicateScannerUtils.deleteCachedDuplicate(contactId); +DuplicateScannerUtils.deleteHasDuplicateEntries("Organisation_entity", [contactId]); new AttributeRelationQuery(contactId, null, ContextUtils.getCurrentContextId()) .deleteAllAttributes(); diff --git a/entity/Organisation_entity/recordcontainers/db/onDBInsert.js b/entity/Organisation_entity/recordcontainers/db/onDBInsert.js index 60299cd7d4eda2ceed743571cec9cbda912ad318..c8db8fdecb72ba18f14ae3fd3a5bd05223ac2396 100644 --- a/entity/Organisation_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Organisation_entity/recordcontainers/db/onDBInsert.js @@ -1,5 +1,8 @@ import("system.vars"); import("Workflow_lib"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateHasDuplicateEntry("Organisation_entity"); //start the execution in afterOperatingState, because here the dataset is not yet inserted vars.set("$context.workflowQueue", {}); diff --git a/entity/Organisation_entity/recordcontainers/db/onDBUpdate.js b/entity/Organisation_entity/recordcontainers/db/onDBUpdate.js index 9f0337793c84207f61013809345f829d1f874671..737768cc8678c59374d99e790f4956812e3661db 100644 --- a/entity/Organisation_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/Organisation_entity/recordcontainers/db/onDBUpdate.js @@ -6,6 +6,9 @@ import("Communication_lib"); import("Entity_lib"); import("Workflow_lib"); import("KeywordRegistry_basic"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateHasDuplicateEntry("Organisation_entity"); // TODO: this is a workaround for missing possibility to react on changes of fields not connected to record Contqainer #1030023 var rowdata = vars.get("$local.rowdata"); diff --git a/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js b/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..41ef07ff58ec51eda018bed12cb5b0b2b657c348 --- /dev/null +++ b/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Communication_lib"); + +var res = CommUtil.getStandardSubSqlMail(); +result.string(res); \ No newline at end of file diff --git a/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..320ae40ad1ba794b4e759037fa0f382b9af67696 --- /dev/null +++ b/entity/Organisation_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Communication_lib"); + +var res = CommUtil.getStandardSubSqlPhone(); +result.string(res); \ No newline at end of file diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod index d318ebbdde32ccfe73c757d1e904246333556526..308a22e1ef75d0cb10729aac9523990c8a024689 100644 --- a/entity/Person_entity/Person_entity.aod +++ b/entity/Person_entity/Person_entity.aod @@ -8,6 +8,7 @@ <siblings> <element>Address_entity</element> <element>Contact_entity</element> + <element>DSGVODeleteFlag_entity</element> </siblings> <grantDeleteProcess>%aditoprj%/entity/Person_entity/grantDeleteProcess.js</grantDeleteProcess> <contentTitleProcess>%aditoprj%/entity/Person_entity/contentTitleProcess.js</contentTitleProcess> @@ -162,10 +163,6 @@ <name>OnlyActive_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> </children> </entityProvider> <entityField> @@ -411,14 +408,6 @@ <name>OnlyActive_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> </children> </entityProvider> <entityConsumer> @@ -636,6 +625,7 @@ <title>Status</title> <consumer>KeywordContactStates</consumer> <groupable v="true" /> + <stateProcess>%aditoprj%/entity/Person_entity/entityfields/status/stateProcess.js</stateProcess> <valueProcess>%aditoprj%/entity/Person_entity/entityfields/status/valueProcess.js</valueProcess> <displayValueProcess>%aditoprj%/entity/Person_entity/entityfields/status/displayValueProcess.js</displayValueProcess> </entityField> @@ -644,13 +634,17 @@ <dependency> <name>dependency</name> <entityName>KeywordEntry_entity</entityName> - <fieldName>SpecificContainerKeywords</fieldName> + <fieldName>OrderedBySortingFieldKeywords</fieldName> </dependency> <children> <entityParameter> <name>ContainerName_param</name> <valueProcess>%aditoprj%/entity/Person_entity/entityfields/keywordcontactstates/children/containername_param/valueProcess.js</valueProcess> </entityParameter> + <entityParameter> + <name>BlacklistIds_param</name> + <valueProcess>%aditoprj%/entity/Person_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js</valueProcess> + </entityParameter> </children> </entityConsumer> <entityConsumer> @@ -754,6 +748,12 @@ <fieldName>Persons</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>fe217f3a-edb1-4972-b8f6-c8b517a34a48</name> + <entityName>DSGVOConfiguration_entity</entityName> + <fieldName>Persons</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> @@ -776,10 +776,6 @@ <name>OnlyActive_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> </children> </entityProvider> <entityConsumer> @@ -945,46 +941,11 @@ <displayValueProcess>%aditoprj%/entity/Person_entity/entityfields/organisation_contactid/displayValueProcess.js</displayValueProcess> <onValidation>%aditoprj%/entity/Person_entity/entityfields/organisation_contactid/onValidation.js</onValidation> </entityField> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="true" /> - <mandatory v="false" /> - </entityParameter> <entityField> <name>STANDARD_COUNTRY</name> <title>Country</title> <groupable v="true" /> </entityField> - <entityConsumer> - <name>SelfDuplicatesUncached</name> - <dependency> - <name>dependency</name> - <entityName>Person_entity</entityName> - <fieldName>SelfDuplicates</fieldName> - </dependency> - <children> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - <entityParameter> - <name>ExcludedContactIds_param</name> - <valueProcess>%aditoprj%/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js</valueProcess> - </entityParameter> - </children> - </entityConsumer> <entityField> <name>LEAD_LEADID</name> </entityField> @@ -1035,47 +996,12 @@ <name>OnlyActive_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> </children> </entityProvider> <entityParameter> <name>OnlyShowContactIds_param</name> <expose v="true" /> </entityParameter> - <entityProvider> - <name>SelfDuplicates</name> - <documentation>%aditoprj%/entity/Person_entity/entityfields/selfduplicates/documentation.adoc</documentation> - <titlePlural>Duplicates</titlePlural> - <children> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <mandatory v="true" /> - </entityParameter> - <entityParameter> - <name>OnlyActive_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OrgId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OnlyOwnSupervised_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>ContactId_param</name> - <expose v="false" /> - </entityParameter> - </children> - </entityProvider> <entityField> <name>IndexCommunication</name> </entityField> @@ -1124,10 +1050,6 @@ <name>ContactId_param</name> <expose v="false" /> </entityParameter> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> <entityParameter> <name>OnlyOwnSupervised_param</name> <expose v="false" /> @@ -1144,10 +1066,6 @@ <name>OnlyActive_param</name> <expose v="true" /> </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> </children> </entityProvider> <entityField> @@ -1164,12 +1082,6 @@ <name>indexP</name> <documentation>%aditoprj%/entity/Person_entity/entityfields/indexp/documentation.adoc</documentation> <recordContainer>index</recordContainer> - <children> - <entityParameter> - <name>DuplicateActionsControl_param</name> - <expose v="false" /> - </entityParameter> - </children> </entityProvider> <entityField> <name>PERSON_OBJECTTYPE</name> @@ -1195,40 +1107,6 @@ </entityParameter> </children> </entityConsumer> - <entityProvider> - <name>NonselfDuplicates</name> - <documentation>%aditoprj%/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc</documentation> - <dependencies> - <entityDependency> - <name>3a4352e2-9686-4c52-9d01-dbfad8c68ea7</name> - <entityName>Duplicates_entity</entityName> - <fieldName>DuplicatePersonsConsumer</fieldName> - <isConsumer v="false" /> - </entityDependency> - </dependencies> - <children> - <entityParameter> - <name>ContactId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>DuplicateCurrentContactId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OnlyShowContactIds_param</name> - <expose v="true" /> - </entityParameter> - <entityParameter> - <name>OrgId_param</name> - <expose v="false" /> - </entityParameter> - <entityParameter> - <name>OnlyOwnSupervised_param</name> - <expose v="false" /> - </entityParameter> - </children> - </entityProvider> <entityConsumer> <name>DistrictResponsibles</name> <state>INVISIBLE</state> @@ -1395,52 +1273,6 @@ </entityActionField> </children> </entityActionGroup> - <entityActionGroup> - <name>DuplicateActions</name> - <title>Duplicate actions</title> - <state>AUTO</state> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/stateProcess.js</stateProcess> - <children> - <entityActionField> - <name>IntegrateSelectedIntoCurrentAction</name> - <title>Integrate selected into current contact</title> - <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>NEON:IMPORT</iconId> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IntegrateCurrentIntoSelectedAction</name> - <title>Integrate current into selected contact</title> - <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>NEON:EXPORT</iconId> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IgnoreDuplicate</name> - <title>Ignore Duplicate</title> - <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js</onActionProcess> - <isMenuAction v="true" /> - <isObjectAction v="false" /> - <isSelectionAction v="true" /> - <iconId>VAADIN:CLOSE</iconId> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js</stateProcess> - </entityActionField> - <entityActionField> - <name>IgnoreWholeCluster</name> - <title>Ignore whole cluster</title> - <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js</onActionProcess> - <isObjectAction v="false" /> - <iconId>VAADIN:CLOSE</iconId> - <stateProcess>%aditoprj%/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js</stateProcess> - </entityActionField> - </children> - </entityActionGroup> <entityActionField> <name>newEmail</name> <title>Write email</title> @@ -1499,6 +1331,78 @@ <iconId>VAADIN:CURLY_BRACKETS</iconId> <stateProcess>%aditoprj%/entity/Person_entity/entityfields/openadminview/stateProcess.js</stateProcess> </entityActionField> + <entityConsumer> + <name>DSGVODeleteFlags</name> + <stateProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvodeleteflags/stateProcess.js</stateProcess> + <dependency> + <name>dependency</name> + <entityName>DSGVODeleteFlag_entity</entityName> + <fieldName>DSGVODeleteFlags</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/Person_entity/entityfields/dsgvodeleteflags/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>Campaigns</name> + <dependency> + <name>dependency</name> + <entityName>Campaign_entity</entityName> + <fieldName>Campaigns</fieldName> + </dependency> + </entityConsumer> + <entityParameter> + <name>FilterPreSet_param</name> + <expose v="true" /> + </entityParameter> + <entityConsumer> + <name>Duplicates</name> + <selectionMode>MULTI</selectionMode> + <selectionModeProcess>%aditoprj%/entity/Person_entity/entityfields/duplicates/selectionModeProcess.js</selectionModeProcess> + <dependency> + <name>dependency</name> + <entityName>DuplicatePerson_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + <children> + <entityParameter> + <name>Obj_param</name> + <valueProcess>%aditoprj%/entity/Person_entity/entityfields/duplicates/children/obj_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>ContactCommunicationSettings</name> + <refreshParent v="true" /> + <dependency> + <name>dependency</name> + <entityName>CommunicationSettings_entity</entityName> + <fieldName>SettingsForContact</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/Person_entity/entityfields/contactcommunicationsettings/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>InterestLinks</name> + <dependency> + <name>dependency</name> + <entityName>InterestLink_entity</entityName> + <fieldName>InterestsForContact</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContactId_param</name> + <valueProcess>%aditoprj%/entity/Person_entity/entityfields/interestlinks/children/contactid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> </entityFields> <recordContainers> <dbRecordContainer> @@ -1636,6 +1540,8 @@ <dbRecordFieldMapping> <name>ORGANISATION_NAME.value</name> <recordfield>ORGANISATION.NAME</recordfield> + <isFilterable v="true" /> + <isLookupFilter v="true" /> </dbRecordFieldMapping> <dbRecordFieldMapping> <name>USER_NEW.value</name> @@ -1672,11 +1578,13 @@ </dbRecordFieldMapping> <dbRecordFieldMapping> <name>STANDARD_EMAIL_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js</expression> <isFilterable v="false" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> <dbRecordFieldMapping> <name>STANDARD_PHONE_COMMUNICATION.value</name> + <expression>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js</expression> <isFilterable v="false" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> @@ -1769,6 +1677,36 @@ <isFilterable v="true" /> <isLookupFilter v="false" /> </dbRecordFieldMapping> + <consumerMapping> + <name>Offers</name> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/offers/filterConditionProcess.js</filterConditionProcess> + <isFilterable v="true" /> + <filtertype>EXTENDED</filtertype> + </consumerMapping> + <consumerMapping> + <name>Orders</name> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/orders/filterConditionProcess.js</filterConditionProcess> + <isFilterable v="true" /> + <filtertype>EXTENDED</filtertype> + </consumerMapping> + <consumerMapping> + <name>Campaigns</name> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/campaigns/filterConditionProcess.js</filterConditionProcess> + <isFilterable v="true" /> + <filtertype>EXTENDED</filtertype> + </consumerMapping> + <consumerMapping> + <name>Tasks</name> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/tasks/filterConditionProcess.js</filterConditionProcess> + <isFilterable v="true" /> + <filtertype>EXTENDED</filtertype> + </consumerMapping> + <consumerMapping> + <name>Contracts</name> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/recordfieldmappings/contracts/filterConditionProcess.js</filterConditionProcess> + <isFilterable v="true" /> + <filtertype>EXTENDED</filtertype> + </consumerMapping> </recordFieldMappings> <linkInformation> <linkInformation> @@ -1826,6 +1764,13 @@ <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/supervisorassignment/filterConditionProcess.js</filterConditionProcess> <filtertype>BASIC</filtertype> </filterExtension> + <filterExtension> + <name>Duplicates_filter</name> + <title>Duplicates</title> + <contentType>NUMBER</contentType> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js</filterConditionProcess> + <filtertype>BASIC</filtertype> + </filterExtension> <filterExtension> <name>Communication_Mail_filter</name> <title>Communication: Mail</title> @@ -1848,6 +1793,13 @@ <isLookupFilter v="false" /> <filtertype>BASIC</filtertype> </filterExtension> + <filterExtension> + <name>IsEmployee_filter</name> + <title>Is an active Employee</title> + <contentType>BOOLEAN</contentType> + <filterValuesProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterValuesProcess.js</filterValuesProcess> + <filterConditionProcess>%aditoprj%/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterConditionProcess.js</filterConditionProcess> + </filterExtension> </filterExtensions> </dbRecordContainer> <indexRecordContainer> diff --git a/entity/Person_entity/entityfields/addtocampaign/stateProcess.js b/entity/Person_entity/entityfields/addtocampaign/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/addtocampaign/stateProcess.js +++ b/entity/Person_entity/entityfields/addtocampaign/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js b/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js index 04b4079531ba7cc7a965aa5162e950e6213ecfdf..48e3079503511a492aae0634eeb6853d9f198fe3 100644 --- a/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js +++ b/entity/Person_entity/entityfields/communications/children/contactsmaincountry_param/valueProcess.js @@ -1,7 +1,36 @@ +import("Sql_lib"); +import("Entity_lib"); import("system.logging"); import("system.vars"); import("system.result"); +//references needed for auto refresh: +"$field.PersAddresses.insertedRows"; +"$field.PersAddresses.changedRows"; +"$field.PersAddresses.deletedRows"; + +var res = ""; var country = vars.get("$field.STANDARD_COUNTRY"); -if (country) - result.string(country); \ No newline at end of file +var orgAddressId = newSelect("CONTACT.ADDRESS_ID").from("CONTACT") + .where("CONTACT.ORGANISATION_ID", vars.get("$field.ORGANISATION_ID")) + .and("CONTACT.PERSON_ID is null") + .cell(); + +var standardCountryOrg = newSelect("ADDRESS.COUNTRY").from("ADDRESS") + .where("ADDRESS.ADDRESSID", orgAddressId).cell(); + +if(country) +{ + res = country; +} +else if(standardCountryOrg) +{ + res = standardCountryOrg; +} +else +{ + var addressPersonRows = EntityConsumerRowsHelper.getCurrentConsumerRows("PersAddresses", ["COUNTRY"]); + if(addressPersonRows.length > 0) + res = addressPersonRows[0]["COUNTRY"]; +} +result.string(res); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js b/entity/Person_entity/entityfields/contactcommunicationsettings/children/contactid_param/valueProcess.js similarity index 98% rename from entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js rename to entity/Person_entity/entityfields/contactcommunicationsettings/children/contactid_param/valueProcess.js index 821415ae694dd9c3d98a7703f4c59b81a37f524b..7b6137b4d105e9ba592cf8ef6e796fb838a32b09 100644 --- a/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js +++ b/entity/Person_entity/entityfields/contactcommunicationsettings/children/contactid_param/valueProcess.js @@ -1,3 +1,4 @@ import("system.vars"); import("system.result"); + result.string(vars.get("$field.CONTACTID")); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/deletefunction/onActionProcess.js b/entity/Person_entity/entityfields/deletefunction/onActionProcess.js index 083e2d8b0d3d0649e0984e06b3947a6ae709fd3e..324c438c9d7953e5177748efa8679fe55ab0e8f6 100644 --- a/entity/Person_entity/entityfields/deletefunction/onActionProcess.js +++ b/entity/Person_entity/entityfields/deletefunction/onActionProcess.js @@ -21,7 +21,7 @@ if(contactIds > 1) entities.deleteRow(config); - DuplicateScannerUtils.deleteCachedDuplicate(contactId); + DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [contactId]); new AttributeRelationQuery(contactId, null, ContextUtils.getCurrentContextId()) .deleteAllAttributes(); diff --git a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js b/entity/Person_entity/entityfields/dsgvodeleteflags/children/contactid_param/valueProcess.js similarity index 98% rename from entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js rename to entity/Person_entity/entityfields/dsgvodeleteflags/children/contactid_param/valueProcess.js index 821415ae694dd9c3d98a7703f4c59b81a37f524b..7b6137b4d105e9ba592cf8ef6e796fb838a32b09 100644 --- a/entity/Organisation_entity/entityfields/selfduplicatesuncached/children/duplicatecurrentcontactid_param/valueProcess.js +++ b/entity/Person_entity/entityfields/dsgvodeleteflags/children/contactid_param/valueProcess.js @@ -1,3 +1,4 @@ import("system.vars"); import("system.result"); + result.string(vars.get("$field.CONTACTID")); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/dsgvodeleteflags/stateProcess.js b/entity/Person_entity/entityfields/dsgvodeleteflags/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..76191b70ac2e7e57490e9ae2aeaa4b9162d49936 --- /dev/null +++ b/entity/Person_entity/entityfields/dsgvodeleteflags/stateProcess.js @@ -0,0 +1,15 @@ +import("system.result"); +import("system.project"); +import("system.neon"); + +var isActive = JSON.parse(project.getPreferenceValue("custom.dsgvo.active", "true")); + +if(isActive) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + result.string(neon.COMPONENTSTATE_INVISIBLE); +} + \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js deleted file mode 100644 index c9289cbd0ef896d7dbcf5eae668bac8a87e861da..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/onActionProcess.js +++ /dev/null @@ -1,10 +0,0 @@ -import("system.neon"); -import("system.vars"); -import("DuplicateScanner_lib"); - -let sourceContactId = vars.get("$param.DuplicateCurrentContactId_param"); -let selectedContactId = vars.get("$sys.selection"); -let clusterId = DuplicateScannerUtils.getClusterId(sourceContactId); -DuplicateScannerUtils.createUnrelatedDuplicateRelation(sourceContactId, selectedContactId, clusterId); - -neon.refreshAll(); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/ignoreduplicate/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js deleted file mode 100644 index f74997cb1d72c3baa56b1dd12a42ba77eb782769..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/onActionProcess.js +++ /dev/null @@ -1,28 +0,0 @@ -import("system.logging"); -import("system.neon"); -import("system.vars"); -import("DuplicateScanner_lib"); -import("system.notification"); - -let contactId = vars.get("$field.CONTACTID"); -logging.log("contactId -> " + contactId); -let clusterId = DuplicateScannerUtils.getClusterId(contactId); -logging.log("clusterId -> " + clusterId); -let duplicateContactIdsInClusterRay = DuplicateScannerUtils.getCachedDuplicatesForClusterId(clusterId) -logging.log("duplicateContactIdsInClusterRay -> " + duplicateContactIdsInClusterRay); -if(duplicateContactIdsInClusterRay.length > 1) -{ - let referenceDuplicateId = duplicateContactIdsInClusterRay[0]; - for (let i = 1; i < duplicateContactIdsInClusterRay.length; i++) - { - DuplicateScannerUtils.createUnrelatedDuplicateRelation(referenceDuplicateId, duplicateContactIdsInClusterRay[i], clusterId); - } - neon.refreshAll(); - -// var params = {}; -// params["TargetEntity"] = "Person_entity"; -// -// neon.openContext("Duplicates", "DuplicatesOverview_view", null, neon.OPERATINGSTATE_VIEW, params); -} - - diff --git a/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js deleted file mode 100644 index fdd913ad06bf2815da3127d405d21b258c4ad795..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/ignorewholecluster/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "2")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/integratecurrentintoselectedaction/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js b/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js deleted file mode 100644 index b736eb15f5b18e779e37281fe216c9297ca86191..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/children/integrateselectedintocurrentaction/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState != null && actionState != "1")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicateactions/stateProcess.js b/entity/Person_entity/entityfields/duplicateactions/stateProcess.js deleted file mode 100644 index 5b8b24021ddfcba34a258bf7af7d4ec5ec65852a..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/duplicateactions/stateProcess.js +++ /dev/null @@ -1,11 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.neon"); -import("system.result"); - -//Actions to show in the duplicates view inside the persons main view - -let actionState = vars.get("$param.DuplicateActionsControl_param"); - -if(actionState == null || actionState == "0")//todo replace with keyword - result.string(neon.COMPONENTSTATE_INVISIBLE); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/duplicates/children/obj_param/valueProcess.js b/entity/Person_entity/entityfields/duplicates/children/obj_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..59dc755e2ab02e6af201c71f835676e5172180bc --- /dev/null +++ b/entity/Person_entity/entityfields/duplicates/children/obj_param/valueProcess.js @@ -0,0 +1,23 @@ +import("system.vars"); +import("system.result"); + +result.string(JSON.stringify({ + CONTACTID: vars.get("$field.CONTACTID"), + FIRSTNAME: vars.get("$field.FIRSTNAME"), + MIDDLENAME: vars.get("$field.MIDDLENAME"), + LASTNAME: vars.get("$field.LASTNAME"), + DATEOFBIRTH: vars.get("$field.DATEOFBIRTH"), + GENDER: vars.get("$field.GENDER"), + SALUTATION: vars.get("$field.SALUTATION"), + TITLE: vars.get("$field.TITLE"), + TITLESUFFIX: vars.get("$field.TITLESUFFIX"), + POSITION: vars.get("$field.POSITION"), + STATUS: vars.get("$field.STATUS"), + DEPARTMENT: vars.get("$field.DEPARTMENT"), + STANDARD_ADDRESS: vars.get("$field.STANDARD_ADDRESS"), + STANDARD_CITY: vars.get("$field.STANDARD_CITY"), + STANDARD_COUNTRY: vars.get("$field.STANDARD_COUNTRY"), + STANDARD_EMAIL_COMMUNICATION: vars.get("$field.STANDARD_EMAIL_COMMUNICATION"), + STANDARD_PHONE_COMMUNICATION: vars.get("$field.STANDARD_PHONE_COMMUNICATION"), + STANDARD_ZIP: vars.get("$field.STANDARD_ZIP") +})); diff --git a/entity/Person_entity/entityfields/duplicates/selectionModeProcess.js b/entity/Person_entity/entityfields/duplicates/selectionModeProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c92317456ba1a7476401171e875526c8eff6fa76 --- /dev/null +++ b/entity/Person_entity/entityfields/duplicates/selectionModeProcess.js @@ -0,0 +1,9 @@ +import("system.result"); +import("system.vars"); +import("system.neon"); + +result.string( + vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW || + vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT ? + "NONE" : "MULTI" +); diff --git a/entity/Person_entity/entityfields/interestlinks/children/contactid_param/valueProcess.js b/entity/Person_entity/entityfields/interestlinks/children/contactid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7b6137b4d105e9ba592cf8ef6e796fb838a32b09 --- /dev/null +++ b/entity/Person_entity/entityfields/interestlinks/children/contactid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.CONTACTID")); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js b/entity/Person_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a52cc0873588ad599c0efe525b8ec15716c7ec07 --- /dev/null +++ b/entity/Person_entity/entityfields/keywordcontactstates/children/blacklistids_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.object([$KeywordRegistry.contactStatus$markToDelete()]); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js b/entity/Person_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js index 4941f4e681715d0769512fba14d11801e4fc5d1f..602247f4551a27bb1dec0346a683192917384204 100644 --- a/entity/Person_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js +++ b/entity/Person_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js @@ -3,7 +3,7 @@ import("system.result"); import("Context_lib"); var res = []; -res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]}); +res.push({id: vars.get("$field.CONTACTID"), tableNames: ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION", "DSGVODELETEFLAG", "DSGVO"]}); res.push({id: vars.get("$field.PERSONID"), tableNames: ["PERSON"]}); res = JSON.stringify(res);//currently only strings can be passed as param diff --git a/entity/Person_entity/entityfields/newappointment/stateProcess.js b/entity/Person_entity/entityfields/newappointment/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newappointment/stateProcess.js +++ b/entity/Person_entity/entityfields/newappointment/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newemail/onActionProcess.js b/entity/Person_entity/entityfields/newemail/onActionProcess.js index a4b80166ed668dd700c51c1429cae7aa647edff5..c4ff5861b8aa9dc43e67f0d8975c65216188aab6 100644 --- a/entity/Person_entity/entityfields/newemail/onActionProcess.js +++ b/entity/Person_entity/entityfields/newemail/onActionProcess.js @@ -3,4 +3,5 @@ import("Email_lib"); import("KeywordRegistry_basic"); -EmailWritingUtils.openNewMail(vars.getString("$field.CONTACTID"), null, vars.get("$sys.currentcontextname"), null, null, null, null, null, $KeywordRegistry.documentTemplateTypeCategory$single()); \ No newline at end of file +EmailWritingUtils.openNewMail(vars.getString("$field.CONTACTID"), null, vars.get("$sys.currentcontextname"), null, null, null, null, null, + $KeywordRegistry.documentTemplateTypeCategory$single()); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newemail/stateProcess.js b/entity/Person_entity/entityfields/newemail/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newemail/stateProcess.js +++ b/entity/Person_entity/entityfields/newemail/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newletter/stateProcess.js b/entity/Person_entity/entityfields/newletter/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newletter/stateProcess.js +++ b/entity/Person_entity/entityfields/newletter/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newoffer/stateProcess.js b/entity/Person_entity/entityfields/newoffer/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newoffer/stateProcess.js +++ b/entity/Person_entity/entityfields/newoffer/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newvisitplanentry/stateProcess.js b/entity/Person_entity/entityfields/newvisitplanentry/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newvisitplanentry/stateProcess.js +++ b/entity/Person_entity/entityfields/newvisitplanentry/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/newvisitrecommendation/stateProcess.js b/entity/Person_entity/entityfields/newvisitrecommendation/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..5c748f19d4d580b9706725fb5572fe18d7473062 100644 --- a/entity/Person_entity/entityfields/newvisitrecommendation/stateProcess.js +++ b/entity/Person_entity/entityfields/newvisitrecommendation/stateProcess.js @@ -3,5 +3,7 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc b/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc deleted file mode 100644 index d7964dadc0c8a8c7d5ea6856c3b82d07ccbcc361..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/nonselfduplicates/documentation.adoc +++ /dev/null @@ -1,3 +0,0 @@ -Provides contact duplicate-records without the `Person_entity` scope, for example for the `Duplicates_entity`. - -The provider is named `NonselfDuplicates` to differentiate this provider and the `SelfDuplicates`-provider. \ No newline at end of file diff --git a/entity/Person_entity/entityfields/openeditdefaultsview/stateProcess.js b/entity/Person_entity/entityfields/openeditdefaultsview/stateProcess.js index aefbc6e8f76f99c4281890f3461553c49562d5b9..8ce4375618f2004c11461e3a9f01e183a463e8d1 100644 --- a/entity/Person_entity/entityfields/openeditdefaultsview/stateProcess.js +++ b/entity/Person_entity/entityfields/openeditdefaultsview/stateProcess.js @@ -3,5 +3,8 @@ import("system.neon"); import("system.vars"); import("KeywordRegistry_basic"); -if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive()) - result.string(neon.COMPONENTSTATE_DISABLED); \ No newline at end of file +if (vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$inactive() || vars.get("$field.STATUS") == $KeywordRegistry.contactStatus$markToDelete()) +{ + result.string(neon.COMPONENTSTATE_DISABLED); +} + \ No newline at end of file diff --git a/entity/Person_entity/entityfields/selfduplicates/documentation.adoc b/entity/Person_entity/entityfields/selfduplicates/documentation.adoc deleted file mode 100644 index 4f02d8b1a256bb4d0a791bab46cf0cda23790c84..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/selfduplicates/documentation.adoc +++ /dev/null @@ -1 +0,0 @@ -Provides contact duplicate-records within the `Person_entity` scope itself. \ No newline at end of file diff --git a/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js b/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js deleted file mode 100644 index 81570217c3ecd3cf76deb5e14d7ac0a6121a59bb..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/selfduplicatesuncached/children/duplicateactionscontrol_param/valueProcess.js +++ /dev/null @@ -1,2 +0,0 @@ -import("system.result"); -result.string("1");//todo use keyword \ No newline at end of file diff --git a/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js b/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js deleted file mode 100644 index 849632882bbabd4e65dfb25c7dc984366bde5116..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/selfduplicatesuncached/children/excludedcontactids_param/valueProcess.js +++ /dev/null @@ -1,7 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("system.result"); -import("DuplicateScanner_lib"); - -let unrelatedIds = DuplicateScannerUtils.getUnrelatedRelationsForDuplicate(vars.get("$field.CONTACTID")); -result.string(JSON.stringify(unrelatedIds)); \ No newline at end of file diff --git a/entity/Person_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js b/entity/Person_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js deleted file mode 100644 index 8fa370156eae601ebddb1f7b6f024650a156de52..0000000000000000000000000000000000000000 --- a/entity/Person_entity/entityfields/selfduplicatesuncached/children/onlyshowcontactids_param/valueProcess.js +++ /dev/null @@ -1,60 +0,0 @@ -import("system.indexsearch"); -import("system.project"); -import("system.logging"); -import("system.vars"); -import("DuplicateScanner_lib"); -import("system.result"); - -var scannerName = "PersonDuplicates"; -var targetEntity = "Person_entity"; -var valuesToCheck = {}; -var entityFieldsToLoad = DuplicateScannerUtils.getEntityFieldObjectFromConfig(scannerName, targetEntity); - -var idsForEmptyResult = JSON.stringify(["nodata"]); - -if (entityFieldsToLoad == null) - result.string(idsForEmptyResult); -else -{ - //Read the values of all available entity fields and write the fieldname7value combination - //as key/value pairs into an object. This is used to trigger the scan for duplicates - - vars.get("$field.STANDARD_CITY"); - vars.get("$field.STANDARD_ZIP"); - vars.get("$field.STANDARD_ADDRESS"); - vars.get("$field.FIRSTNAME"); - vars.get("$field.LASTNAME"); - vars.get("$field.PersAddresses.insertedRows") - vars.get("$field.PersAddresses.changedRows") - vars.get("$field.PersAddresses.deletedRows") - - var allFieldsToLoad = entityFieldsToLoad.entityFields.concat(entityFieldsToLoad.entityIdField); - allFieldsToLoad.forEach(function (field) - { - var fieldValue = vars.get("$field." + field); - if (fieldValue) - valuesToCheck[field] = fieldValue; - }); - - var scanResults = []; - - //don't search if only the id field has a value - var fieldsToCheck = Object.keys(valuesToCheck); - if (!(fieldsToCheck.length === 0 || (fieldsToCheck.length === 1 && entityFieldsToLoad.entityIdField in valuesToCheck))) - scanResults = DuplicateScannerUtils.scanForDuplicates(scannerName, targetEntity, valuesToCheck, null) || []; - - var duplicateIds = scanResults.map(function (duplicate) - { - return duplicate[indexsearch.FIELD_ID]; - }); - - /* - * To achieve that if there are no duplicates, no contacts should be shown and therefore returned by the - * recordcontainer, an invalid id gets returned. It then is used in the conditionProcess to load the duplicates. - * Because of its invalidity, no records are shown. - */ - if (duplicateIds.length == 0) - result.string(idsForEmptyResult); - else - result.string(JSON.stringify(duplicateIds)); -} \ No newline at end of file diff --git a/entity/Person_entity/entityfields/status/stateProcess.js b/entity/Person_entity/entityfields/status/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f0a13ec4459b571c5dda9ee71b3470fc70866531 --- /dev/null +++ b/entity/Person_entity/entityfields/status/stateProcess.js @@ -0,0 +1,9 @@ +import("KeywordRegistry_basic"); +import("system.result"); +import("system.vars"); +import("system.neon"); + +if (vars.get("$this.value") == $KeywordRegistry.contactStatus$markToDelete() && vars.get("$sys.recordstate") != "") +{ + result.string(neon.COMPONENTSTATE_READONLY); +} \ No newline at end of file diff --git a/entity/Person_entity/initFilterProcess.js b/entity/Person_entity/initFilterProcess.js index f64ef8977cc3f20a910f104d6196bfe90c43fc34..afecc1ede02d6f412681545610696b1efa17dc90 100644 --- a/entity/Person_entity/initFilterProcess.js +++ b/entity/Person_entity/initFilterProcess.js @@ -1,14 +1,14 @@ -import("system.entities"); +import("system.neon"); +import("system.vars"); import("Keyword_lib"); import("KeywordRegistry_basic"); import("system.result"); -import("system.vars"); -import("system.neon"); -if (vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) +var filter = vars.get("$param.FilterPreSet_param"); +if(!filter && vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) { var statusInactive = $KeywordRegistry.contactStatus$inactive(); - var filter = { + filter = JSON.stringify({ type: "group", operator: "AND", childs: [{ @@ -19,7 +19,9 @@ if (vars.get("$sys.presentationmode") === neon.CONTEXT_PRESENTATIONMODE_FILTER) key: statusInactive, value: KeywordUtils.getViewValue($KeywordRegistry.contactStatus(), statusInactive) }] - }; - - result.string(JSON.stringify(filter)); -} \ No newline at end of file + }); +} +if(filter) +{ + result.string(filter); +} diff --git a/entity/Person_entity/recordcontainers/db/conditionProcess.js b/entity/Person_entity/recordcontainers/db/conditionProcess.js index 338811158360900835c45a56b055904518f65ed6..c24eb7b7e0e4ffb85e6660796fabfe866ec6129d 100644 --- a/entity/Person_entity/recordcontainers/db/conditionProcess.js +++ b/entity/Person_entity/recordcontainers/db/conditionProcess.js @@ -10,11 +10,15 @@ import("system.result"); import("Sql_lib"); var cond = newWhereIfSet("CONTACT.ORGANISATION_ID", "$param.OrgId_param") - .andIfSet("CONTACT.CONTACTID", "$param.ContactId_param"); +.andIfSet("CONTACT.CONTACTID", "$param.ContactId_param"); if(vars.getString("$param.OnlyActive_param") == "true") +{ cond.and("CONTACT.STATUS", $KeywordRegistry.contactStatus$inactive(), SqlBuilder.NOT_EQUAL()); + cond.and("CONTACT.STATUS", $KeywordRegistry.contactStatus$markToDelete(), SqlBuilder.NOT_EQUAL()); +} + if (vars.exists("$param.ExcludedContactIds_param") && vars.get("$param.ExcludedContactIds_param")) { @@ -38,7 +42,7 @@ if (vars.exists("$param.OnlyOwnSupervised_param") && vars.get("$param.OnlyOwnSup .and("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", $AttributeRegistry.responsibleADsupervisor()) .and("AB_ATTRIBUTERELATION." + AttributeTypes.OBJECTSELECTION.databaseField, EmployeeUtils.sliceUserId(EmployeeUtils.getCurrentUserId())), SqlBuilder.EXISTS() - ); + ); } result.string(cond.toString()); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..6a53c389f9916191793616c6e838f781cd140e7c --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/filterextensions/duplicates_filter/filterConditionProcess.js @@ -0,0 +1,16 @@ +import("system.result"); +import("Sql_lib"); +import("system.vars"); +import("DuplicateScanner_lib"); + +var sqlOperator = SqlUtils.getSqlConditionalOperator(vars.get("$local.operator")); + +result.string(newWhere( + "CONTACT.CONTACTID", + DuplicateScannerUtils.getDuplicateConditionalListSql( + ["Person_entity"], + vars.get("$local.rawvalue"), + sqlOperator, true + ), + SqlBuilder.IN() +)); diff --git a/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4ba4942ef35de128bbda600380a3202f62e7d8bb --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterConditionProcess.js @@ -0,0 +1,38 @@ +import("Util_lib"); +import("system.tools"); +import("KeywordRegistry_basic"); +import("Sql_lib"); +import("system.vars"); +import("system.result"); + +var operator = vars.get("$local.operator"); +var rawvalue = vars.get("$local.rawvalue"); +var operator2 = null; +var contactIDs = []; + +users = tools.getUsersByAttribute(tools.ISACTIVE, ["true"], tools.PROFILE_DEFAULT); + +rawvalue = (Utils.toBoolean(rawvalue)); + +if(operator == "1" && !rawvalue || operator == "2" && rawvalue ) +{ + operator2 = SqlBuilder.NOT_IN(); +} +else if(operator == "1" && rawvalue || operator == "2" && !rawvalue) +{ + operator2 = SqlBuilder.IN(); +} +else +{ + result.string(newWhere().noResult().toString()); +} + +for (let i = 0; i < users.length; i++) +{ + contactIDs.push(users[i].params.contactID); +} + +if (contactIDs.length > 0 && operator2) +{ + result.string(newWhere("CONTACT.CONTACTID", contactIDs, operator2).toString()); +} \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterValuesProcess.js b/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterValuesProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4462144da5638267f7c76cce0c779305ae80c089 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/filterextensions/isemployee_filter/filterValuesProcess.js @@ -0,0 +1,4 @@ +import("system.translate"); +import("system.result"); + +result.object([["true", translate.text("Yes")], ["false", translate.text("No")]]); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/onDBDelete.js b/entity/Person_entity/recordcontainers/db/onDBDelete.js index 56d4461823493222635f99ab42de361ec497f838..26d095805ed1fc2a0f944c3a99c4f7e49475057a 100644 --- a/entity/Person_entity/recordcontainers/db/onDBDelete.js +++ b/entity/Person_entity/recordcontainers/db/onDBDelete.js @@ -6,7 +6,7 @@ import("system.vars"); import("DuplicateScanner_lib"); var contactId = vars.get("$field.CONTACTID"); -DuplicateScannerUtils.deleteCachedDuplicate(contactId); +DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [contactId]); new AttributeRelationQuery(contactId, null, ContextUtils.getCurrentContextId()) .deleteAllAttributes(); diff --git a/entity/Person_entity/recordcontainers/db/onDBInsert.js b/entity/Person_entity/recordcontainers/db/onDBInsert.js index 3385c553d10f5332ad4c946ea239bf7bcdf4b6bc..8d1c5ddea0bed7f36862a8423508f130794a3a07 100644 --- a/entity/Person_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Person_entity/recordcontainers/db/onDBInsert.js @@ -4,6 +4,9 @@ import("Sql_lib"); import("system.db"); import("DataPrivacy_lib"); import("system.vars"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateHasDuplicateEntry("Person_entity"); //let targetEntity = "Person_entity"; let contactId = vars.get("$local.uid"); diff --git a/entity/Person_entity/recordcontainers/db/onDBUpdate.js b/entity/Person_entity/recordcontainers/db/onDBUpdate.js index 0c29899fd4393c2528219ef9dc213eb151d10b18..100f1f714f83179a745ab4c332591ab988c0e60b 100644 --- a/entity/Person_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/Person_entity/recordcontainers/db/onDBUpdate.js @@ -8,6 +8,9 @@ import("Person_lib"); import("Communication_lib"); import("Entity_lib"); import("StandardObject_lib"); +import("DuplicateScanner_lib"); + +DuplicateScannerUtils.updateHasDuplicateEntry("Person_entity"); var localChanged = vars.get("$local.changed"); var orgChanged = false; diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/campaigns/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/campaigns/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7217d840fee842a5ba7e90b24829446b93fcf038 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/campaigns/filterConditionProcess.js @@ -0,0 +1,12 @@ +import("system.vars"); +import("Sql_lib"); +import("system.result"); + +result.string(newWhere("CONTACT.PERSON_ID", + newSelect("SALESORDER.CONTACT_ID") + .from("CONTACT") + .join("SALESORDER", + newWhere("CONTACT.CONTACTID = SALESORDER.CONTACT_ID")) + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.toString()); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/contracts/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/contracts/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..03e121a6f567a23f1c54c0474cb8ed8a4e414975 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/contracts/filterConditionProcess.js @@ -0,0 +1,10 @@ +import("system.vars"); +import("Sql_lib"); +import("system.result"); + +result.string(newWhere("CONTACT.CONTACT_ID", + newSelect("CONTRACT.CONTACT_ID") + .from("CONTRACT") + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.toString()) \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/offers/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/offers/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..a977f62ef6ff61d8d3125ca070722ac674897dfd --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/offers/filterConditionProcess.js @@ -0,0 +1,13 @@ +import("Sql_lib"); +import("system.vars"); +import("system.result"); + +result.string(newWhere("PERSON.PERSONID", + newSelect("CONTACT.PERSON_ID") + .from("CONTACT") + .join("OFFER", + newWhere("CONTACT.CONTACTID = OFFER.CONTACT_ID")) + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.toString()); + diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/orders/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/orders/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..25c57f4cc5af755dee6679691c65a5210892b742 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/orders/filterConditionProcess.js @@ -0,0 +1,17 @@ +import("system.vars"); +import("Sql_lib"); +import("system.result"); + +result.string(newWhere("CONTACT.CONTACT_ID", + newSelect("CAMPAIGNPARTICIPANT.CONTACT_ID") + .from("CAMPAIGN") + .join("CAMPAIGNPARTICIPANT", + newWhere("CAMPAIGN.CAMPAIGNID = CAMPAIGNPARTICIPANT.CAMPAIGN_ID")) + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.orIfSet("CONTACT.CONTACT_ID", + newSelect("CAMPAIGN.EMPLOYEE_CONTACT_ID") + .from("CAMPAIGN") + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.toString()); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..41ef07ff58ec51eda018bed12cb5b0b2b657c348 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_email_communication.value/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Communication_lib"); + +var res = CommUtil.getStandardSubSqlMail(); +result.string(res); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..320ae40ad1ba794b4e759037fa0f382b9af67696 --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/standard_phone_communication.value/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Communication_lib"); + +var res = CommUtil.getStandardSubSqlPhone(); +result.string(res); \ No newline at end of file diff --git a/entity/Person_entity/recordcontainers/db/recordfieldmappings/tasks/filterConditionProcess.js b/entity/Person_entity/recordcontainers/db/recordfieldmappings/tasks/filterConditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f54fd98dd31046b7693d195bac361769219f0aad --- /dev/null +++ b/entity/Person_entity/recordcontainers/db/recordfieldmappings/tasks/filterConditionProcess.js @@ -0,0 +1,16 @@ +import("system.vars"); +import("Sql_lib"); +import("system.result"); + + +result.string(newWhere("CONTACT.CONTACT_ID", + newSelect("TASK.REQUESTOR_CONTACT_ID") + .from("TASK") + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.orIfSet("CONTACT.CONTACT_ID", + newSelect("TASK.EDITOR_CONTACT_ID") + .from("TASK") + .whereIfSet(vars.get("$local.condition")), + SqlBuilder.IN()) +.toString()); \ No newline at end of file diff --git a/entity/QuickEntry_entity/QuickEntry_entity.aod b/entity/QuickEntry_entity/QuickEntry_entity.aod index 9ce66331b3242cbbba9001036cd3e65dc920d156..2c460f59b8748cc6d79d1046db867b5d3614130c 100644 --- a/entity/QuickEntry_entity/QuickEntry_entity.aod +++ b/entity/QuickEntry_entity/QuickEntry_entity.aod @@ -237,6 +237,7 @@ <entityParameter> <name>ContactIds_param</name> <valueProcess>%aditoprj%/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/valueProcess.js</valueProcess> + <documentation>%aditoprj%/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/documentation.adoc</documentation> </entityParameter> <entityParameter> <name>WithPrivatePersons_param</name> diff --git a/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/documentation.adoc b/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/documentation.adoc new file mode 100644 index 0000000000000000000000000000000000000000..667cdd59e70d81d319b110ff44e24478616dae1d --- /dev/null +++ b/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/documentation.adoc @@ -0,0 +1,2 @@ +returns a list of duplicate ids +the index will be searched via the values entered in the edit frame \ No newline at end of file diff --git a/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/valueProcess.js b/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/valueProcess.js index 68ef6879ab48622e909ec092bb0314156746f96e..98b27caa01f480c5b39a7c62f68970a13519812b 100644 --- a/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/valueProcess.js +++ b/entity/QuickEntry_entity/entityfields/organdpersduplicates/children/contactids_param/valueProcess.js @@ -2,6 +2,7 @@ import("system.indexsearch"); import("system.vars"); import("DuplicateScanner_lib"); import("system.result"); +import("IndexSearch_lib"); //trigger refresh vars.get("$field.FIRSTNAME"); @@ -11,11 +12,11 @@ var uid = vars.get("$field.UID"); var idsForEmptyResult = JSON.stringify(["nodata"]); var duplicateScans = []; -duplicateScans.push(["PersonDuplicates", "Person_entity", {"CONTACTID" : uid}]); +duplicateScans.push(["Person_entity", {"CONTACTID" : uid}]); vars.get("$field.Contacts.insertedRows").forEach(function (contact) { - duplicateScans.push(["PersonDuplicates", "Person_entity", contact]); + duplicateScans.push(["Person_entity", contact]); }); var organisationName = vars.get("$field.ORGANISATION_NAME"); @@ -34,7 +35,7 @@ if (organisationName || firstOrganisationAddress) address = firstOrganisationAddress["ADDRESS"]; } - duplicateScans.push(["OrganisationDuplicates", "Organisation_entity", { + duplicateScans.push(["Organisation_entity", { "CONTACTID" : uid, "NAME" : organisationName, "STANDARD_CITY" : city, @@ -43,9 +44,9 @@ if (organisationName || firstOrganisationAddress) }]); } -var duplicates = duplicateScans.reduce(function (duplicateArr, [scannerName, entity, fieldValues]) +var duplicates = duplicateScans.reduce(function (duplicateArr, [entity, fieldValues]) { - return duplicateArr.concat(_getDuplicates(scannerName, entity, fieldValues)); + return duplicateArr.concat(_getDuplicates(entity, fieldValues)); }, []); if (duplicates.length === 0) @@ -54,34 +55,22 @@ else result.string(JSON.stringify(duplicates)); -function _getDuplicates (pScannerName, pEntity, pEntityFieldValues) +function _getDuplicates(pEntity, pEntityFieldValues) { - var fieldsToLoad = DuplicateScannerUtils.getEntityFieldObjectFromConfig(pScannerName, pEntity); - if (fieldsToLoad == null) - return []; + var scanner = DuplicateScannerUtils.getScannerByEntity(pEntity); + var indexsearchFilter = IndexsearchFilterUtils.fromFilter(scanner.filter); + var entityFields = indexsearchFilter.getFields(); + entityFields.add(scanner.idField); var valuesToCheck = {}; - - var allFieldsToLoad = fieldsToLoad.entityFields.concat(fieldsToLoad.entityIdField); - allFieldsToLoad.forEach(function (field) - { + entityFields.forEach(function(field) { var fieldValue = field in pEntityFieldValues ? pEntityFieldValues[field] - : vars.get("$field." + field); - if (fieldValue) - valuesToCheck[field] = fieldValue; - }); - - //don't search if only the id field has a value - var fieldsToCheck = Object.keys(valuesToCheck); - if (fieldsToCheck.length === 0 || (fieldsToCheck.length === 1 && fieldsToLoad.entityIdField in valuesToCheck)) - return []; - - var scanResults = DuplicateScannerUtils.scanForDuplicates(pScannerName, pEntity, valuesToCheck, null) || []; - var duplicateIds = scanResults.map(function (duplicate) - { - return duplicate[indexsearch.FIELD_ID]; + : vars.exists("$field." + field) ? vars.get("$field." + field) : ""; + valuesToCheck[field] = fieldValue || ""; }); - return duplicateIds; + var indexPattern = indexsearchFilter.buildQuery(valuesToCheck); + var duplicateIds = DuplicateScannerUtils.getDuplicateIds(pEntity, indexPattern, valuesToCheck[scanner.idField]); + return DuplicateScannerUtils.filterIgnored(pEntity, valuesToCheck[scanner.idField], duplicateIds); } diff --git a/entity/RoleChildren_entity/entityfields/child_role/dropDownProcess.js b/entity/RoleChildren_entity/entityfields/child_role/dropDownProcess.js index 8867a68b1cb4c9e3d8b2d4fdb5b61936c46cdf5b..0085da92a9397782f1ecdf2395e6cc517e6ed52e 100644 --- a/entity/RoleChildren_entity/entityfields/child_role/dropDownProcess.js +++ b/entity/RoleChildren_entity/entityfields/child_role/dropDownProcess.js @@ -3,10 +3,16 @@ import("system.tools"); import("system.vars"); import("system.result"); -var newChildRoles = []; +var possibleChildRoles = []; var alias = SqlUtils.getSystemAlias(); var parentRole = vars.get("$param.RoleId_param"); -var allCustomAndProjectRoles = tools.getAllRoles(["CUSTOM", "PROJECT"], true); +var roleType = vars.get("$param.RoleType_param"); +var allPossibleRoles; + +if (roleType && roleType == "PROJECT") + allPossibleRoles = tools.getAllRoles(["PROJECT"], true); +else + allPossibleRoles = tools.getAllRoles(["CUSTOM", "PROJECT"], true); var childRoles = newSelect("CHILD_ROLE", alias) .from("ASYS_ROLES_CHILDREN") @@ -16,23 +22,15 @@ var childRoles = newSelect("CHILD_ROLE", alias) var parentIsAlreadyChildOf = newSelect("PARENT_ROLE", alias) .from("ASYS_ROLES_CHILDREN") .where("ASYS_ROLES_CHILDREN.CHILD_ROLE", parentRole) -.table(); +.arrayColumn(); -for each (let role in allCustomAndProjectRoles) { - // dont show current role as possible child in dropdown - if (role[3] != parentRole) { - newChildRoles.push([role[3], role[3]]); +for each (let role in allPossibleRoles) { + // dont add current role as possible child in dropdown + // check for cycles in hierarchy - dont add role which could create a cycle + // e.g. role A can't be child of role B while it is already parent of B + if (role[3] != parentRole && parentIsAlreadyChildOf.indexOf(role[3]) == -1) { + possibleChildRoles.push([role[3], role[3]]); } } -// check for cyclces in hierarchy, A can't be child of B while it is already parent of B -for each (let role in parentIsAlreadyChildOf) { - newChildRoles = newChildRoles.filter(function(childRole) { - if (role == childRole[0]) { - return false; - } - return true; - }); -} - -result.object(newChildRoles.sort()); \ No newline at end of file +result.object(possibleChildRoles.sort()); \ No newline at end of file diff --git a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js index c66d85815d3f52def5b26491e9e6ccaff853f137..e957ab3b90b5a27c1b053e01e4eb4c284e1750de 100644 --- a/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/SalesprojectPhase_entity/recordcontainers/jdito/contentProcess.js @@ -10,7 +10,7 @@ import("Util_lib"); var res = []; var ids = vars.get("$local.idvalues"); var disabledPhases = JSON.parse(vars.get("$param.DisabledPhases_param")) || []; -var steps = KeywordUtils.getEntryNamesAndIdsByContainer($KeywordRegistry.salesprojectPhase()); +var steps = KeywordUtils.getEntryNamesAndIdsByContainer($KeywordRegistry.salesprojectPhase(), null, true); var selected = vars.exists("$param.CurrentPhase_param") && vars.get("$param.CurrentPhase_param"); // filter only for steps reqested by the system diff --git a/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js b/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js index 97523412f94b7d77b72b9a0973be454ca2a0bf04..b8fbd1a1da983471d2a8e72e6d06593e7e77cc4e 100644 --- a/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js +++ b/entity/Salesproject_entity/entityfields/loghistories/children/tablenames_param/valueProcess.js @@ -3,7 +3,7 @@ import("system.result"); import("Context_lib"); var res = []; -res.push({id: vars.get("$field.SALESPROJECTID"), tableNames: ["AB_ATTRIBUTERELATION", "ACTIVITY"]}); +res.push({id: vars.get("$field.SALESPROJECTID"), tableNames: ["AB_ATTRIBUTERELATION", "ACTIVITY", "FORECAST"]}); res.push({id: vars.get("$field.SALESPROJECTID"), tableNames: ["SALESPROJECT"]}); res = JSON.stringify(res);//currently only strings can be passed as param diff --git a/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod b/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod index acc3d4d6af16f5a623d57e47879a2c4a6a9b679f..5cbdd8c359ad36edb185b4a03986f67b55ffc0e7 100644 --- a/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod +++ b/entity/VisitPlanEntry_entity/VisitPlanEntry_entity.aod @@ -223,12 +223,11 @@ <children> <entityParameter> <name>OrgId_param</name> - <valueProcess>%aditoprj%/entity/VisitPlanEntry_entity/entityfields/persons/children/orgid_param/valueProcess.js</valueProcess> - <expose v="true" /> </entityParameter> <entityParameter> <name>OnlyShowContactIds_param</name> <valueProcess>%aditoprj%/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js</valueProcess> + <expose v="true" /> </entityParameter> </children> </entityConsumer> diff --git a/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js b/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js index a11c9601feff0a1405f971aa786c5137ec825881..0dcb7912c8cee051ddf7ffa3e075e89df70c9cbc 100644 --- a/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js +++ b/entity/VisitPlanEntry_entity/entityfields/persons/children/onlyshowcontactids_param/valueProcess.js @@ -1,3 +1,5 @@ +import("system.logging"); +import("KeywordRegistry_basic"); import("Contact_lib"); import("system.result"); import("system.vars"); @@ -8,6 +10,7 @@ var contactIdArray = newSelect("CONTACT.CONTACTID") .from("CONTACT") .where("CONTACT.ORGANISATION_ID", ContactUtils.getPersOrgIds(orgContactId)[2], SqlBuilder.EQUAL()) .and("CONTACT.CONTACTID", orgContactId, SqlBuilder.NOT_EQUAL()) + .and("CONTACT.STATUS", $KeywordRegistry.contactStatus$inactive(), SqlBuilder.NOT_EQUAL()) .arrayColumn(); result.object(contactIdArray) \ No newline at end of file diff --git a/entity/VisitPlanEntry_entity/entityfields/persons/children/orgid_param/valueProcess.js b/entity/VisitPlanEntry_entity/entityfields/persons/children/orgid_param/valueProcess.js deleted file mode 100644 index c6e583e8bd66c32b6b8243af36cc6c2264c8ac18..0000000000000000000000000000000000000000 --- a/entity/VisitPlanEntry_entity/entityfields/persons/children/orgid_param/valueProcess.js +++ /dev/null @@ -1,9 +0,0 @@ -import("system.logging"); -import("Sql_lib"); -import("system.vars"); -import("system.result"); - -var orgContactId = vars.get("$field.ORGANISATION_CONTACT_ID") -var orgId = newSelect("CONTACT.ORGANISATION_ID").from("CONTACT").where("CONTACT.CONTACTID", orgContactId).cell(); - -result.string(orgId); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/WeblinkClick_entity.aod b/entity/WeblinkClick_entity/WeblinkClick_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..bd2d19c05be327649e1ada1374047855e7f984d3 --- /dev/null +++ b/entity/WeblinkClick_entity/WeblinkClick_entity.aod @@ -0,0 +1,237 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>WeblinkClick_entity</name> + <title>Click</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <grantCreate v="false" /> + <grantUpdate v="false" /> + <grantDelete v="false" /> + <titlePlural>Clicks</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + <dependencies> + <entityDependency> + <name>cd0eb69c-917b-43ba-b02f-2b05bff34cdd</name> + <entityName>BulkMail_entity</entityName> + <fieldName>Clicks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>cf3f4f2c-43bb-44c3-9099-95966d05623f</name> + <entityName>Link_entity</entityName> + <fieldName>Clicks</fieldName> + <isConsumer v="false" /> + </entityDependency> + <entityDependency> + <name>2a2baa00-d7c3-4e88-a4e1-553a81b4ac77</name> + <entityName>Weblink_entity</entityName> + <fieldName>Clicks</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>BROWSER</name> + <title>Browser</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>DATE_OPENED</name> + <title>Date Clicked</title> + <contentType>DATE</contentType> + <mandatory v="true" /> + </entityField> + <entityField> + <name>DEVICE_TYPE</name> + <title>Device Type</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>IP_ADDRESS</name> + <title>IP Address</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>WEBLINK_CLICKID</name> + </entityField> + <entityField> + <name>WEBLINK_ID</name> + <mandatory v="true" /> + </entityField> + <entityField> + <name>OBJECT_TYPE</name> + <mandatory v="true" /> + </entityField> + <entityField> + <name>OPERATING_SYSTEM</name> + <title>Operating System</title> + <mandatory v="true" /> + </entityField> + <entityField> + <name>CONTACT_ID</name> + <title>Contact</title> + <consumer>Contacts</consumer> + <linkedContextProcess>%aditoprj%/entity/WeblinkClick_entity/entityfields/contact_id/linkedContextProcess.js</linkedContextProcess> + <mandatory v="true" /> + </entityField> + <entityField> + <name>OBJECT_ROWID</name> + <mandatory v="true" /> + </entityField> + <entityField> + <name>INTEREST_ID</name> + <title>Interest</title> + <mandatory v="true" /> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityField> + <name>URL</name> + <title>Url</title> + </entityField> + <entityParameter> + <name>WeblinkId_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ObjectType_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>ObjectRowId_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>PERSON_ID</name> + </entityField> + <entityField> + <name>ORGANISATION_ID</name> + </entityField> + <entityConsumer> + <name>Contacts</name> + <dependency> + <name>dependency</name> + <entityName>AnyContact_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <fromClauseProcess>%aditoprj%/entity/WeblinkClick_entity/recordcontainers/db/fromClauseProcess.js</fromClauseProcess> + <conditionProcess>%aditoprj%/entity/WeblinkClick_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <orderClauseProcess>%aditoprj%/entity/WeblinkClick_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>BROWSER.value</name> + <recordfield>WEBLINK_CLICK.BROWSER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_OPENED.value</name> + <recordfield>WEBLINK_CLICK.DATE_OPENED</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DEVICE_TYPE.value</name> + <recordfield>WEBLINK_CLICK.DEVICE_TYPE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>IP_ADDRESS.value</name> + <recordfield>WEBLINK_CLICK.IP_ADDRESS</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WEBLINK_CLICKID.value</name> + <recordfield>WEBLINK_CLICK.WEBLINK_CLICKID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WEBLINK_ID.value</name> + <recordfield>WEBLINK_CLICK.WEBLINK_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_TYPE.value</name> + <recordfield>MAIL_RUN.OBJECT_TYPE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OPERATING_SYSTEM.value</name> + <recordfield>WEBLINK_CLICK.OPERATING_SYSTEM</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.value</name> + <recordfield>MAIL_LOG.CONTACT_ID</recordfield> + <isFilterable v="true" /> + <isLookupFilter v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_ROWID.value</name> + <recordfield>MAIL_RUN.OBJECT_ROWID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>INTEREST_ID.value</name> + <recordfield>MAIL_RUN.INTEREST_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>CONTACT_ID.displayValue</name> + <expression>%aditoprj%/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>URL.value</name> + <recordfield>WEBLINK.URL</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PERSON_ID.value</name> + <recordfield>CONTACT.PERSON_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ORGANISATION_ID.value</name> + <recordfield>CONTACT.ORGANISATION_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DEVICE_TYPE.displayValue</name> + <expression>%aditoprj%/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/device_type.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>bec597d4-29cb-48b4-9d26-d98b57a2bea2</name> + <tableName>WEBLINK_CLICK</tableName> + <primaryKey>WEBLINK_CLICKID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + <linkInformation> + <name>fd8737aa-96fa-4831-98eb-6dd9082ff023</name> + <tableName>MAIL_LOG</tableName> + <primaryKey>MAIL_LOGID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>5d47ca65-a3b5-4cdf-97d7-3336a3601d2a</name> + <tableName>MAIL_RUN</tableName> + <primaryKey>MAIL_RUNID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>a3b88623-2fe7-4d05-b13b-b3bbaad6a2f3</name> + <tableName>WEBLINK</tableName> + <primaryKey>WEBLINKID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + <linkInformation> + <name>5e8806a6-a5b6-4fb8-9672-6db23c9706a5</name> + <tableName>CONTACT</tableName> + <primaryKey>CONTACTID</primaryKey> + <isUIDTable v="false" /> + <readonly v="true" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/WeblinkClick_entity/entityfields/contact_id/linkedContextProcess.js b/entity/WeblinkClick_entity/entityfields/contact_id/linkedContextProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..95bad245448809f807648349f7f23be11a6b3eca --- /dev/null +++ b/entity/WeblinkClick_entity/entityfields/contact_id/linkedContextProcess.js @@ -0,0 +1,7 @@ +import("system.vars"); +import("system.result"); +import("Contact_lib"); + +var res = ContactUtils.getContextByPersOrg(vars.get("$field.PERSON_ID"), vars.get("$field.ORGANISATION_ID")); + +result.string(res||"Person"); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/recordcontainers/db/conditionProcess.js b/entity/WeblinkClick_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..12cab1c71355e0b5f0f2157e8574dbf2eed39696 --- /dev/null +++ b/entity/WeblinkClick_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,8 @@ +import("system.result"); +import("Sql_lib"); + +var cond = newWhereIfSet("WEBLINK_CLICK.WEBLINK_ID", "$param.WeblinkId_param") + .andIfSet("MAIL_RUN.OBJECT_TYPE", "$param.ObjectType_param") + .andIfSet("MAIL_RUN.OBJECT_ROWID", "$param.ObjectRowId_param"); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/recordcontainers/db/fromClauseProcess.js b/entity/WeblinkClick_entity/recordcontainers/db/fromClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..44b1758c89376187fd4e3cb3b96a40110dab36c4 --- /dev/null +++ b/entity/WeblinkClick_entity/recordcontainers/db/fromClauseProcess.js @@ -0,0 +1,11 @@ +import("system.result"); +import("Sql_lib"); + +var from = new SqlBuilder() + .from("WEBLINK_CLICK") + .join("MAIL_LOG","MAIL_LOG.MAIL_LOGID = WEBLINK_CLICK.MAIL_LOG_ID") + .join("MAIL_RUN","MAIL_RUN.MAIL_RUNID = MAIL_LOG.MAIL_RUN_ID") + .join("CONTACT","MAIL_LOG.CONTACT_ID = CONTACT.CONTACTID") + .join("WEBLINK","WEBLINK.WEBLINKID = WEBLINK_CLICK.WEBLINK_ID"); + +result.string(from.toString()); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/recordcontainers/db/orderClauseProcess.js b/entity/WeblinkClick_entity/recordcontainers/db/orderClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..08dda059e99f3d7917d6520e564b730883f79b08 --- /dev/null +++ b/entity/WeblinkClick_entity/recordcontainers/db/orderClauseProcess.js @@ -0,0 +1,6 @@ +import("system.db"); +import("system.result"); + +result.object({ + "WEBLINK_CLICK.DATE_OPENED" : db.DESCENDING +}); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js b/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..72d1600cff8a2f7f9cd33dd3551e372cdec7790c --- /dev/null +++ b/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/contact_id.displayvalue/expression.js @@ -0,0 +1,4 @@ +import("Contact_lib"); +import("system.result"); + +result.string(ContactUtils.getResolvingDisplaySubSql("MAIL_LOG.CONTACT_ID")); \ No newline at end of file diff --git a/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/device_type.displayvalue/expression.js b/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/device_type.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..c4b623c5f30e94b437527cb920a01c0866658423 --- /dev/null +++ b/entity/WeblinkClick_entity/recordcontainers/db/recordfieldmappings/device_type.displayvalue/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.deviceType(), "WEBLINK_CLICK.DEVICE_TYPE"); +result.string(sql); diff --git a/entity/WeblinkTag_entity/WeblinkTag_entity.aod b/entity/WeblinkTag_entity/WeblinkTag_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..58b737c76c9448f9a9ce7fb40fe7633bdcf4a9d3 --- /dev/null +++ b/entity/WeblinkTag_entity/WeblinkTag_entity.aod @@ -0,0 +1,125 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>WeblinkTag_entity</name> + <title>Tag</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <grantUpdate v="false" /> + <grantUpdateProcess>%aditoprj%/entity/WeblinkTag_entity/grantUpdateProcess.js</grantUpdateProcess> + <onInit>%aditoprj%/entity/WeblinkTag_entity/onInit.js</onInit> + <titlePlural>Tags</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityProvider> + <name>Tags</name> + <dependencies> + <entityDependency> + <name>4677d007-6467-4bc4-80ec-8230ee68d203</name> + <entityName>Weblink_entity</entityName> + <fieldName>WebtrackingTags</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityParameter> + <name>WeblinkId_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>TAG</name> + <title>Tag</title> + <consumer>KeywordLinkTags</consumer> + <displayValueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/tag/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>WEBLINKTAGID</name> + </entityField> + <entityField> + <name>WEBLINK_ID</name> + <title>Url</title> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/weblink_id/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_NEW</name> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/date_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_EDIT</name> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/date_edit/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_NEW</name> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/user_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_EDIT</name> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/user_edit/valueProcess.js</valueProcess> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityConsumer> + <name>KeywordLinkTags</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/WeblinkTag_entity/entityfields/keywordlinktags/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <conditionProcess>%aditoprj%/entity/WeblinkTag_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>TAG.value</name> + <recordfield>WEBLINKTAG.TAG</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WEBLINK_ID.value</name> + <recordfield>WEBLINKTAG.WEBLINK_ID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_EDIT.value</name> + <recordfield>WEBLINKTAG.DATE_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>WEBLINKTAG.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_EDIT.value</name> + <recordfield>WEBLINKTAG.USER_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>WEBLINKTAG.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WEBLINKTAGID.value</name> + <recordfield>WEBLINKTAG.WEBLINKTAGID</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>2d72b86c-d2f6-46c9-bd82-5781ca93c630</name> + <tableName>WEBLINKTAG</tableName> + <primaryKey>WEBLINKTAGID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_edit/valueProcess.js b/entity/WeblinkTag_entity/entityfields/date_edit/valueProcess.js similarity index 68% rename from entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_edit/valueProcess.js rename to entity/WeblinkTag_entity/entityfields/date_edit/valueProcess.js index 5e6ef059738e0c724a468685333a5e257ac228ce..daf59b91c5ec63190a50eded0333513b4bb444a8 100644 --- a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_edit/valueProcess.js +++ b/entity/WeblinkTag_entity/entityfields/date_edit/valueProcess.js @@ -1,7 +1,7 @@ import("system.util"); +import("system.vars"); import("system.result"); import("system.neon"); -import("system.vars"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_new/valueProcess.js b/entity/WeblinkTag_entity/entityfields/date_new/valueProcess.js similarity index 68% rename from entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_new/valueProcess.js rename to entity/WeblinkTag_entity/entityfields/date_new/valueProcess.js index a72892783bf2bd04fe353c47f1be0cb570bbb323..fe44d4d71b1063092bb6fa4619e86f84f45cbf96 100644 --- a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/date_new/valueProcess.js +++ b/entity/WeblinkTag_entity/entityfields/date_new/valueProcess.js @@ -1,7 +1,7 @@ import("system.util"); +import("system.vars"); import("system.result"); import("system.neon"); -import("system.vars"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/WeblinkTag_entity/entityfields/keywordlinktags/children/containername_param/valueProcess.js b/entity/WeblinkTag_entity/entityfields/keywordlinktags/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..99b326480d0411aa466ca7dc716c1bee110fe1d5 --- /dev/null +++ b/entity/WeblinkTag_entity/entityfields/keywordlinktags/children/containername_param/valueProcess.js @@ -0,0 +1,2 @@ +import("system.result"); +result.string("LinkTags"); \ No newline at end of file diff --git a/entity/WeblinkTag_entity/entityfields/tag/displayValueProcess.js b/entity/WeblinkTag_entity/entityfields/tag/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..beebea09168f9f4766bae042d7e7f9ce35a70aed --- /dev/null +++ b/entity/WeblinkTag_entity/entityfields/tag/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("Keyword_lib"); +import("system.result"); + +result.string(KeywordUtils.getViewValue("LinkTags", vars.get("$field.TAG"))); \ No newline at end of file diff --git a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_new/valueProcess.js b/entity/WeblinkTag_entity/entityfields/user_edit/valueProcess.js similarity index 68% rename from entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_new/valueProcess.js rename to entity/WeblinkTag_entity/entityfields/user_edit/valueProcess.js index e518bc75a9494e53a83613dedd943106e74fc00a..3ba15fa737b55fb359b165560ce8ea213df3bd85 100644 --- a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_new/valueProcess.js +++ b/entity/WeblinkTag_entity/entityfields/user_edit/valueProcess.js @@ -1,7 +1,7 @@ import("system.util"); +import("system.vars"); import("system.result"); import("system.neon"); -import("system.vars"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_edit/valueProcess.js b/entity/WeblinkTag_entity/entityfields/user_new/valueProcess.js similarity index 68% rename from entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_edit/valueProcess.js rename to entity/WeblinkTag_entity/entityfields/user_new/valueProcess.js index 6af880ae3e0e2b89b4eee8327ed49f1eefe458af..ee55f943ae28a210c66facb7fc6ec1931c857421 100644 --- a/entity/DuplicateScannerResultFieldConfig_entity/entityfields/user_edit/valueProcess.js +++ b/entity/WeblinkTag_entity/entityfields/user_new/valueProcess.js @@ -1,7 +1,7 @@ import("system.util"); +import("system.vars"); import("system.result"); import("system.neon"); -import("system.vars"); -if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/WeblinkTag_entity/entityfields/weblink_id/valueProcess.js b/entity/WeblinkTag_entity/entityfields/weblink_id/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..927a984275c538117230634c5c748ec9a0082225 --- /dev/null +++ b/entity/WeblinkTag_entity/entityfields/weblink_id/valueProcess.js @@ -0,0 +1,8 @@ +import("system.util"); +import("system.vars"); +import("system.result"); +import("system.neon"); + + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string(vars.get("$param.WeblinkId_param")) \ No newline at end of file diff --git a/entity/WeblinkTag_entity/grantUpdateProcess.js b/entity/WeblinkTag_entity/grantUpdateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..017ae1610931b3e01dea064cb348e276aa96aca4 --- /dev/null +++ b/entity/WeblinkTag_entity/grantUpdateProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_EDIT) + result.string(true); \ No newline at end of file diff --git a/entity/WeblinkTag_entity/onInit.js b/entity/WeblinkTag_entity/onInit.js new file mode 100644 index 0000000000000000000000000000000000000000..e27158065612d9200a8ff432327d14e5aebd7267 --- /dev/null +++ b/entity/WeblinkTag_entity/onInit.js @@ -0,0 +1,14 @@ +import("system.vars"); +import("system.neon"); +import("system.logging"); + + +var recordState = vars.get("$sys.recordstate"); +if(recordState == neon.OPERATINGSTATE_NEW || recordState == neon.OPERATINGSTATE_EDIT) +{ + var insertedRow = null + if(vars.exists("$field.Tags.insertedRows")) + insertedRow = vars.get("$field.Tags.insertedRows") + if(insertedRow.length == 1 && !insertedRow[0]["#"]) + neon.deleteRecord("Tags", insertedRow[0]["#UID"]) +} \ No newline at end of file diff --git a/entity/WeblinkTag_entity/recordcontainers/db/conditionProcess.js b/entity/WeblinkTag_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..1c1f407304637771e7d8691cb3a1bf85c5041942 --- /dev/null +++ b/entity/WeblinkTag_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("Sql_lib"); +import("system.result"); + +result.string(newWhereIfSet("WEBLINKTAG.WEBLINK_ID", vars.get("$param.WeblinkId_param")).toString()) \ No newline at end of file diff --git a/entity/Weblink_entity/Weblink_entity.aod b/entity/Weblink_entity/Weblink_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..79e7260f731358ec5e0372fcb8e16d7e19f545b4 --- /dev/null +++ b/entity/Weblink_entity/Weblink_entity.aod @@ -0,0 +1,210 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.18" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.18"> + <name>Weblink_entity</name> + <title>Weblink</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <contentTitleProcess>%aditoprj%/entity/Weblink_entity/contentTitleProcess.js</contentTitleProcess> + <iconId>NEON:FILTER</iconId> + <titlePlural>Weblinks</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>URL</name> + <title>Url</title> + <mandatory v="true" /> + <stateProcess>%aditoprj%/entity/Weblink_entity/entityfields/url/stateProcess.js</stateProcess> + <onValidation>%aditoprj%/entity/Weblink_entity/entityfields/url/onValidation.js</onValidation> + </entityField> + <entityField> + <name>WEBLINKID</name> + </entityField> + <entityField> + <name>DATE_NEW</name> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/date_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>USER_NEW</name> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/user_new/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>DATE_EDIT</name> + </entityField> + <entityField> + <name>USER_EDIT</name> + </entityField> + <entityField> + <name>SCORE</name> + <title>Punktzahl</title> + <contentType>NUMBER</contentType> + <outputFormat>#' Punkte'</outputFormat> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/score/valueProcess.js</valueProcess> + </entityField> + <entityField> + <name>LINKTYPE</name> + <title>Link Type</title> + <consumer>KeywordLinkType</consumer> + <mandatory v="true" /> + </entityField> + <entityField> + <name>Tags</name> + <title>Tags</title> + </entityField> + <entityConsumer> + <name>WebtrackingTags</name> + <selectionMode>MULTI</selectionMode> + <dependency> + <name>dependency</name> + <entityName>WeblinkTag_entity</entityName> + <fieldName>Tags</fieldName> + </dependency> + <children> + <entityParameter> + <name>WeblinkId_param</name> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/webtrackingtags/children/linkid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>LINKTYPE_ICON</name> + <contentType>IMAGE</contentType> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/linktype_icon/valueProcess.js</valueProcess> + </entityField> + <entityProvider> + <name>#PROVIDER_AGGREGATES</name> + <useAggregates v="true" /> + </entityProvider> + <entityConsumer> + <name>KeywordLinkType</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/keywordlinktype/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityField> + <name>PLACEHOLDER</name> + <title>Placeholder</title> + <stateProcess>%aditoprj%/entity/Weblink_entity/entityfields/placeholder/stateProcess.js</stateProcess> + <displayValueProcess>%aditoprj%/entity/Weblink_entity/entityfields/placeholder/displayValueProcess.js</displayValueProcess> + <onValidation>%aditoprj%/entity/Weblink_entity/entityfields/placeholder/onValidation.js</onValidation> + </entityField> + <entityConsumer> + <name>Clicks</name> + <dependency> + <name>dependency</name> + <entityName>WeblinkClick_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + <children> + <entityParameter> + <name>WeblinkId_param</name> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/clicks/children/linkid_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityConsumer> + <name>WorkflowDefinitions</name> + <dependency> + <name>dependency</name> + <entityName>WorkflowDefinition_entity</entityName> + <fieldName>#PROVIDER</fieldName> + </dependency> + </entityConsumer> + <entityField> + <name>WORKFLOWPROCESSDEFINITION_KEY</name> + <title>Workflow</title> + <consumer>WorkflowDefinitions</consumer> + <stateProcess>%aditoprj%/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/stateProcess.js</stateProcess> + <displayValueProcess>%aditoprj%/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>ISREDIRECT</name> + <title>Redirect</title> + <contentType>BOOLEAN</contentType> + <stateProcess>%aditoprj%/entity/Weblink_entity/entityfields/isredirect/stateProcess.js</stateProcess> + <valueProcess>%aditoprj%/entity/Weblink_entity/entityfields/isredirect/valueProcess.js</valueProcess> + </entityField> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <conditionProcess>%aditoprj%/entity/Weblink_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <orderClauseProcess>%aditoprj%/entity/Weblink_entity/recordcontainers/db/orderClauseProcess.js</orderClauseProcess> + <alias>Data_alias</alias> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>DATE_EDIT.value</name> + <recordfield>WEBLINK.DATE_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>DATE_NEW.value</name> + <recordfield>WEBLINK.DATE_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WEBLINKID.value</name> + <recordfield>WEBLINK.WEBLINKID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>SCORE.value</name> + <recordfield>WEBLINK.SCORE</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>URL.value</name> + <recordfield>WEBLINK.URL</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>LINKTYPE.value</name> + <recordfield>WEBLINK.LINKTYPE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_EDIT.value</name> + <recordfield>WEBLINK.USER_EDIT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>USER_NEW.value</name> + <recordfield>WEBLINK.USER_NEW</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>Tags.value</name> + <expression>%aditoprj%/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/tags.value/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>LINKTYPE.displayValue</name> + <expression>%aditoprj%/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/linktype.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PLACEHOLDER.value</name> + <recordfield>WEBLINK.PLACEHOLDER</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>WORKFLOWPROCESSDEFINITION_KEY.value</name> + <recordfield>WEBLINK.WORKFLOWPROCESSDEFINITION_KEY</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>ISREDIRECT.value</name> + <recordfield>WEBLINK.ISREDIRECT</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + <linkInformation> + <linkInformation> + <name>d7ef8574-3b73-4435-93f6-74bb60a86c1b</name> + <tableName>WEBLINK</tableName> + <primaryKey>WEBLINKID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/targetentity/valueProcess.js b/entity/Weblink_entity/contentTitleProcess.js similarity index 56% rename from entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/targetentity/valueProcess.js rename to entity/Weblink_entity/contentTitleProcess.js index ea14ae6b612db05a0e3a34e900ca16547f9ed208..532ae9cda8ed3a4a4678499bcee1c551ebe48021 100644 --- a/entity/Duplicates_entity/entityfields/duplicatesunrelatedorganisationconsumer/children/targetentity/valueProcess.js +++ b/entity/Weblink_entity/contentTitleProcess.js @@ -1,4 +1,4 @@ import("system.vars"); import("system.result"); -result.string("Organisation_entity"); \ No newline at end of file +result.string(vars.get("$field.URL")); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/clicks/children/linkid_param/valueProcess.js b/entity/Weblink_entity/entityfields/clicks/children/linkid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..39f7dede612ab2f9b2256dbde6b40f846fbca0d3 --- /dev/null +++ b/entity/Weblink_entity/entityfields/clicks/children/linkid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.WEBLINKID")); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/date_new/valueProcess.js b/entity/Weblink_entity/entityfields/date_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..83de1a18d6fcfe9926e5cc8f87cc552b779987f4 --- /dev/null +++ b/entity/Weblink_entity/entityfields/date_new/valueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.date")); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/isredirect/stateProcess.js b/entity/Weblink_entity/entityfields/isredirect/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..31b3cd25a65e38f049ef0a5fdfffcba9bd830d4a --- /dev/null +++ b/entity/Weblink_entity/entityfields/isredirect/stateProcess.js @@ -0,0 +1,15 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.neon"); + +var linktype = vars.get("$field.LINKTYPE"); + +if (linktype == $KeywordRegistry.weblinkType$EMail()) +{ + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + result.string(neon.COMPONENTSTATE_INVISIBLE); +} \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/isredirect/valueProcess.js b/entity/Weblink_entity/entityfields/isredirect/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4e9b28e10759f126432a2a9d86d3684f4ac33ad2 --- /dev/null +++ b/entity/Weblink_entity/entityfields/isredirect/valueProcess.js @@ -0,0 +1,8 @@ +import("system.neon"); +import("system.result"); +import("system.vars"); + +if (!vars.get("$this.value") && vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW ) +{ + result.string("0"); +} \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/keywordlinktype/children/containername_param/valueProcess.js b/entity/Weblink_entity/entityfields/keywordlinktype/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..05de1cabb8d01404fedbb9bae7b14749fb75b9a2 --- /dev/null +++ b/entity/Weblink_entity/entityfields/keywordlinktype/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.result"); +import("KeywordRegistry_basic"); + +result.string($KeywordRegistry.weblinkType()); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/linktype_icon/valueProcess.js b/entity/Weblink_entity/entityfields/linktype_icon/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..2378458ad3051dcd29b6a54ea0558156d9747ff5 --- /dev/null +++ b/entity/Weblink_entity/entityfields/linktype_icon/valueProcess.js @@ -0,0 +1,11 @@ +import("system.result"); +import("system.vars"); + +var res = "" +if(vars.get("$field.LINKTYPE") == 1)//leadforensics + res = "NEON:IMPORT" + +if(vars.get("$field.LINKTYPE")=="EMAIL") + res = "VAADIN:MAILBOX" + +result.string(res); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/placeholder/displayValueProcess.js b/entity/Weblink_entity/entityfields/placeholder/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..f02de4a47ade61409736bc698d4c448149eadc2e --- /dev/null +++ b/entity/Weblink_entity/entityfields/placeholder/displayValueProcess.js @@ -0,0 +1,10 @@ +import("system.result"); +import("system.vars"); +import("Placeholder_lib"); + +var placeholder = vars.get("$field.PLACEHOLDER"); + +if (placeholder) +{ + result.string(PlaceholderUtils.formatPlaceholder(placeholder)); +} \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/placeholder/onValidation.js b/entity/Weblink_entity/entityfields/placeholder/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..394f99c96f5cbe9c7a5111383550717079a7352e --- /dev/null +++ b/entity/Weblink_entity/entityfields/placeholder/onValidation.js @@ -0,0 +1,22 @@ +import("system.result"); +import("system.vars"); +import("Placeholder_lib"); +import("Sql_lib"); + +if (vars.get("$local.value")) +{ + var defaultPlaceholders = PlaceholderUtils.getPlaceholders(); + var linkPlaceholders = newSelect("WEBLINK.PLACEHOLDER") + .from("WEBLINK") + .where("WEBLINK.WEBLINKID", vars.get("$field.WEBLINKID"), SqlBuilder.NOT_EQUAL()) + .and("WEBLINK.PLACEHOLDER is not null") + .arrayColumn(); + + var defaultPlaceholderNames = defaultPlaceholders.map(function(placeholder){return placeholder.placeholderName}); + + if(defaultPlaceholderNames.includes(vars.get("$local.value")) || linkPlaceholders.includes("$local.value")) + { + result.string("Placeholders must be unique") + } + +} \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/placeholder/stateProcess.js b/entity/Weblink_entity/entityfields/placeholder/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..9be3319eefba688cc1103d3f86a6275d936b0f10 --- /dev/null +++ b/entity/Weblink_entity/entityfields/placeholder/stateProcess.js @@ -0,0 +1,13 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.neon"); + + +var linktype = vars.get("$field.LINKTYPE") +var res = neon.COMPONENTSTATE_INVISIBLE +if (linktype == $KeywordRegistry.weblinkType$EMail()) +{ + res = neon.COMPONENTSTATE_EDITABLE; +} +result.string(res); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/score/valueProcess.js b/entity/Weblink_entity/entityfields/score/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..73553d1782a7e8f4182dee2a7abf23aeb48da737 --- /dev/null +++ b/entity/Weblink_entity/entityfields/score/valueProcess.js @@ -0,0 +1,7 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$this.value") == null) + result.string(0) \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/url/onValidation.js b/entity/Weblink_entity/entityfields/url/onValidation.js new file mode 100644 index 0000000000000000000000000000000000000000..789eb86303fe57cc5de8c7bc23d243d90c03d6c4 --- /dev/null +++ b/entity/Weblink_entity/entityfields/url/onValidation.js @@ -0,0 +1,16 @@ +import("system.translate"); +import("system.result"); +import("system.neon"); +import("system.vars"); +import("Sql_lib"); + +if (vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW && vars.get("$local.value")) +{ + if (newSelect("URL").from("WEBLINK").where("WEBLINK.URL", vars.get("$local.value")).cell()) + result.string(translate.text("Url must be unique")); + + if (vars.get("$field.ISREDIRECT") == "1" && !/^(?:http(s)?:\/\/)[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/g.test(vars.get("$local.value"))) + { + result.string(translate.text("Redirect needs a full Url with http/https")); + } +} diff --git a/entity/Weblink_entity/entityfields/url/stateProcess.js b/entity/Weblink_entity/entityfields/url/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..bf56cc956c9ee7f08f53f30d9f1991838154bffc --- /dev/null +++ b/entity/Weblink_entity/entityfields/url/stateProcess.js @@ -0,0 +1,8 @@ +import("system.neon"); +import("system.result"); +import("system.vars"); + +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) + result.string(neon.COMPONENTSTATE_EDITABLE) +else + result.string(neon.COMPONENTSTATE_READONLY) \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/user_new/valueProcess.js b/entity/Weblink_entity/entityfields/user_new/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b9c2b5e127b9ecbf3ad03794b46e3dbad137f25b --- /dev/null +++ b/entity/Weblink_entity/entityfields/user_new/valueProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("system.neon"); +import("system.vars"); +if(vars.get("$sys.operatingstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$sys.user")); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/webtrackingtags/children/webtrackingurl/valueProcess.js b/entity/Weblink_entity/entityfields/webtrackingtags/children/webtrackingurl/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..647f04b4516a64fb021acb531052094c641dc2ee --- /dev/null +++ b/entity/Weblink_entity/entityfields/webtrackingtags/children/webtrackingurl/valueProcess.js @@ -0,0 +1,3 @@ +import("system.vars"); +import("system.result"); +result.string(vars.get("$field.WEBLINKID")); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/displayValueProcess.js b/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..4172453ca7446af20c19646ab6677cb871c5f06b --- /dev/null +++ b/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/displayValueProcess.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("system.result"); +import("Context_lib"); + +result.string(ContextUtils.loadContentTitle("WorkflowDefinition_entity", vars.get("$field.WORKFLOWPROCESSDEFINITION_KEY"))); \ No newline at end of file diff --git a/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/stateProcess.js b/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..177f86ce6cfe6bc584f4e6f3aba754c15d208220 --- /dev/null +++ b/entity/Weblink_entity/entityfields/workflowprocessdefinition_key/stateProcess.js @@ -0,0 +1,18 @@ +import("system.result"); +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.neon"); + +var linktype = vars.get("$field.LINKTYPE"); +var redirect = vars.get("$field.ISREDIRECT"); + +if (linktype == $KeywordRegistry.weblinkType$EMail() && redirect == "1") +{ + + result.string(neon.COMPONENTSTATE_EDITABLE); +} +else +{ + + result.string(neon.COMPONENTSTATE_INVISIBLE); +} \ No newline at end of file diff --git a/entity/Weblink_entity/recordcontainers/db/conditionProcess.js b/entity/Weblink_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8c1d7a1352f22e5f793e5a600e690357bdaf62fd --- /dev/null +++ b/entity/Weblink_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,10 @@ +import("system.result"); +import("system.result"); +import("Sql_lib"); + + +var cond = newWhere(); + +cond.and("url not like '/fileadmin/uploads/Dokumente/%' "); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/Weblink_entity/recordcontainers/db/orderClauseProcess.js b/entity/Weblink_entity/recordcontainers/db/orderClauseProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..38161951b9087fbc4b8c50bf683c86f7739c834e --- /dev/null +++ b/entity/Weblink_entity/recordcontainers/db/orderClauseProcess.js @@ -0,0 +1,5 @@ +import("system.result"); +import("system.db"); +result.object({ + "WEBLINK.URL": db.ASCENDING +}); \ No newline at end of file diff --git a/entity/DuplicateScannerPrefilterConfig_entity/recordcontainers/dbrecordcontainer/conditionProcess.js b/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/linktype.displayvalue/expression.js similarity index 100% rename from entity/DuplicateScannerPrefilterConfig_entity/recordcontainers/dbrecordcontainer/conditionProcess.js rename to entity/Weblink_entity/recordcontainers/db/recordfieldmappings/linktype.displayvalue/expression.js diff --git a/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/tags.value/expression.js b/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/tags.value/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..cc71aa0d01711dcadf67a55903df7ee3499f5e89 --- /dev/null +++ b/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/tags.value/expression.js @@ -0,0 +1,3 @@ +import("system.result"); +result.string("(SELECT GROUP_CONCAT(CONCAT(' ', TITLE)) from ab_keyword_entry join WEBLINKTAG on " ++" KEYID = WEBLINKTAG.TAG join ab_keyword_category on ab_keyword_category_id = ab_keyword_categoryid where WEBLINKTAG.WEBLINK_ID = WEBLINKID and AB_KEYWORD_CATEGORY.NAME = 'WeblinkTags')"); \ No newline at end of file diff --git a/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/urltype.displayvalue/expression.js b/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/urltype.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..92a7316b871e779d6a203b3bcc72352f3f95cc15 --- /dev/null +++ b/entity/Weblink_entity/recordcontainers/db/recordfieldmappings/urltype.displayvalue/expression.js @@ -0,0 +1,5 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +result.string(KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.weblinkType(), "WEBLINK.LINKTYPE")); \ No newline at end of file diff --git a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod index 17bfa5940323c1306ad8b4a09841f9e3cc53e973..97fcd7f503d021ab57d135da7912aa04363a6d0a 100644 --- a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod +++ b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod @@ -28,6 +28,12 @@ <fieldName>WorkflowDefinitions</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>349ab9d2-edbb-4571-be14-3fb749bfff50</name> + <entityName>Weblink_entity</entityName> + <fieldName>WorkflowDefinitions</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> <entityField> diff --git a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod index 7a23534af0c82d7804e1c40ff68e48726a0aee77..25609bc12adf79abfdaf5b52b9944a6a0db3423d 100644 --- a/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod +++ b/language/_____LANGUAGE_EXTRA/_____LANGUAGE_EXTRA.aod @@ -8076,6 +8076,12 @@ <entry> <key>EML files can't be edited here. You can download, edit and reupload the template to change the content.</key> </entry> + <entry> + <key>The duplicate row corrosponding to %0 has been rebuild</key> + </entry> + <entry> + <key>Duplicaterow rebuild</key> + </entry> <entry> <key>Edit HTML</key> </entry> @@ -8088,6 +8094,30 @@ <entry> <key>Add to offer</key> </entry> + <entry> + <key>Event Data</key> + </entry> + <entry> + <key>On Site</key> + </entry> + <entry> + <key>Event Type</key> + </entry> + <entry> + <key>Event Begin</key> + </entry> + <entry> + <key>Event</key> + </entry> + <entry> + <key>other</key> + </entry> + <entry> + <key>Event End</key> + </entry> + <entry> + <key>On site</key> + </entry> <entry> <key>Participant is already participating</key> </entry> @@ -8101,46 +8131,115 @@ <key>Traits have already been defined for this salesproject phase.</key> </entry> <entry> - <key>Event Data</key> + <key>New child product</key> </entry> <entry> - <key>On Site</key> + <key>Communication: Link</key> </entry> <entry> - <key>Event Type</key> + <key>Communication: Phone</key> </entry> <entry> - <key>New child product</key> + <key>Communication: Mail</key> </entry> <entry> - <key>Communication: Link</key> + <key>Vacation</key> </entry> <entry> - <key>Event Begin</key> + <key>Price could not be determined</key> </entry> <entry> - <key>Communication: Phone</key> + <key>Channel type</key> </entry> <entry> - <key>Event</key> + <key>Allowed</key> </entry> <entry> - <key>other</key> + <key>Rejected</key> </entry> <entry> - <key>Communication: Mail</key> + <key>Communication Settings</key> </entry> <entry> - <key>Vacation</key> + <key>Advertising</key> </entry> <entry> - <key>Event End</key> + <key>Test Recipient</key> </entry> <entry> - <key>On site</key> + <key>Remove Test Recipient</key> </entry> <entry> - <key>Price could not be determined</key> + <key>Set Test Recipient</key> + </entry> + <entry> + <key>Test Run Actions</key> + </entry> + <entry> + <key>Test Recipients</key> + </entry> + <entry> + <key>Object not found</key> + </entry> + <entry> + <key>Use for test run</key> + </entry> + <entry> + <key>Don't use for test run</key> + </entry> + <entry> + <key>Interest</key> + </entry> + <entry> + <key>Subscribed</key> + </entry> + <entry> + <key>Not subscribed</key> + </entry> + <entry> + <key>Test Run</key> + </entry> + <entry> + <key>Placeholder</key> + </entry> + <entry> + <key>Link Type</key> + </entry> + <entry> + <key>Clicks</key> + </entry> + <entry> + <key>Device Type</key> + </entry> + <entry> + <key>Mobile</key> + </entry> + <entry> + <key>Console</key> + </entry> + <entry> + <key>IP Address</key> + </entry> + <entry> + <key>Operating System</key> + </entry> + <entry> + <key>Date Clicked</key> + </entry> + <entry> + <key>Send Date</key> + </entry> + <entry> + <key>Filter can't be empty</key> + </entry> + <entry> + <key>Opening Date</key> + </entry> + <entry> + <key>Recipient filter</key> + </entry> + <entry> + <key>Url must be unique</key> </entry> <entry> <key>Volume(€)</key> @@ -8151,9 +8250,6 @@ <entry> <key>Invalid value</key> </entry> - <entry> - <key>Object not found</key> - </entry> <entry> <key>Value is too big, the maximum is %0</key> </entry> @@ -8275,151 +8371,167 @@ <key>Shows the global Covid Cases in a Table</key> </entry> <entry> - <key>Buyer</key> + <key>Global Cases Table</key> </entry> <entry> - <key>Internal responsible</key> + <key>Global Cases</key> </entry> <entry> - <key>Global Cases Table</key> + <key>New Cases</key> </entry> <entry> - <key>Global Cases</key> + <key>Shows the new daily Covid Cases</key> </entry> <entry> - <key>Initiator</key> + <key>${SALESPROJECT_PROSPECT}</key> </entry> <entry> - <key>New Cases</key> + <key>${SALESPROJECT_LEAD}</key> </entry> <entry> - <key>Internal Sales</key> + <key>${SALESPROJECT_CONTACT}</key> </entry> <entry> - <key>Influencer</key> + <key>Starts the serverprocess manually, which will recalculate all (potentially) outdated classifications. Use this after changes to the configuration of classifications.</key> </entry> <entry> - <key>Shows the new daily Covid Cases</key> + <key>Title (translated)</key> </entry> <entry> - <key>Shows the global Covid Cases in a Table</key> + <key>There already exists a %0 price with the same type of pricelist, quantity and currency in the defined range.</key> </entry> <entry> - <key>Buyer</key> + <key>Competitions/Competitor</key> </entry> <entry> - <key>Internal responsible</key> + <key>Starts the serverprocess manually, which will recalculate all classifications from scratch. Only do this after e.g importing data from elsewhere where the outdated flag couldn't been set correctly. Since this can take some time.</key> </entry> <entry> - <key>Global Cases Table</key> + <key>Invalid attribute count</key> </entry> <entry> - <key>Global Cases</key> + <key>Redirect needs a full Url with http/https</key> </entry> <entry> - <key>Initiator</key> + <key>${IGNORE_DUPLICATE}</key> </entry> <entry> - <key>New Cases</key> + <key>${UNIGNORE_DUPLICATE}</key> </entry> <entry> - <key>Internal Sales</key> + <key>View all duplicates from this scanner</key> </entry> <entry> - <key>Influencer</key> + <key>Rebuild all duplicates from the selected scanners</key> </entry> <entry> - <key>Shows the new daily Covid Cases</key> + <key>View duplicates</key> </entry> <entry> - <key>Event Data</key> + <key>Rebuild selected entries</key> </entry> <entry> - <key>On Site</key> + <key>Ignored</key> + <value>Ignoriert</value> </entry> <entry> - <key>Event Type</key> + <key>Not enough room in campaignstep</key> </entry> <entry> - <key>New child product</key> + <key>Location of the Event</key> </entry> <entry> - <key>Communication: Link</key> + <key>Migrate Probabilities</key> </entry> <entry> - <key>Event Begin</key> + <key>change DSGVO Relevance</key> </entry> <entry> - <key>Communication: Phone</key> + <key>No customer since creation > 3 years</key> </entry> <entry> - <key>Event</key> + <key>advanced training</key> </entry> <entry> - <key>other</key> + <key>No valid sales contract</key> </entry> <entry> - <key>Communication: Mail</key> + <key>Count Usage</key> </entry> <entry> - <key>Vacation</key> + <key>Marked for deletion</key> </entry> <entry> - <key>Event End</key> + <key>Add Manuel Delete Flag</key> </entry> <entry> - <key>On site</key> + <key>DSGVO Configuration</key> </entry> <entry> - <key>Event Data</key> + <key>Privacy Notice</key> </entry> <entry> - <key>On Site</key> + <key>Code</key> </entry> <entry> - <key>Event Type</key> + <key>Mark to Delete</key> </entry> <entry> - <key>New child product</key> + <key>Is an active employee</key> </entry> <entry> - <key>Communication: Link</key> + <key>Open Contacts</key> </entry> <entry> - <key>Event Begin</key> + <key>Integer</key> </entry> <entry> - <key>Buying center and internal project team</key> + <key>anonymize Persons</key> </entry> <entry> - <key>Communication: Phone</key> + <key>DSGVO</key> </entry> <entry> - <key>Event</key> + <key>Event Planer</key> </entry> <entry> - <key>other</key> + <key>is DSGVO Relevant</key> </entry> <entry> - <key>Communication: Mail</key> + <key>Manuel set</key> </entry> <entry> - <key>Vacation</key> + <key>consent pending</key> </entry> <entry> - <key>Event End</key> + <key>Mark selection to delete</key> </entry> <entry> - <key>On site</key> + <key>Mark all to delete</key> </entry> <entry> - <key>${SALESPROJECT_PROSPECT}</key> + <key>Manually set</key> </entry> <entry> - <key>${SALESPROJECT_LEAD}</key> + <key>Add Manual Delete Flag</key> </entry> <entry> - <key>${SALESPROJECT_CONTACT}</key> + <key>Delete Delay in Days</key> + </entry> + <entry> + <key>Do you want to delete the flags of the already maked Persons?</key> + </entry> + <entry> + <key>Do you really want to anonymize all marked persons?</key> + </entry> + <entry> + <key>FILE MISSING</key> + </entry> + <entry> + <key>All of the chosen records are already in the campaign</key> + </entry> + <entry> + <key>All of the chosen records are already in the campaignstep</key> </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod index e452e7706338b32c9653d260c13643d774291c76..827c44f0eb0e86f04f369a2f32bef89b79bef0dd 100644 --- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod +++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod @@ -10,6 +10,30 @@ <key>Event End</key> <value>Veranstaltungs Ende</value> </entry> + <entry> + <key>Redirect needs a full Url with http/https</key> + <value>Für die Weiterleitung wird eine vollständige Url mit http/https benötigt</value> + </entry> + <entry> + <key>Use for test run</key> + <value>Bei Testversand verwenden</value> + </entry> + <entry> + <key>Not subscribed</key> + <value>Nicht abonniert</value> + </entry> + <entry> + <key>Set Test Recipient</key> + <value>Testempfänger setzen</value> + </entry> + <entry> + <key>Url must be unique</key> + <value>Die Url muss eindeutig sein!</value> + </entry> + <entry> + <key>Opening Date</key> + <value>Öffnungsdatum</value> + </entry> <entry> <key>%0 out of %1 records were changed to \"%2\".\n %3 record/s could not be updated.</key> <value>%0 von %1 Datensätze wurden auf \"%2\" geändert.\n%3 Datensätze konnten nicht akutualisiert werden.</value> @@ -18,6 +42,10 @@ <key>Value is too big, the maximum is %0</key> <value>Wert ist zu groß, das Maximum ist %0</value> </entry> + <entry> + <key>Not enough room in campaignstep</key> + <value>In der Kampagnenstufe ist nicht genug Platz vorhanden</value> + </entry> <entry> <key>The max participants count can not be equal or less then 0</key> <value>Die maximale Teilnehmerzahl muss größer 0 sein!</value> @@ -39,10 +67,22 @@ <key>Already existing</key> <value>Bereits existierende</value> </entry> + <entry> + <key>Rejected</key> + <value>Abgelehnt</value> + </entry> + <entry> + <key>Channel type</key> + <value>Kanalart</value> + </entry> <entry> <key>discounted Vat</key> <value>Rbt. Mehrwertssteuer</value> </entry> + <entry> + <key>Filter can't be empty</key> + <value>Filter darf nicht leer sein</value> + </entry> <entry> <key>Organisation Country</key> <value>Firma Land</value> @@ -87,6 +127,10 @@ <key>EML files can't be edited here. You can download, edit and reupload the template to change the content.</key> <value>Das Bearbeiten von EML-Dateien ist hier nicht möglich. Um den Inhalt zu ändern, können Sie die Vorlage herunterladen, bearbeiten und erneut hochladen.</value> </entry> + <entry> + <key>Date Clicked</key> + <value>Klickdatum</value> + </entry> <entry> <key>Value must be an integer</key> <value>Wert muss eine Ganzzahl sein</value> @@ -103,6 +147,10 @@ <key>Checklist entries</key> <value>Checklisteneinträge</value> </entry> + <entry> + <key>Operating System</key> + <value>Betriebssystem</value> + </entry> <entry> <key>Organisation Region</key> <value>Firma Kreis</value> @@ -119,6 +167,10 @@ <key>Project team: \"Project manager\"</key> <value>Projektteam: \"Projektmanager\"</value> </entry> + <entry> + <key>Send Date</key> + <value>Versanddatum</value> + </entry> <entry> <key>Organisation District</key> <value>Firma Gebiet</value> @@ -135,14 +187,26 @@ <key>descending</key> <value>absteigend</value> </entry> + <entry> + <key>Recipient filter</key> + <value>Empfänger Filter</value> + </entry> <entry> <key>Salesproject phases</key> <value>Vertriebsprojektphasen</value> </entry> + <entry> + <key>Test Recipient</key> + <value>Test Empfänger</value> + </entry> <entry> <key>To skip a salesproject phase isn't allowed.</key> <value>Das Überspringen einer Vertriebsprojektphase ist nicht erlaubt.</value> </entry> + <entry> + <key>IP Address</key> + <value>IP-Adresse</value> + </entry> <entry> <key>Its not allowed to step over some salesproject phases.</key> <value>Es ist nicht erlaubt Vertriebsprojektphasen zu überspringen.</value> @@ -511,6 +575,10 @@ <key>Object selection</key> <value>Objektauswahl</value> </entry> + <entry> + <key>All of the chosen records are already in the campaign</key> + <value>Alle ausgewählten Datensätze sind schon in der Kampagne.</value> + </entry> <entry> <key>Send</key> <value>Senden</value> @@ -995,6 +1063,10 @@ <key>Extend - request count</key> <value>Verlängert - Anfrageanzahl</value> </entry> + <entry> + <key>Console</key> + <value>Konsole</value> + </entry> <entry> <key>The person is already associated with another employee!</key> <value>Die Person ist bereits mit einem anderen Mitarbeiter verknüpft!</value> @@ -1075,6 +1147,10 @@ <key>We received data from</key> <value>Wir haben Daten erhalten von</value> </entry> + <entry> + <key>Allowed</key> + <value>Erlaubt</value> + </entry> <entry> <key>${SALESPROJECT_MEMBER}</key> <value>Projektteam</value> @@ -1095,6 +1171,10 @@ <key>Steps</key> <value>Stufen</value> </entry> + <entry> + <key>All of the chosen records are already in the campaignstep</key> + <value>Alle ausgewählten Datensätze sind schon in der Kampagnenstufe.</value> + </entry> <entry> <key>Days inactive</key> <value>Tage inaktiv</value> @@ -1412,6 +1492,10 @@ <key>ended (done)</key> <value>abgeschlossen (erledigt)</value> </entry> + <entry> + <key>Interest</key> + <value>Interesse</value> + </entry> <entry> <key>Document Template</key> <value>Dokumentvorlage</value> @@ -2239,6 +2323,10 @@ <entry> <key>#,##0.00</key> </entry> + <entry> + <key>Advertising</key> + <value>Werbung</value> + </entry> <entry> <key>Latin Name</key> <value>Lateinischer Name</value> @@ -2443,6 +2531,10 @@ <key>subject</key> <value>Betreff</value> </entry> + <entry> + <key>Mobile</key> + <value>Handy</value> + </entry> <entry> <key>Document templates</key> <value>Dokumentvorlagen</value> @@ -2995,6 +3087,10 @@ <key>Taiwan</key> <value>Taiwan</value> </entry> + <entry> + <key>Clicks</key> + <value>Klicks</value> + </entry> <entry> <key>Central African Republic</key> <value>Zentralafrikanische Republik</value> @@ -3127,6 +3223,10 @@ <key>It lists all areas that the user has to take care of.</key> <value>Es werden alle Gebiete aufgelistet, die der Benutzer betreuen muss.</value> </entry> + <entry> + <key>Device Type</key> + <value>Geräteart</value> + </entry> <entry> <key>Company_size</key> <value>Unternehmen_Größe</value> @@ -3435,6 +3535,10 @@ <key>Iceland</key> <value>Island</value> </entry> + <entry> + <key>Test Run Actions</key> + <value>Testversand Aktionen</value> + </entry> <entry> <key>Oman</key> <value>Oman</value> @@ -8022,6 +8126,10 @@ <entry> <key>SqlBuilder: pValue has to be a jdito variable which returns something different than null. (use *IfSet functions if you need optional conditions which are just ignored if value is null or undefined)</key> </entry> + <entry> + <key>Communication Settings</key> + <value>Werbeeinstellungen</value> + </entry> <entry> <key>SqlBuilder: invalid value-type for pCondition</key> </entry> @@ -8707,6 +8815,10 @@ Bitte Datumseingabe prüfen</value> <key>The status of the order was changed to \"sent\".</key> <value>Der Status des Belegs wurde auf \"versendet\" gesetzt.</value> </entry> + <entry> + <key>Placeholder</key> + <value>Platzhalter</value> + </entry> <entry> <key>Yearly</key> <value>jährlich</value> @@ -9499,6 +9611,10 @@ Bitte Datumseingabe prüfen</value> <key>Create model</key> <value>Modell erstellen</value> </entry> + <entry> + <key>Subscribed</key> + <value>Abonniert</value> + </entry> <entry> <key>Recipients after adding</key> <value>Empfänger nach dem hinzufügen</value> @@ -9798,14 +9914,26 @@ Bitte Datumseingabe prüfen</value> <key>Keep in Mind that changes to the Value with the greatest score directly affect the Classification Gradings of the Classification!</key> <value>Änderungen an dem Wert mit der höchsten Punktzahl beeinflußen die Klassifizierungsbewertungen der Klassifizierung!</value> </entry> + <entry> + <key>Remove Test Recipient</key> + <value>Testempfänger entfernen</value> + </entry> <entry> <key>Hint</key> <value>Hinweis</value> </entry> + <entry> + <key>Test Recipients</key> + <value>Test Empfänger</value> + </entry> <entry> <key>Parent Filter</key> <value>Übergeordneter Filter</value> </entry> + <entry> + <key>Link Type</key> + <value>Linkart</value> + </entry> <entry> <key>Filter information</key> <value>Informationen Filtern</value> @@ -10275,6 +10403,7 @@ Bitte Datumseingabe prüfen</value> </entry> <entry> <key>Channel</key> + <value>Kanal</value> </entry> <entry> <key>Import from Teams</key> @@ -10414,6 +10543,14 @@ Bitte Datumseingabe prüfen</value> <key>Max Points</key> <value>Maximale Punktzahl</value> </entry> + <entry> + <key>Don't use for test run</key> + <value>Bei Testversand nicht verwenden</value> + </entry> + <entry> + <key>Test Run</key> + <value>Testlauf</value> + </entry> <entry> <key>Are you sure you want to reload all classifications using the current classificationgradings?</key> <value>Bist du dir sicher, dass du alle Klassifizierungen anhand der konfigurierten Bewertungen neuberechnen willst?</value> @@ -10847,6 +10984,14 @@ Bitte Datumseingabe prüfen</value> <entry> <key>Calendar week</key> </entry> + <entry> + <key>Duplicaterow rebuild</key> + <value>Dubletten neu berechnet</value> + </entry> + <entry> + <key>The duplicate row corrosponding to %0 has been rebuild</key> + <value>Die Dupletten des %0 filters wurden neu berechnet</value> + </entry> <entry> <key>HTML Editor</key> </entry> @@ -10854,6 +10999,9 @@ Bitte Datumseingabe prüfen</value> <key>Participant is already participating</key> <value>Teilnehmer nimmt bereits teil.</value> </entry> + <entry> + <key>On site</key> + </entry> <entry> <key>incl. Dependencies</key> <value>incl. Abhänigkeiten</value> @@ -10864,10 +11012,6 @@ Bitte Datumseingabe prüfen</value> </entry> <entry> <key>Traits have already been defined for this salesproject phase.</key> - <value>Für diese Vertriebsprojektphase wurden schon Merkmale festgelegt.</value> - </entry> - <entry> - <key>On site</key> </entry> <entry> <key>Vacation</key> @@ -10875,11 +11019,6 @@ Bitte Datumseingabe prüfen</value> </entry> <entry> <key>Price could not be determined</key> - <value>Preis konnte nicht ermittelt werden</value> - </entry> - <entry> - <key>Buying center and internal project team</key> - <value>Buyingcenter und internes Projektteam</value> </entry> <entry> <key>Feasibility</key> @@ -10905,6 +11044,34 @@ Bitte Datumseingabe prüfen</value> <key>Internal responsible</key> <value>Intern: Gebietsverantwortlich</value> </entry> + <entry> + <key>${IGNORE_DUPLICATE}</key> + <value>Datensatz ist keine Dublette</value> + </entry> + <entry> + <key>${UNIGNORE_DUPLICATE}</key> + <value>Datensatz ist eine Dublette</value> + </entry> + <entry> + <key>Rebuild selected entries</key> + <value>Ausgewählte Einträge neu aufbauen</value> + </entry> + <entry> + <key>Rebuild all duplicates from the selected scanners</key> + <value>Ausgewählte Einträge neu aufbauen</value> + </entry> + <entry> + <key>View duplicates</key> + <value>Dubletten anzeigen</value> + </entry> + <entry> + <key>View all duplicates from this scanner</key> + <value>Alle Duplikate dieses Scanners anzeigen</value> + </entry> + <entry> + <key>Ignored</key> + <value>Ignoriert</value> + </entry> <entry> <key>Invalid attribute count</key> <value>Unzulässige Attributanzahl</value> @@ -10917,6 +11084,97 @@ Bitte Datumseingabe prüfen</value> <key>There already exists a %0 price with the same type of pricelist, quantity and currency in the defined range.</key> <value>Es gibt bereits einen %0 Preis mit der selben Preisliste, Menge und Einheit im festgeleten Bereich.</value> </entry> + <entry> + <key>change DSGVO Relevance</key> + <value>ändere DSGVO-Relevanz</value> + </entry> + <entry> + <key>No customer since creation > 3 years</key> + <value>Kein Kundenkontakt seit erzeugung > 3 Jahre</value> + </entry> + <entry> + <key>No valid sales contract</key> + <value>Kein Kauvertrag vorhanden</value> + </entry> + <entry> + <key>Count Usage</key> + <value>Anzahl der Verwendungen</value> + </entry> + <entry> + <key>Marked for deletion</key> + <value>Makiert zum Löschen</value> + </entry> + <entry> + <key>Add Manual Delete Flag</key> + <value>Füge mauelles Löschkenzeichen hinzu</value> + </entry> + <entry> + <key>DSGVO Configuration</key> + <value>DSGVO Konfiguration</value> + </entry> + <entry> + <key>Privacy Notice</key> + <value>Datenschutzerklärung</value> + </entry> + <entry> + <key>Mark to Delete</key> + <value>Makieren zum Löschen</value> + </entry> + <entry> + <key>Is an active employee</key> + <value>Ist ein aktiver Mitarbeiter</value> + </entry> + <entry> + <key>Open Contacts</key> + <value>Öffne Kontakte</value> + </entry> + <entry> + <key>anonymize Persons</key> + <value>Anonymisieren der Personen</value> + </entry> + <entry> + <key>DSGVO</key> + </entry> + <entry> + <key>is DSGVO Relevant</key> + <value>Ist DSGVO Relevant</value> + </entry> + <entry> + <key>Manuel set</key> + <value>Manuel gesetz</value> + </entry> + <entry> + <key>Mark all to delete</key> + <value>Makiere alle zum Löschen</value> + </entry> + <entry> + <key>Mark selection to delete</key> + <value>Makiere selectierte zum Löschen</value> + </entry> + <entry> + <key>consent pending</key> + <value>Zustimmung austehend</value> + </entry> + <entry> + <key>Manually set</key> + <value>Manuell gesetzt</value> + </entry> + <entry> + <key>Delete Delay in Days</key> + <value>Löschverzögerung in Tagen</value> + </entry> + <entry> + <key>Do you want to delete the flags of the already maked Persons?</key> + <value>Möchtest du die bereits gesetzten Makierungen löschen?</value> + </entry> + <entry> + <key>Do you really want to anonymize all marked persons?</key> + <value>Möchtest wirklich alle zur Löschung makrierten Personen anonymisieren?</value> + </entry> + <entry> + <key>FILE MISSING</key> + <value>DATEI FEHLT</value> + </entry> <entry> <key>${SALESPROJECT_PROSPECT}</key> <value>Prospect</value> @@ -10933,6 +11191,39 @@ Bitte Datumseingabe prüfen</value> <key>Competitions/Competitor</key> <value>Mitbewerber/Wettbewerber</value> </entry> + <entry> + <key>Turnover, Forecast, Planning</key> + </entry> + <entry> + <key>Buying center and internal project team</key> + </entry> + <entry> + <key>Starts the serverprocess manually, which will recalculate all (potentially) outdated classifications. Use this after changes to the configuration of classifications.</key> + </entry> + <entry> + <key>Starts the serverprocess manually, which will recalculate all classifications from scratch. Only do this after e.g importing data from elsewhere where the outdated flag couldn't been set correctly. Since this can take some time.</key> + </entry> + <entry> + <key>Code</key> + </entry> + <entry> + <key>advanced training</key> + </entry> + <entry> + <key>Migrate Probabilities</key> + </entry> + <entry> + <key>Add Manuel Delete Flag</key> + </entry> + <entry> + <key>Location of the Event</key> + </entry> + <entry> + <key>Event Planer</key> + </entry> + <entry> + <key>Integer</key> + </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 bdbd5793b38747eeaea0d20b38e287484ea5c9cd..db9fcca19c623ee0ce0484bc21b17014d8813578 100644 --- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod +++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod @@ -8190,6 +8190,9 @@ <entry> <key>Add to offer</key> </entry> + <entry> + <key>On Site</key> + </entry> <entry> <key>Participant is already participating</key> </entry> @@ -8203,38 +8206,125 @@ <key>Traits have already been defined for this salesproject phase.</key> </entry> <entry> - <key>On Site</key> + <key>New child product</key> </entry> <entry> - <key>New child product</key> + <key>Vacation</key> + </entry> + <entry> + <key>Price could not be determined</key> + </entry> + <entry> + <key>Channel type</key> </entry> <entry> <key>Communication: Link</key> </entry> + <entry> + <key>Allowed</key> + </entry> <entry> <key>Communication: Phone</key> </entry> + <entry> + <key>Rejected</key> + </entry> + <entry> + <key>Communication Settings</key> + </entry> + <entry> + <key>Advertising</key> + </entry> <entry> <key>Communication: Mail</key> </entry> <entry> - <key>Vacation</key> + <key>Test Recipient</key> </entry> <entry> - <key>Price could not be determined</key> + <key>Remove Test Recipient</key> </entry> <entry> - <key>Volume(€)</key> + <key>Set Test Recipient</key> </entry> <entry> - <key>Value is too small, the minimum is %0</key> + <key>Test Run Actions</key> </entry> <entry> - <key>Invalid value</key> + <key>Test Recipients</key> </entry> <entry> <key>Object not found</key> </entry> + <entry> + <key>Use for test run</key> + </entry> + <entry> + <key>Don't use for test run</key> + </entry> + <entry> + <key>Interest</key> + </entry> + <entry> + <key>Subscribed</key> + </entry> + <entry> + <key>Not subscribed</key> + </entry> + <entry> + <key>Test Run</key> + </entry> + <entry> + <key>Placeholder</key> + </entry> + <entry> + <key>Link Type</key> + </entry> + <entry> + <key>Clicks</key> + </entry> + <entry> + <key>Device Type</key> + </entry> + <entry> + <key>Mobile</key> + </entry> + <entry> + <key>Console</key> + </entry> + <entry> + <key>IP Address</key> + </entry> + <entry> + <key>Operating System</key> + </entry> + <entry> + <key>Date Clicked</key> + </entry> + <entry> + <key>Send Date</key> + </entry> + <entry> + <key>Filter can't be empty</key> + </entry> + <entry> + <key>Opening Date</key> + </entry> + <entry> + <key>Recipient filter</key> + </entry> + <entry> + <key>Url must be unique</key> + </entry> + <entry> + <key>Volume(€)</key> + </entry> + <entry> + <key>Value is too small, the minimum is %0</key> + </entry> + <entry> + <key>Invalid value</key> + </entry> <entry> <key>Value is too big, the maximum is %0</key> </entry> @@ -8356,82 +8446,177 @@ <key>Shows the global Covid Cases in a Table</key> </entry> <entry> - <key>Buyer</key> + <key>Global Cases Table</key> </entry> <entry> - <key>Internal responsible</key> + <key>Global Cases</key> </entry> <entry> - <key>Global Cases Table</key> + <key>New Cases</key> </entry> <entry> - <key>Global Cases</key> + <key>Shows the new daily Covid Cases</key> </entry> <entry> - <key>Initiator</key> + <key>${SALESPROJECT_PROSPECT}</key> + <value>Prospect</value> </entry> <entry> - <key>New Cases</key> + <key>${SALESPROJECT_LEAD}</key> + <value>Lead</value> </entry> <entry> - <key>Internal Sales</key> + <key>${SALESPROJECT_CONTACT}</key> + <value>Contact</value> </entry> <entry> - <key>Influencer</key> + <key>Starts the server process manually, which will recalculate all (potentially) outdated classifications. This process should be executed after changes to the classification configuration.</key> </entry> <entry> - <key>Shows the new daily Covid Cases</key> + <key>Title (translated)</key> </entry> <entry> - <key>On Site</key> + <key>Starts the server process manually, which will recalculate all classifications from scratch. This process should only be executed after importing data from elsewhere, where the outdated flag couldn't be set correctly, since this can take some time.</key> </entry> <entry> - <key>New child product</key> + <key>There already exists a %0 price with the same type of pricelist, quantity and currency in the defined range.</key> </entry> <entry> - <key>Communication: Link</key> + <key>Competitions/Competitor</key> </entry> <entry> - <key>Communication: Phone</key> + <key>Invalid attribute count</key> </entry> <entry> - <key>Communication: Mail</key> + <key>Redirect needs a full Url with http/https</key> </entry> <entry> - <key>Vacation</key> + <key>${IGNORE_DUPLICATE}</key> + <value>Record is not a duplicate</value> </entry> <entry> - <key>On Site</key> + <key>${UNIGNORE_DUPLICATE}</key> + <value>Record is a duplicate</value> </entry> <entry> - <key>New child product</key> + <key>View all duplicates from this scanner</key> </entry> <entry> - <key>Communication: Link</key> + <key>Rebuild all duplicates from the selected scanners</key> </entry> <entry> - <key>Buying center and internal project team</key> + <key>View duplicates</key> </entry> <entry> - <key>Communication: Phone</key> + <key>Rebuild selected entries</key> </entry> <entry> - <key>Communication: Mail</key> + <key>Ignored</key> </entry> <entry> - <key>Vacation</key> + <key>Not enough room in campaignstep</key> </entry> <entry> - <key>${SALESPROJECT_PROSPECT}</key> - <value>Prospect</value> + <key>Location of the Event</key> </entry> <entry> - <key>${SALESPROJECT_LEAD}</key> - <value>Lead</value> + <key>Migrate Probabilities</key> </entry> <entry> - <key>${SALESPROJECT_CONTACT}</key> - <value>Contact</value> + <key>change DSGVO Relevance</key> + </entry> + <entry> + <key>No customer since creation > 3 years</key> + </entry> + <entry> + <key>advanced training</key> + </entry> + <entry> + <key>No valid sales contract</key> + </entry> + <entry> + <key>Count Usage</key> + </entry> + <entry> + <key>Marked for deletion</key> + </entry> + <entry> + <key>Add Manuel Delete Flag</key> + </entry> + <entry> + <key>DSGVO Configuration</key> + </entry> + <entry> + <key>Privacy Notice</key> + </entry> + <entry> + <key>Code</key> + </entry> + <entry> + <key>Mark to Delete</key> + </entry> + <entry> + <key>Is an active employee</key> + </entry> + <entry> + <key>Open Contacts</key> + </entry> + <entry> + <key>Integer</key> + </entry> + <entry> + <key>anonymize Persons</key> + </entry> + <entry> + <key>DSGVO</key> + </entry> + <entry> + <key>Event Planer</key> + </entry> + <entry> + <key>is DSGVO Relevant</key> + </entry> + <entry> + <key>Manuel set</key> + </entry> + <entry> + <key>consent pending</key> + </entry> + <entry> + <key>Mark selection to delete</key> + </entry> + <entry> + <key>Mark all to delete</key> + </entry> + <entry> + <key>Manually set</key> + </entry> + <entry> + <key>Add Manual Delete Flag</key> + </entry> + <entry> + <key>Delete Delay in Days</key> + </entry> + <entry> + <key>Do you want to delete the flags of the already maked Persons?</key> + </entry> + <entry> + <key>Do you really want to anonymize all marked persons?</key> + </entry> + <entry> + <key>FILE MISSING</key> + </entry> + <entry> + <key>All of the chosen records are already in the campaign</key> + </entry> + <entry> + <key>The duplicate row corrosponding to %0 has been rebuild</key> + </entry> + <entry> + <key>All of the chosen records are already in the campaignstep</key> + </entry> + <entry> + <key>Duplicaterow rebuild</key> </entry> </keyValueMap> <font name="Dialog" style="0" size="11" /> diff --git a/neonContext/BulkMailTestRecipient/BulkMailTestRecipient.aod b/neonContext/BulkMailTestRecipient/BulkMailTestRecipient.aod new file mode 100644 index 0000000000000000000000000000000000000000..5c35bf72c976ec78c161c38a8574c44c2bb5133a --- /dev/null +++ b/neonContext/BulkMailTestRecipient/BulkMailTestRecipient.aod @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>BulkMailTestRecipient</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>BulkMailTestRecipientFilter_view</filterView> + <editView>BulkMailTestRecipientEdit_view</editView> + <entity>BulkMailTestRecipient_entity</entity> + <references> + <neonViewReference> + <name>c9330ab3-e805-4dbb-8360-4767a966ae3a</name> + </neonViewReference> + <neonViewReference> + <name>eb1567ec-e5d3-4442-9fe3-7b456ba13ffe</name> + <view>BulkMailTestRecipientFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>b089fff4-d9b3-483d-871a-c59fcb1597ae</name> + <view>BulkMailTestRecipientEdit_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/CommunicationBlacklist/CommunicationBlacklist.aod b/neonContext/CommunicationBlacklist/CommunicationBlacklist.aod new file mode 100644 index 0000000000000000000000000000000000000000..9e69819413f07b0c7b52eb16983d9409f9226edf --- /dev/null +++ b/neonContext/CommunicationBlacklist/CommunicationBlacklist.aod @@ -0,0 +1,19 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>CommunicationBlacklist</name> + <title>Blacklist</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>CommunicationBlacklistFilter_view</filterView> + <editView>CommunicationBlacklistEdit_view</editView> + <entity>CommunicationBlacklist_entity</entity> + <references> + <neonViewReference> + <name>664796b3-d90b-439d-b960-a1f09e00c99d</name> + <view>CommunicationBlacklistFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>c08fe896-0181-4243-8639-cb96e302d3c8</name> + <view>CommunicationBlacklistEdit_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/CommunicationChannel/CommunicationChannel.aod b/neonContext/CommunicationChannel/CommunicationChannel.aod new file mode 100644 index 0000000000000000000000000000000000000000..e99ae10c9b630c39e05497cd0613d5cced5c936e --- /dev/null +++ b/neonContext/CommunicationChannel/CommunicationChannel.aod @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>CommunicationChannel</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entity>CommunicationChannel_entity</entity> +</neonContext> diff --git a/neonContext/CommunicationSettings/CommunicationSettings.aod b/neonContext/CommunicationSettings/CommunicationSettings.aod new file mode 100644 index 0000000000000000000000000000000000000000..99a89c8a6a4179e404a34149b1696e6879188f46 --- /dev/null +++ b/neonContext/CommunicationSettings/CommunicationSettings.aod @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>CommunicationSettings</name> + <title>Communication Settings</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>CommunicationSettingsFilter_view</filterView> + <editView>CommunicationSettingsEdit_view</editView> + <previewView>CommunicationSettingsPreview_view</previewView> + <entity>CommunicationSettings_entity</entity> + <references> + <neonViewReference> + <name>53b6570c-1a3f-4b82-9d00-5eeeb7e69f3e</name> + <view>CommunicationSettingsEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>4c8e9037-7f69-4b9e-aa4c-b13d6dfca6a0</name> + <view>CommunicationSettingsFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>f3831e2a-ab26-4708-88a3-17211f06ca75</name> + <view>CommunicationSettingsPreview_view</view> + </neonViewReference> + <neonViewReference> + <name>05b83302-c56b-4c03-a18f-8d78a93a27b1</name> + <view>CommunicationSettingsDrawer_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DSGVO/DSGVO.aod b/neonContext/DSGVO/DSGVO.aod index 1a7b678b320f344c420a269147b4cc947cfa577c..a493e487ba2ac91d82948d94c807c811bc717860 100644 --- a/neonContext/DSGVO/DSGVO.aod +++ b/neonContext/DSGVO/DSGVO.aod @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> <name>DSGVO</name> + <title>Data Privacy</title> <majorModelMode>DISTRIBUTED</majorModelMode> <filterView>DSGVOFilter_view</filterView> <editView>DSGVOEdit_view</editView> diff --git a/neonContext/DSGVOConfiguration/DSGVOConfiguration.aod b/neonContext/DSGVOConfiguration/DSGVOConfiguration.aod new file mode 100644 index 0000000000000000000000000000000000000000..d91e9c10ee71d6e952db08356878cd5dbd1b6a73 --- /dev/null +++ b/neonContext/DSGVOConfiguration/DSGVOConfiguration.aod @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>DSGVOConfiguration</name> + <title>DSGVO Configuration</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>DSGVOConfigurationFilter_view</filterView> + <editView>DSGVOConfigurationEdit_view</editView> + <previewView>DSGVOConfigurationPreview_view</previewView> + <entity>DSGVOConfiguration_entity</entity> + <references> + <neonViewReference> + <name>69adadd7-b1a3-4b25-bc72-807dc9bcdd15</name> + <view>DSGVOConfigurationEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>98b0a458-ff6b-472f-a403-c99d6389da0f</name> + <view>DSGVOConfigurationFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>824363d9-9924-404d-922f-c6cf447412d7</name> + <view>DSGVOConfigurationPreview_view</view> + </neonViewReference> + <neonViewReference> + <name>09c76322-225f-46cd-a3eb-48b56d6c661c</name> + <view>DSGVOConfigurationFilterFooter_view</view> + </neonViewReference> + <neonViewReference> + <name>ea7e56f5-e6f4-4c7c-872c-3ed6f0e5bf24</name> + <view>DSGVOConfigurationFilterHeader_view</view> + </neonViewReference> + <neonViewReference> + <name>ed051f3e-c8b3-4561-940f-cd54eeb91dd3</name> + <view>DSGVOConfigurationFilterFooter_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DuplicatesUnrelated/DuplicatesUnrelated.aod b/neonContext/DSGVOConfigurationAttribute/DSGVOConfigurationAttribute.aod similarity index 52% rename from neonContext/DuplicatesUnrelated/DuplicatesUnrelated.aod rename to neonContext/DSGVOConfigurationAttribute/DSGVOConfigurationAttribute.aod index 56bf4fd8574682d13f54fd2c5628fde361465b46..9c6dc17b905012355c5e6d4f3e813980322811c5 100644 --- a/neonContext/DuplicatesUnrelated/DuplicatesUnrelated.aod +++ b/neonContext/DSGVOConfigurationAttribute/DSGVOConfigurationAttribute.aod @@ -1,16 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> - <name>DuplicatesUnrelated</name> + <name>DSGVOConfigurationAttribute</name> <majorModelMode>DISTRIBUTED</majorModelMode> - <entity>DuplicatesUnrelated_entity</entity> + <filterView>DSGVOConfigurationAttributeFilter_view</filterView> + <entity>DSGVOConfigurationAttribute_entity</entity> <references> <neonViewReference> - <name>0b5cbd31-cfa1-4ee8-8bd2-b4772ac95953</name> - <view>DuplicatesUnrelatedPersonFilter_view</view> - </neonViewReference> - <neonViewReference> - <name>433a665e-63ac-4281-8f7c-08603362daf7</name> - <view>DuplicatesUnrelatedOrganisationFilter_view</view> + <name>984a036f-e75e-481e-8393-7c3e737d2d99</name> + <view>DSGVOConfigurationAttributeFilter_view</view> </neonViewReference> </references> </neonContext> diff --git a/neonContext/DSGVODeleteFlag/DSGVODeleteFlag.aod b/neonContext/DSGVODeleteFlag/DSGVODeleteFlag.aod new file mode 100644 index 0000000000000000000000000000000000000000..7797e1cfba519a1ea8dd0d860aafee00cf18ce15 --- /dev/null +++ b/neonContext/DSGVODeleteFlag/DSGVODeleteFlag.aod @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>DSGVODeleteFlag</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>DSGVODeleteFlagFilter_view</filterView> + <editView>DSGVODeleteFlagEdit_view</editView> + <previewView>DSGVODeleteFlagPreview_view</previewView> + <entity>DSGVODeleteFlag_entity</entity> + <references> + <neonViewReference> + <name>37d7c5ce-aa82-4b72-ad9c-e35ef9d07c24</name> + <view>DSGVODeleteFlagEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>835e41b0-4d84-4f7e-a07c-e706d1558449</name> + <view>DSGVODeleteFlagFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>60ccc758-e155-433b-abf6-e5e3d144ef7c</name> + <view>DSGVODeleteFlagPreview_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DuplicateOrganisation/DuplicateOrganisation.aod b/neonContext/DuplicateOrganisation/DuplicateOrganisation.aod new file mode 100644 index 0000000000000000000000000000000000000000..180a84c994ec66d9360520047ed577612fce6b84 --- /dev/null +++ b/neonContext/DuplicateOrganisation/DuplicateOrganisation.aod @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>DuplicateOrganisation</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <previewView>DuplicateOrganisationPreview_view</previewView> + <entity>DuplicateOrganisation_entity</entity> + <references> + <neonViewReference> + <name>c62620c2-33e3-4b76-bd76-0c1be1d516eb</name> + <view>DuplicateOrganisationFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>512ef5c4-dc95-4ef1-81e0-d45479249c2e</name> + <view>DuplicateOrganisationEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>07bbb126-8b4b-4f3c-a2c8-30409e0ee826</name> + </neonViewReference> + <neonViewReference> + <name>2e59d859-6b5f-4bb5-a47b-1225164140ed</name> + <view>DuplicateOrganisationPreview_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DuplicatePerson/DuplicatePerson.aod b/neonContext/DuplicatePerson/DuplicatePerson.aod new file mode 100644 index 0000000000000000000000000000000000000000..6d8e12f75aafc815feb17c94b9165e142be633e6 --- /dev/null +++ b/neonContext/DuplicatePerson/DuplicatePerson.aod @@ -0,0 +1,27 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>DuplicatePerson</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <previewView>DuplicatePersonPreview_view</previewView> + <entity>DuplicatePerson_entity</entity> + <references> + <neonViewReference> + <name>930c8a65-e92e-4222-9ca7-cbc663ebf274</name> + <view>DuplicatePersonFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>f54e544a-2279-41ec-a7b3-44e11989a736</name> + <view>DuplicatePersonEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>88155af6-074d-4683-b27e-20a8ef75dd8a</name> + </neonViewReference> + <neonViewReference> + <name>fb801ec5-ec73-4d6d-be3e-f2d78a57716f</name> + </neonViewReference> + <neonViewReference> + <name>596cd813-22e1-4ba6-96d5-fefefbb800cf</name> + <view>DuplicatePersonPreview_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/Duplicates/Duplicates.aod b/neonContext/Duplicates/Duplicates.aod deleted file mode 100644 index 5de0f3a1913c9bb49aecba2c8ea9998e23ad1faf..0000000000000000000000000000000000000000 --- a/neonContext/Duplicates/Duplicates.aod +++ /dev/null @@ -1,50 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> - <name>Duplicates</name> - <title>Duplicates</title> - <majorModelMode>DISTRIBUTED</majorModelMode> - <filterView>DuplicatesOverview_view</filterView> - <entity>Duplicates_entity</entity> - <references> - <neonViewReference> - <name>d8994f4c-3abf-4ff1-8bdb-f12e527df655</name> - <view>PersonDuplicatesFilter_view</view> - </neonViewReference> - <neonViewReference> - <name>de287a3b-1d6a-435c-b65e-d833c1751edf</name> - <view>DuplicatesOverview_view</view> - </neonViewReference> - <neonViewReference> - <name>5bdeb931-4e69-4520-bbc9-94fb17679331</name> - <view>PersonDublicatesTab_view</view> - </neonViewReference> - <neonViewReference> - <name>70cb2e96-5bc1-46cb-982f-b27db5d143d2</name> - <view>PersonClusterMain_view</view> - </neonViewReference> - <neonViewReference> - <name>7cdb6ca7-e99d-4eb6-897a-0953157bf62f</name> - <view>DuplicatesUnrelatedCluster_view</view> - </neonViewReference> - <neonViewReference> - <name>4b9a1a26-e14f-4246-b474-8bfb3e3a95b0</name> - <view>OrganisationDuplicatesTab_view</view> - </neonViewReference> - <neonViewReference> - <name>f9b46eab-7417-4f61-b7cd-dc772c04ddc0</name> - <view>OrganisationDuplicatesFilter_view</view> - </neonViewReference> - <neonViewReference> - <name>d68a425a-037a-4725-8dc1-b0afac277bdd</name> - <view>OrganisationUnrelatedDuplicates_view</view> - </neonViewReference> - <neonViewReference> - <name>4c1fc406-1c83-4fb6-9059-e45ff5c80756</name> - <view>OrganisationClusterMain_view</view> - </neonViewReference> - <neonViewReference> - <name>2400acfd-50e4-472d-b69c-368b9d25b6c6</name> - <view>PersonClusterPreview_view</view> - </neonViewReference> - </references> -</neonContext> diff --git a/neonContext/Interest/Interest.aod b/neonContext/Interest/Interest.aod new file mode 100644 index 0000000000000000000000000000000000000000..c78d21f7bfe50ee99dd70d41e648e30ca88bcac8 --- /dev/null +++ b/neonContext/Interest/Interest.aod @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>Interest</name> + <title>Interest</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>InterestFilter_view</filterView> + <editView>InterestEdit_view</editView> + <lookupView>InterestLookup_view</lookupView> + <entity>Interest_entity</entity> + <references> + <neonViewReference> + <name>835eeffb-73df-41fa-b1c3-9c659c9eeda6</name> + <view>InterestFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>c00312db-318a-45c6-a523-b668ef75a5f9</name> + <view>InterestEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>f394f1c7-99d2-4bd9-8daa-502f444c7dff</name> + <view>InterestLookup_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/InterestLink/InterestLink.aod b/neonContext/InterestLink/InterestLink.aod new file mode 100644 index 0000000000000000000000000000000000000000..c89728b86c92c119d00905163c5c583d320abfbe --- /dev/null +++ b/neonContext/InterestLink/InterestLink.aod @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>InterestLink</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>InterestLinkFilter_view</filterView> + <editView>InterestLinkEdit_view</editView> + <entity>InterestLink_entity</entity> + <references> + <neonViewReference> + <name>2a433681-9aec-403e-8bb7-29462265a4a9</name> + <view>InterestLinkEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>fb9f1140-7b69-4c45-94e0-c76fbb0d0318</name> + <view>InterestLinkFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>efdc5b84-9554-4760-a944-fad63f714ce1</name> + <view>InterestLinkDrawer_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/DuplicateScannerResultFieldConfig/DuplicateScannerResultFieldConfig.aod b/neonContext/MailLog/MailLog.aod similarity index 63% rename from neonContext/DuplicateScannerResultFieldConfig/DuplicateScannerResultFieldConfig.aod rename to neonContext/MailLog/MailLog.aod index 79d97363fbb75d25de88168f1dbd76713df82073..64c6bca732e03ed2731704a43d2238e5421301b3 100644 --- a/neonContext/DuplicateScannerResultFieldConfig/DuplicateScannerResultFieldConfig.aod +++ b/neonContext/MailLog/MailLog.aod @@ -1,12 +1,13 @@ <?xml version="1.0" encoding="UTF-8"?> <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> - <name>DuplicateScannerResultFieldConfig</name> + <name>MailLog</name> <majorModelMode>DISTRIBUTED</majorModelMode> - <entity>DuplicateScannerResultFieldConfig_entity</entity> + <filterView>MailLogFilter_view</filterView> + <entity>MailLog_entity</entity> <references> <neonViewReference> - <name>4bab12e9-c4c3-450f-bfcf-8ecbec1f994c</name> - <view>DuplicateScannerResultFieldConfigEdit_view</view> + <name>01787395-2369-42d2-ac0d-0062071df25e</name> + <view>MailLogFilter_view</view> </neonViewReference> </references> </neonContext> diff --git a/neonContext/Person/Person.aod b/neonContext/Person/Person.aod index 5a9b1ecbe90107c4e484b01a2a7755d85faa8284..987e28778162fd6550e11343ec919e3c59b21f5a 100644 --- a/neonContext/Person/Person.aod +++ b/neonContext/Person/Person.aod @@ -61,7 +61,18 @@ </neonViewReference> <neonViewReference> <name>2a6c44be-53e2-469e-84b3-615841bd4430</name> - <view>PersonDuplicateEditview_view</view> + </neonViewReference> + <neonViewReference> + <name>627518cc-15b0-4f0d-b6f3-ec06172e7c4e</name> + <view>PersonMarketing_view</view> + </neonViewReference> + <neonViewReference> + <name>be0bb97f-88e6-4a54-820c-7aee284a917a</name> + <view>PersonDSGVO_view</view> + </neonViewReference> + <neonViewReference> + <name>dc6b609b-7e28-4f76-b7f3-6fd8696b9b7d</name> + <view>PersonFilterOverlay_view</view> </neonViewReference> </references> </neonContext> diff --git a/neonContext/Weblink/Weblink.aod b/neonContext/Weblink/Weblink.aod new file mode 100644 index 0000000000000000000000000000000000000000..375a57a0ff63f17d071da1cf91e73a09bcc5fc4b --- /dev/null +++ b/neonContext/Weblink/Weblink.aod @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>Weblink</name> + <title>Linkmanagement</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <icon>NEON:FILTER</icon> + <mainView>WeblinkMain_view</mainView> + <filterView>WeblinkFilter_view</filterView> + <editView>WeblinkEdit_view</editView> + <previewView>WeblinkPreview_view</previewView> + <entity>Weblink_entity</entity> + <references> + <neonViewReference> + <name>1214292b-2504-4f83-97ba-507074a92342</name> + <view>WeblinkFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>26c15847-68bf-4ae1-80c6-bf4aebe02d3c</name> + <view>WeblinkEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>f5fd5e04-74a1-4c25-8237-9d6dcdc801f5</name> + <view>WeblinkMain_view</view> + </neonViewReference> + <neonViewReference> + <name>466496bf-b703-4e94-be8c-33100a5516c6</name> + <view>WeblinkPreview_view</view> + </neonViewReference> + <neonViewReference> + <name>e1de7061-bc31-4dfb-bc5e-2e75db1c52ea</name> + <view>WeblinkDrawer_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/WeblinkClick/WeblinkClick.aod b/neonContext/WeblinkClick/WeblinkClick.aod new file mode 100644 index 0000000000000000000000000000000000000000..06f55183587ce936ca90e2d452ecaf69070be639 --- /dev/null +++ b/neonContext/WeblinkClick/WeblinkClick.aod @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>WeblinkClick</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>WeblinkClickFilter_view</filterView> + <entity>WeblinkClick_entity</entity> + <references> + <neonViewReference> + <name>27fd3309-5cb7-4e27-85e3-68ce4ad2e60e</name> + <view>WeblinkClickFilter_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonContext/WeblinkTag/WeblinkTag.aod b/neonContext/WeblinkTag/WeblinkTag.aod new file mode 100644 index 0000000000000000000000000000000000000000..e34c5dcd3b26f1b05ad2d77d1c1fa4ec2ed41986 --- /dev/null +++ b/neonContext/WeblinkTag/WeblinkTag.aod @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>WeblinkTag</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>WeblinkTagFilter_view</filterView> + <editView>WeblinkTagEdit_view</editView> + <entity>WeblinkTag_entity</entity> + <references> + <neonViewReference> + <name>c4a7ba88-dd7e-4471-ae17-450602216475</name> + <view>WeblinkTagFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>51e9185c-cd69-483e-b618-fbb27cf8912b</name> + <view>WeblinkTagEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>77247264-cea7-4fb3-8f94-d172213faac8</name> + <view>WeblinkTagMultiEdit_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod index 2dbb4bea8358d3d2e1ea6f9ba29c0cc39c26e39d..6e234a5ab8e2adc42e80d17e1d25983814896cb0 100644 --- a/neonView/BulkMailEdit_view/BulkMailEdit_view.aod +++ b/neonView/BulkMailEdit_view/BulkMailEdit_view.aod @@ -76,6 +76,10 @@ <name>06f08869-5a81-41cb-8c7e-51be6a7041a7</name> <entityField>DESCRIPTION</entityField> </entityFieldLink> + <entityFieldLink> + <name>1891cd3a-34a5-4c7d-9e35-635640476c63</name> + <entityField>INTEREST_ID</entityField> + </entityFieldLink> </fields> </genericViewTemplate> <genericViewTemplate> diff --git a/neonView/BulkMailMain_view/BulkMailMain_view.aod b/neonView/BulkMailMain_view/BulkMailMain_view.aod index 5b05276c93901121cfd9cd663f1961454d76b4c2..82edef3461108d64ecf2d010d1fc81e8b11ed35f 100644 --- a/neonView/BulkMailMain_view/BulkMailMain_view.aod +++ b/neonView/BulkMailMain_view/BulkMailMain_view.aod @@ -24,6 +24,21 @@ <entityField>Activities</entityField> <view>ActivityFilter_view</view> </neonViewReference> + <neonViewReference> + <name>cd8c44c9-209b-464c-a2e0-ce15720ab22e</name> + <entityField>MailLogs</entityField> + <view>MailLogFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>f78d044a-6246-49c0-a72c-03f54fc90fd2</name> + <entityField>BulkMailTestRecipients</entityField> + <view>BulkMailTestRecipientFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>bd3876a9-492e-4e2e-bcca-e86455475dca</name> + <entityField>Clicks</entityField> + <view>WeblinkClickFilter_view</view> + </neonViewReference> <neonViewReference> <name>49eb2dd2-0df9-4b58-bdae-f941200be8d9</name> <entityField>LogHistories</entityField> diff --git a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod index 48b1894a84256da8c10d96df4dbb7aea0e9957ab..3cd10ec5dd64fc83bc30ae6601b7e51d83acdab2 100644 --- a/neonView/BulkMailPreview_view/BulkMailPreview_view.aod +++ b/neonView/BulkMailPreview_view/BulkMailPreview_view.aod @@ -35,6 +35,10 @@ <name>28c1e091-0fea-4324-8fb8-1893388354b7</name> <entityField>STATUS</entityField> </entityFieldLink> + <entityFieldLink> + <name>d588824d-1c21-483f-98eb-900f3e9722bd</name> + <entityField>DATE_TO_SEND</entityField> + </entityFieldLink> <entityFieldLink> <name>edbeea4d-019f-4661-b0d7-c07468e747cc</name> <entityField>DOCUMENTTEMPLATE_ID</entityField> @@ -51,21 +55,9 @@ <name>65546b24-3f6d-4639-b144-491ff5c478c1</name> <entityField>USE_TEMPLATE_ATTACHMENTS</entityField> </entityFieldLink> - </fields> - </genericViewTemplate> - <genericViewTemplate> - <name>Testing</name> - <showDrawer v="true" /> - <drawerCaption>Testing</drawerCaption> - <entityField>#ENTITY</entityField> - <fields> - <entityFieldLink> - <name>ea406803-6189-4de0-aa41-f09f7e1b2336</name> - <entityField>TESTING_CONTACT_ID</entityField> - </entityFieldLink> <entityFieldLink> - <name>f8963199-c89b-48e5-a92c-8f655c05acab</name> - <entityField>TESTING_EMAIL_ADDRESS</entityField> + <name>9f3df668-6741-4faf-9afc-a0d761db990a</name> + <entityField>INTEREST_ID</entityField> </entityFieldLink> </fields> </genericViewTemplate> diff --git a/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod index 9727da8fb78f8ff1ba6abd6414ffe00bbf0a4ffd..1638eaab615e83de9669b74a03027120d36a763a 100644 --- a/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod +++ b/neonView/BulkMailRecipientFilter_view/BulkMailRecipientFilter_view.aod @@ -15,6 +15,7 @@ <autoNewRow v="true" /> <entityField>#ENTITY</entityField> <favoriteActionGroup1>recipientActions</favoriteActionGroup1> + <favoriteActionGroup2>testRunActions</favoriteActionGroup2> <columns> <neonTableColumn> <name>eadd8b00-f4a8-4634-bcc7-9bd5c6dbc876</name> @@ -28,6 +29,10 @@ <name>953dbc49-ae13-4328-b0f1-6ed3b5f6fb7b</name> <entityField>EMAIL_ADDRESS</entityField> </neonTableColumn> + <neonTableColumn> + <name>f7a64961-afcb-45ab-bb8d-6b3097363463</name> + <entityField>IS_TEST_RECIPIENT</entityField> + </neonTableColumn> <neonTableColumn> <name>f311e8da-4139-48bd-a792-6df572dce7ad</name> <entityField>STATUS</entityField> @@ -55,6 +60,10 @@ <name>8b75c1fc-71ce-4b38-aa51-81ee8a42564b</name> <entityField>EMAIL_ADDRESS</entityField> </neonTreeTableColumn> + <neonTreeTableColumn> + <name>2364fe2e-8056-4531-b999-407ca57157fe</name> + <entityField>IS_TEST_RECIPIENT</entityField> + </neonTreeTableColumn> <neonTreeTableColumn> <name>c904c6c0-b2e8-4192-a952-d4f1f6612dee</name> <entityField>STATUS</entityField> diff --git a/neonView/BulkMailTestRecipientEdit_view/BulkMailTestRecipientEdit_view.aod b/neonView/BulkMailTestRecipientEdit_view/BulkMailTestRecipientEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..f028be39b7b53ccd1acc65ad427b0322eeb80065 --- /dev/null +++ b/neonView/BulkMailTestRecipientEdit_view/BulkMailTestRecipientEdit_view.aod @@ -0,0 +1,27 @@ +<?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>BulkMailTestRecipientEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>16077d02-29d9-4acb-9728-7799011d1955</name> + <entityField>CONTACT_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>23bf7ac8-dd52-4964-bf20-6d9955dc8908</name> + <entityField>EMAIL_ADDRESS</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/BulkMailTestRecipientFilter_view/BulkMailTestRecipientFilter_view.aod b/neonView/BulkMailTestRecipientFilter_view/BulkMailTestRecipientFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..2ba06b22052fac7cda118e4c798f78ae1ae69c1a --- /dev/null +++ b/neonView/BulkMailTestRecipientFilter_view/BulkMailTestRecipientFilter_view.aod @@ -0,0 +1,25 @@ +<?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>BulkMailTestRecipientFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <columns> + <neonTableColumn> + <name>d085feb9-5bbb-444a-84f4-a03746e6b015</name> + <entityField>CONTACT_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>1e307d8a-3f70-4f34-8e84-27f0e8ec89f4</name> + <entityField>EMAIL_ADDRESS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/CommunicationBlacklistEdit_view/CommunicationBlacklistEdit_view.aod b/neonView/CommunicationBlacklistEdit_view/CommunicationBlacklistEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..7ca289f4bd074cc4bb8c460be628c7e0492d683b --- /dev/null +++ b/neonView/CommunicationBlacklistEdit_view/CommunicationBlacklistEdit_view.aod @@ -0,0 +1,39 @@ +<?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>CommunicationBlacklistEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>5bf6cb8b-20da-4e64-ab86-e654e1f9f6a5</name> + <entityField>BLACKLIST_TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>bad5d056-972e-4d10-b3c7-a25bf6233cb5</name> + <entityField>BLACKLIST_FILTER</entityField> + </entityFieldLink> + <entityFieldLink> + <name>f74c2a6a-1b70-4914-8059-8866a0e5db77</name> + <entityField>START_DATE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>2b2bb0e7-7cdf-42ca-8c0b-89d1d869fa44</name> + <entityField>END_DATE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>947da750-50bd-47bb-af2d-7446b3756482</name> + <entityField>REASON</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/CommunicationBlacklistFilter_view/CommunicationBlacklistFilter_view.aod b/neonView/CommunicationBlacklistFilter_view/CommunicationBlacklistFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..232b308af1e76c7e8cfb74d7ba3b0c25fa595806 --- /dev/null +++ b/neonView/CommunicationBlacklistFilter_view/CommunicationBlacklistFilter_view.aod @@ -0,0 +1,34 @@ +<?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>CommunicationBlacklistFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <columns> + <neonTableColumn> + <name>86497fa4-acda-4041-8cbc-8d11838b4876</name> + <entityField>BLACKLIST_TYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>304b2589-aabf-42f6-916f-a69cff5a1b00</name> + <entityField>START_DATE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>fd5077c1-942b-42f0-8f44-80e9c568db44</name> + <entityField>END_DATE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d7050f91-da78-4ffc-a31c-30985d808473</name> + <entityField>REASON</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/CommunicationSettingsDrawer_view/CommunicationSettingsDrawer_view.aod b/neonView/CommunicationSettingsDrawer_view/CommunicationSettingsDrawer_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..e3d426b3f4f88373e8cf99ea5016a6dad171d37c --- /dev/null +++ b/neonView/CommunicationSettingsDrawer_view/CommunicationSettingsDrawer_view.aod @@ -0,0 +1,19 @@ +<?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>CommunicationSettingsDrawer_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <drawerLayout> + <name>layout</name> + <layoutCaption>Communication Settings</layoutCaption> + <fixedDrawer v="true" /> + </drawerLayout> + </layout> + <children> + <neonViewReference> + <name>c39e99e6-589c-4991-8c24-c55210744a87</name> + <entityField>#ENTITY</entityField> + <view>CommunicationSettingsFilter_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/CommunicationSettingsEdit_view/CommunicationSettingsEdit_view.aod b/neonView/CommunicationSettingsEdit_view/CommunicationSettingsEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..e617c0d1ac520aa028fd4fd381e784548e7e1e4a --- /dev/null +++ b/neonView/CommunicationSettingsEdit_view/CommunicationSettingsEdit_view.aod @@ -0,0 +1,39 @@ +<?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>CommunicationSettingsEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>CommunicationData</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>1d8b8e9b-2efc-4892-9d9a-ecc78874fd67</name> + <entityField>CHANNEL_TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>41399ea7-2607-492d-898e-85a74bcad694</name> + <entityField>MEDIUM</entityField> + </entityFieldLink> + <entityFieldLink> + <name>d9e0801b-824c-4576-b998-73d9a05ab73e</name> + <entityField>CHANNEL_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>160baaf0-8e0f-472c-8127-8309f69399ff</name> + <entityField>STATUS</entityField> + </entityFieldLink> + <entityFieldLink> + <name>6d34768e-ea37-426b-b1e0-242b0a245c1c</name> + <entityField>INFO</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod b/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..969334026b5760bd6ccbec315ed7a2033b94f752 --- /dev/null +++ b/neonView/CommunicationSettingsFilter_view/CommunicationSettingsFilter_view.aod @@ -0,0 +1,42 @@ +<?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>CommunicationSettingsFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <treeTableViewTemplate> + <name>TreeTable</name> + <columns> + <neonTreeTableColumn> + <name>1e698c64-ce5c-46d1-8c90-290d5ea187c7</name> + <entityField>ICON</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>5738f47a-57cd-4e6a-a017-1a5ab80581ac</name> + <entityField>CHANNEL_TYPE</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>a0eb5938-dad6-4d5c-b6f3-47cac8c720f8</name> + <entityField>CHANNEL_ID</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>70b811c4-c78a-43c1-91d3-f0d168a6d81e</name> + <entityField>MEDIUM</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>85b13242-8fb1-4528-8ea9-9ed2fe02fc77</name> + <entityField>STATUS</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>14c8c930-01ad-4142-bad9-456666317435</name> + <entityField>INFO</entityField> + </neonTreeTableColumn> + </columns> + </treeTableViewTemplate> + </children> +</neonView> diff --git a/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod b/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..8551f448c5fb966fd25c9bfb2ac700f35d584eac --- /dev/null +++ b/neonView/CommunicationSettingsPreview_view/CommunicationSettingsPreview_view.aod @@ -0,0 +1,55 @@ +<?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>CommunicationSettingsPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + <header>Card</header> + </headerFooterLayout> + </layout> + <children> + <cardViewTemplate> + <name>Card</name> + <iconField>ICON</iconField> + <titleField>#CONTENTTITLE</titleField> + <subtitleField>STATUS</subtitleField> + <isEditable v="false" /> + </cardViewTemplate> + <genericViewTemplate> + <name>Infos</name> + <showDrawer v="true" /> + <drawerCaption>Details</drawerCaption> + <fields> + <entityFieldLink> + <name>82483a97-4ffb-4e48-8791-477e193aa648</name> + <entityField>CHANNEL_TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>f2be357b-a772-4d10-bdff-7e6c94dc9d33</name> + <entityField>MEDIUM</entityField> + </entityFieldLink> + <entityFieldLink> + <name>1bc8d44c-a8a3-4858-a1e7-c49b49fec9a4</name> + <entityField>CHANNEL_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>04a5a72f-864c-420a-8e77-274083bcfe47</name> + <entityField>STATUS</entityField> + </entityFieldLink> + <entityFieldLink> + <name>8a96457a-c8bd-4a06-ace2-e8b7163f3983</name> + <entityField>INFO</entityField> + </entityFieldLink> + <entityFieldLink> + <name>b077ec37-4e6a-417d-945f-b1b870dd72bb</name> + <entityField>DATE_NEW</entityField> + </entityFieldLink> + <entityFieldLink> + <name>8d38a5ea-3905-44ba-8d12-8095e840e830</name> + <entityField>DATE_EDIT</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/DSGVOConfigurationAttributeFilter_view/DSGVOConfigurationAttributeFilter_view.aod b/neonView/DSGVOConfigurationAttributeFilter_view/DSGVOConfigurationAttributeFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..6c6822333640d901714a27697603c97235558ea0 --- /dev/null +++ b/neonView/DSGVOConfigurationAttributeFilter_view/DSGVOConfigurationAttributeFilter_view.aod @@ -0,0 +1,33 @@ +<?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>DSGVOConfigurationAttributeFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="false" /> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <treeTableViewTemplate> + <name>TreeTable</name> + <parentField>ATTRIBUTE_PARENT_ID</parentField> + <showChildrenCount v="false" /> + <expandRootItems v="false" /> + <favoriteActionGroup1>FilterActions</favoriteActionGroup1> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> + <columns> + <neonTreeTableColumn> + <name>7ffa35a6-5264-4354-9ee4-ad20ffc81a53</name> + <entityField>ATTRIBUTE_NAME</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>9d92f64a-45e6-402b-99c6-f113147271f9</name> + <entityField>isDSGVORelevant</entityField> + </neonTreeTableColumn> + </columns> + </treeTableViewTemplate> + </children> +</neonView> diff --git a/neonView/DSGVOConfigurationEdit_view/DSGVOConfigurationEdit_view.aod b/neonView/DSGVOConfigurationEdit_view/DSGVOConfigurationEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..e72917c6ffeb57b73799f1af990f36de8d50af1c --- /dev/null +++ b/neonView/DSGVOConfigurationEdit_view/DSGVOConfigurationEdit_view.aod @@ -0,0 +1,33 @@ +<?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>DSGVOConfigurationEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>ed3081a0-0b3b-4541-bb83-b721d9f61fb8</name> + <entityField>REASON</entityField> + </entityFieldLink> + <entityFieldLink> + <name>e2df9d14-8d26-4d5e-84d8-b8ba216a6a61</name> + <entityField>FILTER</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + <actionsViewTemplate> + <name>Actions</name> + <actions> + <element>OpenContacts</element> + </actions> + </actionsViewTemplate> + </children> +</neonView> diff --git a/neonView/DSGVOConfigurationFilterFooter_view/DSGVOConfigurationFilterFooter_view.aod b/neonView/DSGVOConfigurationFilterFooter_view/DSGVOConfigurationFilterFooter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..a9b323bda1837edb023e33d5587aa4593f4d70e6 --- /dev/null +++ b/neonView/DSGVOConfigurationFilterFooter_view/DSGVOConfigurationFilterFooter_view.aod @@ -0,0 +1,32 @@ +<?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>DSGVOConfigurationFilterFooter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <boxLayout> + <name>layout</name> + <direction>HORIZONTAL</direction> + </boxLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <favoriteActionGroup1>FilterConfigActions</favoriteActionGroup1> + <columns> + <neonTableColumn> + <name>d3efb473-4159-4652-b88b-b15142a3be9c</name> + <entityField>REASON</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d772b779-faef-44c5-93b6-f092298759c3</name> + <entityField>COUNT_USAGE</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + <neonViewReference> + <name>f77ed99c-f893-4cd6-8879-545ff353b77f</name> + <entityField>DSGVOConfigurationAttributes</entityField> + <view>DSGVOConfigurationAttributeFilter_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/DSGVOConfigurationFilterHeader_view/DSGVOConfigurationFilterHeader_view.aod b/neonView/DSGVOConfigurationFilterHeader_view/DSGVOConfigurationFilterHeader_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..9d164a33b5a40ab5b727d28b4294463364ad0d34 --- /dev/null +++ b/neonView/DSGVOConfigurationFilterHeader_view/DSGVOConfigurationFilterHeader_view.aod @@ -0,0 +1,23 @@ +<?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>DSGVOConfigurationFilterHeader_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <boxLayout> + <name>layout</name> + <autoHeight v="true" /> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <isEditable v="false" /> + <fields> + <entityFieldLink> + <name>1eb5807a-f82a-419b-bd7b-a020b7a6e778</name> + <entityField>alreadyMarked</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod b/neonView/DSGVOConfigurationFilter_view/DSGVOConfigurationFilter_view.aod similarity index 53% rename from neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod rename to neonView/DSGVOConfigurationFilter_view/DSGVOConfigurationFilter_view.aod index ed86c8059d4920b5576f13406c5d4d4f86597b71..fbc0eaaec35ceee30f300fa6b1a91334ab514cff 100644 --- a/neonView/OrganisationDuplicatesTab_view/OrganisationDuplicatesTab_view.aod +++ b/neonView/DSGVOConfigurationFilter_view/DSGVOConfigurationFilter_view.aod @@ -1,24 +1,24 @@ <?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>OrganisationDuplicatesTab_view</name> - <title>Organisation duplicates</title> + <name>DSGVOConfigurationFilter_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> <layout> - <boxLayout> + <headerFooterLayout> <name>layout</name> - <direction>HORIZONTAL</direction> - </boxLayout> + <header>2706fe93-0710-4d75-8cbb-c128676e66c5</header> + </headerFooterLayout> </layout> <children> <neonViewReference> - <name>8b4ab951-afb3-4fac-915b-89226ab2f849</name> - <entityField>SelfOrganisationDuplicatesConsumer</entityField> - <view>OrganisationDuplicatesFilter_view</view> + <name>2706fe93-0710-4d75-8cbb-c128676e66c5</name> + <entityField>#ENTITY</entityField> + <view>DSGVOConfigurationFilterHeader_view</view> </neonViewReference> <neonViewReference> - <name>d1e2ba4a-a5d6-4bba-a646-5918490e43a4</name> + <name>1fff34b8-e5d3-4829-be06-dd87f1177408</name> <entityField>#ENTITY</entityField> - <view>OrganisationUnrelatedDuplicates_view</view> + <view>DSGVOConfigurationFilterFooter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/DSGVOConfigurationPreview_view/DSGVOConfigurationPreview_view.aod b/neonView/DSGVOConfigurationPreview_view/DSGVOConfigurationPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..3752f87ff7336894643e83734358cfc4b8b7a5b8 --- /dev/null +++ b/neonView/DSGVOConfigurationPreview_view/DSGVOConfigurationPreview_view.aod @@ -0,0 +1,34 @@ +<?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>DSGVOConfigurationPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + <header>Card</header> + </headerFooterLayout> + </layout> + <children> + <cardViewTemplate> + <name>Card</name> + <titleField>REASON</titleField> + <subtitleField>FILTER</subtitleField> + <isEditable v="false" /> + </cardViewTemplate> + <genericViewTemplate> + <name>Generic</name> + <fields> + <entityFieldLink> + <name>290fa7cf-773e-4c06-9aaf-769946caa491</name> + <entityField>COUNT_USAGE</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + <actionsViewTemplate> + <name>Actions</name> + <actions> + <element>OpenContacts</element> + </actions> + </actionsViewTemplate> + </children> +</neonView> diff --git a/neonView/DSGVODeleteFlagEdit_view/DSGVODeleteFlagEdit_view.aod b/neonView/DSGVODeleteFlagEdit_view/DSGVODeleteFlagEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..8961be2d4881343e15b4a3c5dd4366fc0541067d --- /dev/null +++ b/neonView/DSGVODeleteFlagEdit_view/DSGVODeleteFlagEdit_view.aod @@ -0,0 +1,23 @@ +<?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>DSGVODeleteFlagEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>27a65e8e-9812-43aa-b261-6dfc0e9344a1</name> + <entityField>REASON</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod b/neonView/DSGVODeleteFlagFilter_view/DSGVODeleteFlagFilter_view.aod similarity index 56% rename from neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod rename to neonView/DSGVODeleteFlagFilter_view/DSGVODeleteFlagFilter_view.aod index 173666ab5f8a8ffb5ded2760fd5da08851e2e209..a15dc8d1a8cdc87c016dc495c92cc38c0f74b3ce 100644 --- a/neonView/DuplicatesUnrelatedPersonFilter_view/DuplicatesUnrelatedPersonFilter_view.aod +++ b/neonView/DSGVODeleteFlagFilter_view/DSGVODeleteFlagFilter_view.aod @@ -1,28 +1,27 @@ <?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>DuplicatesUnrelatedPersonFilter_view</name> + <name>DSGVODeleteFlagFilter_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> <layout> - <boxLayout> + <groupLayout> <name>layout</name> - </boxLayout> + </groupLayout> </layout> <children> <tableViewTemplate> - <name>UnrelatedPersons</name> - <hideContentSearch v="true" /> - <entityField>#ENTITY</entityField> + <name>DSGVODeleteFlagFilterTable</name> + <favoriteActionGroup1>FilterActions</favoriteActionGroup1> <isCreatable v="false" /> <isEditable v="false" /> - <title>Unrelated person duplicates</title> <columns> <neonTableColumn> - <name>734re984-6a0b-4126-ab49-452e2b54f76d</name> - <entityField>SourceDuplicateDescription</entityField> + <name>786d40dd-9d7c-47b6-ad82-0130f8c5b5c0</name> + <entityField>REASON</entityField> </neonTableColumn> <neonTableColumn> - <name>8615259b-de5b-378u-945d-2ff934ae1b8c</name> - <entityField>UnrelatedDuplicateDescription</entityField> + <name>68b05f9f-d50f-4fe8-89ec-fe1347008417</name> + <entityField>DATE_NEW</entityField> </neonTableColumn> </columns> </tableViewTemplate> diff --git a/neonView/DSGVODeleteFlagPreview_view/DSGVODeleteFlagPreview_view.aod b/neonView/DSGVODeleteFlagPreview_view/DSGVODeleteFlagPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..74eb6ae512ad38543b7900323c429ac09dfbe64d --- /dev/null +++ b/neonView/DSGVODeleteFlagPreview_view/DSGVODeleteFlagPreview_view.aod @@ -0,0 +1,35 @@ +<?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>DSGVODeleteFlagPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + <footer>DSGVODeleteFlagPreviewScoreCard</footer> + </headerFooterLayout> + </layout> + <children> + <genericViewTemplate> + <name>DSGVODeleteFlagPreviewGeneric</name> + <fields> + <entityFieldLink> + <name>5c923ee0-ad34-494a-9f12-b5c1ca431088</name> + <entityField>REASON</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + <scoreCardViewTemplate> + <name>DSGVODeleteFlagPreviewScoreCard</name> + <fields> + <entityFieldLink> + <name>9ff8e5f5-1244-4349-aadf-8cbd3d37cc97</name> + <entityField>USER_NEW</entityField> + </entityFieldLink> + <entityFieldLink> + <name>3ea79def-4411-41a5-a04d-dcbbcba459ca</name> + <entityField>DATE_NEW</entityField> + </entityFieldLink> + </fields> + </scoreCardViewTemplate> + </children> +</neonView> diff --git a/neonView/DSGVOEdit_view/DSGVOEdit_view.aod b/neonView/DSGVOEdit_view/DSGVOEdit_view.aod index 7b92fa16742092c9b43a0776dcd615180e220712..16f0ff1823b2f599005139241c3443663e5f6a0c 100644 --- a/neonView/DSGVOEdit_view/DSGVOEdit_view.aod +++ b/neonView/DSGVOEdit_view/DSGVOEdit_view.aod @@ -35,6 +35,10 @@ <name>605ab093-46de-4da2-a155-c86b02206553</name> <entityField>APPLY_CHANGE_FOR_ALL_CONTROL</entityField> </entityFieldLink> + <entityFieldLink> + <name>8a0c0387-8340-4710-8082-e66ebc47b626</name> + <entityField>bindata</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/neonView/DSGVOPreview_view/DSGVOPreview_view.aod b/neonView/DSGVOPreview_view/DSGVOPreview_view.aod index ff1974aa153cc55a605adae8c55d1bb06c99425d..36360ea06ba72c05f495eacfce5771d2ff6a82d9 100644 --- a/neonView/DSGVOPreview_view/DSGVOPreview_view.aod +++ b/neonView/DSGVOPreview_view/DSGVOPreview_view.aod @@ -38,6 +38,10 @@ <name>6cd8795a-9779-4a7d-9aaf-7da580424742</name> <entityField>APPLY_CHANGE_FOR_ALL_CONTROL</entityField> </entityFieldLink> + <entityFieldLink> + <name>12b07679-f932-44cc-baaf-5d595b7a4b6a</name> + <entityField>bindata</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/neonView/DocumentPreview_view/DocumentPreview_view.aod b/neonView/DocumentPreview_view/DocumentPreview_view.aod index 6b6f308e9ebaae2973e710b1ddc7d4cb4e09dca3..76321f01204e4a8dd2466979e1f2e61475d917aa 100644 --- a/neonView/DocumentPreview_view/DocumentPreview_view.aod +++ b/neonView/DocumentPreview_view/DocumentPreview_view.aod @@ -15,6 +15,7 @@ <subtitleField>TYPE</subtitleField> <descriptionField>SIZE</descriptionField> <favoriteAction1>downloadSingleFileAction</favoriteAction1> + <favoriteAction2>openSingleFileAction</favoriteAction2> <entityField>#ENTITY</entityField> </cardViewTemplate> <genericViewTemplate> diff --git a/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod b/neonView/DuplicateOrganisationEdit_view/DuplicateOrganisationEdit_view.aod similarity index 55% rename from neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod rename to neonView/DuplicateOrganisationEdit_view/DuplicateOrganisationEdit_view.aod index b331c5900d3b446f8632159bd837bb4968b85ef4..a2d93541e4f43880901a1cf4e3caad407d2b8ea1 100644 --- a/neonView/PersonDuplicateEditview_view/PersonDuplicateEditview_view.aod +++ b/neonView/DuplicateOrganisationEdit_view/DuplicateOrganisationEdit_view.aod @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> - <name>PersonDuplicateEditview_view</name> + <name>DuplicateOrganisationEdit_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> <noneLayout> @@ -9,38 +9,38 @@ </layout> <children> <tableViewTemplate> - <name>PersonDuplicateEditview_Table</name> + <name>table</name> <hideActions v="true" /> - <hideContentSearch v="true" /> - <iconField></iconField> - <entityField>#ENTITY</entityField> - <linkedColumns /> - <fixedFilterFields /> - <hideHeader v="true" /> - <title>Duplicates</title> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> <columns> <neonTableColumn> - <name>7e5410c5-ee05-4a5a-b168-8015d2d05834</name> - <entityField>#IMAGE</entityField> + <name>7cb9aa93-5aa1-4f52-a2a0-32723919af08</name> + <entityField>ORGNAME</entityField> </neonTableColumn> <neonTableColumn> - <name>ef22c1b8-1025-41b6-bb0b-99fe053e9ef9</name> - <entityField>FIRSTNAME</entityField> + <name>683fa228-8853-4def-b904-c10222136aec</name> + <entityField>STATUS</entityField> </neonTableColumn> <neonTableColumn> - <name>abfe3ce4-4fcc-4d61-93ec-156bd97ace3b</name> - <entityField>LASTNAME</entityField> + <name>bb6ddf6b-aa09-4b5b-814a-ae5ebf08a48a</name> + <entityField>CUSTOMERCODE</entityField> </neonTableColumn> <neonTableColumn> - <name>17d892a8-69fb-4bca-9629-d92ae80c72f8</name> - <entityField>STANDARD_PHONE_COMMUNICATION</entityField> + <name>a1630a4a-9989-4e9b-bb39-03a8432aef3f</name> + <entityField>TYPE</entityField> </neonTableColumn> <neonTableColumn> - <name>12006c11-e833-4ce1-9645-fdec0a8b6088</name> + <name>6295ed5c-35a8-4238-921e-65e29141883f</name> <entityField>STANDARD_EMAIL_COMMUNICATION</entityField> </neonTableColumn> <neonTableColumn> - <name>0231907e-8ae0-4f99-af1c-1bcb2f57bdb8</name> + <name>d6716d9e-19b7-4d2f-b7a9-61d0e3ef3ac5</name> + <entityField>STANDARD_PHONE_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>334a97a3-cad3-4ac5-b670-de7d587e2781</name> <entityField>STANDARD_ADDRESS</entityField> </neonTableColumn> </columns> diff --git a/neonView/DuplicateOrganisationFilter_view/DuplicateOrganisationFilter_view.aod b/neonView/DuplicateOrganisationFilter_view/DuplicateOrganisationFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..2e4b88985d02932f1eb78ced263ceb82b88c2adf --- /dev/null +++ b/neonView/DuplicateOrganisationFilter_view/DuplicateOrganisationFilter_view.aod @@ -0,0 +1,58 @@ +<?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>DuplicateOrganisationFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <favoriteActionGroup1>filterActions</favoriteActionGroup1> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> + <columns> + <neonTableColumn> + <name>04253f56-c764-46a9-8795-6b7c58d9352b</name> + <entityField>PICTURE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>fc700556-7829-42be-b824-83d29e7dddf3</name> + <entityField>DUPLICATE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>6e753d4c-4f6a-4fbf-8af0-b76aa4ff8e76</name> + <entityField>ORGNAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>1368091a-0a65-4df6-b0fc-34031925e2bf</name> + <entityField>STATUS</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d407d879-3f44-4656-a4bc-0149adcfec5e</name> + <entityField>CUSTOMERCODE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>166bdb5d-a822-4915-99aa-2ff1adca1bc9</name> + <entityField>TYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>4edfc696-78b0-4abd-8d03-39c02d0116da</name> + <entityField>STANDARD_PHONE_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>e7fb62b8-4d76-46cc-bf84-00230d2e6e56</name> + <entityField>STANDARD_EMAIL_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>93bc9275-aea3-436d-ab86-fd400a790538</name> + <entityField>STANDARD_ADDRESS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicateOrganisationPreview_view/DuplicateOrganisationPreview_view.aod b/neonView/DuplicateOrganisationPreview_view/DuplicateOrganisationPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..29f3a38fc42c1f47d2d21233941b8677b77ddfe7 --- /dev/null +++ b/neonView/DuplicateOrganisationPreview_view/DuplicateOrganisationPreview_view.aod @@ -0,0 +1,10 @@ +<?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>DuplicateOrganisationPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> +</neonView> diff --git a/neonView/DuplicatePersonEdit_view/DuplicatePersonEdit_view.aod b/neonView/DuplicatePersonEdit_view/DuplicatePersonEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..99e36d549f4ddd5e255077197ed28f53825b0c57 --- /dev/null +++ b/neonView/DuplicatePersonEdit_view/DuplicatePersonEdit_view.aod @@ -0,0 +1,61 @@ +<?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>DuplicatePersonEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <hideActions v="true" /> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> + <columns> + <neonTableColumn> + <name>fe9c534a-ba99-4805-996f-e76a6e77396e</name> + <entityField>LETTERSALUTATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>f8235c5b-6d13-4fd4-8522-96e38abaad1e</name> + <entityField>TITLE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>7b89e8a4-e9da-4d89-86cf-d35db86cf53c</name> + <entityField>FIRSTNAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>2b255370-1cd5-472f-8417-bde8c9f5743a</name> + <entityField>MIDDLENAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>a5188dac-9c63-44de-bb36-cb40689376c2</name> + <entityField>LASTNAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>7f0abf2a-5411-425e-8be8-16c57d19ba12</name> + <entityField>STATUS</entityField> + </neonTableColumn> + <neonTableColumn> + <name>55cdd3d2-548a-4a7f-9590-14413d0a6f34</name> + <entityField>ORGANISATION_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>305716b3-d99b-4fea-8f8a-a71b9dbeeacd</name> + <entityField>STANDARD_EMAIL_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>446a5dea-a93f-4b1e-9b51-b8a00990972d</name> + <entityField>STANDARD_PHONE_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>1fedd9be-6492-4e89-ae8e-03bc212078e1</name> + <entityField>STANDARD_ADDRESS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicatePersonFilter_view/DuplicatePersonFilter_view.aod b/neonView/DuplicatePersonFilter_view/DuplicatePersonFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..c1f6405a3cc09e5a8eda9af6abb92dcce3fa1f06 --- /dev/null +++ b/neonView/DuplicatePersonFilter_view/DuplicatePersonFilter_view.aod @@ -0,0 +1,70 @@ +<?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>DuplicatePersonFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <favoriteActionGroup1>filterActions</favoriteActionGroup1> + <isCreatable v="false" /> + <isDeletable v="false" /> + <isEditable v="false" /> + <columns> + <neonTableColumn> + <name>c89d9927-c3f1-4e0c-b7fa-20d5e031f8b7</name> + <entityField>PICTURE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>c68a371e-0baa-4e6c-baee-424ca4f1d258</name> + <entityField>DUPLICATE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>42fb67ab-6bc9-4a02-9dad-10f54d9fe242</name> + <entityField>LETTERSALUTATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>59aa16e6-f599-4aff-8314-6b1a2c8cfd67</name> + <entityField>TITLE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>3fdd6165-1a1b-4521-a23f-631e5f88beb1</name> + <entityField>FIRSTNAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>a76bc050-eccd-4d2a-9190-2d994fcea7e3</name> + <entityField>MIDDLENAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>381ba7a3-1591-40a2-8837-0516db984bb7</name> + <entityField>LASTNAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>6b828d7c-7b3c-490f-98a1-41520dec0773</name> + <entityField>STATUS</entityField> + </neonTableColumn> + <neonTableColumn> + <name>47c28842-59ab-4f9c-9239-3fda9c6171e0</name> + <entityField>ORGANISATION_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>68b9211a-b4e7-4b7b-b110-9d76d7e14bb2</name> + <entityField>STANDARD_PHONE_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>7a3fd399-0e19-4399-8df1-4f8d521b6729</name> + <entityField>STANDARD_EMAIL_COMMUNICATION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>f54a6069-994c-4c77-b462-dc449e42ef49</name> + <entityField>STANDARD_ADDRESS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicatePersonPreview_view/DuplicatePersonPreview_view.aod b/neonView/DuplicatePersonPreview_view/DuplicatePersonPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..bd812680650a1960d3848cc068685b565b20f281 --- /dev/null +++ b/neonView/DuplicatePersonPreview_view/DuplicatePersonPreview_view.aod @@ -0,0 +1,10 @@ +<?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>DuplicatePersonPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> +</neonView> diff --git a/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod b/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod index 5a99ae0226ac05f614f190c54732bedc624b4a5c..0a9b1256cbdc2176dacc927a459bcf2e66d599fb 100644 --- a/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod +++ b/neonView/DuplicateScannerFilter_view/DuplicateScannerFilter_view.aod @@ -11,6 +11,7 @@ <tableViewTemplate> <name>Filters</name> <entityField>#ENTITY</entityField> + <favoriteActionGroup1>FilterActions</favoriteActionGroup1> <isCreatable v="false" /> <isDeletable v="false" /> <isEditable v="true" /> @@ -23,11 +24,16 @@ <name>8615259b-de5b-493a-9c9d-2ff934ae1b8c</name> <entityField>ENTITY_TO_SCAN_NAME</entityField> </neonTableColumn> + <neonTableColumn> + <name>5ae7793f-353c-45ed-995e-5153216a3661</name> + <entityField>DUPLICATECOUNT</entityField> + </neonTableColumn> </columns> </tableViewTemplate> <treeTableViewTemplate> <name>Treetable</name> <entityField>#ENTITY</entityField> + <favoriteActionGroup1>FilterActions</favoriteActionGroup1> <isCreatable v="false" /> <isDeletable v="false" /> <columns> @@ -39,6 +45,10 @@ <name>6730d89f-4190-4767-b3a0-a63231477ed4</name> <entityField>ENTITY_TO_SCAN_NAME</entityField> </neonTreeTableColumn> + <neonTreeTableColumn> + <name>8cd35bc9-2954-4dca-b67b-083d3a27c45c</name> + <entityField>DUPLICATECOUNT</entityField> + </neonTreeTableColumn> </columns> </treeTableViewTemplate> </children> diff --git a/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod b/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod index 75c33f74429cbf649d0353217f044074c7a56a4a..bbb07db7e29b4b566072c7ca947047641f527f92 100644 --- a/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod +++ b/neonView/DuplicateScannerPreview_view/DuplicateScannerPreview_view.aod @@ -22,10 +22,6 @@ <name>b3ce81d4-bbf5-49ec-8a7a-38119ef6973f</name> <entityField>ENTITY_TO_SCAN_NAME</entityField> </entityFieldLink> - <entityFieldLink> - <name>ba6cde5d-7661-4662-9e92-dca40b597015</name> - <entityField>EXTERNAL_SERVICE_USAGE_ALLOWED</entityField> - </entityFieldLink> <entityFieldLink> <name>51bf489d-7536-4fc5-a187-8f2610b35b3d</name> <entityField>ID_FIELD_NAME</entityField> diff --git a/neonView/InterestEdit_view/InterestEdit_view.aod b/neonView/InterestEdit_view/InterestEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..5906d838178ac3079e96c62304368fb513ebcc93 --- /dev/null +++ b/neonView/InterestEdit_view/InterestEdit_view.aod @@ -0,0 +1,35 @@ +<?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>InterestEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>64509785-fd15-4d04-8c58-346011ae894b</name> + <entityField>TITLE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>bb5c4849-ce7c-4a71-ab43-03c7c5a6481b</name> + <entityField>DESCRIPTION</entityField> + </entityFieldLink> + <entityFieldLink> + <name>896cab23-b7e0-477f-83d9-0c470a5c01e5</name> + <entityField>IS_DEFAULT</entityField> + </entityFieldLink> + <entityFieldLink> + <name>00313338-1e50-406e-aa1b-ff52372dee50</name> + <entityField>STATUS</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/InterestFilter_view/InterestFilter_view.aod b/neonView/InterestFilter_view/InterestFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..93622b68cd8b1ea51eb20e82170d1c8d6de3f856 --- /dev/null +++ b/neonView/InterestFilter_view/InterestFilter_view.aod @@ -0,0 +1,34 @@ +<?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>InterestFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <columns> + <neonTableColumn> + <name>9300597d-e775-4f6e-908c-cdf5bcfa98e8</name> + <entityField>TITLE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>c8451bde-7bff-481d-979a-608685f4ab6d</name> + <entityField>DESCRIPTION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>2b7f4c6d-cc9b-4dbe-b7ce-d475145d96da</name> + <entityField>IS_DEFAULT</entityField> + </neonTableColumn> + <neonTableColumn> + <name>6a3fac1b-d701-41eb-acda-6c4a89ddf78f</name> + <entityField>STATUS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/InterestLinkDrawer_view/InterestLinkDrawer_view.aod b/neonView/InterestLinkDrawer_view/InterestLinkDrawer_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..2226453c25dc93f383de2e67774fbcbaa467df98 --- /dev/null +++ b/neonView/InterestLinkDrawer_view/InterestLinkDrawer_view.aod @@ -0,0 +1,19 @@ +<?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>InterestLinkDrawer_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <drawerLayout> + <name>layout</name> + <layoutCaption>Interests</layoutCaption> + <fixedDrawer v="true" /> + </drawerLayout> + </layout> + <children> + <neonViewReference> + <name>2f09a6f1-40bd-459e-bde1-c3b89999c65d</name> + <entityField>#ENTITY</entityField> + <view>InterestLinkFilter_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/InterestLinkEdit_view/InterestLinkEdit_view.aod b/neonView/InterestLinkEdit_view/InterestLinkEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..2e46bceb989a709ac0942ba03c5ecef484dcbe86 --- /dev/null +++ b/neonView/InterestLinkEdit_view/InterestLinkEdit_view.aod @@ -0,0 +1,27 @@ +<?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>InterestLinkEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <fields> + <entityFieldLink> + <name>a9156ed7-cb2e-4b0d-874d-c41fdae16388</name> + <entityField>INTEREST_ID</entityField> + </entityFieldLink> + <entityFieldLink> + <name>24378d86-4805-49d6-bc9d-464bf7af0c70</name> + <entityField>STATUS</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod b/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..162387862cf00ad881b94050fbe3b34dd41e313d --- /dev/null +++ b/neonView/InterestLinkFilter_view/InterestLinkFilter_view.aod @@ -0,0 +1,30 @@ +<?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>InterestLinkFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <columns> + <neonTableColumn> + <name>261f0387-dd00-486d-add4-56d0c64be583</name> + <entityField>INTEREST_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>b464ab35-1749-46c6-ac30-bb65040fe4a7</name> + <entityField>DESCRIPTION</entityField> + </neonTableColumn> + <neonTableColumn> + <name>ef3ef573-0e98-441c-8232-63e7df3b5b9c</name> + <entityField>STATUS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod b/neonView/InterestLookup_view/InterestLookup_view.aod similarity index 52% rename from neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod rename to neonView/InterestLookup_view/InterestLookup_view.aod index 03a42bc169f8edf17595f673f799194149d4eb81..cdca5093c70d98789700d3af0008cf2623640e76 100644 --- a/neonView/DuplicatesUnrelatedOrganisationFilter_view/DuplicatesUnrelatedOrganisationFilter_view.aod +++ b/neonView/InterestLookup_view/InterestLookup_view.aod @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> - <name>DuplicatesUnrelatedOrganisationFilter_view</name> + <name>InterestLookup_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> <boxLayout> @@ -9,20 +9,15 @@ </layout> <children> <tableViewTemplate> - <name>UnrelatedOrganisations</name> - <hideContentSearch v="true" /> - <entityField>#ENTITY</entityField> - <isCreatable v="false" /> - <isEditable v="false" /> - <title>Unrelated organisation duplicates</title> + <name>Table</name> <columns> <neonTableColumn> - <name>04681f8d-b941-4a66-be50-6ac08d6f52a4</name> - <entityField>SourceDuplicateDescription</entityField> + <name>1849514e-f5fe-4a4e-bf65-21d6db40676f</name> + <entityField>TITLE</entityField> </neonTableColumn> <neonTableColumn> - <name>b293ed18-ebf5-474e-8ec2-851a3562b4d5</name> - <entityField>UnrelatedDuplicateDescription</entityField> + <name>785af202-f94d-48e9-b75f-cae6d128dcae</name> + <entityField>DESCRIPTION</entityField> </neonTableColumn> </columns> </tableViewTemplate> diff --git a/neonView/LinktMain_view/WeblinkMain_view.aod b/neonView/LinktMain_view/WeblinkMain_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..b98b9afa1ebb1078885de5ed53d03889b85032d2 --- /dev/null +++ b/neonView/LinktMain_view/WeblinkMain_view.aod @@ -0,0 +1,28 @@ +<?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>WeblinkMain_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <masterSlaveLayout> + <name>layout</name> + <master>a9bd300d-4c93-4d04-b6bc-ca007a834a51</master> + </masterSlaveLayout> + </layout> + <children> + <neonViewReference> + <name>a9bd300d-4c93-4d04-b6bc-ca007a834a51</name> + <entityField>#ENTITY</entityField> + <view>WeblinkPreview_view</view> + </neonViewReference> + <neonViewReference> + <name>4318f521-5462-4767-bd9b-6966cf2e4734</name> + <entityField>#ENTITY</entityField> + <view>WeblinkDrawer_view</view> + </neonViewReference> + <neonViewReference> + <name>303de4e6-03de-419d-9875-42e10b912a1f</name> + <entityField>Clicks</entityField> + <view>WeblinkClickFilter_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/MailLogFilter_view/MailLogFilter_view.aod b/neonView/MailLogFilter_view/MailLogFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..1bf071b561b14d3ee3d61aae946a6e414152ce0b --- /dev/null +++ b/neonView/MailLogFilter_view/MailLogFilter_view.aod @@ -0,0 +1,85 @@ +<?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>MailLogFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <favoriteActionGroup1>RecipientActions</favoriteActionGroup1> + <columns> + <neonTableColumn> + <name>5459efc9-2de2-4e33-b1bf-3418830b8014</name> + <entityField>CONTACT_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>315e09a6-dcd3-4fbc-b254-131a3df10c91</name> + <entityField>MAILING_SUBJECT</entityField> + </neonTableColumn> + <neonTableColumn> + <name>b6fec338-e4c6-42cb-871c-2a30fb16cbbf</name> + <entityField>SENDER_EMAIL</entityField> + </neonTableColumn> + <neonTableColumn> + <name>e0501a66-e6c5-4d7d-b0d5-bd246d110e0a</name> + <entityField>RECIPIENT_EMAIL</entityField> + </neonTableColumn> + <neonTableColumn> + <name>34f08aa2-082f-481e-9f19-ffb47413cf6e</name> + <entityField>TESTRUN</entityField> + </neonTableColumn> + <neonTableColumn> + <name>489298fa-f805-437d-9a7f-e8acfb645e91</name> + <entityField>STATUS</entityField> + </neonTableColumn> + <neonTableColumn> + <name>2f5bd92d-61a1-4c45-99bf-ef6230541768</name> + <entityField>DATE_SEND</entityField> + </neonTableColumn> + <neonTableColumn> + <name>83d29954-ca19-4df1-8022-59e785f24eb5</name> + <entityField>DATE_OPENED</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + <treeTableViewTemplate> + <name>treetable</name> + <favoriteActionGroup1>RecipientActions</favoriteActionGroup1> + <columns> + <neonTreeTableColumn> + <name>58aebe6f-fe09-4136-acb5-0cc485914787</name> + <entityField>CONTACT_ID</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>2fadf61d-456e-421e-8111-fafde3e5564b</name> + <entityField>MAILING_SUBJECT</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>7f13e3db-2dae-4dd4-9c80-9707a0224a35</name> + <entityField>SENDER_EMAIL</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>eee473cf-add3-4880-bc7b-87c605a35977</name> + <entityField>RECIPIENT_EMAIL</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>81fdca37-2cc6-4a2e-81c3-760d6197ac87</name> + <entityField>TESTRUN</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>82cef432-64fc-4cc5-90a0-e449f2e1a19f</name> + <entityField>STATUS</entityField> + </neonTreeTableColumn> + <neonTreeTableColumn> + <name>50f91fec-b9ac-44cf-885a-c2f59fe028b7</name> + <entityField>DATE_SEND</entityField> + </neonTreeTableColumn> + </columns> + </treeTableViewTemplate> + </children> +</neonView> diff --git a/neonView/MemberFilter_view/MemberFilter_view.aod b/neonView/MemberFilter_view/MemberFilter_view.aod index 87b04dc9cc12b236f1e3d574fddec941125e0d63..52aed59f96eaef6f02026543abece55c8d686cf1 100644 --- a/neonView/MemberFilter_view/MemberFilter_view.aod +++ b/neonView/MemberFilter_view/MemberFilter_view.aod @@ -45,6 +45,10 @@ <name>c23f4e8b-87a1-4535-b2d1-f6c97d6bfe0b</name> <entityField>POSITION</entityField> </neonTableColumn> + <neonTableColumn> + <name>fe949666-5fe7-42ef-acf1-748ed336682d</name> + <entityField>PERSON_ATTR_LOYALTY</entityField> + </neonTableColumn> <neonTableColumn> <name>bea82980-0639-405a-ab3f-92e45f97090e</name> <entityField>MEMBERROLE</entityField> @@ -87,6 +91,10 @@ <name>87770e60-967b-4411-9eb3-0397fda4663e</name> <entityField>POSITION</entityField> </neonTreeTableColumn> + <neonTreeTableColumn> + <name>6ff9f7d4-e619-4d3b-afa2-279dc0817bfc</name> + <entityField>PERSON_ATTR_LOYALTY</entityField> + </neonTreeTableColumn> <neonTreeTableColumn> <name>2dc17972-2e5a-424a-b069-2b8f04b35f6c</name> <entityField>MEMBERROLE</entityField> diff --git a/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod b/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod deleted file mode 100644 index c950c689201ccb9ecaf23a58f879058711e6c866..0000000000000000000000000000000000000000 --- a/neonView/OrganisationDuplicatesFilter_view/OrganisationDuplicatesFilter_view.aod +++ /dev/null @@ -1,32 +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>OrganisationDuplicatesFilter_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <layout> - <boxLayout> - <name>layout</name> - </boxLayout> - </layout> - <children> - <tableViewTemplate> - <name>OrganisationDuplicatesTable</name> - <hideContentSearch v="true" /> - <entityField>#ENTITY</entityField> - <favoriteActionGroup1>OrganisationOpenClusterDetailActionGroup</favoriteActionGroup1> - <favoriteActionGroup2>DuplicateClusterActionGroup</favoriteActionGroup2> - <isCreatable v="false" /> - <isDeletable v="false" /> - <isEditable v="false" /> - <columns> - <neonTableColumn> - <name>ebe8d904-449c-49bd-915c-5b4fee894bc2</name> - <entityField>CLUSTER_DESCRIPTION</entityField> - </neonTableColumn> - <neonTableColumn> - <name>48db4335-6bdb-4a6a-809e-f9c371733f85</name> - <entityField>COUNT_DUPLICATES_IN_CLUSTER</entityField> - </neonTableColumn> - </columns> - </tableViewTemplate> - </children> -</neonView> diff --git a/neonView/OrganisationEdit_view/OrganisationEdit_view.aod b/neonView/OrganisationEdit_view/OrganisationEdit_view.aod index cf3a70c9a59119e3e829b6fe0acdc0b53b1a0d10..0e6500095ffe50942035ec4db7acb782dde76106 100644 --- a/neonView/OrganisationEdit_view/OrganisationEdit_view.aod +++ b/neonView/OrganisationEdit_view/OrganisationEdit_view.aod @@ -12,9 +12,9 @@ </layout> <children> <neonViewReference> - <name>f2fa0351-15af-4d1c-b7dd-0e42d9c7889f</name> - <entityField>SelfDuplicatesUncached</entityField> - <view>OrganisationNoNoiseTable_view</view> + <name>933cd72c-fd3a-4b91-aad6-8e129d6233e5</name> + <entityField>Duplicates</entityField> + <view>DuplicateOrganisationEdit_view</view> </neonViewReference> <genericViewTemplate> <name>Edit</name> diff --git a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod index d0a3e39a2851e9ba458d22537779ff15dd1e7454..75d8254a1e1995cd430b2e0a4f8b50a1120a49b0 100644 --- a/neonView/OrganisationFilter_view/OrganisationFilter_view.aod +++ b/neonView/OrganisationFilter_view/OrganisationFilter_view.aod @@ -53,7 +53,6 @@ <entityField>#ENTITY</entityField> <favoriteActionGroup1>observeActionGroup</favoriteActionGroup1> <favoriteActionGroup2>filterViewActionGroup</favoriteActionGroup2> - <favoriteActionGroup3>DuplicateActions</favoriteActionGroup3> <linkedColumns> <element>NAME</element> </linkedColumns> @@ -102,7 +101,6 @@ <entityField>#ENTITY</entityField> <favoriteActionGroup1>observeActionGroup</favoriteActionGroup1> <favoriteActionGroup2>filterViewActionGroup</favoriteActionGroup2> - <favoriteActionGroup3>DuplicateActions</favoriteActionGroup3> <linkedColumns> <element>NAME</element> </linkedColumns> diff --git a/neonView/OrganisationMain_view/OrganisationMain_view.aod b/neonView/OrganisationMain_view/OrganisationMain_view.aod index 67ceac6a5cdafeb611c83c06583b634263c4b921..9457155195dafc5a55d96976ca5adb0ac88110a1 100644 --- a/neonView/OrganisationMain_view/OrganisationMain_view.aod +++ b/neonView/OrganisationMain_view/OrganisationMain_view.aod @@ -76,9 +76,9 @@ <view>LogHistoryFilter_view</view> </neonViewReference> <neonViewReference> - <name>cbac7602-9eba-4e5d-8617-3d0b33e55ca1</name> - <entityField>SelfDuplicatesUncached</entityField> - <view>OrganisationFilter_view</view> + <name>a5ab96e5-927c-4db3-b7ed-f0c0aadcb89b</name> + <entityField>Duplicates</entityField> + <view>DuplicateOrganisationFilter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod b/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod deleted file mode 100644 index 69ab192629f5b172f18bc89eaccf2b384fdfb3bb..0000000000000000000000000000000000000000 --- a/neonView/PersonClusterPreview_view/PersonClusterPreview_view.aod +++ /dev/null @@ -1,22 +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>PersonClusterPreview_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <layout> - <boxLayout> - <name>layout</name> - </boxLayout> - </layout> - <children> - <neonViewReference> - <name>156ebee5-6b13-462f-b956-0470f27a174b</name> - <entityField>DuplicatePersonsConsumer</entityField> - <view>PersonLookup_view</view> - </neonViewReference> - <neonViewReference> - <name>d8afce27-436c-42f0-a326-98bf6539b7bd</name> - <entityField>DuplicatesUnrelatedPersonConsumer</entityField> - <view>DuplicatesUnrelatedPersonFilter_view</view> - </neonViewReference> - </children> -</neonView> diff --git a/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod b/neonView/PersonDSGVO_view/PersonDSGVO_view.aod similarity index 55% rename from neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod rename to neonView/PersonDSGVO_view/PersonDSGVO_view.aod index 72d99cac595e86b488e878b16d1a700b90746e48..f6032747a6b2fd054d15c3eec3567dd90377566e 100644 --- a/neonView/OrganisationClusterMain_view/OrganisationClusterMain_view.aod +++ b/neonView/PersonDSGVO_view/PersonDSGVO_view.aod @@ -1,23 +1,25 @@ <?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>OrganisationClusterMain_view</name> + <name>PersonDSGVO_view</name> + <title>Data Privacy</title> <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="false" /> <layout> <boxLayout> <name>layout</name> - <direction>HORIZONTAL</direction> + <direction>VERTICAL</direction> </boxLayout> </layout> <children> <neonViewReference> - <name>b25f94bf-9316-4438-be78-b8cf596440b3</name> - <entityField>DuplicateOrganisationsConsumer</entityField> - <view>OrganisationFilter_view</view> + <name>54d1f4d3-52f9-4820-a8b8-41a609f3b613</name> + <entityField>DSGVOEntries</entityField> + <view>DSGVOFilter_view</view> </neonViewReference> <neonViewReference> - <name>5589bb81-171d-417b-a1b2-975144109d55</name> - <entityField>#ENTITY</entityField> - <view>DuplicatesUnrelatedCluster_view</view> + <name>73496b8c-9361-4839-9ed7-f18e98993369</name> + <entityField>DSGVODeleteFlags</entityField> + <view>DSGVODeleteFlagFilter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod b/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod deleted file mode 100644 index c11bc1396a663aa39b2f17a1b691d239ddbd79c6..0000000000000000000000000000000000000000 --- a/neonView/PersonDublicatesTab_view/PersonDublicatesTab_view.aod +++ /dev/null @@ -1,24 +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>PersonDublicatesTab_view</name> - <title>Person duplicates</title> - <majorModelMode>DISTRIBUTED</majorModelMode> - <layout> - <boxLayout> - <name>layout</name> - <direction>HORIZONTAL</direction> - </boxLayout> - </layout> - <children> - <neonViewReference> - <name>c82a1ae2-9f8f-4149-8bac-5621136d779b</name> - <entityField>SelfPersonDuplicatesConsumer</entityField> - <view>PersonDuplicatesFilter_view</view> - </neonViewReference> - <neonViewReference> - <name>2aee29fb-9844-4e3a-a284-a04dadf9eadc</name> - <entityField>DuplicatesUnrelatedPersonConsumer</entityField> - <view>DuplicatesUnrelatedPersonFilter_view</view> - </neonViewReference> - </children> -</neonView> diff --git a/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod b/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod deleted file mode 100644 index 0e95f05f72286d568edddded65e4cd0d21031823..0000000000000000000000000000000000000000 --- a/neonView/PersonDuplicatesFilter_view/PersonDuplicatesFilter_view.aod +++ /dev/null @@ -1,48 +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>PersonDuplicatesFilter_view</name> - <majorModelMode>DISTRIBUTED</majorModelMode> - <layout> - <groupLayout> - <name>layout</name> - </groupLayout> - </layout> - <children> - <tableViewTemplate> - <name>PersonDuplicatesTable</name> - <hideContentSearch v="true" /> - <entityField>#ENTITY</entityField> - <favoriteActionGroup1>PersonOpenClusterDetailActionGroup</favoriteActionGroup1> - <isCreatable v="false" /> - <isDeletable v="false" /> - <isEditable v="false" /> - <isSaveable v="false" /> - <linkedFrame></linkedFrame> - <columns> - <neonTableColumn> - <name>7508e984-6a0b-4126-ab49-452e2b54f76d</name> - <entityField>CLUSTER_DESCRIPTION</entityField> - </neonTableColumn> - <neonTableColumn> - <name>8615259b-de5b-493a-945d-2ff934ae1b8c</name> - <entityField>COUNT_DUPLICATES_IN_CLUSTER</entityField> - </neonTableColumn> - </columns> - </tableViewTemplate> - <treeTableViewTemplate> - <name>Treetable</name> - <entityField>#ENTITY</entityField> - <favoriteActionGroup1>PersonOpenClusterDetailActionGroup</favoriteActionGroup1> - <columns> - <neonTreeTableColumn> - <name>060c69aa-242a-4141-acd1-b82a76d99521</name> - <entityField>CLUSTER_DESCRIPTION</entityField> - </neonTreeTableColumn> - <neonTreeTableColumn> - <name>67458881-0d45-406e-a362-852711b09bd1</name> - <entityField>COUNT_DUPLICATES_IN_CLUSTER</entityField> - </neonTreeTableColumn> - </columns> - </treeTableViewTemplate> - </children> -</neonView> diff --git a/neonView/PersonEdit_view/PersonEdit_view.aod b/neonView/PersonEdit_view/PersonEdit_view.aod index 1cc1577de9b2c4f38ee39b97d8e14d70a9d74921..27586ee38b4febc4820c68577184586052e44464 100644 --- a/neonView/PersonEdit_view/PersonEdit_view.aod +++ b/neonView/PersonEdit_view/PersonEdit_view.aod @@ -12,9 +12,9 @@ </layout> <children> <neonViewReference> - <name>589e5a82-e923-4b70-a983-5e104d2beb2b</name> - <entityField>SelfDuplicatesUncached</entityField> - <view>PersonDuplicateEditview_view</view> + <name>a6b55bfc-7b0c-4020-a78d-18ee9a1d2b26</name> + <entityField>Duplicates</entityField> + <view>DuplicatePersonEdit_view</view> </neonViewReference> <genericViewTemplate> <name>Edit</name> diff --git a/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod b/neonView/PersonFilterOverlay_view/PersonFilterOverlay_view.aod similarity index 61% rename from neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod rename to neonView/PersonFilterOverlay_view/PersonFilterOverlay_view.aod index 0b23c809aafd9bedf13995b9049e1be41c8a6ea2..d9c42e27f8752d4180930f5d194eb04da08a0c30 100644 --- a/neonView/OrganisationUnrelatedDuplicates_view/OrganisationUnrelatedDuplicates_view.aod +++ b/neonView/PersonFilterOverlay_view/PersonFilterOverlay_view.aod @@ -1,17 +1,19 @@ <?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>OrganisationUnrelatedDuplicates_view</name> + <name>PersonFilterOverlay_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="false" /> + <isOverlay v="true" /> <layout> - <boxLayout> + <noneLayout> <name>layout</name> - </boxLayout> + </noneLayout> </layout> <children> <neonViewReference> - <name>edc0822d-4388-4e3d-93d7-2e46e32f5742</name> - <entityField>DuplicatesUnrelatedOrganisationConsumer</entityField> - <view>DuplicatesUnrelatedOrganisationFilter_view</view> + <name>e4a045d7-32ca-495e-9e8e-c3ac71d7c100</name> + <entityField>#ENTITY</entityField> + <view>PersonFilter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/PersonFilter_view/PersonFilter_view.aod b/neonView/PersonFilter_view/PersonFilter_view.aod index c892033123ccd327c4dc49c13432e724b95843bf..2471b831c6a88a31be023611935956b63665d5e6 100644 --- a/neonView/PersonFilter_view/PersonFilter_view.aod +++ b/neonView/PersonFilter_view/PersonFilter_view.aod @@ -57,7 +57,6 @@ <entityField>#ENTITY</entityField> <favoriteActionGroup1>observeActionGroup</favoriteActionGroup1> <favoriteActionGroup2>filterViewActionGroup</favoriteActionGroup2> - <favoriteActionGroup3>DuplicateActions</favoriteActionGroup3> <linkedColumns> <element>FIRSTNAME</element> <element>LASTNAME</element> @@ -107,7 +106,6 @@ <entityField>#ENTITY</entityField> <favoriteActionGroup1>observeActionGroup</favoriteActionGroup1> <favoriteActionGroup2>filterViewActionGroup</favoriteActionGroup2> - <favoriteActionGroup3>DuplicateActions</favoriteActionGroup3> <linkedColumns> <element>FIRSTNAME</element> <element>LASTNAME</element> diff --git a/neonView/PersonMain_view/PersonMain_view.aod b/neonView/PersonMain_view/PersonMain_view.aod index 5f2dc5ffa83f910d3b29a2c446453b47ac6d361e..d6983b3781d67841a8fa65e4ec8c11ff621d4290 100644 --- a/neonView/PersonMain_view/PersonMain_view.aod +++ b/neonView/PersonMain_view/PersonMain_view.aod @@ -60,14 +60,24 @@ <view>LogHistoryFilter_view</view> </neonViewReference> <neonViewReference> - <name>fb1dd01e-a3ad-4708-b6a0-d273cbb0b50f</name> - <entityField>DSGVOEntries</entityField> - <view>DSGVOFilter_view</view> + <name>f0895c2a-5517-4c7b-80ed-147e4078603d</name> + <entityField>#ENTITY</entityField> + <view>PersonDSGVO_view</view> + </neonViewReference> + <neonViewReference> + <name>82f19c55-fa96-43de-9f26-46069b28db31</name> + <entityField>#ENTITY</entityField> + <view>PersonMarketing_view</view> + </neonViewReference> + <neonViewReference> + <name>24ea8bc9-7ed0-4bed-a984-b1a9f3815c7c</name> + <entityField>Duplicates</entityField> + <view>DuplicatePersonFilter_view</view> </neonViewReference> <neonViewReference> - <name>d128a678-b1c0-49d0-a74c-7860d3a85247</name> - <entityField>SelfDuplicatesUncached</entityField> - <view>PersonFilter_view</view> + <name>78a658a3-680b-4420-85a2-6e99ccff9f94</name> + <entityField>DSGVOEntries</entityField> + <view>DSGVOFilter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/PersonClusterMain_view/PersonClusterMain_view.aod b/neonView/PersonMarketing_view/PersonMarketing_view.aod similarity index 57% rename from neonView/PersonClusterMain_view/PersonClusterMain_view.aod rename to neonView/PersonMarketing_view/PersonMarketing_view.aod index dcbd9badb6fe40452c89f4d4f54cef06fb5a0938..da7de6d071af1cc10158498f3b23a1aa3740507c 100644 --- a/neonView/PersonClusterMain_view/PersonClusterMain_view.aod +++ b/neonView/PersonMarketing_view/PersonMarketing_view.aod @@ -1,23 +1,23 @@ <?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>PersonClusterMain_view</name> + <name>PersonMarketing_view</name> + <title>Advertising</title> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> <boxLayout> <name>layout</name> - <direction>HORIZONTAL</direction> </boxLayout> </layout> <children> <neonViewReference> - <name>ff307d1c-9de7-4842-a697-05e783eca14b</name> - <entityField>DuplicatePersonsConsumer</entityField> - <view>PersonFilter_view</view> + <name>dfdbd5b2-eb37-436f-8256-e7ba55eba1dc</name> + <entityField>ContactCommunicationSettings</entityField> + <view>CommunicationSettingsDrawer_view</view> </neonViewReference> <neonViewReference> - <name>0df195b2-9074-4734-b6df-be3bbf47050a</name> - <entityField>#ENTITY</entityField> - <view>DuplicatesUnrelatedCluster_view</view> + <name>d3ca9779-515c-4361-b8d6-4b13d6a1155d</name> + <entityField>InterestLinks</entityField> + <view>InterestLinkDrawer_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod index 8c93d1744c178359d45cef74f341f0c98eca70c8..7df0d8ad40546a5a1f45f10b4ae096553100605a 100644 --- a/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod +++ b/neonView/Prod2prodFilter_view/Prod2prodFilter_view.aod @@ -97,6 +97,13 @@ <entityField>currentSalesPrice</entityField> </neonTableColumn> </columns> + <editRendererMapping> + <rendererMappingEntry> + <name>84b72e32-9a2a-4bf3-a87c-44f47f6c10d2</name> + <fieldName>QUANTITY</fieldName> + <renderer>numberInput</renderer> + </rendererMappingEntry> + </editRendererMapping> </multiEditTableViewTemplate> </children> </neonView> diff --git a/neonView/WeblinkClickFilter_view/WeblinkClickFilter_view.aod b/neonView/WeblinkClickFilter_view/WeblinkClickFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..7874f86a6efcc25a59becd71d6b9f6daf8db1598 --- /dev/null +++ b/neonView/WeblinkClickFilter_view/WeblinkClickFilter_view.aod @@ -0,0 +1,46 @@ +<?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>WeblinkClickFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <groupLayout> + <name>layout</name> + </groupLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <columns> + <neonTableColumn> + <name>49a61a9f-2f93-4f97-8829-1297327be796</name> + <entityField>URL</entityField> + </neonTableColumn> + <neonTableColumn> + <name>7651e2ad-a70b-43aa-892d-20bae6d745ff</name> + <entityField>CONTACT_ID</entityField> + </neonTableColumn> + <neonTableColumn> + <name>b0052499-74c5-4ed8-aa99-7905b1686b1c</name> + <entityField>DATE_OPENED</entityField> + </neonTableColumn> + <neonTableColumn> + <name>8a018eda-e3c4-4284-aa61-92df079869cf</name> + <entityField>DEVICE_TYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d484312d-23e9-4b72-83f8-c449fc546117</name> + <entityField>BROWSER</entityField> + </neonTableColumn> + <neonTableColumn> + <name>5dbbd7c3-dffe-4a98-9efa-de9b88ed5da2</name> + <entityField>OPERATING_SYSTEM</entityField> + </neonTableColumn> + <neonTableColumn> + <name>65a6fa62-e067-46a1-8996-7f8706f1c8f2</name> + <entityField>IP_ADDRESS</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod b/neonView/WeblinkDrawer_view/WeblinkDrawer_view.aod similarity index 67% rename from neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod rename to neonView/WeblinkDrawer_view/WeblinkDrawer_view.aod index 670b2c939dc7b4c793999bf90f30c9503d4c0052..4eb8096b64e4a5a70ed2b466095324fdddf50531 100644 --- a/neonView/DuplicatesUnrelatedCluster_view/DuplicatesUnrelatedCluster_view.aod +++ b/neonView/WeblinkDrawer_view/WeblinkDrawer_view.aod @@ -1,6 +1,7 @@ <?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>DuplicatesUnrelatedCluster_view</name> + <name>WeblinkDrawer_view</name> + <title>Weitere Informationen</title> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> <boxLayout> @@ -9,9 +10,9 @@ </layout> <children> <neonViewReference> - <name>484990d0-890b-48b8-8618-6f0fab367138</name> - <entityField>DuplicatesUnrelatedPersonConsumer</entityField> - <view>DuplicatesUnrelatedPersonFilter_view</view> + <name>92f84737-e546-4f97-842b-38f3a210e294</name> + <entityField>WebtrackingTags</entityField> + <view>WeblinkTagFilter_view</view> </neonViewReference> </children> </neonView> diff --git a/neonView/WeblinkEdit_view/WeblinkEdit_view.aod b/neonView/WeblinkEdit_view/WeblinkEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..8a245fb3766020659cbcb7a1632f972442312024 --- /dev/null +++ b/neonView/WeblinkEdit_view/WeblinkEdit_view.aod @@ -0,0 +1,50 @@ +<?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>WeblinkEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>NORMAL</size> + <layout> + <headerFooterLayout> + <name>layout</name> + <header>generic</header> + </headerFooterLayout> + </layout> + <children> + <genericViewTemplate> + <name>generic</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>0c59b8f2-6f20-4842-a209-ab14e258093a</name> + <entityField>URL</entityField> + </entityFieldLink> + <entityFieldLink> + <name>70c52c3f-7e0b-4069-b56f-e0769f911efa</name> + <entityField>LINKTYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>836aafd9-a8c3-4a7c-9b2c-260ec8bbee45</name> + <entityField>SCORE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>4313c2fb-3551-4c66-81c9-ad950c44a105</name> + <entityField>PLACEHOLDER</entityField> + </entityFieldLink> + <entityFieldLink> + <name>2b22fb4a-5e7e-48ee-b6d1-3ee4381fb419</name> + <entityField>ISREDIRECT</entityField> + </entityFieldLink> + <entityFieldLink> + <name>90ab2682-bc2d-4989-ab7b-b47045a3cbf3</name> + <entityField>WORKFLOWPROCESSDEFINITION_KEY</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + <neonViewReference> + <name>0f6d1fc5-fbd9-443e-84a3-ffba18c3443a</name> + <entityField>WebtrackingTags</entityField> + <view>WeblinkTagMultiEdit_view</view> + </neonViewReference> + </children> +</neonView> diff --git a/neonView/WeblinkFilter_view/WeblinkFilter_view.aod b/neonView/WeblinkFilter_view/WeblinkFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..193c98458b43c941831350eb9a879ce306574caa --- /dev/null +++ b/neonView/WeblinkFilter_view/WeblinkFilter_view.aod @@ -0,0 +1,36 @@ +<?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>WeblinkFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <hideContentSearch v="false" /> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>ece26f14-59f5-44ac-8d2c-2d032fa4a668</name> + <entityField>URL</entityField> + </neonTableColumn> + <neonTableColumn> + <name>fae5a83e-e00f-436f-a908-66c41e5f720d</name> + <entityField>LINKTYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>d87cdb53-bbc2-499f-8b2d-9c464162a969</name> + <entityField>SCORE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>2307e8e1-233f-44b7-94a4-dd0f6ae9257e</name> + <entityField>Tags</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/WeblinkPreview_view/WeblinkPreview_view.aod b/neonView/WeblinkPreview_view/WeblinkPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..3feb2f988f85f1ebd50a9621e7d02e05393d0275 --- /dev/null +++ b/neonView/WeblinkPreview_view/WeblinkPreview_view.aod @@ -0,0 +1,42 @@ +<?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>WeblinkPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + <header>card</header> + </headerFooterLayout> + </layout> + <children> + <cardViewTemplate> + <name>card</name> + <iconField>LINKTYPE_ICON</iconField> + <titleField>URL</titleField> + <subtitleField>LINKTYPE</subtitleField> + <descriptionField>SCORE</descriptionField> + <entityField>#ENTITY</entityField> + </cardViewTemplate> + <genericViewTemplate> + <name>generic</name> + <fields> + <entityFieldLink> + <name>611eb710-9f52-4826-a40c-282b6ac6daab</name> + <entityField>Tags</entityField> + </entityFieldLink> + <entityFieldLink> + <name>92bb0227-5418-4a61-a7cd-eccc8def83f9</name> + <entityField>PLACEHOLDER</entityField> + </entityFieldLink> + <entityFieldLink> + <name>840b0f8d-763f-402d-b318-6317402a7c6c</name> + <entityField>ISREDIRECT</entityField> + </entityFieldLink> + <entityFieldLink> + <name>a807f6b9-252c-4545-a2c9-266c64012097</name> + <entityField>WORKFLOWPROCESSDEFINITION_KEY</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/WeblinkTagEdit_view/WeblinkTagEdit_view.aod b/neonView/WeblinkTagEdit_view/WeblinkTagEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..3e2e9c2e96657b325c47036ddbd380ab470307ed --- /dev/null +++ b/neonView/WeblinkTagEdit_view/WeblinkTagEdit_view.aod @@ -0,0 +1,24 @@ +<?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>WeblinkTagEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <size>SMALL</size> + <layout> + <boxLayout> + <name>layout</name> + </boxLayout> + </layout> + <children> + <genericViewTemplate> + <name>generic</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>4b955db8-013d-47b6-878e-8b1b6fbeb1a7</name> + <entityField>TAG</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/WeblinkTagFilter_view/WeblinkTagFilter_view.aod b/neonView/WeblinkTagFilter_view/WeblinkTagFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..ab82dd3c04f352a34fed3414ec0b4a9c792cd944 --- /dev/null +++ b/neonView/WeblinkTagFilter_view/WeblinkTagFilter_view.aod @@ -0,0 +1,22 @@ +<?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>WeblinkTagFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>table</name> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>f9081075-839a-49d4-b9af-b0fce6ae5a3e</name> + <entityField>TAG</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod b/neonView/WeblinkTagMultiEdit_view/WeblinkTagMultiEdit_view.aod similarity index 65% rename from neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod rename to neonView/WeblinkTagMultiEdit_view/WeblinkTagMultiEdit_view.aod index 9798328f4161f04c56cd02f48166a9dce167306c..e70d8e9017c181cd25580eff0f0624bb765d78f2 100644 --- a/neonView/DuplicateScannerResultFieldConfigEdit_view/DuplicateScannerResultFieldConfigEdit_view.aod +++ b/neonView/WeblinkTagMultiEdit_view/WeblinkTagMultiEdit_view.aod @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.8" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.8"> - <name>DuplicateScannerResultFieldConfigEdit_view</name> + <name>WeblinkTagMultiEdit_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> <boxLayout> @@ -9,14 +9,12 @@ </layout> <children> <genericMultipleViewTemplate> - <name>ResultFieldsConfig</name> - <autoNewRow v="true" /> - <entityField>#ENTITY</entityField> - <title>Result fields</title> + <name>genericMultiple</name> <columns> <neonGenericMultipleTableColumn> - <name>e330572c-aa47-4c52-a760-3e8765ce3dd0</name> - <entityField>ENTITY_FIELD_NAME</entityField> + <name>6053ac7f-0c00-415b-9c40-32fd6b783792</name> + <entityField>TAG</entityField> + <fullWidth v="true" /> </neonGenericMultipleTableColumn> </columns> </genericMultipleViewTemplate> diff --git a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod index 0325b162d02a5c5d22160558bbd184f4a8c34b51..357db8c7f374d4c0265becca52817d845a71cc7b 100644 --- a/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod +++ b/preferences/_____PREFERENCES_PROJECT/_____PREFERENCES_PROJECT.aod @@ -90,6 +90,11 @@ <name>geo.maptiler.apikey</name> <description>An API Key for using Maptiler functions. For example for the MapViewTemplate.</description> </customStringProperty> + <customIntegerProperty> + <name>bulkmail.dateToSendPassedAfter</name> + <description>Number of hours after which a planned Bulkmail no longer gets send</description> + <property v="24" /> + </customIntegerProperty> </customConfigProperties> <customProperties> <customBooleanProperty> @@ -101,14 +106,6 @@ <name>dsgvo.active</name> <property v="true" /> </customBooleanProperty> - <customDurationProperty> - <name>dsgvo.deletionTimeDays</name> - <description>Time elapses after delete flag is set until the db entry is automatically deleted</description> - </customDurationProperty> - <customDurationProperty> - <name>dsgvo.deletionTimeMonths</name> - <description>When no history entry exists within that duration to today a delete flag is set</description> - </customDurationProperty> <customBooleanProperty> <name>nominatim.enable</name> <property v="true" /> @@ -197,5 +194,10 @@ <description>Default VAT in percent</description> <property>19</property> </customStringProperty> + <customStringProperty> + <name>bulkmail.fileStorage</name> + <description>Save Location for send Mails. Path is relative to Serverpath</description> + <property>/bulkMailFiles/</property> + </customStringProperty> </customProperties> </preferences> diff --git a/process/AttributeRegistry_basic/process.js b/process/AttributeRegistry_basic/process.js index 0d5b68b1c70a1889289312420d1b8902818b0866..4def7134d09a4043376a7d4f4d704d6c946953cd 100644 --- a/process/AttributeRegistry_basic/process.js +++ b/process/AttributeRegistry_basic/process.js @@ -19,6 +19,7 @@ $AttributeRegistry.departments = function(){return "87d4ff5b-0ab6-4534-be26-76c6 $AttributeRegistry.salesprojectType = function(){return "fd3963bc-8e60-411a-9911-b97eb73e5cf7";}; $AttributeRegistry.responsibleADsupervisor = function(){return "c0b26482-c0aa-413d-a9c3-f44c56bd04a9";}; $AttributeRegistry.industry = function(){return "7e9927a4-41e4-426f-bddd-c3e9ee3b093e";}; +$AttributeRegistry.loyalty = function(){return "e73ed929-8631-46de-b28f-eb1423abb808";}; $AttributeRegistry.visitPlanFrequency = function(){return "547b8b9d-88ba-4590-9e01-34d2a58116cc";}; $AttributeRegistry.visitPlanFrequency$monthly = function(){return "8c100817-1d2b-4fc7-8fdd-fd0370e19385";}; diff --git a/process/Attribute_lib/process.js b/process/Attribute_lib/process.js index 98ff92d9eb3f27b726c777f1ed7aa3dc026bdfb8..965a947abf7ef27ac5867379970efcdb7eb8e93e 100644 --- a/process/Attribute_lib/process.js +++ b/process/Attribute_lib/process.js @@ -43,7 +43,8 @@ AttributeUtil.getPossibleUsageContexts = function() "DocumentTemplate", "SupportTicket", "Leadimport", - "ImportField" + "ImportField", + "DSGVO" ]; } diff --git a/process/Bulkmail_lib/process.js b/process/Bulkmail_lib/process.js index 92940b61ef2b4badfb3a3188dd049ed3415ef80e..6261b7d59664073cc80b657c534ff99346673c4f 100644 --- a/process/Bulkmail_lib/process.js +++ b/process/Bulkmail_lib/process.js @@ -1,3 +1,8 @@ +import("system.logging"); +import("system.entities"); +import("MarketingCondition_lib"); +import("system.fileIO"); +import("system.project"); import("Util_lib"); import("system.translate"); import("ActivityTask_lib"); @@ -16,6 +21,9 @@ import("Email_lib"); import("system.process"); import("system.notification"); import("Document_lib"); +import("system.db"); +import("system.workflow"); +import("system.logging"); /** * Functions for bulk mails. @@ -27,14 +35,14 @@ function BulkMailUtils () {} * * @param {String} pBulkMailId <p> * Id of the bulk mail.<br> - * @param {Array} pTestRecipients (optional) <p> - * Overwrite the recipients (e.g. for testing).<br> + * @param {Bool} pTestRun (optional) <p> + * True indicates a Testrun<br> * @param {String} pUser=currentUser (optional) <p> * User that will get the notification, <br> * if null (not undefined!), no notification<br> * will be created.<br> */ -BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRecipients, pUser) +BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRun, pUser) { if (pUser === undefined) pUser = EmployeeUtils.getCurrentUserId(); @@ -43,10 +51,10 @@ BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRecipients, pUs .setName("sendBulkMail_serverProcess") .setLocalVariables({ bulkMailId : pBulkMailId, - testRecipients : JSON.stringify(pTestRecipients), + testRun : pTestRun, user : pUser || "" }) - .setUser(pUser) + .setUser(pUser||"mailbridge") process.startAsync(processConfig); } @@ -56,42 +64,61 @@ BulkMailUtils.sendBulkMailOnServer = function (pBulkMailId, pTestRecipients, pUs * * @param {String} pBulkMailId <p> * Id of the bulk mail.<br> - * @param {Array} pTestRecipients (optional) <p> - * Overwrite the recipients (e.g. for testing)<br> + * @param {Bool} pIsTestRun (optional) <p> + * True indicates a Testrun<br> * @return {Object} <p> * Count of sucessful and failed mails.<br> */ -BulkMailUtils.sendBulkMail = function (pBulkMailId, pTestRecipients) +BulkMailUtils.sendBulkMail = function (pBulkMailId, pIsTestRun) { + if (pIsTestRun == undefined) + { + pIsTestRun = false; + } + var [templateId, subject, emailSender, createActivity, bulkMailName, useTemplateAttachments] = - newSelect("DOCUMENTTEMPLATE_ID, SUBJECT, SENDER, CREATEACTIVITIES, NAME, USE_TEMPLATE_ATTACHMENTS") + newSelect("DOCUMENTTEMPLATE_ID, SUBJECT, SENDER_EMAIL_ADDRESS, CREATEACTIVITIES, NAME, USE_TEMPLATE_ATTACHMENTS") .from("BULKMAIL") .where("BULKMAIL.BULKMAILID", pBulkMailId) .arrayRow(); - useTemplateAttachments = useTemplateAttachments == "1"; + useTemplateAttachments = Utils.toBoolean(useTemplateAttachments); var template = BulkMailUtils.getBulkMailTemplate(pBulkMailId, templateId, true, useTemplateAttachments); - var recipientData; - if (pTestRecipients) - { - recipientData = pTestRecipients.map(function (row) - { - return ["", row[0], row[1], "", ""]; - }); - } - else + var testRecipientData; + + var recipientLoadConfig = entities.createConfigForLoadingRows() + .fields(["BULKMAILRECIPIENTID", "CONTACT_ID", "EMAIL_ADDRESS", "PERSON_ID", "ORGANISATION_ID"]) + .entity("BulkmailRecipient_entity") + .provider("RecipientsToBeMailed") + .addParameter("BulkMailId_param", pBulkMailId) + .addParameter("IsTestMail_param", pIsTestRun); + + recipientData = entities.getRows(recipientLoadConfig); + + if (pIsTestRun) { - recipientData = newSelect("BULKMAILRECIPIENTID, BULKMAILRECIPIENT.CONTACT_ID, BULKMAILRECIPIENT.EMAIL_ADDRESS, PERSON_ID, ORGANISATION_ID") - .from("CONTACT") - .join("BULKMAILRECIPIENT", "BULKMAILRECIPIENT.CONTACT_ID = CONTACT.CONTACTID") - .where("BULKMAILRECIPIENT.BULKMAIL_ID", pBulkMailId) - .and("BULKMAILRECIPIENT.STATUS", $KeywordRegistry.bulkMailRecipientStatus$sent(), SqlBuilder.NOT_EQUAL()) - .and(ContactUtils.getCommRestrictionCondition($KeywordRegistry.communicationMediumCampaign$mail(), true)) + testRecipientData = newSelect("BULKMAILTESTRECIPIENT.CONTACT_ID, BULKMAILTESTRECIPIENT.EMAIL_ADDRESS") + .from("BULKMAILTESTRECIPIENT") + .where("BULKMAILTESTRECIPIENT.BULKMAIL_ID", pBulkMailId) .table(); } - var contactIds = recipientData.map(function (e) {return e[1];}); + var mailrunId = util.getNewUUID(); + + new SqlBuilder() + .tableName("MAIL_RUN") + .insertFields({ + "MAIL_RUNID": mailrunId, + "OBJECT_ROWID": pBulkMailId, + "OBJECT_TYPE": "Bulkmail", + "DATE_RUN_START": vars.get("$sys.date"), + "STATUS": $KeywordRegistry.bulkMailStatus$beingSent(), + "TESTRUN": pIsTestRun ? 1 : 0 + }); + + + var contactIds = recipientData.map(function (recipient) {return recipient["CONTACT_ID"];}); var successIds = []; var failedIds = []; var sentDate = vars.get("$sys.date"); @@ -102,23 +129,44 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pTestRecipients) var bulkMailLink = [["BulkMail", pBulkMailId]]; var activitySubject = translate.withArguments("Bulk mail \"%0\" sent", [bulkMailName]); - - for (let i = 0, l = recipientData.length; i < l; i++) + if (!pIsTestRun) { - let isSuccess = false; - let contactId = recipientData[i][1]; - let email = mails[contactId]; - if (email !== undefined && recipientData[i][2]) + recipientData.forEach(function (recipient) { - email.toRecipients = [recipientData[i][2]]; - email.sender = emailSender; - email.subject = subjects[contactId]; + let isSuccess = false; + let recipientId = recipient["BULKMAILRECIPIENTID"]; + let contactId = recipient["CONTACT_ID"]; + let emailAddress = recipient["EMAIL_ADDRESS"]; + let personId = recipient["PERSON_ID"]; + let organisationId = recipient["ORGANISATION_ID"]; + let email = mails[contactId]; + let mailLogId = util.getNewUUID(); + if (email !== undefined && emailAddress) + { + email.toRecipients = [emailAddress]; + email.sender = emailSender; + email.subject = subjects[contactId]; - isSuccess = email.send(); - } - if (recipientData[i][0]) //set the recipient status to 'sent' or 'failed' - { - Array.prototype.push.call(isSuccess ? successIds : failedIds, recipientData[i][0]); + BulkMailUtils.storeEmlFile(pBulkMailId, mailrunId, mailLogId,email.getEML()); + isSuccess = email.send(); + } + + //set the recipient status to 'sent' or 'failed' + new SqlBuilder() + .tableName("MAIL_LOG") + .insertFields({ + "MAIL_LOGID": mailLogId, + "MAIL_RUN_ID": mailrunId, + "CONTACT_ID": contactId, + "STATUS": isSuccess ? $KeywordRegistry.bulkMailRecipientStatus$sent() : $KeywordRegistry.bulkMailRecipientStatus$failed(), + "SENDER_EMAIL": emailSender, + "RECIPIENT_EMAIL": emailAddress, + "MAILING_SUBJECT": subjects[contactId], + "DATE_SEND": vars.get("$sys.date") + }); + + //TODO: Klären was von alter Logik noch bleiben soll. Status macht nur Sinn wenn jede Bulkmail nur einmal gesendet wird. Bleiben Activitys? + Array.prototype.push.call(isSuccess ? successIds : failedIds, recipientId); if (isSuccess && createActivity == "1") { let activityData = { @@ -127,23 +175,69 @@ BulkMailUtils.sendBulkMail = function (pBulkMailId, pTestRecipients) subject : activitySubject, content : email.body }; - let contactLink = [[ContactUtils.getContextByPersOrg(recipientData[i][3], recipientData[i][4]), recipientData[i][1]]]; + let contactLink = [[ContactUtils.getContextByPersOrg(personId, organisationid), contactId]]; ActivityUtils.insertNewActivity(activityData, bulkMailLink.concat(contactLink)); } - } + }); + + newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds, SqlBuilder.IN()) + .updateFields({ + "STATUS": $KeywordRegistry.bulkMailRecipientStatus$sent(), + "SENTDATE": sentDate + }); + + newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds, SqlBuilder.IN()) + .updateFields({ + "STATUS": $KeywordRegistry.bulkMailRecipientStatus$failed(), + "SENTDATE": sentDate + }); + + newWhere("MAIL_RUN.MAIL_RUNID", mailrunId) + .updateFields({ + "STATUS": $KeywordRegistry.bulkMailStatus$sent(), + "DATE_RUN_FINISHED": vars.get("$sys.date") + }); + + newWhere("BULKMAIL.BULKMAILID", pBulkMailId) + .updateFields({ + "STATUS": $KeywordRegistry.bulkMailStatus$sent() + }); } - - newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", successIds, SqlBuilder.IN()) - .updateData(true, "BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$sent(), sentDate]); - - - newWhereIfSet("BULKMAILRECIPIENT.BULKMAILRECIPIENTID", failedIds, SqlBuilder.IN()) - .updateData(true, "BULKMAILRECIPIENT", ["STATUS", "SENTDATE"], null, [$KeywordRegistry.bulkMailRecipientStatus$failed(), sentDate]); - - if (!pTestRecipients) //if its just a test run, don't set the status to sent + else { - newWhere("BULKMAIL.BULKMAILID", pBulkMailId) - .updateData(true, "BULKMAIL", ["STATUS"], null, [$KeywordRegistry.bulkMailStatus$sent()]); + for (let i = 0, l = recipientData.length; i < l; i++) + { + + let isSuccess = false; + let contactId = recipientData[i][1]; + let email = mails[contactId]; + + if (email !== undefined) + { + email.sender = emailSender; + email.subject = "Test: "+subjects[contactId]; + for (let j =0; j<testRecipientData.length;j++) + { + if(testRecipientData[j][1]){ + email.toRecipients = [testRecipientData[j][1]]; + isSuccess = email.send(); + + Array.prototype.push.call(isSuccess ? successIds : failedIds, recipientData[i][0]); + + if (testRecipientData[j][0]) + { + let mailLogId = util.getNewUUID(); + db.insertData("MAIL_LOG", ["MAIL_LOGID","MAIL_RUN_ID","CONTACT_ID","STATUS","SENDER_EMAIL","RECIPIENT_EMAIL","MAILING_SUBJECT","DATE_SEND"], null, [mailLogId,mailrunId,testRecipientData[j][0],(isSuccess ?$KeywordRegistry.bulkMailRecipientStatus$sent(): $KeywordRegistry.bulkMailRecipientStatus$failed()),emailSender,testRecipientData[j][1],email.subject,vars.get("$sys.date")]); + this.storeEmlFile(pBulkMailId, mailrunId, mailLogId,email.getEML()); + } + } + } + + } + } + newWhere("MAIL_RUN.MAIL_RUNID",mailrunId) + .updateData(true,"MAIL_RUN",["STATUS","DATE_RUN_FINISHED"],null,[$KeywordRegistry.bulkMailStatus$sent(),vars.get("$sys.date")]); + } return { @@ -399,6 +493,135 @@ BulkMailUtils.copy = function(pBulkMailId) }; neon.openContext("BulkMail", null, null, neon.OPERATINGSTATE_NEW, params); } +/* + *Stores the Eml file for a bulkmailrecipient in the Filesystem + * + * @param {String} pBulkMailId <p> + * The id of the bulk mail.<br> + * @param {String} pMailRunId <p> + * The id of the bulk mail run.<br> + * @param {String} pMailLogId <p> + * The id of the corresponding mail log entry.<br> + **/ +BulkMailUtils.storeEmlFile = function(pBulkMailId,pMailRunId, pMailLogId,pFile) +{ + var locationoption = project.getPreferenceValue("bulkmail.fileStorage","/bulkMailFiles/"); + var path = vars.get("$sys.serverdata")+locationoption +pBulkMailId+"/"+pMailRunId+"/"; + var filename = pMailLogId+".eml" + var fullPath = path + filename; + fileIO.storeData(fullPath, pFile, util.DATA_BINARY, false); +} + +/* + *Loads the Eml file for a bulkmailrecipient from the Filesystem + * + * @param {String} pBulkMailId <p> + * The id of the bulk mail.<br> + * @param {String} pMailRunId <p> + * The id of the bulk mail run.<br> + * @param {String} pMailLogId <p> + * The id of the corresponding mail log entry.<br> + * @return {String} <p> + * The file as base64 String<br> + **/ +BulkMailUtils.getEmlFile = function(pBulkMailId,pMailRunId, pMailLogId) +{ + var locationoption = project.getPreferenceValue("bulkmail.fileStorage","/bulkMailFiles/"); + var path = vars.get("$sys.serverdata")+locationoption +pBulkMailId+"/"+pMailRunId+"/"; + var filename = pMailLogId+".eml" + var fullPath = path + filename; + return (fileIO.getData(fullPath,util.DATA_BINARY)); +} + +/* + *Gets the redirecturl for a link in a bulkmail + * + * @param {String} pLinkId <p> + * The id of the link.<br> + * + * @return {String} <p> + * The url<br> + **/ +BulkMailUtils.getRedirectLink = function(pLinkId) +{ + if (pLinkId) + { + return newSelect("WEBLINK.URL").from("WEBLINK").where("WEBLINK.WEBLINKID", pLinkId).cell(); + } + return null; +} +/* + *Inserts the Redirect into the link_click table. + * + *If its the first Click the Id gets put as opener in mail_log + * + * @param {String} pMailLogId (required)<p> + * The id of the mail log.<br> + * @param {String} pIpAddress <p> + * the ip address of the client.<br> + * @param {String} pLinkId <p> + * The id of link.<br> + * @param {String} pBrowsername <p> + * The browser that was used to open the link.<br> + * @param {String} pOperatingSystemName <p> + * The Operating System that was used to open the link.<br> + * @param {String} pDeviceType <p> + * The device type that was used to open the link.<br> + **/ + +BulkMailUtils.insertClick = function(pMailLogId,pIpAddress,pLinkId,pBrowsername,pOperatingSystemName,pDeviceType) +{ + if (!pMailLogId || !pLinkId) + { + return; + } + + var linkClickId = util.getNewUUID(); + new SqlBuilder() + .tableName("WEBLINK_CLICK") + .insertFields({ + "WEBLINK_CLICKID": linkClickId, + "WEBLINK_ID": pLinkId, + "DEVICE_TYPE": pDeviceType || "desktop", + "OPERATING_SYSTEM": pOperatingSystemName, + "BROWSER": pBrowsername, + "IP_ADDRESS": pIpAddress, + "MAIL_LOG_ID": pMailLogId, + "DATE_OPENED": vars.get("$sys.date") + }); + + newWhere("MAIL_LOG.MAIL_LOGID", pMailLogId) + .and("MAIL_LOG.OPENER_LINK_CLICK_ID is null") + .updateFields({"OPENER_LINK_CLICK_ID": linkClickId}); +} + +/*@TODO: Abändern nachdem geklärt ist wie wir IP-Adresse erhalten. Momentan bekommen wir nur Loadbalancer Ip. + * + **/ + +BulkMailUtils.getIpAddressFromHeader = function(pHttpHeader) +{ + return pHttpHeader["X-forwarded-for"].split(",")[0]; +} + +BulkMailUtils.startBulkmailWorkFlow = function(pMailLogId, pLinkId) +{ + if (!pMailLogId || !pLinkId) + { + return + } + var workFlowKey = newSelect("WORKFLOWPROCESSDEFINITION_KEY").from("WEBLINK").where("WEBLINK.WEBLINKID", pLinkId).cell(); + if (workFlowKey) + { + var variables = { + "MAILLOGID": pMailLogId + }; + workflow.startProcessByKey(workFlowKey, variables); + } + +} + + function SerialLetterUtils () {} diff --git a/process/Calendar_lib/process.js b/process/Calendar_lib/process.js index de9bc373d0fee6098f61111dfa3ae96f8c5ab735..a88ae599dfcf16609bdf974c3854f2c3cf6f276e 100644 --- a/process/Calendar_lib/process.js +++ b/process/Calendar_lib/process.js @@ -1,658 +1,658 @@ -import("system.translate"); -import("system.datetime"); -import("system.neon"); -import("system.calendars"); -import("system.vars"); -import("system.db"); -import("system.swing"); -import("system.eMath"); -import("system.logging"); -import("system.tools"); -import("system.text"); -import("system.question"); -import("system.SQLTYPES"); -import("system.result"); -import("system.util"); -import("system.entities"); -import("Util_lib"); -import("Sql_lib"); - - -/** - * Functions for the calendar. - * <p> - * <b><u>Do not create an instance of this!</u></b> - * @class - */ -function CalendarUtil(){} - - -/* - * Creates and opens an new task object (with link). - * - * @param {String} pSummary (optional) <p> - * The summary.<br> - * @param {String} pDescription (optional) <p> - * The description.<br> - * @param {Boolean} pWithLink (optional) Case if its true, then an a shortcut to $image.frametable will created.<br> - * @param {String[][]} pWithLink (optional) <p> - * The required informations:<br> - * <ul> - * <li>pWithLink[0]: Name of the frame.</li> - * <li>pWithLink[1]: Id of the shown record.</li> - * <li>pWithLink[2]: Linking title.</li> - * @param {String} pUser (optional) <p> - * The user (login).<br> - * @param {[]} pAffectedUsers (optional) <p> - * The affected users. (login)<br> - * @param {date} pStart (optional) <p> - * Start of the task.<br> - * @param {date} pDuration (optional) <p> - * Duration of the task.<br> - * @param {integer} pCategory (optional) <p> - * calendars.CATEGORIES , encoded(String) (e.g.: text.encodeMS(["Service"])) - * @param {String} pStatus (optional) <p> - * Status of the appointment. (calendars.STATUS_TENTATIVE, <br> - * calendars.STATUS_CONFIRMED, calendars.STATUS_CANCELLED)<br> - * @param {Array{[]} pComps4Refresh (optional) <p> - * The component which will be updated.<br> - * - * @return {void} - */ -CalendarUtil.newTodo = function(pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus, pComps4Refresh) -{ - var todo = CalendarUtil.createEntry( calendars.VTODO, pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus ); - var prompts = []; - prompts["comp4refresh"] = []; - - if (pComps4Refresh == undefined) - pComps4Refresh = ["$comp.Aufgabe", "$comp.tbl_Aufgabe"]; - - for (var i = 0; i < pComps4Refresh.length; i++) - { - if ( vars.exists(pComps4Refresh[i])) prompts["comp4refresh"].push(pComps4Refresh[i]); - } - if(vars.getString("$sys.scope") == "vaadin") - neon.openCalendarEntry([todo], null, neon.OPERATINGSTATE_NEW, null) - else - { - if (vars.exists("$sys.currentwindow")) - prompts["window"] = vars.getString("$sys.currentwindow"); - if (vars.exists("$sys.currentimage")) - prompts["image"] = vars.getString("$sys.currentimage"); - - swing.openCalendarEntry([todo], null, false, prompts); - } -} - - -/** - * Finds the effective calendarId of an user in the same <br> - * attribute order like the ADITO core, which is:<br> - * <p> - * exchangeEmail -> calendarID -> email<br> - * <p> - * <b><u>DO NOT CHANGE THIS ORDER!</u></b> - * - * @param {String} pUser <p> - * To check. - * @return <p> - * Effective calendar id.<br> - */ -CalendarUtil.getEffectiveCalendarIdFromUser = function(pUser) -{ - var userParams = pUser["params"]; - - var resolvedCurrentUser; - var exchangeEmail = userParams["exchangeEMail"]; - var calendarId = userParams["calendarID"]; - var email = userParams["email"]; - - if(exchangeEmail) - return exchangeEmail; - else if(calendarId) - return calendarId; - else if(email) - return email; - else - return ""; -} - - -/* - * Creates and opens an new appointment object (with link). - * - * @param {String} pSummary (optional) <p> - * The summary.<br> - * @param {String} pDescription (optional) <p> - * The description.<br> - * @param {Boolean} pWithLink (optional) <p> - * True sets an link to $image.frametable<br> - * @param {String[][]} pWithLink (optional) Description:<br> - * <ul> - * <li>pWithLink[0]: Name of the frame</li> - * <li>pWithLink[1]: Id of the shown record</li> - * <li>pWithLink[2]: linking title</li> - * </ul> - * @param {String} pUser (optional) <p> - * The user (login). - * @param {[]} pAffectedUsers (optional) <p> - * The affected users (login). - * @param {Date} pStart (optional) <p> - * Begin of the task.<br> - * @param {Date} pDuration (optional) <p> - * Duration.<br> - * @param {Number} pCategory (optional) <p> - * calendars.CATEGORIES , encoded(String) (z.B.: text.encodeMS(["Service"])).<br> - * @param {String} pStatus (optional) <p> - * Status of the appointment:<br> - * <ul> - * <li>calendars.STATUS_TENTATIVE</li> - * <li>calendars.STATUS_CONFIRMED</li> - * <li>calendars.STATUS_CANCELLED</li> - * </ul> - * @param {Array{[]} pComps4Refresh (optional) <p> - * The component which will be updated.<br> - * @param {Array{[]} pWorklistId (optional) <p> - * The worklist id.<br> - * - * @return {void} - */ -CalendarUtil.newEvent = function( pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus, pComps4Refresh, pWorklistId) -{ - var event = CalendarUtil.createEntry( calendars.VEVENT, pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus ); - - var prompts = []; - prompts["comp4refresh"] = []; - if (pComps4Refresh == undefined) - pComps4Refresh = ["$comp.Aufgabe", "$comp.tbl_Termine"]; - for (let i = 0; i < pComps4Refresh.length; i++) - { - if ( vars.exists(pComps4Refresh[i])) prompts["comp4refresh"].push(pComps4Refresh[i]); - } - - if(vars.getString("$sys.scope") == "vaadin") - neon.openCalendarEntry([event],"", neon.OPERATINGSTATE_NEW, null) - else - { - prompts["window"] = vars.getString("$sys.currentwindow"); - prompts["image"] = vars.getString("$sys.currentimage"); - if (pWorklistId != undefined) - prompts["worklistId"] = pWorklistId; - swing.openCalendarEntry([event], null, false, prompts); - } -} - - -/* - * Creates an new appointment entry. - * - * @param {String} pSummary (optional) <p> - * The summary/title of the appointment. - * @param {String} pDescription (optional) <p> - * The appointment description. - * @param {String} pLinks (optional) <p> - * The links as objects <u>(key: "OBJECT_ID" & "OBJECT_TYPE")</u> in an array. - * @param {String} pOwner (optional) <p> - * The calendar-user (username) which will be specified as entry-owner. - * @param {String[]} pAffectedUsers (optional) <p> - * The affected users (username). - * @param {Date} pStart (optional) <p> - * The start of the appointment. - * @param {Date} pEnd (optional) <p> - * The end of the appointment. - * @param {String[]} pCategories (optional) <p> - * The categories of the appointment, the default ones are:<br> - * <ul> - * <li>Meeting</li> - * <li>Organisation</li> - * <li>OutOfOffice</li> - * <li>Vacation</li> - * </ul> - * @param {String} pStatus (optional) <p> - * Status of the appointment:<br> - * <ul> - * <li>calendars.STATUS_TENTATIVE</li> - * <li>calendars.STATUS_CONFIRMED</li> - * <li>calendars.STATUS_CANCELLED</li> - * </ul> - * @param {Date} pReminder (optional) <p> - * Date of the reminder for the appointment. - * @param {String[]} pExternalAttendees (optional) <p> - * External attendees. - * @param {String} pLocation (optional) <p> - * The location of the appointment. - * @param {Boolean} pIsAllDay (optional) <p> - * Whether if it is an all-day appointment or not. - * @param {String} pClassification (optional) <p> - * The classification of the appointment:<br> - * <ul> - * <li>calendars.CLASSIFICATION_PUBLIC</li> - * <li>calendars.CLASSIFICATION_PRIVATE</li> - * </ul> - * @return {void} - */ -CalendarUtil.newSilentEvent = function(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, - pReminder, pExternalAttendees, pLocation, pIsAllDay, pClassification) -{ - var event = CalendarUtil.createEntry(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, pReminder, - pExternalAttendees, pLocation, pIsAllDay, pClassification); - - var ids = calendars.insert([event], calendars.GROUP_SINGLE); - - if(pLinks) - { - var conf; - - pLinks.forEach(function(pLink){ - conf = entities.createConfigForAddingRows().entity("AppointmentLink_entity").fieldValues({ - "APPOINTMENT_ID" : ids[0], - "OBJECTID" : pLink["OBJECT_ID"], - "OBJECTTYPE" : pLink["OBJECT_TYPE"] - }); - - entities.createRow(conf); - }); - } -} - -/* - * Creates an new appointment object, which is responsible for holding the data<br> - * till it's used to insert with: calendars.insert (e.g.: in Appointment_entity). - * - * @param {String} pSummary (optional) <p> - * The summary/title of the appointment. - * @param {String} pDescription (optional) <p> - * The description of the appointment. - * @param {Object[]} pLinks (optional) <p> - * The links as objects <u>(key: "OBJECT_ID" & "OBJECT_TYPE")</u> in an array. - * @param {String} pOwner (optional) <p> - * The calendar-user (username) which will be specified as entry-owner. - * @param {String[]} pAffectedUsers (optional) <p> - * The affected users (usernames), which will be added to the appointment. - * @param {Date} pStart (optional) <p> - * Start of the appointment. - * @param {Date} pEnd (optional) <p> - * Duration of the appointment. - * @param {String[]} pCategories (optional) <p> - * The categories of the appointment, the default ones are:<br> - * <ul> - * <li>Meeting</li> - * <li>Organisation</li> - * <li>OutOfOffice</li> - * <li>Vacation</li> - * </ul> - * @param {String} pStatus (optional) Status of the appointment:<br> - * <ul> - * <li>calendars.STATUS_TENTATIVE</li> - * <li>calendars.STATUS_CONFIRMED</li> - * <li>calendars.STATUS_CANCELLED</li> - * </ul> - * @param {Date} pReminder (optional) <p> - * Date of reminder. - * @param {String[]} pExternalAttendees (optional) <p> - * External attendes (e-mail addresses). - * @param {String} pLocation (optional) <p> - * The locations of the appointment. - * @param {Boolean} pIsAllDay (optional) <p> - * Whether if it is an all-day appointment or not. - * @param {String} pClassification (optional) <p> - * The classification of the appointment: - * <ul> - * <li>calendars.CLASSIFICATION_PUBLIC</li> - * <li>calendars.CLASSIFICATION_PRIVATE</li> - * </ul> - * @return {Object} - */ -CalendarUtil.createEntry = function(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, - pReminder, pExternalAttendees, pLocation, pIsAllDay, pClassification) -{ - var entry = {}; - - entry[calendars.TYPE] = calendars.VEVENT; // hardcoded, cause only other option would be calendars.VTODO for an task - // since tasks are handled via. Task_entity there is no need for the calendars.VTODO option. - - if (!pDescription) - { - if(vars.getString("$sys.scope") == "vaadin") - { - pDescription = neon.getImageContent(vars.getString("$sys.currententityname")); - } - else - { - pDescription = swing.getImageContent(); //todo: check whether it's necessary or not. #1047482 - } - } - - if (!pOwner) - { - pOwner = vars.getString("$sys.user"); - } - - if (!pStart) - { - entry[calendars.DTSTART] = Date.now(); - } - else - { - entry[calendars.DTSTART] = pStart.getTime(); - } - - if (!pEnd) - { - let tempStartdate = entry[calendars.DTSTART]; - entry[calendars.DTEND] = tempStartdate + datetime.ONE_HOUR; - } - else - { - entry[calendars.DTEND] = pEnd.getTime().toString(); - } - - if (!pCategories || pCategories == []) - { - pCategories = ""; - } - else - { - for (i = 0; i < pCategories.length; i++) - { - pCategories[i] = translate.text(pCategories[i]); - } - - pCategories = text.encodeMS(pCategories); - } - - if ((pAffectedUsers == null || pAffectedUsers == undefined) && (pExternalAttendees == null || pExternalAttendees == undefined)) - { - entry[calendars.AFFECTEDUSERS] = ""; - } - else - { - var affectedUsers = []; - affectedUsers.push(calendars.getCalendarUser(vars.get("$sys.user"))); - - if(pAffectedUsers && pAffectedUsers != []) - { - affectedUsers = calendars.getCalendarUsers(pAffectedUsers); - } - - if(pExternalAttendees && pExternalAttendees != []) - { - for(let i = 0; i < pExternalAttendees.length; i++) - { - affectedUsers.push("; mailto:" + pExternalAttendees[i] + "; CN:" + pExternalAttendees[i] + "; ") - } - } - - entry[calendars.AFFECTEDUSERS] = text.encodeMS(affectedUsers); - } - - if (!pStatus) - { - pStatus = calendars.STATUS_CONFIRMED; - } - - if(pReminder) - { - entry[calendars.HASREMINDER] = "true"; - entry[calendars.REMINDER_DURATION] = pReminder.getTime().toString(); - } - else - { - entry[calendars.HASREMINDER] = "false"; - } - - if(pLinks) - { - entry["LINKS"] = pLinks; - } - - entry[calendars.USER] = calendars.getCalendarUser(pOwner); - entry[calendars.DESCRIPTION] = pDescription; - entry[calendars.SUMMARY] = pSummary || ""; - entry[calendars.STATUS] = CalendarUtil.mapCalendarStatus(pStatus, calendars.getBackendType()); - entry[calendars.CLASSIFICATION] = pClassification || calendars.CLASSIFICATION_PUBLIC; - entry[calendars.CATEGORIES] = pCategories; - entry[calendars.TRANSPARENCY] = "OPAQUE"; - entry[calendars.LOCATION] = pLocation || ""; - entry["X-ADITO-ISALLDAYEVENT"] = pIsAllDay ? "TRUE" : "FALSE"; - entry[calendars.DTSTART] = entry[calendars.DTSTART].toString(); - - return entry; -} - -/* - * Add an condition.<br> - * - * @param {[]} pConditions <p> - * The condition.<br> - * @param {Integer} pIndex <p> - * Index of the condition.<br> - * @param {Object} pValues <p> - * The values.<br> - * @return {void} - */ -CalendarUtil.addEntryCondition = function(pConditions, pIndex, pValues) -{ - var params = ["TYPE", "START", "END", "USER", "STATUS", "UID"]; - - for (var i = 0; i < params.length; i++) - if (pValues[params[i]] != undefined) pConditions[params[i] + "_" + pIndex] = pValues[params[i]]; -} - -/* - * Returns the date without the time.<br> - * - * @param {String} datetimeIn <p> - * Datetime.<br> - * @return {Date} <p> - * The desired date.<br> - */ -CalendarUtil.getDate = function(datetimeIn) -{ - if ( datetimeIn != "") - return datetime.clearTime(datetimeIn); - else return ""; -} - -/* - * Resets the event filter.<br> - * - * @return {Object} - */ -CalendarUtil.reset_filterEvent = function() -{ - var today = CalendarUtil.getDate(vars.getString("$sys.date")); - - return pFilter = { - user: vars.getString("$sys.user"), - datefrom: String(today), //nur die Termine ab heute anzeigen, - //die von vor einer Woche sind uninteressant - dateto: String(eMath.addInt(eMath.addInt(today, datetime.ONE_WEEK) - ,datetime.ONE_DAY - datetime.ONE_MINUTE)), - category: "", - tentative: "true", - confirmed: "true", - cancelled: "", - free: "true" - }; -} - -/* - * Gibt den richtigen Status zum Prüfen je nach Backend zurück - * Returns the matching status, to the corresponding backend. - * - * - * @param {String} pStatus req die konstante für den zu prüfenden status, - * z.B. calendars.STATUS_INPROCESS - * - * @param {String} pCalendarType req die konstante für den typen des Termin- oder Aufgabenbackends, - * z.B. calendars.BACKEND_DB - * - * @return {String} Konstanten für den Kalender (Backend-Typen), gibt es den status im backend nicht - * wird null geliefert - */ -CalendarUtil.mapCalendarStatus = function(pStatus, pCalendarType) -{ - switch (pCalendarType) - { - //case calendars.BACKEND_EXCHANGE: - case calendars.BACKEND_EXCHANGEWS: - if (pStatus == calendars.STATUS_CONFIRMED) - return calendars.STATUS_BUSY; - else - return pStatus; - default: - if (pStatus == calendars.STATUS_OOF)//nur bei exchange - return null; - else - return pStatus; - } -} - -/** - * Returns the "real" calendar system/backend type<br> - * (e.g.: BackendType & SyncBackendType) - * - * @param {Number} pScope <p> - * The needed scope:<br> - * <ul> - * <li>calendars.VEVENT</li> - * <li>calendars.VTODO</li> - * </ul> - * @return {Number} <p> - * The backend type (e.g.: calendars.BACKEND_*).<br> - */ -CalendarUtil.getCalendarSystemType = function(pScope) -{ - // Check sync backend type - if (calendars.getSyncBackendType() != calendars.BACKEND_NONE && calendars.getSyncBackendType() != 3) - { - var scope = calendars.getSyncBackendTypeScope(); - if (scope.length == 1 && scope[0] == pScope) // Scope.length = 1 -> VEVENT *OR* VTODO - return calendars.getSyncBackendType(); - else if (scope.length == 2) // Scope.length = 2 -> Both - return calendars.getSyncBackendType(); - // Scope.length = 0 -> Nothing selected -> Skip this block - } - - // Fallback to backend type (event) - if (calendars.getBackendType() != calendars.BACKEND_NONE && pScope === calendars.VEVENT) - return calendars.getBackendType(); - - // Second fallback to backend type (todo) - if (calendars.getBackendTypeTasks() != calendars.BACKEND_NONE && pScope === calendars.VTODO) - return calendars.getBackendTypeTasks(); - - // Everything is none - return calendars.BACKEND_NONE; -} - -CalendarUtil.buildEntriesFromUids = function(appointmentUids) -{ - var entryArray = new Array(appointmentUids.length); - - for(var i = 0; i < appointmentUids.length; i++) - { - var hasPermission = true; - - if(vars.get("$param.ErrorOnPermissionDenied") == "false" || vars.getString("$param.LinkedAppointmentsFromDashlet_param")) - hasPermission = hasUserPermissionForReadingEntry(getEntryOwnerCn(appointmentUids[i])); - - if(hasPermission) - entryArray[i] = CalendarUtil.buildEntry(calendars.getEntry(appointmentUids[i], null, null), null); - } - - //filter out all null - var filteredEntryArray = entryArray.filter(function (el) { - return el != null; - }); - - return filteredEntryArray; -} - - -CalendarUtil.countEntriesFromUids = function(appointmentUids) -{ - return CalendarUtil.buildEntriesFromUids(appointmentUids).length; -} - -CalendarUtil.buildEntry = function (pEntry, pMasterentry) -{ - var uid = pEntry[calendars.ID]; - var summary = pEntry[calendars.SUMMARY]; - var attendees = pEntry[calendars.AFFECTEDUSERS]; - var startdate = pEntry[calendars.DTSTART]; - var enddate = pEntry[calendars.DTEND]; - var links = pEntry[calendars.LINKS]; - var description = pEntry[calendars.DESCRIPTION]; - if(pEntry[calendars.ORGANIZER2] != undefined) - var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"]; - if(pEntry[calendars.USER2] != undefined) - var owner = JSON.stringify(pEntry[calendars.USER2]); - var status = pEntry[calendars.STATUS]; - var location = pEntry[calendars.LOCATION]; - var reminder = pEntry[calendars.REMINDER_DURATION]; - var remindercheck = pEntry[calendars.HASREMINDER] - var classification = pEntry[calendars.CLASSIFICATION]; - var transparency = pEntry[calendars.TRANSPARENCY]; - var categories = pEntry[calendars.CATEGORIES]; - var isAllDay = pEntry["X-ADITO-ISALLDAYEVENT"] != null ? pEntry["X-ADITO-ISALLDAYEVENT"] : "FALSE"; - - var masterBegin = pMasterentry != null ? pMasterentry[calendars.DTSTART] : null - var masterEnd = pMasterentry != null ? pMasterentry[calendars.DTEND] : null - - // Recurrence - var recurrenceID = pEntry[calendars.RECURRENCEID]; - var rrule = null; - if (pMasterentry != null) { // Entry is a recurrence exception, therefore get rrule from master - rrule = pMasterentry[calendars.RRULE] != null ? pMasterentry[calendars.RRULE][0] : null; - } else { - rrule = pEntry[calendars.RRULE] != null ? pEntry[calendars.RRULE][0] : null; - } - - return [ - uid, - attendees.length, - startdate, - enddate, - summary, - organizer, - owner, - attendees, - status, - description, - location, - '', - isAllDay, - classification, - transparency, - categories, - reminder, - remindercheck, - rrule, - recurrenceID, - null, - masterBegin, - masterEnd, - null - ]; -} - - -function hasUserPermissionForReadingEntry(calUserCn) -{ - return calendars.hasPermission(calUserCn, calendars.VEVENT, "READ"); -} - -function getEntryOwnerCn(appointmentUid) -{ - - var owner = newSelect("ASYS_CALENDARBACKEND.OWNER", "_____SYSTEMALIAS") - .from("ASYS_CALENDARBACKEND") - .whereIfSet("ASYS_CALENDARBACKEND.ELEMENTUID", appointmentUid) - .cell(true); - - var ownerArr = text.decodeMS(owner); - return ownerArr[1].split(":")[1]; +import("system.translate"); +import("system.datetime"); +import("system.neon"); +import("system.calendars"); +import("system.vars"); +import("system.db"); +import("system.swing"); +import("system.eMath"); +import("system.logging"); +import("system.tools"); +import("system.text"); +import("system.question"); +import("system.SQLTYPES"); +import("system.result"); +import("system.util"); +import("system.entities"); +import("Util_lib"); +import("Sql_lib"); + + +/** + * Functions for the calendar. + * <p> + * <b><u>Do not create an instance of this!</u></b> + * @class + */ +function CalendarUtil(){} + + +/* + * Creates and opens an new task object (with link). + * + * @param {String} pSummary (optional) <p> + * The summary.<br> + * @param {String} pDescription (optional) <p> + * The description.<br> + * @param {Boolean} pWithLink (optional) Case if its true, then an a shortcut to $image.frametable will created.<br> + * @param {String[][]} pWithLink (optional) <p> + * The required informations:<br> + * <ul> + * <li>pWithLink[0]: Name of the frame.</li> + * <li>pWithLink[1]: Id of the shown record.</li> + * <li>pWithLink[2]: Linking title.</li> + * @param {String} pUser (optional) <p> + * The user (login).<br> + * @param {[]} pAffectedUsers (optional) <p> + * The affected users. (login)<br> + * @param {date} pStart (optional) <p> + * Start of the task.<br> + * @param {date} pDuration (optional) <p> + * Duration of the task.<br> + * @param {integer} pCategory (optional) <p> + * calendars.CATEGORIES , encoded(String) (e.g.: text.encodeMS(["Service"])) + * @param {String} pStatus (optional) <p> + * Status of the appointment. (calendars.STATUS_TENTATIVE, <br> + * calendars.STATUS_CONFIRMED, calendars.STATUS_CANCELLED)<br> + * @param {Array{[]} pComps4Refresh (optional) <p> + * The component which will be updated.<br> + * + * @return {void} + */ +CalendarUtil.newTodo = function(pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus, pComps4Refresh) +{ + var todo = CalendarUtil.createEntry( calendars.VTODO, pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus ); + var prompts = []; + prompts["comp4refresh"] = []; + + if (pComps4Refresh == undefined) + pComps4Refresh = ["$comp.Aufgabe", "$comp.tbl_Aufgabe"]; + + for (var i = 0; i < pComps4Refresh.length; i++) + { + if ( vars.exists(pComps4Refresh[i])) prompts["comp4refresh"].push(pComps4Refresh[i]); + } + if(vars.getString("$sys.scope") == "vaadin") + neon.openCalendarEntry([todo], null, neon.OPERATINGSTATE_NEW, null) + else + { + if (vars.exists("$sys.currentwindow")) + prompts["window"] = vars.getString("$sys.currentwindow"); + if (vars.exists("$sys.currentimage")) + prompts["image"] = vars.getString("$sys.currentimage"); + + swing.openCalendarEntry([todo], null, false, prompts); + } +} + + +/** + * Finds the effective calendarId of an user in the same <br> + * attribute order like the ADITO core, which is:<br> + * <p> + * exchangeEmail -> calendarID -> email<br> + * <p> + * <b><u>DO NOT CHANGE THIS ORDER!</u></b> + * + * @param {String} pUser <p> + * To check. + * @return <p> + * Effective calendar id.<br> + */ +CalendarUtil.getEffectiveCalendarIdFromUser = function(pUser) +{ + var userParams = pUser["params"]; + + var resolvedCurrentUser; + var exchangeEmail = userParams["exchangeEMail"]; + var calendarId = userParams["calendarID"]; + var email = userParams["email"]; + + if(exchangeEmail) + return exchangeEmail; + else if(calendarId) + return calendarId; + else if(email) + return email; + else + return ""; +} + + +/* + * Creates and opens an new appointment object (with link). + * + * @param {String} pSummary (optional) <p> + * The summary.<br> + * @param {String} pDescription (optional) <p> + * The description.<br> + * @param {Boolean} pWithLink (optional) <p> + * True sets an link to $image.frametable<br> + * @param {String[][]} pWithLink (optional) Description:<br> + * <ul> + * <li>pWithLink[0]: Name of the frame</li> + * <li>pWithLink[1]: Id of the shown record</li> + * <li>pWithLink[2]: linking title</li> + * </ul> + * @param {String} pUser (optional) <p> + * The user (login). + * @param {[]} pAffectedUsers (optional) <p> + * The affected users (login). + * @param {Date} pStart (optional) <p> + * Begin of the task.<br> + * @param {Date} pDuration (optional) <p> + * Duration.<br> + * @param {Number} pCategory (optional) <p> + * calendars.CATEGORIES , encoded(String) (z.B.: text.encodeMS(["Service"])).<br> + * @param {String} pStatus (optional) <p> + * Status of the appointment:<br> + * <ul> + * <li>calendars.STATUS_TENTATIVE</li> + * <li>calendars.STATUS_CONFIRMED</li> + * <li>calendars.STATUS_CANCELLED</li> + * </ul> + * @param {Array{[]} pComps4Refresh (optional) <p> + * The component which will be updated.<br> + * @param {Array{[]} pWorklistId (optional) <p> + * The worklist id.<br> + * + * @return {void} + */ +CalendarUtil.newEvent = function( pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus, pComps4Refresh, pWorklistId) +{ + var event = CalendarUtil.createEntry( calendars.VEVENT, pSummary, pDescription, pWithLink, pUser, pAffectedUsers, pStart, pDuration, pCategory, pStatus ); + + var prompts = []; + prompts["comp4refresh"] = []; + if (pComps4Refresh == undefined) + pComps4Refresh = ["$comp.Aufgabe", "$comp.tbl_Termine"]; + for (let i = 0; i < pComps4Refresh.length; i++) + { + if ( vars.exists(pComps4Refresh[i])) prompts["comp4refresh"].push(pComps4Refresh[i]); + } + + if(vars.getString("$sys.scope") == "vaadin") + neon.openCalendarEntry([event],"", neon.OPERATINGSTATE_NEW, null) + else + { + prompts["window"] = vars.getString("$sys.currentwindow"); + prompts["image"] = vars.getString("$sys.currentimage"); + if (pWorklistId != undefined) + prompts["worklistId"] = pWorklistId; + swing.openCalendarEntry([event], null, false, prompts); + } +} + + +/* + * Creates an new appointment entry. + * + * @param {String} pSummary (optional) <p> + * The summary/title of the appointment. + * @param {String} pDescription (optional) <p> + * The appointment description. + * @param {String} pLinks (optional) <p> + * The links as objects <u>(key: "OBJECT_ID" & "OBJECT_TYPE")</u> in an array. + * @param {String} pOwner (optional) <p> + * The calendar-user (username) which will be specified as entry-owner. + * @param {String[]} pAffectedUsers (optional) <p> + * The affected users (username). + * @param {Date} pStart (optional) <p> + * The start of the appointment. + * @param {Date} pEnd (optional) <p> + * The end of the appointment. + * @param {String[]} pCategories (optional) <p> + * The categories of the appointment, the default ones are:<br> + * <ul> + * <li>Meeting</li> + * <li>Organisation</li> + * <li>OutOfOffice</li> + * <li>Vacation</li> + * </ul> + * @param {String} pStatus (optional) <p> + * Status of the appointment:<br> + * <ul> + * <li>calendars.STATUS_TENTATIVE</li> + * <li>calendars.STATUS_CONFIRMED</li> + * <li>calendars.STATUS_CANCELLED</li> + * </ul> + * @param {Date} pReminder (optional) <p> + * Date of the reminder for the appointment. + * @param {String[]} pExternalAttendees (optional) <p> + * External attendees. + * @param {String} pLocation (optional) <p> + * The location of the appointment. + * @param {Boolean} pIsAllDay (optional) <p> + * Whether if it is an all-day appointment or not. + * @param {String} pClassification (optional) <p> + * The classification of the appointment:<br> + * <ul> + * <li>calendars.CLASSIFICATION_PUBLIC</li> + * <li>calendars.CLASSIFICATION_PRIVATE</li> + * </ul> + * @return {void} + */ +CalendarUtil.newSilentEvent = function(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, + pReminder, pExternalAttendees, pLocation, pIsAllDay, pClassification) +{ + var event = CalendarUtil.createEntry(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, pReminder, + pExternalAttendees, pLocation, pIsAllDay, pClassification); + + var ids = calendars.insert([event], calendars.GROUP_SINGLE); + + if(pLinks) + { + var conf; + + pLinks.forEach(function(pLink){ + conf = entities.createConfigForAddingRows().entity("AppointmentLink_entity").fieldValues({ + "APPOINTMENT_ID" : ids[0], + "OBJECTID" : pLink["OBJECT_ID"], + "OBJECTTYPE" : pLink["OBJECT_TYPE"] + }); + + entities.createRow(conf); + }); + } +} + +/* + * Creates an new appointment object, which is responsible for holding the data<br> + * till it's used to insert with: calendars.insert (e.g.: in Appointment_entity). + * + * @param {String} pSummary (optional) <p> + * The summary/title of the appointment. + * @param {String} pDescription (optional) <p> + * The description of the appointment. + * @param {Object[]} pLinks (optional) <p> + * The links as objects <u>(key: "OBJECT_ID" & "OBJECT_TYPE")</u> in an array. + * @param {String} pOwner (optional) <p> + * The calendar-user (username) which will be specified as entry-owner. + * @param {String[]} pAffectedUsers (optional) <p> + * The affected users (usernames), which will be added to the appointment. + * @param {Date} pStart (optional) <p> + * Start of the appointment. + * @param {Date} pEnd (optional) <p> + * Duration of the appointment. + * @param {String[]} pCategories (optional) <p> + * The categories of the appointment, the default ones are:<br> + * <ul> + * <li>Meeting</li> + * <li>Organisation</li> + * <li>OutOfOffice</li> + * <li>Vacation</li> + * </ul> + * @param {String} pStatus (optional) Status of the appointment:<br> + * <ul> + * <li>calendars.STATUS_TENTATIVE</li> + * <li>calendars.STATUS_CONFIRMED</li> + * <li>calendars.STATUS_CANCELLED</li> + * </ul> + * @param {Date} pReminder (optional) <p> + * Date of reminder. + * @param {String[]} pExternalAttendees (optional) <p> + * External attendes (e-mail addresses). + * @param {String} pLocation (optional) <p> + * The locations of the appointment. + * @param {Boolean} pIsAllDay (optional) <p> + * Whether if it is an all-day appointment or not. + * @param {String} pClassification (optional) <p> + * The classification of the appointment: + * <ul> + * <li>calendars.CLASSIFICATION_PUBLIC</li> + * <li>calendars.CLASSIFICATION_PRIVATE</li> + * </ul> + * @return {Object} + */ +CalendarUtil.createEntry = function(pSummary, pDescription, pLinks, pOwner, pAffectedUsers, pStart, pEnd, pCategories, pStatus, + pReminder, pExternalAttendees, pLocation, pIsAllDay, pClassification) +{ + var entry = {}; + + entry[calendars.TYPE] = calendars.VEVENT; // hardcoded, cause only other option would be calendars.VTODO for an task + // since tasks are handled via. Task_entity there is no need for the calendars.VTODO option. + + if (!pDescription) + { + if(vars.getString("$sys.scope") == "vaadin") + { + pDescription = neon.getImageContent(vars.getString("$sys.currententityname")); + } + else + { + pDescription = swing.getImageContent(); //todo: check whether it's necessary or not. #1047482 + } + } + + if (!pOwner) + { + pOwner = vars.getString("$sys.user"); + } + + if (!pStart) + { + entry[calendars.DTSTART] = Date.now(); + } + else + { + entry[calendars.DTSTART] = pStart.getTime(); + } + + if (!pEnd) + { + let tempStartdate = entry[calendars.DTSTART]; + entry[calendars.DTEND] = tempStartdate + datetime.ONE_HOUR; + } + else + { + entry[calendars.DTEND] = pEnd.getTime().toString(); + } + + if (!pCategories || pCategories == []) + { + pCategories = ""; + } + else + { + for (i = 0; i < pCategories.length; i++) + { + pCategories[i] = translate.text(pCategories[i]); + } + + pCategories = text.encodeMS(pCategories); + } + + if ((pAffectedUsers == null || pAffectedUsers == undefined) && (pExternalAttendees == null || pExternalAttendees == undefined)) + { + entry[calendars.AFFECTEDUSERS] = ""; + } + else + { + var affectedUsers = []; + affectedUsers.push(calendars.getCalendarUser(vars.get("$sys.user"))); + + if(pAffectedUsers && pAffectedUsers != []) + { + affectedUsers = calendars.getCalendarUsers(pAffectedUsers); + } + + if(pExternalAttendees && pExternalAttendees != []) + { + for(let i = 0; i < pExternalAttendees.length; i++) + { + affectedUsers.push("; mailto:" + pExternalAttendees[i] + "; CN:" + pExternalAttendees[i] + "; ") + } + } + + entry[calendars.AFFECTEDUSERS] = text.encodeMS(affectedUsers); + } + + if (!pStatus) + { + pStatus = calendars.STATUS_CONFIRMED; + } + + if(pReminder) + { + entry[calendars.HASREMINDER] = "true"; + entry[calendars.REMINDER_DURATION] = pReminder.getTime().toString(); + } + else + { + entry[calendars.HASREMINDER] = "false"; + } + + if(pLinks) + { + entry["LINKS"] = pLinks; + } + + entry[calendars.USER] = calendars.getCalendarUser(pOwner); + entry[calendars.DESCRIPTION] = pDescription; + entry[calendars.SUMMARY] = pSummary || ""; + entry[calendars.STATUS] = CalendarUtil.mapCalendarStatus(pStatus, calendars.getBackendType()); + entry[calendars.CLASSIFICATION] = pClassification || calendars.CLASSIFICATION_PUBLIC; + entry[calendars.CATEGORIES] = pCategories; + entry[calendars.TRANSPARENCY] = "OPAQUE"; + entry[calendars.LOCATION] = pLocation || ""; + entry["X-ADITO-ISALLDAYEVENT"] = pIsAllDay ? "TRUE" : "FALSE"; + entry[calendars.DTSTART] = entry[calendars.DTSTART].toString(); + + return entry; +} + +/* + * Add an condition.<br> + * + * @param {[]} pConditions <p> + * The condition.<br> + * @param {Integer} pIndex <p> + * Index of the condition.<br> + * @param {Object} pValues <p> + * The values.<br> + * @return {void} + */ +CalendarUtil.addEntryCondition = function(pConditions, pIndex, pValues) +{ + var params = ["TYPE", "START", "END", "USER", "STATUS", "UID"]; + + for (var i = 0; i < params.length; i++) + if (pValues[params[i]] != undefined) pConditions[params[i] + "_" + pIndex] = pValues[params[i]]; +} + +/* + * Returns the date without the time.<br> + * + * @param {String} datetimeIn <p> + * Datetime.<br> + * @return {Date} <p> + * The desired date.<br> + */ +CalendarUtil.getDate = function(datetimeIn) +{ + if ( datetimeIn != "") + return datetime.clearTime(datetimeIn); + else return ""; +} + +/* + * Resets the event filter.<br> + * + * @return {Object} + */ +CalendarUtil.reset_filterEvent = function() +{ + var today = CalendarUtil.getDate(vars.getString("$sys.date")); + + return pFilter = { + user: vars.getString("$sys.user"), + datefrom: String(today), //nur die Termine ab heute anzeigen, + //die von vor einer Woche sind uninteressant + dateto: String(eMath.addInt(eMath.addInt(today, datetime.ONE_WEEK) + ,datetime.ONE_DAY - datetime.ONE_MINUTE)), + category: "", + tentative: "true", + confirmed: "true", + cancelled: "", + free: "true" + }; +} + +/* + * Gibt den richtigen Status zum Prüfen je nach Backend zurück + * Returns the matching status, to the corresponding backend. + * + * + * @param {String} pStatus req die konstante für den zu prüfenden status, + * z.B. calendars.STATUS_INPROCESS + * + * @param {String} pCalendarType req die konstante für den typen des Termin- oder Aufgabenbackends, + * z.B. calendars.BACKEND_DB + * + * @return {String} Konstanten für den Kalender (Backend-Typen), gibt es den status im backend nicht + * wird null geliefert + */ +CalendarUtil.mapCalendarStatus = function(pStatus, pCalendarType) +{ + switch (pCalendarType) + { + //case calendars.BACKEND_EXCHANGE: + case calendars.BACKEND_EXCHANGEWS: + if (pStatus == calendars.STATUS_CONFIRMED) + return calendars.STATUS_BUSY; + else + return pStatus; + default: + if (pStatus == calendars.STATUS_OOF)//nur bei exchange + return null; + else + return pStatus; + } +} + +/** + * Returns the "real" calendar system/backend type<br> + * (e.g.: BackendType & SyncBackendType) + * + * @param {Number} pScope <p> + * The needed scope:<br> + * <ul> + * <li>calendars.VEVENT</li> + * <li>calendars.VTODO</li> + * </ul> + * @return {Number} <p> + * The backend type (e.g.: calendars.BACKEND_*).<br> + */ +CalendarUtil.getCalendarSystemType = function(pScope) +{ + // Check sync backend type + if (calendars.getSyncBackendType() != calendars.BACKEND_NONE && calendars.getSyncBackendType() != 3) + { + var scope = calendars.getSyncBackendTypeScope(); + if (scope.length == 1 && scope[0] == pScope) // Scope.length = 1 -> VEVENT *OR* VTODO + return calendars.getSyncBackendType(); + else if (scope.length == 2) // Scope.length = 2 -> Both + return calendars.getSyncBackendType(); + // Scope.length = 0 -> Nothing selected -> Skip this block + } + + // Fallback to backend type (event) + if (calendars.getBackendType() != calendars.BACKEND_NONE && pScope === calendars.VEVENT) + return calendars.getBackendType(); + + // Second fallback to backend type (todo) + if (calendars.getBackendTypeTasks() != calendars.BACKEND_NONE && pScope === calendars.VTODO) + return calendars.getBackendTypeTasks(); + + // Everything is none + return calendars.BACKEND_NONE; +} + +CalendarUtil.buildEntriesFromUids = function(appointmentUids) +{ + var entryArray = new Array(appointmentUids.length); + + for(var i = 0; i < appointmentUids.length; i++) + { + var hasPermission = true; + + if(vars.get("$param.ErrorOnPermissionDenied") == "false" || vars.getString("$param.LinkedAppointmentsFromDashlet_param")) + hasPermission = hasUserPermissionForReadingEntry(getEntryOwnerCn(appointmentUids[i])); + + if(hasPermission) + entryArray[i] = CalendarUtil.buildEntry(calendars.getEntry(appointmentUids[i], null, null), null); + } + + //filter out all null + var filteredEntryArray = entryArray.filter(function (el) { + return el != null; + }); + + return filteredEntryArray; +} + + +CalendarUtil.countEntriesFromUids = function(appointmentUids) +{ + return CalendarUtil.buildEntriesFromUids(appointmentUids).length; +} + +CalendarUtil.buildEntry = function (pEntry, pMasterentry) +{ + var uid = pEntry[calendars.ID]; + var summary = pEntry[calendars.SUMMARY]; + var attendees = pEntry[calendars.AFFECTEDUSERS]; + var startdate = pEntry[calendars.DTSTART]; + var enddate = pEntry[calendars.DTEND]; + var links = pEntry[calendars.LINKS]; + var description = pEntry[calendars.DESCRIPTION]; + if(pEntry[calendars.ORGANIZER2] != undefined) + var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"]; + if(pEntry[calendars.USER2] != undefined) + var owner = JSON.stringify(pEntry[calendars.USER2]); + var status = pEntry[calendars.STATUS]; + var location = pEntry[calendars.LOCATION]; + var reminder = pEntry[calendars.REMINDER_DURATION]; + var remindercheck = pEntry[calendars.HASREMINDER] + var classification = pEntry[calendars.CLASSIFICATION]; + var transparency = pEntry[calendars.TRANSPARENCY]; + var categories = pEntry[calendars.CATEGORIES]; + var isAllDay = pEntry["X-ADITO-ISALLDAYEVENT"] != null ? pEntry["X-ADITO-ISALLDAYEVENT"] : "FALSE"; + + var masterBegin = pMasterentry != null ? pMasterentry[calendars.DTSTART] : null + var masterEnd = pMasterentry != null ? pMasterentry[calendars.DTEND] : null + + // Recurrence + var recurrenceID = pEntry[calendars.RECURRENCEID]; + var rrule = null; + if (pMasterentry != null) { // Entry is a recurrence exception, therefore get rrule from master + rrule = pMasterentry[calendars.RRULE] != null ? pMasterentry[calendars.RRULE][0] : null; + } else { + rrule = pEntry[calendars.RRULE] != null ? pEntry[calendars.RRULE][0] : null; + } + + return [ + uid, + attendees.length, + startdate, + enddate, + summary, + organizer, + owner, + attendees, + status, + description, + location, + '', + isAllDay, + classification, + transparency, + categories, + reminder, + remindercheck, + rrule, + recurrenceID, + null, + masterBegin, + masterEnd, + null + ]; +} + + +function hasUserPermissionForReadingEntry(calUserCn) +{ + return calendars.hasPermission(calUserCn, calendars.VEVENT, "READ"); +} + +function getEntryOwnerCn(appointmentUid) +{ + + var owner = newSelect("ASYS_CALENDARBACKEND.OWNER", "_____SYSTEMALIAS") + .from("ASYS_CALENDARBACKEND") + .whereIfSet("ASYS_CALENDARBACKEND.ELEMENTUID", appointmentUid) + .cell(true); + + var ownerArr = text.decodeMS(owner); + return ownerArr[1].split(":")[1]; } \ No newline at end of file diff --git a/process/Campaign_lib/process.js b/process/Campaign_lib/process.js index 7606f5621de2acaf083d346df68143384f7d297b..f488f0ee653f84eb47ab793219f9965bfd6d6a04 100644 --- a/process/Campaign_lib/process.js +++ b/process/Campaign_lib/process.js @@ -512,6 +512,27 @@ CampaignUtils.GetContactIdsNotInCampaignByRowIds = function(pCampaignId, pPartic .arrayColumn(); } + +/** + * Returns the contact ids which aren't in the given campaignstep.<br> + * + * @param {String} pCampaignStepId <p> + * The id of the campaignstep.<br> + * @param {String[]} pParticipantRowIds <p> + * The participant ids (campaignparticipantids).<br> + * @return {String[]} <p> + * The contact ids which arent in the<br> + * given campaignstep.<br> + */ +CampaignUtils.GetContactIdsNotInCampaignStepByRowIds = function(pCampaignStepId, pParticipantRowIds) +{ + return newSelect("CAMPAIGNPARTICIPANT.CONTACT_ID") + .from("CAMPAIGNPARTICIPANT") + .where("CAMPAIGNPARTICIPANT.CAMPAIGNPARTICIPANTID", pParticipantRowIds, SqlBuilder.IN()) + .and("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID",pCampaignStepId,SqlBuilder.NOT_EQUAL()) + .arrayColumn(); +} + /** * Returns the contact ids which arent in the campaign<br> * with the given campaign id.<br> @@ -537,7 +558,7 @@ CampaignUtils.GetContactIdsNotInCampaignByCondition = function(pCampaignId, pCon .from("CONTACT"); if (origin == "Person") - query.leftJoin("PERSON", "CONTACT.PERSON_ID = PERSON.PERSONID"); + query.join("PERSON", "CONTACT.PERSON_ID = PERSON.PERSONID"); query.join("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID") .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") @@ -556,6 +577,41 @@ CampaignUtils.GetContactIdsNotInCampaignByCondition = function(pCampaignId, pCon return query.arrayColumn(); } +/** + * Returns the contact ids which arent in a different campaignstep of the same campaign<br> + * with the given campaign id.<br> + * + * @param {String} pCampaignStepId <p> + * The id of the campaignstep.<br> + * @param {String} pCampaignId <p> + * The id of the campaign.<br> + * @param {String} pCondition (optional) <p> + * An condition which is used to limit the search contact results.<br> + * @return {String[]} <p> + * The contact ids that arent in the campaignstep.<br> + */ +CampaignUtils.GetContactIdsNotInCampaignStepByCondition = function(pCampaignStepId,pCampaignId, pCondition) +{ + + var subselect = newSelect("CAMPAIGNPARTICIPANT.CONTACT_ID") + .from("CAMPAIGNPARTICIPANT") + .where("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID", pCampaignStepId); + + var query = newSelect("CONTACT.CONTACTID") + .from("CONTACT") + .join("ORGANISATION", "ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID") + .join("CAMPAIGNPARTICIPANT","CAMPAIGNPARTICIPANT.CONTACT_ID = CONTACT.CONTACTID") + .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID") + .where("CAMPAIGNPARTICIPANT.CAMPAIGN_ID",pCampaignId ) + .and("CAMPAIGNPARTICIPANT.CAMPAIGNSTEP_ID",pCampaignStepId,SqlBuilder.NOT_EQUAL()); + + + if(pCondition != "") + query.and(pCondition); + + return query.arrayColumn(); +} + /** * Returns the contact ids which are in the campaign,<br> * with the given campaign id.<br> diff --git a/process/Contact_lib/process.js b/process/Contact_lib/process.js index 3df661040ea43b3347bd1afb180f11d5f2bd0c04..2824ee403672033132486d51070529e44f28e9db 100644 --- a/process/Contact_lib/process.js +++ b/process/Contact_lib/process.js @@ -539,18 +539,17 @@ ContactUtils.getDefaultAddressId = function(pContactId) */ ContactUtils.getCommRestrictionCondition = function (pMedium, pNoRestriction, pStartDate) { - if (!pStartDate && pStartDate !== 0) - pStartDate = datetime.date(); var existsQuery = new SqlBuilder() - .select("COMMRESTRICTIONID") - .from("COMMRESTRICTION") - .whereIfSet("COMMRESTRICTION.MEDIUM", pMedium) - .and("COMMRESTRICTION.STARTDATE", pStartDate, SqlBuilder.LESS_OR_EQUAL()) + .select("COMMUNICATIONSETTINGSID") + .from("COMMUNICATIONSETTINGS") + .where(newWhereIfSet("COMMUNICATIONSETTINGS.MEDIUM", pMedium) + .or("COMMUNICATIONSETTINGS.CHANNEL_TYPE", $KeywordRegistry.communicationChannelType$global())) + .and("COMMUNICATIONSETTINGS.STATUS", $KeywordRegistry.communicationSettingStatus$rejected()) .and(newWhere() // check contactid - .or("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID") + .or("COMMUNICATIONSETTINGS.CONTACT_ID = CONTACT.CONTACTID") // or the contact id of the organisation - .or("COMMRESTRICTION.CONTACT_ID", newSelect("orgContact.CONTACTID") + .or("COMMUNICATIONSETTINGS.CONTACT_ID", newSelect("orgContact.CONTACTID") .from("CONTACT anyContact") .join("CONTACT orgContact", newWhere("anyContact.ORGANISATION_ID = orgContact.ORGANISATION_ID") .and("orgContact.PERSON_ID is null") @@ -588,7 +587,7 @@ ContactUtils.hasCommRestriction = function(pContactId, pMedium, pStartDate) */ ContactUtils.getActiveCommRestrictionsSubselect = function() { - var mediumList = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationMediumCampaign(), "COMMRESTRICTION.MEDIUM"); + var mediumList = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.communicationMediumCampaign(), "COMMUNICATIONSETTINGS.MEDIUM"); var mask = new SqlMaskingUtils() var orgContactSubselect = newSelect("orgContact.CONTACTID") @@ -601,11 +600,13 @@ ContactUtils.getActiveCommRestrictionsSubselect = function() var subselect = "''"; if(group) { - var res = newSelect(group).from("COMMRESTRICTION") - .where("COMMRESTRICTION.CONTACT_ID = CONTACT.CONTACTID") + var res = newSelect(group).from("COMMUNICATIONSETTINGS") + .where("COMMUNICATIONSETTINGS.CONTACT_ID = CONTACT.CONTACTID") + .and("COMMUNICATIONSETTINGS.STATUS", $KeywordRegistry.communicationSettingStatus$rejected()) - var subres = newSelect(group).from("COMMRESTRICTION") - .where("COMMRESTRICTION.CONTACT_ID in ( "+orgContactSubselect.toString()+")") + var subres = newSelect(group).from("COMMUNICATIONSETTINGS") + .where("COMMUNICATIONSETTINGS.CONTACT_ID in ( "+orgContactSubselect.toString()+")") + .and("COMMUNICATIONSETTINGS.STATUS", $KeywordRegistry.communicationSettingStatus$rejected()) subselect = mask.concatWithSeparator(["("+res.toString()+")", "("+subres.toString()+")"], ", ", false); } diff --git a/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod b/process/DSGVOAnonymize_serverProcess/DSGVOAnonymize_serverProcess.aod similarity index 70% rename from process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod rename to process/DSGVOAnonymize_serverProcess/DSGVOAnonymize_serverProcess.aod index 11432054cc7356358ef25e9d7b657ca5973bba2f..0469b8849190b5290f93637119386f35f63cb99e 100644 --- a/process/RebuildAllDuplicateCaches_serverProcess/RebuildAllDuplicateCaches_serverProcess.aod +++ b/process/DSGVOAnonymize_serverProcess/DSGVOAnonymize_serverProcess.aod @@ -1,8 +1,9 @@ <?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>RebuildAllDuplicateCaches_serverProcess</name> + <name>DSGVOAnonymize_serverProcess</name> <majorModelMode>DISTRIBUTED</majorModelMode> - <process>%aditoprj%/process/RebuildAllDuplicateCaches_serverProcess/process.js</process> + <process>%aditoprj%/process/DSGVOAnonymize_serverProcess/process.js</process> + <alias>Data_alias</alias> <variants> <element>EXECUTABLE</element> </variants> diff --git a/process/DSGVOAnonymize_serverProcess/process.js b/process/DSGVOAnonymize_serverProcess/process.js new file mode 100644 index 0000000000000000000000000000000000000000..221517b85f56be78e1b67e270f4a1b8a75188f45 --- /dev/null +++ b/process/DSGVOAnonymize_serverProcess/process.js @@ -0,0 +1,219 @@ +import("system.SQLTYPES"); +import("system.logging"); +import("Sql_lib"); +import("system.datetime"); +import("system.db"); +import("KeywordRegistry_basic"); +import("Keyword_lib"); + +/* +Notice: The commented Code can be used for some Customers who don't want to delete all Activities of a Person. Only those who no longer have a Link. +*/ + +var contactIds = [[]]; +var personIds = [[]]; +var loghistoryTabelsContact = ["CONTACT", "COMMUNICATION", "ADDRESS", "AB_ATTRIBUTERELATION"]; +var loghistoryTabelsPerson = ["PERSON"]; +var loghistoryTabelsActivity = ["ACTIVITY", "AB_ATTRIBUTERELATION"]; +var today = datetime.date(); +var anonymizeString = "*****"; +var user = "System"; +var delayDays = parseInt(new KeywordAttribute($KeywordRegistry.dsgvoConfiguration(), "Delete Delay in Days", "7") + .getValue($KeywordRegistry.dsgvoConfiguration$config())); +var statements = []; +var statementsAudit = []; +var statementsSys = []; +var indexIdsArray = 0; +var splitLength = 1000; + +var setFlagDate = today - datetime.ONE_DAY * delayDays; + +logging.log("start anonymization"); + +let contacts = newSelect(["CONTACT.CONTACTID", "CONTACT.PERSON_ID"]) +.from("CONTACT") +.join("DSGVODELETEFLAG","CONTACT.CONTACTID = DSGVODELETEFLAG.CONTACT_ID") +.where("CONTACT.STATUS", $KeywordRegistry.contactStatus$markToDelete()) +.and("DSGVODELETEFLAG.DATE_NEW",setFlagDate,SqlBuilder.LESS_OR_EQUAL()) +.groupBy(["CONTACT.CONTACTID", "CONTACT.PERSON_ID"]) +.table(true, db.DB_EOF, 600000); + +logging.log(contacts.length + " persons to anonymize"); + +if (contacts.length > 0) +{ + contacts.forEach(function([pContactId, pPersonId]) + { + if (contactIds[indexIdsArray].length == splitLength) + { + contactIds.push([]); + personIds.push([]); + indexIdsArray++; + } + contactIds[indexIdsArray].push(pContactId); + personIds[indexIdsArray].push(pPersonId); + + let collapsedActivityIds = []; + let activityIds = newSelect(["ACTIVITYLINK.ACTIVITY_ID"]) + .from("ACTIVITYLINK") + .where("ACTIVITYLINK.OBJECT_ROWID", pContactId) + .and("ACTIVITYLINK.OBJECT_TYPE", "Person") + /*.and( + newSelect("count(*)") + .from("ACTIVITYLINK", "AL") + .where("AL.ACTIVITY_ID = ACTIVITYLINK.ACTIVITY_ID"), 1, SqlBuilder.EQUAL(), SQLTYPES.INTEGER)*/ + .arrayColumn(); + + do { + collapsedActivityIds.push(activityIds.splice(0, splitLength)); + } while (activityIds.length > 0) + + collapsedActivityIds.forEach(function (pActivityIds) + { + if (pActivityIds.length > 0) + { + // ------------------------------------------------------------------------------------------------------------------------ + // DELETE: ACTIVITYLINK, ACTIVITY and all relations + + statements.push(newWhere("ACTIVITYLINK.ACTIVITY_ID", pActivityIds, SqlBuilder.IN()) + /*.or(newWhere("ACTIVITYLINK.OBJECT_ROWID", pContactId) + .and("ACTIVITYLINK.OBJECT_TYPE", "Person"))*/ + .buildDeleteStatement(true, "ACTIVITYLINK")); + + statements.push(newWhere("ACTIVITY.ACTIVITYID", pActivityIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "ACTIVITY")); + + statementsSys.push(new SqlBuilder(SqlUtils.getBinariesAlias()) + .where("ASYS_BINARIES.ROW_ID", pActivityIds, SqlBuilder.IN(), null) + .buildDeleteStatement(true, "ASYS_BINARIES")); + + statements.push(newWhere("AB_ATTRIBUTERELATION.OBJECT_ROWID", pActivityIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_ATTRIBUTERELATION")); + + statements.push(newWhere("AB_LOGHISTORY.TABLENAMEID", pActivityIds, SqlBuilder.IN()) + .and("AB_LOGHISTORY.TABLENAME", loghistoryTabelsActivity, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_LOGHISTORY")); + } + }); + + let collapsedTaskIds = []; + let taskIds = newSelect(["TASKLINK.TASK_ID"]) + .from("TASKLINK") + .where("TASKLINK.OBJECT_ROWID", pContactId) + .and("TASKLINK.OBJECT_TYPE", "Person") + /*.and( + newSelect("count(*)") + .from("TASKLINK", "TL") + .where("TL.TASK_ID = TASKLINK.TASK_ID"), 1, SqlBuilder.EQUAL(), SQLTYPES.INTEGER)*/ + .arrayColumn(); + + do { + collapsedTaskIds.push(taskIds.splice(0, splitLength)); + } while (taskIds.length > 0) + + collapsedTaskIds.forEach(function (pTaskIds) + { + if (pTaskIds.length > 0) + { + // ------------------------------------------------------------------------------------------------------------------------ + // DELETE: TASKLINK, TASK and all relations + + statements.push(newWhere("TASKLINK.TASK_ID", pTaskIds, SqlBuilder.IN()) + /*.or(newWhere("TASKLINK.OBJECT_ROWID", pContactId) + .and("TASKLINK.OBJECT_TYPE", "Person"))*/ + .buildDeleteStatement(true, "TASKLINK")); + + statements.push(newWhere("TASK.TASKID", pTaskIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "TASK")); + + statementsSys.push(new SqlBuilder(SqlUtils.getBinariesAlias()) + .where("ASYS_BINARIES.ROW_ID", pTaskIds, SqlBuilder.IN(), null) + .buildDeleteStatement(true, "ASYS_BINARIES")); + + statements.push(newWhere("AB_LOGHISTORY.TABLENAMEID", pTaskIds, SqlBuilder.IN()) + .and("AB_LOGHISTORY.TABLENAME", "TASK", SqlBuilder.EQUAL()) + .buildDeleteStatement(true, "AB_LOGHISTORY")); + } + }); + + + // ------------------------------------------------------------------------------------------------------------------------ + // Insert: AB_LOGHISTORY + + statements.push(new SqlBuilder() + .buildInsertStatement({ + "USER_NEW" : user, + "DATE_NEW" : today, + "DESCRIPTION" : "Kontakt anonymisiert.", + "LOGTYPE": "U" , + "TABLENAME" : "DSGVO", + "TABLENAMEID" : pContactId + }, "AB_LOGHISTORY", "AB_LOGHISTORYID")); + }); + + for (let index = 0; index <= indexIdsArray; index++) + { + let tempContactIds = contactIds[index]; + let tempPersonIds = personIds[index]; + + // ------------------------------------------------------------------------------------------------------------------------ + // Update: CONTACT, PERSON + + statementsAudit.push(newWhere("CONTACT.CONTACTID", tempContactIds, SqlBuilder.IN()) + .buildUpdateStatement({ + "USER_EDIT" : user, + "DATE_EDIT" : today, + "ADDRESS_ID" : null, + "STATUS" : $KeywordRegistry.contactStatus$inactive() + }, "CONTACT")); + + statements.push(newWhere("PERSON.PERSONID", tempPersonIds, SqlBuilder.IN()) + .buildUpdateStatement({ + "USER_EDIT" : user, + "DATE_EDIT" : today, + "FIRSTNAME" : anonymizeString, + "LASTNAME": anonymizeString + }, "PERSON")); + + // ------------------------------------------------------------------------------------------------------------------------ + // DELETE: ADDRESS, ASYS_BINARIES, COMMUNICATION, AB_ATTRIBUTERELATION, AB_LOGHISTORY, AB_OBJECTRELATION, AB_APPOINTMENTLINK + + statements.push(newWhere("ADDRESS.CONTACT_ID", tempContactIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "ADDRESS")); + + statements.push(newWhere("COMMUNICATION.CONTACT_ID", tempContactIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "COMMUNICATION")); + + statements.push(newWhere("AB_ATTRIBUTERELATION.OBJECT_ROWID", tempContactIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_ATTRIBUTERELATION")); + + statementsSys.push(new SqlBuilder(SqlUtils.getBinariesAlias()) + .where("ASYS_BINARIES.ROW_ID", tempContactIds, SqlBuilder.IN(), null) + .buildDeleteStatement(true, "ASYS_BINARIES")); + + statements.push(newWhere("AB_OBJECTRELATION.OBJECT1_ROWID", tempContactIds, SqlBuilder.IN()) + .or("AB_OBJECTRELATION.OBJECT2_ROWID", tempContactIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_OBJECTRELATION")); + + statements.push(newWhere("AB_OBJECTRELATION.OBJECT1_ROWID", tempPersonIds, SqlBuilder.IN()) + .or("AB_OBJECTRELATION.OBJECT2_ROWID", tempPersonIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_OBJECTRELATION")); + + statements.push(newWhere("AB_APPOINTMENTLINK.OBJECT_ROWID", tempContactIds, SqlBuilder.IN()) + .or("AB_APPOINTMENTLINK.OBJECT_ROWID", tempPersonIds, SqlBuilder.IN()) + .buildDeleteStatement(true, "AB_APPOINTMENTLINK")); + + statements.push(newWhere( + newWhere("AB_LOGHISTORY.TABLENAMEID", tempContactIds, SqlBuilder.IN()) + .and("AB_LOGHISTORY.TABLENAME", loghistoryTabelsContact, SqlBuilder.IN())) + .or(newWhere("AB_LOGHISTORY.TABLENAMEID", tempPersonIds, SqlBuilder.IN()) + .and("AB_LOGHISTORY.TABLENAME", loghistoryTabelsPerson, SqlBuilder.IN())) + .buildDeleteStatement(true, "AB_LOGHISTORY")); + } + + db.execute(statements, "Data_alias_noAudit", 10000000); + db.execute(statementsAudit, "Data_alias", 10000000); + db.execute(statementsSys, SqlUtils.getBinariesAlias(), 10000000); +} + +logging.log("end anonymization"); \ No newline at end of file diff --git a/process/DSGVOSetDeleteFlags_serverProcess/DSGVOSetDeleteFlags_serverProcess.aod b/process/DSGVOSetDeleteFlags_serverProcess/DSGVOSetDeleteFlags_serverProcess.aod new file mode 100644 index 0000000000000000000000000000000000000000..767a329542f6a14ad4248ae4623fb1cff2340d46 --- /dev/null +++ b/process/DSGVOSetDeleteFlags_serverProcess/DSGVOSetDeleteFlags_serverProcess.aod @@ -0,0 +1,11 @@ +<?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>DSGVOSetDeleteFlags_serverProcess</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/DSGVOSetDeleteFlags_serverProcess/process.js</process> + <restrictedRoles /> + <alias>Data_alias</alias> + <variants> + <element>EXECUTABLE</element> + </variants> +</process> diff --git a/process/DSGVOSetDeleteFlags_serverProcess/process.js b/process/DSGVOSetDeleteFlags_serverProcess/process.js new file mode 100644 index 0000000000000000000000000000000000000000..5f21ca346a912979b2b49f04157ac62430c7e29b --- /dev/null +++ b/process/DSGVOSetDeleteFlags_serverProcess/process.js @@ -0,0 +1,140 @@ +import("system.db"); +import("system.neon"); +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.util"); +import("system.entities"); +import("Sql_lib"); +import("system.tools"); +import("system.SQLTYPES"); +import("Util_lib"); + +let selection = JSON.parse(vars.get("$local.tableSelection")); +var statements = []; + +if (vars.get("$local.deleteFlags") == "true") +{ + let reasons = newSelect(["DSGVOCONFIGURATION.REASON"]) + .from("DSGVOCONFIGURATION") + .whereIfSet("DSGVOCONFIGURATION.DSGVOCONFIGURATIONID", selection, SqlBuilder.IN()) + .arrayColumn(); + + newWhereIfSet("CONTACT.STATUS", $KeywordRegistry.contactStatus$markToDelete()) + .and("CONTACT.CONTACTID", + newSelect("DSGVODELETEFLAG.CONTACT_ID") + .from("DSGVODELETEFLAG") + .where("DSGVODELETEFLAG.REASON", $KeywordRegistry.dsgvoReason$manuel(), SqlBuilder.NOT_EQUAL()) + .andIfSet("DSGVODELETEFLAG.REASON", reasons, SqlBuilder.IN()), + SqlBuilder.IN()) + .updateData(true, "CONTACT", ["STATUS"], null, [$KeywordRegistry.contactStatus$active()]); + + newWhereIfSet("DSGVODELETEFLAG.REASON", $KeywordRegistry.dsgvoReason$manuel(), SqlBuilder.NOT_EQUAL()) + .andIfSet("DSGVODELETEFLAG.REASON", reasons, SqlBuilder.IN()) + .deleteData(true, "DSGVODELETEFLAG"); +} + +let contactIdsToMark = [[]]; +var contactIdsToMarkIndex = 0; + +let configIndexes = { + "FILTER" : 0, + "REASON" : 1 +} + +let configurations = newSelect(["DSGVOCONFIGURATION.FILTER", "DSGVOCONFIGURATION.REASON"]) +.from("DSGVOCONFIGURATION") +.whereIfSet("DSGVOCONFIGURATION.DSGVOCONFIGURATIONID", selection, SqlBuilder.IN()) +.table(); + +configurations.forEach(_getTheObjectsToTheFilter); + +contactIdsToMark.forEach(function (pContactIds) +{ + if (!Utils.isNullOrEmpty(pContactIds)) + { + statements.push(newWhereIfSet("CONTACT.CONTACTID", pContactIds, SqlBuilder.IN()) + .buildUpdateStatement({ + "STATUS" : $KeywordRegistry.contactStatus$markToDelete() + }, "CONTACT")); + } +}); + + +db.execute(statements, "Data_alias", 10000000); + +function _getTheObjectsToTheFilter (pConfig) +{ + let excludedContactId = new Set(); + let filter = JSON.parse(pConfig[configIndexes.FILTER]); + + var config = entities.createConfigForLoadingRows() + .entity("Person_entity") + .ignorePermissions(true) + .filter(JSON.stringify(filter.filter)) + .fields(["#UID"]); + + let contactsToMark = [[]] + let index = 0; + + entities.getRows(config).forEach(function(e) + { + if (contactsToMark[index].length == 1000) + { + contactsToMark.push([]); + index++; + } + contactsToMark[index].push(e["#UID"]); + }); + + contactsToMark.forEach(function (pContactIds) + { + if (!Utils.isNullOrEmpty(pContactIds)) + { + pContactIds = newSelect("CONTACT.CONTACTID") + .from("CONTACT") + .where( + newSelect("COUNT(*)") + .from("CONTACT", "C") + .where("C.PERSON_ID = CONTACT.PERSON_ID"), 1, SqlBuilder.EQUAL(), SQLTYPES.INTEGER) + .and( + newSelect("COUNT(*)") + .from("DSGVODELETEFLAG") + .where("DSGVODELETEFLAG.REASON", pConfig[configIndexes.REASON]) + .and("DSGVODELETEFLAG.CONTACT_ID = CONTACT.CONTACTID"), 0, SqlBuilder.EQUAL(), SQLTYPES.INTEGER) + .and("CONTACT.CONTACTID", pContactIds, SqlBuilder.IN()) + .arrayColumn(); + + var users = tools.getUsersByAttribute(tools.CONTACTID, pContactIds, tools.PROFILE_DEFAULT); + users.forEach(function (user){ + excludedContactId.add(user[tools.PARAMS][tools.CONTACTID]) + }); + + pContactIds.forEach(_insertDeleteFlags,{ + "reason": pConfig[configIndexes.REASON], + "excludedContactId": excludedContactId + }); + } + }); +} + +function _insertDeleteFlags (pContactId) +{ + if (!this.excludedContactId.has(pContactId)) + { + statements.push(new SqlBuilder().buildInsertStatement({ + "DSGVODELETEFLAGID": util.getNewUUID(), + "REASON": this.reason, + "CONTACT_ID" : pContactId, + "USER_NEW": vars.get("$sys.user"), + "DATE_NEW": vars.get("$sys.date") + }, "DSGVODELETEFLAG")); + + if (contactIdsToMark[contactIdsToMarkIndex].length == 1000) + { + contactIdsToMark.push([]); + contactIdsToMarkIndex++; + } + + contactIdsToMark[contactIdsToMarkIndex].push(pContactId); + } +} \ No newline at end of file diff --git a/process/DataPrivacy_lib/process.js b/process/DataPrivacy_lib/process.js index 4eeff329bdde5132e17ae5e101d8aff4e52f7303..c7c004a2ce7c76c8cf6a21c65df3086058e5bd14 100644 --- a/process/DataPrivacy_lib/process.js +++ b/process/DataPrivacy_lib/process.js @@ -76,10 +76,11 @@ DataPrivacyType.get = function(pKey) TYPE_BIRTH: new DataPrivacyType("TYPE_BIRTH", _getBirthday, true), TYPE_ADDRESS: new DataPrivacyType("TYPE_ADDRESS", _getAddress), TYPE_COMM: new DataPrivacyType("TYPE_COMM", _getCommunication), - TYPE_ATTR: new DataPrivacyType("TYPE_ATTR", _getAttribute) - // Picture also? - // Gender also? - // Orgs of the person also? + TYPE_ATTR: new DataPrivacyType("TYPE_ATTR", _getAttribute), + TYPE_PRIVACY_NOTICE: new DataPrivacyType("TYPE_PRIVACY_NOTICE", _getDSGVODocument) + // Picture also? + // Gender also? + // Orgs of the person also? } if (pKey) @@ -105,10 +106,10 @@ DataPrivacyType.get = function(pKey) pContactId = pContactIdSaved; var entityConfig = entities.createConfigForLoadingRows() - .entity("Person_entity") - .provider("Contact") - .uid(pContactId) - .fields(pFields); + .entity("Person_entity") + .provider("Contact") + .uid(pContactId) + .fields(pFields); return entities.getRow(entityConfig); } @@ -199,8 +200,8 @@ DataPrivacyType.get = function(pKey) { // TODO: update and fix Address_lib and use it (and remove format-functions in PostalAddress_lib) var entityConfig = entities.createConfigForLoadingRows() - .entity("Address_entity") - .fields(["ADDRESSID", "ADDRESS", "ADDRESSADDITION", "ADDRIDENTIFIER", "BUILDINGNO", "ZIP", "CITY", "COUNTRY", "DISTRICT", "PROVINCE"]); + .entity("Address_entity") + .fields(["ADDRESSID", "ADDRESS", "ADDRESSADDITION", "ADDRIDENTIFIER", "BUILDINGNO", "ZIP", "CITY", "COUNTRY", "DISTRICT", "PROVINCE"]); if (pAddressId) { @@ -209,7 +210,7 @@ DataPrivacyType.get = function(pKey) else { entityConfig.provider("ContactAddresses") - .addParameter("ContactId_param", pContactId); + .addParameter("ContactId_param", pContactId); } @@ -236,8 +237,8 @@ DataPrivacyType.get = function(pKey) function _getCommunication(pContactId, pCommunicationId) { var entityConfig = entities.createConfigForLoadingRows() - .entity("Communication_entity") - .fields(["COMMUNICATIONID", "ADDR"]); + .entity("Communication_entity") + .fields(["COMMUNICATIONID", "ADDR"]); if (pCommunicationId) { @@ -246,7 +247,7 @@ DataPrivacyType.get = function(pKey) else { entityConfig.provider("AllCommunications") - .addParameter("ContactId_param", pContactId); + .addParameter("ContactId_param", pContactId); } return entities.getRows(entityConfig).map(function(pComm) @@ -272,10 +273,10 @@ DataPrivacyType.get = function(pKey) if (pContactId) { var attributeQuery = new AttributeRelationQuery() - .objectRowId(pContactId) - .objectType("Person") - .includeDisplayValue() - .includeFullAttributeName(); + .objectRowId(pContactId) + .objectType("Person") + .includeDisplayValue() + .includeFullAttributeName(); if (pAttributeId) attributeQuery.attributeId(pAttributeId); @@ -289,8 +290,44 @@ DataPrivacyType.get = function(pKey) value: pAttr.fullAttributeName + ": " + pAttr.displayValue, id: pAttr.attributeId } + }) + .filter(function (pAttr) + { + return newSelect("COUNT(*)") + .from("AB_ATTRIBUTEUSAGE") + .where("AB_ATTRIBUTEUSAGE.OBJECT_TYPE", "DSGVO") + .and("AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID", pAttr.id).cell() != "0" }); } + + /** + * Callback function to get the + * + * @param {String} pContactId + * @param {String} [pContactIdSaved=undefined] + * + * @return {Object[]} + */ + function _getDSGVODocument(pContactId, pContactIdSaved) + { + // Todo Format or set content dsgvotypepAssignmentRowId + var count = db.getBinaryCount("CONTACT", "DOCUMENT", pContactIdSaved || pContactId, SqlUtils.getBinariesAlias(), "PRIVACY_NOTICE") + + if (count > 0) + { + return [{ + value: translate.text("consent"), + id: pContactId + }]; + } + else + { + return [{ + value: translate.text("consent pending"), + id: pContactId + }]; + } + } } /** @@ -312,22 +349,22 @@ function DataPrivacyUtils() {} DataPrivacyUtils.getDSGVO = function(pContactId, pFilterCond) { return newSelect("DSGVOID," + // 0 - "CONTACT_ID," + // 1 - "DSGVOTYPE," + // 2 - "ROW_ID," + // 3 - "''," + // 4 - dummy for value - "STATUORITYSOURCE," + // 5 - "PURPOSE," + // 6 - "VALID_TO," + // 7 - "DATE_NEW," + // 8 - "DATE_EDIT," + // 9 - "USER_NEW," + // 10 - "USER_EDIT, " + // 11 - KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.dsgvoType(), "DSGVOTYPE")) // 12 - dsgvotype-displayvalue) - .from("DSGVO") - .where("DSGVO.CONTACT_ID", pContactId) - .andIfSet(pFilterCond) - .table(); + "CONTACT_ID," + // 1 + "DSGVOTYPE," + // 2 + "ROW_ID," + // 3 + "''," + // 4 - dummy for value + "STATUORITYSOURCE," + // 5 + "PURPOSE," + // 6 + "VALID_TO," + // 7 + "DATE_NEW," + // 8 + "DATE_EDIT," + // 9 + "USER_NEW," + // 10 + "USER_EDIT, " + // 11 + KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.dsgvoType(), "DSGVOTYPE")) // 12 - dsgvotype-displayvalue) + .from("DSGVO") + .where("DSGVO.CONTACT_ID", pContactId) + .andIfSet(pFilterCond) + .table(); } /** @@ -390,9 +427,9 @@ DataPrivacyUtils.collectAll = function(pContactId, pFilterCond) var newId = util.getNewUUID(); // insert inserts.push(["DSGVO", - ["DSGVOID", "USER_NEW", "DATE_NEW", "DSGVOTYPE", "ROW_ID", "CONTACT_ID"], - null, - [newId, currentUser, now, dsgvotype.key, pRow.id, pContactId]]); + ["DSGVOID", "USER_NEW", "DATE_NEW", "DSGVOTYPE", "ROW_ID", "CONTACT_ID"], + null, + [newId, currentUser, now, dsgvotype.key, pRow.id, pContactId]]); // and also insert it in the return data to avoid selecting from DSGVO again returnDSGVOData.push([ @@ -409,7 +446,7 @@ DataPrivacyUtils.collectAll = function(pContactId, pFilterCond) currentUser, // "USER_NEW," + // 10 "", // "USER_EDIT " // 11 KeywordUtils.getViewValue($KeywordRegistry.dsgvoType(), dsgvotype.key), // 12 - ]) + ]) } }); } @@ -472,13 +509,13 @@ DataPrivacyUtils.notifyNeedDataPrivacyUpdate = function(pContactId, pShowMessage DataPrivacyUtils.checkAllFilled = function(pContactId) { var countNotFilled = newSelect("count(*)") - .from("DSGVO") - .where("DSGVO.CONTACT_ID", pContactId) - .and(newWhere() - .or("STATUORITYSOURCE is null") - .or("PURPOSE is null") - .or("VALID_TO is null")) - .cell(); + .from("DSGVO") + .where("DSGVO.CONTACT_ID", pContactId) + .and(newWhere() + .or("STATUORITYSOURCE is null") + .or("PURPOSE is null") + .or("VALID_TO is null")) + .cell(); return countNotFilled == "0"; } @@ -497,20 +534,20 @@ DataPrivacyUtils.dataForExport = function(pContactId, pLocale) var fields = ["DSGVOTYPE", "VALUE", "STATUORITYSOURCE", "PURPOSE", "VALID_TO"]; var config = entities.createConfigForLoadingRows() - .entity(entity) - .provider("DSGVOEntries") - .addParameter("ContactId_param", pContactId) - .fields(fields) + .entity(entity) + .provider("DSGVOEntries") + .addParameter("ContactId_param", pContactId) + .fields(fields) return [fields, entities.getRows(config).map(function(pRow) { var dsgvotype = DataPrivacyType.get(pRow.DSGVOTYPE); var newRow = [ - KeywordUtils.getViewValue($KeywordRegistry.dsgvoType(), pRow.DSGVOTYPE, pLocale), - (dsgvotype.formatAsDate ? datetime.toDate(pRow.VALUE, translate.text("dd.MM.yyyy", pLocale), "UTC") : pRow.VALUE), - KeywordUtils.getViewValue($KeywordRegistry.dsgvoStatuoritysource(), pRow.STATUORITYSOURCE, pLocale), - KeywordUtils.getViewValue($KeywordRegistry.dsgvoPurpose(), pRow.PURPOSE, pLocale), - datetime.toDate(pRow.VALID_TO, translate.text("dd.MM.yyyy", pLocale), "UTC"), + KeywordUtils.getViewValue($KeywordRegistry.dsgvoType(), pRow.DSGVOTYPE, pLocale), + (dsgvotype.formatAsDate ? datetime.toDate(pRow.VALUE, translate.text("dd.MM.yyyy", pLocale), "UTC") : pRow.VALUE), + KeywordUtils.getViewValue($KeywordRegistry.dsgvoStatuoritysource(), pRow.STATUORITYSOURCE, pLocale), + KeywordUtils.getViewValue($KeywordRegistry.dsgvoPurpose(), pRow.PURPOSE, pLocale), + datetime.toDate(pRow.VALID_TO, translate.text("dd.MM.yyyy", pLocale), "UTC"), ]; return newRow; @@ -533,7 +570,7 @@ DataPrivacyUtils.downloadCSV = function(pContactId, pLocale) var csvTable = text.toCSV(data, "\r\n", ";", '"'); - neon.download(util.encodeBase64String(csvTable), "data_pricacy.csv"); + neon.download(util.encodeBase64String(csvTable), "data_privacy.csv"); } /** @@ -587,9 +624,9 @@ DataPrivacyUtils.buildReport = function (pContactId, pReportName, pDSGVOInfo, pL { // load recipient // TODO: evtl. put this load entity into lib and use it in all display value processes var recipientConfig = entities.createConfigForLoadingRows() - .entity("AnyContact_entity") - .uid(pDSGVOInfo.recipient) - .fields(["#CONTENTTITLE"]) + .entity("AnyContact_entity") + .uid(pDSGVOInfo.recipient) + .fields(["#CONTENTTITLE"]) pDSGVOInfo.recipient = entities.getRow(recipientConfig)["#CONTENTTITLE"]; @@ -600,7 +637,7 @@ DataPrivacyUtils.buildReport = function (pContactId, pReportName, pDSGVOInfo, pL pDSGVOInfo.garantees = KeywordUtils.getViewValue($KeywordRegistry.dsgvoGuarantee(), pDSGVOInfo.garantees, pLocale), transmission += "\n" + translate.text("The transfer of data to recipients located in a third country is based on the following guarantees:", pLocale) - + "\n" + pDSGVOInfo.garantees; + + "\n" + pDSGVOInfo.garantees; } } @@ -610,9 +647,9 @@ DataPrivacyUtils.buildReport = function (pContactId, pReportName, pDSGVOInfo, pL { // load recipient // TODO: evtl. put this load entity into lib and use it in all display value processes var datasourceConfig = entities.createConfigForLoadingRows() - .entity("AnyContact_entity") - .uid(pDSGVOInfo.datasource) - .fields(["#CONTENTTITLE"]) + .entity("AnyContact_entity") + .uid(pDSGVOInfo.datasource) + .fields(["#CONTENTTITLE"]) pDSGVOInfo.datasource = entities.getRow(datasourceConfig)["#CONTENTTITLE"]; @@ -627,16 +664,16 @@ DataPrivacyUtils.buildReport = function (pContactId, pReportName, pDSGVOInfo, pL { deadline = translate.withArguments("As stated in our letter of %0, we have made use of the possibility to extend the deadline to three months due to %1.", [datetime.toDate(pDSGVOInfo.deadlineDate, translate.text("dd.MM.yyyy", pLocale)), - (pDSGVOInfo.deadline == $KeywordRegistry.dsgvoDeadline$complex() ? translate.text("the high complexity of your application", pLocale) + (pDSGVOInfo.deadline == $KeywordRegistry.dsgvoDeadline$complex() ? translate.text("the high complexity of your application", pLocale) : - (pDSGVOInfo.deadline == $KeywordRegistry.dsgvoDeadline$count() ? translate.text("the number of your applications", pLocale) : "")) + (pDSGVOInfo.deadline == $KeywordRegistry.dsgvoDeadline$count() ? translate.text("the number of your applications", pLocale) : "")) ], pLocale) } var saveTill = datetime.toDate(newSelect("max(VALID_TO)") - .from("DSGVO") - .where("DSGVO.CONTACT_ID", pContactId) - .cell()); + .from("DSGVO") + .where("DSGVO.CONTACT_ID", pContactId) + .cell()); saveTill = translate.text("We save your data until ", pLocale) + saveTill + "."; var addrObject = new AddrObject(pContactId); @@ -648,8 +685,8 @@ DataPrivacyUtils.buildReport = function (pContactId, pReportName, pDSGVOInfo, pL if (fakeDataProtectionOfficerAddr.indexOf("Err.") != -1) { - fakeDataProtectionOfficerAddr = -"Herr Max Mustermann\n\ + fakeDataProtectionOfficerAddr = + "Herr Max Mustermann\n\ Musterstr. 3\n\ 12345 Musterstadt\n\ Muster-Datenschutzberatung"; diff --git a/process/DocumentTemplate_lib/process.js b/process/DocumentTemplate_lib/process.js index 5fef12bb28f9133080c716a9f542a528103792ec..2d2c94f233ccfac4d99840b457f803de64259134 100644 --- a/process/DocumentTemplate_lib/process.js +++ b/process/DocumentTemplate_lib/process.js @@ -555,7 +555,7 @@ DocumentTemplate.prototype.getReplacedEmailsByContactIds = function (pContactIds var emailObjects = {}; var isEML = this.type == DocumentTemplate.types.EML; this.setOptions({base64 : isEML}); - var emailContents = this.getReplacedContentByContactIds(pContactIds, pAdditionalPlaceholders); + var emailContents = this.getReplacedContentByContactIds(pContactIds, PlaceholderUtils.getLinkPlaceholders()); for (let contactId in emailContents) { diff --git a/process/Document_lib/process.js b/process/Document_lib/process.js index 6085c3f5eec1ff9f9c1954bfd29b490188c27751..ee264f730e597f0c4b8c305e11ad71a32d49e0f4 100644 --- a/process/Document_lib/process.js +++ b/process/Document_lib/process.js @@ -5,6 +5,7 @@ import("system.db"); import("system.vars"); import("system.neon"); import("Sql_lib"); +import("MimeType_lib"); /** * Provides static methods for managing documents. @@ -43,6 +44,52 @@ DocumentUtil.downloadSelectedDocuments = function(pAssignmentName) { } } +/** + * Utility function to open a selected document. + * Selected document will be checked with $sys.selectionRows + * Document will be opened with neon.open + * @param {String} pAssignmentName (optional) the name of the assignment, used to modify the filename + * + */ +DocumentUtil.openSelectedDocument = function(pAssignmentName) +{ + var alias = SqlUtils.getBinariesAlias(); + + if(vars.exists("$sys.selectionRows") && vars.getString("$sys.selectionRows")) + { + var rows = vars.get("$sys.selectionRows"); + var uids = vars.get("$sys.selection"); + var binaryContents = db.getBinaryContents(uids, alias); + + if(binaryContents.length == 1) + { + if(pAssignmentName == "ERRORLOG") + neon.openFile(binaryContents[0], rows[0]["NAME"] + ".txt", rows[0]["TYPE"], false); + else + neon.openFile(binaryContents[0], rows[0]["NAME"], rows[0]["TYPE"], false); + } + } +} + +/** + * Checks if the mimetype can be opened. + */ +DocumentUtil.canOpenSelectedDocument = function() +{ + if(vars.exists("$sys.selectionRows") && vars.getString("$sys.selectionRows")) + { + var rows = vars.get("$sys.selectionRows"); + var uids = vars.get("$sys.selection"); + + if(uids.length == 1) + { + return MimeTypes.canOpenMimeTypeInBrowser(rows[0]["TYPE"]); + } + } + + return false; +} + /** * Utility function to delete the current/opened Document. */ diff --git a/process/DuplicateMerge_lib/DuplicateMerge_lib.aod b/process/DuplicateMerge_lib/DuplicateMerge_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..bc0eb0235229e83f6e13f3215fd29f3dcb46bc1a --- /dev/null +++ b/process/DuplicateMerge_lib/DuplicateMerge_lib.aod @@ -0,0 +1,9 @@ +<?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>DuplicateMerge_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/DuplicateMerge_lib/process.js</process> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/DuplicateMerge_lib/process.js b/process/DuplicateMerge_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..5b83ce3f225e20ebee0e6ca40ff7bc859dea99b3 --- /dev/null +++ b/process/DuplicateMerge_lib/process.js @@ -0,0 +1,368 @@ +import("Communication_lib"); +import("Sql_lib"); +import("system.db"); +import("ActivityTask_lib"); +import("KeywordRegistry_basic"); +import("system.translate"); +import("DuplicateScanner_lib"); + +/** + * Methods for duplicate merging. + * Do not create an instance of this! + * + * @class + */ +function DuplicateMergeUtils() {} + +/* + * + * Merges the source person into the target person. + * This + * - replaces the source's with the target's contactid in a predefined set of tables. + * - resets the standard communications of the source contact and keeps the ones of the target. + * - updates participants of campaigns and removes obsolet ones(which would be duplicates) + * - deletes the source person and contact + * - deletes the duplicate record, if one exists + * - deletes all unrelated-duplicate-relations containing the source contact id + * + * @param {String} pSourceContactId The contact to be integrated into another + * @param {String} pTargetContactId The contact in which the source gets integrated + * @returns {Boolean} if the merge was sucessful + */ +DuplicateMergeUtils.mergePerson = function(pSourceContactId, pTargetContactId) +{ + var sourcePersonId = newSelect("PERSON_ID") + .from("CONTACT") + .where("CONTACT.CONTACTID", pSourceContactId) + .cell(); + var targetPersonId = newSelect("PERSON_ID") + .from("CONTACT") + .where("CONTACT.CONTACTID", pTargetContactId) + .cell(); + + DuplicateMergeUtils._deleteUniqueAttributes(pSourceContactId, pTargetContactId); + var isLinkedDataUpdated = DuplicateMergeUtils._migrateLinkedContactData(pSourceContactId, pTargetContactId); + var isParticipantsUpdated = DuplicateMergeUtils._migrateParticipantsToNewContact("CAMPAIGNPARTICIPANT", "CONTACT_ID", "CAMPAIGN_ID", + pSourceContactId, pTargetContactId); + DuplicateMergeUtils._updateOtherContacts(pSourceContactId, sourcePersonId, targetPersonId); + + var deleteStatements = []; + if (sourcePersonId != targetPersonId) + { + deleteStatements.push(newWhere("PERSON.PERSONID", sourcePersonId).buildDeleteStatement()); + } + + deleteStatements.push(newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement()); + deleteStatements = deleteStatements.concat(DuplicateMergeUtils._buildDeleteCachedUnrelatedDuplicateQuery(pSourceContactId)); + + //update binary + var metaData = db.getBinaryMetadata("CONTACT", "DOCUMENT", pSourceContactId, true, SqlUtils.getBinariesAlias()); + metaData.forEach(function (binaryMetaData) + { + db.updateBinaryAssignment(binaryMetaData.id, "CONTACT", "DOCUMENT", pTargetContactId, SqlUtils.getBinariesAlias()); + }); + var deletedRows = db.deletes(deleteStatements) + + DuplicateScannerUtils.deleteHasDuplicateEntries("Person_entity", [pSourceContactId, pTargetContactId]); + var dupIds = DuplicateScannerUtils.getDuplicateIdsByEntityScanner("Person_entity", pTargetContactId); + if(dupIds.length > 0) + { + DuplicateScannerUtils.insertHasDuplicateEntry("Person_entity", pTargetContactId, dupIds.length); + } + + return isLinkedDataUpdated || isParticipantsUpdated || deletedRows > 0; +} + +DuplicateMergeUtils.mergeOrganisation = function(pSourceContactId, pTargetContactId) +{ + var sourceOrganisationId = newSelect("ORGANISATION_ID") + .from("CONTACT") + .where("CONTACT.CONTACTID", pSourceContactId) + .cell(); + + var targetOrganisationId = newSelect("ORGANISATION_ID") + .from("CONTACT") + .where("CONTACT.CONTACTID", pTargetContactId) + .cell(); + + DuplicateMergeUtils._deleteUniqueAttributes(pSourceContactId, pTargetContactId); + DuplicateMergeUtils._migrateLinkedContactData(pSourceContactId, pTargetContactId); + DuplicateMergeUtils._migrateParticipantsToNewContact("CAMPAIGNPARTICIPANT", "CONTACT_ID", "CAMPAIGN_ID", + pSourceContactId, pTargetContactId); + DuplicateMergeUtils._migratePersonsToNewOrganisation(sourceOrganisationId, targetOrganisationId); + + var deleteStatements = []; + deleteStatements.push(newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement()); + deleteStatements = deleteStatements.concat(DuplicateMergeUtils._buildDeleteOrganisationAndContactQuery(sourceOrganisationId, pSourceContactId)); + deleteStatements = deleteStatements.concat(DuplicateMergeUtils._buildDeleteCachedUnrelatedDuplicateQuery(pSourceContactId)); + + //update binary + var metaData = db.getBinaryMetadata("CONTACT", "DOCUMENT", pSourceContactId, true, SqlUtils.getBinariesAlias()); + metaData.forEach(function (binaryMetaData) + { + db.updateBinaryAssignment(binaryMetaData.id, "CONTACT", "DOCUMENT", pTargetContactId, SqlUtils.getBinariesAlias()); + }); + var deletedRows = db.deletes(deleteStatements) + + DuplicateScannerUtils.deleteHasDuplicateEntries("Organisation_entity", [pSourceContactId, pTargetContactId]); + var dupIds = DuplicateScannerUtils.getDuplicateIdsByEntityScanner("Organisation_entity", pTargetContactId); + if(dupIds.length > 0) + { + DuplicateScannerUtils.insertHasDuplicateEntry("Organisation_entity", pTargetContactId, dupIds.length); + } + + return deletedRows >= 2; +} + +DuplicateMergeUtils.createMergeSuccessActivity = function(pSourceContactId, pTargetContactId, pCurrentContactId, pContext) +{ + var activityDataForInsert = { + subject: translate.withArguments("A %0 record has been merged", [pContext]), + content: translate.withArguments("%0 with ID \"%1\" has been integrated into the %0 with the ID \"%2\"", [pContext, pSourceContactId, pTargetContactId]), + //categoryKeywordId: $KeywordRegistry.ac + directionKeywordId: $KeywordRegistry.activityDirection$internal(), + responsibleContactId: pCurrentContactId + }; + var activityLinks = [[pContext, pTargetContactId]]; + + return ActivityUtils.insertNewActivity(activityDataForInsert, activityLinks, null, db.getCurrentAlias()); +} + +/* + * Persons get reassigned to new organisation + * + * @returns {Boolean} If records have been updated + */ +DuplicateMergeUtils._migratePersonsToNewOrganisation = function (pSourceOrganisationId, pTargetOrganisationId) +{ + var updateCount = newWhereIfSet(["CONTACT", "ORGANISATION_ID"], pSourceOrganisationId) + .and("PERSON_ID is not null") + .updateFields(new Map().set("ORGANISATION_ID", pTargetOrganisationId), "CONTACT"); + + var deleteCount = newWhere(["CONTACT", "ORGANISATION_ID"], pSourceOrganisationId) + .and("PERSON_ID is not null") + .deleteData(); + return updateCount > 0 || deleteCount > 0; +} + +/* + * Person and organisations keep the max_count = 1 attribute of the target and the one from the source is deleted + * + * @returns {Boolean} If records have been deleted + */ +DuplicateMergeUtils._deleteUniqueAttributes = function (pSourceContactId, pTargetContactId) +{ + var targetAttrUnique = newSelect("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID") + .from("AB_ATTRIBUTERELATION") + .join("AB_ATTRIBUTEUSAGE on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID") + .where("AB_ATTRIBUTEUSAGE.MAX_COUNT = 1") + .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", pTargetContactId) + .table(); + var deleteCount = 0; + + targetAttrUnique.forEach(function(attribute){ + deleteCount += newWhereIfSet("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attribute) + .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", pSourceContactId) + .deleteData(); + }); + + return deleteCount > 0; +} + +DuplicateMergeUtils._migrateLinkedContactData = function (pSourceContactId, pTargetContactId) +{ + var updateStatements = new Map(); + var currentAlias = db.getCurrentAlias(); + + var setStandardsStatements = []; + var [standardPhone, standardMail, standardAddressId] = newSelect([ + "(" + CommUtil.getStandardSubSqlPhone() + ")", + "(" + CommUtil.getStandardSubSqlMail() + ")", + "CONTACT.ADDRESS_ID" + ]) + .from("CONTACT") + .where("CONTACT.CONTACTID", pTargetContactId) + .arrayRow(); + + //if the targetContact already has a standard phone comm, set the comm from the sourceContact as not standard + if (standardPhone) + { + setStandardsStatements.push( + newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId) + .and("COMMUNICATION.MEDIUM_ID", CommUtil.getMediumIdsByCategory("PHONE"), SqlBuilder.IN()) + .buildUpdateStatement({"ISSTANDARD" : "0"}) + ); + } + if (standardMail) + { + setStandardsStatements.push( + newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId) + .and("COMMUNICATION.MEDIUM_ID", CommUtil.getMediumIdsByCategory("EMAIL"), SqlBuilder.IN()) + .buildUpdateStatement({"ISSTANDARD" : "0"}) + ); + } + //set the standardaddress of the sourceContact as standard of the targetContact if it doesn't have one set yet + if(!standardAddressId) + { + var sourceStandard = newSelect("CONTACT.ADDRESS_ID") + .from("CONTACT") + .where("CONTACT.CONTACTID", pSourceContactId) + .cell(); + setStandardsStatements.push(newWhere("CONTACT.CONTACTID", pTargetContactId).buildUpdateStatement({"ADDRESS_ID": sourceStandard})); + } + + updateStatements.set(currentAlias, setStandardsStatements); + + DuplicateMergeUtils._getLinkedTableInfos(pTargetContactId).forEach(function ([tableName, columnName, additionalCondition, dbAlias]) + { + if (!dbAlias) + { + dbAlias = currentAlias; + } + + if (!updateStatements.has(dbAlias)) + { + updateStatements.set(dbAlias, []); + } + var statements = updateStatements.get(dbAlias); + + var updateValues = {}; + updateValues[columnName] = pTargetContactId; + + var updateCondition = new SqlBuilder(dbAlias).where([tableName, columnName], pSourceContactId).andIfSet(additionalCondition); + + //push must be used here to keep the reference + statements.push(updateCondition.buildUpdateStatement(updateValues, tableName)); + }); + + var totalChanges = 0; + + updateStatements.forEach(function (statements, alias) + { + totalChanges += db.updates(statements, alias); + }); + + totalChanges += newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId).deleteData(); //delete leftover communications from the source contact + totalChanges += new AttributeRelationQuery(pSourceContactId).deleteAllAttributes(); //delete leftover attributes + + return totalChanges > 0; +} + +/* + * All records with contactId = sourceContactId get updated, which are not assigned to the same "group" as the targetContactId. + * This is because otherwise there would now be in total two "participants" in the same "group" as opposed to one before. + * Also if they already are in the same "group" those records shouldn't be updated because it would lead to the same outcome. + * + * @returns {Boolean} If records have been updated + */ +DuplicateMergeUtils._migrateParticipantsToNewContact = function (pTableName, pContactIdColumn, pAssignableIdColumn, pSourceContactId, pTargetContactId) +{ + var excludedIds = newSelect(pAssignableIdColumn) + .from(pTableName) + .where([pTableName, pContactIdColumn], pTargetContactId) + .arrayColumn(); + + var updateCount = newWhereIfSet([pTableName, pAssignableIdColumn], excludedIds, SqlBuilder.NOT_IN()) + .and([pTableName, pContactIdColumn], pSourceContactId) + .updateFields(new Map().set(pContactIdColumn, pTargetContactId), pTableName); + + var deleteCount = newWhere([pTableName, pContactIdColumn], pSourceContactId) + .tableName(pTableName) + .deleteData(); + + return updateCount > 0 || deleteCount > 0; +} + +/* + * Update other contacts from the source + * + * @returns {Boolean} If records have been updated + */ +DuplicateMergeUtils._updateOtherContacts = function (pSourceContactId, sourcePersonId, targetPersonId) +{ + var otherContacts = newSelect("PERSON.PERSONID") + .from("PERSON") + .join("CONTACT", "CONTACT.PERSON_ID = PERSON.PERSONID") + .where("PERSON.PERSONID", sourcePersonId) + .and("CONTACT.CONTACTID", pSourceContactId, SqlBuilder.NOT_EQUAL()) + .table(); + var updateCount = 0; + + otherContacts.forEach(function(person){ + updateCount += newWhere("CONTACT.PERSON_ID", person) + .updateFields({"PERSON_ID" : targetPersonId}, "CONTACT"); + }); + + return updateCount > 0; +} + +DuplicateMergeUtils._buildDeleteCachedUnrelatedDuplicateQuery = function(pSourceContactId) +{ + return [ + newWhere("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pSourceContactId).buildDeleteStatement(), + newWhere("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pSourceContactId).buildDeleteStatement() + ]; +} + +DuplicateMergeUtils._buildDeleteOrganisationAndContactQuery = function(pSourceOrganisationId, pSourceContactId) +{ + return [ + newWhere("ORGANISATION.ORGANISATIONID", pSourceOrganisationId).buildDeleteStatement(), + newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement() + ]; +} + +/* + * Contains all Tables and their fields which may contain the contact id to be replaced for the data alias + * + * @returns {String[[]]} Array in the format [TableName, ContactIdColumnName, AdditionalCondition, alias] + */ +DuplicateMergeUtils._getLinkedTableInfos = function(pTargetContactId) +{ + //don't use communications that the target already has + var targetComms = newSelect("COMMUNICATION.ADDR") + .from("COMMUNICATION") + .where("COMMUNICATION.CONTACT_ID", pTargetContactId) + .arrayColumn(); + + var communicationDedupCondition = targetComms.length > 0 + ? newWhere("COMMUNICATION.ADDR", targetComms, SqlBuilder.NOT_IN()) + : ""; + + return[ + ["AB_APPOINTMENTLINK", "OBJECT_ROWID"], + ["AB_CTILOG", "CONTACT_ID"], + ["AB_OBJECTRELATION", "AB_OBJECTRELATIONID"], + ["AB_OBJECTRELATION", "OBJECT1_ROWID"], + ["AB_OBJECTRELATION", "OBJECT2_ROWID"], + ["AB_LOGHISTORY", "TABLENAMEID"], + ["ADDRESS", "CONTACT_ID"], + ["BULKMAILRECIPIENT", "CONTACT_ID"], + ["BULKMAIL", "TESTING_CONTACT_ID"], + ["CAMPAIGN", "EMPLOYEE_CONTACT_ID"], + ["CAMPAIGNSTEP", "EMPLOYEE_CONTACT_ID"], + ["COMMRESTRICTION", "CONTACT_ID"], + ["COMMRESTRICTION", "EMPLOYEE_INVOLVED"], + ["COMMUNICATION", "CONTACT_ID", communicationDedupCondition], + ["COMPETITION", "CONTACT_ID"], + ["CONTRACT", "CONTACT_ID"], + ["LETTERRECIPIENT", "CONTACT_ID"], + ["OBJECTMEMBER", "CONTACT_ID"], + ["OFFER", "CONTACT_ID"], + ["PRODUCT", "CONTACT_ID"], + ["PRODUCTPRICE", "CONTACT_ID"], + ["SALESORDER", "CONTACT_ID"], + ["SALESPROJECT", "CONTACT_ID"], + ["TASK", "REQUESTOR_CONTACT_ID"], + ["TASK", "EDITOR_CONTACT_ID"], + ["TASKLINK", "OBJECT_ROWID"], + ["ACTIVITY", "RESPONSIBLE"], + ["DSGVO", "CONTACT_ID"], + ["DSGVOINFO", "CONTACT_ID"], + ["TIMETRACKING", "CONTACT_ID"], + ["ACTIVITYLINK", "OBJECT_ROWID"], + ["AB_ATTRIBUTERELATION", "OBJECT_ROWID"], + + ["ASYS_CALENDARLINK", "DBID", "", SqlUtils.getSystemAlias()] + ]; +} diff --git a/process/DuplicateScanner_lib/process.js b/process/DuplicateScanner_lib/process.js index e26053edc6cb753291a842212cbfcef324124799..be805bc2aecc3323fb0e536f545da25e8d2b5762 100644 --- a/process/DuplicateScanner_lib/process.js +++ b/process/DuplicateScanner_lib/process.js @@ -1,20 +1,12 @@ import("system.project"); -import("ActivityTask_lib"); -import("KeywordRegistry_basic"); -import("system.translate"); -import("system.datetime"); -import("JditoFilter_lib"); -import("system.process"); import("system.util"); import("system.vars"); -import("system.net"); -import("system.logging"); import("system.db"); import("system.entities"); import("Sql_lib"); import("system.indexsearch"); -import("Communication_lib"); -import("Attribute_lib"); +import("IndexSearch_lib"); +import("system.process"); /** * Methods for duplicate scanning. @@ -24,1356 +16,250 @@ import("Attribute_lib"); */ function DuplicateScannerUtils() {} -/* - * Loads all prefilters for a scanner in the form of arrays in an array. - * Single filter record: [FILTER_CONDITION, COUNT_CHARACTERS_TO_USE, MAX_RESULTS_THRESHOLD] - * - * @param {String} pFilterName Name of the filter - * @param {String} pTargetEntity Entity which has been configured - * @returns {String[[]]} Array of arrays containing the configured values - */ -DuplicateScannerUtils.loadFilters = function(pFilterName, pTargetEntity) -{ - let query = newSelect("FILTER_CONDITION, COUNT_CHARACTERS_TO_USE, MAX_RESULTS_THRESHOLD") - .from("DUPLICATESCANNERPREFILTERCONFIG") - .join("DUPLICATESCANNER", "DUPLICATESCANNER.ID = DUPLICATESCANNERPREFILTERCONFIG.DUPLICATESCANNER_ID") - .where("DUPLICATESCANNER.FILTER_NAME", pFilterName) - .and("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity); - - return query.table(); -} - -/* - * Deletes the cached duplicate for the given id. - * If there would only remain one item in the cluster after deletion, the whole cluster including the duplicate gets deleted. - * In this case, all records marked as unrelated duplicate will be deleted aswell. - * - * @param {String} pDuplicateId Id of the duplicate to delete - */ -DuplicateScannerUtils.deleteCachedDuplicate = function(pDuplicateId) -{ - var [countDuplicatesInClusterWithoutParameterId, clusterId] = newSelect("count(ID), CLUSTERID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.CLUSTERID", newSelect("CLUSTERID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId).build(), - SqlBuilder.IN()) - .and("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId, SqlBuilder.NOT_EQUAL()) - .groupBy("CLUSTERID") - .arrayRow(); - - //If only one duplicate would be remaining, - //the whole cluster has to be deleted because there are no more duplicates. - //Otherwise delete just the single duplicate. The parameterized duplicate has been excluded via sql - //therefore check for smaller/equals 1 - if(countDuplicatesInClusterWithoutParameterId <= 1) - { - newWhere("DUPLICATECLUSTERS.CLUSTERID", clusterId).deleteData(); - newWhere("UNRELATEDDUPLICATES.CLUSTERID", clusterId).deleteData(); - } - else - { - newWhereIfSet("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId).deleteData(); - - //Delete all records where this duplicateId is mentioned - DuplicateScannerUtils.deleteAllUnrelatedDuplicateRelations(pDuplicateId); - } -} - -/* - * Deletes all Clusters for the given target Entity. - * No records markes as unrelated duplicate are being deleted. - * - * @param {String} pTargetEntity Entity which has been configured - * @return Count of deleted rows - */ -DuplicateScannerUtils.deleteClustersByTargetEntity = function(pTargetEntity) -{ - return newWhereIfSet("DUPLICATECLUSTERS.TARGET_ENTITY", pTargetEntity).deleteData(); -} - -/* - * Updates the duplicate relations markes as unrelated for the given target entity. - * All ClusterIds get updated with the new values if the same combination of duplicateIds - * still exists in the DUPLICATECLUSTERS table. - * - * Afterwards, all records which contain a nonexistend clusterId are being deleted - * - * @param {String} pTargetEntity Name of Entity whose duplicates should be updated +/** + * Returns an sql condition which returns a list of duplicate ids. + * The count is checked using pCount and pOperator. + * This function can be used for FilterExtensions + * + * @param {string[]} pEntities target entities + * @param {number} pCount value of count (will be applied to the operator) + * @param {string} pOperator the operator in sql notation e.g.: # = ? + * @param {boolean} pSubtractIgnored if set the ignored duplicates will be subtracted + * + * @returns {SqlBuilder} subselect selecting the duplicate ids */ -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations = function(pTargetEntity) +DuplicateScannerUtils.getDuplicateConditionalListSql = function(pEntities, pCount, pOperator, pSubtractIgnored) { - /* - * Update all records with the current valid clusterId where the same duplicateId combination exists - */ - let clusterIdChanges = newSelect("dc1.CLUSTERID, ud.CLUSTERID") - .from("UNRELATEDDUPLICATES", "ud") - .join("DUPLICATECLUSTERS", "dc1.DUPLICATEID = ud.SOURCEDUPLICATEID", "dc1") - .join("DUPLICATECLUSTERS", "dc2.DUPLICATEID = ud.UNRELATEDDUPLICATEID", "dc2") - .where(["DUPLICATECLUSTERS", "TARGET_ENTITY", "dc1"], pTargetEntity) - .table(); - - let updateStatements = clusterIdChanges.map(function ([newClusterId, oldClusterId]) - { - return newWhere("UNRELATEDDUPLICATES.CLUSTERID", oldClusterId).buildUpdateStatement({ - "CLUSTERID": newClusterId - }, "UNRELATEDDUPLICATES"); - }); + var subselect = newSelect("count(*)").from("UNRELATEDDUPLICATES") + .where("UNRELATEDDUPLICATES.DUPLICATETYPE = HASDUPLICATE.OBJECT_TYPE") + .and("UNRELATEDDUPLICATES.SOURCEDUPLICATEID = HASDUPLICATE.OBJECT_ROWID"); - db.updates(updateStatements); - - /* - * All unrelated duplicate ids that still exist in a cluster, have been updated with the new cluster id. - * All records with a nonexistend clusterid can now be deleted because they haven't been detected as a duplicate any more. - */ - newWhere("UNRELATEDDUPLICATES.CLUSTERID", newSelect("dc1.CLUSTERID").from("DUPLICATECLUSTERS", "dc1"), SqlBuilder.NOT_IN()) - .deleteData(); -} - -/* - * Creates a relation between two duplicates which means they are unrelated. - * They will not appear in each others duplicate tab any more. - * To remove this relation use DuplicateScannerUtils.deleteUnrelatedDuplicateRelation - * - * @param {String} pSourceContactId Id of first duplicate - * @param {String} pUnrelatedContactId Id of second duplicate - * @param {String} pClusterId Id of the cluster in which the duplicates are aggregated - * @returns {String} Number of Records inserted - */ -DuplicateScannerUtils.createUnrelatedDuplicateRelation = function(pSourceContactId, pUnrelatedContactId, pClusterId) -{ - return new SqlBuilder().insertFields({ - "UNRELATEDDUPLICATEID": pUnrelatedContactId, - "SOURCEDUPLICATEID": pSourceContactId, - "CLUSTERID": pClusterId - }, "UNRELATEDDUPLICATES", "ID"); -} - -/* - * Gets the cluster id in which the given duplicate id exists - * - * @param {String} pDuplicateId whose cluster id should be searched - * @returns {String} Cluster id - */ -DuplicateScannerUtils.getClusterId = function(pDuplicateId) -{ - return newSelect("CLUSTERID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId) - .cell(); -} - -/* - * Deletes the "unrelated" relation between two duplicates - * - * @param {String} pSourceDuplicateId Id of the source duplicate - * @param {String} pUnrelatedDuplicateId Id of the source duplicate - * @returns {String} Number of records deleted - */ -DuplicateScannerUtils.deleteUnrelatedDuplicateRelation = function(pSourceDuplicateId, pUnrelatedDuplicateId) -{ - return newWhere("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pSourceDuplicateId) - .and("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pUnrelatedDuplicateId) - .deleteData(); -} - -/* - * Deletes all relations to a duplicate id wether the id is the source or the unrelated duplicate in the relation - * - * @param {String} pDuplicateId Duplicate id whose "unrelated" relations are to delete - * @returns {String} Number of records deleted - */ -DuplicateScannerUtils.deleteAllUnrelatedDuplicateRelations = function(pDuplicateId) -{ - DuplicateScannerUtils.deleteUnrelatedDuplicateRelation(pDuplicateId, pDuplicateId); + var countSql = pSubtractIgnored ? "(HASDUPLICATE.DUPLICATECOUNT - (" + subselect.toString() + "))" : "(HASDUPLICATE.DUPLICATECOUNT)"; + return newSelect("HASDUPLICATE.OBJECT_ROWID").from("HASDUPLICATE") + .where("HASDUPLICATE.OBJECT_TYPE", pEntities, SqlBuilder.IN()) + .and(pOperator.replace("#", countSql).replace("?", pCount)); } -/* - * Loads all other duplicates from the cluster in which the parameterized duplicate is located - * - * @param {String} pDuplicateId - * @returns {String[]} Array of duplicate ids - */ -DuplicateScannerUtils.getCachedDuplicatesForDuplicateId = function(pDuplicateId) -{ - return newSelect("DUPLICATEID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.CLUSTERID", newSelect("CLUSTERID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId), - SqlBuilder.IN()) - .and("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateId, SqlBuilder.NOT_EQUAL()) - .and("DUPLICATECLUSTERS.DUPLICATEID", newSelect("UNRELATEDDUPLICATEID") - .from("UNRELATEDDUPLICATES") - .where("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pDuplicateId), - SqlBuilder.NOT_IN()) - .and("DUPLICATECLUSTERS.DUPLICATEID", newSelect("SOURCEDUPLICATEID") - .from("UNRELATEDDUPLICATES") - .where("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pDuplicateId), - SqlBuilder.NOT_IN()) - .arrayColumn(); -} - -/* - * Returns all duplicate ids which haven't been marked as unrelated for the given cluster id. - * - * @param {String} pClusterId The clusters id - * @return {String[]} Array of duplicate ids excluding those marked as unrelated - */ -DuplicateScannerUtils.getCachedDuplicatesForClusterId = function(pClusterId) -{ - return newSelect("DUPLICATEID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.DUPLICATEID", newSelect("UNRELATEDDUPLICATEID").from("UNRELATEDDUPLICATES"), - SqlBuilder.NOT_IN()) - .and("DUPLICATECLUSTERS.CLUSTERID", pClusterId) - .arrayColumn(); -} - -/* - * Recreates the cached duplicate clusters based on the configured pattern. <br /> - * The old clusters have to be deleted manually beforehand or by using "deleteClustersByTargetEntity".<br /> - * If there have already been ignored relations between duplicate records, it's advised to call "refreshUnrelatedDuplicateRelations" after the recreation of the duplicates cache.<br /> - * Please check the documentation of the params on how to get the infos required.<br /> - * <br /> - * If the usage of an external webservice has been activated, the search will be executed beforehand and the results will then be given to the pFormatValuesConsumeWebserviceCallback via parameter.<br /> - * To access the values it is advised to run thru the parameter like an array and access its value by key which is the index field name. The entity<br /> - * field names can be converted using DuplicateScannerUtils.translateEntityToIndexFields. For further infos see the example section below.<br /> - * <br /> - * Attention!<br /> - * If it is configured to use the external webservice callback the values have to be in the same format as they are in the parameter of the callback.<br /> - * <br /> - * @param {String} pFilterName Name of the filter to use - * @param {String} pTargetEntity The target entity which has been assigned to the filters configuration - * @param {String} pRecordsBlockSize The values which are checked get loaded in blocks. - * @param {String} pFormatValuesConsumeWebserviceCallback Null if no external service is used otherwise a function with one parameter. - * @return {Int} Count of duplicate clusters created - * - * @example - * var filterName = "PersonDuplicates"; - * var targetEntity = "Person_entity"; - * var recordBlockSize = DuplicateScannerUtils.getBlockSize(); - * - * let formatToJsonAndCallWsCallback = function(pPossibleDuplicatesRay) - * { - * let indexResultFields = DuplicateScannerUtils.TranslateEntityToIndexFields(targetEntity, resultFields) - * - * //Run thru every duplicate result an read out the resultfields - * for (let i = 0; i < pPossibleDuplicatesRay.length; i++) - * { - * for (let b = 0; b < resultFields.length; b++) - * { - * let entityFieldName = resultFields[b]; - * let indexFieldName = indexResultFields[entityFieldName]; - * //format values - * } - * } - * //call webservice - * //reformat results to same structure as before - * return pPossibleDuplicatesRay; - * }; - * - * DuplicateScannerUtils.DeleteDuplicateClustersByTargetEntity(targetEntity); - * - * DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, pRecordsBlockSize, formatToJsonAndCallWsCallback); - * - * DuplicateScannerUtils.RefreshUnrelatedDuplicateRelations(targetEntity); +/** + * Ignores duplicates corrosponding to the type, the source, and the duplicate ids + * + * @param {string} pDuplicateType the duplicate type e.g.: Organisation_entity + * @param {string} pSourceDuplicateId the source duplicate id + * @param {string[]} pUnrelatedDuplicateIds the target duplicate ids + * @param {boolean} pIgnore weather the duplicate should be ignored or unignored */ -DuplicateScannerUtils.rebuildDuplicatesCache = function(pFilterName, pTargetEntity, - pRecordsBlockSize, pFormatValuesConsumeWebserviceCallback) +DuplicateScannerUtils.updateIgnored = function(pDuplicateType, pSourceDuplicateId, pUnrelatedDuplicateIds, pIgnore) { - let useExternalWebservice = _DuplicateScannerUtils._isUseExternalWebservice(pFilterName, pTargetEntity); - let resultFields = DuplicateScannerUtils.getResultFields(filterName, targetEntity); - - let indexPattern = _DuplicateScannerUtils._loadIndexPattern(pFilterName, pTargetEntity); - let entityFieldConfigs = _DuplicateScannerUtils._loadEntityFieldConfigsFromPattern(indexPattern); - let entityIdField = _DuplicateScannerUtils._loadEntityIdField(pFilterName, pTargetEntity); + newWhere("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pSourceDuplicateId) + .and("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pUnrelatedDuplicateIds, SqlBuilder.IN()) + .deleteData(); - let alreadyIdentifiedIds = []; + var TABLE_NAME = "UNRELATEDDUPLICATES"; + var COLUMN_NAMES = ["ID", "DUPLICATETYPE", "SOURCEDUPLICATEID", "UNRELATEDDUPLICATEID"]; + var COLUMN_TYPES = db.getColumnTypes(TABLE_NAME, COLUMN_NAMES); - let entityFields = _DuplicateScannerUtils._loadEntityFieldsFromFieldConfigs(entityFieldConfigs); - - entityFields.push(entityIdField); - - let targetRecords = DuplicateScannerUtils.getEntityRecords(pTargetEntity, entityFields, 0, pRecordsBlockSize); - - let currentRecordIndex = pRecordsBlockSize; - while(targetRecords.length > 0) + var statements = []; + pUnrelatedDuplicateIds.forEach(function(currId) { - - foundDuplicateIds = DuplicateScannerUtils.scanRecords(pTargetEntity, targetRecords, - entityFieldConfigs, resultFields, useExternalWebservice, - pFormatValuesConsumeWebserviceCallback, alreadyIdentifiedIds, indexPattern, entityIdField); - - if (foundDuplicateIds) - alreadyIdentifiedIds = alreadyIdentifiedIds.concat(foundDuplicateIds); - - if(targetRecords.length < pRecordsBlockSize) - { - break; - } - targetRecords = DuplicateScannerUtils.getEntityRecords(pTargetEntity, entityFields, - currentRecordIndex, pRecordsBlockSize); - - currentRecordIndex += pRecordsBlockSize; - } -} - -DuplicateScannerUtils.scanRecords = function(pTargetEntity, pTargetRecordsData, - pEntityFieldConfigs, pResultFields, pUseExternalWebservice, pFormatValuesConsumeWebserviceCallback, pAlreadyIdentifiedIds, pIndexPattern, pEntityIdField) -{ - let foundDuplicateIds = []; - - //If the contact id loading query has no results, stop. - //No ids should be deleted if an error has been made in this query. - if(pTargetRecordsData.length <= 0) - return foundDuplicateIds; - - //First it gets checked if the current id has already been identified. If that's the case it'll continue with the next. - //Otherwise an object gets build in the form of ["FilterFieldName" = "FilterFieldValueFromQuery"] with which a scan for possible duplicates get's started - var duplicatesToInsertQueries = []; - for (let b = 0; b < pTargetRecordsData.length; b++) + var columnValues = [util.getNewUUID(), pDuplicateType, pSourceDuplicateId, currId]; + statements.push([TABLE_NAME, COLUMN_NAMES, COLUMN_TYPES, columnValues]); + }); + if(pIgnore) { - let entityFieldValuesRay = DuplicateScannerUtils.buildEntityFieldConfigs(pEntityFieldConfigs, pTargetRecordsData[b]); - - //The first field in this Array must always be the configured id field. This is ensured using onValidation-logic - let idValue = pTargetRecordsData[b][pEntityIdField]; - - //If the current Id has already been identified, continue - if(pAlreadyIdentifiedIds.indexOf(pTargetRecordsData[b][pEntityIdField]) > -1) - { - continue; - } - - let foundDuplicates = _DuplicateScannerUtils._scanForDuplicates(pTargetEntity, - entityFieldValuesRay, pResultFields, idValue, pFormatValuesConsumeWebserviceCallback, pUseExternalWebservice, pIndexPattern) - - if(foundDuplicates == null || foundDuplicates.length == 0) - { - continue; - } - //Insert all found duplicate ids into an cache array because those ids don't have to be checked again lateron. - for (let i = 0; i < foundDuplicates.length; i++) - { - let localId = foundDuplicates[i][indexsearch.FIELD_ID]; - foundDuplicateIds.push(localId); - } - - pAlreadyIdentifiedIds = pAlreadyIdentifiedIds.concat(foundDuplicateIds); - - //The duplicates list contains only the found duplicates to the original id, therefore it get's added manually - foundDuplicateIds.push(pTargetRecordsData[b][pEntityIdField]); - - let insertQueriesRay = _DuplicateScannerUtils._createInsertDuplicatesClusterQuery(foundDuplicateIds, pTargetEntity) - duplicatesToInsertQueries = duplicatesToInsertQueries.concat(insertQueriesRay); - foundDuplicateIds = []; + db.inserts(statements); } - db.inserts(duplicatesToInsertQueries, db.getCurrentAlias(), 10 * datetime.ONE_MINUTE); - return foundDuplicateIds; } -/* - * Searches for a cluster which contains the duplicates specified by the parameterized array. <br /> - * The contents of the cluster have to be identical, if no fitting cluster could be found an empty string is returned. +/** + * Removes ignored duplicates from an array of duplicate ids * - * @param {String} pNewRecordId The id of the record which was used to scan for duplicates - * @param {String[]} pDuplicateIds Duplicate ids used to search for a cluster containing them - * @param {String} pTargetEntity Entity which has been configured - * @returns {String} A clusterid if a matching cluster has been found, otherwise "" - */ -DuplicateScannerUtils.cacheNewScanResults = function(pNewRecordId, pDuplicateIds, pTargetEntity) -{ - let duplicateIds = []; - //Run thru every duplicate result and read out the id. - //Do it now to have a simple array on all usages lateron. - for (let i = 0; i < pDuplicateIds.length; i++) - { - let duplicateContactId = pDuplicateIds[i][indexsearch.FIELD_ID]; - duplicateIds.push(duplicateContactId); - } - - let clusterId = DuplicateScannerUtils.getClusterWithIdenticalDuplicates(duplicateIds); - - //If no cluster has beend found, create a new one with all found duplicateIds, - //otherwise add the id to the existing cluster - let idRayToInsert = []; - if(clusterId == undefined || clusterId == null || clusterId == "") - { - idRayToInsert = duplicateIds; - idRayToInsert.push(pNewRecordId); - } - else - idRayToInsert.push(pNewRecordId); - - insertQueriesRay = _DuplicateScannerUtils._createInsertDuplicatesClusterQuery(idRayToInsert, pTargetEntity, clusterId) - - return db.inserts(insertQueriesRay); -} - -/* - * Searches for a cluster which contains the duplicates specified by the parameterized array. <br /> - * The contents of the cluster have to be identical, if no fitting cluster could be found an empty string is returned. + * @param {string} pTargetEntity the target entity e.g.: Organisation_entity + * @param {string} pTargetUid the source duplicate id + * @param {string} pIdArray the array of duplicate ids * - * @param {String[]} pDuplicateIds Duplicate ids which should be in the same cluster - * @returns {String} Id of the cluster which contains all given duplicate ids or "" + * @returns {string[]} the filtered duplicate ids */ -DuplicateScannerUtils.getClusterWithIdenticalDuplicates = function(pDuplicateIds) +DuplicateScannerUtils.filterIgnored = function(pTargetEntity, pTargetUid, pIdArray) { - let RESULT_NO_CLUSTER_FOUND = ""; - - if(pDuplicateIds.length < 1) - return RESULT_NO_CLUSTER_FOUND; - - let clusterIdSelect = newSelect("distinct CLUSTERID") - .from("DUPLICATECLUSTERS") - .where(); - - for (let i = 0; i < pDuplicateIds.length; i++) + if(pIdArray.length == 0) { - clusterIdSelect.and("DUPLICATECLUSTERS.CLUSTERID", newSelect("CLUSTERID").from("DUPLICATECLUSTERS").where("DUPLICATECLUSTERS.DUPLICATEID", pDuplicateIds[i]), - SqlBuilder.IN()); + return pIdArray; } - - let foundClusterId = clusterIdSelect.cell(); - - if(foundClusterId == null || foundClusterId == "") - return RESULT_NO_CLUSTER_FOUND; - - let duplicatesInCluster = newSelect("DUPLICATEID") - .from("DUPLICATECLUSTERS") - .where("DUPLICATECLUSTERS.CLUSTERID", foundClusterId) - .arrayColumn(); - - /* - * A cluster has been searched which contains all duplicate ids as specified via parameter. - * There's the possibility that this cluster contains even more duplicates than specified via the parameter. - * In this case, the cluster and the parameterized duplicateids are not identical - * which means a new cluster has to be created. - */ - if(pDuplicateIds.length != duplicatesInCluster.length) - return RESULT_NO_CLUSTER_FOUND; - else - return foundClusterId; + var ignoreTable = newSelect(["UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID"]) + .from("UNRELATEDDUPLICATES") + .where("UNRELATEDDUPLICATES.DUPLICATETYPE", pTargetEntity) + .and("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pTargetUid) + .and("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pIdArray, SqlBuilder.IN()) + .arrayColumn(); + return pIdArray.filter(function(curr) { + return !ignoreTable.includes(curr); + }); } -DuplicateScannerUtils.getEntityRecords = function(pTargetEntity, pEntityFields, pStartRow, pCountRecordsToLoad) -{ - let getRowsConfig = entities.createConfigForLoadingRows() - .entity(pTargetEntity) - .fields(pEntityFields) - .count(pCountRecordsToLoad) - .startrow(pStartRow); - return entities.getRows(getRowsConfig); -} -/* - * Loads the configured resultfields as array - * - * @param {String} pFilterName Name of the filter - * @param {String} pTargetEntity Entity which has been configured - * @returns {String[]} Resultfields as array +/** + * Deletes duplicates corrosponding to the given type and ids + * + * @param {string} pObjectType the duplicate type e.g.: Organisation_entity + * @param {string[]} pObjectRowIds the duplicate ids e.g. some organisation ids */ -DuplicateScannerUtils.getResultFields = function(pFilterName, pTargetEntity) +DuplicateScannerUtils.deleteHasDuplicateEntries = function(pObjectType, pObjectRowIds) { - return newSelect("dsrfc.ENTITY_FIELD_NAME") - .from("DUPLICATESCANNERRESULTFIELDCONFIG dsrfc") - .join("DUPLICATESCANNER", "DUPLICATESCANNER.ID = dsrfc.DUPLICATESCANNER_ID") - .where("DUPLICATESCANNER.FILTER_NAME", pFilterName) - .and("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity) - .arrayColumn(); + newWhere("HASDUPLICATE.OBJECT_TYPE", pObjectType) + .and("HASDUPLICATE.OBJECT_ROWID", pObjectRowIds, SqlBuilder.IN()) + .deleteData(); } -/* - * Scans for duplicates based on the configured pattern and the selected id field<br /> - * All values to the used placeholders have to be present in "pValuesToCheck"<br /> - * First all placeholders in the pattern will be replaced with their respective values. - * Then, the pattern is extended wo exclude the record on which the search is based on. - *<br /> - * If the usage of an external webservice has been activated, the result will then be given to the pFormatValuesConsumeWebserviceCallback via parameter.<br /> - * To access the values it is advised to run thru the parameter like an array and access its value by key which is the index field name. The entity - * field names can be converted using DuplicateScannerUtils.translateEntityToIndexFields - * <br /> - * <br /> - * Attention!<br /> - * If it's a single scanForDuplicates call it doesn't matter what the callback returns because after the callback, no more modifications follow before - * returning the data.<br /> - * If it's inside the RebuildCache the values have to be in the same format as the parameter - * - * @param {String} pFilterName Name of the filter - * @param {String} pTargetEntity Respective target entity - * @param {{"key", "value"}} pValuesToCheck An object with key value pairs which hold the name of the entity field as key and it's value as value. See the example "valuesToCheck" - * @param {function} pFormatValuesConsumeWebserviceCallback Null if no external service is used otherwise a function with one parameter. - * If the function is called is based on the configuration of the current scanner - * @returns {[["key", "value"]]} Array of Key-Value-Pairs based on the configured resultfields, if an external webservices was used - * the structure is defined by the parameterized function "pFormatValuesConsumeWebserviceCallback" - * - * @example - * var filterName = "PersonDuplicates"; - * let targetEntity = "Person_entity"; - * let valuesToCheck = {}; - * var entityModel = project.getEntityStructure(targetEntity); +/** + * Manually inserts a duplicate entry by the given type, id and count * - * //Read the values of all available entity fields and write the fieldname/value combination - * //as key/value pairs into an object. This is used to trigger the scan for duplicates - * let fieldValue = ""; - * let entityFields = []; - * for (fieldname in entityModel.fields) - * { - * field = entityModel.fields[fieldname]; - * if(field.fieldType == project.ENTITYFIELDTYPE_FIELD) - * { - * fieldValue = vars.get("$field." + field.name); - * - * if(fieldValue != null && fieldValue != "") - * { - * valuesToCheck[field.name] = fieldValue; - * } - * } - * } - * - * let formatToJsonAndCallWsCallback = function(pPossibleDuplicatesRay) - * { - * let indexResultFields = DuplicateScannerUtils.TranslateEntityToIndexFields(targetEntity, resultFields) - * - * //Run thru every duplicate result an read out the resultfields - * for (let i = 0; i < pPossibleDuplicatesRay.length; i++) - * { - * for (let b = 0; b < resultFields.length; b++) - * { - * let entityFieldName = resultFields[b]; - * let indexFieldName = indexResultFields[entityFieldName]; - * //format values - * } - * } - * //call webservice - * //reformat results to same structure as before - * return pPossibleDuplicatesRay; - * }; - * - * //The result values can be accessed as seen above in "formatToJsonAndCallWsCallback" - * DuplicateScannerUtils.ScanForDuplicates(filterName, targetEntity, valuesToCheck, - * formatToJsonAndCallWsCallback); + * @param {string} pObjectType the type e.g.: Organisation_entity + * @param {string} pObjectRowId the id e.g. a organisation id + * @param {number} pCount the count / how many duplicates are there */ -DuplicateScannerUtils.scanForDuplicates = function(pFilterName, pTargetEntity, pValuesToCheck, pFormatValuesConsumeWebserviceCallback) +DuplicateScannerUtils.insertHasDuplicateEntry = function(pObjectType, pObjectRowId, pCount) { - let useExternalWebservice = _DuplicateScannerUtils._isUseExternalWebservice(pFilterName, pTargetEntity); - let resultFields = DuplicateScannerUtils.getResultFields(pFilterName, pTargetEntity); - - let indexPattern = _DuplicateScannerUtils._loadIndexPattern(pFilterName, pTargetEntity); - let entityFieldConfigs = _DuplicateScannerUtils._loadEntityFieldConfigsFromPattern(indexPattern); - let entityIdField = _DuplicateScannerUtils._loadEntityIdField(pFilterName, pTargetEntity); - - let entityFieldConfigValuesRay = DuplicateScannerUtils.buildEntityFieldConfigs(entityFieldConfigs, pValuesToCheck); - - //The first field in this Array must always be the configured id field. - let idValue = pValuesToCheck[entityIdField]; - - return _DuplicateScannerUtils._scanForDuplicates(pTargetEntity, - entityFieldConfigValuesRay, resultFields, idValue, - pFormatValuesConsumeWebserviceCallback, useExternalWebservice, indexPattern) + var COLUMNS = [ + "HASDUPLICATEID", + "OBJECT_TYPE", "OBJECT_ROWID", + "DUPLICATECOUNT" + ]; + var COLUMN_TYPES = db.getColumnTypes("HASDUPLICATE", COLUMNS); + var values = [ + util.getNewUUID(), + pObjectType, pObjectRowId, + pCount.toFixed(0) + ]; + db.insertData("HASDUPLICATE", COLUMNS, COLUMN_TYPES, values); } -/* - * Executes a indexsearch.lookupIndexField for eacht entity field in the parameterized array - * and returns it as Map. - * - * @param {String} pEntityName ...Name of the entity - * @param {String[]} pEntityFields Array of the entities Fields to translate to index fields - * @returns Map-like object where (key = entity field) and (value = index field) - * - * @example - * let entityResultFields = ["LASTNAME"]; - * let entityIndexFields = DuplicateScannerUtils.translateEntityToIndexFields("Person_entity", entityResultFields); - * +/** + * Updates HasDuplicate by entity (used in onInser and onUpdate) + * + * @param {string} pTargetEntity the target entity e.g.: Organisation_entity */ -DuplicateScannerUtils.translateEntityToIndexFields = function(pEntityName, pEntityFields) +DuplicateScannerUtils.updateHasDuplicateEntry = function(pTargetEntity) { - let entityIndexFields = {}; - for (let i = 0; i < pEntityFields.length; i++) - { - let entityFieldName = pEntityFields[i]; + var scanner = DuplicateScannerUtils.getScannerByEntity(pTargetEntity); + var indexsearchFilter = IndexsearchFilterUtils.fromFilter(scanner.filter); - //todo remove if api has been fixed - if(entityFieldName.startsWith(pEntityName)) - entityFieldName = entityFieldName.replace(pEntityName + ".", ""); - - let indexField = indexsearch.lookupIndexField(pEntityName, entityFieldName); - entityIndexFields[pEntityFields[i]] = indexField; - } - return entityIndexFields; -} + var fields = indexsearchFilter.getFields(); + fields.add(scanner.idField); + fields = Array.from(fields); -/* - * - * Merges the source person into the target person. - * This - * - replaces the source's with the target's contactid in a predefined set of tables. - * - resets the standard communications of the source contact and keeps the ones of the target. - * - updates participants of campaigns and removes obsolet ones(which would be duplicates) - * - deletes the source person and contact - * - deletes the duplicate record, if one exists - * - deletes all unrelated-duplicate-relations containing the source contact id - * - * @param {String} pSourceContactId The contact to be integrated into another - * @param {String} pTargetContactId The contact in which the source gets integrated - * @returns {Boolean} if the merge was sucessful - */ -DuplicateScannerUtils.mergePerson = function(pSourceContactId, pTargetContactId) -{ - var sourcePersonId = newSelect("PERSON_ID") - .from("CONTACT") - .where("CONTACT.CONTACTID", pSourceContactId) - .cell(); - var targetPersonId = newSelect("PERSON_ID") - .from("CONTACT") - .where("CONTACT.CONTACTID", pTargetContactId) - .cell(); - - _DuplicateScannerUtils._deleteUniqueAttributes(pSourceContactId, pTargetContactId); - var isLinkedDataUpdated = _DuplicateScannerUtils._migrateLinkedContactData(pSourceContactId, pTargetContactId); - var isParticipantsUpdated = _DuplicateScannerUtils._migrateParticipantsToNewContact("CAMPAIGNPARTICIPANT", "CONTACT_ID", "CAMPAIGN_ID", - pSourceContactId, pTargetContactId); - _DuplicateScannerUtils._updateOtherContacts(pSourceContactId, sourcePersonId, targetPersonId); - - var deleteStatements = []; - if (sourcePersonId != targetPersonId) - deleteStatements.push(newWhere("PERSON.PERSONID", sourcePersonId).buildDeleteStatement()); - - deleteStatements.push(newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement()); - deleteStatements = deleteStatements.concat(_DuplicateScannerUtils._buildDeleteCachedUnrelatedDuplicateQuery(pSourceContactId)); - - //update binary - var metaData = db.getBinaryMetadata("CONTACT", "DOCUMENT", pSourceContactId, true, SqlUtils.getBinariesAlias()); - metaData.forEach(function (binaryMetaData) + var entityObj = {}; + fields.forEach(function(field) { - db.updateBinaryAssignment(binaryMetaData.id, "CONTACT", "DOCUMENT", pTargetContactId, SqlUtils.getBinariesAlias()); + entityObj[field] = vars.get("$field." + field); }); - var deletedRows = db.deletes(deleteStatements) - - DuplicateScannerUtils.deleteCachedDuplicate(pSourceContactId); - - return isLinkedDataUpdated || isParticipantsUpdated || deletedRows > 0; -} - -DuplicateScannerUtils.createMergeSuccessActivity = function(pSourceContactId, pTargetContactId, pCurrentContactId, pContext) -{ - var activityDataForInsert = { - subject: translate.withArguments("A %0 record has been merged", [pContext]), - content: translate.withArguments("%0 with ID \"%1\" has been integrated into the %0 with the ID \"%2\"", [pContext, pSourceContactId, pTargetContactId]), - //categoryKeywordId: $KeywordRegistry.ac - directionKeywordId: $KeywordRegistry.activityDirection$internal(), - responsibleContactId: pCurrentContactId - }; - var activityLinks = [[pContext, pTargetContactId]]; - - return ActivityUtils.insertNewActivity(activityDataForInsert, activityLinks, null, db.getCurrentAlias()); -} - -DuplicateScannerUtils.mergeOrganisation = function(pSourceContactId, pTargetContactId) -{ - var sourceOrganisationId = newSelect("ORGANISATION_ID") - .from("CONTACT") - .where("CONTACT.CONTACTID", pSourceContactId) - .cell(); - - var targetOrganisationId = newSelect("ORGANISATION_ID") - .from("CONTACT") - .where("CONTACT.CONTACTID", pTargetContactId) - .cell(); + var selfId = entityObj[scanner.idField]; - _DuplicateScannerUtils._deleteUniqueAttributes(pSourceContactId, pTargetContactId); - _DuplicateScannerUtils._migrateLinkedContactData(pSourceContactId, pTargetContactId); - _DuplicateScannerUtils._migrateParticipantsToNewContact("CAMPAIGNPARTICIPANT", "CONTACT_ID", "CAMPAIGN_ID", - pSourceContactId, pTargetContactId); - _DuplicateScannerUtils._migratePersonsToNewOrganisation(sourceOrganisationId, targetOrganisationId); + var indexPattern = indexsearchFilter.buildQuery(entityObj); + var ids = DuplicateScannerUtils.getDuplicateIds(pTargetEntity, indexPattern, selfId); - var deleteStatements = []; - deleteStatements.push(newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement()); - deleteStatements = deleteStatements.concat(_DuplicateScannerUtils._buildDeleteOrganisationAndContactQuery(sourceOrganisationId, pSourceContactId)); - deleteStatements = deleteStatements.concat(_DuplicateScannerUtils._buildDeleteCachedUnrelatedDuplicateQuery(pSourceContactId)); - - //update binary - var metaData = db.getBinaryMetadata("CONTACT", "DOCUMENT", pSourceContactId, true, SqlUtils.getBinariesAlias()); - metaData.forEach(function (binaryMetaData) + DuplicateScannerUtils.deleteHasDuplicateEntries(pTargetEntity, [selfId]); + if(ids.length > 0) { - db.updateBinaryAssignment(binaryMetaData.id, "CONTACT", "DOCUMENT", pTargetContactId, SqlUtils.getBinariesAlias()); - }); - var deletedRows = db.deletes(deleteStatements) - - DuplicateScannerUtils.deleteCachedDuplicate(pSourceContactId); - - return deletedRows >= 2; -} - -/* - * Creates an array of arrays containing the entity field config paired with it's value. - * - * @param {[]} pDuplicateFieldsConfig An Array with the configured fields in the form of [ENTITY_FIELD, IS_ID, USE_FOR_SEARCH]. @see LoadDuplicateIndexFieldsConfiguration() - * @param {{"key", "value"}} pTargetRecordData One record containing the values for the configured fields. It's in the format of {"key(=EntityFieldName", "Value"} - * @return {[[]]} An array of arrays containing the entity field config an its value. ["{entityfield: FIRSTNAME}", "PETER"]] - * @example - * pDuplicateFieldsConfig - * ["CONTACTID", true, false] - * ["FIRSTNAME", false, true] - * - * pTargetRecordData - * ["d786045c-8b21-4f22-b6d9-72be9f61c04d", "PETER"] - * - * => ["{entityfield: FIRSTNAME}", "PETER"]] - */ -DuplicateScannerUtils.buildEntityFieldConfigs = function(pDuplicateFieldsConfig, pTargetRecordData) -{ - let INDEX_CONFIG_ENTITY_FIELD = 0; - let entityFieldConfigValuesRay = []; - /* - * Based on the parameterized filter field names and the values loaded via the query, - * an array which contains records in the style of ["FilterFieldName", "FilterFieldValueFromQuery"] gets created. - * This is mandatory to run the scan for this record. - */ - for (let i = 0; i < pDuplicateFieldsConfig.length; i++) - { - let fieldConfig = JSON.parse("{" + pDuplicateFieldsConfig[i] + "}"); - let entityField = fieldConfig.entityfield; - let entityFieldValue = pTargetRecordData[entityField]; - if(entityFieldValue == null) - entityFieldValue = ""; - else - entityFieldValue = indexsearch.escapeString(entityFieldValue).trim(); - - let exclude = fieldConfig.exclude; - if (exclude) - { - exclude.forEach(function (excludeValue) - { - entityFieldValue = " " + entityFieldValue + " "; - entityFieldValue = entityFieldValue.replace(new RegExp( " " + excludeValue + " ", "gi"), ""); - }); - } - - let valuelength = fieldConfig.length; - if ( valuelength ) - entityFieldValue = entityFieldValue.substr(0, parseInt(valuelength)) + "*"; - - let empty = fieldConfig.empty; - if ( !empty && entityFieldValue == "") - entityFieldValue = "*"; - - entityFieldValue = entityFieldValue.trim(); - entityFieldConfigValuesRay.push([pDuplicateFieldsConfig[i], entityFieldValue]); + DuplicateScannerUtils.insertHasDuplicateEntry(pTargetEntity, selfId, ids.length); } - return entityFieldConfigValuesRay.length > 0 ? entityFieldConfigValuesRay : [["", ""]]; -} - -DuplicateScannerUtils.getBlockSize = function() -{ - return project.getPreferenceValue("custom.duplicates.dataBlockSize", "5000"); -} - -DuplicateScannerUtils.getEntityFieldsFromConfig = function(pFilterName, pTargetEntity) -{ - let indexPattern = _DuplicateScannerUtils._loadIndexPattern(pFilterName, pTargetEntity); - if(indexPattern == null || indexPattern == "") - return []; - let fieldConfigs = _DuplicateScannerUtils._loadEntityFieldConfigsFromPattern(indexPattern); - if(fieldConfigs == null || fieldConfigs.length < 1) - return []; - let entityFields = _DuplicateScannerUtils._loadEntityFieldsFromFieldConfigs(fieldConfigs); - let entityIdField = _DuplicateScannerUtils._loadEntityIdField(pFilterName, pTargetEntity); - entityFields.push(entityIdField); - return entityFields; } /** - * Loads the configured entity fields required for the given duplicate scanner. + * Returns a DuplicateScanner object by the given entity name + * + * @param {string} pTargetEntity a entity name e.g.: Organisation_entity * - * @param {String} pFilterName the name of the scanner - * @param {String} pTargetEntity the target entity - * @return {Object} an object with two properties: - * <ul> - * <li>entityFields: array of entity fields</li> - * <li>entityIdField: the id field name as string</li> - * </ul> + * @returns {object} the scanner object */ -DuplicateScannerUtils.getEntityFieldObjectFromConfig = function (pFilterName, pTargetEntity) +DuplicateScannerUtils.getScannerByEntity = function(pTargetEntity) { - var indexPattern = _DuplicateScannerUtils._loadIndexPattern(pFilterName, pTargetEntity); - if (!indexPattern) - return null; - var fieldConfigs = _DuplicateScannerUtils._loadEntityFieldConfigsFromPattern(indexPattern); - if (fieldConfigs == null || fieldConfigs.length === 0) - return null; - + var duplicateScanner = newSelect([ + "DUPLICATESCANNER.ID_FIELD_NAME", + "DUPLICATESCANNER.SCAN_PATTERN" + ]) + .from("DUPLICATESCANNER") + .where("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity).arrayRow(); + var filterObj = JSON.parse(duplicateScanner[1]).filter; return { - entityFields : _DuplicateScannerUtils._loadEntityFieldsFromFieldConfigs(fieldConfigs), - entityIdField : _DuplicateScannerUtils._loadEntityIdField(pFilterName, pTargetEntity) + idField: duplicateScanner[0], + filter: filterObj }; } -DuplicateScannerUtils.getUnrelatedRelationsForDuplicate = function(pDuplicateId) -{ - let unrelatedIds = []; - let duplicateIds = newSelect("SOURCEDUPLICATEID, UNRELATEDDUPLICATEID") - .from("UNRELATEDDUPLICATES") - .where("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pDuplicateId) - .or("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pDuplicateId) - .table(); - let sourceDuplicateId = ""; - let unrelatedDuplicateId = ""; - for (let i = 0; i < duplicateIds.length; i++) - { - sourceDuplicateId = duplicateIds[i][0]; - unrelatedDuplicateId = duplicateIds[i][1]; - - if(sourceDuplicateId != null && sourceDuplicateId != "" && sourceDuplicateId != pDuplicateId) - { - unrelatedIds.push(sourceDuplicateId); - } - else if(unrelatedDuplicateId != null && unrelatedDuplicateId != "" && unrelatedDuplicateId != pDuplicateId) - { - unrelatedIds.push(unrelatedDuplicateId); - } - } - return unrelatedIds; -} - -function _DuplicateScannerUtils() {} - -_DuplicateScannerUtils._loadEntityFieldsFromFieldConfigs = function(pEntityFieldConfigs) -{ - let fieldNames = []; - for (let i = 0; i < pEntityFieldConfigs.length; i++) - { - let fieldConfig = JSON.parse("{" + pEntityFieldConfigs[i] + "}"); - let entityField = fieldConfig.entityfield; - fieldNames.push(entityField); - } - return fieldNames; -} - -/* - * Gets the Pattern for the scanner - * A pattern usually contains placeholders in the style of "{entityFieldName]" +/** + * Calls the index search and returns the found duplicate ids * - * @param {String} pScannerName Name of the filter to use - * @param {String} pTargetEntity The target entity which has been assigned to the filters configuration - * @returns {String} Scan pattern as string - */ -_DuplicateScannerUtils._loadIndexPattern = function(pScannerName, pTargetEntity) -{ - let scanPattern = _DuplicateScannerUtils._filterToScanPattern( newSelect("SCAN_PATTERN") - .from("DUPLICATESCANNER") - .where("DUPLICATESCANNER.FILTER_NAME", pScannerName) - .and("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity) - .cell()); - scanPattern = scanPattern.trim(); - return scanPattern; -} - - -_DuplicateScannerUtils._filterToScanPattern = function(filterString) { - if (filterString == "") - return ""; - try - { - var filter = JSON.parse(filterString); - } - catch (err) - { - return ""; - } - return _DuplicateScannerUtils._filterChildsToScanPattern(filter.filter.childs, filter.filter.operator); -} - -_DuplicateScannerUtils._filterChildsToScanPattern = function(childs, operator) { - let group = ""; - for (let i = 0; i < childs.length; i++) { - if (group != ""){ - group = group + " " + operator+ " "; - } - if (childs[i].type == "row"){ - group = group + _DuplicateScannerUtils._filterChildsRowToScanPattern(childs[i].name, childs[i].operator, childs[i].value); - } else if (childs[i].type == "group") { - group = group + "(" + _DuplicateScannerUtils._filterChildsToScanPattern(childs[i].childs, childs[i].operator) + ")"; - } - } - return group; -} - -_DuplicateScannerUtils._filterChildsRowToScanPattern = function (name, operator, value) { - let row = ""; - row = row + name.toLowerCase() + ':({"entityfield":"' + name + '"'; - switch (operator){ - case "NOT_EQUAL": - case "CONTAINSNOT": - row = row + ', "exclude":' + value; - case "ISNOTNULL": - row = row + ', "empty":' + false; - } - row = row + '})'; - return row; -} - -_DuplicateScannerUtils._loadEntityFieldConfigsFromPattern = function(indexPattern) -{ - return indexPattern.match(/[^{}]+(?=\})/g); -} - -_DuplicateScannerUtils._replacePlaceholderForValuesInPattern = function(pIndexPattern, pEntityFieldValueRays) -{ - let INDEX_ENTITY_FIELD_NAME = 0; - let INDEX_ENTITY_FIELD_VALUE = 1; - - let placeholder = ""; - let fieldValue = ""; - for (let i = 0; i < pEntityFieldValueRays.length; i++) - { - placeholder = "{" + pEntityFieldValueRays[i][INDEX_ENTITY_FIELD_NAME] + "}"; - fieldValue = pEntityFieldValueRays[i][INDEX_ENTITY_FIELD_VALUE]; - pIndexPattern = pIndexPattern.replace(placeholder, fieldValue); - } - return pIndexPattern; -} - -_DuplicateScannerUtils._loadEntityIdField = function(pFilterName, pTargetEntity) -{ - return newSelect("ID_FIELD_NAME") - .from("DUPLICATESCANNER") - .where("DUPLICATESCANNER.FILTER_NAME", pFilterName) - .and("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity) - .cell(); -} - -/* - * @see DuplicateScannerUtils.scanForDuplicates for the documentation - */ -_DuplicateScannerUtils._scanForDuplicates = function(pTargetEntity, pEntityFieldConfigValuesRay, -pResultFields, pRecordIdValueToIgnore, pFormatValuesConsumeWebserviceCallback, pUseExternalWebservice, pIndexPattern) -{ - //No filterfields/indexpattern => No indexsearch - if(pEntityFieldConfigValuesRay.length < 1 || pIndexPattern == null || pIndexPattern == "") - return null; - - let possibleDuplicates = []; - let ignoreSourceRecordPattern = _DuplicateScannerUtils._getIgnoreSourceRecordPattern(pRecordIdValueToIgnore); - - let indexPatternWithValues = _DuplicateScannerUtils._replacePlaceholderForValuesInPattern(pIndexPattern, pEntityFieldConfigValuesRay); - - possibleDuplicates = _DuplicateScannerUtils._callIndexSearch(pTargetEntity, indexPatternWithValues, ignoreSourceRecordPattern, pResultFields, 100); - - if(possibleDuplicates == null) - return null; - - possibleDuplicates = possibleDuplicates[indexsearch.HITS]; - - if(pUseExternalWebservice && pFormatValuesConsumeWebserviceCallback != null) - possibleDuplicates = pFormatValuesConsumeWebserviceCallback.apply(this, [possibleDuplicates]); - - return possibleDuplicates; -} - -/* - * Returns a bool which say wether or not an external service should be used - * - * @param {String} pFilterName Name of the filter - * @param {String} pTargetEntity Entity which has been configured - * @returns {Bool} True = use, False = no use - */ -_DuplicateScannerUtils._isUseExternalWebservice = function(pFilterName, pTargetEntity) -{ - let isUseWebservice = newSelect("EXTERNAL_SERVICE_USAGE_ALLOWED") - .from("DUPLICATESCANNER") - .where("DUPLICATESCANNER.FILTER_NAME", pFilterName) - .and("DUPLICATESCANNER.ENTITY_TO_SCAN_NAME", pTargetEntity) - .cell(); - return isUseWebservice != 0; -} - -/* - * Runs the indexsearch based on the given parameters. - * If the "pEntityFieldValueRays" is empty, no search will be executed. + * @param {string} pTargetEntity search for duplicate in this entity e.g.: Organisation_entity + * @param {string} pIndexPattern the index pattern as string + * @param {string=} pSelfId optionally the own id (this will be excluded) * - * @param {String} pTargetEntity Entity which has been configured - * @param {String} pIndexPatternWithValues The pattern used to search. Has to contain the values already. - * @param {String} pIdFilter The filter pattern used to exclude the current record from the result. - * @param {String} pResultFields The result field config. Use "DuplicateScannerUtils.getResultFields" - * @param {String} pResultSetRows todo - * @returns {[["key", "value"]] || null} Array of Key-Value-Pairs based on the configured pResultFields, if no pattern exists null + * @returns {string[]} the duplicate ids */ -_DuplicateScannerUtils._callIndexSearch = function(pTargetEntity, pIndexPatternWithValues, pIdFilter, pResultFields, pResultSetRows) +DuplicateScannerUtils.getDuplicateIds = function(pTargetEntity, pIndexPattern, pSelfId) { - //logging.log(pIndexPatternWithValues) - //The indexPattern can't be null because it is required to run the search. - if(pIndexPatternWithValues == null || pIndexPatternWithValues == "") - return null; let indexQuery = indexsearch.createIndexQuery() - .setPattern(pIndexPatternWithValues) - .setEntities([pTargetEntity]) -// .addFilter(pIdFilter); - // .setDefaultOperator(indexsearch.OPERATOR_AND) - //.addSearchFields("Person_entity.FIRSTNAME", "Person_entity.LASTNAME", "Person_entity.CONTACTID") - //.setRows(pResultSetRows); - if(pIdFilter && pIdFilter.length > 0) - indexQuery.addFilter(pIdFilter); - - indexQuery = _DuplicateScannerUtils._setResultFields(indexQuery, pResultFields); - return indexsearch.searchIndex(indexQuery); -} - -/* - * Sets each field of the given array as resultfield on the given query. - * Supports indexsearch internal fields aswell - * (indexsearch.FIELD_ID, indexsearch.FIELD_TITLE, indexsearch.FIELD_TYPE, indexsearch.FIELD_DESCRIPTION) - * - * @param {IndexQuery} pIndexQuery An indexquery created with "indexsearch.createIndexQuery()" - * @param {String[]} pResultFields The result field config. Use "DuplicateScannerUtils.getResultFields" - * @returns {IndexQuery} IndexQuery with the resultfields set - */ -_DuplicateScannerUtils._setResultFields = function(pIndexQuery, pResultFields) -{ - let resultIndexFields = []; - let resultFields = []; - for (let i = 0; i < pResultFields.length; i++) + .setPattern(pIndexPattern) + .setEntities([pTargetEntity]); + if(pSelfId) { - if(pResultFields[i] == indexsearch.FIELD_ID - || pResultFields[i] == indexsearch.FIELD_TITLE - || pResultFields[i] == indexsearch.FIELD_TYPE - || pResultFields[i] == indexsearch.FIELD_DESCRIPTION) - { - resultIndexFields.push(pResultFields[i]); - } - else - resultFields.push(pResultFields[i]); + // creates -_local_id_:"<pSelfId>" + var optFilter = indexsearch.buildPattern(indexsearch.createPatternConfig().minus( + indexsearch.createPhraseTerm(pSelfId) + .setIndexField(indexsearch.FIELD_ID) + )); + indexQuery = indexQuery.addFilter(optFilter); } - if(resultIndexFields.length > 0) - pIndexQuery = pIndexQuery.addResultIndexFields(resultIndexFields); - - if(resultFields.length > 0) + var indexResult = indexsearch.searchIndex(indexQuery); + indexResult = indexResult[indexsearch.HITS]; + if(indexResult === null || indexResult.length === 0) { - pIndexQuery = pIndexQuery.addResultFields(resultFields); + return []; } - return pIndexQuery; -} - -/* - * Creates the queries to insert new duplicates into a new cluster based on the pDuplicatesRay - * - * @param {String[]} pDuplicatesRay Array of duplicate ids - * @param {String} pTargetEntity Entity which has been configured - * @returns {String[]} Array of insert queries - */ -_DuplicateScannerUtils._createInsertDuplicatesClusterQuery = function (pDuplicatesRay, pTargetEntity) -{ - return _DuplicateScannerUtils._createInsertDuplicatesClusterQuery(pDuplicatesRay, pTargetEntity, util.getNewUUID()); -} - -/* - * Creates the queries to insert new duplicates into a new cluster based on the pDuplicatesRay - * - * @param {String[]} pDuplicatesRay Array of duplicate ids - * @param {String} pTargetEntity Entity which has been configured - * @param {String} pClusterId Clusters id to which the duplicates are in relation - * @returns {String[]} Array of insert queries - */ -_DuplicateScannerUtils._createInsertDuplicatesClusterQuery = function (pDuplicatesRay, pTargetEntity, pClusterId) -{ - let duplicatesToInsertQueries = []; - let cols = ["ID", "CLUSTERID", "DUPLICATEID", "TARGET_ENTITY"]; - if (!pClusterId) - pClusterId = util.getNewUUID(); - - for (let i = 0; i < pDuplicatesRay.length; i++) + var duplicateIds = []; + indexResult.forEach(function(curr) { - let newId = util.getNewUUID(); - let valuesToInsert = [newId, pClusterId, pDuplicatesRay[i], pTargetEntity]; - - duplicatesToInsertQueries.push(["DUPLICATECLUSTERS", cols, null, valuesToInsert]); - } - return duplicatesToInsertQueries; -} - -/* - * Deletes all clusters - * - * @returns {String} Count of records deleted - */ -_DuplicateScannerUtils._deleteDuplicateClusters = function () -{ - return db.deleteData("DUPLICATECLUSTERS"); -} - -/* - * All records with contactId = sourceContactId get updated, which are not assigned to the same "group" as the targetContactId. - * This is because otherwise there would now be in total two "participants" in the same "group" as opposed to one before. - * Also if they already are in the same "group" those records shouldn't be updated because it would lead to the same outcome. - * - * @returns {Boolean} If records have been updated - */ -_DuplicateScannerUtils._migrateParticipantsToNewContact = function (pTableName, pContactIdColumn, pAssignableIdColumn, pSourceContactId, pTargetContactId) -{ - var excludedIds = newSelect(pAssignableIdColumn) - .from(pTableName) - .where([pTableName, pContactIdColumn], pTargetContactId) - .arrayColumn(); - - var updateCount = newWhereIfSet([pTableName, pAssignableIdColumn], excludedIds, SqlBuilder.NOT_IN()) - .and([pTableName, pContactIdColumn], pSourceContactId) - .updateFields(new Map().set(pContactIdColumn, pTargetContactId), pTableName); - - var deleteCount = newWhere([pTableName, pContactIdColumn], pSourceContactId) - .tableName(pTableName) - .deleteData(); - - return updateCount > 0 || deleteCount > 0; -} - -_DuplicateScannerUtils._buildDeleteOrganisationAndContactQuery = function(pSourceOrganisationId, pSourceContactId) -{ - return [ - newWhere("ORGANISATION.ORGANISATIONID", pSourceOrganisationId).buildDeleteStatement(), - newWhere("CONTACT.CONTACTID", pSourceContactId).buildDeleteStatement() - ]; -} - -_DuplicateScannerUtils._buildDeleteCachedUnrelatedDuplicateQuery = function(pSourceContactId) -{ - return [ - newWhere("UNRELATEDDUPLICATES.SOURCEDUPLICATEID", pSourceContactId).buildDeleteStatement(), - newWhere("UNRELATEDDUPLICATES.UNRELATEDDUPLICATEID", pSourceContactId).buildDeleteStatement() - ]; -} - -/* - * Creates a filter pattern which excludes results with the provided id from the search. - * - * @param {String} pRecordIdValueToIgnore The id value to exclude from the result. - * @returns {String} Filter pattern which excludes hits with the given id (index) from the result. - */ -_DuplicateScannerUtils._getIgnoreSourceRecordPattern = function(pRecordIdValueToIgnore) -{ - // creates -_local_id_:"<pRecordIdValueToIgnore>" - if(pRecordIdValueToIgnore && pRecordIdValueToIgnore.length > 0) - return indexsearch.buildPattern(indexsearch.createPatternConfig().minus( - indexsearch.createPhraseTerm(pRecordIdValueToIgnore) - .setIndexField(indexsearch.FIELD_ID) - )); - return null; -} - -_DuplicateScannerUtils._migrateLinkedContactData = function (pSourceContactId, pTargetContactId) -{ - var updateStatements = new Map(); - var currentAlias = db.getCurrentAlias(); - - var setStandardsStatements = []; - var [standardPhone, standardMail, standardAddressId] = newSelect([ - "(" + CommUtil.getStandardSubSqlPhone() + ")", - "(" + CommUtil.getStandardSubSqlMail() + ")", - "CONTACT.ADDRESS_ID" - ]) - .from("CONTACT") - .where("CONTACT.CONTACTID", pTargetContactId) - .arrayRow(); - - //if the targetContact already has a standard phone comm, set the comm from the sourceContact as not standard - if (standardPhone) - { - setStandardsStatements.push( - newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId) - .and("COMMUNICATION.MEDIUM_ID", CommUtil.getMediumIdsByCategory("PHONE"), SqlBuilder.IN()) - .buildUpdateStatement({"ISSTANDARD" : "0"}) - ); - } - if (standardMail) - { - setStandardsStatements.push( - newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId) - .and("COMMUNICATION.MEDIUM_ID", CommUtil.getMediumIdsByCategory("EMAIL"), SqlBuilder.IN()) - .buildUpdateStatement({"ISSTANDARD" : "0"}) - ); - } - //set the standardaddress of the sourceContact as standard of the targetContact if it doesn't have one set yet - if(!standardAddressId) - { - var sourceStandard = newSelect("CONTACT.ADDRESS_ID") - .from("CONTACT") - .where("CONTACT.CONTACTID", pSourceContactId) - .cell(); - setStandardsStatements.push(newWhere("CONTACT.CONTACTID", pTargetContactId).buildUpdateStatement({"ADDRESS_ID": sourceStandard})); - } - - updateStatements.set(currentAlias, setStandardsStatements); - - _DuplicateScannerUtils._getLinkedTableInfos(pTargetContactId).forEach(function ([tableName, columnName, additionalCondition, dbAlias]) - { - if (!dbAlias) - dbAlias = currentAlias; - - if (!updateStatements.has(dbAlias)) - updateStatements.set(dbAlias, []); - var statements = updateStatements.get(dbAlias); - - var updateValues = {}; - updateValues[columnName] = pTargetContactId; - - var updateCondition = new SqlBuilder(dbAlias).where([tableName, columnName], pSourceContactId).andIfSet(additionalCondition); - - //push must be used here to keep the reference - statements.push(updateCondition.buildUpdateStatement(updateValues, tableName)); + duplicateIds.push(curr[indexsearch.FIELD_ID]); }); - - var totalChanges = 0; - - updateStatements.forEach(function (statements, alias) - { - totalChanges += db.updates(statements, alias); - }); - - totalChanges += newWhere("COMMUNICATION.CONTACT_ID", pSourceContactId).deleteData(); //delete leftover communications from the source contact - totalChanges += new AttributeRelationQuery(pSourceContactId).deleteAllAttributes(); //delete leftover attributes - - return totalChanges > 0; -} - -/* - * Contains all Tables and their fields which may contain the contact id to be replaced for the data alias - * - * @returns {String[[]]} Array in the format [TableName, ContactIdColumnName, AdditionalCondition, alias] - */ -_DuplicateScannerUtils._getLinkedTableInfos = function(pTargetContactId) -{ - //don't use communications that the target already has - var targetComms = newSelect("COMMUNICATION.ADDR") - .from("COMMUNICATION") - .where("COMMUNICATION.CONTACT_ID", pTargetContactId) - .arrayColumn(); - - var communicationDedupCondition = targetComms.length > 0 - ? newWhere("COMMUNICATION.ADDR", targetComms, SqlBuilder.NOT_IN()) - : ""; - - return[ - ["AB_APPOINTMENTLINK", "OBJECT_ROWID"], - ["AB_CTILOG", "CONTACT_ID"], - ["AB_OBJECTRELATION", "AB_OBJECTRELATIONID"], - ["AB_OBJECTRELATION", "OBJECT1_ROWID"], - ["AB_OBJECTRELATION", "OBJECT2_ROWID"], - ["AB_LOGHISTORY", "TABLENAMEID"], - ["ADDRESS", "CONTACT_ID"], - ["BULKMAILRECIPIENT", "CONTACT_ID"], - ["BULKMAIL", "TESTING_CONTACT_ID"], - ["CAMPAIGN", "EMPLOYEE_CONTACT_ID"], - ["CAMPAIGNSTEP", "EMPLOYEE_CONTACT_ID"], - ["COMMRESTRICTION", "CONTACT_ID"], - ["COMMRESTRICTION", "EMPLOYEE_INVOLVED"], - ["COMMUNICATION", "CONTACT_ID", communicationDedupCondition], - ["COMPETITION", "CONTACT_ID"], - ["CONTRACT", "CONTACT_ID"], - ["LETTERRECIPIENT", "CONTACT_ID"], - ["OBJECTMEMBER", "CONTACT_ID"], - ["OFFER", "CONTACT_ID"], - ["PRODUCT", "CONTACT_ID"], - ["PRODUCTPRICE", "CONTACT_ID"], - ["SALESORDER", "CONTACT_ID"], - ["SALESPROJECT", "CONTACT_ID"], - ["TASK", "REQUESTOR_CONTACT_ID"], - ["TASK", "EDITOR_CONTACT_ID"], - ["TASKLINK", "OBJECT_ROWID"], - ["ACTIVITY", "RESPONSIBLE"], - ["DSGVO", "CONTACT_ID"], - ["DSGVOINFO", "CONTACT_ID"], - ["TIMETRACKING", "CONTACT_ID"], - ["ACTIVITYLINK", "OBJECT_ROWID"], - ["AB_ATTRIBUTERELATION", "OBJECT_ROWID"], - - ["ASYS_CALENDARLINK", "DBID", "", SqlUtils.getSystemAlias()] - ]; -} - - -/* - * Returns wether or not a value should be substring'd - * - * @return true if pCountCharsOfValueToUse is a number, greater than 0 and smaller than the values length - */ -_DuplicateScannerUtils._isValueLongerThanCharsToUse = function(pValueLength, pCountCharsOfValueToUse) -{ - return !isNaN(pCountCharsOfValueToUse) - && pCountCharsOfValueToUse > 0 - && pValueLength > pCountCharsOfValueToUse; -} - -/* - * Returns wether or not the parameter isnt null and a number or not - * - * @param {String} pCountCharsOfValueToUse Hopefully a number - * @returns {String} True if parameter isnt null and a number, False if it's null or no number - */ -_DuplicateScannerUtils._isNotNullAndANumber = function(pCountCharsOfValueToUse) -{ - return pCountCharsOfValueToUse != null && !isNaN(pCountCharsOfValueToUse); + return duplicateIds; } -/* - * Persons get reassigned to new organisation - * - * @returns {Boolean} If records have been updated +/** + * Does the same as getDuplicateIds but takes in a scanner (by entity) instead of an indexPattern + * + * @param {string} pTargetEntity the entity name used to get the Scanner + * @param {string} pTargetUid all variables will be loaded by this id + * + * @returns {string[]} the duplicate ids */ -_DuplicateScannerUtils._migratePersonsToNewOrganisation = function (pSourceOrganisationId, pTargetOrganisationId) +DuplicateScannerUtils.getDuplicateIdsByEntityScanner = function(pTargetEntity, pTargetUid) { - var updateCount = newWhereIfSet(["CONTACT", "ORGANISATION_ID"], pSourceOrganisationId) - .and("PERSON_ID is not null") - .updateFields(new Map().set("ORGANISATION_ID", pTargetOrganisationId), "CONTACT"); - - var deleteCount = newWhere(["CONTACT", "ORGANISATION_ID"], pSourceOrganisationId) - .and("PERSON_ID is not null") - .deleteData(); - return updateCount > 0 || deleteCount > 0; -} + var scanner = DuplicateScannerUtils.getScannerByEntity(pTargetEntity); + var indexsearchFilter = IndexsearchFilterUtils.fromFilter(scanner.filter); -/* - * Person and organisations keep the max_count = 1 attribute of the target and the one from the source is deleted - * - * @returns {Boolean} If records have been deleted - */ -_DuplicateScannerUtils._deleteUniqueAttributes = function (pSourceContactId, pTargetContactId) -{ - var targetAttrUnique = newSelect("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID") - .from("AB_ATTRIBUTERELATION") - .join("AB_ATTRIBUTEUSAGE on AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID = AB_ATTRIBUTEUSAGE.AB_ATTRIBUTE_ID") - .where("AB_ATTRIBUTEUSAGE.MAX_COUNT = 1") - .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", pTargetContactId) - .table(); - var deleteCount = 0; + var targetLoadConfig = entities.createConfigForLoadingRows() + .entity(pTargetEntity) + .uid(pTargetUid) // Array.from because getFields returns a Set + .fields(Array.from(indexsearchFilter.getFields())); + var targetRow = entities.getRow(targetLoadConfig); - targetAttrUnique.forEach(function(attribute){ - deleteCount += newWhereIfSet("AB_ATTRIBUTERELATION.AB_ATTRIBUTE_ID", attribute) - .and("AB_ATTRIBUTERELATION.OBJECT_ROWID", pSourceContactId) - .deleteData(); - }); - - return deleteCount > 0; + var indexPattern = indexsearchFilter.buildQuery(targetRow); + return DuplicateScannerUtils.getDuplicateIds(pTargetEntity, indexPattern, pTargetUid); } -/* - * Update other contacts from the source - * - * @returns {Boolean} If records have been updated +/** + * Does the same as getDuplicateIdsByEntityScanner + * but the variables are directly passed in as an argument + * + * @param {string} pTargetEntity the entity name used to get the Scanner + * @param {object} pEntityObj the variables (should include all variables needed to build the indexPattern) + * + * @returns {string[]} the duplicate ids */ - _DuplicateScannerUtils._updateOtherContacts = function (pSourceContactId, sourcePersonId, targetPersonId) +DuplicateScannerUtils.getDuplicateIdsByEntityObj = function(pTargetEntity, pEntityObj) { - var otherContacts = newSelect("PERSON.PERSONID") - .from("PERSON") - .join("CONTACT", "CONTACT.PERSON_ID = PERSON.PERSONID") - .where("PERSON.PERSONID", sourcePersonId) - .and("CONTACT.CONTACTID", pSourceContactId, SqlBuilder.NOT_EQUAL()) - .table(); - var updateCount = 0; - - otherContacts.forEach(function(person){ - updateCount += newWhere("CONTACT.PERSON_ID", person) - .updateFields({"PERSON_ID" : targetPersonId}, "CONTACT"); - }); - - return updateCount > 0; -} \ No newline at end of file + var scanner = DuplicateScannerUtils.getScannerByEntity(pTargetEntity); + var indexsearchFilter = IndexsearchFilterUtils.fromFilter(scanner.filter); + var indexPattern = indexsearchFilter.buildQuery(pEntityObj); + return DuplicateScannerUtils.getDuplicateIds(pTargetEntity, indexPattern, pEntityObj[scanner.idField]); +} diff --git a/process/Email_lib/process.js b/process/Email_lib/process.js index 61787a5d831ae07d315df9530951b04849e2b560..2bb2c3d1239b1458fed124790bb58827b0f15fab 100644 --- a/process/Email_lib/process.js +++ b/process/Email_lib/process.js @@ -1,19 +1,20 @@ +import("system.translate"); import("system.question"); -import("Sql_lib"); -import("MimeType_lib"); -import("Document_lib"); import("system.logging"); -import("system.translate"); import("system.text"); -import("system.db"); -import("system.util"); -import("Communication_lib"); -import("DocumentTemplate_lib"); import("system.neon"); import("system.mail"); -import("Bulkmail_lib"); import("system.tools"); +import("system.util"); +import("system.db"); +import("KeywordRegistry_basic"); +import("DocumentTemplate_lib"); +import("Communication_lib"); import("EmailUtil_lib"); +import("Bulkmail_lib"); +import("MimeType_lib"); +import("Document_lib"); +import("Sql_lib"); function EmailWritingUtils () {} @@ -89,9 +90,10 @@ EmailWritingUtils.openMailTemplate = function (pToRecipients, pSenderContactId, * @param {String} pEmailFilename optional file name of the email. * @param {String} [pAdditionalPlaceholders] additional placeholders for the email * @param {Array[]} [pUpdateStatements] an array with update statements which will be executed after email is downloaded/sent. - * @param {String} pTypeClassification Documenttemplatetypeclassification + * @param {String} pDocumentTemplateType The document template type (single or serial - <b><u><i>use keyword!</i></u></b>). */ -EmailWritingUtils.openNewMail = function (pToContactId, pToEmailAddress, pComingFrom, pAttachmentArray, pNotificationMsg, pEmailFilename, pAdditionalPlaceholders, pUpdateStatements, pTypeClassification) +EmailWritingUtils.openNewMail = function (pToContactId, pToEmailAddress, pComingFrom, pAttachmentArray, pNotificationMsg, pEmailFilename, + pAdditionalPlaceholders, pUpdateStatements, pDocumentTemplateType) { var params = { "ContactId_param" : pToContactId, @@ -101,7 +103,7 @@ EmailWritingUtils.openNewMail = function (pToContactId, pToEmailAddress, pComing "EmailFilename" : pEmailFilename, "AdditionalPlaceholders_param" : JSON.stringify(pAdditionalPlaceholders), "UpdateStatements_param" : JSON.stringify(pUpdateStatements), - "DocumentTemplateTypeClassification_param" : pTypeClassification + "DocumentTemplateTypeClassification_param" : pDocumentTemplateType }; if (pToEmailAddress) @@ -120,16 +122,18 @@ EmailWritingUtils.getMailbridgeAddress = function () * Opens a view where the email with the report(s) can be downloaded as .eml * and after that it can be sent with e.g. Thunderbird * + * Report have to be a object with these attrs: content (base64 encoded report), contentType (mimeType of the report), filename (complete filename with filending) * @param {String} pRecipient Contact id of the recipient. * @param {String} pComingFrom source from where you started (e.g. "Person", "Organisation") * @param {Array} pReportArray array with reports. * @param {String} pNotificationMsg message which will be shown after the operation is done. * @param {String} pEmailFilename optional file name of the email. * @param {String} [pAdditionalPlaceholders] additional placeholders for the email - * @param {String} [pOfferId] optional needed for the offerEmails, to change the status of the offer - * Report have to be a object with these attrs: content (base64 encoded report), contentType (mimeType of the report), filename (complete filename with filending) + * @param {String} [pUpdateStatements] Opt. update-statements which will be executed, after download process is started. + * @param {String} pDocumentTemplateType The document template type (single or serial - <b><u><i>use keyword!</i></u></b>). */ -EmailWritingUtils.sendReportAsMail = function (pRecipient, pReportArray, pComingFrom, pNotificationMsg, pEmailFilename, pAdditionalPlaceholders, pOfferId) +EmailWritingUtils.sendReportAsMail = function (pRecipient, pReportArray, pComingFrom, pNotificationMsg, pEmailFilename, pAdditionalPlaceholders, + pUpdateStatements, pDocumentTemplateType) { var pRecpientEmail; @@ -141,7 +145,8 @@ EmailWritingUtils.sendReportAsMail = function (pRecipient, pReportArray, pComing pRecpientEmail = null; } - EmailWritingUtils.openNewMail(pRecipient, pRecpientEmail, pComingFrom, pReportArray, pNotificationMsg, pEmailFilename, pAdditionalPlaceholders, pOfferId); + EmailWritingUtils.openNewMail(pRecipient, pRecpientEmail, pComingFrom, pReportArray, pNotificationMsg, pEmailFilename, pAdditionalPlaceholders, + pUpdateStatements, pDocumentTemplateType); } /** @@ -397,7 +402,7 @@ Email.prototype.send = function (pUser) let mailbridgeExists = tools.getUser(mailbridgeTitle); if(mailbridgeExists) - mail.sendMailAs(mailbridgeTitle, mailId) + sentMails = mail.sendMailAs(mailbridgeTitle, mailId) else //check mailbridge user if this error gets thrown question.showMessage(translate.withArguments("Mailbridge failed: user '%0' is unknown, contact an administrator.", [mailbridgeTitle]), question.ERROR, translate.text("Error")); } diff --git a/process/IncomingEmailExecutor_lib/process.js b/process/IncomingEmailExecutor_lib/process.js index acd4c707cd7141cea4d447a432df02e3a9adec54..7557234d79c3a1f068fa2b7d3418244712e46c9d 100644 --- a/process/IncomingEmailExecutor_lib/process.js +++ b/process/IncomingEmailExecutor_lib/process.js @@ -200,10 +200,10 @@ IncomingEmailExecutor.prototype.createActivity = function(pAdditionalLinks) directionKeywordId: this.activityData.direction || this.failbackActivityData.direction }; - if (vars.get("$sys.isclient")){ + if (vars.get("$sys.isclient") == "true"){ activityDataForInsert.responsibleContactId = EmployeeUtils.getCurrentContactId(); } else { - activityDataForInsert.responsibleContactId = this.activityData.employeeContactId || this.failbackActivityData.employeeContactId; + activityDataForInsert.responsibleContactId = this.activityData.employeeContactId ? this.activityData.employeeContactId : this.failbackActivityData.employeeContactId; } var activityLinks = this.activityData.links || this.failbackActivityData.links; diff --git a/process/IndexSearch_lib/process.js b/process/IndexSearch_lib/process.js index be35ad2cc8c0a24fabe76bd57ba2a64d9ce9b310..549aefab097b21cce5c1053bf013ec1daa322be9 100644 --- a/process/IndexSearch_lib/process.js +++ b/process/IndexSearch_lib/process.js @@ -1,3 +1,4 @@ +import("system.indexsearch"); import("system.neon"); import("system.text"); @@ -160,4 +161,146 @@ IndexsearchUtils.createAffectedInfoContainer = function(changedIdValue, changedT } }); return res; -} \ No newline at end of file +} + + +/** + * Static utility class for constructing an indexsearch pattern + */ +function IndexsearchFilterUtils() {} + +/** + * Creates an indexsearch pattern from a filter + * + * @param {object} pFilter the filter in json representation + * + * @returns {IndexsearchFilterGroup|IndexsearchFilterRow} the IndexSearchFilter object + */ +IndexsearchFilterUtils.fromFilter = function(pFilter) +{ + if(pFilter["type"] == "group") + { + return IndexsearchFilterGroup.fromFilter(pFilter["childs"], pFilter["operator"]); + } + else if(pFilter["type"] == "row") + { + return IndexsearchFilterRow.fromFilter(pFilter["name"], pFilter["operator"], pFilter["value"]); + } + throw new Error("Unknown filter node type: " + pFilter["type"]); +} + + +/** + * The IndexsearchFilterGroup object represents the a filter group + * and is able to generate the corrosponding indexsearch pattern + * + * @param {(IndexsearchFilterGroup|IndexsearchFilterRow)[]} pChilds the child filterrows/filtergroups + * @param {string} pOperator the operator for the group can either be 'AND' or 'OR' + */ +function IndexsearchFilterGroup(pChilds, pOperator) +{ + this.childs = pChilds; + this.operator = pOperator; +} + +/** + * Returns all fiels as Set witch are required for this filter + * + * @returns {Set<string>} The fields as Set + */ +IndexsearchFilterGroup.prototype.getFields = function() +{ + var fields = new Set(); + for(let i = 0; i < this.childs.length; i++) + { + this.childs[i].getFields().forEach(fields.add, fields); + } + return fields; +} + +/** + * Builds the index pattern and returns it as string + * + * @param {Record<string, string>} pFieldValues the field name value pair + */ +IndexsearchFilterGroup.prototype.buildQuery = function(pFieldValues) +{ + return this.childs.map(function(curr) { return curr.buildQuery(pFieldValues); }) + .filter(function(curr) { return curr != null; }) + .join(" " + this.operator + " "); +} + +/** + * Creates a new IndexsearchFilterGroup object + * + * @param {(IndexsearchFilterGroup|IndexsearchFilterRow)[]} pChilds the child filterrows/filtergroups + * @param {string} pOperator the operator for the group can either be 'AND' or 'OR' + */ +IndexsearchFilterGroup.fromFilter = function(pChilds, pOperator) +{ + return new IndexsearchFilterGroup( + pChilds.map(function(curr) + { + return IndexsearchFilterUtils.fromFilter(curr); + }), + pOperator + ); +} + + +function IndexsearchFilterRow(pName, pEmpty, pExclude) +{ + this.name = pName; + this.empty = pEmpty; + this.exclude = pExclude; +} + +/** + * Returns all fiels as Set witch are required for this filter + * + * @returns {Set<string>} The fields as Set + */ +IndexsearchFilterRow.prototype.getFields = function() +{ + return new Set([this.name]); +} + +/** + * Builds the index pattern and returns it as string + * + * @param {Record<string, string>} pFieldValues the field name value pair + */ +IndexsearchFilterRow.prototype.buildQuery = function(pFieldValues) +{ + var fieldValue = pFieldValues[this.name] ? pFieldValues[this.name] : ""; + if(!this.empty && fieldValue == "") + { + return null; + } + var valueStr = fieldValue; + for(let i = 0; i < this.exclude.length; i++) + { + valueStr = valueStr.replace(new RegExp(this.exclude[i], "gi"), ""); + } + return this.name.toLowerCase() + ':("' + indexsearch.escapeString(valueStr.trim().replace(/\s+/g, "")) + '")'; +} + +/** + * Creates a new IndexsearchFilterGroup object + * + * @param {string} pName the row field name + * @param {string} pOperator the operator for the group can either be 'AND' or 'OR' + * @param {string} pValue the field valze + */ +IndexsearchFilterRow.fromFilter = function(pName, pOperator, pValue) +{ + if(pOperator == "NOT_EQUAL" || pOperator == "CONTAINSNOT") + { + return new IndexsearchFilterRow(pName, true, JSON.parse(pValue)); + } + else if(pOperator == "ISNOTNULL") + { + return new IndexsearchFilterRow(pName, false, []); + } + throw new Error("Unknown filterrow operator: " + pOperator); +} diff --git a/process/KeywordRegistry_basic/process.js b/process/KeywordRegistry_basic/process.js index 2ae0206e4c39a9c54e875dee258ac76d8b3fb761..defb4e85cb3a5ccdc2553cd3e1932668f03d7d26 100644 --- a/process/KeywordRegistry_basic/process.js +++ b/process/KeywordRegistry_basic/process.js @@ -42,6 +42,7 @@ $KeywordRegistry.contactStatus = function(){return "ContactStatus";}; $KeywordRegistry.contactStatus$active = function(){return "CONTACTSTATACTIVE";}; $KeywordRegistry.contactStatus$inactive = function(){return "CONTACTSTATINACTIVE";}; $KeywordRegistry.contactStatus$inReview = function(){return "CONTACTSTATREVIEW";}; +$KeywordRegistry.contactStatus$markToDelete = function(){return "CONTACTSTATDELETE";}; $KeywordRegistry.currency = function(){return "Currency";}; $KeywordRegistry.currency$eur = function(){return "EUR";}; @@ -200,6 +201,7 @@ $KeywordRegistry.dsgvoStatuoritysource = function(){return "DSGVOStatuoritysourc $KeywordRegistry.dsgvoType = function() {return "DSGVOType";}; $KeywordRegistry.dsgvoType$birth = function(){return "TYPE_BIRTH";}; +$KeywordRegistry.dsgvoType$privacyNotice = function(){return "TYPE_PRIVACY_NOTICE";}; $KeywordRegistry.dsgvoTransmission = function() {return "DSGVOTransmission";}; $KeywordRegistry.dsgvoTransmission$none = function(){return "DSGVONONE";}; @@ -212,6 +214,13 @@ $KeywordRegistry.dsgvoDeadline$complex = function(){return "DSGVODEADLINECOMPLEX $KeywordRegistry.dsgvoDeadline$count = function(){return "DSGVODEADLINECOUNT";}; $KeywordRegistry.dsgvoGuarantee = function() {return "DSGVOGuarantee";}; +$KeywordRegistry.dsgvoConfiguration = function() {return "DSGVOConfiguration";}; +$KeywordRegistry.dsgvoConfiguration$config = function() {return "DSGVO_CONFIGURATION";}; +$KeywordRegistry.dsgvoConfiguration$configId = function() {return "51f106b6-b593-4279-bf39-c8d226ebc607";}; + +$KeywordRegistry.dsgvoReason = function(){ return "DSGVOReason";}; +$KeywordRegistry.dsgvoReason$manuel = function(){ return "607cfce8-1cc3-466e-9a69-4f0c9cf7e391";}; + $KeywordRegistry.textPlaceholder = function(){return "textPlaceholder";}; $KeywordRegistry.communicationMediumCampaign = function(){return "CommunicationMediumCampaign";}; @@ -363,4 +372,33 @@ $KeywordRegistry.forecastKind$planning = function(){return "PLANNING";} $KeywordRegistry.forecastStatus = function(){return "ForecastStatus";} $KeywordRegistry.forecastStatus$inPlanning = function(){return "IN_PLANNING";} $KeywordRegistry.forecastStatus$locked = function(){return "LOCKED";} -$KeywordRegistry.forecastStatus$planned = function(){return "PLANNED";} \ No newline at end of file +$KeywordRegistry.forecastStatus$planned = function(){return "PLANNED";} +$KeywordRegistry.checklistEntryType$auto = function(){return "AUTO";} + +$KeywordRegistry.communicationSettingStatus = function(){return "CommunicationSettingStatus";}; +$KeywordRegistry.communicationSettingStatus$pending = function(){return "COMMUNICATION_PENDING";}; +$KeywordRegistry.communicationSettingStatus$allowed = function(){return "COMMUNICATION_ALLOWED";}; +$KeywordRegistry.communicationSettingStatus$rejected = function(){return "COMMUNICATION_REJECTED";}; + +$KeywordRegistry.communicationChannelType = function(){return "CommunicationChannelType";}; +$KeywordRegistry.communicationChannelType$profiling = function(){return "COMMUNICATIONCHANNEL_PROFILING";}; +$KeywordRegistry.communicationChannelType$global = function(){return "COMMUNICATIONCHANNEL_GLOBAL";}; +$KeywordRegistry.communicationChannelType$communication = function(){return "COMMUNICATIONCHANNEL_COMMUNICATION";}; +$KeywordRegistry.communicationChannelType$address = function(){return "COMMUNICATIONCHANNEL_ADDRESS";}; + +$KeywordRegistry.weblinkType = function(){return "WeblinkType";}; +$KeywordRegistry.weblinkType$EMail = function() {return "WEBLINK_EMAIL"}; + +$KeywordRegistry.interestStatus = function(){return "InterestStatus";}; +$KeywordRegistry.interestStatus$active = function(){return "INTEREST_ACTIVE";}; +$KeywordRegistry.interestStatus$inactive = function(){return "INTEREST_INACTIVE";}; + +$KeywordRegistry.interestLinkStatus = function(){return "InterestLinkStatus";}; +$KeywordRegistry.interestLinkStatus$subscribed = function(){return "INTERESTLINK_SUBSCRIBED";}; +$KeywordRegistry.interestLinkStatus$notSubscribed = function(){return "INTERESTLINK_NOTSUBSCRIBED";}; + +$KeywordRegistry.deviceType = function(){return "DeviceType";}; +$KeywordRegistry.interestLinkStatus$notSubscribed = function(){return "INTERESTLINK_NOTSUBSCRIBED";}; + +$KeywordRegistry.communicationBlacklistType = function(){return "CommunicationBlacklistType";}; +$KeywordRegistry.communicationBlacklistType$emailRecipientFilter = function(){return "BLACKLIST_TYPE_EMAILRECIPIENT_FILTER";}; \ No newline at end of file diff --git a/process/Keyword_lib/process.js b/process/Keyword_lib/process.js index 3f33564d881f46aa07e062522eb22d7a89dbbea8..4d7f8120f6aea55a909bf5caa13530687fbf07d1 100644 --- a/process/Keyword_lib/process.js +++ b/process/Keyword_lib/process.js @@ -201,16 +201,18 @@ KeywordUtils.getEntryNamesByContainer = function(pContainerName, pLocale) * * @param {String} pContainerName name of the keyword container for filtering * @param {String} [pLocale=locale depending on current client/servercontext] Language-value for translations +* @param {boolean=} pOnlyActive if true only active keywords will be returned * * @return {String[]} 2D-Array in the form of [[id1, translatedTitle1], [idN, translatedTitleN]] */ -KeywordUtils.getEntryNamesAndIdsByContainer = function(pContainerName, pLocale) +KeywordUtils.getEntryNamesAndIdsByContainer = function(pContainerName, pLocale, pOnlyActive) { //TODO: this can be propably removed when the "Salesproject_entity.REASONS.dropDownProcess.js" is replaced by a consumer var list = newSelect("AB_KEYWORD_ENTRY.KEYID, AB_KEYWORD_ENTRY.TITLE") .from("AB_KEYWORD_ENTRY") .join("AB_KEYWORD_CATEGORY", "AB_KEYWORD_ENTRY.AB_KEYWORD_CATEGORY_ID = AB_KEYWORD_CATEGORY.AB_KEYWORD_CATEGORYID") .where("AB_KEYWORD_CATEGORY.NAME", pContainerName) + .andIfSet("AB_KEYWORD_ENTRY.ISACTIVE", pOnlyActive ? "1" : null) .orderBy("AB_KEYWORD_ENTRY.SORTING asc, AB_KEYWORD_ENTRY.TITLE asc") .table(); diff --git a/process/Leadimport_lib/process.js b/process/Leadimport_lib/process.js index d37c1f78ac48bda146e8791629958fe82d076044..1859595621f80e74f67d3b93cbd5959a5746cb60 100644 --- a/process/Leadimport_lib/process.js +++ b/process/Leadimport_lib/process.js @@ -918,19 +918,19 @@ LeadImportUtils.scanLeadDups = function(pAllContactData) if (orgObj != undefined && Object.keys(orgObj).length > 0)//checks if there is an ORGANISATIONDUPLICATE { - let scanResultsOrg = DuplicateScannerUtils.scanForDuplicates("OrganisationDuplicates", "Organisation_entity", orgObj, null); - if (scanResultsOrg != null && scanResultsOrg.length > 0) + let scanResultsOrg = DuplicateScannerUtils.getDuplicateIdsByEntityObj("Organisation_entity", orgObj); + if (scanResultsOrg.length > 0) { - let insertCountOrg = DuplicateScannerUtils.cacheNewScanResults(orgObj["CONTACTID"], scanResultsOrg, "Organisation_entity"); + DuplicateScannerUtils.insertHasDuplicateEntry("Organisation_entity", orgObj["CONTACTID"], scanResultsOrg); dupOrg = true; } } if (persObj != undefined && Object.keys(persObj).length > 0)//checks if there is an PERSONDUPLICATE { - let scanResultsPers = DuplicateScannerUtils.scanForDuplicates("PersonDuplicates", "Person_entity", persObj, null); - if (scanResultsPers != null && scanResultsPers.length > 0) + let scanResultsPers = DuplicateScannerUtils.getDuplicateIdsByEntityObj("Person_entity", persObj); + if (scanResultsPers.length > 0) { - let insertCountPers = DuplicateScannerUtils.cacheNewScanResults(persObj["CONTACTID"], scanResultsPers, "Person_entity"); + DuplicateScannerUtils.insertHasDuplicateEntry("Person_entity", persObj["CONTACTID"], scanResultsPers); dupPers = true; } } diff --git a/process/MarketingCondition_lib/MarketingCondition_lib.aod b/process/MarketingCondition_lib/MarketingCondition_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..5e55b885b065114498b81f6bb9b0c95e4eafbb67 --- /dev/null +++ b/process/MarketingCondition_lib/MarketingCondition_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>MarketingCondition_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/MarketingCondition_lib/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/MarketingCondition_lib/process.js b/process/MarketingCondition_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..2053acd67b4992dadcbb7c8048dbd530d4e80b3b --- /dev/null +++ b/process/MarketingCondition_lib/process.js @@ -0,0 +1,206 @@ +import("Util_lib"); +import("JditoFilter_lib"); +import("system.vars"); +import("Sql_lib"); +import("KeywordRegistry_basic"); + +/** + * Object for building communication settings sql conditions. + */ +function CommunicationSettingsCondition () +{ + this._contactIdSql = "CONTACT.CONTACTID"; + this._channelType = null; + this._medium = null; + this._channelIdSql = null; + this._settingStatus = null; + this._existsOperator = SqlBuilder.EXISTS(); +} + +CommunicationSettingsCondition.prototype.contactIdField = function (pContactIdSql) +{ + this._contactIdSql = pContactIdSql; + return this; +} + +CommunicationSettingsCondition.prototype.existNoSettings = function () +{ + this._existsOperator = SqlBuilder.NOT_EXISTS(); + return this; +} + +CommunicationSettingsCondition.prototype.existSettings = function () +{ + this._existsOperator = SqlBuilder.EXISTS(); + return this; +} + +/** + * Sets the medium and the source of the communication address for filtering the communication settings. + * + * @param {String} pMedium communication medium + * @param {String} pAddressSql sql field or expression for the communication address + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.medium = function (pMedium, pAddressSql) +{ + this._channelType = $KeywordRegistry.communicationChannelType$communication(); + this._medium = pMedium; + if (pAddressSql) + this._channelIdSql = pAddressSql; + return this; +} + +/** + * Sets the medium to email and the source of the email address for filtering the communication settings. + * + * @param {String} pAddressSql sql field or expression for the email address + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.emails = function (pAddressSql) +{ + return this.medium($KeywordRegistry.communicationMediumCampaign$mail(), pAddressSql); +} + +/** + * Sets the source of the address to filter the communication settings by address. + * + * @param {String} pAddressSql sql field or expression for the address id + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.address = function (pAddressSql) +{ + this._channelType = $KeywordRegistry.communicationChannelType$address(); + this._channelIdSql = pAddressSql; + return this; +} + +/** + * Only fetch communication settings with the status 'rejected' + * + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.rejected = function () +{ + this._settingStatus = $KeywordRegistry.communicationSettingStatus$rejected(); + return this; +} + +/** + * Only fetch communication settings with the status 'allowed' + * + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.allowed = function () +{ + this._settingStatus = $KeywordRegistry.communicationSettingStatus$allowed(); + return this; +} + +/** + * Only fetch communication settings with the status 'pending' + * + * @return {CommunicationSettingsCondition} current object + */ +CommunicationSettingsCondition.prototype.pending = function () +{ + this._settingStatus = $KeywordRegistry.communicationSettingStatus$pending(); + return this; +} + +/** + * Builds a sub select for fetching the communication settings with the properies as configured. + * + * @param {String|Array} [pSelectFields=COMMUNICATIONSETTINGSID] columns to select + * @return {SqlBuilder} SqlBuilder object with the full sql select + */ +CommunicationSettingsCondition.prototype.buildSelect = function (pSelectFields) +{ + if (pSelectFields == undefined) + pSelectFields = "COMMUNICATIONSETTINGS.COMMUNICATIONSETTINGSID"; + var sql = newSelect(pSelectFields) + .from("COMMUNICATIONSETTINGS") + .where("COMMUNICATIONSETTINGS.CONTACT_ID = " + this._contactIdSql) + .andIfSet("COMMUNICATIONSETTINGS.STATUS", this._settingStatus); + + var channelCondition = newWhere("COMMUNICATIONSETTINGS.CHANNEL_TYPE", $KeywordRegistry.communicationChannelType$global()); + if (this._channelType) + { + var specificChannelCondition = newWhere("COMMUNICATIONSETTINGS.CHANNEL_TYPE", this._channelType) + .andIfSet("COMMUNICATIONSETTINGS.MEDIUM", this._medium); + if (this._channelIdSql) + { + specificChannelCondition.and(newWhere("COMMUNICATIONSETTINGS.CHANNEL_ID = " + this._channelIdSql) + .or("COMMUNICATIONSETTINGS.CHANNEL_ID is null")); + } + channelCondition.or(specificChannelCondition); + } + sql.and(channelCondition); + + return sql; +} + +/** + * Builds a sql condition for fetching only contacts with communication settings that have the configured properties. + * + * @return {SqlBuilder} sql condition + */ +CommunicationSettingsCondition.prototype.buildCondition = function () +{ + return newWhere(null, this.buildSelect(), this._existsOperator); +} + + +/* required functionality: + * - make communication settings condition + * - make interest condition + * - make blacklist condition + * - make full condition + * - check for single contact + */ + +function CommunicationBlacklist () +{ + this.filter = null; +} + +/** + * @return {CommunicationBlacklist} + */ +CommunicationBlacklist.getMailRecipientBlacklist = function () +{ + var currentDate = vars.get("$sys.date"); + var filters = newSelect("BLACKLIST_FILTER") + .from("COMMUNICATIONBLACKLIST") + .where("COMMUNICATIONBLACKLIST.BLACKLIST_TYPE", $KeywordRegistry.communicationBlacklistType$emailRecipientFilter()) + .and(newWhere("COMMUNICATIONBLACKLIST.START_DATE", currentDate, SqlBuilder.GREATER_OR_EQUAL()) + .or("COMMUNICATIONBLACKLIST.START_DATE is null")) + .and(newWhere("COMMUNICATIONBLACKLIST.END_DATE", currentDate, SqlBuilder.LESS_OR_EQUAL())) + .or("COMMUNICATIONBLACKLIST.END_DATE is null") + .table(); + + var filterMappingFn = function ([blacklistFilter]) + { + blacklistFilter = JSON.parse(blacklistFilter); + if (!blacklistFilter.filter || blacklistFilter.entity != "BulkMailRecipient_entity" || Utils.isNullOrEmpty(blacklistFilter.filter.childs)) + return null; + + return blacklistFilter.filter; + }; + + var blacklist = new CommunicationBlacklist(); + blacklist.filter = { + type: "group", + operator: "AND", + childs: filters.map(filterMappingFn).filter(Utils.isObject) + }; + return blacklist; +} + +CommunicationBlacklist.prototype.getCondition = function () +{ + return new FilterSqlTranslator() + .filter(this.filter) + .table("BULKMAILRECIPIENT") + .getSqlCondition(); +} diff --git a/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod b/process/MarketingCondition_test/MarketingCondition_test.aod similarity index 72% rename from process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod rename to process/MarketingCondition_test/MarketingCondition_test.aod index 078550c7200171ccff2e26f2515a616016da481a..e1fabb654e0c28f0747afcbf030302c26d996392 100644 --- a/process/RebuildDuplicatesCache_serverProcess/RebuildDuplicatesCache_serverProcess.aod +++ b/process/MarketingCondition_test/MarketingCondition_test.aod @@ -1,8 +1,8 @@ <?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>RebuildDuplicatesCache_serverProcess</name> + <name>MarketingCondition_test</name> <majorModelMode>DISTRIBUTED</majorModelMode> - <process>%aditoprj%/process/RebuildDuplicatesCache_serverProcess/process.js</process> + <process>%aditoprj%/process/MarketingCondition_test/process.js</process> <variants> <element>EXECUTABLE</element> </variants> diff --git a/process/MarketingCondition_test/process.js b/process/MarketingCondition_test/process.js new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/process/MimeType_lib/process.js b/process/MimeType_lib/process.js index 6e262c76ea89a5e1c433972f975821589021a792..d5a07f0fc22ef7344f9a92d3b80d48f7c09c7da8 100644 --- a/process/MimeType_lib/process.js +++ b/process/MimeType_lib/process.js @@ -68,4 +68,30 @@ MimeTypes.WEBM = function() {return "video/webm";}; MimeTypes.isXML = function (pMimeType) { return pMimeType == MimeTypes.XML() || pMimeType == MimeTypes.XML_APP(); -} \ No newline at end of file +} + +/** + * tests if the given mime type can open + * + * @param {String} pMimeType mime type + * @return {Boolean} if it can open + */ +MimeTypes.canOpenMimeTypeInBrowser = function (pMimeType) +{ + return ( +// application + pMimeType == MimeTypes.PDF() || + pMimeType == MimeTypes.XML_APP() || + +// text + pMimeType == MimeTypes.TXT() || + pMimeType == MimeTypes.XML() || + +// images + pMimeType == MimeTypes.BMP() || + pMimeType == MimeTypes.GIF() || + pMimeType == MimeTypes.JPEG() || + pMimeType == MimeTypes.PNG() || + pMimeType == MimeTypes.SVG() + ); +} diff --git a/process/Offer_lib/process.js b/process/Offer_lib/process.js index 1fb67604ae5cdb6dd7491ed489ead8af5a800e39..a9561a5068390247ec5b6e0d1b39edf453e8180f 100644 --- a/process/Offer_lib/process.js +++ b/process/Offer_lib/process.js @@ -631,7 +631,7 @@ OfferItemUtils.getDiscountedNet = function(pExcludedIs, pOfferId, pDiscount, pEx var vat = 0; var vatExcluded = 0; if(pOfferId){ - var offeritemData = newSelect("QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL") + var offeritemData = newSelect("QUANTITY, PRICE, DISCOUNT, VAT, OPTIONAL, ITEMPOSITION") .from("OFFERITEM") .where("OFFERITEM.OFFER_ID", pOfferId) .andIfSet("OFFERITEM.GROUPCODEID", pExcludedProductgroups, SqlBuilder.NOT_IN()) @@ -640,8 +640,12 @@ OfferItemUtils.getDiscountedNet = function(pExcludedIs, pOfferId, pDiscount, pEx .table(); for (var i = 0; i < offeritemData.length; i++) { - sum = eMath.addDec(sum, ItemUtils.prototype.getItemSum(offeritemData[i][0], offeritemData[i][1], offeritemData[i][2], offeritemData[i][4])); - vat = eMath.addDec(vat, ItemUtils.prototype.getItemVAT(offeritemData[i][0], offeritemData[i][1], offeritemData[i][2], offeritemData[i][3], offeritemData[i][4])); + if(!offeritemData[i][5].toString().includes(".")//only top items + && offeritemData[i][4] == "0")//which are not optional + { + sum = eMath.addDec(sum, eMath.subDec(offeritemData[i][1], offeritemData[i][2])*offeritemData[i][0]); + vat = eMath.addDec(vat, offeritemData[i][3]*eMath.subDec(offeritemData[i][1], offeritemData[i][2])*offeritemData[i][0]/100); + } } sum = eMath.subDec(sum, eMath.divDec(eMath.mulDec(sum, pDiscount), "100")); diff --git a/process/Placeholder_lib/process.js b/process/Placeholder_lib/process.js index a162fc7ee5d7514746718d5054fa10f7cb73df71..f9d5255fa6724011b31a58996b059d949c979482 100644 --- a/process/Placeholder_lib/process.js +++ b/process/Placeholder_lib/process.js @@ -4,6 +4,7 @@ import("CustomPlaceholder_lib"); import("Sql_lib"); import("Communication_lib"); import("system.datetime"); +import("KeywordRegistry_basic"); /* Library for document template placeholders. @@ -124,6 +125,21 @@ PlaceholderUtils.getRegexpMatchAll = function () return /\{@(.(?!{@)|(\r?\n))+?@\}/gi; } +/** + * Returns all link Placeholders for Bulkmails + * + */ +PlaceholderUtils.getLinkPlaceholders = function () +{ + var links = newSelect("WEBLINK.PLACEHOLDER, WEBLINK.URL") + .from("WEBLINK") + .where("WEBLINK.LINKTYPE", $KeywordRegistry.weblinkType$EMail()) + .and("WEBLINK.PLACEHOLDER IS NOT NULL") + .table(); + + return links.map(function(a){ return new Placeholder(a[0], Placeholder.types.FIXEDVALUE, a[1])}); +} + /** * object representing a placeholder * diff --git a/process/RebuildAllDuplicateCaches_serverProcess/process.js b/process/RebuildAllDuplicateCaches_serverProcess/process.js deleted file mode 100644 index b08a0abf9efa74df1e609510b0cd09d63a06d1bf..0000000000000000000000000000000000000000 --- a/process/RebuildAllDuplicateCaches_serverProcess/process.js +++ /dev/null @@ -1,55 +0,0 @@ -import("system.logging"); -import("DuplicateScanner_lib"); - -/* - * Serverprocess to reload duplicates - * - * Step #1: - * All Clusters for the specified targetEntity are deleted. - * Relations between records marked as unrelated are not deleted at this time - * - * Step #2 - * The duplicates cache gets rebuilt - * - * Step #3: - * All unrelated relations between duplicate ids hold their respective cluster id. - * If the same combination of duplicate ids exists in the duplicate cache after the rebuild, - * it is assumed that those records remain duplicates. - * Therefore the saved clusterId gets refreshed with the newly created clusters id. - * - * Relations between unrelated duplicates are deleted, if no cluster contains the same combination of duplicate ids - */ - -// Build Person duplicate cache - -var filterName = "PersonDuplicates"; -var targetEntity = "Person_entity"; -var recordBlockSize = DuplicateScannerUtils.getBlockSize(); - -logging.log(filterName + ": Delete duplicates -> "); -DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); - -logging.log(filterName + ": Recalculate duplicates -> "); -DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, recordBlockSize, null); - -logging.log(filterName + ": Refresh unrelated duplicates -> "); -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -logging.log(filterName + ": Done rebuilding "); - - -// Build Organisation duplicate cache - -filterName = "OrganisationDuplicates"; -targetEntity = "Organisation_entity"; - -logging.log(filterName + ": Delete duplicates -> "); -DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); - -logging.log(filterName + ": Recalculate duplicates -> "); -DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, recordBlockSize, null); - -logging.log(filterName + ": Refresh unrelated duplicates -> "); -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -logging.log(filterName + ": Done rebuilding "); \ No newline at end of file diff --git a/process/RebuildDuplicatesCache_serverProcess/process.js b/process/RebuildDuplicatesCache_serverProcess/process.js deleted file mode 100644 index 1e7f532f75a8b4a36d1c06de9cc4503bf6f74c62..0000000000000000000000000000000000000000 --- a/process/RebuildDuplicatesCache_serverProcess/process.js +++ /dev/null @@ -1,40 +0,0 @@ -import("system.logging"); -import("system.vars"); -import("DuplicateScanner_lib"); - -/* - * Serverprocess to reload duplicates - * - * Step #1: - * All Clusters for the specified targetEntity are deleted. - * Relations between records marked as unrelated are not deleted at this time - * - * Step #2 - * The duplicates cache gets rebuilt - * - * Step #3: - * All unrelated relations between duplicate ids hold their respective cluster id. - * If the same combination of duplicate ids exists in the duplicate cache after the rebuild, - * it is assumed that those records remain duplicates. - * Therefore the saved clusterId gets refreshed with the newly created clusters id. - * - * Relations between unrelated duplicates are deleted, if no cluster contains the same combination of duplicate ids - */ - -// Build Person duplicate cache - -var filterName = vars.get("$local.filterName"); -var targetEntity = vars.get("$local.targetEntity"); -var recordBlockSize = DuplicateScannerUtils.getBlockSize(); - -logging.log(filterName + ": Delete duplicates -> "); -DuplicateScannerUtils.deleteClustersByTargetEntity(targetEntity); - -logging.log(filterName + ": Recalculate duplicates -> "); -DuplicateScannerUtils.rebuildDuplicatesCache(filterName, targetEntity, recordBlockSize, null); - -logging.log(filterName + ": Refresh unrelated duplicates -> "); -DuplicateScannerUtils.refreshUnrelatedDuplicateRelations(targetEntity); - -logging.log(filterName + ": Done rebuilding "); - diff --git a/process/Salesproject_lib/process.js b/process/Salesproject_lib/process.js index 0b58dff6eea514bc1812af026c4d1a0772b811fc..057749c13b05b09b9490f97b010d0bdb36178cb3 100644 --- a/process/Salesproject_lib/process.js +++ b/process/Salesproject_lib/process.js @@ -84,7 +84,9 @@ Salesproject.insertMilestone = function(salesprojectId, type, value, notifyForec */ Salesproject.notifyToUpdateForecast = function() { if (vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW) - question.showMessage(translate.text("Please update the ${FORECAST_ENGLISH}."), question.INFORMATION, translate.text("${FORECAST_ENGLISH}")); + { + // TODO: workflows + } } /** diff --git a/process/SetCommunicationSetting_workflowService/SetCommunicationSetting_workflowService.aod b/process/SetCommunicationSetting_workflowService/SetCommunicationSetting_workflowService.aod new file mode 100644 index 0000000000000000000000000000000000000000..ded82a9d7a27ef0c55d1456a27778be078d51da5 --- /dev/null +++ b/process/SetCommunicationSetting_workflowService/SetCommunicationSetting_workflowService.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>SetCommunicationSetting_workflowService</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/SetCommunicationSetting_workflowService/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>WORKFLOW</element> + </variants> +</process> diff --git a/process/SetCommunicationSetting_workflowService/process.js b/process/SetCommunicationSetting_workflowService/process.js new file mode 100644 index 0000000000000000000000000000000000000000..8aa215483ef3c55f38b6b7eee051a878790e5a7e --- /dev/null +++ b/process/SetCommunicationSetting_workflowService/process.js @@ -0,0 +1,43 @@ +import("system.util"); +import("Sql_lib"); +import("KeywordRegistry_basic"); +import("system.vars"); + +var variables = JSON.parse(vars.get("$local.value")); +var contactId = variables.contactId || variables.targetId; +var channelType = variables.channelType; +var channelId = variables.channelId; +var status = variables.status || $KeywordRegistry.communicationSettingStatus$rejected(); + +var settingsId = newSelect("COMMUNICATIONSETTINGSID") + .from("COMMUNICATIONSETTINGS") + .where("COMMUNICATIONSETTINGS.CONTACT_ID", contactId) + .and("COMMUNICATIONSETTINGS.CHANNEL_TYPE", channelType) + .and("COMMUNICATIONSETTINGS.CHANNEL_ID", channelId) + .cell(); + +if (settingsId) +{ + newWhere("COMMUNICATIONSETTINGS.COMMUNICATIONSETTINGSID") + .updateFields({"STATUS": status}); +} +else +{ + settingsId = util.getNewUUID(); + new SqlBuilder() + .tableName("COMMUNICATIONSETTINGS") + .insertFields({ + "COMMUNICATIONSETTINGSID": settingsId, + "CHANNEL_TYPE": channelType, + "CHANNEL_ID": channelId, + "MEDIUM": medium, + "STATUS": status + }); + new SqlBuilder() + .tableName("COMMUNICATIONLEGALBASE") + .insertFields({ + "COMMUNICATIONLEGALBASEID": util.getNewUUID(), + "COMMUNICATIONSETTINGS_ID": settingsId, + "VERSION": 1 + }); +} \ No newline at end of file diff --git a/process/SetInterestLink_workflowService/SetInterestLink_workflowService.aod b/process/SetInterestLink_workflowService/SetInterestLink_workflowService.aod new file mode 100644 index 0000000000000000000000000000000000000000..b86df5e7047ab1a0cc534a1f4dfbad242e2d94a7 --- /dev/null +++ b/process/SetInterestLink_workflowService/SetInterestLink_workflowService.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>SetInterestLink_workflowService</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/SetInterestLink_workflowService/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>WORKFLOW</element> + </variants> +</process> diff --git a/process/SetInterestLink_workflowService/process.js b/process/SetInterestLink_workflowService/process.js new file mode 100644 index 0000000000000000000000000000000000000000..5a6447a1a3ecfafc87bf0ab271a52683c138bf81 --- /dev/null +++ b/process/SetInterestLink_workflowService/process.js @@ -0,0 +1,34 @@ +import("KeywordRegistry_basic"); +import("system.vars"); +import("system.util"); +import("Sql_lib"); + +var variables = JSON.parse(vars.get("$local.value")); +var contactId = variables.contactId || variables.targetId; +var interestId = variables.interestId; +var status = variables.status || $KeywordRegistry.interestLinkStatus$notSubscribed(); + +var interestLinkId = new SqlBuilder() + .select("INTERESTLINKID") + .from("INTERESTLINK") + .where("INTERESTLINK.CONTACT_ID", contactId) + .and("INTERESTLINK.INTEREST_ID", interestId) + .and("INTERESTLINK.STATUS", status) + .cell(); + +if (interestLinkId) +{ + newWhere("INTERESTLINK.INTERESTLINKID", interestLinkId) + .updateFields({"STATUS": status}); +} +else +{ + new SqlBuilder() + .tableName("INTERESTLINK") + .insertFields({ + "INTERESTLINKID": util.getNewUUID(), + "INTEREST_ID": interestId, + "CONTACT_ID": contactId, + "STATUS": status + }); +} \ No newline at end of file diff --git a/process/Sql_lib/process.js b/process/Sql_lib/process.js index f3708067a34ad01930d3ade922c9520011e1bb91..383117664ccc7b40a93923d2a82b7694222b9d79 100644 --- a/process/Sql_lib/process.js +++ b/process/Sql_lib/process.js @@ -1017,6 +1017,22 @@ SqlBuilder.prototype.selectDistinct = function (pFields) return this; } +/** + * Sets the select clause to "select count(...)" + * @param {String} [pField=*] sql column to count, if omitted "count(*)" will be used + * @return {SqlBuilder} current SqlBuilder object + */ +SqlBuilder.prototype.selectCount = function (pField) +{ + if (pField == undefined) + { + pField = "*"; + } + this._select = SqlBuilder._getStatement(pField, "select count(", ")", true, true); + return this; +} + + /** * sets an alias-name which is added at some places if this SqlBuilder is used as subselect (e.g. in .select(), .join(), .from(), ...) * @param {String} pSubselectAlias @@ -1416,7 +1432,7 @@ SqlBuilder.prototype._whereSubquery = function(pSubquery, pMandatory, pCondition if (!pCondition) throw SqlBuilder._ERROR_NO_CONDITION(); - if (subQuery.isFullSelect()) + if (subQuery.isFullSelect() || subQuery.hasCondition()) //can also be only an condition if SqlBuilder.NOT() is used { var preparedObj = subQuery.build(); pAddPreparedConditionCallback(this, this._prepare(undefined, preparedObj, pCondition)); @@ -1688,6 +1704,19 @@ SqlBuilder.prototype._or = function(pFieldOrCond, pValue, pMandatory, pCondition }); } +/** + * Constant-like function which provides a value for pCondition if you need a "not" statement. + * + * @return {String} + * + * @example + * var cond = newWhere(null, someCondition, SqlBuilder.NOT()) + */ +SqlBuilder.NOT = function() +{ + return "not ?"; +} + /** * Constant-like function which provides a value for pCondition if you need a "not in" statement. * @@ -4628,4 +4657,33 @@ SqlUtils.escapeVars = function (pValue) if (typeof(pValue) == "string" && pValue.charAt(0) == "$") return "$" + pValue; return pValue; -} \ No newline at end of file +} + +SqlUtils.getSqlConditionalOperator = function(pOperator) +{ + switch(parseInt(pOperator)) + { + case 1: + return SqlBuilder.EQUAL(); + case 2: + return SqlBuilder.NOT_EQUAL(); + + case 4: + return SqlBuilder.LESS(); + case 5: + return SqlBuilder.LESS_OR_EQUAL(); + + case 3: + return SqlBuilder.GREATER(); + case 6: + return SqlBuilder.GREATER_OR_EQUAL(); + + case 11: + return "# is not null"; + case 12: + return "# is null"; + + default: + throw new Error("Unsupported operator " + pOperator); + } +} diff --git a/process/UserAgentParser_lib/UserAgentParser_lib.aod b/process/UserAgentParser_lib/UserAgentParser_lib.aod new file mode 100644 index 0000000000000000000000000000000000000000..3af7739cd1371f4f262239bef668c0e0d982084a --- /dev/null +++ b/process/UserAgentParser_lib/UserAgentParser_lib.aod @@ -0,0 +1,9 @@ +<?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>UserAgentParser_lib</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/UserAgentParser_lib/process.js</process> + <variants> + <element>LIBRARY</element> + </variants> +</process> diff --git a/process/UserAgentParser_lib/process.js b/process/UserAgentParser_lib/process.js new file mode 100644 index 0000000000000000000000000000000000000000..c65f44d00d5c83eee785dab469f6593ac3861262 --- /dev/null +++ b/process/UserAgentParser_lib/process.js @@ -0,0 +1,852 @@ +/*!@license + * UAParser.js v0.7.26 + * Lightweight JavaScript-based User-Agent string parser + * https://github.com/faisalman/ua-parser-js + * + * Copyright © 2012-2021 Faisal Salman <f@faisalman.com> + * Licensed under MIT License + */ + + + +////////////// +// Constants +///////////// + + +var LIBVERSION = '0.7.26', +EMPTY = '', +UNKNOWN = '?', +FUNC_TYPE = 'function', +UNDEF_TYPE = 'undefined', +OBJ_TYPE = 'object', +STR_TYPE = 'string', +MAJOR = 'major', // deprecated +MODEL = 'model', +NAME = 'name', +TYPE = 'type', +VENDOR = 'vendor', +VERSION = 'version', +ARCHITECTURE= 'architecture', +CONSOLE = 'console', +MOBILE = 'mobile', +TABLET = 'tablet', +SMARTTV = 'smarttv', +WEARABLE = 'wearable', +EMBEDDED = 'embedded', +UA_MAX_LENGTH = 255; + + +/////////// +// Helper +////////// + + +var UserAgentParser_util = { + extend : function (regexes, extensions) { + var mergedRegexes = {}; + for (var i in regexes) { + if (extensions[i] && extensions[i].length % 2 === 0) { + mergedRegexes[i] = extensions[i].concat(regexes[i]); + } else { + mergedRegexes[i] = regexes[i]; + } + } + return mergedRegexes; + }, + has : function (str1, str2) { + return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false; + }, + lowerize : function (str) { + return str.toLowerCase(); + }, + major : function (version) { + return typeof(version) === STR_TYPE ? version.replace(/[^\d\.]/g,'').split(".")[0] : undefined; + }, + trim : function (str, len) { + str = str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH); + } +}; + + +/////////////// +// Map helper +////////////// + + +var mapper = { + + rgx : function (ua, arrays) { + + var i = 0, j, k, p, q, matches, match; + + // loop through all regexes maps + while (i < arrays.length && !matches) { + + var regex = arrays[i], // even sequence (0,2,4,..) + props = arrays[i + 1]; // odd sequence (1,3,5,..) + j = k = 0; + + // try matching uastring with regexes + while (j < regex.length && !matches) { + + matches = regex[j++].exec(ua); + + if (!!matches) { + for (p = 0; p < props.length; p++) { + match = matches[++k]; + q = props[p]; + // check if given property is actually array + if (typeof q === OBJ_TYPE && q.length > 0) { + if (q.length == 2) { + if (typeof q[1] == FUNC_TYPE) { + // assign modified match + this[q[0]] = q[1].call(this, match); + } else { + // assign given value, ignore regex match + this[q[0]] = q[1]; + } + } else if (q.length == 3) { + // check whether function or regex + if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) { + // call function (usually string mapper) + this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined; + } else { + // sanitize match using given regex + this[q[0]] = match ? match.replace(q[1], q[2]) : undefined; + } + } else if (q.length == 4) { + this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined; + } + } else { + this[q] = match ? match : undefined; + } + } + } + } + i += 2; + } + }, + + str : function (str, map) { + + for (var i in map) { + // check if array + if (typeof map[i] === OBJ_TYPE && map[i].length > 0) { + for (var j = 0; j < map[i].length; j++) { + if (UserAgentParser_util.has(map[i][j], str)) { + return (i === UNKNOWN) ? undefined : i; + } + } + } else if (UserAgentParser_util.has(map[i], str)) { + return (i === UNKNOWN) ? undefined : i; + } + } + return str; + } +}; + + +/////////////// +// String map +////////////// + + +var maps = { + + browser : { + // Safari < 3.0 + oldSafari : { + version : { + '1.0' : '/8', + '1.2' : '/1', + '1.3' : '/3', + '2.0' : '/412', + '2.0.2' : '/416', + '2.0.3' : '/417', + '2.0.4' : '/419', + '?' : '/' + } + }, + oldEdge : { + version : { + '0.1' : '12.', + '21' : '13.', + '31' : '14.', + '39' : '15.', + '41' : '16.', + '42' : '17.', + '44' : '18.' + } + } + }, + + os : { + windows : { + version : { + 'ME' : '4.90', + 'NT 3.11' : 'NT3.51', + 'NT 4.0' : 'NT4.0', + '2000' : 'NT 5.0', + 'XP' : ['NT 5.1', 'NT 5.2'], + 'Vista' : 'NT 6.0', + '7' : 'NT 6.1', + '8' : 'NT 6.2', + '8.1' : 'NT 6.3', + '10' : ['NT 6.4', 'NT 10.0'], + 'RT' : 'ARM' + } + } + } +}; + + +////////////// +// Regex map +///////////// + + +var regexes = { + + browser : [[ + + /\b(?:crmo|crios)\/([\w\.]+)/i // Chrome for Android/iOS + ], [VERSION, [NAME, 'Chrome']], [ + /(?:edgios|edga|edg)\/([\w\.]+)/i // Microsoft Edge + ], [VERSION, [NAME, 'Edge']], [ + /edge\/([\w\.]+)/i // Old Edge (Trident) + ], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [ + + // Presto based + /(opera\smini)\/([\w\.-]+)/i, // Opera Mini + /(opera\s[mobiletab]{3,6})\b.+version\/([\w\.-]+)/i, // Opera Mobi/Tablet + /(opera).+version\/([\w\.]+)/i, // Opera > 9.80 + /(opera)[\/\s]+([\w\.]+)/i // Opera < 9.80 + ], [NAME, VERSION], [ + /opios[\/\s]+([\w\.]+)/i // Opera mini on iphone >= 8.0 + ], [VERSION, [NAME, 'Opera Mini']], [ + /\sopr\/([\w\.]+)/i // Opera Webkit + ], [VERSION, [NAME, 'Opera']], [ + + // Mixed + /(kindle)\/([\w\.]+)/i, // Kindle + /(lunascape|maxthon|netfront|jasmine|blazer|instagram)[\/\s]?([\w\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer/Instagram + // Trident based + /(avant\s|iemobile|slim)(?:browser)?[\/\s]?([\w\.]*)/i, // Avant/IEMobile/SlimBrowser + /(ba?idubrowser)[\/\s]?([\w\.]+)/i, // Baidu Browser + /(?:ms|\()(ie)\s([\w\.]+)/i, // Internet Explorer + + // Webkit/KHTML based + /(chromium|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\/([\w\.-]+)/i, + // Chromium/Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon + /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\/([\w\.]+)/i, // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ + /(weibo)__([\d\.]+)/i // Weibo + ], [NAME, VERSION], [ + /(?:[\s\/]uc?\s?browser|(?:juc.+)ucweb)[\/\s]?([\w\.]+)/i // UCBrowser + ], [VERSION, [NAME, 'UCBrowser']], [ + /(?:windowswechat)?\sqbcore\/([\w\.]+)\b.*(?:windowswechat)?/i // WeChat Desktop for Windows Built-in Browser + ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [ + /micromessenger\/([\w\.]+)/i // WeChat + ], [VERSION, [NAME, 'WeChat']], [ + /konqueror\/([\w\.]+)/i // Konqueror + ], [VERSION, [NAME, 'Konqueror']], [ + /trident.+rv[:\s]([\w\.]{1,9})\b.+like\sgecko/i // IE11 + ], [VERSION, [NAME, 'IE']], [ + /yabrowser\/([\w\.]+)/i // Yandex + ], [VERSION, [NAME, 'Yandex']], [ + /(avast|avg)\/([\w\.]+)/i // Avast/AVG Secure Browser + ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [ + /focus\/([\w\.]+)/i // Firefox Focus + ], [VERSION, [NAME, 'Firefox Focus']], [ + /opt\/([\w\.]+)/i // Opera Touch + ], [VERSION, [NAME, 'Opera Touch']], [ + /coc_coc_browser\/([\w\.]+)/i // Coc Coc Browser + ], [VERSION, [NAME, 'Coc Coc']], [ + /dolfin\/([\w\.]+)/i // Dolphin + ], [VERSION, [NAME, 'Dolphin']], [ + /coast\/([\w\.]+)/i // Opera Coast + ], [VERSION, [NAME, 'Opera Coast']], + [/xiaomi\/miuibrowser\/([\w\.]+)/i // MIUI Browser + ], [VERSION, [NAME, 'MIUI Browser']], [ + /fxios\/([\w\.-]+)/i // Firefox for iOS + ], [VERSION, [NAME, 'Firefox']], [ + /(qihu|qhbrowser|qihoobrowser|360browser)/i // 360 + ], [[NAME, '360 Browser']], [ + /(oculus|samsung|sailfish)browser\/([\w\.]+)/i + ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [ // Oculus/Samsung/Sailfish Browser + /(comodo_dragon)\/([\w\.]+)/i // Comodo Dragon + ], [[NAME, /_/g, ' '], VERSION], [ + /m?(qqbrowser|baiduboxapp|2345Explorer)[\/\s]?([\w\.]+)/i // QQBrowser/Baidu App/2345 Browser + ], [NAME, VERSION], [ + /(MetaSr)[\/\s]?([\w\.]+)/i, // SouGouBrowser + /(LBBROWSER)/i // LieBao Browser + ], [NAME], [ + + // WebView + /;fbav\/([\w\.]+);/i // Facebook App for iOS & Android with version + ], [VERSION, [NAME, 'Facebook']], [ + /FBAN\/FBIOS|FB_IAB\/FB4A/i // Facebook App for iOS & Android without version + ], [[NAME, 'Facebook']], [ + /\s(electron)\/([\w\.]+)\ssafari/i, // Electron-based App + /safari\s(line)\/([\w\.]+)/i, // Line App for iOS + /\b(line)\/([\w\.]+)\/iab/i // Line App for Android + ], [NAME, VERSION], [ + /\bgsa\/([\w\.]+)\s.*safari\//i // Google Search Appliance on iOS + ], [VERSION, [NAME, 'GSA']], [ + + /headlesschrome(?:\/([\w\.]+)|\s)/i // Chrome Headless + ], [VERSION, [NAME, 'Chrome Headless']], [ + + /\swv\).+(chrome)\/([\w\.]+)/i // Chrome WebView + ], [[NAME, 'Chrome WebView'], VERSION], [ + + /droid.+\sversion\/([\w\.]+)\b.+(?:mobile\ssafari|safari)/i // Android Browser + ], [VERSION, [NAME, 'Android Browser']], [ + + /(chrome|omniweb|arora|[tizenoka]{5}\s?browser)\/v?([\w\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia + ], [NAME, VERSION], [ + + /version\/([\w\.]+)\s.*mobile\/\w+\s(safari)/i // Mobile Safari + ], [VERSION, [NAME, 'Mobile Safari']], [ + /version\/([\w\.]+)\s.*(mobile\s?safari|safari)/i // Safari & Safari Mobile + ], [VERSION, NAME], [ + /webkit.+?(mobile\s?safari|safari)(\/[\w\.]+)/i // Safari < 3.0 + ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [ + + /(webkit|khtml)\/([\w\.]+)/i + ], [NAME, VERSION], [ + + // Gecko based + /(navigator|netscape)\/([\w\.-]+)/i // Netscape + ], [[NAME, 'Netscape'], VERSION], [ + /(swiftfox)/i, // Swiftfox + /(icedragon|iceweasel|camino|chimera|fennec|maemo\sbrowser|minimo|conkeror)[\/\s]?([\w\.\+]+)/i, + // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror + /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\/([\w\.-]+)$/i, + // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix + /(firefox)\/([\w\.]+)\s[\w\s\-]+\/[\w\.]+$/i, // Other Firefox-based + /(mozilla)\/([\w\.]+)\s.+rv\:.+gecko\/\d+/i, // Mozilla + + // Other + /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\/\s]?([\w\.]+)/i, + // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir + /(links)\s\(([\w\.]+)/i, // Links + /(gobrowser)\/?([\w\.]*)/i, // GoBrowser + /(ice\s?browser)\/v?([\w\._]+)/i, // ICE Browser + /(mosaic)[\/\s]([\w\.]+)/i // Mosaic + ], [NAME, VERSION] + ], + + cpu : [[ + + /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\)]/i // AMD64 (x64) + ], [[ARCHITECTURE, 'amd64']], [ + + /(ia32(?=;))/i // IA32 (quicktime) + ], [[ARCHITECTURE, UserAgentParser_util.lowerize]], [ + + /((?:i[346]|x)86)[;\)]/i // IA32 (x86) + ], [[ARCHITECTURE, 'ia32']], [ + + /\b(aarch64|armv?8e?l?)\b/i // ARM64 + ], [[ARCHITECTURE, 'arm64']], [ + + /\b(arm(?:v[67])?ht?n?[fl]p?)\b/i // ARMHF + ], [[ARCHITECTURE, 'armhf']], [ + + // PocketPC mistakenly identified as PowerPC + /windows\s(ce|mobile);\sppc;/i + ], [[ARCHITECTURE, 'arm']], [ + + /((?:ppc|powerpc)(?:64)?)(?:\smac|;|\))/i // PowerPC + ], [[ARCHITECTURE, /ower/, '', UserAgentParser_util.lowerize]], [ + + /(sun4\w)[;\)]/i // SPARC + ], [[ARCHITECTURE, 'sparc']], [ + + /((?:avr32|ia64(?=;))|68k(?=\))|\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\s)avr|(?:irix|mips|sparc)(?:64)?\b|pa-risc)/i + // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC + ], [[ARCHITECTURE, UserAgentParser_util.lowerize]] + ], + + device : [[ + + ////////////////////// + // MOBILES & TABLETS + ///////////////////// + + // Samsung + /\b(sch-i[89]0\d|shw-m380s|sm-p(?:605|610|587)|sm-t\w+|gt-p\d{4}|gt-n\d+|sgh-t8[56]9|nexus\s10)/i, + ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [ + /(s[cgp]h-\w+|gt-\w+|galaxy\snexus|sm-\w[\w\d]+)/i, + /\ssamsung[\s-]([\w-]+)/i, + /sec-(sgh\w+)/i + ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [ + + // Apple + /\((ip(?:hone|od)[\s\w]*);/i // iPod/iPhone + ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [ + /\((ipad);[\w\s\),;-]+(apple)/i // iPad + ], [MODEL, VENDOR, [TYPE, TABLET]], [ + /applecoremedia\/[\w\.]+\s\((ipad)/i + ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [ + + // Huawei + /d\/huawei([\w\s-]+)[;\)]/i, + /\b(nexus\s6p|vog-[at]?l\d\d|ane-[at]?l[x\d]\d|eml-a?l\d\da?|lya-[at]?l\d[\dc]|clt-a?l\d\di?|ele-l\d\d)/i, + /\b(\w{2,4}-[atu][ln][01259][019])[;\)\s]/i + ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [ + /\b(bah2?-a?[lw]\d{2})/i // Huawei MediaPad + ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [ + + // Xiaomi + /\b(poco[\s\w]+)(?:\sbuild|\))/i, // Xiaomi POCO + /\b;\s(\w+)\s+build\/hm\1/i, // Xiaomi Hongmi 'numeric' models + /\b(hm[\s\-_]?note?[\s_]?(?:\d\w)?)\sbuild/i, // Xiaomi Hongmi + /\b(redmi[\s\-_]?(?:note|k)?[\w\s_]+)(?:\sbuild|\))/i, // Xiaomi Redmi + /\b(mi[\s\-_]?(?:a\d|one|one[\s_]plus|note lte)?[\s_]?(?:\d?\w?)[\s_]?(?:plus)?)\sbuild/i // Xiaomi Mi + ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [ + /\b(mi[\s\-_]?(?:pad)(?:[\w\s_]+))(?:\sbuild|\))/i // Mi Pad tablets + ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [ + + // OPPO + /;\s(\w+)\sbuild.+\soppo/i, + /\s(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007)\b/i + ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [ + + // Vivo + /\svivo\s(\w+)(?:\sbuild|\))/i, + /\s(v[12]\d{3}\w?[at])(?:\sbuild|;)/i + ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [ + + // Realme + /\s(rmx[12]\d{3})(?:\sbuild|;)/i + ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [ + + // Motorola + /\s(milestone|droid(?:[2-4x]|\s(?:bionic|x2|pro|razr))?:?(\s4g)?)\b[\w\s]+build\//i, + /\smot[\s-](\w*)/i, + /(moto[\s\w\(\)]+(?=\sbuild|\)))/i, + /(xt\d{3,4})\sbuild\//i, + /(nexus\s6)/i + ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [ + /\s(mz60\d|xoom[\s2]{0,2})\sbuild\//i + ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [ + + // LG + /((?=lg)?[vl]k\-?\d{3})\s+build|\s3\.[\s\w;-]{10}lg?-([06cv9]{3,4})/i + ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [ + /(nexus\s[45])/i, + /lg[e;\s\/-]+((?!browser|netcast)\w+)/i, + /\blg(\-?[\d\w]+)\s+build/i + ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [ + + // Lenovo + /(ideatab[\w\-\s]+)/i, + /lenovo\s?(s(?:5000|6000)(?:[\w-]+)|tab(?:[\s\w]+)|[\w-]+)/i // Lenovo tablets + ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [ + + // Nokia + /(?:maemo|nokia).*(n900|lumia\s\d+)/i, + /nokia[\s_-]?([\w\.-]*)/i + ], [MODEL, [VENDOR, 'Nokia'], [TYPE, MOBILE]], [ + + // Google + /droid.+;\s(pixel\sc)[\s)]/i // Google Pixel C + ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [ + /droid.+;\s(pixel[\s\daxl]{0,6})(?:\sbuild|\))/i // Google Pixel + ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [ + + // Sony + /droid.+\s([c-g]\d{4}|so[-l]\w+|xq-a\w[4-7][12])(?=\sbuild\/|\).+chrome\/(?![1-6]{0,1}\d\.))/i + ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [ + /sony\stablet\s[ps]\sbuild\//i, + /(?:sony)?sgp\w+(?:\sbuild\/|\))/i + ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [ + + // OnePlus + /\s(kb2005|in20[12]5|be20[12][59])\b/i, + /\ba000(1)\s+build/i, // OnePlus + /\boneplus\s(a\d{4})[\s)]/i + ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [ + + // Amazon + /(alexa)webm/i, + /(kf[a-z]+)(\sbuild\/|\)).+silk\//i // Kindle Fire HD + ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [ + /(sd|kf)[0349hijorstuw]+(\sbuild\/|\)).+silk\//i // Fire Phone + ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [ + + // BlackBerry + /\((playbook);[\w\s\),;-]+(rim)/i // BlackBerry PlayBook + ], [MODEL, VENDOR, [TYPE, TABLET]], [ + /\(bb10;\s(\w+)/i // BlackBerry 10 + ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [ + + // Asus + /\b(transfo[prime\s]{4,10}\s\w+|eeepc|slider\s\w+|nexus\s7|padfone|p00c)/i + ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [ + /\s(z[es]6[027][01][km][ls]|zenfone\s\d\w?)\b/i + ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [ + + // HTC + /(nexus\s9)/i // HTC Nexus 9 + ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [ + /(htc)[;_\s-]{1,2}([\w\s]+(?=\)|\sbuild)|\w+)/i, // HTC + + // ZTE + /(zte)-(\w*)/i, + /(alcatel|geeksphone|nexian|panasonic|(?=;\s)sony)[_\s-]?([\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony + ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [ + + // Acer + /droid[x\d\.\s;]+\s([ab][1-7]\-?[0178a]\d\d?)/i + ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [ + + // Meizu + /droid.+;\s(m[1-5]\snote)\sbuild/i, + /\bmz-([\w-]{2,})/i + ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [ + + // MIXED + /(blackberry)[\s-]?(\w+)/i, // BlackBerry + /(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\s_-]?([\w-]*)/i, + // BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron + /(hp)\s([\w\s]+\w)/i, // HP iPAQ + /(asus)-?(\w+)/i, // Asus + /(microsoft);\s(lumia[\s\w]+)/i, // Microsoft Lumia + /(lenovo)[_\s-]?([\w-]+)/i, // Lenovo + /linux;.+(jolla);/i, // Jolla + /droid.+;\s(oppo)\s?([\w\s]+)\sbuild/i // OPPO + ], [VENDOR, MODEL, [TYPE, MOBILE]], [ + + /(archos)\s(gamepad2?)/i, // Archos + /(hp).+(touchpad)/i, // HP TouchPad + /(hp).+(tablet)/i, // HP Tablet + /(kindle)\/([\w\.]+)/i, // Kindle + /\s(nook)[\w\s]+build\/(\w+)/i, // Nook + /(dell)\s(strea[kpr\s\d]*[\dko])/i, // Dell Streak + /[;\/]\s?(le[\s\-]+pan)[\s\-]+(\w{1,9})\sbuild/i, // Le Pan Tablets + /[;\/]\s?(trinity)[\-\s]*(t\d{3})\sbuild/i, // Trinity Tablets + /\b(gigaset)[\s\-]+(q\w{1,9})\sbuild/i, // Gigaset Tablets + /\b(vodafone)\s([\w\s]+)(?:\)|\sbuild)/i // Vodafone + ], [VENDOR, MODEL, [TYPE, TABLET]], [ + + /\s(surface\sduo)\s/i // Surface Duo + ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [ + /\s(u304aa)\sbuild/i // AT&T + ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [ + /sie-(\w*)/i // Siemens + ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [ + /[;\/]\s?(rct\w+)\sbuild/i // RCA Tablets + ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [ + /[;\/\s](venue[\d\s]{2,7})\sbuild/i // Dell Venue Tablets + ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [ + /[;\/]\s?(q(?:mv|ta)\w+)\sbuild/i // Verizon Tablet + ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [ + /[;\/]\s(?:barnes[&\s]+noble\s|bn[rt])([\w\s\+]*)\sbuild/i // Barnes & Noble Tablet + ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [ + /[;\/]\s(tm\d{3}\w+)\sbuild/i + ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [ + /;\s(k88)\sbuild/i // ZTE K Series Tablet + ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [ + /;\s(nx\d{3}j)\sbuild/i // ZTE Nubia + ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [ + /[;\/]\s?(gen\d{3})\sbuild.*49h/i // Swiss GEN Mobile + ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [ + /[;\/]\s?(zur\d{3})\sbuild/i // Swiss ZUR Tablet + ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [ + /[;\/]\s?((zeki)?tb.*\b)\sbuild/i // Zeki Tablets + ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [ + /[;\/]\s([yr]\d{2})\sbuild/i, + /[;\/]\s(dragon[\-\s]+touch\s|dt)(\w{5})\sbuild/i // Dragon Touch Tablet + ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [ + /[;\/]\s?(ns-?\w{0,9})\sbuild/i // Insignia Tablets + ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [ + /[;\/]\s?((nxa|Next)-?\w{0,9})\sbuild/i // NextBook Tablets + ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [ + /[;\/]\s?(xtreme\_)?(v(1[045]|2[015]|[3469]0|7[05]))\sbuild/i + ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [ // Voice Xtreme Phones + /[;\/]\s?(lvtel\-)?(v1[12])\sbuild/i // LvTel Phones + ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [ + /;\s(ph-1)\s/i + ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [ // Essential PH-1 + /[;\/]\s?(v(100md|700na|7011|917g).*\b)\sbuild/i // Envizen Tablets + ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [ + /[;\/]\s?(trio[\s\w\-\.]+)\sbuild/i // MachSpeed Tablets + ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [ + /[;\/]\s?tu_(1491)\sbuild/i // Rotor Tablets + ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [ + /(shield[\w\s]+)\sbuild/i // Nvidia Shield Tablets + ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [ + /(sprint)\s(\w+)/i // Sprint Phones + ], [VENDOR, MODEL, [TYPE, MOBILE]], [ + /(kin\.[onetw]{3})/i // Microsoft Kin + ], [[MODEL, /\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [ + /droid\s[\d\.]+;\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i // Zebra + ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [ + /droid\s[\d\.]+;\s(ec30|ps20|tc[2-8]\d[kx])\)/i + ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [ + + /////////////////// + // CONSOLES + /////////////////// + + /\s(ouya)\s/i, // Ouya + /(nintendo)\s([wids3utch]+)/i // Nintendo + ], [VENDOR, MODEL, [TYPE, CONSOLE]], [ + /droid.+;\s(shield)\sbuild/i // Nvidia + ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [ + /(playstation\s[345portablevi]+)/i // Playstation + ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [ + /[\s\(;](xbox(?:\sone)?(?!;\sxbox))[\s\);]/i // Microsoft Xbox + ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [ + + /////////////////// + // SMARTTVS + /////////////////// + + /smart-tv.+(samsung)/i // Samsung + ], [VENDOR, [TYPE, SMARTTV], MODEL], [ + /hbbtv.+maple;(\d+)/i + ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [ + /linux;\snetcast.+smarttv/i, // LG SmartTV + /lg\snetcast\.tv-201\d/i + ], [[VENDOR, 'LG'], MODEL, [TYPE, SMARTTV]], [ + /(apple)\s?tv/i // Apple TV + ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [ + /crkey/i // Google Chromecast + ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [ + /droid.+aft([\w])(\sbuild\/|\))/i // Fire TV + ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [ + /\(dtv[\);].+(aquos)/i // Sharp + ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [ + /hbbtv\/\d+\.\d+\.\d+\s+\([\w\s]*;\s*(\w[^;]*);([^;]*)/i // HbbTV devices + ], [[VENDOR, UserAgentParser_util.trim], [MODEL, UserAgentParser_util.trim], [TYPE, SMARTTV]], [ + /[\s\/\(](android\s|smart[-\s]?|opera\s)tv[;\)\s]/i // SmartTV from Unidentified Vendors + ], [[TYPE, SMARTTV]], [ + + /////////////////// + // WEARABLES + /////////////////// + + /((pebble))app\/[\d\.]+\s/i // Pebble + ], [VENDOR, MODEL, [TYPE, WEARABLE]], [ + /droid.+;\s(glass)\s\d/i // Google Glass + ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [ + /droid\s[\d\.]+;\s(wt63?0{2,3})\)/i + ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [ + + //////////////////// + // MIXED (GENERIC) + /////////////////// + + /droid .+?; ([^;]+?)(?: build|\) applewebkit).+? mobile safari/i // Android Phones from Unidentified Vendors + ], [MODEL, [TYPE, MOBILE]], [ + /droid .+?;\s([^;]+?)(?: build|\) applewebkit).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors + ], [MODEL, [TYPE, TABLET]], [ + /\s(tablet|tab)[;\/]/i, // Unidentifiable Tablet + /\s(mobile)(?:[;\/]|\ssafari)/i // Unidentifiable Mobile + ], [[TYPE, UserAgentParser_util.lowerize]], [ + /(android[\w\.\s\-]{0,9});.+build/i // Generic Android Device + ], [MODEL, [VENDOR, 'Generic']], [ + /(phone)/i + ], [[TYPE, MOBILE]] + ], + + engine : [[ + + /windows.+\sedge\/([\w\.]+)/i // EdgeHTML + ], [VERSION, [NAME, 'EdgeHTML']], [ + + /webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i // Blink + ], [VERSION, [NAME, 'Blink']], [ + + /(presto)\/([\w\.]+)/i, // Presto + /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\/([\w\.]+)/i, + // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna + /(khtml|tasman|links)[\/\s]\(?([\w\.]+)/i, // KHTML/Tasman/Links + /(icab)[\/\s]([23]\.[\d\.]+)/i // iCab + ], [NAME, VERSION], [ + + /rv\:([\w\.]{1,9})\b.+(gecko)/i // Gecko + ], [VERSION, NAME] + ], + + os : [[ + + // Windows + /microsoft\s(windows)\s(vista|xp)/i // Windows (iTunes) + ], [NAME, VERSION], [ + /(windows)\snt\s6\.2;\s(arm)/i, // Windows RT + /(windows\sphone(?:\sos)*)[\s\/]?([\d\.\s\w]*)/i, // Windows Phone + /(windows\smobile|windows)[\s\/]?([ntce\d\.\s]+\w)(?!.+xbox)/i + ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [ + /(win(?=3|9|n)|win\s9x\s)([nt\d\.]+)/i + ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [ + + // iOS/macOS + /ip[honead]{2,4}\b(?:.*os\s([\w]+)\slike\smac|;\sopera)/i, // iOS + /cfnetwork\/.+darwin/i + ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [ + /(mac\sos\sx)\s?([\w\s\.]*)/i, + /(macintosh|mac(?=_powerpc)\s)(?!.+haiku)/i // Mac OS + ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [ + + // Mobile OSes + /(android|webos|palm\sos|qnx|bada|rim\stablet\sos|meego|sailfish|contiki)[\/\s-]?([\w\.]*)/i, + // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS + /(blackberry)\w*\/([\w\.]*)/i, // Blackberry + /(tizen|kaios)[\/\s]([\w\.]+)/i // Tizen/KaiOS + ], [NAME, VERSION], [ + /\(bb(10);/i // BlackBerry 10 + ], [VERSION, [NAME, 'BlackBerry']], [ + /(?:symbian\s?os|symbos|s60(?=;)|series60)[\/\s-]?([\w\.]*)/i // Symbian + ], [VERSION, [NAME, 'Symbian']], [ + /\((series40);/i // Series 40 + ], [NAME], [ + /mozilla.+\(mobile;.+gecko.+firefox/i // Firefox OS + ], [[NAME, 'Firefox OS']], [ + /\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i // WebOS + ], [VERSION, [NAME, 'webOS']], [ + + // Google Chromecast + /crkey\/([\d\.]+)/i // Google Chromecast + ], [VERSION, [NAME, 'Chromecast']], [ + + // Console + /(nintendo|playstation)\s([wids345portablevuch]+)/i, // Nintendo/Playstation + /(xbox);\s+xbox\s([^\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S) + + // GNU/Linux based + /(mint)[\/\s\(\)]?(\w*)/i, // Mint + /(mageia|vectorlinux)[;\s]/i, // Mageia/VectorLinux + /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\sgnu\/linux)?(?:\slinux)?[\/\s-]?(?!chrom|package)([\w\.-]*)/i, + // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware + // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus + /(hurd|linux)\s?([\w\.]*)/i, // Hurd/Linux + /(gnu)\s?([\w\.]*)/i // GNU + ], [NAME, VERSION], [ + + /(cros)\s[\w]+\s([\w\.]+\w)/i // Chromium OS + ], [[NAME, 'Chromium OS'], VERSION],[ + + // Solaris + /(sunos)\s?([\w\.\d]*)/i // Solaris + ], [[NAME, 'Solaris'], VERSION], [ + + // BSD based + /\s([frentopc-]{0,4}bsd|dragonfly)\s?(?!amd|[ix346]{1,2}86)([\w\.]*)/i // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly + ], [NAME, VERSION],[ + + /(haiku)\s(\w+)/i // Haiku + ], [NAME, VERSION],[ + + // Other + /((?:open)?solaris)[\/\s-]?([\w\.]*)/i, // Solaris + /(aix)\s((\d)(?=\.|\)|\s)[\w\.])*/i, // AIX + /(plan\s9|minix|beos|os\/2|amigaos|morphos|risc\sos|openvms|fuchsia)/i, + // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia + /(unix)\s?([\w\.]*)/i // UNIX + ], [NAME, VERSION] + ] +}; + +/*Slightly Modified Version of https://github.com/faisalman/ua-parser-js + *(removed all the window code used in browsers, renamed util) + * + *Constructor for an UserAgentParser to get Information about used device/os/browser + * + *@param {String} ua The User Agent part of the http header + * + *@param {object} extensions Optional Parameter for your own custom detections. + * Example: + * var myOwnListOfBrowsers = [ + * [/(mybrowser)\/([\w\.]+)/i], [UAParser.BROWSER.NAME, UAParser.BROWSER.VERSION] + * ]; + * var UserAgentParser = new UAParser(ua,myOwnListOfBrowsers); + * + * for further Information look at the git repository + **/ +var UAParser = function (ua, extensions) { + + if (typeof ua === 'object') { + extensions = ua; + ua = undefined; + } + + if (!(this instanceof UAParser)) { + return new UAParser(ua, extensions).getResult(); + } + + var _ua = ua || EMPTY; + var _rgxmap = extensions ? UserAgentParser_util.extend(regexes, extensions) : regexes; + + this.getBrowser = function () { + var _browser = { + name: undefined, + version: undefined + }; + mapper.rgx.call(_browser, _ua, _rgxmap.browser); + _browser.major = UserAgentParser_util.major(_browser.version); // deprecated + return _browser; + }; + this.getCPU = function () { + var _cpu = { + architecture: undefined + }; + mapper.rgx.call(_cpu, _ua, _rgxmap.cpu); + return _cpu; + }; + this.getDevice = function () { + var _device = { + vendor: undefined, + model: undefined, + type: undefined + }; + mapper.rgx.call(_device, _ua, _rgxmap.device); + return _device; + }; + this.getEngine = function () { + var _engine = { + name: undefined, + version: undefined + }; + mapper.rgx.call(_engine, _ua, _rgxmap.engine); + return _engine; + }; + this.getOS = function () { + var _os = { + name: undefined, + version: undefined + }; + mapper.rgx.call(_os, _ua, _rgxmap.os); + return _os; + }; + this.getResult = function () { + return { + ua : this.getUA(), + browser : this.getBrowser(), + engine : this.getEngine(), + os : this.getOS(), + device : this.getDevice(), + cpu : this.getCPU() + }; + }; + this.getUA = function () { + return _ua; + }; + this.setUA = function (ua) { + _ua = ua.length > UA_MAX_LENGTH ? UserAgentParser_util.trim(ua, UA_MAX_LENGTH) : ua; + return this; + }; + this.setUA(_ua); + return this; +}; + + + + + + diff --git a/process/migrateCommRestrictions_serverProcess/migrateCommRestrictions_serverProcess.aod b/process/migrateCommRestrictions_serverProcess/migrateCommRestrictions_serverProcess.aod new file mode 100644 index 0000000000000000000000000000000000000000..ffeb39660ea71de1d49bb46a084a7bee4038577c --- /dev/null +++ b/process/migrateCommRestrictions_serverProcess/migrateCommRestrictions_serverProcess.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>migrateCommRestrictions_serverProcess</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/migrateCommRestrictions_serverProcess/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>EXECUTABLE</element> + </variants> +</process> diff --git a/process/migrateCommRestrictions_serverProcess/process.js b/process/migrateCommRestrictions_serverProcess/process.js new file mode 100644 index 0000000000000000000000000000000000000000..72a92e98c7c882e4a872c48c73528867143db281 --- /dev/null +++ b/process/migrateCommRestrictions_serverProcess/process.js @@ -0,0 +1,88 @@ +import("system.vars"); +import("KeywordRegistry_basic"); +import("system.util"); +import("system.logging"); +import("system.db"); +import("Sql_lib"); + +var loggingLevels = { + SILENT: 0, + DEFAULT: 1, + DEBUG: 2 +}; +var parameters = { + startRow: 0, + pageSize: 400, + deleteCommRestrictions: false, + keepOldUids: true, + loggingLevel: loggingLevels.DEFAULT +}; + +_log("CommRestriction migration to CommunicationSettings started. Configured parameters: \n" + JSON.stringify(parameters, null, " ")); + +var commRestrictionCount = Number(newSelect("count(*)").from("COMMRESTRICTION").cell()); + +_log("CommRestriction count: " + commRestrictionCount); + +if (commRestrictionCount > 0) +{ + var commRestrictionSql = newSelect(["COMMRESTRICTIONID", "CONTACT_ID", "EMPLOYEE_INVOLVED", "MEDIUM", "REASON", "STARTDATE"]) + .from("COMMRESTRICTION") + .startRow(parameters.startRow) + .pageSize(parameters.pageSize) + + var commSettingsBuilder = new SqlBuilder().tableName("COMMUNICATIONSETTINGS"); + var commLegalBaseBuilder = new SqlBuilder().tableName("COMMUNICATIONLEGALBASE"); + + var currentDate = vars.get("$sys.date"); + + commRestrictionSql.forEachPage(function (commRestrictions) + { + var insertStatements = []; + var deleteStatements = []; + commRestrictions.forEach(function ([commRestrictionId, contactId, employeeInvolved, medium, reason, startDate]) + { + var communicationSettingsId = parameters.keepOldUids ? commRestrictionId : util.getNewUUID(); + var commSettingsInsert = commSettingsBuilder.buildInsertStatement({ + "COMMUNICATIONSETTINGSID": communicationSettingsId, + "CONTACT_ID": contactId, + "CHANNEL_TYPE": $KeywordRegistry.communicationChannelType$communication(), + "CHANNEL_ID": "", + "MEDIUM": medium, + "STATUS": $KeywordRegistry.communicationSettingStatus$rejected(), + "DATE_NEW": currentDate, + "USER_NEW": "Admin" + }); + + var commLegalBaseInsert = commLegalBaseBuilder.buildInsertStatement({ + "COMMUNICATIONLEGALBASEID": util.getNewUUID(), + "COMMUNICATIONSETTINGS_ID": communicationSettingsId, + "DATE_NEW": currentDate, + "USER_NEW": "Admin", + "VERSION": 1, + "INFO": reason + }); + + insertStatements.push(commSettingsInsert, commLegalBaseInsert); + + if (parameters.deleteCommRestrictions) + { + var commRestrictionDelete = newWhere("COMMRESTRICTION.COMMRESTRICTIONID").buildDeleteStatement(); + deleteStatements.push(commRestrictionDelete); + } + }); + + db.inserts(insertStatements); + if (deleteStatements.length !== 0) + db.deletes(deleteStatements); + }); +} + + +function _log (pMessage, pMinLogLevel) +{ + if (pMinLogLevel === null || pMinLogLevel === undefined) + pMinLogLevel = 1; + if (parameters.loggingLevel >= pMinLogLevel) + logging.log(pMessage); +} \ No newline at end of file diff --git a/process/migrateKeywordContainers/migrateKeywordContainers.aod b/process/migrateKeywordContainers/migrateKeywordContainers.aod index f75e9611757d2a319020405c1cce43b848c87471..94eb478fa064c3d010204d5bf657b597053c37e9 100644 --- a/process/migrateKeywordContainers/migrateKeywordContainers.aod +++ b/process/migrateKeywordContainers/migrateKeywordContainers.aod @@ -5,7 +5,6 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <documentation>%aditoprj%/process/migrateKeywordContainers/documentation.adoc</documentation> <process>%aditoprj%/process/migrateKeywordContainers/process.js</process> - <publishAsWebservice v="true" /> <alias>Data_alias</alias> <variants> <element>EXECUTABLE</element> diff --git a/process/rebuildDuplicates_serverProcess/process.js b/process/rebuildDuplicates_serverProcess/process.js new file mode 100644 index 0000000000000000000000000000000000000000..14369cff4552605e18c828601491e101ceced696 --- /dev/null +++ b/process/rebuildDuplicates_serverProcess/process.js @@ -0,0 +1,74 @@ +import("Sql_lib"); +import("system.db"); +import("system.entities"); +import("system.project"); +import("system.util"); +import("system.logging"); +import("system.notification"); +import("system.translate"); +import("system.vars"); +import("IndexSearch_lib"); +import("DuplicateScanner_lib"); + +var pFilterName = vars.get("$local.filterName"); +var pTargetEntity = vars.get("$local.targetEntity"); +var pTargetIdField = vars.get("$local.targetIdField"); +var pFilter = JSON.parse(vars.get("$local.filter")); + +newWhere("HASDUPLICATE.OBJECT_TYPE", pTargetEntity).deleteData(); +var indexsearchFilter = IndexsearchFilterUtils.fromFilter(pFilter); + +var TABLE_NAME = "HASDUPLICATE"; +var COLUMNS = [ + "HASDUPLICATEID", + "OBJECT_TYPE", "OBJECT_ROWID", + "DUPLICATECOUNT" +]; +var COLUMN_TYPES = db.getColumnTypes(TABLE_NAME, COLUMNS); + +var batchSize = parseInt(project.getPreferenceValue("custom.duplicates.dataBlockSize", "5000")); +var batchPos = 0; +while(true) +{ + var inserts = []; + + var entityFields = indexsearchFilter.getFields(); + entityFields.add(pTargetIdField); + var entityRowsConfig = entities.createConfigForLoadingRows() + .entity(pTargetEntity) + .fields(Array.from(entityFields)) + .startrow(batchPos).count(batchSize); + var entityRows = entities.getRows(entityRowsConfig); + + entityRows.forEach(function(entityRow) + { + var currEntityRowId = entityRow[pTargetIdField]; + var indexPattern = indexsearchFilter.buildQuery(entityRow); + var duplicates = DuplicateScannerUtils.getDuplicateIds(pTargetEntity, indexPattern, currEntityRowId); + + if(duplicates.length > 0) + { + var values = [ + util.getNewUUID(), + pTargetEntity, currEntityRowId, + duplicates.length.toFixed(0) + ]; + inserts.push([TABLE_NAME, COLUMNS, COLUMN_TYPES, values]); + } + }); + + db.inserts(inserts); + if(entityRows.length < batchSize) + { + break; + } + batchPos += batchSize; +} + +notification.addNotificationWith(notification.createConfig() +.addUserWithId(vars.get("$sys.user")) +.notificationType("_____SYSTEM_NOTIFICATION_MESSAGE") +.caption(translate.text("Duplicaterow rebuild")) +.description(translate.withArguments("The duplicate row corrosponding to %0 has been rebuild", [pFilterName]))); + +logging.log(pFilterName + " has been rebuild"); diff --git a/process/rebuildDuplicates_serverProcess/rebuildDuplicates_serverProcess.aod b/process/rebuildDuplicates_serverProcess/rebuildDuplicates_serverProcess.aod new file mode 100644 index 0000000000000000000000000000000000000000..3a72b0bfc4f0fb92cacba8dbda2b2d68acbd3386 --- /dev/null +++ b/process/rebuildDuplicates_serverProcess/rebuildDuplicates_serverProcess.aod @@ -0,0 +1,13 @@ +<?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>rebuildDuplicates_serverProcess</name> + <description>ATTENTION! +This process can only be executed within the client. +The action (Rebuild selected entries) can be found in the administration context "Duplicate Configuration".</description> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/rebuildDuplicates_serverProcess/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>EXECUTABLE</element> + </variants> +</process> diff --git a/process/redirect_rest/process.js b/process/redirect_rest/process.js index fe542e60083ebae56bacd14f02bff8b8a81a2787..966602c69e89e8fd07b6ad2720051bab9b351240 100644 --- a/process/redirect_rest/process.js +++ b/process/redirect_rest/process.js @@ -1,18 +1,28 @@ +import("system.logging"); import("Workflow_lib"); import("Util_lib"); import("system.util"); +import("Bulkmail_lib"); +import("UserAgentParser_lib"); function restget (pRequest) { var request = JSON.parse(pRequest); - var action = WorkflowLinkActions.parseAction(request.query.act); - - action.run(); + var linkId = request.query.link; + var mailLogId = request.query.log; + var ipAddress = BulkMailUtils.getIpAddressFromHeader(request.header); + var redirectLink = BulkMailUtils.getRedirectLink(linkId); + var UserAgentObject = new UAParser(request.header["User-agent"]).getResult(); + + BulkMailUtils.insertClick(mailLogId, ipAddress, linkId, UserAgentObject.browser.name, UserAgentObject.os.name, UserAgentObject.device.type); + + BulkMailUtils.startBulkmailWorkFlow(mailLogId, linkId); - if (action.redirectLink) + if (redirectLink) { request.response.httpStatusCode = 302; //found, redirect - request.response.header.Location = action.redirectLink; + + request.response.header.Location = redirectLink; } else { diff --git a/process/redirect_rest/redirect_rest.aod b/process/redirect_rest/redirect_rest.aod index bda233f7990cbcde49e43a759006b8fd964fc26d..83abc318c0a0b898ae6e89367bb5979eb934e886 100644 --- a/process/redirect_rest/redirect_rest.aod +++ b/process/redirect_rest/redirect_rest.aod @@ -8,6 +8,7 @@ <loginTypeId> <element>internal.none</element> </loginTypeId> + <alias>Data_alias</alias> <variants> <element>EXECUTABLE</element> </variants> diff --git a/process/sendBulkMail_serverProcess/process.js b/process/sendBulkMail_serverProcess/process.js index 7ed237beffbb5978141a82b08c745385a1f21bee..2d1640fa68ab2917ef4214f904130eb54e8405a3 100644 --- a/process/sendBulkMail_serverProcess/process.js +++ b/process/sendBulkMail_serverProcess/process.js @@ -1,27 +1,28 @@ -import("system.datetime"); -import("Sql_lib"); -import("system.db"); -import("system.util"); -import("system.translate"); -import("Bulkmail_lib"); -import("system.vars"); -import("system.notification"); - -var startTime = datetime.date(); -var bulkMailId = vars.get("$local.bulkMailId"); -var user = vars.get("$local.user"); -var testRecipients = JSON.parse(vars.get("$local.testRecipients")); -var res = BulkMailUtils.sendBulkMail(bulkMailId, testRecipients); - -if (user && !testRecipients) -{ - var mailName = newSelect("NAME") - .from("BULKMAIL") - .whereIfSet("BULKMAIL.BULKMAILID", bulkMailId) - .cell(true); - - var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]); - var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", - [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]); - notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", null, notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description); +import("system.datetime"); +import("Sql_lib"); +import("system.db"); +import("system.util"); +import("system.translate"); +import("Bulkmail_lib"); +import("system.vars"); +import("system.notification"); + +var startTime = datetime.date(); +var bulkMailId = vars.get("$local.bulkMailId"); +var user = vars.get("$local.user"); +var testRun= vars.get("$local.testRun"); +var res = BulkMailUtils.sendBulkMail(bulkMailId, testRun); + +if (user && !testRun) +{ + var mailName = newSelect("NAME") + .from("BULKMAIL") + .whereIfSet("BULKMAIL.BULKMAILID", bulkMailId) + .cell(true); + + var message = translate.withArguments("Bulk mail \"%0\" was sent!", [mailName]); + var description = translate.withArguments("%0 mails sent sucessfully, %1 mails failed. Process took %2 s.", + [res.sucessful, res.failed, Math.round((datetime.date() - startTime) / datetime.ONE_SECOND)]); + notification.addNotification(util.getNewUUID(), null, null, null, "BulkMailSent", notification.PRIO_NORMAL, 2, notification.STATE_UNSEEN, [user], message, description); + } \ No newline at end of file diff --git a/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod b/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod index 8357bb2adf8a19f802111fd90d3c734932f8b2e6..1bc41ce6e81cc65bfe988a74c1e7193aceea0c2d 100644 --- a/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod +++ b/process/sendBulkMail_serverProcess/sendBulkMail_serverProcess.aod @@ -4,6 +4,7 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <documentation>%aditoprj%/process/sendBulkMail_serverProcess/documentation.adoc</documentation> <process>%aditoprj%/process/sendBulkMail_serverProcess/process.js</process> + <alias>Data_alias</alias> <variants> <element>EXECUTABLE</element> <element>LIBRARY</element> diff --git a/process/sendPlannedBulkmails_serverProcess/process.js b/process/sendPlannedBulkmails_serverProcess/process.js new file mode 100644 index 0000000000000000000000000000000000000000..3f74ac7a527a49ae1dbe7fc416e40edf21e2aecd --- /dev/null +++ b/process/sendPlannedBulkmails_serverProcess/process.js @@ -0,0 +1,30 @@ +import("system.logging"); +import("Bulkmail_lib"); +import("system.project"); +import("system.datetime"); +import("Sql_lib"); +import("KeywordRegistry_basic"); +import("system.eMath"); +import("system.SQLTYPES"); + +var dateToSendPassedAfter = project.getInstanceConfigValue("bulkmail.dateToSendPassedAfter" , 24); + +//send all Bulkmails which are currently planned and not already missed. +var bulkMailData = newSelect("BULKMAIL.BULKMAILID") + .from("BULKMAIL") + .where("BULKMAIL.STATUS",$KeywordRegistry.bulkMailStatus$planned()) + .and("BULKMAIL.DATE_TO_SEND", datetime.date(), SqlBuilder.LESS_OR_EQUAL()) + .and("BULKMAIL.DATE_TO_SEND",eMath.subInt(datetime.date(), eMath.mulInt(dateToSendPassedAfter, datetime.ONE_HOUR)), SqlBuilder.GREATER()) + .arrayColumn(); +for (let i = 0; i < bulkMailData.length; i++) +{ + newWhere("BULKMAIL.BULKMAILID", bulkMailData[i]) + .updateFields({"STATUS" : $KeywordRegistry.bulkMailStatus$beingSent()}); + + BulkMailUtils.sendBulkMailOnServer(bulkMailData[i],null,null); +} + +//set all missed bulkmails to status missed +newWhere("BULKMAIL.STATUS", $KeywordRegistry.bulkMailStatus$planned()) + .and("BULKMAIL.DATE_TO_SEND", eMath.subInt(datetime.date(), eMath.mulInt(dateToSendPassedAfter, datetime.ONE_HOUR)), SqlBuilder.LESS_OR_EQUAL()) + .updateFields({"STATUS": $KeywordRegistry.bulkMailStatus$missed()}); \ No newline at end of file diff --git a/process/sendPlannedBulkmails_serverProcess/sendPlannedBulkmails_serverProcess.aod b/process/sendPlannedBulkmails_serverProcess/sendPlannedBulkmails_serverProcess.aod new file mode 100644 index 0000000000000000000000000000000000000000..d34bf50903e06d4090817909b7175259f518a660 --- /dev/null +++ b/process/sendPlannedBulkmails_serverProcess/sendPlannedBulkmails_serverProcess.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>sendPlannedBulkmails_serverProcess</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <process>%aditoprj%/process/sendPlannedBulkmails_serverProcess/process.js</process> + <alias>Data_alias</alias> + <variants> + <element>EXECUTABLE</element> + </variants> +</process> diff --git a/role/PROJECT_DSGVO/PROJECT_DSGVO.aod b/role/PROJECT_DSGVO/PROJECT_DSGVO.aod new file mode 100644 index 0000000000000000000000000000000000000000..e2bdeeae878853c7c2182c82731f5e86ea455d75 --- /dev/null +++ b/role/PROJECT_DSGVO/PROJECT_DSGVO.aod @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<role xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.2.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/role/1.2.0"> + <name>PROJECT_DSGVO</name> + <title>DSGVO</title> + <majorModelMode>DISTRIBUTED</majorModelMode> +</role>