Skip to content

Datamodellen

Entity-Relationship Diagram

Het systeem telt 11 collecties. De users-collectie is de centrale entiteit waaraan de meeste andere collecties via een relatie-veld zijn gekoppeld. products en news staan zelfstandig en bevatten geen relaties naar andere collecties.

users text name select role number skillLevel date memberSince file avatar trainings text name date date text startTime text endTime text court number capacity select level relation trainer bool isRecurring training_enrollments relation training relation user date enrolledAt events text name date date text startTime text endTime text location select type number price number capacity event_enrollments relation event relation user reservations relation user date date select court text startTime select duration select status text notes invoices relation user text number text name number amount select status select type date dueDate date paidAt gallery_photos file image text label relation uploadedBy trainer_availability relation trainer select weekday json timeSlots products text name number price file image select category number stock news text title text body select category date publishedAt user FK user FK uploadedBy FK trainer FK user FK user FK training FK trainer FK event FK

Cascade-verwijderingen

Cascade-verwijderingen zijn selectief gedefinieerd:

  • training_enrollments.training — cascade bij verwijdering van een training
  • event_enrollments.event — cascade bij verwijdering van een evenement
  • trainer_availability.trainer — cascade bij verwijdering van een gebruiker

Collectie: users

Auth-collectie voor alle gebruikers. Beheert authenticatie en profielgegevens.

Veld Type Verplicht Beschrijving Beperkingen
name text Volledige naam min 2, max 100
role select Gebruikersrol bepaalt toegang en tabbladen lid | trainer | eigenaar
skillLevel number Speelsterkte op schaal 1–5 min 1, max 5
memberSince date Datum waarop het lidmaatschap is ingegaan
avatar file Profielfoto max 5 MB · JPEG / PNG / HEIC
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create (open — alleen via PocketBase Admin UI)
update @request.auth.id = id
delete null (uitgeschakeld via API)

Collectie: trainings

Trainingen aangemaakt door trainers of de eigenaar. Leden kunnen zich inschrijven.

Veld Type Verplicht Beschrijving Beperkingen
name text Naam van de training
description text Uitgebreide beschrijving
date date Datum van de training
startTime text Starttijd als HH:MM string
endTime text Eindtijd als HH:MM string
court text Baanidentificatie (bv. baan1)
capacity number Maximum aantal deelnemers min 1
level select Niveau van de training beginner | intermediate | advanced | kids | competition
trainer relation Verantwoordelijke trainer → users (max 1)
isRecurring bool Geeft aan of de training wekelijks terugkeert
recurringDay select Weekdag voor terugkerende trainingen MA | DI | WO | DO | VR | ZA | ZO
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.role = 'trainer' || @request.auth.role = 'eigenaar'
update @request.auth.role = 'trainer' || @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Collectie: training_enrollments

Koppeltabel tussen leden en trainingen. Unieke index voorkomt dubbele inschrijvingen.

Veld Type Verplicht Beschrijving Beperkingen
training relation Verwijzing naar de training → trainings · cascade delete
user relation Ingeschreven gebruiker → users
enrolledAt date Tijdstip van inschrijving (server default)

Indexen: UNIQUE (training, user) — voorkomt dubbele inschrijving

Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.id != ''
update @request.auth.id = user.id || @request.auth.role = 'eigenaar'
delete @request.auth.id = user.id || @request.auth.role = 'eigenaar'

Collectie: events

Clubevenementen zoals toernooien, klinieken en wedstrijden. Enkel door eigenaar beheerd.

Veld Type Verplicht Beschrijving Beperkingen
name text Naam van het evenement
description text Uitgebreide beschrijving
date date Datum van het evenement
startTime text Starttijd als HH:MM string
endTime text Eindtijd als HH:MM string
location text Locatie of adres
type select Type evenement tournament | clinic | competition | other
banner text URL of bestandsreferentie voor bannerafbeelding
price number Deelnameprijs in euro min 0
capacity number Maximum aantal deelnemers min 0
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.role = 'eigenaar'
update @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Collectie: event_enrollments

Koppeltabel tussen leden en evenementen. Unieke index voorkomt dubbele aanmeldingen.

Veld Type Verplicht Beschrijving Beperkingen
event relation Verwijzing naar het evenement → events · cascade delete
user relation Aangemelde gebruiker → users

