vqf_902_15.typ (7108B)
1 // VQF 902.15 Life Insurance Policies (I) 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.15#linebreak() 14 Version of 22 January 2021 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")[Information on life insurance policies with separately managed accounts/securities accounts (so-called insurance wrappers) (I)]) 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(weight: "bold")[Name or number of the contractual relationship between the contracting party and the financial intermediary:] 86 87 v(0.5em) 88 89 table( 90 columns: (1fr), 91 stroke: 0.5pt + black, 92 inset: 5pt, 93 [#get("CONTRACTUAL_RELATIONSHIP_NAME")] 94 ) 95 96 v(1em) 97 98 text(weight: "bold")[Insurance policy:] 99 100 v(0.5em) 101 102 table( 103 columns: (1fr), 104 stroke: 0.5pt + black, 105 inset: 5pt, 106 [#get("INSURANCE_POLICY_DETAILS")] 107 ) 108 109 v(1em) 110 111 text()[The contracting partner confirms in accordance with Art. 41a SRO Regulations that it is a licensed and state-supervised insurance company and that it has entered into the above-mentioned contractual relationship the assets connected to the life insurance policy also mentioned above.] 112 113 v(0.5em) 114 115 text()[In relation with the above insurance policy, the contracting partner gives the following further details:] 116 117 v(1.5em) 118 119 // Section 1: Policy Holder 120 [= 1. Policy holder] 121 122 v(0.5em) 123 124 let policy_holders = get("POLICY_HOLDER_LIST", default: ()) 125 let has_holders = type(policy_holders) == array and policy_holders.len() > 0 126 127 for holder in (if has_holders {policy_holders} else {((:),)}) { 128 let get_holder(key) = { 129 if holder != (:) { 130 holder.at(key, default: "") 131 } else { 132 "" 133 } 134 } 135 136 text()[Full name/entity:] 137 138 v(0.3em) 139 140 table( 141 columns: (1fr), 142 stroke: 0.5pt + black, 143 inset: 5pt, 144 [#get_holder("PERSON_ENTITY_NAME")] 145 ) 146 147 v(0.5em) 148 149 table( 150 columns: (40%, 10%, 50%), 151 stroke: 0.5pt + black, 152 inset: 5pt, 153 [Date of birth:], 154 [], 155 [Nationality:], 156 [#get_holder("PERSON_DATE_OF_BIRTH")], 157 [], 158 [#get_holder("PERSON_NATIONALITY")] 159 ) 160 161 v(0.5em) 162 163 text()[Actual address of domicile/registered office (incl. country):] 164 165 v(0.3em) 166 167 table( 168 columns: (1fr), 169 stroke: 0.5pt + black, 170 inset: 5pt, 171 [#get_holder("PERSON_DOMICILE_REGISTERED_OFFICE")] 172 ) 173 174 v(1em) 175 } 176 177 v(0.5em) 178 179 // Section 2: Premium Payer 180 [= 2. Person actually (not in a fiduciary capacity) paying the premiums (to be filled in if not identical with point 1 above):] 181 182 v(0.5em) 183 184 let same_payer = get("PREMIUM_PAYER_SAME_AS_HOLDER") 185 let premium_payers = get("PREMIUM_PAYER_LIST", default: ()) 186 let has_payers = not same_payer and type(premium_payers) == array and premium_payers.len() > 0 187 188 if has_payers { 189 for payer in premium_payers { 190 let get_payer(key) = { 191 payer.at(key, default: "") 192 } 193 194 text()[Full anme/entity:] 195 196 v(0.3em) 197 198 table( 199 columns: (1fr), 200 stroke: 0.5pt + black, 201 inset: 5pt, 202 [#get_payer("PERSON_ENTITY_NAME")] 203 ) 204 205 v(0.5em) 206 207 table( 208 columns: (40%, 10%, 50%), 209 stroke: 0.5pt + black, 210 inset: 5pt, 211 [Date of birth:], 212 [], 213 [Nationality:], 214 [#get_payer("PERSON_DATE_OF_BIRTH")], 215 [], 216 [#get_payer("PERSON_NATIONALITY")] 217 ) 218 219 v(0.5em) 220 221 text()[Actual address of domicile/registered office (incl. country):] 222 223 v(0.3em) 224 225 table( 226 columns: (1fr), 227 stroke: 0.5pt + black, 228 inset: 5pt, 229 [#get_payer("PERSON_DOMICILE_REGISTERED_OFFICE")] 230 ) 231 232 v(1em) 233 } 234 } else { 235 text()[Full name/entity:] 236 237 v(0.3em) 238 239 table( 240 columns: (1fr), 241 stroke: 0.5pt + black, 242 inset: 5pt, 243 [] 244 ) 245 246 v(0.5em) 247 248 table( 249 columns: (40%, 10%, 50%), 250 stroke: 0.5pt + black, 251 inset: 5pt, 252 [Date of birth:], 253 [], 254 [Nationality:], 255 [], 256 [], 257 [] 258 ) 259 260 v(0.5em) 261 262 text()[Actual address of domicile/registered office (incl. country):] 263 264 v(0.3em) 265 266 table( 267 columns: (1fr), 268 stroke: 0.5pt + black, 269 inset: 5pt, 270 [] 271 ) 272 273 v(1em) 274 } 275 276 v(1em) 277 278 text()[The contracting partner hereby undertakes to automatically inform the financial intermediary of any changes. The contracting partner hereby also declares having been given permission by the above individuals and/or entities to transmit their data to the financial intermediary.] 279 280 v(1.5em) 281 282 // Signature 283 table( 284 columns: (40%, 10%, 50%), 285 stroke: 0.5pt + black, 286 inset: 5pt, 287 [Date:], 288 [], 289 [Signature(s):], 290 [#get("SIGN_DATE")], 291 [], 292 [#get("SIGNATURE")] 293 ) 294 295 v(1em) 296 297 text(size: 9pt, style: "italic")[ 298 It is a criminal offence to deliberately provide false information on this form (article 251 of the Swiss Criminal Code, document forgery). 299 ] 300 } 301 302 // Example usage: 303 #form(( 304 "VQF_MEMBER_NUMBER": "12345", 305 "FILE_NUMBER": "42", 306 "IDENTITY_CONTRACTING_PARTNER": "Insurance Company AG\nInsurance Street 1\n8001 Zurich\nSwitzerland", 307 "CONTRACTUAL_RELATIONSHIP_NAME": "Policy #12345-ABC", 308 "INSURANCE_POLICY_DETAILS": "Life insurance policy with separate account management\nPolicy Number: LI-2025-001\nIssued: 01.01.2025", 309 "POLICY_HOLDER_LIST": ( 310 ( 311 "PERSON_ENTITY_NAME": "John Doe", 312 "PERSON_DATE_OF_BIRTH": "01.01.1970", 313 "PERSON_NATIONALITY": "CH", 314 "PERSON_DOMICILE_REGISTERED_OFFICE": "Main Street 123\n8001 Zurich\nSwitzerland" 315 ), 316 ), 317 "PREMIUM_PAYER_SAME_AS_HOLDER": true, 318 "SIGNATURE": "Insurance Company Representative", 319 "SIGN_DATE": "10.11.2025", 320 ))