exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

commit 39f7da9c11a0e6ba2993e23465a38bf4ebc68ec4
parent a5583d64ad06e9357840a69d609f7b3d35caf5bb
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat,  6 Dec 2025 18:17:19 +0100

split 902.1 into customer/officer parts

Diffstat:
Mcontrib/typst/vqf_902_11.typ | 4++++
Mcontrib/typst/vqf_902_11_customer.typ | 4++++
Mcontrib/typst/vqf_902_11_officer.typ | 7++++++-
Mcontrib/typst/vqf_902_1_customer.typ | 36+++---------------------------------
Mcontrib/typst/vqf_902_1_officer.typ | 227++-----------------------------------------------------------------------------
Mcontrib/typst/vqf_902_9.typ | 4++++
Mcontrib/typst/vqf_902_9_customer.typ | 4++++
Mcontrib/typst/vqf_902_9_officer.typ | 7++++++-
8 files changed, 35 insertions(+), 258 deletions(-)

diff --git a/contrib/typst/vqf_902_11.typ b/contrib/typst/vqf_902_11.typ @@ -208,6 +208,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) diff --git a/contrib/typst/vqf_902_11_customer.typ b/contrib/typst/vqf_902_11_customer.typ @@ -204,6 +204,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) diff --git a/contrib/typst/vqf_902_11_officer.typ b/contrib/typst/vqf_902_11_officer.typ @@ -204,6 +204,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) @@ -223,6 +227,7 @@ // Example usage: #form(( "VQF_MEMBER_NUMBER": "12345", + "AML_STAFF_NAME" : "Manuela", "FILE_NUMBER": "42", "IDENTITY_CONTRACTING_PARTNER": "Example Company AG\nBahnhofstrasse 1\n8001 Zurich\nSwitzerland", "CONTROL_REASON": "HAS_25_MORE_RIGHTS", @@ -233,7 +238,7 @@ ), ), "THIRD_PARTY_OWNERSHIP": false, - "SUBMITTED_BY": "CUSTOMER", + "SUBMITTED_BY": "OFFICER", "SIGNATURE": "Jane Smith", "SIGN_DATE": "10.11.2025", )) \ No newline at end of file diff --git a/contrib/typst/vqf_902_1_customer.typ b/contrib/typst/vqf_902_1_customer.typ @@ -97,7 +97,7 @@ stroke: 0.5pt + black, inset: 5pt, align: (left, left), - [Full name], [#get("FILED_BY_NAME")], + [Full name], [#get("FILED_BY_NAME")], // FIXME: #10740 [Date], [#get("FILING_DATE")], ) @@ -262,42 +262,16 @@ }).join() - - v(2em) - // Section 3: Acceptance of business relationship text(size: 11pt, weight: "bold")[3. Acceptance of business relationship] v(0.5em) - let acceptance = get("ACCEPTANCE_METHOD") let lang = get("CORRESPONDENCE_LANGUAGE") table( columns: (35%, 65%), stroke: 0.5pt + black, inset: 5pt, - [Date (conclusion of contract)], get("ACCEPTANCE_DATE"), - [Accepted by], - [#grid( - columns: (auto, 1fr), - gutter: 0.5em, - checkbox(acceptance == "FACE_TO_FACE"), - [Face-to-face meeting with customer], - checkbox(acceptance == "WAY_OF_CORRESPONDENCE"), - [Way of correspondence: - \ #v(-0.7em) #grid( - columns: (0.2em, auto), - gutter: 0.5em, - row-gutter: 0.3em, - [], - [#checkbox(acceptance == "AUTHENTICATED_COPY") - authenticated copy of identification document obtained], - [], - [#checkbox(acceptance == "RESIDENTIAL_ADDRESS_VALIDATED") - residential address validated] - ) - ] - )], [Type of correspondence service], [#grid( columns: (auto), @@ -318,10 +292,9 @@ [#checkbox(lang != "fr" and lang != "de" and lang != "en") Other: #lang], )], - [Further information], - [#get("ACCEPTANCE_FURTHER_INFO")] ) + // Section 4: Beneficial owner text(size: 11pt, weight: "bold")[4. Information on the beneficial owner of the assets and/or controlling person] @@ -434,10 +407,7 @@ "VQF_MEMBER_NUMBER": "12345", "FILE_NUMBER": "42", "FILED_BY_NAME": "Manuela", - "AML_STAFF_NAME": "Manuela", - "CUSTOMER_ID_AMLA_FILE_REFERENCE_NO": "4242", // optional - "ESTABLISHER_ID_AMLA_FILE_REFERENCE_NO": "4243", // optional - "FILING_DATE": "1.4.2000", + "FILING_DATE": "2000-4-1", "CUSTOMER_TYPE": "NATURAL_PERSON", "FULL_NAME": "John Doe", "DOMICILE_ADDRESS": "123 Main St, 8001 Zurich", diff --git a/contrib/typst/vqf_902_1_officer.typ b/contrib/typst/vqf_902_1_officer.typ @@ -97,181 +97,18 @@ stroke: 0.5pt + black, inset: 5pt, align: (left, left), - [Full name], [#get("FILED_BY_NAME")], + [Full name], [#get("AML_STAFF_NAME")], [Date], [#get("FILING_DATE")], ) v(1.5em) - // Section 1: Information on customer - text(size: 11pt, weight: "bold")[1. Information on customer#footnote[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.]] - - v(0.5em) - - let is_natural = get("CUSTOMER_TYPE") == "NATURAL_PERSON" - let is_legal = get("CUSTOMER_TYPE") == "LEGAL_ENTITY" - - // Section 1a: Natural Person - grid( - columns: (auto, 1fr), - gutter: 0.5em, - checkbox(is_natural), - [a) The customer is a #underline([natural]) person:] - ) - - block(breakable: false)[ - #table( - columns: (35%, 65%), - stroke: 0.5pt + black, - inset: 5pt, - [Full name\*], if is_natural { get("FULL_NAME") } else { "" }, - [Residential address\*], if is_natural { get("DOMICILE_ADDRESS") } else { "" }, - [Telephone], if is_natural { get("CONTACT_PHONE") } else { "" }, - [E-mail], if is_natural { get("CONTACT_EMAIL") } else { "" }, - [Date of birth\*], if is_natural { get("DATE_OF_BIRTH") } else { "" }, - [Nationality\*], if is_natural { get("NATIONALITY") } else { "" }, - [Identification document\*], [#checkbox(is_natural) *Copy enclosed in appendix*], - ) - #v(-1em) - #text(size: 8pt)[*\* mandatory*] - ] - v(1em) - - // Sole proprietorship section - text(weight: "bold")[For sole proprietorship (supplement to above):] - - let is_sole = is_natural and (get("CUSTOMER_IS_SOLE_PROPRIETOR") == true or get("CUSTOMER_IS_SOLE_PROPRIETOR") == "true") - - table( - columns: (35%, 65%), - stroke: 0.5pt + black, - inset: 5pt, - [Company name], if is_sole { get("COMPANY_NAME") } else { "" }, - [Registered office], if is_sole { get("REGISTERED_OFFICE_ADDRESS") } else { "" }, - [Company identification document], [#checkbox(is_sole) *Copy enclosed in appendix*], - ) - - v(1em) - - // Section 1b: Legal Entity - grid( - columns: (auto, 1fr), - gutter: 0.5em, - checkbox(is_legal), - [*b) The customer is a legal entity:*] - ) - - block(breakable: false)[ - #table( - columns: (35%, 65%), - stroke: 0.5pt + black, - inset: 5pt, - [Company name\*], if is_legal { get("COMPANY_NAME") } else { "" }, - [Domicile\*], if is_legal { get("DOMICILE_ADDRESS") } else { "" }, - [Contact person], if is_legal { get("CONTACT_PERSON_NAME") } else { "" }, - [Telephone], if is_legal { get("CONTACT_PHONE") } else { "" }, - [E-mail], if is_legal { get("CONTACT_EMAIL") } else { "" }, - [Identification document\*\ (not older than 12 months)], [#checkbox(is_legal) *Copy enclosed in appendix*], - ) - - #v(-1em) - #text(size: 8pt)[*\* mandatory*] - ] - v(0.5em) - - // Section 2: Natural persons establishing business relationship - text(size: 11pt, weight: "bold")[2. Information on the natural persons who establish the business relationship for legal entities and partnerships] - - v(0.5em) - - grid( - columns: (auto, 1fr), - gutter: 0.5em, - align: (left, left), - image("pointing_finger.svg", height: 2em), - text(size: 9pt)[ - For legal entities and partnerships the identity of the natural persons who establish the business relationship must be verified. - ] - ) - - v(1em) - - let establishers = get("ESTABLISHER_LIST", default: ()) - let has_establishers = is_legal and type(establishers) == array and establishers.len() > 0 - - // Show at least 1 table for establishers to match VQF form - let num_cols = if has_establishers { calc.max(1, establishers.len()) } else { 1 } - - for col_idx in range(num_cols) { - if col_idx > 0 { - h(2em) - } - } - - // Create a table for each establisher - range(num_cols).map(col_idx => { - let establisher = if has_establishers and col_idx < establishers.len() { - establishers.at(col_idx) - } else { - (:) - } - - let get_est(key) = { - if establisher != (:) { - establisher.at(key, default: "") - } else { - "" - } - } - - block(breakable: false)[ - #table( - columns: (35%, 65%), - stroke: 0.5pt + black, - inset: 5pt, - [Full name\*], - [#get_est("FULL_NAME")], - [Residential address\*], - [#get_est("DOMICILE_ADDRESS")], - [Date of birth\*], - [#get_est("DATE_OF_BIRTH")], - [Nationality\*], - [#get_est("NATIONALITY")], - [Type of authorisation\ (signatory of representation)\*], - [#get_est("SIGNING_AUTHORITY_TYPE")], - [Identification document\*], - [#checkbox(establisher != (:)) *Copy enclosed in appendix*], - [*Power of attorney arrangements\**], - [#let evidence = get_est("SIGNING_AUTHORITY_EVIDENCE") - #grid( - columns: (auto, 1fr), - gutter: 0.5em, - row-gutter: 0.3em, - checkbox(evidence == "CR"), - [CR extract], - checkbox(evidence == "MANDATE"), - [Mandate], - checkbox(evidence == "OTHER"), - [Other: #get_est("SIGNING_AUTHORITY_EVIDENCE_OTHER")], - ) - ] - ) - #v(-1em) - #text(size: 8pt)[*\* mandatory*] - ] - }).join() - - - - v(2em) - // Section 3: Acceptance of business relationship text(size: 11pt, weight: "bold")[3. Acceptance of business relationship] v(0.5em) let acceptance = get("ACCEPTANCE_METHOD") - let lang = get("CORRESPONDENCE_LANGUAGE") table( columns: (35%, 65%), stroke: 0.5pt + black, @@ -308,55 +145,10 @@ [#checkbox(false) to a third party (full name and address):], )], - [Language], - [#grid( - columns: (auto), - gutter: 0.2em, - [#checkbox(lang == "de") German], - [#checkbox(lang == "en") English], - [#checkbox(lang == "fr") French], - [#checkbox(lang != "fr" and lang != "de" and lang != "en") - Other: #lang], - )], [Further information], [#get("ACCEPTANCE_FURTHER_INFO")] ) - // Section 4: Beneficial owner - text(size: 11pt, weight: "bold")[4. Information on the beneficial owner of the assets and/or controlling person] - - v(0.5em) - - let customer_type_vqf = get("CUSTOMER_TYPE_VQF") - grid( - columns: (35%,65%), - stroke: 0.5pt + black, - inset: 5pt, - [Establishment of the beneficial owner of the assets and/or controlling person.], - [The customer is: - #grid( - columns: (1.1em, auto), - inset: 5pt, - [#checkbox(customer_type_vqf == "NATURAL_PERSON")], - [a natural person and there are no doubts that this person is the sole beneficial owner of the assets], - [#checkbox(customer_type_vqf == "OPERATIONAL")], - [an operational legal entity or partnership #h(1fr) - \ $=>$ VQF doc. No. 902.11 (K)], - [#checkbox(customer_type_vqf == "FOUNDATION")], - [a foundation (or a similar construct; incl. underlying companies) - \ $=>$ VQF doc. No. 902.12 (S)], - [#checkbox(customer_type_vqf == "TRUST")], - [a trust (incl. underlying companies) - \ $=>$ VQF doc. No. 902.13 (T)], - [#checkbox(customer_type_vqf == "LIFE_INSURANCE")], - [a life insurance policy with separately managed accounts/ securities accounts (so-called insurance wrappers) - \ $=>$ VQF doc. No. 902.15 (I)], - [#checkbox(customer_type_vqf == "OTHER")], - [all other cases - $=>$ VQF doc. No. 902.9 (A)], - )] - ) - v(2em) // Section 5: Embargo/terrorism evaluation @@ -433,20 +225,9 @@ #form(( "VQF_MEMBER_NUMBER": "12345", "FILE_NUMBER": "42", - "FILED_BY_NAME": "Manuela", "AML_STAFF_NAME": "Manuela", - "CUSTOMER_ID_AMLA_FILE_REFERENCE_NO": "4242", // optional - "ESTABLISHER_ID_AMLA_FILE_REFERENCE_NO": "4243", // optional - "FILING_DATE": "1.4.2000", - "CUSTOMER_TYPE": "NATURAL_PERSON", - "FULL_NAME": "John Doe", - "DOMICILE_ADDRESS": "123 Main St, 8001 Zurich", - "HAVE_vqf_902_9": false, - "HAVE_vqf_902_11": false, - "HAVE_vqf_902_12": false, - "HAVE_vqf_902_13": false, - "HAVE_vqf_902_15": true, - "HAVE_vqf_902_4": true, - "HAVE_vqf_902_5": true, + "FILING_DATE": "2000-4-1", + "ACCEPTANCE_DATE": "2000-4-1", + "ACCEPTANCE_METHOD" : "FACE_TO_FACE", // ... other fields )) diff --git a/contrib/typst/vqf_902_9.typ b/contrib/typst/vqf_902_9.typ @@ -166,6 +166,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) diff --git a/contrib/typst/vqf_902_9_customer.typ b/contrib/typst/vqf_902_9_customer.typ @@ -162,6 +162,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) diff --git a/contrib/typst/vqf_902_9_officer.typ b/contrib/typst/vqf_902_9_officer.typ @@ -162,6 +162,10 @@ v(0.5em) + text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] + + v(0.5em) + text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] v(0.5em) @@ -186,6 +190,7 @@ // Example usage: #form(( "VQF_MEMBER_NUMBER": "12345", + "AML_STAFF_NAME" : "Manuela", "FILE_NUMBER": "42", "IDENTITY_CONTRACTING_PARTNER": "Example Company AG\nBahnhofstrasse 1\n8001 Zurich\nSwitzerland", "IDENTITY_LIST": ( @@ -196,7 +201,7 @@ "DOMICILE_ADDRESS": "Teststrasse 123\n8001 Zurich" ), ), - "SUBMITTED_BY": "CUSTOMER", + "SUBMITTED_BY": "OFFICER", "SIGNATURE": "John Doe", "SIGN_DATE": "10.11.2025", )) \ No newline at end of file