- 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>
235 lines
9.3 KiB
Lua
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
|