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_customer.typ (13530B)


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