Ga naar inhoud

Hoe werkt dit: ondertekenen

Met ondertekenen laat je een document tekenen zonder dat iemand iets print.

Waarom dit er is

Zo gaat een sponsorcontract bij veel verenigingen. De commissie maakt een Word-bestand en mailt het. De sponsor print het, tekent, scant en mailt het terug. Daarna tekent het bestuur. Dat duurt weken. In die tijd staat het contract op “aangeboden”, terwijl het bord al hangt.

Vaak is het bestuur volgens de statuten gezamenlijk bevoegd. Meerdere mensen zijn tekenbevoegd en minstens twee moeten tekenen. Een pdf met één krabbel kan dat niet laten zien.

De weg

  1. Maak de clubtekst één keer op. Kies Clubtekst vastleggen. Je krijgt een editor met koppen, vet, opsommingen en een streep. Met de knop Samenvoegveld invoegen zet je een samenvoegveld op de plek waar een gegeven moet komen. Je kiest het uit een lijst. In de tekst staat het label, bijvoorbeeld “Naam van de sponsor”. Met de pen-knop Handtekeningvak invoegen zet je een handtekeningvak op de plek waar getekend moet worden.
  2. Maak een document uit een contract. Kies een aangeboden sponsorcontract en kies Document maken en laten tekenen. De app vult de velden en bevriest ze in het document. Wordt de sponsor later hernoemd, dan verandert er niets aan wat er getekend is. Daarom is een contract een contract. Een veld dat niet gevuld kan worden, blijft zichtbaar staan. Dat is bewust: een gat dat eruitziet als tekst merkt niemand op, een veld dat blijft staan wel. Je krijgt eerst een concept. Er wordt niets verstuurd.
  3. Bied het document aan. Lees het concept na op Documenten en kies Aanbieden en links versturen. Alle tekenlinks gaan tegelijk uit: naar de sponsor en naar iedereen die namens de club mag tekenen. Zolang iedereen tekent, maakt de volgorde niet uit. Wil de club dat de sponsor eerst tekent, zet dan bij Instellingen, onder Tekenen, de optie De tegenpartij tekent eerst aan.
  4. De ondertekenaar opent de link, leest de tekst en vult zijn naam in. Ook typt hij het e-mailadres over waarop hij de uitnodiging kreeg. Dat adres is de tweede factor. Een doorgestuurde link is niets waard zonder dat adres.
  5. Zodra beide kanten het vereiste aantal handtekeningen hebben, staat het document op getekend. De tekst wordt vastgezet met een hash, een vingerafdruk van de tekst. Daarna verandert er niets meer. Wil je iets anders, maak dan een nieuw document. Het sponsorcontract gaat mee: sinds 20 september 2026 staat een aangeboden contract op getekend zodra zijn document compleet is. Als reden staat een verwijzing naar dat document. De commissie hoeft het contract dus niet meer zelf om te zetten en de factuurronde neemt het vanzelf mee.

Waar de uitnodigingen aankomen

De uitnodigingen volgen de instelling Waar gaat de post heen bij Beheer → Instellingen. Staat die op Alles naar één testadres, dan krijgt alleen het testadres de uitnodigingen. Is er geen testadres ingesteld, dan gaat er niets uit. Na het aanbieden toont de app apart hoeveel uitnodigingen naar ondertekenaars zijn verstuurd, hoeveel naar het testadres zijn omgeleid, hoeveel de postroutering heeft tegengehouden en hoeveel zijn mislukt. Omgeleide en tegengehouden uitnodigingen hebben de ondertekenaars niet bereikt.

Bij Wie tekent en op de bewijspagina staat wanneer de tekenlink is aangemaakt. Die datum zegt niet dat de uitnodigingsmail is aangekomen. De link ontstaat vóór de verzending.

Over de tweede factor

In het eerste ontwerp stond hier een eenmalige code die de ondertekenaar zelf aanvraagt. Die is er bewust niet gekomen. Er zijn twee redenen:

  • Wie de link heeft, heeft de mailbox. Een code naar diezelfde mailbox voegt niets toe.
  • De functie die zo’n code maakt, zou voor iedereen zonder login open moeten staan (anon). Dan kan iedereen met het token de code opvragen zonder een mail te openen. Dan is er geen tweede factor meer.

