Campus am See
Hier siehst du das System, das wir für Campus am See bauen. Du schaust gerade auf das Datenmodell, mit dem wir den gesamten Lebenszyklus der Coaching-Ausbildungen abbilden.
Ziel
Vollständige Vermarktungs- und Betriebsplattform für Campus am See, ein Unternehmen für Coaching-Ausbildungen. Das System bildet den gesamten Lebenszyklus ab: von der Vermarktung über die Buchung und Durchführung bis zur Zertifizierung und Abrechnung.
Scope
- B2B: Unternehmen buchen Ausbildungsplätze für ihre Mitarbeiter
- Kein B2C, keine Privatpersonen als Endkunden
- Rechnungsempfänger ist die Firma, Teilnehmer ist der Mitarbeiter
- Bezahlung per monatlichem Abonnement via PayPal
- Rechnung per E-Mail und zum Download im Profil
Prämissen
- Jede Ausbildung besteht aus Modulen
- Module werden in konkreten Kurs-Durchführungen an Terminen unterrichtet
- Teilnehmer melden sich für eine Durchführung an und buchen sich in Termine ein
- Dozent führt Anwesenheitsliste und bestätigt Modul-Abschluss
- Wenn alle Module einer Ausbildung abgeschlossen sind, wird das Zertifikat ausgestellt
- Anmeldung am System per Magic-Code (kein Passwort)
- Rollenbasiertes Berechtigungskonzept (Admin, Dozent, Teilnehmer, Firmen-Admin)
- Alle Änderungen werden im Audit-Log protokolliert
- DSGVO-konform mit Datenschutzerklärung und DSGVO-Report
Produkte
- Coaching Ausbildung
- Team Coaching Ausbildung
- Change Management Ausbildung
- Leadership Ausbildung
- E-Books (ergänzend)
Externe Systeme
- PayPal: Zahlungsabwicklung
- Lexoffice: Buchhaltung und Rechnungswesen
Datenmodell
betrieb
-
Anmeldung
teilnehmer(referenz, pflicht → Teilnehmer)durchfuehrung(referenz, pflicht → Kurs-Durchführungen)anmeldedatum(datum, pflicht)status(auswahl, pflicht) angemeldet/bestaetigt/storniert
-
Anwesenheit
teilnehmer(referenz, pflicht → Teilnehmer)termin(referenz, pflicht → Termine)anwesend(boolean, pflicht) Dozent hakt abbemerkung(text)
-
Catering
termin(referenz, pflicht → Termine)beschreibung(text)kosten(zahl) EUR
-
Dokumente
bezeichnung(text, pflicht)typ(auswahl, pflicht) vertrag/lehrplan/teilnahmebedingungen/sonstigesdatei(text, pflicht) Pfad/URLbezug_entitaet(referenz) Polymorphe Referenz: zeigt auf eine beliebige Entitaet (Rechnung, Zertifikat, Firma, Teilnahmebestaetigung etc.). Der Diskriminator ist das Feld typ der gleichen Zeile (vertrag/lehrplan/teilnahmebedingungen/sonstiges). referenz_id bleibt NULL, der Bezug wird zur Laufzeit ueber typ und eine ID in der Applikation aufgeloest.
-
Dozenten-Honorar
dozent(referenz, pflicht → Dozenten)termin(referenz → Termine)betrag(zahl, pflicht) EURbezahlt(boolean, pflicht)datum(datum)
-
Modul-Fortschritt
teilnehmer(referenz, pflicht → Teilnehmer)modul(referenz, pflicht → Module / Einheiten)abgeschlossen(boolean, pflicht)datum(datum) Bestaetigungsdatum durch Dozent. Setzt Pflicht zusammen mit abgeschlossen=true auf Applikationsebene.bestaetigt_durch(referenz → Dozenten) Dozent, der den Modul-Abschluss bestaetigt hat. Im Schema optional, auf Applikationsebene Pflicht wenn abgeschlossen=true.leistungsdatum(datum) Datum, an dem der Teilnehmer das Modul absolviert hat (Unterrichtstermin). Kann vor dem Bestaetigungsdatum liegen.
-
Raum-Reinigung
raum(referenz, pflicht → Räume)datum(datum, pflicht)erledigt(boolean, pflicht)
-
Räume
bezeichnung(text, pflicht)standort(referenz, pflicht → Standorte)kapazitaet(zahl, pflicht) Max Personenausstattung(text) Beamer, Whiteboard etc.
-
Standorte
bezeichnung(text, pflicht)strasse(text, pflicht)plz(text, pflicht)ort(text, pflicht)aktiv(boolean, pflicht)
-
Teilnahmebestätigung
teilnehmer(referenz, pflicht → Teilnehmer)durchfuehrung(referenz, pflicht → Kurs-Durchführungen)datei(text)versendet(boolean, pflicht)
-
Termine
durchfuehrung(referenz, pflicht → Kurs-Durchführungen) Gehoert zu welcher Kurs-Durchfuehrungmodul(referenz → Module / Einheiten) Welches Modul wird behandeltdatum(datum, pflicht)uhrzeit_von(text, pflicht)uhrzeit_bis(text, pflicht)raum(referenz, pflicht → Räume)dozent(referenz, pflicht → Dozenten)
-
Verfügbarkeitsmanagement
dozent(referenz, pflicht → Dozenten)datum(datum, pflicht)verfuegbar(boolean, pflicht)bemerkung(text)
-
Versicherungen
bezeichnung(text, pflicht)versicherer(text, pflicht)police_nr(text)gueltig_bis(datum)kosten_jaehrlich(zahl) EUR
-
Warteliste
teilnehmer(referenz, pflicht → Teilnehmer)durchfuehrung(referenz, pflicht → Kurs-Durchführungen)datum(datum, pflicht) Wann auf Warteliste gesetztposition(zahl)
-
Zertifikate
teilnehmer(referenz, pflicht → Teilnehmer)produkt(referenz, pflicht → Produkt) Welche Ausbildungausstellungsdatum(datum, pflicht)datei(text) PDF-Pfadversendet(boolean, pflicht) Per Mail zugestelltzertifikat_nr(text, pflicht) Fortlaufende eindeutige Nummer, z.B. CAS-2026-000123. Systemweit unique, wird von Aussen zur Verifikation genutzt.buchung(referenz, pflicht → Buchungen) Buchung mit bezahlter Grundlage fuer das Zertifikat. Revisionssicher verknuepft mit Rechnung und Teilnehmer.ausgestellt_durch(referenz, pflicht → Mensch) Mensch, der das Zertifikat ausgestellt hat (Admin oder leitender Dozent). Fuer Audit und Unterschrift.verifikations_hash(text) SHA-256 Hash der PDF-Datei, gesetzt sobald datei gefuellt ist. Erlaubt Faelschungserkennung ueber /zertifikat/verify/<zertifikat_nr>.status(auswahl, pflicht) gueltig, widerrufen. Widerruf wird zusaetzlich im Audit-Log dokumentiert.widerruf_grund(text) Begruendung bei status=widerrufen. Pflicht auf Applikationsebene, wenn status gleich widerrufen.
controlling
-
Auslastung
-
Deckungsbeitrag pro Produkt
-
Forecast / Pipeline
-
Teilnehmer-Zahlen / Abbruchquoten
-
Umsatz / Einnahmen
-
Zahlungsausfälle
extern
-
Lexoffice
-
PayPal
finanzen
-
Abonnement-Management
-
Abonnement-Zahlungen
buchung(referenz, pflicht → Buchungen)betrag(zahl, pflicht) EURfaellig_am(datum, pflicht)bezahlt(boolean, pflicht)zahlungsart(auswahl, pflicht) paypal/ueberweisung
-
Buchungen
teilnehmer(referenz, pflicht → Teilnehmer)durchfuehrung(referenz, pflicht → Kurs-Durchführungen)firma(referenz, pflicht → Unternehmen / Firmen) Rechnungsempfaengerbuchungsdatum(datum, pflicht)status(auswahl, pflicht) aktiv/storniert/abgeschlossen
-
Einmalige Zahlung
-
Mahnwesen
rechnung(referenz, pflicht → Rechnungen)mahnstufe(zahl, pflicht) 1, 2, 3datum(datum, pflicht)versendet(boolean, pflicht)
-
Rabatte / Gutscheine
code(text, pflicht)typ(auswahl, pflicht) prozent/absolutwert(zahl, pflicht) Prozent oder EURgueltig_bis(datum)eingeloest(boolean, pflicht)
-
Rechnungen
buchung(referenz, pflicht → Buchungen)firma(referenz, pflicht → Unternehmen / Firmen) Rechnungsempfaengerrechnungsnummer(text, pflicht)betrag_netto(zahl, pflicht) EURust_satz(zahl, pflicht) Prozentbetrag_brutto(zahl, pflicht) EURfaellig_am(datum, pflicht)bezahlt(boolean, pflicht)datei(text) PDFversendet(boolean, pflicht) Per Mail zugestellt
-
Stornierung / Erstattung
buchung(referenz, pflicht → Buchungen)grund(text, pflicht)erstattungsbetrag(zahl) EURdatum(datum, pflicht)erstattet(boolean, pflicht)
-
UST-Differenzierung
inhalt
-
Wissens-Webseiten
kommunikation
-
Benachrichtigungen
benutzer(referenz, pflicht → Teilnehmer) An wentitel(text, pflicht)inhalt(text)gelesen(boolean, pflicht)datum(datum, pflicht)
-
Chat-System
name(text, pflicht) Kanalnamedurchfuehrung(referenz → Kurs-Durchführungen) Optional: gehoert zu Kurstyp(auswahl, pflicht) kurs/allgemein/dozenten
-
E-Mail-Versand
empfaenger(text, pflicht) E-Mail-Adressebetreff(text, pflicht)typ(auswahl, pflicht) rechnung/zertifikat/bestaetigung/mahnung/benachrichtigungversendet(boolean, pflicht)datum(datum, pflicht)
-
Feedback-System
teilnehmer(referenz → Teilnehmer)bezug_entitaet(text, pflicht) Polymorphe Referenz: zeigt auf eine beliebige Entitaet (Rechnung, Zertifikat, Firma, Teilnahmebestaetigung etc.). Der Diskriminator ist das Feld typ der gleichen Zeile (vertrag/lehrplan/teilnahmebedingungen/sonstiges). referenz_id bleibt NULL, der Bezug wird zur Laufzeit ueber typ und eine ID in der Applikation aufgeloest.bewertung(zahl) 1-5kommentar(text)datum(datum, pflicht)
-
Video-Hosting
-
Video-Konferenz-System
marketing
-
CRM
firma(referenz → Unternehmen / Firmen)ansprechpartner(referenz → Ansprechpartner (Firma))status(auswahl, pflicht) lead/kontakt/kunde/inaktivletzte_interaktion(datum)notiz(text)
-
Newsletter
betreff(text, pflicht)inhalt(text, pflicht)versanddatum(datum)empfaenger_anzahl(zahl)versendet(boolean, pflicht)
-
Werbemittel
bezeichnung(text, pflicht)typ(auswahl, pflicht) flyer/banner/video/pdfdatei(text)
person
-
Ansprechpartner (Firma)
firma(referenz, pflicht → Unternehmen / Firmen)funktion(text) Funktion in der Firma (Projekteinkauf, HR, Geschaeftsfuehrung etc.)mensch(referenz, pflicht → Mensch) Identitaet der Person, rollenunabhaengige Stammdaten (Ansprechpartner (Firma))
-
Bedarfsgruppen
bezeichnung(text, pflicht) z.B. HR-Manager, Fuehrungskraeftebeschreibung(text)
-
Dozenten
honorar_stunde(zahl) EUR pro Stundeaktiv(boolean, pflicht)mensch(referenz, pflicht → Mensch) Identitaet der Person, rollenunabhaengige Stammdaten (Dozenten)
-
Firmen-Account
-
Mensch
Identitaet einer natuerlichen Person. Rollenunabhaengige Stammdaten. Eine Person kann gleichzeitig Teilnehmer, Dozent, Admin oder Ansprechpartner sein, indem sie in den jeweiligen Rollen-Entitaeten referenziert wird.
vorname(text, pflicht) Vornamenachname(text, pflicht) Nachnameemail(text, pflicht) Eindeutige E-Mail, Anker fuer Magic-Code Login und Benutzer-Profil, systemweit uniquetelefon(text) Telefonnummeraktiv(boolean, pflicht) Konto-Status, false sperrt alle Rollen dieser Person
-
Teilnehmer
firma(referenz, pflicht → Unternehmen / Firmen) Arbeitgeberaktiv(boolean, pflicht)mensch(referenz, pflicht → Mensch) Identitaet der Person, rollenunabhaengige Stammdaten (Teilnehmer)
-
Teilnehmer-Listen
-
Unternehmen / Firmen
firmenname(text, pflicht)strasse(text, pflicht)plz(text, pflicht)ort(text, pflicht)land(text, pflicht)ust_id(text) USt-IdNr fuer B2B-Rechnungenaktiv(boolean, pflicht)
produkt
-
Kurs-Durchführungen
produkt(referenz, pflicht → Produkt) Welche Ausbildungbezeichnung(text, pflicht) z.B. Coaching Ausbildung Herbst 2026startdatum(datum, pflicht)enddatum(datum, pflicht)standort(referenz, pflicht → Standorte) Wo findet es stattstatus(auswahl, pflicht) geplant/aktiv/abgeschlossen/abgesagt
-
Module / Einheiten
bezeichnung(text, pflicht)produkt(referenz, pflicht → Produkt) Gehoert zu welcher Ausbildungreihenfolge(zahl, pflicht) Sortierung innerhalb der Ausbildungbeschreibung(text)
-
Produkt
Verkaufbares Angebot. Diskriminatoren produkt_typ (coaching, team_coaching, change_management, leadership, ebook) und abrechnungsmodell (monatsabo, einmalkauf). Ersetzt die frueher getrennten Ausbildungs-Entitaeten und Ebooks.
bezeichnung(text, pflicht) Verkaufs-Name, z.B. Coaching Ausbildungprodukt_typ(auswahl, pflicht) coaching, team_coaching, change_management, leadership, ebookabrechnungsmodell(auswahl, pflicht) monatsabo, einmalkaufpreis(zahl, pflicht) EUR pro Monat bei monatsabo, EUR pro Kauf bei einmalkaufdauer_monate(zahl) Nur bei monatsabo: Mindestlaufzeit in Monatenbeschreibung(text) Inhaltliche Beschreibung fuer Marketing und Teilnehmer-Profilaktiv(boolean, pflicht) Im Shop buchbar
recht
-
Datenschutz
-
DSGVO
-
DSGVO-Report
-
Impressum
-
Recht
system
-
Anmelde-Seite
-
Audit-Log / Transaktions-Log
benutzer(referenz → Benutzer-Profil) Wer hat die Aktion ausgefuehrtentitaet(text, pflicht) Welche Entitaet betroffendatensatz_id(zahl) ID des betroffenen Datensatzesaktion(auswahl, pflicht) erstellt/geaendert/geloescht/angemeldet/abgemeldetdetails(text) Was genau geaendert wurdezeitpunkt(datum, pflicht)
-
Benutzer-Einstellungen
profil(referenz, pflicht → Benutzer-Profil)sprache(auswahl) de/enbenachrichtigungen_email(boolean, pflicht)benachrichtigungen_chat(boolean, pflicht)
-
Benutzer-Profil
strasse(text)plz(text)ort(text)profilbild(text) Pfadrolle(referenz → Rollen- und Berechtigungskonzept)mensch(referenz, pflicht → Mensch) Identitaet der Person, rollenunabhaengige Stammdaten (Benutzer-Profil)
-
Downloads (Profil)
profil(referenz, pflicht → Benutzer-Profil)typ(auswahl, pflicht) rechnung/zertifikat/teilnahmebestaetigung/ebookbezeichnung(text, pflicht)datei(text, pflicht) Pfaddatum(datum, pflicht)
-
Historie
entitaet(text, pflicht)datensatz_id(zahl, pflicht)feld(text, pflicht) Welches Feld geaendertalter_wert(text)neuer_wert(text)zeitpunkt(datum, pflicht)benutzer(referenz → Benutzer-Profil)
-
Lokales KI-RAG-LLM-System
-
Magic-Code Login System
email(text, pflicht)code(text, pflicht) Einmaliger Login-Codegueltig_bis(datum, pflicht)eingeloest(boolean, pflicht)
-
Prozess
Formale Ablaufbeschreibung nach DIN EN ISO 9001 und BPMN 2.0. Einzelprozess mit klarem Ausloeser, Ziel und Ergebnis.
name(text, pflicht) Eindeutiger Prozess-Name, z.B. B2B-Angebotziel(text, pflicht) Fachliches Ziel in einem Satzausloeser(text, pflicht) Ereignis, das den Prozess startetergebnis(text, pflicht) Endzustand nach erfolgreichem Durchlaufeigentuemer(referenz → Mensch) Mensch, der Process Owner ist, optionalbeschreibung(text) Ausfuehrliche Beschreibung, Kontext, Rahmenbedingungenaktiv(boolean, pflicht) true wenn der Prozess aktuell gepflegt und gelebt wirdtrigger_typ(auswahl) event/gate/manuell/cron: formalisierter Trigger-Mechanismus.trigger_event(text) Event-Name bei trigger_typ=event, z.B. webhook.paypal.payment.completed.trigger_cron(text) Cron-Expression bei trigger_typ=cron, z.B. 0 3 * * 1 fuer Montag 3 Uhr.
-
Prozess-Input
Entitaet, die ein Prozessschritt liest oder benoetigt.
prozessschritt(referenz, pflicht → Prozessschritt) Referenziert Prozessschrittentitaet(referenz, pflicht) Referenzierte Entitaet, polymorph ueber Meta-Modellpflicht(boolean, pflicht) true wenn der Input zwingend vorliegen muss
-
Prozess-Kontrolle
Entscheidungsstelle (XOR-Gate): Gate-Schritt verzweigt je nach Bedingung.
prozessschritt(referenz, pflicht → Prozessschritt) Gate-Schrittbedingung(text, pflicht) Fachliche Bedingung als Fragebei_ja(referenz → Prozessschritt) Naechster Schritt wenn Bedingung erfuelltbei_nein(referenz → Prozessschritt) Naechster Schritt wenn nicht erfuellt
-
Prozess-Output
Entitaet, die ein Prozessschritt erzeugt, aendert oder loescht.
prozessschritt(referenz, pflicht → Prozessschritt) Referenziert Prozessschrittentitaet(referenz, pflicht) Referenzierte Entitaet, polymorph ueber Meta-Modellaktion(auswahl, pflicht) erzeugt, geaendert, geloeschtpflicht(boolean, pflicht) true wenn der Output garantiert ist
-
Prozess-Rolle
RACI-Rolle eines Akteurs pro Prozessschritt.
prozessschritt(referenz, pflicht → Prozessschritt) Referenziert Prozessschrittrolle_label(text, pflicht) Rolle als Text: Admin, Teilnehmer, Dozent, System, PayPal, Lexofficeraci(auswahl, pflicht) responsible, accountable, consulted, informed
-
Prozessschritt
Atomare Aktion innerhalb eines Prozesses. Pro Schritt genau eine Verantwortlichkeit.
prozess(referenz, pflicht → Prozess) Zugehoeriger Prozessnummer(zahl, pflicht) Reihenfolge innerhalb des Prozesses, startet bei 1aktion(text, pflicht) Atomare Aktion, aktiv formuliertausfuehrer(text) Akteur: Teilnehmer, Admin, System, Lexoffice etc.dauer_erwartet(text) Erwartete Dauer, z.B. sofort, 1-3 Tagebeschreibung(text) Detaillierte Beschreibung des Schrittsnachfolger(referenz → Prozessschritt) Nachfolgender Schritt im linearen Flowbewertung_atomar(boolean) 1 wenn Schritt genau eine atomare Aktion ist, 0 bei verknuepften Aktionen (und/sowie).bewertung_srp(boolean) 1 wenn genau 1 responsible-RACI, 0 bei mehreren Verantwortlichen im gleichen Schritt.bewertung_soc(boolean) 1 wenn Input und Output nicht auf gleiche Entitaet zeigen, 0 bei Layer-Vermischung.bewertung_dry(boolean) 1 wenn aktion-Text unique ueber alle Prozesse, 0 bei Duplikaten.bewertung_kommentar(text) Automatischer Heuristik-Kommentar zur Bewertung.wartezeit_minuten(zahl) Wartezeit in Minuten nach Abschluss des Vorgaengers. 0 = sofort.
-
Rollen- und Berechtigungskonzept
bezeichnung(text, pflicht) z.B. admin/dozent/teilnehmer/firmen-adminentitaet(referenz) Polymorphe Referenz: gibt an, auf welche Entitaet sich eine Rolle-Berechtigung bezieht (z.B. Zertifikate, Teilnehmer, Rechnungen). referenz_id bleibt NULL, weil die Zielentitaet dynamisch ist und auf Applikationsebene validiert wird.lesen(boolean, pflicht)schreiben(boolean, pflicht)loeschen(boolean, pflicht)beschreibung(text)
-
Security