vqf_902_9_customer.typ (5019B)
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 "FILE_NUMBER": "42", 194 "IDENTITY_CONTRACTING_PARTNER": "Example Company AG\nBahnhofstrasse 1\n8001 Zurich\nSwitzerland", 195 "IDENTITY_LIST": ( 196 ( 197 "FULL_NAME": "John Doe", 198 "DATE_OF_BIRTH": "01.01.1980", 199 "NATIONALITY": "CH", 200 "DOMICILE_ADDRESS": "Teststrasse 123\n8001 Zurich" 201 ), 202 ), 203 "BY_AML_OFFICER": false, 204 "SIGNATURE": "John Doe", 205 "SIGN_DATE": "10.11.2025", 206 ))