Vergoedingen voor vrijwilligers en verenigingswerkers, van intake tot uitbetaling, in één gecontroleerd proces.Allowances for volunteers and association workers, from intake to payment, in one controlled process.

Interne webapplicatie voor een Belgische voetbalclub. Vervangt losse formulieren, mails en handmatig opgestelde betaalbestanden door één flow: goedkeuring per team, HR-validatie, SEPA-betaalbatches en een audit trail.

Internal web application for a Belgian football club. Replaces loose forms, e-mails and hand-made payment files with one flow: per-team approval, HR validation, SEPA payment batches and an audit trail.

  • Python
  • Flask
  • PostgreSQL
  • Docker
  • SEPA
  • Live

De applicatie in 20 secondenThe application in 20 seconds

Lotte PeetersSteward · wedstrijddag · 4,5 uSteward · match day · 4.5 h
€ 40,50

ControlesChecks

  • Persoon herkendPerson recognised 100 %
  • IBAN geldigvalid
  • Fiscale limietFiscal limit 62 % · € 2.418,50 / € 3.900,00
  • CombinatieverbodStatus conflict geen conflictnone
  • Nog aan te vullen vóór HRTo complete before HR adresaddress

GoedkeuringsketenApproval chain

  1. LeidinggevendeTeam leaderdoorby Yassin El Amrani · 25/08
  2. 2HR ValidatieJonas De Wilde
  3. 3GoedgekeurdApprovedklaar voor betalingready for payment
Afgewezen · LeidinggevendeRejected · Team leader Dagvergoeding over maximumDaily allowance over maximum

Welke stappen gelden, is instelling per team. Geen code.Which steps apply is a per-team setting. No code.

Betaalbatch 2026-08Payment batch 2026-08

NaamNameStatuutStatusNetto
Lotte PeetersVrijwilligerVolunteer€ 40,50
Sam VermeulenVerenigingswerkerAssociation worker€ 296,42
Nour HaddadVrijwilligerVolunteer€ 82,96
3 transacties3 transactions€ 419,88
SEPA-bestand aangemaaktSEPA file createdIngediend: enkel met reden terug te draaienSubmitted: reversible only with a reason

Fiscaal verbruik per persoonFiscal usage per person

Lotte Peeters vrijwilliger · jaarmaximumvolunteer · yearly maximum62 %
Sam Vermeulen verenigingswerker · kwartaalplafondassociation worker · quarterly ceiling84 %
Nour Haddad vrijwilliger · jaarmaximumvolunteer · yearly maximum103 % BLOK
Dimona ✓Fiche 281.27 klaarTax form 281.27 ready

Recente wijzigingenRecent changes

