﻿<?xml version="1.0" encoding="utf-8"?>
<configset name="AMLCheck" author="UHE">
  <comment>2026-07-16 UHE: v1</comment>
  <requirements>
    <version-requirement>6.8.0.20</version-requirement>
    <ocl-requirement message="The config set custom class 29 is already in use. To import the config set, please make sure that the config set custom class 29 is not used in any other context.">ClassSettings.allInstances-&gt;select(class.containstype(ConfigSetCustomClass29))-&gt;reject(entryid='ClassSettingsCC29AMLCheck')-&gt;size = 0</ocl-requirement>
  </requirements>
  <update />
  <references>
    <entryid-reference class="StandardUserGroup" alias="StandardUserGroup0" entryid="UserGroupStandard" />
    <entryid-reference class="SettingsFolder" alias="SettingsFolder0" entryid="FolderProjects" />
  </references>
  <objects>
    <object class="CustomField" alias="ZusatzfeldKlasse7">
      <member name="entryID">CustomFieldCc29AMLAnswer1</member>
      <member name="expression">"", "Yes", "No"</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLAnswer1</member>
      <member name="designation">
        <mltext language="NV">Am I a consultant?</mltext>
      </member>
      <member name="fieldType">Multistring</member>
      <member name="hidden">true</member>
      <member name="orderIdx">0</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse6">
      <member name="entryID">CustomFieldCc29AMLAnswer2</member>
      <member name="expression">"", "Yes", "No"</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLAnswer2</member>
      <member name="designation">
        <mltext language="NV">Does any of the legal transactions listed in the Anti-Money Laundering Act apply?</mltext>
      </member>
      <member name="fieldType">Multistring</member>
      <member name="hidden">true</member>
      <member name="orderIdx">2</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse5">
      <member name="entryID">CustomFieldCc29AMLAnswer3</member>
      <member name="expression">"", "No", "Yes"</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLAnswer3</member>
      <member name="designation">
        <mltext language="NV">Does an exception as defined in the Anti-Money Laundering Act apply?</mltext>
      </member>
      <member name="fieldType">Multistring</member>
      <member name="hidden">true</member>
      <member name="orderIdx">3</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse4">
      <member name="entryID">CustomFieldCc29AMLAnswer4</member>
      <member name="expression">"", "Yes", "No"</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLAnswer4</member>
      <member name="designation">
        <mltext language="NV">Am I directly involved in a financial transaction?</mltext>
      </member>
      <member name="fieldType">Multistring</member>
      <member name="hidden">true</member>
      <member name="orderIdx">4</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse3">
      <member name="entryID">CustomFieldCc29AMLAnswer5</member>
      <member name="expression">"", "Yes", "No"</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLAnswer5</member>
      <member name="designation">
        <mltext language="NV">Am I acting in a professional capacity?</mltext>
      </member>
      <member name="fieldType">Multistring</member>
      <member name="hidden">true</member>
      <member name="orderIdx">5</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse2">
      <member name="entryID">CustomFieldCc29AMLCompleted</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLCompleted</member>
      <member name="designation">
        <mltext language="NV">AML check is complete</mltext>
      </member>
      <member name="fieldType">Boolean</member>
      <member name="hidden">true</member>
      <member name="orderIdx">10</member>
      <member name="selectionType">None</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse1">
      <member name="entryID">CustomFieldCc29AMLCompletedBy</member>
      <member name="expression">Projektbearbeiter.allinstances</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLCompletedBy</member>
      <member name="designation">
        <mltext language="NV">User who completed the AML check</mltext>
      </member>
      <member name="fieldType">Object</member>
      <member name="hidden">true</member>
      <member name="orderIdx">30</member>
      <member name="selectionType">Object</member>
    </object>
    <object class="CustomField" alias="ZusatzfeldKlasse0">
      <member name="entryID">CustomFieldCc29AMLCompletedOn</member>
      <member name="classes">ConfigSetCustomClass29</member>
      <member name="fieldName">cc29AMLCompletedOn</member>
      <member name="designation">
        <mltext language="NV">AML check completion date</mltext>
      </member>
      <member name="fieldType">Date</member>
      <member name="hidden">true</member>
      <member name="orderIdx">20</member>
      <member name="selectionType">None</member>
    </object>
    <object class="ClassRight" alias="ClassRight_ConfigSetCustomClass29,Alle,Erlauben19">
      <member name="entryID">ClassRightStandardUsersAllCC29Grant</member>
      <member name="grantDeny">true</member>
      <member name="orderIdx">2</member>
      <member name="userGroup">
        <reference-object alias="StandardUserGroup0" />
      </member>
      <member name="rightType">
        <reference-object alias="RightType_All" />
      </member>
      <member name="classes">ConfigSetCustomClass29</member>
    </object>
    <object class="ClassRight" alias="ClassRight_ConfigSetCustomClass29,Löschen,Erlauben14">
      <member name="entryID">ClassRightStandardUsersDeleteCC29Deny</member>
      <member name="grantDeny">false</member>
      <member name="orderIdx">5</member>
      <member name="expression">(getlinks('LnkProjectAMLCheck_B')-&gt;size&gt;0) and (customfieldbool('cc29AMLCompleted') or not getlinks('LnkProjectAMLCheck_B')-&gt;first.oclastype(Project).isMemberWritable('code'))</member>
      <member name="userGroup">
        <reference-object alias="StandardUserGroup0" />
      </member>
      <member name="rightType">
        <reference-object alias="RightType_Delete" />
      </member>
      <member name="classes">ConfigSetCustomClass29</member>
    </object>
    <object class="ClassRight" alias="ClassRight_ConfigSetCustomClass29,Lesen,Erlauben16">
      <member name="entryID">ClassRightStandardUsersReadCC29Deny</member>
      <member name="grantDeny">false</member>
      <member name="orderIdx">3</member>
      <member name="expression">(getlinks('LnkProjectAMLCheck_B')-&gt;size&gt;0) and not getlinks('LnkProjectAMLCheck_B')-&gt;first.oclastype(Project).isMemberReadable('code')</member>
      <member name="userGroup">
        <reference-object alias="StandardUserGroup0" />
      </member>
      <member name="rightType">
        <reference-object alias="RightType_Read" />
      </member>
      <member name="classes">ConfigSetCustomClass29</member>
    </object>
    <object class="ClassRight" alias="ClassRight_Project.amlcheck,Lesen,Erlauben18">
      <member name="entryID">ClassRightStandardUsersReadProjectAmlCheckGrant</member>
      <member name="grantDeny">true</member>
      <member name="orderIdx">1</member>
      <member name="memberName">aml check</member>
      <member name="userGroup">
        <reference-object alias="StandardUserGroup0" />
      </member>
      <member name="rightType">
        <reference-object alias="RightType_Read" />
      </member>
      <member name="classes">Project</member>
    </object>
    <object class="ClassRight" alias="ClassRight_ConfigSetCustomClass29,Schreiben,Erlauben15">
      <member name="entryID">ClassRightStandardUsersWriteCC29Deny</member>
      <member name="grantDeny">false</member>
      <member name="orderIdx">4</member>
      <member name="expression">(getlinks('LnkProjectAMLCheck_B')-&gt;size&gt;0) and (customfieldbool('cc29AMLCompleted') or not getlinks('LnkProjectAMLCheck_B')-&gt;first.oclastype(Project).isMemberWritable('code'))</member>
      <member name="userGroup">
        <reference-object alias="StandardUserGroup0" />
      </member>
      <member name="rightType">
        <reference-object alias="RightType_Write" />
      </member>
      <member name="classes">ConfigSetCustomClass29</member>
    </object>
    <object class="ClassSettings" alias="ClassSettings_ConfigSetCustomClass2935">
      <member name="entryID">ClassSettingsCC29AMLCheck</member>
      <member name="classIconIndex">87</member>
      <member name="customPages">&lt;Page Override="AdditionalClassBase"&gt;

    &lt;Group Name="AMLGroup1" Orientation="Vertical"&gt;
        &lt;TextBlock Name="AMLQuestion1" ValueExpression="Customfield.allinstances-&gt;select(fieldname='cc29AMLAnswer1')-&gt;first.designation-&gt;translate" FitMode="Wrap" Appearance="Info" /&gt;
        &lt;Group Name="AMLCheckBoxLogGroup1"&gt;
            &lt;AdditionalFieldComboBox Name="AMLAnswer1" ShowLabel="False" ValueExpression="customfieldint('cc29AMLAnswer1')" /&gt;
            &lt;TextBlock Name="AMLAnswer1Log" ValueExpression="keystring('cc29AMLAnswer1Log')" VisibleExpression="keystring('cc29AMLAnswer1Log')&amp;lt;&amp;gt;''" Appearance="Info" FlexWidth="4" /&gt;
            &lt;Spacer Name="AMLSpacerAnswer1" VisibleExpression="keystring('cc29AMLAnswer1Log')=''" FlexWidth="4" /&gt;
        &lt;/Group&gt;
        &lt;Spacer Name="AMLSpacer1" Height="10" /&gt;
    &lt;/Group&gt;

    &lt;Group Name="AMLGroup2" Orientation="Vertical" VisibleExpression="customfieldint('cc29AMLAnswer1')=1"&gt;
        &lt;TextBlock Name="AMLQuestion2" ValueExpression="Customfield.allinstances-&gt;select(fieldname='cc29AMLAnswer2')-&gt;first.designation-&gt;translate" FitMode="Wrap" Appearance="Info"/&gt;
        &lt;Group Name="AMLCheckBoxLogGroup2"&gt;
            &lt;AdditionalFieldComboBox Name="AMLAnswer2" ShowLabel="False" ValueExpression="customfieldint('cc29AMLAnswer2')" /&gt;
            &lt;TextBlock Name="AMLAnswer2Log" ValueExpression="keystring('cc29AMLAnswer2Log')" VisibleExpression="keystring('cc29AMLAnswer2Log')&amp;lt;&amp;gt;''" Appearance="Info" FlexWidth="4" /&gt;
            &lt;Spacer Name="AMLSpacerAnswer2" VisibleExpression="keystring('cc29AMLAnswer2Log')=''" FlexWidth="4" /&gt;
        &lt;/Group&gt;
        &lt;Spacer Name="AMLSpacer2" Height="10" /&gt;
    &lt;/Group&gt;

    &lt;Group Name="AMLGroup3" Orientation="Vertical" VisibleExpression="customfieldint('cc29AMLAnswer2')=1"&gt;
        &lt;TextBlock Name="AMLQuestion3" ValueExpression="Customfield.allinstances-&gt;select(fieldname='cc29AMLAnswer3')-&gt;first.designation-&gt;translate" FitMode="Wrap" Appearance="Info"/&gt;
        &lt;Group Name="AMLCheckBoxLogGroup3"&gt;
            &lt;AdditionalFieldComboBox Name="AMLAnswer3" ShowLabel="False" ValueExpression="customfieldint('cc29AMLAnswer3')" /&gt;
            &lt;TextBlock Name="AMLAnswer3Log" ValueExpression="keystring('cc29AMLAnswer3Log')" VisibleExpression="keystring('cc29AMLAnswer3Log')&amp;lt;&amp;gt;''" Appearance="Info" FlexWidth="4" /&gt;
            &lt;Spacer Name="AMLSpacerAnswer3" VisibleExpression="keystring('cc29AMLAnswer3Log')=''" FlexWidth="4" /&gt;
        &lt;/Group&gt;
        &lt;Spacer Name="AMLSpacer3" Height="10" /&gt;
    &lt;/Group&gt;

    &lt;Group Name="AMLGroup4" Orientation="Vertical" VisibleExpression="customfieldint('cc29AMLAnswer3')=1"&gt;
        &lt;TextBlock Name="AMLQuestion4" ValueExpression="Customfield.allinstances-&gt;select(fieldname='cc29AMLAnswer4')-&gt;first.designation-&gt;translate" FitMode="Wrap" Appearance="Info"/&gt;
       &lt;Group Name="AMLCheckBoxLogGroup4"&gt;
            &lt;AdditionalFieldComboBox Name="AMLAnswer4" ShowLabel="False" ValueExpression="customfieldint('cc29AMLAnswer4')" /&gt;
            &lt;TextBlock Name="AMLAnswer4Log" ValueExpression="keystring('cc29AMLAnswer4Log')" VisibleExpression="keystring('cc29AMLAnswer4Log')&amp;lt;&amp;gt;''" Appearance="Info" FlexWidth="4" /&gt;
            &lt;Spacer Name="AMLSpacerAnswer4" VisibleExpression="keystring('cc29AMLAnswer4Log')=''" FlexWidth="4" /&gt;
        &lt;/Group&gt;
        &lt;Spacer Name="AMLSpacer4" Height="10" /&gt;
    &lt;/Group&gt;

    &lt;Group Name="AMLGroup5" Orientation="Vertical" VisibleExpression="customfieldint('cc29AMLAnswer4')=1"&gt;
        &lt;TextBlock Name="AMLQuestion5" ValueExpression="Customfield.allinstances-&gt;select(fieldname='cc29AMLAnswer5')-&gt;first.designation-&gt;translate" FitMode="Wrap" Appearance="Info"/&gt;
        &lt;Group Name="AMLCheckBoxLogGroup5"&gt;
            &lt;AdditionalFieldComboBox Name="AMLAnswer5" ShowLabel="False" ValueExpression="customfieldint('cc29AMLAnswer5')" /&gt;
            &lt;TextBlock Name="AMLAnswer5Log" ValueExpression="keystring('cc29AMLAnswer5Log')" VisibleExpression="keystring('cc29AMLAnswer5Log')&amp;lt;&amp;gt;''" Appearance="Info" FlexWidth="4" /&gt;
            &lt;Spacer Name="AMLSpacerAnswer5" VisibleExpression="keystring('cc29AMLAnswer5Log')=''" FlexWidth="4" /&gt;
        &lt;/Group&gt;
        &lt;Spacer Name="AMLSpacer5" Height="20" /&gt;
    &lt;/Group&gt;

    &lt;Group Name="AMLResultGroup" Separator="Always" VisibleExpression="folders-&gt;select(parentfolder.entryid='KeywordFolderAMLResult')-&gt;size&gt;0" &gt;
        &lt;TextBlock Name="AMLResultText" IsBold="True" ValueExpression="folders-&gt;select(parentfolder.entryid='KeywordFolderAMLResult')-&gt;first.remarks-&gt;translate" FitMode="Wrap" Appearance="Info" /&gt;
    &lt;/Group&gt;    
    &lt;Spacer Name="AMLSpacer6" Height="20" /&gt;
    &lt;Group Name="AMLCompletedGroup" Orientation="Vertical" VisibleExpression="folders-&gt;select(parentfolder.entryid='KeywordFolderAMLResult')-&gt;size&gt;0" &gt;
      &lt;CheckBox Name="AMLCompleted" ShowLabel="False" Text="{Translate 'I confirm that I have performed the check properly and in full.'}" ValueExpression="customfieldbool('cc29AMLCompleted')" /&gt;
       &lt;Spacer Name="SpacerAMLLog" Height="5" /&gt;
      &lt;TextBlock Name="AMLCompletedLog" ValueExpression="keystring('CompletedLog')" Appearance="Info" /&gt;
    &lt;/Group&gt;
    &lt;Spacer Name="SpacerKYCButton" Height="20" /&gt;
    &lt;ScriptButton Name="ButtonCreateKYCCheck" Text="{Translate 'Create KYC check'}" ScriptName="create_kyc_check_from_aml_check" HorizontalAlignment="Right" VisibleExpression="customfieldbool('cc29AMLCompleted') and (ClassSettings.allInstances-&gt;select(class.containsType(ConfigSetCustomClass05))-&amp;gt;select(entryid='ClassSettingsCc05KycCheck')-&amp;gt;size&amp;gt;0) and (folders-&gt;select(entryid='FolderAMLTrue')-&gt;size&amp;gt;0) and (ConfigSetCustomClass05-&gt;isCreatable)" /&gt;
    
