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:
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