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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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'
Collectie: gallery_photos
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 Regel Expressie 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 Regel Expressie 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 Regel Expressie 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'