&lt;/Page&gt;

&lt;Page Override="AdditionalClassBaseFurtherInfo"&gt;

    &lt;Group Name="AMLRemarksGroup" Header="{Translate 'Remarks'}" Orientation="Vertical"&gt; 
        &lt;Spacer Name="AMLRemakrsSpacer" Height="1" /&gt;
        &lt;TextArea Name="AMLRemarks" ValueExpression="remarks" Lines="25" ShowLabel="False" /&gt;
    &lt;/Group&gt;
    
&lt;/Page&gt;</member>
      <member name="classStringrepExpression">'AML check'.translate + ' ' + creationdatetime.asstring</member>
      <member name="class">ConfigSetCustomClass29</member>
      <member name="classnameExpression">'AML check'</member>
      <member name="gridDefs">
        <object class="GridDef" alias="GridDef0">
          <member name="rowHeight">17</member>
          <member name="ghostrow">false</member>
          <member name="editing">false</member>
          <member name="class">ConfigSetCustomClass29</member>
          <member name="gridcols">
            <object class="GridColDef" alias="GridColDef0">
              <member name="alignment">0</member>
              <member name="orderIdx">0</member>
              <member name="totals">false</member>
              <member name="expression">creationdatetime</member>
              <member name="readOnly">true</member>
              <member name="sortOrder">1</member>
              <member name="title">
                <mltext language="NV">Created on</mltext>
              </member>
              <member name="tabstop">true</member>
              <member name="width">80</member>
              <member name="isFixed">false</member>
              <member name="isDynamic">false</member>
              <member name="enableSpellCheck">false</member>
              <member name="griddef">
                <reference-object alias="GridDef0" />
              </member>
            </object>
            <object class="GridColDef" alias="GridColDef1">
              <member name="alignment">0</member>
              <member name="orderIdx">1</member>
              <member name="totals">false</member>
              <member name="expression">creator</member>
              <member name="readOnly">true</member>
              <member name="sortOrder">0</member>
              <member name="title">
                <mltext language="NV">Created by</mltext>
              </member>
              <member name="tabstop">true</member>
              <member name="width">150</member>
              <member name="isFixed">false</member>
              <member name="isDynamic">false</member>
              <member name="enableSpellCheck">false</member>
              <member name="griddef">
                <reference-object alias="GridDef0" />
              </member>
            </object>
            <object class="GridColDef" alias="GridColDef2">
              <member name="alignment">0</member>
              <member name="orderIdx">2</member>
              <member name="controlName">cmbExclusiveKeywordFolder</member>
              <member name="rendererName">rndExclusiveKeywordFolder</member>
              <member name="totals">false</member>
              <member name="expression">KeywordFolderAMLResult</member>
              <member name="readOnly">true</member>
              <member name="sortOrder">0</member>
              <member name="title">
                <mltext language="NV">Result</mltext>
              </member>
              <member name="tabstop">true</member>
              <member name="width">245</member>
              <member name="isFixed">false</member>
              <member name="isDynamic">false</member>
              <member name="enableSpellCheck">false</member>
              <member name="griddef">
                <reference-object alias="GridDef0" />
              </member>
            </object>
          </member>
          <member name="classSettings">
            <reference-object alias="ClassSettings_ConfigSetCustomClass2935" />
          </member>
        </object>
      </member>
    </object>
    <object class="CustomLinkType" alias="CustomLinkType_Project-WWFTcheck0">
      <member name="entryID">LnkProjectAMLCheck</member>
      <member name="active">true</member>
      <member name="allowLinks">true</member>
      <member name="roleA">
        <object class="CustomlinkRole" alias="CustomlinkRole0">
          <member name="alwaysShowContainer">false</member>
          <member name="isSingle">false</member>
          <member name="orderIdx">560</member>
          <member name="canCreateTarget">true</member>
          <member name="deleteTarget">true</member>
          <member name="targetClassName">ConfigSetCustomClass29</member>
          <member name="persistentIcon">87</member>
          <member name="designation">AML check</member>
          <member name="showContainer">true</member>
          <member name="isExpandable">true</member>
          <member name="openInNavigationView">CurrentView</member>
          <member name="linktypeA">
            <reference-object alias="CustomLinkType_Project-WWFTcheck0" />
          </member>
        </object>
      </member>
      <member name="roleB">
        <object class="CustomlinkRole" alias="CustomlinkRole1">
          <member name="alwaysShowContainer">false</member>
          <member name="isSingle">true</member>
          <member name="orderIdx">0</member>
          <member name="canCreateTarget">false</member>
          <member name="deleteTarget">false</member>
          <member name="targetClassName">Project</member>
          <member name="persistentIcon">6</member>
          <member name="designation">Project</member>
          <member name="showContainer">true</member>
          <member name="isExpandable">true</member>
          <member name="openInNavigationView">CurrentView</member>
          <member name="linktypeB">
            <reference-object alias="CustomLinkType_Project-WWFTcheck0" />
          </member>
        </object>
      </member>
    </object>
    <object class="Folder" alias="Folder_KeineAML-Unterstellung16">
      <member name="entryID">FolderAMLFalse</member>
      <member name="remarks">This activity is not subject to the obligations under the Anti-Money Laundering Act (AML).</member>
      <member name="designation">Not Subject to the Anti-Money Laundering Act</member>
      <member name="persistentIcon">46</member>
      <member name="idx">2</member>
      <member name="tabsPerClass">false</member>
      <member name="isExpandable">true</member>
      <member name="openInNavigationView">CurrentView</member>
      <member name="parentfolder">
        <reference-object alias="Folder_AMLCheck14" />
      </member>
      <member name="canHaveSubFolders">true</member>
      <member name="inclusive">false</member>
      <member name="keyword">false</member>
      <member name="keywordActive">true</member>
      <member name="exclusive">false</member>
    </object>
    <object class="Folder" alias="Folder_AML-Unterstellung15">
      <member name="entryID">FolderAMLTrue</member>
      <member name="remarks">This activity is subject to the obligations set forth in the Anti-Money Laundering Act (AML).</member>
      <member name="designation">Subject to the Anti-Money Laundering Act</member>
      <member name="persistentIcon">47</member>
      <member name="idx">1</member>
      <member name="tabsPerClass">false</member>
      <member name="isExpandable">true</member>
      <member name="openInNavigationView">CurrentView</member>
      <member name="parentfolder">
        <reference-object alias="Folder_AMLCheck14" />
      </member>
      <member name="canHaveSubFolders">true</member>
      <member name="inclusive">false</member>
      <member name="keyword">false</member>
      <member name="keywordActive">true</member>
      <member name="exclusive">false</member>
    </object>
    <object class="Folder" alias="Folder_AMLCheck14">
      <member name="entryID">KeywordFolderAMLResult</member>
      <member name="designation">AML check</member>
      <member name="persistentIcon">87</member>
      <member name="idx">1010</member>
      <member name="tabsPerClass">false</member>
      <member name="isExpandable">true</member>
      <member name="openInNavigationView">CurrentView</member>
      <member name="parentfolder">
        <reference-object alias="SettingsFolder0" />
      </member>
      <member name="canHaveSubFolders">true</member>
      <member name="inclusive">false</member>
      <member name="keyword">false</member>
      <member name="keywordActive">true</member>
      <member name="exclusive">false</member>
    </object>
    <object class="Script" alias="Script_create_kyc_check_from_aml_check19">
      <member name="entryID">ScriptCreateKycCheckFromAmlCheck</member>
      <member name="designation">create_kyc_check_from_aml_check</member>
      <member name="containerScript">false</member>
      <member name="scriptText"># coding: windows-1252
