Skip to content

Architektur ​

ClinicPulse besteht aus drei Docker-Compose-Diensten (docker/docker-compose.yml):

DienstAufgabeNetzwerke
webVue-3-Frontend über nginx; einziger Dienst mit veröffentlichtem Portapplication
backendBackend-API (Python), Lizenzprüfung, Planung, Backupapplication, database
dbPostgreSQLdatabase (intern)

Das Netzwerk database ist als internal konfiguriert: Die Datenbank ist nicht von außen erreichbar. Sensible Datenbankfelder werden mit einem Schlüssel aus dem separaten Docker-Volume clinicpulse_keys verschlüsselt; das Volume selbst ist nicht automatisch verschlüsselt.

Backend (backend/app/) ​

ModulInhalt
main.py, schemas.py, models.pyAPI, Validierung, Datenmodell (u. a. Mehrfach-Abteilungen, Fahrzeuge)
database.py, encrypted.pyDatenbankzugriff und Verschlüsselung
security.py, login_throttle.pyAuthentifizierung, Schutz vor Brute-Force
role_catalog.pyRollen, Funktionen und Struktur je Einrichtungsart
absences.py, invitations.pyAbwesenheiten und Einladungen
optimizer.py, plan_archive.pyPlanungsvorschläge und Archiv
staffing.pyQualifikationsabgleich zwischen Personen und Schichtanforderungen
work_rules.py, regional_calendar.pyArbeits- und Ruhezeitprüfungen, Feiertage
backup_*.pyVerschlüsselte Sicherung und Wiederherstellung
license_manager.py, licensing.pyLizenzprüfung
audit.py, update_checker.pyProtokollierung und Update-Hinweise

Frontend (frontend/src/) ​

Vue 3 mit TypeScript und Vite. Build und Typprüfung: npm run build.

API-Hinweise für Integrationen ​

Neu oder erweitert (alle Pfade unter /api, Authentifizierung wie bei den übrigen Endpunkten; die interaktive Beschreibung liefert /api/docs):

EndpunktÄnderung
GET/POST /employees, PUT /employees/{id}, POST /employees/onboardzusätzlich additional_department_ids (weitere Abteilungen). department_id ist die Hauptabteilung. Antworten blenden Qualifikationen und Zuordnungen anderer Abteilungen aus, auf die das Konto keinen Zugriff hat.
POST /optimization/preview, POST /planning/previewVorschläge enthalten zusätzlich positions (alle durch die Person abgedeckten Anforderungen); position ist die erste davon, role_match ist immer true.
GET /smart-selectionnur Personen mit geforderter Qualifikation; Kandidaten enthalten positions.
GET /role-catalogzusätzlich structure (single_unit, uses_vehicles, unit_label, unit_label_plural, unit_gender, lead_label) und operational_profile.
GET/PUT /admin/business-configurationdieselben Struktur-Felder; bei „Sonstige“ änderbar.
POST /setupzusätzlich unit_name (Leitstelle bzw. „Sonstige“ mit einer Einheit) sowie bei „Sonstige“ unit_label, unit_label_plural, unit_gender, lead_label, single_unit, uses_vehicles.
GET/POST /vehicles, PUT/DELETE /vehicles/{id}Fahrzeuge je Standort (vehicle_type: RTW, NEF, KTW, ITW, ELW, MTW, Sonstige; is_active). Nur wenn die Einrichtungsart Fahrzeuge nutzt (sonst HTTP 409).
POST/PUT /shift-typesoptional vehicle_id (Fahrzeug desselben Standorts).
GET /absencesgenehmigte Abwesenheiten von Personen aus der eigenen, aber nicht der Hauptabteilung ohne note, requested_by, decided_by und decided_at.
alle /api/*-AntwortenCache-Control: no-store.

Geänderte Fehler (HTTP 409): Employee role is not required for this shift (Qualifikation fehlt, jetzt für alle Schichten), Vehicle is deactivated, Vehicle is in use, This facility type uses a single organizational unit. Beim Löschen von Abteilungen zählen Fahrzeuge und weitere Zuordnungen als Verwendung.

Tests ​

Backend-Tests mit pytest in tests/backend/, Browser-Tests mit Playwright in tests/frontend/. Siehe TEST.md.

ClinicPulse befindet sich in einer frühen Alpha-Phase.