Skip to content

Relaties & ERD

clients
β”œβ”€β”€ dogs (1:N β€” één klant heeft meerdere honden)
β”‚ └── vaccinations (1:N β€” één hond heeft meerdere vaccins)
β”‚ └── bundles (1:N β€” één hond heeft meerdere bundels)
β”‚ β”‚ └── bundle_usage (1:N β€” één bundel heeft meerdere gebruiksmomenten)
β”‚ β”‚ └── training_lessons (1:N β€” één bundel heeft meerdere lessen)
β”‚ └── room_assignments (1:N β€” één hond heeft meerdere kamertoewijzingen)
β”‚
β”œβ”€β”€ bookings (1:N β€” één klant heeft meerdere boekingen)
β”‚ └── booking_dogs (1:N β€” één boeking heeft meerdere honden)
β”‚ β”‚ β”œβ”€β”€ dogs (N:1)
β”‚ β”‚ β”œβ”€β”€ services (N:1)
β”‚ β”‚ └── bundle_usage (1:1 optioneel β€” indien strippenkaart)
β”‚ └── room_assignments (1:N β€” één boeking heeft meerdere kamertoewijzingen)
β”‚
└── subscriptions (1:N β€” één klant heeft meerdere abonnementen)
└── subscription_invoices (1:N)
rooms
└── room_assignments (1:N β€” één kamer heeft meerdere toewijzingen over tijd)
payments
β”œβ”€β”€ bookings (N:1 optioneel)
β”œβ”€β”€ bundles (N:1 optioneel)
└── subscription_invoices (N:1 optioneel)
dogs.client_id β†’ clients.id

Een klant kan meerdere honden hebben. Alle honden van één klant kunnen in één boeking worden opgenomen.

booking_dogs.booking_id β†’ bookings.id
booking_dogs.dog_id β†’ dogs.id
booking_dogs.service_id β†’ services.id

Een boeking bevat één of meer honden. Iedere hond in een boeking heeft een eigen dienst en prijs (snapshot op moment van boeking).

bundle_usage.bundle_id β†’ bundles.id
bundle_usage.booking_id β†’ bookings.id

Iedere keer dat een klant incheckt met een strippenkaart, wordt een bundle_usage record aangemaakt en de used_credits in bundles verhoogd.

subscription_invoices.subscription_id β†’ subscriptions.id

Per maand wordt automatisch een subscription_invoice aangemaakt door de cron job.

room_assignments.room_id β†’ rooms.id
room_assignments.booking_id β†’ bookings.id
room_assignments.dog_id β†’ dogs.id
room_assignments.assigned_by β†’ users.id

Bij check-in wordt een hond toegewezen aan een specifieke kamer. Het systeem houdt bij welke hond in welke kamer zit en tot wanneer. Dit maakt het mogelijk om kamerbezetting real-time te tonen op het dashboard.

Een betaling kan gekoppeld zijn aan:

  • Een reguliere boeking (booking_id)
  • Een bundel aankoop (bundle_id)
  • Een maandelijkse abonnementsfactuur (subscription_invoice_id)

Precies één van deze drie velden is ingevuld per betaling.

Iedere tabel heeft RLS policies zodat klanten alleen hun eigen data kunnen zien.

-- Voorbeeld: klant ziet alleen eigen honden
CREATE POLICY "Klant ziet eigen honden"
ON dogs FOR SELECT
USING (client_id = auth.uid());
-- Admin ziet alles
CREATE POLICY "Admin ziet alle honden"
ON dogs FOR SELECT
USING (
EXISTS (
SELECT 1 FROM users
WHERE users.id = auth.uid()
AND users.role IN ('admin', 'medewerker')
)
);