#
# Designation: create_kyc_check_from_aml_check
# Show in Vertec menus:
# Classes:
# Display condition:
# Event script for:
# Event classes:
# Event fields:
# Extended rights:

# This script is called via a button on an AML check, 
# if the AML check was completed with a positive result 
# and the KYC config set is available in the system.
# Creates a KYC check and links it to the related project.

# 2026-07-16 UHE: Created


def main(argobject):
    """
    Creates a KYC check based on an AML check and links it to the related project.
    Opens the KYC check form after creation.
    """

    # Return if the KYC check class setting is missing.
    kyc_check_class_setting = vtcapp.evalocl(
        "ClassSettings.allInstances"
        "-&gt;select(class.containsType(ConfigSetCustomClass05))"
        "-&gt;select(eintragid='ClassSettingsCc05KycCheck')"
        "-&gt;first"
    )
    if not kyc_check_class_setting:
        return

    aml_check = argobject

    project = aml_check.evalocl(
        "getlinks('LnkProjectAMLCheck_B')-&gt;first.oclastype(Project)"
    )
    if not project:
        return

    kyc_check = vtcapp.createobject("ConfigSetCustomClass05")
    kyc_check.cc05Project = project
    vtcapp.showdetailform(kyc_check)


main(argobject)
</member>
      <member name="eventType">None</member>
      <member name="objectScript">false</member>
      <member name="extendedRights">false</member>
      <member name="selectedObjectsScript">false</member>
      <member name="platform">Python3</member>
    </object>
    <object class="Script" alias="Script_event_wwft36">
      <member name="entryID">ScriptEventAmlCheck</member>
      <member name="designation">event_aml_check</member>
      <member name="eventClass">ConfigSetCustomClass29</member>
      <member name="containerScript">false</member>
      <member name="scriptText"># coding: windows-1252