TijdTimeGebruikerUserActieActionWatWhat
14:02jonas@ · HRadvanceHR Validatie → Goedgekeurd
13:47yassin@ · LeidinggevendeTeam leaderapproveintake #412
13:20yassin@ · LeidinggevendeTeam leaderadvanceLeidinggevende → HR Validatie
09:15lotte@ · InvoerderEntrycreate∅ → {Lotte Peeters, 4,5 u}

    Nagebouwde fragmenten van de applicatie met verzonnen namen en bedragen.Re-created fragments of the application with invented names and amounts.

    Knelpunt en oplossingProblem and solution

    Een club werkt met tientallen vrijwilligers, stewards en verenigingswerkers. Elke prestatie moet geregistreerd, goedgekeurd en uitbetaald worden binnen wettelijke grenzen die per statuut verschillen.A club works with dozens of volunteers, stewards and association workers. Every activity has to be registered, approved and paid within legal limits that differ per status.

    Waar het kneldeWhere it hurt

    • Registratie via formulieren, mails en Excel, zonder vaste goedkeuringsrouteRegistration through forms, e-mails and Excel, with no fixed approval route
    • Dag-, jaar- en kwartaalmaxima manueel bewaakt; fouten pas zichtbaar bij de betaling of de fiscale ficheDaily, yearly and quarterly maxima tracked by hand; errors only surfaced at payment or on the tax form
    • Betaalbestanden met de hand opgesteldPayment files assembled by hand
    • Dimona-aangiftes en fiches 281.27 opnieuw overgetypt uit dezelfde gegevensDimona declarations and 281.27 tax forms retyped from the same data
    • Eén persoon overzag het geheel; geen spoor van wie wat wijzigdeOne person saw the whole picture; no trace of who changed what

    Hoe de applicatie dat oplostHow the application solves it

    • Eén intake voor alle prestaties, met een vaste goedkeuringsketen per teamOne intake for every activity, with a fixed approval chain per team
    • Wettelijke grenzen automatisch gecontroleerd vóór iemand goedkeurtLegal limits checked automatically before anyone approves
    • Eén SEPA-betaalbestand per maand, rechtstreeks naar de bankOne SEPA payment file per month, straight to the bank
    • Dimona en fiches 281.27 uit dezelfde gegevens, zonder overtypenDimona and 281.27 tax forms from the same data, no retyping
    • Meerdere mensen delen het overzicht; elke wijziging is traceerbaarSeveral people share the overview; every change is traceable

    Wat de applicatie doetWhat the application does

    • Intake via formulier, template of Excel-import, met herkenning van bestaande personenthrough form, template or Excel import, with recognition of existing persons
    • Goedkeuring in stappenStep-by-step approval door leidinggevende, directie en HR, instelbaar per teamby team leader, management and HR, configurable per team
    • Wettelijke grenzenLegal limits (jaar- en kwartaalplafonds, combinatieverbod, IBAN) afgedwongen vóór goedkeuring(yearly and quarterly ceilings, status conflicts, IBAN) enforced before approval
    • Betaalbatch per maandMonthly payment batch als SEPA-bestand; eenmaal ingediend enkel met reden terug te draaienas a SEPA file; once submitted, reversible only with a reason
    • Dimona en fiches 281.27and 281.27 tax forms uit dezelfde gegevensfrom the same data
    • Audit trail van elke wijziging: wie, wanneer, oud en nieuwof every change: who, when, old and new

    Hoe ze gebouwd isHow it was built

    Stack

    • Python · Flask · PostgreSQL
    • Docker, geautomatiseerde testsautomated tests
    • Gedocumenteerd en overdraagbaar zonder ontwikkelaarDocumented and transferable without a developer

    GDPR en toegangGDPR and access

    • Toegang per rol: ieder ziet enkel wat zijn taak vereistRole-based access: everyone sees only what their task requires
    • Persoonsgegevens zoals het rijksregisternummer enkel zichtbaar waar nodigPersonal data such as the national register number visible only where needed
    • Niets wordt gewist, wel gedeactiveerd; elke wijziging gelogdNothing is erased, only deactivated; every change logged
    • Enkel bereikbaar binnen het netwerk van de clubReachable only inside the club network

    OntwerpprincipesDesign principles

    Eén knooppunt voor alle controlesOne node for every check
    Elke goedkeuring, uit welk scherm of welke import ook, loopt door dezelfde functie. De IBAN-controle en de wettelijke maxima staan daar één keer, dus geen enkel pad kan ze omzeilen.Every approval, from whichever screen or import, passes through the same function. The IBAN check and the legal maxima live there once, so no path can bypass them.
    Configuratie boven codeConfiguration over code
    Een team krijgt een teamleider-stap door een team toe te kennen in gebruikersbeheer. Geen ontwikkelaar nodig als de organisatie verandert.A team gets a team-leader step by assigning a team in user management. No developer needed when the organisation changes.
    Onomkeerbaar waar het geld al weg isIrreversible once the money has left
    Een nog niet ingediende batch is volledig terug te draaien. Een ingediende batch niet: die vraagt een expliciete reden en bewaart het SEPA-bestand voor het dossier.A batch not yet submitted is fully reversible. A submitted one is not: it requires an explicit reason and keeps the SEPA file for the record.
    Testdata die het domein breektTest data that breaks the domain
    De ontwikkelset bevat bewust de randgevallen: plafonds op exact 100 %, buitenlandse IBAN's, namen met accenten, afrondingen op de cent.The development set deliberately contains the edge cases: ceilings at exactly 100 %, foreign IBANs, accented names, rounding to the cent.