vqf_902_11_customer.typ (6483B)
1 // VQF 902.11 Establishing of the controlling person (K) 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.11#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")[Establishing of the controlling person of operating legal entities and partnerships both not quoted on the stock exchange (K)]) 68 69 v(0.3em) 70 71 text(size: 9pt, style: "italic")[ 72 (for operating legal entities and partnership that are contracting partner as well as analogously for operating legal entities and partnership that are beneficial owners) 73 ] 74 75 v(-1em) 76 line(length:100%) 77 78 v(1em) 79 80 // Section 1: Contracting Partner 81 text(size: 11pt, weight: "bold")[Contracting partner:] 82 83 v(0.5em) 84 85 table( 86 columns: (1fr), 87 stroke: 0.5pt + black, 88 inset: 5pt, 89 [#get("IDENTITY_CONTRACTING_PARTNER")] 90 ) 91 92 v(1em) 93 94 // Section 2: Declaration 95 let control_reason = get("CONTROL_REASON") 96 97 text()[The contracting partner hereby declares that (tick the appropriate box):] 98 99 block(breakable: false)[ 100 #grid( 101 columns: (auto, 1fr), 102 gutter: 0.5em, 103 row-gutter: 0.8em, 104 checkbox(control_reason == "HAS_25_MORE_RIGHTS"), 105 [the person(s) listed below is/are *holding 25% or more of the contracting partner's shares (capital shares or voting rights)*; or], 106 107 checkbox(control_reason == "OTHER_WAY"), 108 [if the capital shares or voting rights cannot be determined or in case there are no capital shares or voting rights 25% or more, the contracting partner hereby declares that the person(s) listed below *is/are controlling the contracting partner in other ways*; or], 109 110 checkbox(control_reason == "DIRECTOR"), 111 [in case this/these person(s) cannot be determined or this/these person(s) does/do not exist, the contracting partner hereby declares that the person(s) listed below is/are the *managing director(s)*] 112 ) 113 ] 114 115 v(1em) 116 117 // Section 3: Controlling Persons 118 let persons = get("IDENTITY_LIST", default: ()) 119 let has_persons = type(persons) == array and persons.len() > 0 120 121 if has_persons { 122 for person in persons { 123 let get_person(key) = { 124 person.at(key, default: "") 125 } 126 127 block(breakable: false)[ 128 #v(0.5em) 129 #table( 130 columns: (35%, 65%), 131 stroke: 0.5pt + black, 132 inset: 5pt, 133 [Full name:], [#get_person("FULL_NAME")], 134 [Actual address of domicile:], [#get_person("DOMICILE_ADDRESS")] 135 ) 136 #v(0.5em) 137 ] 138 } 139 } else { 140 block(breakable: false)[ 141 #v(0.5em) 142 #table( 143 columns: (35%, 65%), 144 stroke: 0.5pt + black, 145 inset: 5pt, 146 [Last name(s):], [], 147 [First name(s):], [], 148 [Actual address of domicile:], [] 149 ) 150 #v(0.5em) 151 ] 152 } 153 154 v(1.5em) 155 156 // Section 4: Fiduciary Holding 157 text(size: 11pt, weight: "bold")[Fiduciary holding assets] 158 159 v(0.5em) 160 161 let third_party = get("THIRD_PARTY_OWNERSHIP") 162 163 block(breakable: false)[ 164 #text()[Is a third person the beneficial owner of the assets held in the account/securities account?] 165 166 #grid( 167 columns: (auto, 1fr), 168 gutter: 0.5em, 169 row-gutter: 0.5em, 170 checkbox(not third_party), [No.], 171 checkbox(third_party), [Yes. $=>$ The relevant information regarding the beneficial owner has to be obtained by filling in a separate VQF doc. No. 902.9.] 172 ) 173 ] 174 175 v(0.5em) 176 177 text()[The contracting partner hereby undertakes to automatically inform of any changes to the information contained herein.] 178 179 v(0.5em) 180 181 // Signature Section 182 let submitted_by_officer = get("BY_AML_OFFICER") 183 184 if submitted_by_officer == false { 185 table( 186 columns: (40%, 10%, 50%), 187 stroke: 0.5pt + black, 188 inset: 5pt, 189 [Date:], 190 [], 191 [Signature(s):], 192 [#get("SIGN_DATE")], 193 [], 194 [#get("SIGNATURE")] 195 ) 196 197 v(1em) 198 199 text(size: 9pt, style: "italic")[ 200 It is a criminal offence to deliberately provide false information on this form (article 251 of the Swiss Criminal Code, documents forgery). 201 ] 202 } else if submitted_by_officer == true { 203 text(weight: "bold")[Signed declaration by the customer] 204 205 v(0.5em) 206 207 text(size: 9pt)[This form was submitted by #get("AML_STAFF_NAME").] 208 209 v(0.5em) 210 211 text(size: 9pt)[The attachment contains the customer's signature on the beneficial owner declaration.] 212 213 v(0.5em) 214 215 table( 216 columns: (1fr), 217 stroke: 0.5pt + black, 218 inset: 5pt, 219 [Signed Document:], 220 [#if get("ATTACHMENT_SIGNED_DOCUMENT") != "" [Document attached] else [No document]] 221 ) 222 } else { 223 text(weight: "bold")[Invalid submitter (#submitted_by_officer)] 224 } 225 } 226 227 // Example usage: 228 #form(( 229 "VQF_MEMBER_NUMBER": "12345", 230 "FILE_NUMBER": "42", 231 "IDENTITY_CONTRACTING_PARTNER": "Example Company AG\nBahnhofstrasse 1\n8001 Zurich\nSwitzerland", 232 "CONTROL_REASON": "HAS_25_MORE_RIGHTS", 233 "IDENTITY_LIST": ( 234 ( 235 "FULL_NAME": "Jane Smith", 236 "DOMICILE_ADDRESS": "Teststrasse 456\n8001 Zurich" 237 ), 238 ), 239 "THIRD_PARTY_OWNERSHIP": false, 240 "BY_AML_OFFICER": false, 241 "SIGNATURE": "Jane Smith", 242 "SIGN_DATE": "10.11.2025", 243 ))