#
# Designation: event_aml_check
# Show in Vertec menus:
# Classes:
# Display condition:
# Event script for: Changed
# Event classes: ConfigSetCustomClass29
# Event fields:
# Extended rights: Y

# Logs actions on AML checks and resets fields if necessary. 
# Assigns the results folder if the check is completed.

# 2026-07-16 UHE: Created


MAX_QUESTIONS = 5


def get_log_text(completion=False):
    """
    Returns a log entry for an AML check action
    with the current user and timestamp.
    """

    now = vtcapp.currentdatetime()
    if completion:
        text = vtcapp.translate("Performed by {} on {} {}")
    else:
        text = vtcapp.translate("Answered by {} on {} {}")
    return text.format(
        vtcapp.currentlogin(),
        vtcapp.datetostr(now),
        now.strftime('%H:%M')
    )


def get_aml_folder(entry_id):
    """
    Returns the AML result folder with the given entry ID.
    """
    return vtcapp.evalocl(
        "folder-&gt;select(entryid='{}')-&gt;first".format(entry_id)
    )


def main(aml_check):
    """
    Clears dependent answers after a changed question, logs user actions,
    updates completion status, and assigns the appropriate result folder
    based on the questionnaire outcome.
    """

    event_member = args.eventmember

    # Handle completion event, add log text and return
    if event_member == "cc29AMLCompleted":
        if aml_check.cc29AMLCompleted:
            # We disable events here to prevent the 
            # script from being called multiple times
            with vtcapp.DisabledEvents():
                # We need system context here because writing
                # not allowed once completion is True
                with vtcapp.SystemContext():
                    aml_check.cc29AMLCompletedOn = vtcapp.currentdatetime()
                    aml_check.cc29AMLCompletedBy = vtcapp.currentlogin()
                    aml_check.setkeyvalue(
                        "CompletedLog",
                        get_log_text(completion=True)
                    )
        else:
            # We disable events here to prevent the 
            # script from being called multiple times
            with vtcapp.DisabledEvents():
                aml_check.cc29AMLCompletedOn = None
                aml_check.cc29AMLCompletedBy = None
                aml_check.setkeyvalue("CompletedLog", "")
        return

    # Validate that the event belongs to a valid AML question
    # and extract the index of the changed answer.
    if not event_member.startswith("cc29AMLAnswer"):
        return
    try:
        idx = int(event_member.removeprefix("cc29AMLAnswer"))
    except ValueError:
        return

    if idx &lt; 1 or idx &gt; MAX_QUESTIONS:
        return

    # Reset completion status. A changed answer invalidates the completed check.
    # This should normally not happen, but an administrator could modify
    # answers after the check was marked as completed.
    aml_check.cc29AMLCompleted = False

    # Delete all subsequent answers
    for field_number in range(idx + 1, MAX_QUESTIONS + 1):
        field_name = "cc29AMLAnswer{}".format(field_number)
        field_key = "{}Log".format(field_name)
        # Reset fields
        if getattr(aml_check, field_name):
            # We disable events here to prevent the 
            # script from being called multiple times
            with vtcapp.DisabledEvents():
                setattr(aml_check, field_name, None)
        # Reset log keys
        if aml_check.getkeystring(field_key):
            # We disable events here to prevent the 
            # script from being called multiple times
            with vtcapp.DisabledEvents():
                aml_check.setkeyvalue(field_key, "")

    # Create log entry for current answer
    value = getattr(aml_check, event_member, None)
    field_key = "{}Log".format(event_member)
    if value:
        # We disable events here to prevent the 
        # script from being called multiple times
        with vtcapp.DisabledEvents():
            aml_check.setkeyvalue(field_key, get_log_text())
    else:
        # We disable events here to prevent the 
        # script from being called multiple times
        with vtcapp.DisabledEvents():
            aml_check.setkeyvalue(field_key, "")

    # Reset existing AML result folders
    for entry_id in ("FolderAMLTrue", "FolderAMLFalse"):
        folder = get_aml_folder(entry_id)
        if folder in aml_check.folders:
            aml_check.folders.remove(folder)

    # Determine AML result based on questionnaire outcome.
    # A negative answer immediately results in a negative check result.
    # A positive result requires all questions to be answered with option 1.
    last_answer = getattr(aml_check, "cc29AMLAnswer{}".format(MAX_QUESTIONS), None)
    result_folder = None
    if value == 2:
        result_folder = get_aml_folder("FolderAMLFalse")
    elif last_answer == 1:
        result_folder = get_aml_folder("FolderAMLTrue")

    # Add the determined result folder if applicable
    if result_folder is not None and result_folder not in aml_check.folders:
        # We disable events here to prevent the 
        # script from being called multiple times
        with vtcapp.DisabledEvents():
            aml_check.folders.append(result_folder)


