gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-wallet-core] 03/04: vqf form from gana


From: gnunet
Subject: [taler-wallet-core] 03/04: vqf form from gana
Date: Thu, 02 Jan 2025 22:22:43 +0100

This is an automated email from the git hooks/post-receive script.

sebasjm pushed a commit to branch master
in repository wallet-core.

commit b37878ab17854f7fdfa00c5b8b5593369eb19167
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Thu Jan 2 18:22:20 2025 -0300

    vqf form from gana
---
 packages/kyc-ui/package.json                       |    1 +
 packages/kyc-ui/src/app.tsx                        |    7 +-
 packages/kyc-ui/src/context/notifier.ts            |   60 +
 packages/kyc-ui/src/forms/accept-tos.ts            |   23 +-
 packages/kyc-ui/src/forms/ganaForms.ts             |  288 ++++
 packages/kyc-ui/src/forms/index.ts                 |    7 +
 .../kyc-ui/src/forms/taler_aml_attributes.json     | 1661 ++++++++++++++++++++
 packages/kyc-ui/src/forms/taler_aml_attributes.ts  | 1047 ++++++++++++
 packages/kyc-ui/src/index.html                     |    2 +-
 packages/kyc-ui/src/pages/FillForm.tsx             |  169 +-
 packages/kyc-ui/src/pages/Frame.tsx                |   23 +-
 packages/kyc-ui/src/pages/Start.tsx                |   14 +-
 packages/kyc-ui/src/pages/TriggerKyc.tsx           |  172 +-
 packages/kyc-ui/tsconfig.json                      |    1 +
 14 files changed, 3343 insertions(+), 132 deletions(-)

diff --git a/packages/kyc-ui/package.json b/packages/kyc-ui/package.json
index 81459cab1..71f990a7c 100644
--- a/packages/kyc-ui/package.json
+++ b/packages/kyc-ui/package.json
@@ -57,6 +57,7 @@
   "dependencies": {
     "swr": "2.0.3",
     "@gnu-taler/taler-util": "workspace:*",
+    "date-fns": "2.29.3",
     "@gnu-taler/web-util": "workspace:*",
     "preact": "10.11.3"
   }
diff --git a/packages/kyc-ui/src/app.tsx b/packages/kyc-ui/src/app.tsx
index 27539ac44..e78b42aa8 100644
--- a/packages/kyc-ui/src/app.tsx
+++ b/packages/kyc-ui/src/app.tsx
@@ -40,6 +40,7 @@ import { Frame } from "./pages/Frame.js";
 import { KycUiSettings, fetchSettings } from "./settings.js";
 import { revalidateKycInfo } from "./hooks/kyc.js";
 import { fetchUiForms, UiFormsProvider } from "./context/ui-forms.js";
+import { NotifierProvider } from "./context/notifier.js";
 
 const WITH_LOCAL_STORAGE_CACHE = false;
 
