exchange

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

vqf_902_9_officer.typ (5050B)


      1 // VQF 902.9 Declaration of identity of the beneficial owner (A)
      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.9#linebreak()
     14           Version of 1 December 2015
     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 for checkbox
     32   let checkbox(checked) = {
     33     box(
     34       width: 3mm,
     35       height: 3mm,
     36       stroke: 0.5pt + black,
     37       inset: 0.3mm,
     38       if checked == true or checked == "true" {
     39         place(center + horizon, text(size: 8pt, sym.checkmark))
     40       }
     41     )
     42   }
     43 
     44   // Header
     45   align(center, text(size: 11pt, weight: "bold")[CONFIDENTIAL])
     46 
     47   v(0.5em)
     48 
     49   grid(
     50     columns: (50%, 50%),
     51     gutter: 1em,
     52     image("vss_vqf_verein.png", width: 80%),
     53     align(right)[
     54       #table(
     55         columns: (1fr, 1fr),
     56         stroke: 0.5pt + black,
     57         inset: 5pt,
     58         align: (left, left),
     59         [VQF member no.], [AMLA File No.],
     60         [#get("VQF_MEMBER_NUMBER")], [#get("FILE_NUMBER")]
     61       )
     62     ]
     63   )
     64 
     65   v(1em)
     66 
     67   align(left, text(size: 14pt, weight: "bold")[Declaration of identity of the beneficial owner (A)])
     68 
     69   v(-1em)
     70   line(length:100%)
     71 
     72   v(1em)
     73 
     74   // Section 1: Contracting Partner
     75   text(size: 11pt, weight: "bold")[Contracting partner:]
     76 
     77   v(0.5em)
     78 
     79   table(
     80     columns: (1fr),
     81     stroke: 0.5pt + black,
     82     inset: 5pt,
     83     [#get("IDENTITY_CONTRACTING_PARTNER")]
     84   )
     85 
     86   v(1em)
     87 
     88   text()[The contracting partner hereby declares that the person(s) listed below is/are the beneficial owner(s) of the assets involved in the business relationship. If the contracting partner is also the sole beneficial owner of the assets, the contracting partner's detail must be set out below]
     89 
     90   v(1em)
     91 
     92   // Section 2: Beneficial Owners
     93   let owners = get("IDENTITY_LIST", default: ())
     94   let has_owners = type(owners) == array and owners.len() > 0
     95 
     96   if has_owners {
     97     for owner in owners {
     98       let get_owner(key) = {
     99         owner.at(key, default: "")
    100       }
    101 
    102       block(breakable: false)[
    103         #v(0.5em)
    104         #table(
    105           columns: (35%, 65%),
    106           stroke: 0.5pt + black,
    107           inset: 5pt,
    108           [Fullname:], [#get_owner("FULL_NAME")],
    109           [Date of birth:], [#get_owner("DATE_OF_BIRTH")],
    110           [Nationality:], [#get_owner("NATIONALITY")],
    111           [Actual address of domicile:], [#get_owner("DOMICILE_ADDRESS")]
    112         )
    113         #v(0.5em)
    114       ]
    115     }
    116   } else {
    117     block(breakable: false)[
    118       #v(0.5em)
    119       #table(
    120         columns: (35%, 65%),
    121         stroke: 0.5pt + black,
    122         inset: 5pt,
    123         [Surname(s):], [],
    124         [First name(s):], [],
    125         [Date(s) of birth:], [],
    126         [Nationality:], [],
    127         [Actual address of domicile:], []
    128       )
    129       #v(0.5em)
    130     ]
    131   }
    132 
    133   v(1em)
    134 
    135   text()[The contracting partner hereby undertakes to inform automatically of any changes to the information contained herein.]
    136 
    137   v(1.5em)
    138 
    139   // Signature Section
    140   let submitted_by_officer = get("BY_AML_OFFICER")
    141 
    142   if submitted_by_officer == false {
    143     table(
    144       columns: (40%, 10%, 50%),
    145       stroke: 0.5pt + black,
    146       inset: 5pt,
    147       [Date:],
    148       [],
    149       [Signature(s):],
    150       [#get("SIGN_DATE")],
    151       [],
    152       [#get("SIGNATURE")]
    153     )
    154 
    155     v(1em)
    156 
    157     text(size: 9pt, style: "italic")[
    158       It is a criminal offence to deliberately provide false information on this form (article 251 of the Swiss Criminal Code, document forgery)
    159     ]
    160   } else if submitted_by_officer == true {
    161     text(weight: "bold")[Signed declaration by the customer]
    162 
    163     v(0.5em)
    164 
    165     text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").]
    166 
    167     v(0.5em)
    168 
    169     text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.]
    170 
    171     v(0.5em)
    172 
    173     table(
    174       columns: (1fr),
    175       stroke: 0.5pt + black,
    176       inset: 5pt,
    177       [Signed Document:],
    178       [#if (get("ATTACHMENT_SIGNED_DOCUMENT") != ""){
    179         [Document attached]
    180        } else {
    181         [No document]
    182        }
    183       ]
    184     )
    185   } else {
    186     text(weight: "bold")[Invalid submitter (#submitted_by_officer)]
    187   }
    188 }
    189 
    190 // Example usage:
    191 #form((
    192   "VQF_MEMBER_NUMBER": "12345",
    193   "AML_STAFF_NAME" : "Manuela",
    194   "FILE_NUMBER": "42",
    195   "IDENTITY_CONTRACTING_PARTNER": "Example Company AG\nBahnhofstrasse 1\n8001 Zurich\nSwitzerland",
    196   "IDENTITY_LIST": (
    197     (
    198       "FULL_NAME": "John Doe",
    199       "DATE_OF_BIRTH": "01.01.1980",
    200       "NATIONALITY": "CH",
    201       "DOMICILE_ADDRESS": "Teststrasse 123\n8001 Zurich"
    202     ),
    203   ),
    204   "BY_AML_OFFICER": true,
    205   "SIGNATURE": "John Doe",
    206   "SIGN_DATE": "10.11.2025",
    207 ))