main(argobject)
</member>
      <member name="eventType">Changed</member>
      <member name="objectScript">false</member>
      <member name="extendedRights">true</member>
      <member name="selectedObjectsScript">false</member>
      <member name="platform">Python3</member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLQuestion1">
      <member name="entryID">TranslationAmIAConsultant</member>
      <member name="text">
        <mltext language="DE">Bin ich eine Beraterin oder ein Berater?</mltext>
        <mltext language="EN">Am I a consultant?</mltext>
        <mltext language="FR">Suis-je consultant(e) ?</mltext>
        <mltext language="IT">Sono un/a consulente?</mltext>
        <mltext language="DD">Bin ich eine Beraterin oder ein Berater?</mltext>
        <mltext language="NL">Ben ik een consultant?</mltext>
        <mltext language="NV">Am I a consultant?</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLQuestion5">
      <member name="entryID">TranslationAmIActingInAProfessionalCapacity</member>
      <member name="text">
        <mltext language="DE">Handle ich berufsmässig?</mltext>
        <mltext language="EN">Am I acting in a professional capacity?</mltext>
        <mltext language="FR">Agis-je à titre professionnel ?</mltext>
        <mltext language="IT">Agisco in veste professionale?</mltext>
        <mltext language="DD">Handle ich berufsmäßig?</mltext>
        <mltext language="NL">Handel ik in een professionele hoedanigheid?</mltext>
        <mltext language="NV">Am I acting in a professional capacity?</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLQuestion4">
      <member name="entryID">TranslationAmIDirectlyInvolvedInAFinancialTransaction</member>
      <member name="text">
        <mltext language="DE">Wirke ich kausal an einer finanziellen Transaktion mit?</mltext>
        <mltext language="EN">Am I directly involved in a financial transaction?</mltext>
        <mltext language="FR">Suis-je directement impliqué(e) dans une transaction financière ?</mltext>
        <mltext language="IT">Sono direttamente coinvolto/a in una transazione finanziaria?</mltext>
        <mltext language="DD">Wirke ich kausal an einer finanziellen Transaktion mit?</mltext>
        <mltext language="NL">Ben ik rechtstreeks betrokken bij een financiële transactie?</mltext>
        <mltext language="NV">Am I directly involved in a financial transaction?</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_FolderAMLCheck">
      <member name="entryID">TranslationAmlCheck</member>
      <member name="text">
        <mltext language="DE">GwG Prüfung</mltext>
        <mltext language="EN">AML check</mltext>
        <mltext language="FR">Contrôle LBA</mltext>
        <mltext language="IT">Verifica LRD</mltext>
        <mltext language="DD">GwG Prüfung</mltext>
        <mltext language="NL">WWFT check</mltext>
        <mltext language="NV">AML check</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_Übersetzung:Answeredby{}on{}4">
      <member name="entryID">TranslationAnsweredByOn</member>
      <member name="text">
        <mltext language="DE">Beantwortet von {} am {} {}</mltext>
        <mltext language="EN">Answered by {} on {} {}</mltext>
        <mltext language="FR">Réponse fournie par {} le {} {}</mltext>
        <mltext language="IT">Risposta fornita da {} il {} {}</mltext>
        <mltext language="DD">Beantwortet von {} am {} {}</mltext>
        <mltext language="NL">Beantwoord door {} op {} {}</mltext>
        <mltext language="NV">Answered by {} on {} {}</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_ButtonCreateKycCheck">
      <member name="entryID">TranslationCreateKycCheck</member>
      <member name="text">
        <mltext language="DE">KYC Prüfung erstellen</mltext>
        <mltext language="EN">Create KYC check</mltext>
        <mltext language="FR">Créer un contrôle KYC</mltext>
        <mltext language="IT">Crea verifica KYC</mltext>
        <mltext language="DD">KYC Prüfung erstellen</mltext>
        <mltext language="NL">KYC-controle aanmaken</mltext>
        <mltext language="NV">Create KYC check</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLQuestion3">
      <member name="entryID">TranslationDoesAnExceptionAsDefinedInTheAntiMoneyLaunderingActApply</member>
      <member name="text">
        <mltext language="DE">Liegt ein im GwG definierter Ausnahmefall vor?</mltext>
        <mltext language="EN">Does an exception as defined in the Anti-Money Laundering Act apply?</mltext>
        <mltext language="FR">Une exception définie dans la LBA s'applique-t-elle ?</mltext>
        <mltext language="IT">Si applica un'eccezione definita nella LRD?</mltext>
        <mltext language="DD">Liegt ein im GwG definierter Ausnahmefall vor?</mltext>
        <mltext language="NL">Geldt er een uitzondering in de zin van de wet ter bestrijding van het witwassen van geld?</mltext>
        <mltext language="NV">Does an exception as defined in the Anti-Money Laundering Act apply?</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLQuestion2">
      <member name="entryID">TranslationDoesAnyOfTheLegalTransactionsListedInTheAntiMoneyLaunderingActApply</member>
      <member name="text">
        <mltext language="DE">Liegt einer der im GwG aufgeführten Rechtsvorgänge vor?</mltext>
        <mltext language="EN">Does any of the legal transactions listed in the Anti-Money Laundering Act apply?</mltext>
        <mltext language="FR">L'une des transactions juridiques énumérées dans la LBA s'applique-t-elle ?</mltext>
        <mltext language="IT">Si applica una delle transazioni legali elencate nella LRD?</mltext>
        <mltext language="DD">Liegt einer der im GwG aufgeführten Rechtsvorgänge vor?</mltext>
        <mltext language="NL">Is een van de in de antiwitwaswet opgesomde rechtshandelingen van toepassing?</mltext>
        <mltext language="NV">Does any of the legal transactions listed in the Anti-Money Laundering Act apply?</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_AMLCompletedCheckbox">
      <member name="entryID">TranslationIConfirmThatIHavePerformedTheCheckProperlyAndInFull</member>
      <member name="text">
        <mltext language="DE">Ich bestätige, dass ich die Prüfung ordnungsgemäss und vollständig durchgeführt habe.</mltext>
        <mltext language="EN">I confirm that I have performed the check properly and in full.</mltext>
        <mltext language="FR">Je confirme que j’ai effectué la vérification correctement et intégralement.</mltext>
        <mltext language="IT">Confermo di aver effettuato la verifica in modo corretto e completo.</mltext>
        <mltext language="DD">Ich bestätige, dass ich die Prüfung ordnungsgemäß und vollständig durchgeführt habe.</mltext>
        <mltext language="NL">Ik bevestig dat ik de controle naar behoren en volledig heb uitgevoerd.</mltext>
        <mltext language="NV">I confirm that I have performed the check properly and in full.</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_FolderNotSubjectToAML">
      <member name="entryID">TranslationNotSubjectToTheAntiMoneyLaunderingAct</member>
      <member name="text">
        <mltext language="DE">Nicht dem Geldwäschereigesetz (GwG) unterstellt</mltext>
        <mltext language="EN">Not Subject to the Anti-Money Laundering Act</mltext>
        <mltext language="FR">Non soumis à la loi sur le blanchiment d'argent (LBA)</mltext>
        <mltext language="IT">Non soggetto alla legge sul riciclaggio di denaro (LRD)</mltext>
        <mltext language="DD">Nicht dem Geldwäschereigesetz (GwG) unterstellt</mltext>
        <mltext language="NL">Niet onderworpen aan de antiwitwaswet</mltext>
        <mltext language="NV">Not Subject to the Anti-Money Laundering Act</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_Übersetzung:Performedby{}on{}4">
      <member name="entryID">TranslationPerformedByOnWithTime</member>
      <member name="text">
        <mltext language="DE">Durchgeführt von {} am {} {}</mltext>
        <mltext language="EN">Performed by {} on {} {}</mltext>
        <mltext language="FR">Effectué par {} le {} {}</mltext>
        <mltext language="IT">Eseguito da {} il {} {}</mltext>
        <mltext language="DD">Durchgeführt von {} am {} {}</mltext>
        <mltext language="NL">Uitgevoerd door {} op {} {}</mltext>
        <mltext language="NV">Performed by {} on {} {}</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_Übersetzung:Result32">
      <member name="entryID">TranslationResult</member>
      <member name="text">
        <mltext language="DE">Resultat</mltext>
        <mltext language="EN">Result</mltext>
        <mltext language="FR">Résultat</mltext>
        <mltext language="IT">Risultato</mltext>
        <mltext language="DD">Resultat</mltext>
        <mltext language="NL">Resultaat</mltext>
        <mltext language="NV">Result</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_FolderSubjectToAML">
      <member name="entryID">TranslationSubjectToTheAntiMoneyLaunderingAct</member>
      <member name="text">
        <mltext language="DE">Dem Geldwäschereigesetz (GwG) unterstellt</mltext>
        <mltext language="EN">Subject to the Anti-Money Laundering Act</mltext>
        <mltext language="FR">Soumis à la loi sur le blanchiment d'argent (LBA)</mltext>
        <mltext language="IT">Soggetto alla legge sul riciclaggio di denaro (LRD)</mltext>
        <mltext language="DD">Dem Geldwäschereigesetz (GwG) unterstellt</mltext>
        <mltext language="NL">Onderworpen aan de wet ter bestrijding van het witwassen van geld</mltext>
        <mltext language="NV">Subject to the Anti-Money Laundering Act</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_FolderAMLCheckResultFalse">
      <member name="entryID">TranslationThisActivityIsNotSubjectToTheObligationsUnderTheAntiMoneyLaunderingActAml</member>
      <member name="text">
        <mltext language="DE">Die Tätigkeit unterliegt nicht den Pflichten gemäss Geldwäschereigesetz (GwG).</mltext>
        <mltext language="EN">This activity is not subject to the obligations under the Anti-Money Laundering Act (AML).</mltext>
        <mltext language="FR">Cette activité n'est pas soumise aux obligations prévues par la loi sur la lutte contre le blanchiment d'argent.</mltext>
        <mltext language="IT">Tale attività non è soggetta agli obblighi previsti dalla legge antiriciclaggio.</mltext>
        <mltext language="DD">Die Tätigkeit unterliegt nicht den Pflichten gemäß Geldwäschereigesetz (GwG).</mltext>
        <mltext language="NL">Deze activiteit valt niet onder de verplichtingen uit hoofde van de WWFT.</mltext>
        <mltext language="NV">This activity is not subject to the obligations under the Anti-Money Laundering Act (AML).</mltext>
      </member>
    </object>
    <object class="TranslationItem" alias="TranslationItem_FolderAMLCheckResultTrue">
      <member name="entryID">TranslationThisActivityIsSubjectToTheObligationsSetForthInTheAntiMoneyLaunderingActAml</member>
      <member name="text">
        <mltext language="DE">Die Tätigkeit unterliegt den Pflichten gemäss Geldwäschereigesetz (GwG).</mltext>
        <mltext language="EN">This activity is subject to the obligations set forth in the Anti-Money Laundering Act (AML).</mltext>
        <mltext language="FR">Cette activité est soumise aux obligations prévues par la loi sur la lutte contre le blanchiment d'argent.</mltext>
        <mltext language="IT">Tale attività è soggetta agli obblighi previsti dalla legge antiriciclaggio.</mltext>
        <mltext language="DD">Die Tätigkeit unterliegt den Pflichten gemäß Geldwäschereigesetz (GwG).</mltext>
        <mltext language="NL">Deze activiteit is onderworpen aan de verplichtingen die zijn vastgelegd in de wet tegen het WWFT.</mltext>
        <mltext language="NV">This activity is subject to the obligations set forth in the Anti-Money Laundering Act (AML).</mltext>
      </member>
    </object>
  </objects>
  <settings />
</configset>