exchange

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

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