vqf_902_12.typ (11287B)
1 // VQF 902.12 Foundations (S) 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.12#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 let get(key, default: "") = { 27 data.at(key, default: default) 28 } 29 30 let checkbox(checked) = { 31 box( 32 width: 3mm, 33 height: 3mm, 34 stroke: 0.5pt + black, 35 inset: 0.3mm, 36 if checked == true or checked == "true" { 37 place(center + horizon, text(size: 8pt, sym.checkmark)) 38 } 39 ) 40 } 41 42 // Header 43 align(center, text(size: 11pt, weight: "bold")[CONFIDENTIAL]) 44 45 v(0.5em) 46 47 grid( 48 columns: (50%, 50%), 49 gutter: 1em, 50 image("vss_vqf_verein.png", width: 80%), 51 align(right)[ 52 #table( 53 columns: (1fr, 1fr), 54 stroke: 0.5pt + black, 55 inset: 5pt, 56 align: (left, left), 57 [VQF member no.], [AMLA File No.], 58 [#get("VQF_MEMBER_NUMBER")], [#get("FILE_NUMBER")] 59 ) 60 ] 61 ) 62 63 v(1em) 64 65 align(left, text(size: 14pt, weight: "bold")[Foundations (as well as similar constructs) (S)]) 66 67 v(-1em) 68 line(length:100%) 69 70 v(1em) 71 72 text(weight: "bold")[Contracting partner:] 73 74 v(0.5em) 75 76 table( 77 columns: (1fr), 78 stroke: 0.5pt + black, 79 inset: 5pt, 80 [#get("IDENTITY_CONTRACTING_PARTNER")] 81 ) 82 83 v(1em) 84 85 text()[The undersigned hereby declare(s) that as board member of the foundation, or of the highest supervisory body of an underlying company of a foundation, known as:] 86 87 v(0.5em) 88 89 table( 90 columns: (1fr), 91 stroke: 0.5pt + black, 92 inset: 5pt, 93 [#get("ENTITY_NAME")] 94 ) 95 96 v(1em) 97 98 text()[and, such capacity, provide(s) to the best of his/her/their knowledge the following:] 99 100 v(1.5em) 101 102 // Section 1: Foundation Information 103 [= 1. Name and information pertaining to the foundation (tick the two boxes applicable):] 104 105 v(0.5em) 106 107 let entity_type = get("ENTITY_TYPE") 108 let entity_revoc = get("ENTITY_REVOCABILITY") 109 110 block(breakable: false)[ 111 #grid( 112 columns: (auto, 1fr, auto, 1fr), 113 gutter: 1em, 114 row-gutter: 0.8em, 115 [Type of foundation:], 116 [#checkbox(entity_type == "DISCRETIONARY") Discretionary foundation], 117 [or], 118 [#checkbox(entity_type == "NON_DISCRETIONARY") Non-discretionary foundation], 119 [and], [], [], [], 120 [Revocability:], 121 [#checkbox(entity_revoc == "REVOCABLE") Revocable foundation], 122 [or], 123 [#checkbox(entity_revoc == "IRREVOCABLE") Irrevocable foundation], 124 ) 125 ] 126 127 v(1.5em) 128 129 // Section 2: Founder Information 130 [= 2. Information pertaining to the (ultimate economic, not fiduciary) founder (individual(s) or entity/ies):] 131 132 v(0.5em) 133 134 let founders = get("FOUNDER_LIST", default: ()) 135 let has_founders = type(founders) == array and founders.len() > 0 136 137 for founder in (if has_founders {founders} else {((:),)}) { 138 let get_founder(key) = { 139 if founder != (:) { 140 founder.at(key, default: "") 141 } else { 142 "" 143 } 144 } 145 146 block(breakable: false)[ 147 #table( 148 columns: (35%, 65%), 149 stroke: 0.5pt + black, 150 inset: 5pt, 151 [Last name(s), first name(s)/entity:], [#get_founder("PERSON_ENTITY_NAME")], 152 [Actual address of domicile/registered office:], [#get_founder("PERSON_DOMICILE_REGISTERED_OFFICE")], 153 [Country:], [#get_founder("PERSON_COUNTRY")], 154 [Date(s) of birth:], [#get_founder("PERSON_DATE_OF_BIRTH")], 155 [Nationality:], [#get_founder("PERSON_NATIONALITY")], 156 [Date of death (if deceased):], [#get_founder("PERSON_DATE_OF_DEATH")] 157 ) 158 ] 159 v(0.5em) 160 } 161 162 let founder_revoc = get("FOUNDER_HAS_REVOCATION_RIGHT") 163 if entity_revoc == "REVOCABLE" [ 164 #table( 165 columns: (70%, 30%), 166 stroke: 0.5pt + black, 167 inset: 5pt, 168 [In case of a revocable foundation: does the founder have the right to revoke the foundation?], 169 [#grid( 170 columns: (auto, 1fr), 171 gutter: 0.5em, 172 checkbox(founder_revoc), [Yes], 173 checkbox(not founder_revoc), [No], 174 )] 175 ) 176 ] 177 178 pagebreak() 179 180 // Section 3: Pre-existing Foundation 181 [= 3. If the foundation results from the restructuring of pre-existing foundation (re-settlement) or the merger of pre-existing foundations, the following information pertaining to the (actual) founder(s) of the pre-existing foundation(s) has to be given:] 182 183 v(0.5em) 184 185 let has_pred = get("HAS_PREDECESSOR_ENTITY") 186 let pred_founders = get("PREDECESSOR_FOUNDER_LIST", default: ()) 187 let has_pred_founders = has_pred and type(pred_founders) == array and pred_founders.len() > 0 188 189 if has_pred_founders { 190 for pred in pred_founders { 191 let get_pred(key) = { 192 pred.at(key, default: "") 193 } 194 195 block(breakable: false)[ 196 #table( 197 columns: (35%, 65%), 198 stroke: 0.5pt + black, 199 inset: 5pt, 200 [Last name(s), first name(s)/entity:], [#get_pred("PERSON_ENTITY_NAME")], 201 [Actual address of domicile/registered office:], [#get_pred("PERSON_DOMICILE_REGISTERED_OFFICE")], 202 [Country:], [#get_pred("PERSON_COUNTRY")], 203 [Date(s) of birth:], [#get_pred("PERSON_DATE_OF_BIRTH")], 204 [Nationality:], [#get_pred("PERSON_NATIONALITY")], 205 [Date of death (if deceased):], [#get_pred("PERSON_DATE_OF_DEATH")] 206 ) 207 ] 208 v(0.5em) 209 } 210 } else { 211 table( 212 columns: (35%, 65%), 213 stroke: 0.5pt + black, 214 inset: 5pt, 215 [Last name(s), first name(s)/entity:], [], 216 [Actual address of domicile/registered office:], [], 217 [Country:], [], 218 [Date(s) of birth:], [], 219 [Nationality:], [], 220 [Date of death (if deceased):], [] 221 ) 222 } 223 224 // Section 4: Beneficiary Information 225 [= 4. Information] 226 227 v(0.5em) 228 229 [== a) pertaining to the beneficiary/ies at the time of the signing of this form:] 230 231 v(0.5em) 232 233 let beneficiaries = get("BENEFICIARY_LIST", default: ()) 234 let has_benef = type(beneficiaries) == array and beneficiaries.len() > 0 235 236 if has_benef { 237 for benef in beneficiaries { 238 let get_benef(key) = { 239 benef.at(key, default: "") 240 } 241 let has_claim = get_benef("BENEFICIARY_HAS_CLAIM_RIGHT") 242 243 block(breakable: false)[ 244 #table( 245 columns: (35%, 65%), 246 stroke: 0.5pt + black, 247 inset: 5pt, 248 [Full name/entity:], [#get_benef("PERSON_ENTITY_NAME")], 249 [Actual address of domicile/registered office:], [#get_benef("PERSON_DOMICILE_REGISTERED_OFFICE")], 250 [Country:], [#get_benef("PERSON_COUNTRY")], 251 [Date of birth:], [#get_benef("PERSON_DATE_OF_BIRTH")], 252 [Nationality:], [#get_benef("PERSON_NATIONALITY")], 253 [Has the beneficiary an actual right to claim distribution?], 254 [#grid( 255 columns: (auto, auto), 256 stroke: 0.5pt + black, 257 inset: 5pt, 258 [#checkbox(has_claim) Yes], 259 [#checkbox(not has_claim) No], 260 )] 261 ) 262 ] 263 v(0.5em) 264 } 265 } else { 266 table( 267 columns: (35%, 65%), 268 stroke: 0.5pt + black, 269 inset: 5pt, 270 [Full name/entity:], [], 271 [Actual address of domicile/registered office:], [], 272 [Country:], [], 273 [Date of birth:], [], 274 [Nationality:], [], 275 [Has the beneficiary an actual right to claim distribution?], 276 [#grid( 277 columns: (auto, auto), 278 stroke: 0.5pt + black, 279 inset: 5pt, 280 [#checkbox(false) Yes], 281 [#checkbox(false) No], 282 )] 283 ) 284 } 285 286 v(1em) 287 288 [== b) and in addition to certain beneficiaries or if there is/are no defined beneficiary/ies pertaining to (a) group(s) of beneficiaries (e.g. descendants of the founder) known at the time of the signing of this form:] 289 290 v(0.5em) 291 292 table( 293 columns: (1fr), 294 stroke: 0.5pt + black, 295 inset: 5pt, 296 [#get("BENEFICIARY_GROUP_DESCRIPTION")] 297 ) 298 299 pagebreak() 300 301 // Section 5: Nominating Persons 302 [= 5. Information pertaining to (a) further person(s) having the right to determine or nominate representatives (e.g. members of the foundation board), if these representatives may dispose over the assets or have the right to change the distribution of the assets or the nomination of beneficiaries:] 303 304 v(0.5em) 305 306 let nom_persons = get("NOMINATING_PERSON_LIST", default: ()) 307 let has_nom = type(nom_persons) == array and nom_persons.len() > 0 308 309 if has_nom { 310 for nom in nom_persons { 311 let get_nom(key) = { 312 nom.at(key, default: "") 313 } 314 315 block(breakable: false)[ 316 #table( 317 columns: (35%, 65%), 318 stroke: 0.5pt + black, 319 inset: 5pt, 320 [Full name/entity:], [#get_nom("PERSON_ENTITY_NAME")], 321 [Actual address of domicile/registered office:], [#get_nom("PERSON_DOMICILE_REGISTERED_OFFICE")], 322 [Country:], [#get_nom("PERSON_COUNTRY")], 323 [Date of birth:], [#get_nom("PERSON_DATE_OF_BIRTH")], 324 [Nationality:], [#get_nom("PERSON_NATIONALITY")] 325 ) 326 ] 327 v(0.5em) 328 } 329 } else { 330 table( 331 columns: (35%, 65%), 332 stroke: 0.5pt + black, 333 inset: 5pt, 334 [Full name/entity:], [], 335 [Actual address of domicile/registered office:], [], 336 [Country:], [], 337 [Date of birth:], [], 338 [Nationality:], [] 339 ) 340 } 341 342 v(0.5em) 343 344 let nom_revoc = get("EXTRA_REVOCATION_RIGHTS") 345 table( 346 columns: (70%, 30%), 347 stroke: 0.5pt + black, 348 inset: 5pt, 349 [In case of a revocable foundation: is/are there (a) further person(s) with the right to revoke the foundation?], 350 [#grid( 351 columns: (auto, auto), 352 stroke: 0.5pt + black, 353 inset: 5pt, 354 [#checkbox(nom_revoc) Yes], 355 [#checkbox(not nom_revoc) No], 356 )] 357 ) 358 359 v(1.5em) 360 361 text()[The contracting partner(s) hereby undertake(s) to automatically inform of any changes to the information contained herein.] 362 363 v(1.5em) 364 365 // Signature 366 table( 367 columns: (1fr, 1fr), 368 stroke: 0.5pt + black, 369 inset: 5pt, 370 [Date:], [Signature(s):], 371 [#get("SIGN_DATE")], [#get("SIGNATURE")] 372 ) 373 374 v(1em) 375 376 text(size: 9pt, style: "italic")[ 377 It is a criminal offence to deliberately provide false information on this form (article 251 of the Swiss Criminal Code, document forgery). 378 ] 379 } 380 381 // Example usage: 382 #form(( 383 "VQF_MEMBER_NUMBER": "12345", 384 "FILE_NUMBER": "42", 385 "IDENTITY_CONTRACTING_PARTNER": "Foundation Board AG\nExample Street 1\n8001 Zurich", 386 "ENTITY_NAME": "Example Foundation", 387 "ENTITY_TYPE": "DISCRETIONARY", 388 "ENTITY_REVOCABILITY": "IRREVOCABLE", 389 "EXTRA_REVOCATION_RIGHTS": false, 390 "FOUNDER_LIST": ( 391 ( 392 "PERSON_ENTITY_NAME": "John Doe", 393 "PERSON_DOMICILE_REGISTERED_OFFICE": "Main St 123\n8001 Zurich", 394 "PERSON_COUNTRY": "CH", 395 "PERSON_DATE_OF_BIRTH": "01.01.1950", 396 "PERSON_NATIONALITY": "CH", 397 ), 398 ), 399 "HAS_PREDECESSOR_ENTITY": false, 400 "SIGNATURE": "Board Member", 401 "SIGN_DATE": "10.11.2025", 402 ))