tomi791

SKILL: Dive and Travel Kursverwaltung

```

tomi791 0 Updated 1mo ago

Resources

7
GitHub

Install

npx skillscat add tomi791/diveandtravel-app

Install via the SkillsCat registry.

SKILL.md

SKILL: Dive and Travel Kursverwaltung

Beschreibung

Diese App ist ein Kursverwaltungssystem für Dive and Travel (Tauchschule SSI-DTC Freiburg).
Entwickelt mit Next.js 14 + Prisma + SQLite.
Produktionsserver: https://ssi-dtc.de (Hostinger Node.js Hosting)
Pfad: C:\Users\jselz\OneDrive - Kegler IT GmbH & Co. KG\Claude\Projekte Cowork\DTC\Kursverwaltung\tauchschule-app
Version: 2.7.2


Aktivierungs-Trigger

Aktiviere diese Skill wenn der Nutzer:

  • Fehler in der Tauchschule-App meldet (Build Error, Runtime Error, 500er)
  • Neue Features für die App haben möchte
  • Etwas an Schülern, Kursen, Terminen, Lehrern oder Einstellungen ändern will
  • Fragen zur Datenbankstruktur stellt
  • Die App neu aufsetzen / wiederherstellen will
  • Dateien der App lesen oder bearbeiten will

Tech-Stack & Schlüsselinfos

Framework:  Next.js 14 App Router
Sprache:    TypeScript  
ORM:        Prisma 5.22
Datenbank:  SQLite (prisma/dev.db)
Styling:    Tailwind CSS + custom ocean-Farben
Auth:       JWT (HTTP-only Cookie) + bcrypt + TOTP-MFA
Server:     npm run dev → localhost:3000

Projekt-Pfad & Datei-Konventionen

C:\Users\jselz\OneDrive - Kegler IT GmbH & Co. KG\Claude\Projekte Cowork\DTC\Kursverwaltung\tauchschule-app\
├── app/(dashboard)/dashboard/[modul]/page.tsx          # Server Components
├── app/(dashboard)/dashboard/[modul]/[id]/page.tsx
├── lib/actions.ts                                       # ALLE Server Actions (alle DB-Operationen)
├── lib/pdfReport.ts                                     # Kursbericht-PDF (inkl. Ausfahrten)
├── prisma/schema.prisma
├── prisma/dev.db                                        # SQLite Datenbank (lokal)
├── components/layout/Sidebar.tsx                        # Navigation (Client)
├── components/dashboard/SchuelerSucheSelect.tsx         # Suchbare Schüler-Auswahl (Client)
├── components/dashboard/DashboardWidgets.tsx            # Report/Video Buttons (Client)
├── lib/mailbox.ts                                       # IMAP-Helper (fetchInbox, fetchMailDetail)
└── lib/version.ts                                       # Aktuelle Version

WICHTIG - Datei schreiben:

  • PowerShell strips backticks → immer Node.js-Script für TSX-Dateien mit Template-Literalen verwenden
  • Schema-Änderungen lokal: Dev-Server stoppen → npx prisma db push --accept-data-loss → Server neu starten
  • Schema-Änderungen auf Hostinger (MySQL): NICHT prisma db push verwenden (hängt/timeout) → stattdessen direkt per MySQL-CLI: mysql -u u590503555_sa_dtc -p'PASSWORT' -h 127.0.0.1 u590503555_dtc_app -e "ALTER TABLE ..."
  • IMMER 127.0.0.1 statt localhost für MySQL auf Hostinger — localhost wird abgelehnt
  • Bracket-Verzeichnisse [id]: PowerShell Copy-Item statt direktem Schreiben verwenden
  • IMAP-Config gehört in .env (IMAP_HOST, IMAP_PORT), NICHT in die DB — .env überlebt Git-Push auf Hostinger
  • Datenbank liegt auf Hostinger — lokale prisma db push Ausführung ist nutzlos; Schema-Änderungen minimieren

Datenmodell (Kurzreferenz)

Tabelle Schlüsselfelder
User id, email, name, role (ADMIN/LEITUNG/LEHRER), passwordHash
Schueler id, vorname, nachname, email, telefon, geburtsdatum
Kurs id, name, kuerzel, typ, status, ssiLink?, lehrerId, farbe
KursZusatzLehrer kursId, userId, rolle — @@unique([kursId,userId])
Termin id, kursId, typ, startzeitpunkt, endzeit
TerminTeilnahme terminId, schuelerId, status (ANGEMELDET/ERSCHIENEN/ABGESAGT)
Anmeldung schuelerId, kursId, status — @@unique([schuelerId,kursId])
Kursfortschritt schuelerId, kursId, tauchgaenge, abgeschlossen
Zertifikat schuelerId, name, ausstellungsdatum, zertifikatNr
KursVorlage id, name, kuerzel, kategorie (29 SSI-Vorlagen)
AuditLog id, aktion, entitaet, entitaetId, details, userName
SystemConfig id="default", schoolName, smtpHost, twilioSid, ...

Wichtige URL-Routen

/dashboard                           → Übersicht
/dashboard/schueler                  → Schüler-Liste
/dashboard/schueler/[id]             → Schüler-Detail + Kurszuweisung
/dashboard/kurse                     → Kurs-Liste
/dashboard/kurse/neu                 → Neuer Kurs (mit Vorlagen-Dropdown)
/dashboard/kurse/[id]                → Kurs-Detail + Status + Lehrer
/dashboard/termine/[id]              → Termin + Teilnahme + Status setzen
/dashboard/kalender                  → Monat/Liste Ansicht
/dashboard/einstellungen/stammdaten  → SSI Kurs-Vorlagen
/dashboard/log                       → Audit-Log mit Filter

Server Actions (lib/actions.ts) — Wichtigste

// Auto-Fortschritt: ERSCHIENEN → tauchgaenge +1 für POOL/FREIWASSER/AUSFAHRT
updateTeilnahmeStatus(terminId, schuelerId, status)

// Kurs-Status + Audit-Log
updateKursStatus(kursId, status)  // GEPLANT|AKTIV|ABGESCHLOSSEN|ABGEBROCHEN

// Schüler ↔ Kurs
assignSchuelerToKurs(schuelerId, kursId)
removeSchuelerFromKurs(schuelerId, kursId)

// Mehrere Lehrer pro Kurs
addZusatzLehrer(kursId, userId, rolle)
removeZusatzLehrer(kursId, userId)

// Löschen
deleteKurs(kursId)
deleteSchueler(schuelerId)
deleteTermin(terminId)

Bekannte Fallstricke

  1. Backtick-Verlust: PowerShell Write-Host und Get-Content zeigen Backticks nicht an. Template-Literale in TSX immer via Node.js-Script schreiben.

  2. [id]-Verzeichnisse: PowerShell-Wildcards. cmd /c "type ..." zum Lesen, Copy-Item zum Schreiben.

  3. Prisma DB Push (lokal): Dev-Server muss gestoppt sein (DLL-Lock auf query_engine-windows.dll.node). Reihenfolge:

    Get-Process "node" | Stop-Process -Force
    npx prisma db push --accept-data-loss
    npm run dev
  4. Prisma DB Push (Hostinger/Produktion): Server hat kein Git. Schema via base64 hochladen, dann:

    /opt/alt/alt-nodejs18/root/usr/bin/node node_modules/.bin/prisma db push \
      --schema=/home/u590503555/domains/ssi-dtc.de/nodejs/prisma/schema.prisma \
      --skip-generate

    Produktion-DB: /home/u590503555/domains/ssi-dtc.de/db/dev.db

  5. Dev-Server Log: C:\temp\devserver.log — Server läuft als Hidden-Prozess.

  6. 404 für .js-Chunks: Normal bei Server Components in Next.js dev — kein Fehler.

  7. SystemConfig: Hat immer nur einen Eintrag mit id = "default".

  8. HTML-Checkbox FormData: Unchecked-Checkbox sendet KEIN Feld (nicht 'off'). Immer === 'on' prüfen, nie !== 'off'.

  9. E-Mail Buttons: display:inline-block in E-Mail-Clients unzuverlässig → immer <table role="presentation"> mit <td>-Zellen verwenden.


Pflichtaufgabe nach jeder Code-Änderung

Nach JEDER Änderung an Features, Bugfixes oder UI müssen diese Dateien aktualisiert werden:

  1. lib/version.ts — Version um 0.0.1 erhöhen
  2. CLAUDE_LOG.md — Neuen Eintrag mit Datum, Version und Beschreibung oben einfügen
  3. SKILL.md — Version + ggf. neue Dateiliste / Fallstricke aktualisieren
  4. DEVELOPER.md — Version + ggf. neue Komponenten/Schema-Änderungen
  5. Benutzerhandbuch_Tauchschule.html — Version-Badge + ggf. neue Abschnitte für Benutzer-Features

Dies geschieht automatisch und selbständig — Jürgen muss nicht extra darum bitten.


Wiederherstellen / Neustart

# Server neu starten
Get-Process "node" | Stop-Process -Force
Start-Process cmd.exe -ArgumentList '/c cd "C:\test claude\dztc\tauchschule-app" && npm run dev > C:\temp\devserver.log 2>&1' -WindowStyle Hidden

# Schema-Änderungen pushen
Start-Process cmd.exe -ArgumentList '/c cd "C:\test claude\dztc\tauchschule-app" && set DATABASE_URL=file:./dev.db && npx prisma db push --accept-data-loss > C:\temp\push.log 2>&1' -WindowStyle Hidden

# Status prüfen
netstat -ano | findstr ":3000"
Get-Content "C:\temp\devserver.log" | Select-Object -Last 10

Vor jeder Änderung checken

# Welche Exports hat actions.ts?
Select-String -Path "C:\test claude\dztc\tauchschule-app\lib\actions.ts" -Pattern "export async"

# Schema aktuell?
Select-String -Path "C:\test claude\dztc\tauchschule-app\prisma\schema.prisma" -Pattern "model "

# Server läuft?
Get-Content "C:\temp\devserver.log" | Select-Object -Last 5

Categories