exchange

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

vqf_902_1.typ (14738B)


      1 // VQF 902.1 Identification Form Template
      2 // Pass JSON data as content dictionary
      3 // NOTE: This is the original form. We don't use
      4 // it as this form was split in customer + officer parts.
      5 // Preserved here in case some auditor insists on us
      6 // combining the two!
      7 
      8 #let form(data) = {
      9   set page(
     10     paper: "a4",
     11     margin: (left: 2cm, right: 2cm, top: 2cm, bottom: 2.5cm),
     12     footer: context [
     13       #grid(
     14         columns: (1fr, 1fr),
     15         align: (left, right),
     16         text(size: 8pt)[
     17           VQF doc. Nr. 902.1#linebreak()
     18           Version of 1 September 2021
     19         ],
     20         text(size: 8pt)[
     21           Page #here().page() of #counter(page).final().first()
     22         ]
     23       )
     24     ]
     25   )
     26 
     27   set text(font: "Liberation Sans", size: 10pt)
     28   set par(justify: false, leading: 0.65em)
     29 
     30   // Helper function to get value or empty string
     31   let get(key, default: "") = {
     32     data.at(key, default: default)
     33   }
     34 
     35   // Helper function to get value or false
     36   let getb(key, default: false) = {
     37     data.at(key, default: default)
     38   }
     39 
     40   // Helper function for checkbox
     41   let checkbox(checked) = {
     42     box(
     43       width: 3mm,
     44       height: 3mm,
     45       stroke: 0.5pt + black,
     46       inset: 0.3mm,
     47       if checked == true or checked == "true" {
     48         place(center + horizon, text(size: 8pt, sym.checkmark))
     49       }
     50     )
     51   }
     52 
     53   // Header
     54   align(center, text(size: 11pt, weight: "bold")[CONFIDENTIAL])
     55 
     56   v(0.5em)
     57 
     58 
     59   grid(
     60     columns: (50%, 50%),
     61     gutter: 1em,
     62     image("vss_vqf_verein.png", width: 80%),
     63 
     64     align(right)[
     65       #table(
     66         columns: (1fr, 1fr),
     67         stroke: 0.5pt + black,
     68         inset: 5pt,
     69         align: (left, left),
     70         [VQF member no.], [AMLA File No.],
     71         [#get("VQF_MEMBER_NUMBER")], [#get("FILE_NUMBER")]
     72       )
     73     ]
     74   )
     75 
     76   v(1em)
     77 
     78   align(left, text(size: 14pt, weight: "bold")[Identification Form])
     79 
     80   v(-1em)
     81   line(length:100%)
     82 
     83   grid(
     84     columns: (auto, 1fr),
     85     gutter: 0.5em,
     86     align: (left, left),
     87     image("pointing_finger.svg", height: 2em),
     88     text(size: 9pt)[
     89       The customer has to be identified on entering into a permanent business relationship or on concluding a cash transaction, which meets the according threshold.
     90     ]
     91   )
     92 
     93   v(1em)
     94 
     95   text(weight: "bold")[This form was completed by:]
     96 
     97   v(0.3em)
     98 
     99   table(
    100     columns: (1fr, 1fr),
    101     stroke: 0.5pt + black,
    102     inset: 5pt,
    103     align: (left, left),
    104     [Full name], [#get("FILED_BY_NAME")],
    105     [Date], [#get("FILING_DATE")],
    106   )
    107 
    108   v(1.5em)
    109 
    110   // Section 1: Information on customer
    111   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.]]
    112 
    113   v(0.5em)
    114 
    115   let is_natural = get("CUSTOMER_TYPE") == "NATURAL_PERSON"
    116   let is_legal = get("CUSTOMER_TYPE") == "LEGAL_ENTITY"
    117 
    118   // Section 1a: Natural Person
    119   grid(
    120     columns: (auto, 1fr),
    121     gutter: 0.5em,
    122     checkbox(is_natural),
    123     [a) The customer is a #underline([natural]) person:]
    124   )
    125 
    126   block(breakable: false)[
    127     #table(
    128       columns: (35%, 65%),
    129       stroke: 0.5pt + black,
    130       inset: 5pt,
    131       [Full name\*], if is_natural { get("FULL_NAME") } else { "" },
    132       [Residential address\*], if is_natural { get("DOMICILE_ADDRESS") } else { "" },
    133       [Telephone], if is_natural { get("CONTACT_PHONE") } else { "" },
    134       [E-mail], if is_natural { get("CONTACT_EMAIL") } else { "" },
    135       [Date of birth\*], if is_natural { get("DATE_OF_BIRTH") } else { "" },
    136       [Nationality\*], if is_natural { get("NATIONALITY") } else { "" },
    137       [Identification document\*], [#checkbox(is_natural) *Copy enclosed in appendix*],
    138     )
    139     #v(-1em)
    140     #text(size: 8pt)[*\* mandatory*]
    141   ]
    142   v(1em)
    143 
    144   // Sole proprietorship section
    145   text(weight: "bold")[For sole proprietorship (supplement to above):]
    146 
    147   let is_sole = is_natural and (get("CUSTOMER_IS_SOLE_PROPRIETOR") == true or get("CUSTOMER_IS_SOLE_PROPRIETOR") == "true")
    148 
    149   table(
    150     columns: (35%, 65%),
    151     stroke: 0.5pt + black,
    152     inset: 5pt,
    153     [Company name], if is_sole { get("COMPANY_NAME") } else { "" },
    154     [Registered office], if is_sole { get("REGISTERED_OFFICE_ADDRESS") } else { "" },
    155     [Company identification document], [#checkbox(is_sole) *Copy enclosed in appendix*],
    156   )
    157 
    158   v(1em)
    159 
    160   // Section 1b: Legal Entity
    161   grid(
    162     columns: (auto, 1fr),
    163     gutter: 0.5em,
    164     checkbox(is_legal),
    165     [*b) The customer is a legal entity:*]
    166   )
    167 
    168   block(breakable: false)[
    169     #table(
    170       columns: (35%, 65%),
    171       stroke: 0.5pt + black,
    172       inset: 5pt,
    173       [Company name\*], if is_legal { get("COMPANY_NAME") } else { "" },
    174       [Domicile\*], if is_legal { get("DOMICILE_ADDRESS") } else { "" },
    175       [Contact person], if is_legal { get("CONTACT_PERSON_NAME") } else { "" },
    176       [Telephone], if is_legal { get("CONTACT_PHONE") } else { "" },
    177       [E-mail], if is_legal { get("CONTACT_EMAIL") } else { "" },
    178       [Identification document\*\ (not older than 12 months)], [#checkbox(is_legal) *Copy enclosed in appendix*],
    179     )
    180 
    181     #v(-1em)
    182     #text(size: 8pt)[*\* mandatory*]
    183   ]
    184   v(0.5em)
    185 
    186   // Section 2: Natural persons establishing business relationship
    187   text(size: 11pt, weight: "bold")[2. Information on the natural persons who establish the business relationship for legal entities and partnerships]
    188 
    189   v(0.5em)
    190 
    191   grid(
    192     columns: (auto, 1fr),
    193     gutter: 0.5em,
    194     align: (left, left),
    195     image("pointing_finger.svg", height: 2em),
    196     text(size: 9pt)[
    197       For legal entities and partnerships the identity of the natural persons who establish the business relationship must be verified.
    198     ]
    199   )
    200 
    201   v(1em)
    202 
    203   let establishers = get("ESTABLISHER_LIST", default: ())
    204   let has_establishers = is_legal and type(establishers) == array and establishers.len() > 0
    205 
    206   // Show at least 1 table for establishers to match VQF form
    207   let num_cols = if has_establishers { calc.max(1, establishers.len()) } else { 1 }
    208 
    209   for col_idx in range(num_cols) {
    210     if col_idx > 0 {
    211       h(2em)
    212     }
    213   }
    214 
    215   // Create a table for each establisher
    216   range(num_cols).map(col_idx => {
    217     let establisher = if has_establishers and col_idx < establishers.len() {
    218       establishers.at(col_idx)
    219     } else {
    220       (:)
    221     }
    222 
    223     let get_est(key) = {
    224       if establisher != (:) {
    225         establisher.at(key, default: "")
    226       } else {
    227         ""
    228       }
    229     }
    230 
    231     block(breakable: false)[
    232         #table(
    233           columns: (35%, 65%),
    234           stroke: 0.5pt + black,
    235           inset: 5pt,
    236           [Full name\*],
    237           [#get_est("FULL_NAME")],
    238           [Residential address\*],
    239           [#get_est("DOMICILE_ADDRESS")],
    240           [Date of birth\*],
    241           [#get_est("DATE_OF_BIRTH")],
    242           [Nationality\*],
    243           [#get_est("NATIONALITY")],
    244           [Type of authorisation\ (signatory of representation)\*],
    245           [#get_est("SIGNING_AUTHORITY_TYPE")],
    246           [Identification document\*],
    247           [#checkbox(establisher != (:)) *Copy enclosed in appendix*],
    248           [*Power of attorney arrangements\**],
    249           [#let evidence = get_est("SIGNING_AUTHORITY_EVIDENCE")
    250             #grid(
    251               columns: (auto, 1fr),
    252               gutter: 0.5em,
    253               row-gutter: 0.3em,
    254               checkbox(evidence == "CR"),
    255               [CR extract],
    256               checkbox(evidence == "MANDATE"),
    257               [Mandate],
    258               checkbox(evidence == "OTHER"),
    259               [Other: #get_est("SIGNING_AUTHORITY_EVIDENCE_OTHER")],
    260             )
    261           ]
    262         )
    263         #v(-1em)
    264         #text(size: 8pt)[*\* mandatory*]
    265       ]
    266    }).join()
    267 
    268 
    269 
    270   v(2em)
    271 
    272   // Section 3: Acceptance of business relationship
    273   text(size: 11pt, weight: "bold")[3. Acceptance of business relationship]
    274 
    275   v(0.5em)
    276 
    277   let acceptance = get("ACCEPTANCE_METHOD")
    278   let lang = get("CORRESPONDENCE_LANGUAGE")
    279   table(
    280     columns: (35%, 65%),
    281     stroke: 0.5pt + black,
    282     inset: 5pt,
    283     [Date (conclusion of contract)], get("ACCEPTANCE_DATE"),
    284     [Accepted by],
    285     [#grid(
    286       columns: (auto, 1fr),
    287       gutter: 0.5em,
    288       checkbox(acceptance == "FACE_TO_FACE"),
    289       [Face-to-face meeting with customer],
    290       checkbox(acceptance == "WAY_OF_CORRESPONDENCE"),
    291       [Way of correspondence:
    292        \ #v(-0.7em) #grid(
    293          columns: (0.2em, auto),
    294          gutter: 0.5em,
    295          row-gutter: 0.3em,
    296          [],
    297          [#checkbox(acceptance == "AUTHENTICATED_COPY")
    298           authenticated copy of identification document obtained],
    299          [],
    300          [#checkbox(acceptance == "RESIDENTIAL_ADDRESS_VALIDATED")
    301           residential address validated]
    302        )
    303      ]
    304     )],
    305     [Type of correspondence service],
    306     [#grid(
    307       columns: (auto),
    308       gutter: 0.2em,
    309       [#checkbox(true) to the customer],
    310       [#checkbox(false) hold at bank],
    311       [#checkbox(false) to the member],
    312       [#checkbox(false)
    313        to a third party (full name and address):],
    314     )],
    315     [Language],
    316     [#grid(
    317       columns: (auto),
    318       gutter: 0.2em,
    319       [#checkbox(lang == "de") German],
    320       [#checkbox(lang == "en") English],
    321       [#checkbox(lang == "fr") French],
    322       [#checkbox(lang != "fr" and lang != "de" and lang != "en")
    323        Other: #lang],
    324     )],
    325     [Further information],
    326     [#get("ACCEPTANCE_FURTHER_INFO")]
    327   )
    328 
    329   // Section 4: Beneficial owner
    330   text(size: 11pt, weight: "bold")[4. Information on the beneficial owner of the assets and/or controlling person]
    331 
    332   v(0.5em)
    333 
    334   let customer_type_vqf = get("CUSTOMER_TYPE_VQF")
    335   grid(
    336     columns: (35%,65%),
    337     stroke: 0.5pt + black,
    338     inset: 5pt,
    339     [Establishment of the beneficial owner of the assets and/or controlling person.],
    340     [The customer is:
    341     #grid(
    342       columns: (1.1em, auto),
    343       inset: 5pt,
    344       [#checkbox(customer_type_vqf == "NATURAL_PERSON")],
    345       [a natural person and there are no doubts that this person is the sole beneficial owner of the assets],
    346       [#checkbox(customer_type_vqf == "OPERATIONAL")],
    347       [an operational legal entity or partnership #h(1fr)
    348        \ $=>$ VQF doc. No. 902.11 (K)],
    349       [#checkbox(customer_type_vqf == "FOUNDATION")],
    350       [a foundation (or a similar construct; incl. underlying companies)
    351        \ $=>$ VQF doc. No. 902.12 (S)],
    352       [#checkbox(customer_type_vqf == "TRUST")],
    353       [a trust (incl. underlying companies)
    354        \ $=>$ VQF doc. No. 902.13 (T)],
    355       [#checkbox(customer_type_vqf == "LIFE_INSURANCE")],
    356       [a life insurance policy with separately managed accounts/ securities accounts (so-called insurance wrappers)
    357        \ $=>$ VQF doc. No. 902.15 (I)],
    358       [#checkbox(customer_type_vqf == "OTHER")],
    359       [all other cases
    360        $=>$ VQF doc. No. 902.9 (A)],
    361     )]
    362   )
    363 
    364   v(2em)
    365 
    366   // Section 5: Embargo/terrorism evaluation
    367   text(size: 11pt, weight: "bold")[5. Evaluation with regard to embargo procedures/terrorism lists on establishing the business relationship]
    368 
    369   v(0.5em)
    370 
    371   table(
    372     columns: (35%, 65%),
    373     stroke: 0.5pt + black,
    374     inset: 5pt,
    375     [Verification whether the customer, beneficial owners of the assets, controlling persons, authorised representatives or other involved persons are listed on an embargo-/terrorism list (date of verification/result)#footnote[The evaluation must be made at the beginning of the business relationship and has to be repeated in the case of permanent business relationship every time the according lists are updated.]],
    376     [Date: #get("EMBARGO_TERRORISM_CHECK_DATE")
    377      \ Result: #get("EMBARGO_TERRORISM_CHECK_RESULT")],
    378   )
    379 
    380   v(2em)
    381 
    382   // Section 6: Cash transactions
    383   text(size: 11pt, weight: "bold")[6. In the case of cash transactions/occasional customers: Information on type and purpose of business relationship]
    384 
    385   v(0.5em)
    386 
    387   grid(
    388     columns: (auto, 1fr),
    389     gutter: 0.5em,
    390     align: (left, left),
    391     image("pointing_finger.svg", height: 2em),
    392     text(size: 9pt)[
    393       These details are only necessary for occasional customers, i.e. money exchange, money and asset transfer or other cash transactions provided that #underline([no]) customer profile (VQF doc. No. 902.5) is created
    394     ]
    395   )
    396 
    397   v(1em)
    398 
    399   table(
    400     columns: (35%, 65%),
    401     stroke: 0.5pt + black,
    402     inset: 5pt,
    403     [Type of business relationship],
    404     [#grid(
    405       columns: (auto),
    406       gutter: 0.2em,
    407       [#checkbox(false) Money exchange],
    408       [#checkbox(false) Money and asset transfer],
    409       [#checkbox(false) Other cash transaction, specify?],
    410     )],
    411     [Purpose of the business relationship\ (purpose of service requested)], [],
    412   )
    413 
    414   // Section 7: Enclosures
    415   text(size: 11pt, weight: "bold")[7. Enclosures]
    416 
    417   v(0.5em)
    418 
    419   grid(
    420     columns: (auto, 1fr),
    421     stroke: 0.5pt + black,
    422     inset: 5pt,
    423     checkbox("" != get("CUSTOMER_ID_AMLA_FILE_REFERENCE_NO")), [Customer identification documents (or: reference#footnote[If the identification document is lists kept in another AMLA-File (in the case of Art. 15 para. 3 SRO Regulations) a reference to the according AMLA-File is sufficient.] to AMLA File No.: #underline([#get("CUSTOMER_ID_AMLA_FILE_REFERENCE_NO")]))],
    424     checkbox("" != get("ESTABLISHER_ID_AMLA_FILE_REFERENCE_NO")), [Identification document of persons establishing the business relationship (or: reference to AMLA File No.: #underline([#get("ESTABLISHER_ID_AMLA_FILE_REFERENCE_NO")]))],
    425     checkbox(getb("HAVE_vqf_902_9") or getb("HAVE_vqf_902_11_customer") or getb("HAVE_vqf_902_11_officer") or getb("HAVE_vqf_902_12") or getb("HAVE_vqf_902_13") or getb("HAVE_vqf_902_15")), [Establishing of the beneficial owner of the assets/controlling person (VQF Doc No. 902.15, 902.9, 902.11, 902.12 or 902.13)],
    426     checkbox(getb("HAVE_vqf_902_5")), [Customer profile (VQF doc. No. 902.5; only in the case of permanent business relationship and regular customers)],
    427     checkbox(getb("HAVE_vqf_902_4")), [Risk profile (VQF doc. No. 902.4)],
    428   )
    429 
    430   v(1em)
    431 
    432   text(size: 9pt, style: "italic")[⚠ *This form has to be updated when changes occur.*]
    433 
    434 }
    435 
    436 // Example usage:
    437 #form((
    438    "VQF_MEMBER_NUMBER": "12345",
    439    "FILE_NUMBER": "42",
    440    "FILED_BY_NAME": "Manuela",
    441    "AML_STAFF_NAME": "Manuela",
    442    "CUSTOMER_ID_AMLA_FILE_REFERENCE_NO": "4242", // optional
    443    "ESTABLISHER_ID_AMLA_FILE_REFERENCE_NO": "4243", // optional
    444    "FILING_DATE": "1.4.2000",
    445    "CUSTOMER_TYPE": "NATURAL_PERSON",
    446    "FULL_NAME": "John Doe",
    447    "DOMICILE_ADDRESS": "123 Main St, 8001 Zurich",
    448    "HAVE_vqf_902_9": false,
    449    "HAVE_vqf_902_11_customer": false,
    450    "HAVE_vqf_902_11_officer": false,
    451    "HAVE_vqf_902_12": false,
    452    "HAVE_vqf_902_13": false,
    453    "HAVE_vqf_902_15": true,
    454    "HAVE_vqf_902_4": true,
    455    "HAVE_vqf_902_5": true,
    456    // ... other fields
    457  ))