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