Wel is er het overtypen van het e-mailadres. Een club die twee kanalen wil, kan de instelling tekenen_code_vereist aanzetten. Dan ziet de commissie bij het aanbieden per ondertekenaar een code van zes cijfers. Die geeft de commissie telefonisch of per app door. Na drie keer een verkeerde code gaat de link dicht.

Wie mag wat

Ondertekenen heeft geen eigen recht. Wie het onderwerp beheert, beheert het document. Een sponsorcontract is van de sponsorcommissie, een trainerscontract van de technische commissie. Wie onder een document moet tekenen, mag het altijd lezen, ook als die persoon het onderwerp niet beheert.

Dat werkt per soort document. Een commissieleider van de technische commissie opent Documenten en ziet daar alleen de trainerscontracten. De sponsorcontracten zijn voor die commissieleider onzichtbaar. Andersom is het net zo. De leesregel van het document vraagt daarvoor app.mag_document met de soort erbij.

Bedragen hebben een eigen regel. Wat een trainer kost, staat in salary_agreement en is alleen te lezen voor wie over geld gaat. Een commissieleider van de technische commissie kan dus een trainerscontract klaarzetten en aanbieden zonder het bedrag in de app te kunnen opzoeken. Dat lijkt tegenstrijdig, maar het bedrag staat in de tekst van het document dat de commissieleider opstelt. Het staat niet in de tabel die de commissieleider leest.

Het tekenregime beheer je bij Instellingen onder Tekenen, buiten deze module. Daar staat hoeveel handtekeningen namens de club nodig zijn, wie tekenbevoegd is en of er een volmachtgrens geldt. Dezelfde afspraak geldt straks ook voor een trainerscontract en een BOSA-aanvraag.

De opmaak is een boom, geen tekst

Sinds ADR 57 bestaat een sjabloon uit een documentboom en niet meer uit platte tekst. Dezelfde boom wordt drie keer getekend: in de editor waar je hem opmaakt, op het scherm van de ondertekenaar en in de pdf. Er zit geen browser tussen, dus ook geen headless Chrome in een eigen container.

Voor jou betekent dit dat wat je in de editor ziet, straks zo in de pdf staat. Een kop is een kop, een lijst is een lijst en een handtekeningvak staat waar jij het neerzet, niet altijd onderaan.

Voor wie eraan bouwt: modules/signing/boom.ts beschrijft de vorm en het rekenwerk. pdf-boom.tsx vertaalt de boom naar react-pdf, met één regel die telt: een knoopsoort die de mapper niet kent, geeft een fout. Overslaan zou veiliger lijken. Dan valt er echter een contractbepaling weg zonder dat iemand het ziet, en dat merk je pas bij een geschil.

inhoud blijft ernaast staan als platte weergave. Daar hangt de hash aan, en een document van voor deze migratie heeft niets anders. De app schrijft altijd allebei, uit één functie.

Het contract als PDF

Bij elk document staat Download als PDF. Dat is het contract zoals je het archiveert of mailt: met het briefhoofd van de club, de tekst, de handtekeningvakken met de krabbels erin en paginanummers.

Achteraan zit een bewijspagina. Daarop staat per handtekening wie er tekende, met welk e-mailadres, wanneer de tekenlink is aangemaakt en wanneer er is getekend. Ook staat er hoe (getypt, initialen of een echte handtekening) en langs welke weg (tekenlink met adresbevestiging, of ingelogd in de app). Daarnaast staat er de hash van de tekst. Daardoor is het meer dan een plaatje van een krabbel.

Ook een document dat nog niet rond is, kun je downloaden. Er staat dan “nog niet volledig getekend” op, en bij de open vakken “nog niet getekend”. Dat is duidelijker dan een knop die er soms wel en soms niet is.

De hash gaat over de tekst en niet over het bestand. Dezelfde invoer geeft namelijk twee keer een andere pdf, omdat er een aanmaakdatum in staat. Je verzegelt dus de afspraak. Elke keer dat je het document downloadt, staat dezelfde hash erop. Die leg je bij een geschil naast elkaar.

Tekenen met je vinger

