Hoe werkt dit: sponsoring
Elk sponsorcontract is vindbaar en de tegenprestaties zijn aantoonbaar geleverd. Zo zijn er geen mondelinge afspraken meer en geen discussie over zichtbaarheid zonder logboek.
Voor de club
/sponsoring heeft drie tabbladen, omdat er drie soorten werk zijn: Sponsors,
Contracten en Sponsorleveringen.
Sponsors
Hier staat wie de sponsor is, in welke fase het gesprek zit (contact gelegd, gesprek gehad, voorstel uit, getekend of afgewezen) en wat de volgende actie is, met een datum. Een lead die je niet opvolgt, is geen lead maar een notitie.
De pagina van één sponsor
Klik een rij aan en je komt op /sponsoring/[id]. Daar staat alles wat aan deze sponsor
hangt, op één plek: wie het is, wie je er spreekt, welke contracten er lopen, wat wij daarvoor
moeten leveren en welke borden van deze sponsor op het park staan. Het logo staat erbij.
Op deze pagina vul je ook het KvK-nummer, het btw-nummer, het adres, de postcode, de plaats, de accountmanager en het logo in. Dat kan sinds 13 september 2026. De factuurmodule leest het KvK-nummer, het adres en de postcode van de sponsor. Zonder die gegevens is een sponsorfactuur nooit compleet. Staat er een getekend contract en ontbreken die velden, dan zegt de pagina dat bovenaan het scherm.
Een sponsor heeft eigen contactpersonen, eigen contracten en eigen borden. Daarom heeft de sponsor een eigen pagina met een eigen adres, waar je naartoe kunt linken. Bewerken doe je in een blad dat je afmaakt en sluit.
Contactpersonen bijhouden
Open een sponsor en kies bij Contactpersonen voor Contactpersoon toevoegen. Vul de naam in en, als je die hebt, het e-mailadres, het telefoonnummer en de rol bij de sponsor. Een e-mailadres is niet verplicht om iemand vast te leggen. Je hebt het wel nodig om die persoon post te sturen. Met Contactpersoon … bewerken pas je deze gegevens later aan. Bij een fout blijft het formulier open met je invoer, zodat je die kunt verbeteren. Een inactieve contactpersoon blijft bij het bewerken inactief. Opnieuw activeren is een aparte handeling.
Contracten
Kies Contract vastleggen voor een nieuw contract. Per contract leg je vast: het bedrag per seizoen, de looptijd, de btw (sponsoring is btw-belast, standaard 21 procent), de opzegtermijn, of er stilzwijgend wordt verlengd en het facturatiemoment.
Zonder getekend document blijft een contract “aangeboden”. Wil je het toch op getekend zetten, dan hoort daar een reden bij, en die blijft staan. Dat is het verschil tussen “we hebben iets afgesproken” en “we kunnen het aantonen”.
Het label Loopt af verschijnt zodra een contract binnen een half jaar eindigt of de opzegdeadline nadert. Dat is het moment om de sponsor te benaderen. Wacht niet tot de week voor de einddatum.
Een contract corrigeren
Open het contract op het tabblad Contracten en kies Contract corrigeren. Je kunt het bedrag, de looptijd, de btw, de opzegtermijn, de verlenging, het facturatiemoment en het oormerk bijwerken. De sponsor en het pakket blijven gelijk. Met Bewaar contract sla je de wijzigingen op. Bij een fout blijft het formulier open met jouw invoer.
Dit kan zolang het contract aangeboden is en er nog geen document voor is gemaakt. Een bestaand document kan al gelezen zijn of ter ondertekening zijn verstuurd. Leg een nieuwe afspraak daarom vast als nieuw contract. Ook voor een verlenging maak je een nieuw contract. Zo blijft terug te vinden wat eerder is afgesproken.
Heeft een collega het contract intussen gewijzigd, dan vraagt de app je de nieuwste versie te openen. Neem je eigen aantekeningen zo nodig over voordat je het blad sluit.
Tegenprestaties
Tegenprestaties zijn wat de club terugdoet. Ze komen automatisch uit het pakket zodra je een contract aan een pakket hangt. Elke tegenprestatie krijgt een commissie die hem levert: het bord naar Terrein, het shirt naar Kleding, het logo naar het webteam.
Open het tabblad Sponsorleveringen en kies een seizoen. Zonder seizoen laat werk zien waar nog geen seizoen aan hangt. De aantallen gaan alleen over de gekozen selectie en over wat je mag lezen. Een vervallen afspraak staat apart en telt niet als nog te leveren werk.
Wie sponsoringbeheer heeft, opent een levering, kiest de verantwoordelijke commissie en spreekt een leverdatum af (Eigenaar en datum afspreken, Bewaar planning). Ontbreekt een van beide, dan zegt de lijst dat. Een vrijwilliger van de uitvoerende commissie opent de eigen levering, past de stand aan en voegt een bewijslink en eventueel een interne toelichting toe (Bewaar levering). Die vrijwilliger ziet geen contractbedragen.
Een bewijslink blijft eerst intern. Sponsoringbeheer opent de opgeslagen levering en bekijkt de link met Bekijk het opgeslagen bewijs. Controleer of de foto of publicatie geschikt is om met deze sponsor te delen, ook als er herkenbare mensen op staan. Kies daarna Geef bewijs vrij aan sponsor en bevestig. De interne toelichting verschijnt nooit in het portaal. Oude bewijslinks worden niet automatisch vrijgegeven.
Met Trek vrijgave in verdwijnt de link weer uit het sponsorportaal. Wat de sponsor eerder heeft bekeken of gedownload, kun je daarmee niet terughalen. Wijzigt iemand de bewijslink of zet iemand de levering terug naar een andere stand, dan vervalt de vrijgave vanzelf. Het nieuwe bewijs moet dan opnieuw worden beoordeeld.
Heeft een collega de levering intussen gewijzigd, dan blijven je eigen velden staan. Bewaar zo nodig je aantekeningen, sluit het blad en open de actuele levering. Controleer de nieuwe afspraak voordat je jouw wijziging opnieuw invoert.
Wie ziet wat
| Sponsors en contracten | Tegenprestaties | Pakketten | |
|---|---|---|---|
| Kaderlid | lezen | ||
| Commissie die levert | de eigen tegenprestatie, en afvinken | lezen | |
| Sponsorcommissie | alles | alles | beheren |
| Financiële commissie | alles | alles | lezen |
| Bestuurslid | alles | alles | lezen |
Contractbedragen zijn voor de sponsorcommissie, de financiële commissie en het bestuur. Een commissie die een bord ophangt, hoeft niet te weten wat dat bord kost en ziet dat dus ook niet.
Het sponsorportaal
Eén sponsor, één plek. Onderaan de pagina van een sponsor staat Sponsorportaal. Daar maak je een persoonlijke link en mail je hem in dezelfde handeling naar een contactpersoon (Maak en mail), of je kopieert hem zelf (Alleen de link maken). Wie de link opent, ziet zonder account:
- de contracten met hun stand, en of er in de app is getekend;
- wat wij leveren, met het vrijgegeven bewijs erbij;
- de facturen, met wat er nog open staat;
- de eigen contactpersonen;
- de pakketten van de club;
- de business club, als de club die heeft.
Dit kan de sponsor zelf doen, en dit gebeurt er dan bij jou:
- Contactpersoon bijwerken, toevoegen of op inactief zetten. De wijziging staat meteen in de gegevens van de club, met een auditregel. Weghalen betekent op inactief zetten. De contactpersoon blijft dan bij de club staan, maar krijgt geen post meer en staat niet meer in het portaal. Op de sponsorpagina kun jij hetzelfde doen, en een contactpersoon weer actief maken. Alleen een beheerder verwijdert een inactieve contactpersoon echt. Een actieve contactpersoon verdwijnt alleen samen met de hele sponsor. Zo kost een vergissing nooit een adres. Definitief verwijderen haalt ook de koppeling met een businessclub-toegang weg.
- Ik wil meer bij een pakket. Er komt een taak bij de accountmanager, of bij de sponsorcommissie als er geen accountmanager is. Er gebeurt verder niets. Jij bepaalt wat de volgende actie wordt. Er komt hooguit één taak per pakket per dag.
- Neem contact op. Het bericht wordt een taak bij dezelfde eigenaar. Er gaat geen mail naar buiten. De taak is het kanaal en jij antwoordt zelf.
Dit moet je weten, net als bij de klus-link:
- De link is de sleutel. Hij staat nergens leesbaar in de database. Is hij kwijt of bij de verkeerde terechtgekomen, maak dan een nieuwe link en trek de oude in met Trek in. De lijst laat zien of een link openstaat en hoe vaak hij is geopend, zonder de link zelf te tonen.
- De link verloopt vanzelf, standaard na een jaar. De club zet die termijn zelf bij Instellingen, onder Links naar buiten. Daarna zegt de pagina dat met een woord.
- Conceptfacturen en vervallen voorstellen ziet de sponsor niet. Die zijn nog van de club.
- Wat de sponsor schrijft, is begrensd: tien wijzigingen per uur per adres en dertig per uur per link. Berichten mogen ook maximaal tien per dag per link. Een sponsor kan maximaal tien actieve en vijfentwintig contactpersonen hebben in totaal.
Nog niet in het portaal: de pdf van het getekende contract en van de factuur, en betalen. Dat staat als open punt in het werkdossier.
Je bestaande sponsorbestand overnemen
Open Sponsoring en klap Sponsors uit Excel overnemen open. Kies je Excelbestand en druk op Bestand lezen. Gebruik de tabbladnamen uit het voorbeeld: Sponsors, Contactpersonen en Contracten. Pakketten, Tegenprestaties en Facturen kun je toevoegen als je die gegevens ook wilt meenemen. Het bestand mag maximaal 5 MB groot zijn.
De app herkent de kolomkoppen uit het voorbeeld, met of zonder sterretje. Een andere kop kun je aan het juiste veld koppelen. Controleer daarna met Wijzigingen bekijken wat wordt toegevoegd of veranderd. Klap een regel open voor de oude en nieuwe waarden. Let op: een lege cel kan een bestaande waarde leegmaken. Kijk dus ook naar de lege velden. Onbekende kolommen worden gemeld en niet verwerkt. Een ontbrekende verplichte waarde, een dubbele code of een niet gevonden verwijzing moet je eerst in het bestand herstellen.
De sponsorcode verbindt de tabbladen. Bestaande sponsors worden gezocht op hun importcode,
daarna op KvK-nummer en anders op naam. Contacten worden binnen een sponsor gevonden op
e-mailadres. Een herhaalde import maakt dezelfde gegevens niet nog eens aan. Bewaar de codes
ook als je later de bedrijfsnaam wijzigt. Zijn er meerdere vergelijkbare tegenprestaties, gebruik
dan zo nodig een extra kolom tegenprestatie_code om ze uit elkaar te houden.
Controleer bij contracten de start, het einde en het bedrag. Een contract met de status getekend heeft ook een tekendatum nodig. Zonder die datum neemt de app het volgens de invoerafspraak over als aangeboden en toont zij een waarschuwing. Een bestaande getekende afspraak kun je via de import niet herschrijven. Het oorspronkelijke getekende document haalt de app niet uit Excel. Voeg dat apart aan het dossier toe.
Historische facturen vragen extra aandacht. Je hebt hiervoor ook facturatierecht nodig. Vul bij
gedeeltelijk betaald de extra kolom betaald_bedrag en de betaaldatum in. De app schat geen
ontbrekende betaling. Bedrag exclusief btw plus btw moet gelijk zijn aan het totaal. Laat het
factuurnummer eindigen op het oorspronkelijke volgnummer. Nieuwe facturen krijgen daarna een
hoger nummer binnen dat jaar. De import neemt bedragen en betalingen over, geen oorspronkelijke
factuur-pdf of specificatie. De app verstuurt deze facturen niet opnieuw. Bestaande financiële
historie blijft ongewijzigd.
Kies na de controle Bestand overnemen en bevestig de getoonde wijzigingen. Alles wordt samen verwerkt. Is er een fout, dan gaat de hele import niet door. Heeft iemand intussen iets veranderd, bekijk dan opnieuw de verschillen. Is de verbinding onderbroken, dan kun je het bestand opnieuw controleren. Identieke regels worden niet dubbel aangemaakt.
De kolommen ontvangt_factuur en tekent_contract geven aan welk contact de voorkeur heeft
voor respectievelijk de factuur en de ondertekening. Zonder voorkeur gebruikt de app het eerste
actieve contact met een e-mailadres. Zijn er meerdere voorkeurscontacten, dan wordt het eerst
toegevoegde gebruikt. De import stuurt zelf geen mail.
Voor wie eraan bouwt
- Migratie
20260908180000_module_d_sponsoring.sql:sponsor,sponsorcontact,sponsorpakket,sponsorcontractentegenprestatie. Contracten hebben audit, want ze zijn financieel. - Migratie
20260920120000_sponsorportaal.sql(sponsorportaal): één anonieme leesfunctiesponsor_portaal_openenmet geneste jsonb en vier schrijffuncties (contact bijwerken of toevoegen, contact op inactief, interesse, bericht). Alle vijf staan met naam in policytest 19 en zijn bewezen in test 65. De scopesponsor, het maakrecht en de onderwerpcontrole stonden al in de publieke schil (ADR 46). De leesfunctie leest in één security-definer-functie ookfactuurensigning_documentvan andere modules. Dat is een bewuste uitzondering, want ADR 46 wil één functie per doel met één tokencontrole en geen tweede anonieme deur per module. Elke schrijfactie legt een gebeurtenissponsoring.portaal_contactmet het link-id vast. Zo is een wijziging metdoor = nullin de audit toch tot een deur te herleiden. - Zachte verwijdering: kolom
sponsorcontact.actief, een audittrigger, en de schrijfpolicy gesplitst in toevoegen, bijwerken en verwijderen (alleen beheerder, alleen inactief).app.bericht_verzenden(communicatie) slaat inactieve contactpersonen over. - ADR 66: een aangeboden contract volgt zijn document via een trigger op
signing_document. De trigger eist soort sponsorcontract, ongewijzigd onderwerp en complete handtekeningen. De policy opsigning_documentverbiedt een rechtstreekse update naar getekend. De cron-afhandelaardocumentGetekendis daarmee vervallen. - Het scherm staat in
src/app/(publiek)/sponsor/[token]/. De vormen staan inmodel.ts, want een waarde-import uitindex.tsof@/kern/linksleept de serverclient de browser in. - Seed
94b-sponsorportaal.sqlzet een portaallink met een leesbaar token voor de rooktest.scripts/club-vullen.mjsslaat dat bestand over, zodat het token nooit op een server komt. De Caddyfile maskeert tokens in publieke paden in het accesslog (/sponsor/<token>). - Twee rechtenfuncties dragen de module.
app.mag_sponsoring(org)is de bedragenregel.app.mag_tegenprestatie(rij)is ruimer en laat de uitvoerende commissie erbij. Optegenprestatiestaan daarom aparte policies voor lezen, toevoegen, wijzigen en verwijderen: afvinken mag de uitvoerder, toevoegen alleen de sponsorcommissie. - Het scherm vraagt met
mag_sponsoringof het het contractdeel moet tonen. Het telt daarvoor geen rijen, want dat is een gok en een lege lijst zegt niets over rechten. app.tegenprestaties_klaarzetten(contract, seizoen)zet de tegenprestaties uit het pakket klaar en is idempotent op contract, seizoen en soort.- Een check op de tabel dwingt af dat “getekend” een document of een reden heeft. Het scherm vraagt de reden, maar de tabel is de plek waar het echt vastligt.
- Leveringen (ADR 88): een gecontroleerde schrijfroute vergelijkt de getoonde versie en legt wijzigingen vast in het auditspoor. Directe updates vanuit een ingelogde client zijn gesloten. Het interne leveringsoverzicht geeft de uitvoerder alleen de benodigde leveringsvelden en de sponsornaam, geen contractbedragen of contactgegevens.
- Het werkdossier van het sponsorportaal staat in
docs/werkplannen/sponsorportaal.md. - Nog niet gebouwd uit module D: ondertekenen met een akkoordlink (ADR 30), de CSV-import uit
Sponsit, de logofeed voor de website en de vergelijking met
team-sponsorsuit Sportlink. Die staan in het functioneel ontwerp §7.
De sponsorlijst doorzoeken en exporteren
Zoek boven de lijst op een zichtbare waarde, bijvoorbeeld de sponsornaam, de fase of de volgende actie. Met Sorteer op verander je de volgorde. De export neemt de ingeladen, zichtbare rijen mee. Heb je een selectie gemaakt, dan neemt de export alleen de gekozen zichtbare rijen mee. Contactgegevens die niet als kolom in deze lijst staan, komen niet in het bestand.