-- ===================================================================== -- aether-medical — Rechteprüfung -- -- Ein Mitarbeiter hat ein Recht, wenn seine Rolle es vorsieht ODER es -- ihm einzeln gewährt wurde — und es ihm nicht einzeln entzogen wurde. -- Der Entzug hat immer Vorrang. -- ===================================================================== Rechte = {} --- Wandelt eine JSON-Liste in eine Menge um --- @param roh string|nil JSON-Array --- @return table { [wert] = true } local function ZuMenge(roh) local menge = {} if not roh then return menge end local erfolg, liste = pcall(json.decode, roh) if erfolg and type(liste) == 'table' then for _, wert in ipairs(liste) do menge[wert] = true end end return menge end --- Baut die vollständige Rechtemenge eines Mitarbeiters --- @param personal table Zeile aus medical_personal --- @return table { [rechtId] = true } function Rechte.Berechne(personal) local menge = Medizin.RechteDerRolle(personal.rolle) -- Einzeln gewährte Rechte ergänzen for recht in pairs(ZuMenge(personal.rechte_extra)) do menge[recht] = true end -- Einzeln entzogene Rechte haben Vorrang for recht in pairs(ZuMenge(personal.rechte_entzug)) do menge[recht] = nil end return menge end --- Prüft ein einzelnes Recht --- @param mitarbeiter table Mitarbeiterdaten (mit Feld `rechte`) --- @param recht string Recht-Kennung --- @return boolean function Rechte.Hat(mitarbeiter, recht) if not mitarbeiter or not mitarbeiter.rechte then return false end if not recht then return true end return mitarbeiter.rechte[recht] == true end --- Prüft, ob ein Mitarbeiter über einem anderen steht. --- Verhindert, dass jemand Gleichrangige oder Höhere verwaltet. --- @param mitarbeiter table Handelnder --- @param zielRolle string Rolle der Zielperson --- @return boolean function Rechte.StehtUeber(mitarbeiter, zielRolle) return Medizin.Stufe(mitarbeiter.rolle) > Medizin.Stufe(zielRolle) end