Wie tekent, kiest hoe: Handtekening zetten met vinger, pen of muis, Initialen of Naam typen. Alle drie zijn even geldig. De bewijspagina laat zien welke het was.

De krabbel wordt bewaard als vectorpad en niet als plaatje. Daardoor schaalt hij mee in de pdf zonder te vervagen en weegt hij een paar honderd bytes. De puntenreeks is zelf ook bewijs: twee handtekeningen die byte voor byte gelijk zijn, zijn gekopieerd en niet twee keer gezet.

Het werkt op elk apparaat. Het tekenvlak reageert op aanwijzers en niet op aanrakingen. Muis, vinger en stylus doen daardoor hetzelfde.

Namens de club teken je in de app

Wie namens de club tekent, is ingelogd. Dan is een tekenlink een omweg. Op Documenten staat bij een document dat op jou wacht een blok “Jij moet dit nog tekenen”. Je naam staat er al in en eronder staat een knop. Er komt geen mail aan te pas.

De tekenlink en het overgetypte adres bewijzen dat jij het bent. Voor iemand zonder account is dat het enige bewijs. Een ingelogd bestuurslid levert een sterker bewijs: een sessie op het eigen account. De handtekening hangt daarom aan persoon.gebruiker_id = auth.uid() en niet aan een adres dat je kunt overtypen uit een doorgestuurd bericht.

Een ding blijft gelijk: je tekent alleen je eigen handtekening, ook als je het document mag beheren. Dat is het hele punt van twee handtekeningen. De tegenpartij tekent altijd via de eigen link, ook als zij toevallig ook in de kaderlijst staat. Zodra je in de app hebt getekend, gaat je tekenlink dicht. Zo blijft er geen geldige link in een mailbox liggen voor een handtekening die al staat.

Een document dat op jou wacht, staat ook op Mijn overzicht, boven de taken, onder “Op jouw handtekening”. Een contract dat op een handtekening wacht, is werk. Werk dat alleen op een ander scherm staat, wordt vergeten.

Een democlub heeft alleen verzonnen adressen op demo.clubista.app, dus daar komt nooit een mail aan. Zonder link is er niets te tekenen en blijft ondertekenen een plaatje. Daarom toont de app na het aanbieden in een democlub de tekenlinks op het scherm, zodat een bezoeker zelf kan tekenen als de sponsor en als de bestuurder.

Bij een echte club gebeurt dat niet. De mail is daar het bewijs dat het adres van de ondertekenaar klopt: wie de link opent, moet hetzelfde adres overtypen. Een link op het scherm haalt die controle onderuit.

Bij een aangeboden document kan een documentbeheerder Nieuwe tekenlinks versturen kiezen. Dat kan ook als een deel van de partijen al heeft getekend. Na bevestiging met Ja, verstuur nieuwe links worden de oude links voor partijen die nog niet hebben getekend ongeldig en worden nieuwe links aangemaakt. Gezette handtekeningen blijven behouden. Een volledig getekend, ingetrokken of verlopen document heeft deze actie niet.

De documenttekst en het oorspronkelijke tekenregime blijven gelijk. De nieuwe links zijn dertig dagen geldig. Was een toegangscode vereist, dan krijgen de openstaande ondertekenaars ook nieuwe codes. Geef die apart door. De eerdere links werken daarna niet meer.

De uitnodigingen volgen de huidige postinstellingen. Het resultaat toont apart hoeveel uitnodigingen zijn verstuurd, omgeleid, tegengehouden of mislukt. Eventuele toegangscodes en demotekenlinks verschijnen na het versturen, net als bij de eerste aanbieding. Bij een fout blijft het documentdetail open. Zolang de actie loopt, kun je niet opnieuw versturen en het blad niet sluiten.

Wat dit bewust niet is

Dit is geen gekwalificeerde handtekening met een certificaat. Dat is een dienst van derden met een prijs die niet bij een amateurvereniging past. Boven een instelbaar bedrag kan een club daar later een adapter voor aanzetten. De plaats ervoor is dezelfde tabel.

Het geeft ook geen Word-bestand terug dat pixel voor pixel klopt. Dat kost een documentdienst in een eigen container. Die komt pas als een club erom vraagt.