-- ===================================================================== -- 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