@@ -99,8 +100,10 @@ export function App(): VNode {
           >
             <TalerWalletIntegrationBrowserProvider>
               <BrowserHashNavigationProvider>
-              <UiFormsProvider value={forms}>
-                <Routing />
+                <UiFormsProvider value={forms}>
+                  <NotifierProvider>
+                    <Routing />
+                  </NotifierProvider>
                 </UiFormsProvider>
               </BrowserHashNavigationProvider>
             </TalerWalletIntegrationBrowserProvider>
diff --git a/packages/kyc-ui/src/context/notifier.ts 
b/packages/kyc-ui/src/context/notifier.ts
new file mode 100644
index 000000000..84ad2940b
--- /dev/null
+++ b/packages/kyc-ui/src/context/notifier.ts
@@ -0,0 +1,60 @@
+/*
+ This file is part of GNU Taler
+ (C) 2022-2024 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+
+import { codecForUIForms, UiForms } from "@gnu-taler/web-util/browser";
+import { ComponentChildren, createContext, h, VNode } from "preact";
+import { useContext } from "preact/hooks";
+import { listeners } from "process";
+
+/**
+ *
+ * @author Sebastian Javier Marchano (sebasjm)
+ */
+
+export type Type = Notifier;
+export type Listener = (event: Event) => void;
+export type Event = {
+  type: string;
+  payload: string;
+};
+class Notifier {
+  private listener: Listener[] = [];
+  subscribe(f: Listener) {
+    this.listener.push(f);
+    return () => {
+      const idx = this.listener.findIndex((elem) => elem == f);
+      this.listener.splice(idx, 1);
+    };
+  }
+  emit(event: Event) {
+    this.listener.forEach((l) => l(event));
+  }
+}
+
+const Context = createContext<Type>(new Notifier());
+
+export const useNotifierContext = (): Type => useContext(Context);
+
+export const NotifierProvider = ({
+  children,
+}: {
+  children: ComponentChildren;
+}): VNode => {
+  return h(Context.Provider, {
+    value: new Notifier(),
+    children,
+  });
+};
diff --git a/packages/kyc-ui/src/forms/accept-tos.ts 
b/packages/kyc-ui/src/forms/accept-tos.ts
index b73917426..0e05aa996 100644
--- a/packages/kyc-ui/src/forms/accept-tos.ts
+++ b/packages/kyc-ui/src/forms/accept-tos.ts
@@ -20,21 +20,26 @@ import type {
   UIHandlerId,
 } from "@gnu-taler/web-util/browser";
 
-function filterUndefined<T>(ar: Array<T|undefined>): Array<T> {
-  return ar.filter((a):a is T => !!a)
+function filterUndefined<T>(ar: Array<T | undefined>): Array<T> {
+  return ar.filter((a): a is T => !!a);
 }
 
-export const acceptTos = (i18n: InternationalizationAPI, context?: any): 
DoubleColumnForm => ({
+export const acceptTos = (
+  i18n: InternationalizationAPI,
+  context?: any,
+): DoubleColumnForm => ({
   type: "double-column" as const,
   design: [
     {
-      title: i18n.str`Accept Term of Service`,
+      title: i18n.str`Accept Terms of Service`,
       fields: filterUndefined([
-        context?.tos_url ? {
-          type: "htmlIframe",
-          label: context?.provider_name ?? `Link`,
-          url: context.tos_url
-        } : undefined,
+        context?.tos_url
+          ? {
+              type: "htmlIframe",
+              label: context?.provider_name ?? `Link`,
+              url: context.tos_url,
+            }
+          : undefined,
         {
           type: "toggle",
           id: "ACCEPTED_TERMS_OF_SERVICE" as UIHandlerId,
diff --git a/packages/kyc-ui/src/forms/ganaForms.ts 
b/packages/kyc-ui/src/forms/ganaForms.ts
new file mode 100644
index 000000000..aec6012fc
--- /dev/null
+++ b/packages/kyc-ui/src/forms/ganaForms.ts
@@ -0,0 +1,288 @@
+/*
+ This file is part of GNU Taler
+ (C) 2022-2024 Taler Systems S.A.
+
+ GNU Taler is free software; you can redistribute it and/or modify it under the
+ terms of the GNU General Public License as published by the Free Software
+ Foundation; either version 3, or (at your option) any later version.
+
+ GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+ A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along with
+ GNU Taler; see the file COPYING.  If not, see <http://www.gnu.org/licenses/>
+ */
+import {
+  DoubleColumnForm,
+  InternationalizationAPI,
+  UIFormElementConfig,
+  UIFormFieldBaseConfig,
+  UIHandlerId,
+} from "@gnu-taler/web-util/browser";
+
+import ganaForms from "./taler_aml_attributes.json";
+
+type GanaField = {
+  required: boolean;
+  section: string;
+  type: string;
+  label: string;
+  order?: number;
+  enumeration: string[];
+};
+
+type GanaForm = { [fieldName: string]: GanaField | string };
+
+type FieldsBySection = {
+  [section: string]: (UIFormElementConfig & { order?: number })[];
+};
+
+export function VQF_902_1(i18n: InternationalizationAPI): DoubleColumnForm {
+  const fieldsBySections = convertGanaJsonToDoubleColumnFormSection(
+    ganaForms.VQF_902_1,
+    converGanaField,
+  );
+
+  return {
+    type: "double-column",
+    design: [
+      {
+        title: i18n.str`This form was completed by`,
+        fields: fieldsBySections["header"].map((f) => {
+          (f as UIFormFieldBaseConfig).disabled = true;
+          return f;
+        }),
+      },
+      {
+        title: i18n.str`Information`,
+        description: i18n.str`The customer is the person with whom the member 
concludes the contract with regard to the financial service provided (civil 
law). Does the member act as director of a domiciliary company, this 
domiciliary company is the customer.`,
+        fields: fieldsBySections["1"],
+      },
+      {
+        title: i18n.str`Information on the natural persons who establish the 
business relationship for legal entities and partnerships`,
+        description: i18n.str`For legal entities and partnerships the identity 
of the natural persons who establish the business relationship must be 
verified.`,
+        fields: fieldsBySections["2"],
+      },
+      {
+        title: i18n.str`Acceptance of business relationship`,
+        fields: fieldsBySections["3"],
+      },
+      {
+        title: i18n.str`Information on the beneficial owner of the assets 
and/or controlling person`,
+        description: i18n.str`Establishment of the beneficial owner of the 
assets and/or controlling person`,
+        fields: fieldsBySections["4"],
+      },
+      {
+        title: i18n.str`Evaluation with regard to embargo procedures/terrorism 
lists on establishing the business relationship`,
+        description: i18n.str`Verification whether the customer, beneficial 
owners of the assets, controlling persons, authorized representatives or other 
involved persons are listed on an embargo/terrorism list (date of 
verification/result)`,
+        fields: fieldsBySections["5"],
+      },
+    ],
+  };
+}
+
+function isArrayType(type: string): keyof typeof ganaForms | undefined {
+  if (!type.endsWith("[]")) return undefined;
+  return type.substring(0, type.length - 2) as keyof typeof ganaForms;
+}
+
+function isFormType(type: string): keyof typeof ganaForms | undefined {
+  const start = type.indexOf("<");
+  const end = type.indexOf(">");
+
+  if (start === -1 || end === -1) return undefined;
+  return type.substring(start + 1, end) as keyof typeof ganaForms;
+}
+
+function converGanaField(
+  fieldName: string,
+  fieldInfo: GanaField,
+): UIFormElementConfig {
+  const arrayType = isArrayType(fieldInfo.type);
+  if (arrayType) {
+    const ft = isFormType(arrayType);
+    const containedType = !ft ? arrayType : ft;
+    const fields = mergeAllSections(
+      convertGanaJsonToDoubleColumnFormSection(
+        ganaForms[containedType],
+        converGanaField,
+      ),
+    );
+    const f = fields.find((f) => "id" in f); //?.id;
+    const labelFieldId = f && "id" in f ? f.id : ("!!" as UIHandlerId);
+    return {
+      id: fieldName as UIHandlerId,
+      label: !fieldInfo.label ? fieldName : fieldInfo.label,
+      type: "array",
+      fields,
+      labelFieldId,
+    };
+  }
+  const formType = isFormType(fieldInfo.type);
+  if (formType) {
+    return {
+      label: !fieldInfo.label ? fieldName : fieldInfo.label,
+      type: "group",
+      fields: mergeAllSections(
+        convertGanaJsonToDoubleColumnFormSection(
+          ganaForms[formType] as GanaForm,
+          converGanaField,
+        ),
+      ),
+    };
+  }
+
+  switch (fieldInfo.type) {
+    case "Boolean": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "toggle",
+        required: fieldInfo.required,
+        threeState: false,
+      };
+    }
+    case "File": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "file",
+        required: fieldInfo.required,
+      };
+    }
+    case "String": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "Email": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "Phone": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "Paragraph": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "textArea",
+        required: fieldInfo.required,
+      };
+    }
+    case "ResidentialAddress": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label + "!!!",
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "BusinessAddress": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label + "!!!",
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "CountryCode": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "selectOne",
+        choices: [
+          { label: "AR", value: "AR" },
+          { label: "DE", value: "DE" },
+        ],
+        required: fieldInfo.required,
+      };
+    }
+    case "LangCode": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "text",
+        required: fieldInfo.required,
+      };
+    }
+    case "AbsoluteDateTime": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "absoluteTimeText",
+        required: fieldInfo.required,
+        placeholder: "dd/MM/yyyy HH:mm:ss",
+        pattern: "dd/MM/yyyy HH:mm:ss",
+      };
+    }
+    case "AbsoluteDate": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "absoluteTimeText",
+        required: fieldInfo.required,
+        placeholder: "dd/MM/yyyy",
+        pattern: "dd/MM/yyyy",
+      };
+    }
+    case "Amount": {
+      return {
+        id: fieldName as UIHandlerId,
+        label: !fieldInfo.label ? fieldName : fieldInfo.label,
+        type: "amount",
+        currency: "asd",
+        required: fieldInfo.required,
+      };
+    }
+    default: {
+      return {
+        type: "caption",
+        label: `unkown field type ${fieldInfo.type} for id ${fieldName}`,
+      };
+    }
+  }
+}
+
+function convertGanaJsonToDoubleColumnFormSection(
+  form: GanaForm,
+  convert: (name: string, info: GanaField) => UIFormElementConfig,
+): FieldsBySection {
+  const list = Object.entries(form);
+  const sections = list.reduce((prev, [key, value]) => {
+    if (typeof value === "string") {
+      return prev;
+    }
+    if (!prev[value.section]) {
+      prev[value.section] = [];
+    }
+    const d: UIFormElementConfig & { order?: number } = convert(key, value);
+    d.order = value.order;
+    prev[value.section].push(d);
+    return prev;
+  }, {} as FieldsBySection);
+
+  Object.values(sections).forEach((sec) => {
+    sec.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
+  });
+  return sections;
+}
+
+function mergeAllSections(fields: FieldsBySection): UIFormElementConfig[] {
+  const list = Object.values(fields).flatMap((d) => d);
+  list.sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
+  return list;
+}
diff --git a/packages/kyc-ui/src/forms/index.ts 
b/packages/kyc-ui/src/forms/index.ts
index ca8b1d49d..7301b0426 100644
--- a/packages/kyc-ui/src/forms/index.ts
+++ b/packages/kyc-ui/src/forms/index.ts
@@ -21,6 +21,7 @@ import { simplest } from "./simplest.js";
 import { acceptTos } from "./accept-tos.js";
 import { nameAndDob } from "./nameAndBirthdate.js";
 import { personalInfo } from "./personal-info.js";