Indexen: UNIQUE (event, user) — voorkomt dubbele aanmelding

Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.id != ''
update (niet van toepassing)
delete @request.auth.id = user.id || @request.auth.role = 'eigenaar'

Collectie: reservations

Baanreserveringen door leden. Status loopt van pending → confirmed of cancelled.

Veld Type Verplicht Beschrijving Beperkingen
user relation Lid dat de baan reserveert → users
date date Datum van de reservering
court select Gereserveerde baan baan1 | baan2 | baan3
startTime text Starttijd als HH:MM string
duration select Duur van de reservering in minuten 60 | 90
status select Status van de reservering pending | confirmed | cancelled
notes text Optionele notitie van het lid
Toegangsregels
RegelExpressie
list @request.auth.id = user.id || @request.auth.role = 'eigenaar'
view @request.auth.id = user.id || @request.auth.role = 'eigenaar'
create @request.auth.id != ''
update @request.auth.id = user.id || @request.auth.role = 'eigenaar'
delete @request.auth.id = user.id || @request.auth.role = 'eigenaar'

Collectie: products

Winkelartikelen zoals rackets, kleding en accessoires. Beheerd door de eigenaar.

Veld Type Verplicht Beschrijving Beperkingen
name text Productnaam
price number Prijs in euro min 0
image file Productafbeelding max 5 MB · JPEG / PNG / WebP
emoji text Emoji als visuele indicator (valt terug op als er geen afbeelding is)
category select Productcategorie racket | clothing | accessories | other
stock number Huidige voorraad min 0
description text Productomschrijving
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.role = 'eigenaar'
update @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Collectie: invoices

Facturen gekoppeld aan een lid. Enkel aangemaakt en beheerd door de eigenaar.

Veld Type Verplicht Beschrijving Beperkingen
user relation Lid waaraan de factuur toebehoort → users
number text Mensleesbaar factuurnummer (bv. INV-2025-042)
name text Omschrijving van de factuur (bv. Maandelijkse contributie)
description text Uitgebreide toelichting
amount number Factuurbedrag in euro min 0
status select Betalingsstatus open | paid | overdue
type select Factuurtype voor categorisering training | membership | shop | trip | other
dueDate date Uiterste betaaldatum
paidAt date Datum waarop betaling is ontvangen (ingevuld bij overgang naar paid)
Toegangsregels
RegelExpressie
list @request.auth.id = user.id || @request.auth.role = 'eigenaar'
view @request.auth.id = user.id || @request.auth.role = 'eigenaar'
create @request.auth.role = 'eigenaar'
update @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Clubfoto's geüpload door de eigenaar. Alle leden hebben leestoegang.

Veld Type Verplicht Beschrijving Beperkingen
image file Foto max 10 MB · JPEG / PNG / HEIC / WebP
label text Bijschrift bij de foto
uploadedBy relation Uploader (eigenaar) → users
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.role = 'eigenaar'
update @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Collectie: news

Clubnieuws en aankondigingen. Zichtbaar op het Home-scherm van alle leden.

Veld Type Verplicht Beschrijving Beperkingen
title text Kop van het nieuwsbericht
body text Volledige inhoud van het bericht
emoji text Emoji als visuele indicator
category select Categorie voor filtering news | event | announcement
publishedAt date Publicatiedatum (gebruikt voor sortering op -publishedAt)
Toegangsregels
RegelExpressie
list @request.auth.id != ''
view @request.auth.id != ''
create @request.auth.role = 'eigenaar'
update @request.auth.role = 'eigenaar'
delete @request.auth.role = 'eigenaar'

Collectie: trainer_availability

Wekelijkse beschikbaarheid per trainer. Één record per trainer per weekdag (upsert-patroon).

Veld Type Verplicht Beschrijving Beperkingen
trainer relation De trainer waaraan de beschikbaarheid toebehoort → users · cascade delete
weekday select Dag van de week MA | DI | WO | DO | VR | ZA | ZO
timeSlots json Array van tijdvakstrings (bv. ["09:00","09:30","10:00"])

Indexen: UNIQUE (trainer, weekday) — één record per trainer per dag

Toegangsregels
RegelExpressie
list @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
view @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
create @request.auth.role = 'trainer' || @request.auth.role = 'eigenaar'
update @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'
delete @request.auth.id = trainer.id || @request.auth.role = 'eigenaar'