aether-framework/resources/[aether]/aether-medical/shared/rollen.lua
Jerrit Fritzsche e4b82dd685 Aether-Framework: Fachmodule, Admin-Panel und Docker-Datenbank
- aether-medical: Stationen/Belegung, Intensivstation, Blutbank, Fuhrpark,
  Nachrichten/Aushänge, Berichte und Textbausteine (server + NUI)
- aether-admin: vollständiges Server-Admin-Panel als echtes FiveM-Resource,
  an aether-core gekoppelt (Rechte über aether_users.admin_group), mit
  WebRTC-Live-Kameras (Bildschirmfreigabe) und separatem Media-Server (SFU)
- Prototypen admin/ vervollständigt
- SQL-Schema aether_admin.sql
- Docker-Compose mit MariaDB und idempotenter Auto-Migration (schema_migrations)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-27 18:55:32 +02:00

235 lines
9.3 KiB
Lua

-- =====================================================================
-- aether-medical — Rollen und Rechte
--
-- Rechte sind einzelne, benannte Schalter. Eine Rolle ist nur ein
-- Vorschlagspaket — jedes Recht kann pro Mitarbeiter zusaetzlich
-- gewaehrt oder entzogen werden (`rechte_extra` / `rechte_entzug`).
--
-- Ein Recht erlaubt immer nur, etwas zu DOKUMENTIEREN oder zu
-- ORGANISIEREN. Kein Recht laesst das System selbst behandeln.
-- =====================================================================
Medizin = Medizin or {}
-- ---------------------------------------------------------------------
-- Katalog aller Rechte
-- Gruppiert nur fuer die Darstellung in der Administration.
-- ---------------------------------------------------------------------
Medizin.Rechte = {
{ gruppe = 'Dienst', eintraege = {
{ id = 'dienst.antreten', name = 'Dienst antreten' },
{ id = 'dienst.leitstelle', name = 'Leitstelle übernehmen' },
{ id = 'dienst.notarzt', name = 'Als Notarzt fahren' },
{ id = 'dienst.op', name = 'OP-Dienst übernehmen' },
}},
{ gruppe = 'Patienten', eintraege = {
{ id = 'patient.suchen', name = 'Patienten suchen' },
{ id = 'patient.stammdaten', name = 'Stammdaten pflegen' },
{ id = 'patient.hinweis', name = 'Warnhinweise setzen' },
{ id = 'patient.aufnehmen', name = 'Patienten aufnehmen' },
{ id = 'patient.verlegen', name = 'Patienten verlegen' },
{ id = 'patient.entlassen', name = 'Patienten entlassen' },
}},
{ gruppe = 'Akten & Berichte', eintraege = {
{ id = 'akte.lesen', name = 'Akten einsehen' },
{ id = 'akte.erstellen', name = 'Akten anlegen' },
{ id = 'akte.bearbeiten', name = 'Akten bearbeiten' },
{ id = 'akte.freigeben', name = 'Akten freigeben' },
{ id = 'akte.schliessen', name = 'Akten schließen' },
{ id = 'bericht.erstellen', name = 'Berichte schreiben' },
{ id = 'bericht.freigeben', name = 'Berichte freigeben' },
}},
{ gruppe = 'Behandlung', eintraege = {
{ id = 'behandlung.dokumentieren', name = 'Behandlung dokumentieren' },
{ id = 'behandlung.diagnose', name = 'Diagnose eintragen' },
{ id = 'behandlung.abschliessen', name = 'Behandlung abschließen' },
{ id = 'operation.planen', name = 'Operation planen' },
{ id = 'operation.dokumentieren', name = 'Operation dokumentieren' },
}},
{ gruppe = 'Medikamente & Labor', eintraege = {
{ id = 'medikament.sehen', name = 'Medikamentenbestand einsehen' },
{ id = 'medikament.ausgeben', name = 'Ausgabe dokumentieren' },
{ id = 'medikament.bestand', name = 'Bestand buchen und pflegen' },
{ id = 'medikament.btm', name = 'Betäubungsmittel dokumentieren' },
{ id = 'labor.beauftragen', name = 'Laboraufträge stellen' },
{ id = 'labor.bearbeiten', name = 'Laborergebnisse eintragen' },
{ id = 'labor.befunden', name = 'Befund bewerten' },
{ id = 'blut.sehen', name = 'Blutbank einsehen' },
{ id = 'blut.verwalten', name = 'Blutkonserven verwalten' },
}},
{ gruppe = 'Einsätze', eintraege = {
{ id = 'einsatz.erstellen', name = 'Einsatz anlegen' },
{ id = 'einsatz.zuweisen', name = 'Kräfte zuweisen' },
{ id = 'einsatz.schliessen', name = 'Einsatz abschließen' },
}},
{ gruppe = 'Klinik', eintraege = {
{ id = 'station.sehen', name = 'Stationsbelegung einsehen' },
{ id = 'station.belegen', name = 'Zimmer belegen und freigeben' },
{ id = 'station.verwalten', name = 'Stationen und Zimmer pflegen' },
{ id = 'intensiv.sehen', name = 'Intensivstation einsehen' },
{ id = 'intensiv.betreuen', name = 'Intensivverlauf dokumentieren' },
{ id = 'fahrzeug.sehen', name = 'Fuhrpark einsehen' },
{ id = 'fahrzeug.zuweisen', name = 'Fahrzeuge zuweisen' },
{ id = 'fahrzeug.wartung', name = 'Wartungsstatus setzen' },
{ id = 'fahrzeug.pflegen', name = 'Fuhrpark pflegen' },
}},
{ gruppe = 'Kommunikation', eintraege = {
{ id = 'nachricht.senden', name = 'Nachrichten schreiben' },
{ id = 'nachricht.rundmeldung', name = 'Rundmeldung an alle senden' },
{ id = 'aushang.schreiben', name = 'Aushänge veröffentlichen' },
{ id = 'aushang.archivieren', name = 'Aushänge archivieren' },
}},
{ gruppe = 'Verwaltung', eintraege = {
{ id = 'personal.sehen', name = 'Personalliste einsehen' },
{ id = 'personal.rolle', name = 'Rollen zuweisen' },
{ id = 'personal.rechte', name = 'Einzelrechte vergeben' },
{ id = 'personal.einstellen', name = 'Personal einstellen/entlassen' },
{ id = 'katalog.bearbeiten', name = 'Medikamente und Vorlagen pflegen' },
{ id = 'protokoll.lesen', name = 'Protokoll einsehen' },
{ id = 'statistik.sehen', name = 'Statistik einsehen' },
{ id = 'admin.module', name = 'Module verwalten' },
}},
}
--- Liefert alle Rechte-IDs als flache Liste
--- @return table
function Medizin.AlleRechte()
local liste = {}
for _, gruppe in ipairs(Medizin.Rechte) do
for _, recht in ipairs(gruppe.eintraege) do
liste[#liste + 1] = recht.id
end
end
return liste
end
-- ---------------------------------------------------------------------
-- Rollen — aufsteigend nach Verantwortung
-- `rechte` ist ein Vorschlagspaket, kein festes Gesetz.
-- `erbt` uebernimmt alle Rechte der genannten Rolle.
-- ---------------------------------------------------------------------
Medizin.Rollen = {
{
id = 'praktikant', name = 'Praktikant', stufe = 0,
rechte = {
'dienst.antreten', 'patient.suchen', 'akte.lesen',
'medikament.sehen', 'station.sehen', 'fahrzeug.sehen',
'nachricht.senden',
},
},
{
id = 'rettungssanitaeter', name = 'Rettungssanitäter', stufe = 1,
erbt = 'praktikant',
rechte = {
'einsatz.erstellen', 'behandlung.dokumentieren',
'bericht.erstellen', 'akte.erstellen',
},
},
{
id = 'notfallsanitaeter', name = 'Notfallsanitäter', stufe = 2,
erbt = 'rettungssanitaeter',
rechte = {
'patient.aufnehmen', 'patient.stammdaten',
'medikament.ausgeben', 'labor.beauftragen',
'einsatz.schliessen', 'akte.bearbeiten',
},
},
{
id = 'pflegekraft', name = 'Pflegekraft', stufe = 3,
erbt = 'notfallsanitaeter',
rechte = {
'station.belegen', 'patient.verlegen',
'intensiv.sehen', 'blut.sehen', 'medikament.bestand',
'labor.bearbeiten',
},
},
{
id = 'assistenzarzt', name = 'Assistenzarzt', stufe = 4,
erbt = 'pflegekraft',
rechte = {
'behandlung.diagnose', 'behandlung.abschliessen',
'patient.hinweis', 'labor.befunden',
'operation.dokumentieren', 'intensiv.betreuen',
},
},
{
id = 'facharzt', name = 'Facharzt', stufe = 5,
erbt = 'assistenzarzt',
rechte = {
'patient.entlassen', 'operation.planen',
'medikament.btm', 'blut.verwalten',
'akte.freigeben', 'bericht.freigeben',
'dienst.op', 'dienst.notarzt',
},
},
{
id = 'oberarzt', name = 'Oberarzt', stufe = 6,
erbt = 'facharzt',
rechte = {
'akte.schliessen', 'einsatz.zuweisen', 'dienst.leitstelle',
'fahrzeug.zuweisen', 'fahrzeug.wartung',
'personal.sehen', 'statistik.sehen',
'nachricht.rundmeldung', 'aushang.schreiben',
},
},
{
id = 'chefarzt', name = 'Chefarzt', stufe = 7,
erbt = 'oberarzt',
rechte = {
'personal.rolle', 'station.verwalten', 'fahrzeug.pflegen',
'protokoll.lesen', 'aushang.archivieren',
},
},
{
id = 'klinikleitung', name = 'Klinikleitung', stufe = 8,
erbt = 'chefarzt',
rechte = {
'personal.rechte', 'personal.einstellen',
'katalog.bearbeiten', 'admin.module',
},
},
}
--- Sucht eine Rolle
--- @param rollenId string Kennung
--- @return table|nil
function Medizin.HoleRolle(rollenId)
for _, rolle in ipairs(Medizin.Rollen) do
if rolle.id == rollenId then return rolle end
end
return nil
end
--- Sammelt alle Rechte einer Rolle, inklusive geerbter.
--- @param rollenId string Kennung
--- @return table [recht] = true
function Medizin.RechteDerRolle(rollenId)
local menge = {}
-- Schutz gegen versehentliche Ringe in der Vererbung
local besucht = {}
local aktuell = rollenId
while aktuell and not besucht[aktuell] do
besucht[aktuell] = true
local rolle = Medizin.HoleRolle(aktuell)
if not rolle then break end
for _, recht in ipairs(rolle.rechte or {}) do
menge[recht] = true
end
aktuell = rolle.erbt
end
return menge
end
--- Rangstufe einer Rolle
--- @param rollenId string Kennung
--- @return number
function Medizin.Stufe(rollenId)
local rolle = Medizin.HoleRolle(rollenId)
return rolle and rolle.stufe or -1
end