taler-typescript-core

Wallet core logic and WebUIs for various components
Log | Files | Refs | Submodules | README | LICENSE

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

vqf form from gana

Diffstat:
Mpackages/kyc-ui/package.json | 1+
Mpackages/kyc-ui/src/app.tsx | 7+++++--
Apackages/kyc-ui/src/context/notifier.ts | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/kyc-ui/src/forms/accept-tos.ts | 23++++++++++++++---------
Apackages/kyc-ui/src/forms/ganaForms.ts | 288+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/kyc-ui/src/forms/index.ts | 7+++++++
Apackages/kyc-ui/src/forms/taler_aml_attributes.json | 1662+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Apackages/kyc-ui/src/forms/taler_aml_attributes.ts | 1047+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mpackages/kyc-ui/src/index.html | 2+-
Mpackages/kyc-ui/src/pages/FillForm.tsx | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Mpackages/kyc-ui/src/pages/Frame.tsx | 23+++++++++++++++++------
Mpackages/kyc-ui/src/pages/Start.tsx | 14++++++++------
Mpackages/kyc-ui/src/pages/TriggerKyc.tsx | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Mpackages/kyc-ui/tsconfig.json | 1+
14 files changed, 3344 insertions(+), 132 deletions(-)

diff --git 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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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, @@ -45,6 +46,12 @@ export const preloadedForms: ( 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", version: 1, diff --git a/packages/kyc-ui/src/forms/taler_aml_attributes.json 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 @@ -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 @@ -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/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> <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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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'. */