+import { VQF_902_1 } from "./ganaForms.js";
 
 export const preloadedForms: (
   i18n: InternationalizationAPI,
@@ -44,6 +45,12 @@ export const preloadedForms: (
     version: 1,
     config: acceptTos(i18n, context),
   },
+  {
+    label: i18n.str`Identification form`,
+    id: "vqf-902-1",
+    version: 1,
+    config: VQF_902_1(i18n),
+  },
   {
     label: i18n.str`Name and birthdate`,
     id: "name_and_dob",
diff --git a/packages/kyc-ui/src/forms/taler_aml_attributes.json 
b/packages/kyc-ui/src/forms/taler_aml_attributes.json
new file mode 100644
index 000000000..d980edf0a
--- /dev/null
+++ b/packages/kyc-ui/src/forms/taler_aml_attributes.json
@@ -0,0 +1,1661 @@
+{
+  "VQF_902_1": {
+    "ACCEPTANCE_CORRESPONDENCE_SERVICE_TYPE": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Type of correspondence service",
+      "order": 3,
+      "enumeration": 
["TO_THE_CUSTOMER","HOLD_AT_BANK","TO_THE_MEMBER","TO_A_THIRD_PARTY"],
+      "section": "3"
+    },
+    "ACCEPTANCE_DATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "Date",
+      "order": 1,
+      "enumeration": [],
+      "section": "3"
+    },
+    "ACCEPTANCE_FURTHER_INFO": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Further information",
+      "order": 5,
+      "enumeration": [],
+      "section": "3"
+    },
+    "ACCEPTANCE_LANGUAGE": {
+      "required": false,
+      "closed": false,
+      "type": "LangCode",
+      "label": "Language",
+      "order": 4,
+      "enumeration": [],
+      "section": "3"
+    },
+    "ACCEPTANCE_METHOD": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "Accepted by",
+      "order": 2,
+      "enumeration": 
["FACE_TO_FACE","AUTHENTICATED_COPY","RESIDENTIAL_ADDRESS_VALIDATED"],
+      "section": "3"
+    },
+    "CUSTOMER_ENTITY_ADDRESS": {
+      "required": true,
+      "closed": false,
+      "type": "BusinessAddress",
+      "label": "Domicile",
+      "order": 14,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_COMPANY_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Company name",
+      "order": 13,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_CONTACT_PERSON_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Contact person",
+      "order": 15,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_EMAIL": {
+      "required": false,
+      "closed": false,
+      "type": "Email",
+      "label": "E-mail",
+      "order": 18,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Identification document",
+      "order": 19,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_ID_COPY": {
+      "required": true,
+      "closed": false,
+      "type": "File",
+      "label": "Picutre of identification document",
+      "order": 20,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ENTITY_PHONE": {
+      "required": false,
+      "closed": false,
+      "type": "Phone",
+      "label": "Telephone",
+      "order": 17,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "CUSTOMER_NATURAL_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "Date of birth",
+      "order": 5,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_COMPANY_ID": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Company identification document",
+      "order": 11,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_COMPANY_ID_COPY": {
+      "required": false,
+      "closed": false,
+      "type": "File",
+      "label": "Picture of company identification document",
+      "order": 12,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_COMPANY_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Company name",
+      "order": 9,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_EMAIL": {
+      "required": false,
+      "closed": false,
+      "type": "Email",
+      "label": "E-mail",
+      "order": 4,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "Nationality",
+      "order": 6,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_NATIONAL_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Identification document",
+      "order": 7,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_NATIONAL_ID_COPY": {
+      "required": true,
+      "closed": false,
+      "type": "File",
+      "label": "Picture of identification document",
+      "order": 8,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_PHONE": {
+      "required": false,
+      "closed": false,
+      "type": "Phone",
+      "label": "Telephone",
+      "order": 3,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_REGISTERED_OFFICE": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Registered office",
+      "order": 10,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_NATURAL_RESIDENTIAL": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "Residential address",
+      "order": 2,
+      "enumeration": [],
+      "section": "1"
+    },
+    "CUSTOMER_TYPE": {
+      "required": true,
+      "closed": true,
+      "type": "String",
+      "label": "Customer type",
+      "order": 1,
+      "enumeration": 
["NATURAL","LEGAL_ENTITY","FOUNDATION","TRUST","LIFE_INSURANCE","OTHER"],
+      "section": "4"
+    },
+    "EMBARGO_TERRORISM_INFO": {
+      "required": false,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "Embargo information",
+      "order": 2,
+      "enumeration": [],
+      "section": "5"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FOUNDER_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_1_founder>[]",
+      "label": "Founders",
+      "order": 1,
+      "enumeration": [],
+      "section": "2"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "RELATIONSHIP_PURPOSE": {
+      "required": false,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "Purpose of the business relationship",
+      "order": 3,
+      "enumeration": [],
+      "section": "6"
+    },
+    "RELATIONSHIP_TYPE": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "Type of business relationship",
+      "order": 1,
+      "enumeration": ["MONEY_EXCHANGE","MONEY_ASSET_TRANSFER"],
+      "section": "6"
+    },
+"":""},
+  "VQF_902_11": {
+    "CONTROLLING_ENTITY_CONTRACTING_PARTNER": {
+      "required": true,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "CONTROLLING_ENTITY_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "CONTROLLING_ENTITY_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "CONTROLLING_ENTITY_LEVEL": {
+      "required": true,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["25_MORE_RIGHTS","OTHER_WAY","DIRECTOR"],
+      "section": "2"
+    },
+    "CONTROLLING_ENTITY_THIRD_PERSON": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "SIGNATURE": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 2,
+      "enumeration": [],
+      "section": "footer"
+    },
+    "SIGN_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "order": 1,
+      "enumeration": [],
+      "section": "footer"
+    },
+"":""},
+  "VQF_902_12": {
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FOUNDATION_BENEFICIARY_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_12_beneficiary>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "FOUNDATION_CONTRACTING_PARTNER": {
+      "required": true,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "0"
+    },
+    "FOUNDATION_DISCRETIONARY": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "FOUNDATION_FOUNDER_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_12_founder>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+    "FOUNDATION_KNOWN_AS": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "0"
+    },
+    "FOUNDATION_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "FOUNDATION_PRE_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_12_pre>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "FOUNDATION_REPRESENTATIVE_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_12_representative>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "FOUNDATION_REVOCABLE": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "SIGNATURE": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 2,
+      "enumeration": [],
+      "section": "footer"
+    },
+    "SIGN_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "order": 1,
+      "enumeration": [],
+      "section": "footer"
+    },
+"":""},
+  "VQF_902_12_beneficiary": {
+    "FOUNDATION_BENEFICIARY_ADDITION": {
+      "required": false,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_BIRTHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_COUNTRY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_DOMICILE": {
+      "required": false,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_NATIONALITY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_BENEFICIARY_RIGHT_TO_CLAIM": {
+      "required": false,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_12_founder": {
+    "FOUNDATION_FOUNDER_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_FOUNDER_DEATHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_FOUNDER_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_FOUNDER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_FOUNDER_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_FOUNDER_RIGHT_TO_REVOKE": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_12_pre": {
+    "FOUNDATION_PRE_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_PRE_COUNTRY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_PRE_DEATHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_PRE_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_PRE_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_PRE_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_12_representative": {
+    "FOUNDATION_REPRESENTATIVE_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_REPRESENTATIVE_COUNTRY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_REPRESENTATIVE_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_REPRESENTATIVE_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_REPRESENTATIVE_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDATION_REPRESENTATIVE_RIGHT_TO_REVOKE": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_13": {
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "SIGNATURE": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 2,
+      "enumeration": [],
+      "section": "footer"
+    },
+    "SIGN_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "order": 1,
+      "enumeration": [],
+      "section": "footer"
+    },
+    "TRUST_BENEFICIARY_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_13_beneficiary>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "TRUST_CONTRACTING_PARTNER": {
+      "required": true,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "0"
+    },
+    "TRUST_DISCRETIONARY": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "TRUST_KNOWN_AS": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "0"
+    },
+    "TRUST_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "TRUST_PRE_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_13_pre>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "TRUST_PROTECTOR_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_13_protector>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "TRUST_REVOCABLE": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "TRUST_SETTLOR_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_13_settlor>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+"":""},
+  "VQF_902_13_beneficiary": {
+    "TRUST_BENEFICIARY_ADDITION": {
+      "required": false,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_BIRTHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_COUNTRY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_DOMICILE": {
+      "required": false,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_NATIONALITY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_BENEFICIARY_RIGHT_TO_CLAIM": {
+      "required": false,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_13_further": {
+    "TRUST_FURTHER_BIRTHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_FURTHER_COUNTRY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_FURTHER_DOMICILE": {
+      "required": false,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_FURTHER_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_FURTHER_LIST": {
+      "required": true,
+      "closed": false,
+      "type": "Form<VQF_902_13_further>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "TRUST_FURTHER_NATIONALITY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_FURTHER_RIGHT_TO_REVOKE": {
+      "required": false,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_13_pre": {
+    "TRUST_PRE_BIRTHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PRE_COUNTRY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PRE_DEATHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PRE_DOMICILE": {
+      "required": false,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PRE_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PRE_NATIONALITY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_13_protector": {
+    "TRUST_PROTECTOR_BIRTHDATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PROTECTOR_COUNTRY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PROTECTOR_DOMICILE": {
+      "required": false,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PROTECTOR_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PROTECTOR_NATIONALITY": {
+      "required": false,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_PROTECTOR_RIGHT_TO_REVOKE": {
+      "required": false,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_13_settlor": {
+    "TRUST_SETTLOR_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_SETTLOR_DEATHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_SETTLOR_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_SETTLOR_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_SETTLOR_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "TRUST_SETTLOR_RIGHT_TO_REVOKE": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_14": {
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "INCRISK_DOCUMENTS": {
+      "required": true,
+      "closed": false,
+      "type": "File[]",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "INCRISK_MEANS": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": ["GATHERING","CONSULTATION","ENQUIRIES"],
+      "section": "2"
+    },
+    "INCRISK_REASON": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "INCRISK_RESULT": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": 
["NO_SUSPICION","REASONABLE_SUSPICION","SIMPLE_SUSPICION"],
+      "section": "4"
+    },
+    "INCRISK_SUMMARY": {
+      "required": true,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+"":""},
+  "VQF_902_1_founder": {
+    "FOUNDER_AUTHORIZATION_TYPE": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Type of authorization",
+      "order": 4,
+      "enumeration": [],
+      "section": "2"
+    },
+    "FOUNDER_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "Date of birth",
+      "order": 2,
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDER_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "Nationality",
+      "order": 3,
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDER_NATIONAL_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Identification document",
+      "order": 5,
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDER_NATIONAL__COPY": {
+      "required": true,
+      "closed": false,
+      "type": "File",
+      "label": "Picutre of identification document",
+      "order": 6,
+      "enumeration": [],
+      "section": ""
+    },
+    "FOUNDER_POWER_OF_ATTORNEY": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Power of attorney arrangements",
+      "order": 7,
+      "enumeration": ["CR","MANDATE","OTHER"],
+      "section": ""
+    },
+    "FOUNDER_RESIDENTIAL_ADDRESS": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "Residential address",
+      "order": 1,
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+  "VQF_902_4": {
+    "CONTACT_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["LOW","MEDIUM","HIGH"],
+      "section": "3"
+    },
+    "COUNTRY_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["LOW","MEDIUM","HIGH"],
+      "section": "3"
+    },
+    "COUNTRY_RISK_TYPE": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": 
["NATIONALITY_CUSTOMER","NATIONALITY_OWNER","DOMICILE_CUSTOMER","DOMICILE_OWNER","DOMICILE_CONTROLLING","BUSINESS_ACTIVITY","PAYMENTS"],
+      "section": "3"
+    },
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "EXTRA_CRITERA_1_RISK_DEFINITION": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "EXTRA_CRITERA_1_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["LOW","MEDIUM","HIGH"],
+      "section": "3"
+    },
+    "EXTRA_CRITERA_2_RISK_DEFINITION": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "EXTRA_CRITERA_2_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["LOW","MEDIUM","HIGH"],
+      "section": "3"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "HIGH_RISK_COUNTRY": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+    "HIGH_RISK__ACCEPTANCE_DATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+    "INDUSTRY_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": 
["TRANSPARENT","HIGH_CASH_TRANSACTION","NOT_WELL_KNOWN","HIGH_RISK_TRADE","UNKNOWN_INDUSTRY"],
+      "section": "3"
+    },
+    "INDUSTRY_RISK_TYPE": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["CUSTOMER","OWNER"],
+      "section": "3"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "PEP_ACCEPTANCE_DATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "PEP_DOMESTIC": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "PEP_FOREIGN": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "PEP_INTERNATIONAL_ORGANIZATION": {
+      "required": true,
+      "closed": false,
+      "type": "Boolean",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "PRODUCT_RISK_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": 
["EASY","SOPHISTICATED","OFFSHORE,","COMPLEX_STRUCTURE","LARGE_NUMBER_OF_ACCOUNTS","COMPLEX_SERVICE","FREQ_TRANS_WITH_HIGH_RISK"],
+      "section": "3"
+    },
+    "RISK_CLASIFICATION_ACCEPTANCE_DATE": {
+      "required": false,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "RISK_CLASIFICATION_LEVEL": {
+      "required": false,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["WITH","WITHOUT"],
+      "section": "3"
+    },
+"":""},
+  "VQF_902_5": {
+    "BIZREL_DEVELOPMENT": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_FINANCIAL_BENEFICIARIES_ADDRESS": {
+      "required": false,
+      "closed": false,
+      "type": "BusinessAddress",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_FINANCIAL_BENEFICIARIES_BANK_ACCOUNT": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_FINANCIAL_BENEFICIARIES_FULL_NAME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_FINANCIAL_VOLUME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_FURTHER_INFO": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "6"
+    },
+    "BIZREL_INCOME": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+    "BIZREL_ORIGIN_AMOUNT": {
+      "required": true,
+      "closed": false,
+      "type": "Amount",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "BIZREL_ORIGIN_CATEGORY": {
+      "required": true,
+      "closed": true,
+      "type": "String",
+      "label": "",
+      "enumeration": ["SAVINGS","OWN_BUSINESS","INHERITANCE","OTHER"],
+      "section": "3"
+    },
+    "BIZREL_ORIGIN_CATEGORY_OTHER": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "BIZREL_ORIGIN_DETAIL": {
+      "required": false,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "3"
+    },
+    "BIZREL_PROFESSION": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "BIZREL_PURPOSE": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "4"
+    },
+    "BIZREL_THIRDPARTY_AMLA_FILES": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "BIZREL_THIRDPARTY_REFERENCES": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "BIZREL_THIRDPARTY_RELATIONSHIP": {
+      "required": false,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": "5"
+    },
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+"":""},
+  "VQF_902_9": {
+    "CUSTOMER_ID": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 3,
+      "enumeration": [],
+      "section": "header"
+    },
+    "FORM_FILLING_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "Date",
+      "order": 2,
+      "enumeration": [],
+      "section": "header"
+    },
+    "IDENTITY_CONTRACTING_PARTNER": {
+      "required": true,
+      "closed": false,
+      "type": "Paragraph",
+      "label": "",
+      "enumeration": [],
+      "section": "1"
+    },
+    "IDENTITY_LIST": {
+      "required": false,
+      "closed": false,
+      "type": "Form<VQF_902_9_identity>[]",
+      "label": "",
+      "enumeration": [],
+      "section": "2"
+    },
+    "OFFICER_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "Full name",
+      "order": 1,
+      "enumeration": [],
+      "section": "header"
+    },
+    "SIGNATURE": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "order": 2,
+      "enumeration": [],
+      "section": "footer"
+    },
+    "SIGN_DATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDateTime",
+      "label": "",
+      "order": 1,
+      "enumeration": [],
+      "section": "footer"
+    },
+"":""},
+  "VQF_902_9_identity": {
+    "IDENTITY_BIRTHDATE": {
+      "required": true,
+      "closed": false,
+      "type": "AbsoluteDate",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "IDENTITY_DOMICILE": {
+      "required": true,
+      "closed": false,
+      "type": "ResidentialAddress",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "IDENTITY_FULL_NAME": {
+      "required": true,
+      "closed": false,
+      "type": "String",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+    "IDENTITY_NATIONALITY": {
+      "required": true,
+      "closed": false,
+      "type": "CountryCode",
+      "label": "",
+      "enumeration": [],
+      "section": ""
+    },
+"":""},
+"":""}
\ No newline at end of file
diff --git a/packages/kyc-ui/src/forms/taler_aml_attributes.ts 
b/packages/kyc-ui/src/forms/taler_aml_attributes.ts
new file mode 100644
index 000000000..5747a0a8a
--- /dev/null
+++ b/packages/kyc-ui/src/forms/taler_aml_attributes.ts
@@ -0,0 +1,1047 @@
+/*
+  This file is part of GNU Taler
+  Copyright (C) 2012-2020 Taler Systems SA
+
+  GNU Taler is free software: you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation, either version 3 of the License,
+  or (at your option) any later version.
+
+  GNU Taler is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+  SPDX-License-Identifier: LGPL3.0-or-later
+
+  Note: the LGPL does not apply to all components of GNU Taler,
+  but it does apply to this file.
+ */
+
+type AbsoluteDateTime = string;
+type AbsoluteDate = string;
+type CountryCode = string;
+type Amount = string;
+type ResidentialAddress = string;
+type BusinessAddress = string;
+type Paragraph = string;
+type LangCode = string;
+type Email = string;
+type Phone = string;
+type Form<T> = T;
+
+export namespace TalerAmlAttributes {
+  export interface VQF_902_1 {
+    /**
+     * 
+     * Required: 
+     */
+    ACCEPTANCE_CORRESPONDENCE_SERVICE_TYPE: String;
+    /**
+     * 
+     * Required: 
+     */
+    ACCEPTANCE_DATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    ACCEPTANCE_FURTHER_INFO: String;
+    /**
+     * 
+     * Required: 
+     */
+    ACCEPTANCE_LANGUAGE: LangCode;
+    /**
+     * 
+     * Required: 
+     */
+    ACCEPTANCE_METHOD: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ENTITY_ADDRESS: BusinessAddress;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ENTITY_COMPANY_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_ENTITY_CONTACT_PERSON_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_ENTITY_EMAIL: Email;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ENTITY_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ENTITY_ID_COPY: File;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_ENTITY_PHONE: Phone;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_COMPANY_ID: String;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_COMPANY_ID_COPY: File;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_COMPANY_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_EMAIL: Email;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_NATIONAL_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_NATIONAL_ID_COPY: File;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_PHONE: Phone;
+    /**
+     * 
+     * Required: 
+     */
+    CUSTOMER_NATURAL_REGISTERED_OFFICE: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_NATURAL_RESIDENTIAL: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_TYPE: String;
+    /**
+     * 
+     * Required: 
+     */
+    EMBARGO_TERRORISM_INFO: Paragraph;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_LIST: Form<VQF_902_1_founder>[];
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    RELATIONSHIP_PURPOSE: Paragraph;
+    /**
+     * 
+     * Required: 
+     */
+    RELATIONSHIP_TYPE: String;
+  }
+  export interface VQF_902_11 {
+    /**
+     * 
+     * Required: true
+     */
+    CONTROLLING_ENTITY_CONTRACTING_PARTNER: Paragraph;
+    /**
+     * 
+     * Required: true
+     */
+    CONTROLLING_ENTITY_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    CONTROLLING_ENTITY_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    CONTROLLING_ENTITY_LEVEL: String;
+    /**
+     * 
+     * Required: true
+     */
+    CONTROLLING_ENTITY_THIRD_PERSON: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGNATURE: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGN_DATE: AbsoluteDateTime;
+  }
+  export interface VQF_902_12 {
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_BENEFICIARY_LIST: Form<VQF_902_12_beneficiary>[];
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_CONTRACTING_PARTNER: Paragraph;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_DISCRETIONARY: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_LIST: Form<VQF_902_12_founder>[];
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_KNOWN_AS: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_LIST: Form<VQF_902_12_pre>[];
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_LIST: Form<VQF_902_12_representative>[];
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REVOCABLE: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGNATURE: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGN_DATE: AbsoluteDateTime;
+  }
+  export interface VQF_902_12_beneficiary {
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_ADDITION: Paragraph;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    FOUNDATION_BENEFICIARY_RIGHT_TO_CLAIM: Boolean;
+  }
+  export interface VQF_902_12_founder {
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_DEATHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_FOUNDER_RIGHT_TO_REVOKE: Boolean;
+  }
+  export interface VQF_902_12_pre {
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_DEATHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_PRE_NATIONALITY: CountryCode;
+  }
+  export interface VQF_902_12_representative {
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDATION_REPRESENTATIVE_RIGHT_TO_REVOKE: Boolean;
+  }
+  export interface VQF_902_13 {
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGNATURE: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGN_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_BENEFICIARY_LIST: Form<VQF_902_13_beneficiary>[];
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_CONTRACTING_PARTNER: Paragraph;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_DISCRETIONARY: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_KNOWN_AS: String;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_PRE_LIST: Form<VQF_902_13_pre>[];
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_PROTECTOR_LIST: Form<VQF_902_13_protector>[];
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_REVOCABLE: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_LIST: Form<VQF_902_13_settlor>[];
+  }
+  export interface VQF_902_13_beneficiary {
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_ADDITION: Paragraph;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_BENEFICIARY_RIGHT_TO_CLAIM: Boolean;
+  }
+  export interface VQF_902_13_further {
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_FURTHER_LIST: Form<VQF_902_13_further>[];
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_FURTHER_RIGHT_TO_REVOKE: Boolean;
+  }
+  export interface VQF_902_13_pre {
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_DEATHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PRE_NATIONALITY: CountryCode;
+  }
+  export interface VQF_902_13_protector {
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_COUNTRY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: 
+     */
+    TRUST_PROTECTOR_RIGHT_TO_REVOKE: Boolean;
+  }
+  export interface VQF_902_13_settlor {
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_DEATHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    TRUST_SETTLOR_RIGHT_TO_REVOKE: Boolean;
+  }
+  export interface VQF_902_14 {
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    INCRISK_DOCUMENTS: File[];
+    /**
+     * 
+     * Required: true
+     */
+    INCRISK_MEANS: String;
+    /**
+     * 
+     * Required: true
+     */
+    INCRISK_REASON: String;
+    /**
+     * 
+     * Required: true
+     */
+    INCRISK_RESULT: String;
+    /**
+     * 
+     * Required: true
+     */
+    INCRISK_SUMMARY: Paragraph;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+  }
+  export interface VQF_902_1_founder {
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_AUTHORIZATION_TYPE: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_NATIONALITY: CountryCode;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_NATIONAL_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_NATIONAL__COPY: File;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_POWER_OF_ATTORNEY: String;
+    /**
+     * 
+     * Required: true
+     */
+    FOUNDER_RESIDENTIAL_ADDRESS: ResidentialAddress;
+  }
+  export interface VQF_902_4 {
+    /**
+     * 
+     * Required: 
+     */
+    CONTACT_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: 
+     */
+    COUNTRY_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: 
+     */
+    COUNTRY_RISK_TYPE: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: 
+     */
+    EXTRA_CRITERA_1_RISK_DEFINITION: String;
+    /**
+     * 
+     * Required: 
+     */
+    EXTRA_CRITERA_1_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: 
+     */
+    EXTRA_CRITERA_2_RISK_DEFINITION: String;
+    /**
+     * 
+     * Required: 
+     */
+    EXTRA_CRITERA_2_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    HIGH_RISK_COUNTRY: Boolean;
+    /**
+     * 
+     * Required: 
+     */
+    HIGH_RISK__ACCEPTANCE_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: 
+     */
+    INDUSTRY_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: 
+     */
+    INDUSTRY_RISK_TYPE: String;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    PEP_ACCEPTANCE_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    PEP_DOMESTIC: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    PEP_FOREIGN: Boolean;
+    /**
+     * 
+     * Required: true
+     */
+    PEP_INTERNATIONAL_ORGANIZATION: Boolean;
+    /**
+     * 
+     * Required: 
+     */
+    PRODUCT_RISK_LEVEL: String;
+    /**
+     * 
+     * Required: 
+     */
+    RISK_CLASIFICATION_ACCEPTANCE_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: 
+     */
+    RISK_CLASIFICATION_LEVEL: String;
+  }
+  export interface VQF_902_5 {
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_DEVELOPMENT: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_FINANCIAL_BENEFICIARIES_ADDRESS: BusinessAddress;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_FINANCIAL_BENEFICIARIES_BANK_ACCOUNT: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_FINANCIAL_BENEFICIARIES_FULL_NAME: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_FINANCIAL_VOLUME: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_FURTHER_INFO: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_INCOME: String;
+    /**
+     * 
+     * Required: true
+     */
+    BIZREL_ORIGIN_AMOUNT: Amount;
+    /**
+     * 
+     * Required: true
+     */
+    BIZREL_ORIGIN_CATEGORY: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_ORIGIN_CATEGORY_OTHER: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_ORIGIN_DETAIL: Paragraph;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_PROFESSION: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_PURPOSE: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_THIRDPARTY_AMLA_FILES: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_THIRDPARTY_REFERENCES: String;
+    /**
+     * 
+     * Required: 
+     */
+    BIZREL_THIRDPARTY_RELATIONSHIP: String;
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+  }
+  export interface VQF_902_9 {
+    /**
+     * 
+     * Required: true
+     */
+    CUSTOMER_ID: String;
+    /**
+     * 
+     * Required: true
+     */
+    FORM_FILLING_DATE: AbsoluteDateTime;
+    /**
+     * 
+     * Required: true
+     */
+    IDENTITY_CONTRACTING_PARTNER: Paragraph;
+    /**
+     * 
+     * Required: 
+     */
+    IDENTITY_LIST: Form<VQF_902_9_identity>[];
+    /**
+     * 
+     * Required: true
+     */
+    OFFICER_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGNATURE: String;
+    /**
+     * 
+     * Required: true
+     */
+    SIGN_DATE: AbsoluteDateTime;
+  }
+  export interface VQF_902_9_identity {
+    /**
+     * 
+     * Required: true
+     */
+    IDENTITY_BIRTHDATE: AbsoluteDate;
+    /**
+     * 
+     * Required: true
+     */
+    IDENTITY_DOMICILE: ResidentialAddress;
+    /**
+     * 
+     * Required: true
+     */
+    IDENTITY_FULL_NAME: String;
+    /**
+     * 
+     * Required: true
+     */
+    IDENTITY_NATIONALITY: CountryCode;
+  }
+
+
+}
diff --git a/packages/kyc-ui/src/index.html b/packages/kyc-ui/src/index.html
index cbbf6addf..3e9a56ccd 100644
--- a/packages/kyc-ui/src/index.html
+++ b/packages/kyc-ui/src/index.html
@@ -29,7 +29,7 @@
       
href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/
 [...]
     />
     <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" />
-    <title>KYC</title>
+    <title>Customer identification</title>
     <!-- Entry point for the SPA. -->
     <script type="module" src="index.js"></script>
     <link rel="stylesheet" href="index.css" />
diff --git a/packages/kyc-ui/src/pages/FillForm.tsx 
b/packages/kyc-ui/src/pages/FillForm.tsx
index 47c0d5510..68d18e7d0 100644
--- a/packages/kyc-ui/src/pages/FillForm.tsx
+++ b/packages/kyc-ui/src/pages/FillForm.tsx
@@ -47,6 +47,8 @@ import {
 import { undefinedIfEmpty } from "./Start.js";
 import { useUiFormsContext } from "../context/ui-forms.js";
 import { usePreferences } from "../context/preferences.js";
+import { format } from "date-fns";
+import { useNotifierContext } from "../context/notifier.js";
 
 type Props = {
   token: AccessToken;
@@ -81,6 +83,7 @@ export function FillForm({
   // const { forms } = useUiFormsContext();
   const [notification, withErrorHandler] = useLocalNotificationHandler();
   const [preferences] = usePreferences();
+  const notifier = useNotifierContext();
 
   const customForm =
     requirement.context && "form" in requirement.context
@@ -104,36 +107,66 @@ export function FillForm({
   }
   const shape: Array<UIHandlerId> = [];
   const requiredFields: Array<UIHandlerId> = [];
-
-  theForm.config.design.forEach((section) => {
-    Array.prototype.push.apply(shape, getShapeFromFields(section.fields, ""));
-    Array.prototype.push.apply(
-      requiredFields,
-      getRequiredFields(section.fields),
-    );
+  notifier.emit({
+    type: "NEW_FORM",
+    payload: theForm.label,
   });
 
-  const [form, state] = useFormState<FormType>(shape, {}, (st) => {
-    const partialErrors = undefinedIfEmpty<FormErrors<FormType>>({});
+  switch (theForm.config.type) {
+    case "double-column": {
+      theForm.config.design.forEach((section) => {
+        Array.prototype.push.apply(
+          shape,
+          getShapeFromFields(section.fields, ""),
+        );
+        Array.prototype.push.apply(
+          requiredFields,
+          getRequiredFields(section.fields),
+        );
+      });
+      break;
+    }
+    case "single-column": {
+      Array.prototype.push.apply(
+        shape,
+        getShapeFromFields(theForm.config.fields, ""),
+      );
+      Array.prototype.push.apply(
+        requiredFields,
+        getRequiredFields(theForm.config.fields),
+      );
+    }
+  }
+
+  const [form, state] = useFormState<FormType>(
+    shape,
+    {
+      OFFICER_FULL_NAME: "asd",
+      FORM_FILLING_DATE: format(new Date(), "dd/MM/yyyy"),
+      CUSTOMER_ID: "123",
+    },
+    (st) => {
+      const partialErrors = undefinedIfEmpty<FormErrors<FormType>>({});
+
+      const errors = undefinedIfEmpty<FormErrors<FormType> | undefined>(
+        validateRequiredFields(partialErrors, st, requiredFields),
+      );
 
-    const errors = undefinedIfEmpty<FormErrors<FormType> | undefined>(
-      validateRequiredFields(partialErrors, st, requiredFields),
-    );
+      if (errors === undefined) {
+        return {
+          status: "ok",
+          result: st as any,
+          errors: undefined,
+        };
+      }
 
-    if (errors === undefined) {
       return {
-        status: "ok",
+        status: "fail",
         result: st as any,
-        errors: undefined,
+        errors,
       };
-    }
-
-    return {
-      status: "fail",
-      result: st as any,
-      errors,
-    };
-  });
+    },
+  );
   const validatedForm = state.status !== "ok" ? undefined : state.result;
 
   const submitHandler =
@@ -186,41 +219,65 @@ export function FillForm({
     <div class="rounded-lg bg-white px-5 py-6 shadow m-4">
       <LocalNotificationBanner notification={notification} />
       <div class="space-y-10 divide-y -mt-5 divide-gray-900/10">
-        {theForm.config.design.map((section, i) => {
-          if (!section) return <Fragment />;
-          return (
-            <div
-              key={i}
-              class="grid grid-cols-1 gap-x-8 gap-y-8 pt-5 md:grid-cols-3"
-            >
-              <div class="px-4 sm:px-0">
-                <h2 class="text-base font-semibold leading-7 text-gray-900">
-                  {section.title}
-                </h2>
-                {section.description && (
-                  <p class="mt-1 text-sm leading-6 text-gray-600">
-                    {section.description}
-                  </p>
-                )}
-              </div>
-              <div class="bg-white shadow-sm ring-1 ring-gray-900/5 rounded-md 
md:col-span-2">
-                <div class="p-3">
-                  <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
-                    <RenderAllFieldsByUiConfig
-                      key={i}
-                      fields={convertUiField(
-                        i18n,
-                        section.fields,
-                        form,
-                        getConverterById,
+        {(function () {
+          switch (theForm.config.type) {
+            case "double-column": {
+              return theForm.config.design.map((section, i) => {
+                if (!section) return <Fragment />;
+                return (
+                  <div
+                    key={i}
+                    class="grid grid-cols-1 gap-x-8 gap-y-8 pt-5 
md:grid-cols-3"
+                  >
+                    <div class="px-4 sm:px-0">
+                      <h2 class="text-base font-semibold leading-7 
text-gray-900">
+                        {section.title}
+                      </h2>
+                      {section.description && (
+                        <p class="mt-1 text-sm leading-6 text-gray-600">
+                          {section.description}
+                        </p>
                       )}
-                    />
+                    </div>
+                    <div class="bg-white shadow-sm ring-1 ring-gray-900/5 
rounded-md md:col-span-2">
+                      <div class="p-3">
+                        <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
+                          <RenderAllFieldsByUiConfig
+                            key={i}
+                            fields={convertUiField(
+                              i18n,
+                              section.fields,
+                              form,
+                              getConverterById,
+                            )}
+                          />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                );
+              });
+            }
+            case "single-column": {
+              return (
+                <div class="bg-white shadow-sm ring-1 ring-gray-900/5 
rounded-md md:col-span-2">
+                  <div class="p-3">
+                    <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
+                      <RenderAllFieldsByUiConfig
+                        fields={convertUiField(
+                          i18n,
+                          theForm.config.fields,
+                          form,
+                          getConverterById,
+                        )}
+                      />
+                    </div>
                   </div>
                 </div>
-              </div>
-            </div>
-          );
-        })}
+              );
+            }
+          }
+        })()}
       </div>
 
       {preferences.showDebugInfo ? (
@@ -248,7 +305,7 @@ export function FillForm({
           disabled={!submitHandler}
           class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
         >
-          <i18n.Translate>Confirm</i18n.Translate>
+          <i18n.Translate>Submit</i18n.Translate>
         </Button>
       </div>
     </div>
diff --git a/packages/kyc-ui/src/pages/Frame.tsx 
b/packages/kyc-ui/src/pages/Frame.tsx
index 7cfdc7ad0..ab97d23b8 100644
--- a/packages/kyc-ui/src/pages/Frame.tsx
+++ b/packages/kyc-ui/src/pages/Frame.tsx
@@ -24,7 +24,7 @@ import {
   useTranslationContext,
 } from "@gnu-taler/web-util/browser";
 import { ComponentChildren, Fragment, VNode, h } from "preact";
-import { useEffect, useErrorBoundary } from "preact/hooks";
+import { useEffect, useErrorBoundary, useState } from "preact/hooks";
 import {
   getAllBooleanPreferences,
   getLabelForPreferences,
@@ -32,6 +32,7 @@ import {
 } from "../context/preferences.js";
 import { useSettingsContext } from "../context/settings.js";
 import { publicPages } from "../Routing.js";
+import { useNotifierContext } from "../context/notifier.js";
 
 const GIT_HASH = typeof __GIT_HASH__ !== "undefined" ? __GIT_HASH__ : 
undefined;
 const VERSION = typeof __VERSION__ !== "undefined" ? __VERSION__ : undefined;
@@ -39,7 +40,8 @@ const VERSION = typeof __VERSION__ !== "undefined" ? 
__VERSION__ : undefined;
 export function Frame({ children }: { children: ComponentChildren }): VNode {
   const settings = useSettingsContext();
   const [preferences, updatePreferences] = usePreferences();
-
+  const [title, setTitle] = useState<string>();
+  const notifier = useNotifierContext();
   const [error, resetError] = useErrorBoundary();
   const { i18n } = useTranslationContext();
   useEffect(() => {
@@ -58,18 +60,27 @@ export function Frame({ children }: { children: 
ComponentChildren }): VNode {
     }
   }, [error]);
 
+  useEffect(() => {
+    return notifier.subscribe((event) => {
+      if (event.type === "NEW_FORM") {
+        setTitle(event.payload);
+      }
+    });
+  }, []);
   return (
     <div
       class="min-h-full flex flex-col m-0 bg-slate-200"
       style="min-height: 100vh;"
     >
       <Header
-        title="KYC"
+        title={title ?? i18n.str`Customer identification`}
         onLogout={undefined}
         iconLinkURL="#"
-        sites={!preferences.showDebugInfo ? [] : [
-          ["Test kyc", publicPages.triggerKyc.url({})]
-        ]}
+        sites={
+          !preferences.showDebugInfo
+            ? []
+            : [["Test kyc", publicPages.triggerKyc.url({})]]
+        }
         supportedLangs={["en"]}
       >
         <li>
diff --git a/packages/kyc-ui/src/pages/Start.tsx 
b/packages/kyc-ui/src/pages/Start.tsx
index 3c0bb78b3..527124ccb 100644
--- a/packages/kyc-ui/src/pages/Start.tsx
+++ b/packages/kyc-ui/src/pages/Start.tsx
@@ -60,9 +60,9 @@ export function ShowReqList({
     result.body.requirements.length > 0
       ? result.body.requirements[0]
       : undefined;
-  useEffect(() => {
-    if (firstAccount) onFormSelected(firstAccount);
-  }, [firstAccount]);
+  // useEffect(() => {
+  // if (firstAccount) onFormSelected(firstAccount);
+  // }, [firstAccount]);
 
   if (!result) {
     return <Loading />;
@@ -153,12 +153,14 @@ export function ShowReqList({
         <div class="isolate bg-white px-6 py-12">
           <div class="mx-auto max-w-2xl text-center">
             <h2 class="text-3xl font-bold tracking-tight text-gray-900 
sm:text-4xl">
-              <i18n.Translate>No requirements for this account</i18n.Translate>
+              <i18n.Translate>
+                Mandatory identification requirements are satisfied
+              </i18n.Translate>
             </h2>
           </div>
           <div class="m-8">
-            <Attention title={i18n.str`Kyc completed`} type="success">
-              <i18n.Translate>You can close this now</i18n.Translate>
+            <Attention title={i18n.str`Process completed`} type="success">
+              <i18n.Translate>You can close this window now.</i18n.Translate>
             </Attention>
           </div>
         </div>
diff --git a/packages/kyc-ui/src/pages/TriggerKyc.tsx 
b/packages/kyc-ui/src/pages/TriggerKyc.tsx
index ce4730011..9195ed56c 100644
--- a/packages/kyc-ui/src/pages/TriggerKyc.tsx
+++ b/packages/kyc-ui/src/pages/TriggerKyc.tsx
@@ -88,13 +88,28 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
   const shape: Array<UIHandlerId> = [];
   const requiredFields: Array<UIHandlerId> = [];
 
-  theForm.config.design.forEach((section) => {
-    Array.prototype.push.apply(shape, getShapeFromFields(section.fields));
-    Array.prototype.push.apply(
-      requiredFields,
-      getRequiredFields(section.fields),
-    );
-  });
+  switch (theForm.config.type) {
+    case "double-column": {
+      theForm.config.design.forEach((section) => {
+        Array.prototype.push.apply(shape, getShapeFromFields(section.fields));
+        Array.prototype.push.apply(
+          requiredFields,
+          getRequiredFields(section.fields),
+        );
+      });
+      break;
+    }
+    case "single-column": {
+      Array.prototype.push.apply(
+        shape,
+        getShapeFromFields(theForm.config.fields),
+      );
+      Array.prototype.push.apply(
+        requiredFields,
+        getRequiredFields(theForm.config.fields),
+      );
+    }
+  }
   const [form, state] = useFormState<FormType>(
     shape,
     {
@@ -173,7 +188,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
     check();
   }, [kycAccount]);
 
-  function triggerAmount(amount:AmountJson) {
+  function triggerAmount(amount: AmountJson) {
     return withErrorHandler(
       async () => {
         const account = await accountPromise;
@@ -201,7 +216,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
             assertUnreachable(fail);
         }
       },
-    )
+    );
   }
 
   const sendFormValue =
@@ -217,41 +232,65 @@ export function TriggerKyc({ onKycStarted }: Props): 
VNode {
     <div class="rounded-lg bg-white px-5 py-6 shadow m-4">
       <LocalNotificationBanner notification={notification} />
       <div class="space-y-10 divide-y -mt-5 divide-gray-900/10">
-        {theForm.config.design.map((section, i) => {
-          if (!section) return <Fragment />;
-          return (
-            <div
-              key={i}
-              class="grid grid-cols-1 gap-x-8 gap-y-8 pt-5 md:grid-cols-3"
-            >
-              <div class="px-4 sm:px-0">
-                <h2 class="text-base font-semibold leading-7 text-gray-900">
-                  {section.title}
-                </h2>
-                {section.description && (
-                  <p class="mt-1 text-sm leading-6 text-gray-600">
-                    {section.description}
-                  </p>
-                )}
-              </div>
-              <div class="bg-white shadow-sm ring-1 ring-gray-900/5 rounded-md 
md:col-span-2">
-                <div class="p-3">
-                  <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
-                    <RenderAllFieldsByUiConfig
-                      key={i}
-                      fields={convertUiField(
-                        i18n,
-                        section.fields,
-                        form,
-                        getConverterById,
+        {(function () {
+          switch (theForm.config.type) {
+            case "double-column": {
+              return theForm.config.design.map((section, i) => {
+                if (!section) return <Fragment />;
+                return (
+                  <div
+                    key={i}
+                    class="grid grid-cols-1 gap-x-8 gap-y-8 pt-5 
md:grid-cols-3"
+                  >
+                    <div class="px-4 sm:px-0">
+                      <h2 class="text-base font-semibold leading-7 
text-gray-900">
+                        {section.title}
+                      </h2>
+                      {section.description && (
+                        <p class="mt-1 text-sm leading-6 text-gray-600">
+                          {section.description}
+                        </p>
                       )}
-                    />
+                    </div>
+                    <div class="bg-white shadow-sm ring-1 ring-gray-900/5 
rounded-md md:col-span-2">
+                      <div class="p-3">
+                        <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
+                          <RenderAllFieldsByUiConfig
+                            key={i}
+                            fields={convertUiField(
+                              i18n,
+                              section.fields,
+                              form,
+                              getConverterById,
+                            )}
+                          />
+                        </div>
+                      </div>
+                    </div>
+                  </div>
+                );
+              });
+            }
+            case "single-column": {
+              return (
+                <div class="bg-white shadow-sm ring-1 ring-gray-900/5 
rounded-md md:col-span-2">
+                  <div class="p-3">
+                    <div class="grid max-w-2xl grid-cols-1 gap-x-6 gap-y-8 
sm:grid-cols-6">
+                      <RenderAllFieldsByUiConfig
+                        fields={convertUiField(
+                          i18n,
+                          theForm.config.fields,
+                          form,
+                          getConverterById,
+                        )}
+                      />
+                    </div>
                   </div>
                 </div>
-              </div>
-            </div>
-          );
-        })}
+              );
+            }
+          }
+        })()}
       </div>
 
       <div class="mt-6 flex items-center justify-end gap-x-6">
@@ -267,7 +306,7 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
           // disabled={!submitHandler}
           class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
         >
-          <i18n.Translate>Confirm</i18n.Translate>
+          <i18n.Translate>Submit</i18n.Translate>
         </Button>
       </div>
 
@@ -282,7 +321,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000070`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000070`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -292,7 +333,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000080`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000080`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -302,7 +345,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000000`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000000`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -312,7 +357,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000010`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000010`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -322,7 +369,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000020`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000020`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -332,7 +381,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000030`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000030`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -342,7 +393,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000040`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000040`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -352,7 +405,9 @@ export function TriggerKyc({ onKycStarted }: Props): VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000050`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000050`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
@@ -362,14 +417,27 @@ export function TriggerKyc({ onKycStarted }: Props): 
VNode {
         <div>
           <Button
             type="submit"
-            
handler={triggerAmount(Amounts.parseOrThrow(`${config.currency}:1000060`))}
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000060`),
+            )}
             // disabled={!submitHandler}
             class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
           >
             <i18n.Translate>Trigger VQF other</i18n.Translate>
           </Button>
         </div>
-        
+        <div>
+          <Button
+            type="submit"
+            handler={triggerAmount(
+              Amounts.parseOrThrow(`${config.currency}:1000090`),
+            )}
+            // disabled={!submitHandler}
+            class="disabled:opacity-50 disabled:cursor-default rounded-md 
bg-indigo-600 px-3 py-2 text-sm font-semibold text-white shadow-sm 
hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 
focus-visible:outline-offset-2 focus-visible:outline-indigo-600"
+          >
+            <i18n.Translate>Challenger test</i18n.Translate>
+          </Button>
+        </div>
       </div>
     </div>
   );
diff --git a/packages/kyc-ui/tsconfig.json b/packages/kyc-ui/tsconfig.json
index 9826fac07..a69021452 100644
--- a/packages/kyc-ui/tsconfig.json
+++ b/packages/kyc-ui/tsconfig.json
@@ -9,6 +9,7 @@
     "jsx": "react" /* Specify JSX code generation: 'preserve', 'react-native', 
or 'react'. */,
     "jsxFactory": "h",
     "jsxFragmentFactory": "Fragment",
+    "resolveJsonModule": true,
     "noEmit": true /* Do not emit outputs. */,
     // "importHelpers": true,                 /* Import emit helpers from 
'tslib'. */
     // "downlevelIteration": true,            /* Provide full support for 
iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. 
*/

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]