vqf_902_14.typ (5810B)
1 // VQF 902.14 Special Clarifications 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.14#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")[Special Clarifications]) 68 69 v(-1em) 70 line(length:100%) 71 72 grid( 73 columns: (auto, 1fr), 74 gutter: 0.5em, 75 align: (left, left), 76 image("pointing_finger.svg", height: 2em), 77 text(size: 9pt)[ 78 When a business relationship or transaction is associated with increased risk, appears unusual or evidence exists that the assets are the proceeds of a felony or a qualified tax offence, the member has to perform additional clarifications. 79 ] 80 ) 81 82 v(1em) 83 84 text(weight: "bold")[Customer:#footnote[Pursuant Identification form (VQF doc. No. 902.1) numeral 1.]] 85 86 v(0.3em) 87 88 table( 89 columns: (1fr), 90 stroke: 0.5pt + black, 91 inset: 5pt, 92 [#get("CUSTOMER_NAME")] 93 ) 94 95 v(0.5em) 96 97 text(weight: "bold")[This form was completed by:] 98 99 v(0.3em) 100 101 table( 102 columns: (1fr, 1fr), 103 stroke: 0.5pt + black, 104 inset: 5pt, 105 align: (left, left), 106 [Full name], [#get("AML_STAFF_NAME")], 107 [Date], [#get("FILING_DATE")], 108 ) 109 110 v(1.5em) 111 112 // Section 1: Reason for Special Clarifications 113 text(size: 11pt, weight: "bold")[1. Reason for special clarifications] 114 115 v(0.5em) 116 117 table( 118 columns: (45%,55%), 119 stroke: 0.5pt + black, 120 inset: 5pt, 121 [Description of the circumstances/transactions, which triggered the special clarifications], 122 [#get("INCRISK_REASON")] 123 ) 124 125 v(1.5em) 126 127 // Section 2: Used Means of Clarification 128 text(size: 11pt, weight: "bold")[2. Used means of clarification] 129 130 v(0.5em) 131 132 let means = get("INCRISK_MEANS") 133 134 grid( 135 columns: (auto), 136 inset: 5pt, 137 stroke: 0.5pt + black, 138 [#block(breakable: false)[ 139 #grid( 140 columns: (auto, 1fr), 141 gutter: 0.5em, 142 row-gutter: 0.5em, 143 checkbox(means == "GATHERING"), 144 [Gathering of information from the customer, beneficial owner of the assets, controlling person], 145 146 checkbox(means == "CONSULTATION"), 147 [Consultation of generally accessible sources and databases], 148 149 checkbox(means == "ENQUIRIES"), 150 [Enquiries with trustworthy persons (e.g. custodian bank)], 151 152 checkbox(means == "OTHER"), 153 [Other, which? #if means == "OTHER" [#get("INCRISK_MEANS_OTHER")]] 154 ) 155 ]]) 156 157 v(1.5em) 158 159 // Section 3: Supplemental Files 160 text(size: 11pt, weight: "bold")[3. Summary and plausibility check of the gathered information] 161 162 v(0.3em) 163 164 grid( 165 columns: (auto, 1fr), 166 gutter: 0.5em, 167 align: (left, left), 168 image("pointing_finger.svg", height: 2em), 169 text(size: 9pt)[ 170 The results of the clarifications have to be documented and their plausibility has to be checked. 171 ] 172 ) 173 174 v(1.5em) 175 176 table( 177 columns: (100%), 178 stroke: 0.5pt + black, 179 inset: 5pt, 180 [#get("INCRISK_SUMMARY")] 181 ) 182 183 v(1em) 184 185 table( 186 columns: (auto, 1fr), 187 stroke: 0.5pt + black, 188 inset: 5pt, 189 [Gathered/Consulted documents], 190 [#get("INCRISK_DOCUMENTS")] 191 ) 192 193 194 195 196 // Section 4: Result 197 text(size: 11pt, weight: "bold")[4. Result of the special clarification] 198 199 v(0.5em) 200 201 let result = get("INCRISK_RESULT") 202 203 grid( 204 columns: (auto), 205 inset: 5pt, 206 stroke: 0.5pt + black, 207 block(breakable: false)[ 208 #grid( 209 columns: (auto, 1fr), 210 gutter: 0.5em, 211 row-gutter: 0.8em, 212 213 checkbox(result == "NO_SUSPICION"), 214 [The plausibility of the circumstances could be checked, no reasonable suspicion pursuant to Art. 9 AMLA (possibly update of customer profile (VQF doc. No. 902.5) and/or risk profile (VQF doc. No. 902.4))], 215 216 checkbox(result == "REASONABLE_SUSPICION"), 217 [Reasonable suspicion pursuant to Art. 9 AMLA, duty to file a report with MROS], 218 219 checkbox(result == "SIMPLE_SUSPICION"), 220 [Simple suspicion pursuant to Art. 305#super[ter] Para. 2 StGB, right to notify MROS], 221 222 checkbox(result == "OTHER"), 223 [Other, what? #if result == "OTHER" [#get("INCRISK_RESULT_OTHER")]] 224 ) 225 ]) 226 227 } 228 229 // Example usage: 230 #form(( 231 "VQF_MEMBER_NUMBER": "12345", 232 "FILE_NUMBER": "42", 233 "CUSTOMER_NAME": "John Doe", 234 "FILED_BY_NAME": "Jane Smith", 235 "FILING_DATE": "10.11.2025", 236 "INCRISK_REASON": "Unusual transaction pattern detected", 237 "INCRISK_MEANS": "GATHERING", 238 "INCRISK_SUMMARY": "Customer provided satisfactory explanation", 239 "INCRISK_DOCUMENTS": "Bank statements, invoices", 240 "INCRISK_RESULT": "NO_SUSPICION", 241 ))