exchange

Base system with REST service to issue digital coins, run by the payment service provider
Log | Files | Refs | Submodules | README | LICENSE

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 ))