aether-framework/resources/[aether]/aether-police/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

209 lines
8.6 KiB
Lua

-- =====================================================================
-- aether-police — Rollen und Rechte
--
-- Rechte sind einzelne, benannte Schalter. Eine Rolle ist nur ein
-- Vorschlagspaket — jedes Recht kann pro Beamtem zusaetzlich gewaehrt
-- oder entzogen werden (Spalten `rechte_extra` / `rechte_entzug`).
-- =====================================================================
Polizei = Polizei or {}
-- ---------------------------------------------------------------------
-- Katalog aller Rechte
-- Gruppiert nur fuer die Darstellung in der Administration.
-- ---------------------------------------------------------------------
Polizei.Rechte = {
{ gruppe = 'Dienst', eintraege = {
{ id = 'dienst.antreten', name = 'Dienst antreten' },
{ id = 'dienst.leitstelle', name = 'Leitstelle übernehmen' },
{ id = 'dienst.spezial', name = 'Spezialdienst wählen' },
}},
{ gruppe = 'Personen & Fahrzeuge', eintraege = {
{ id = 'person.suchen', name = 'Personen suchen' },
{ id = 'person.bearbeiten', name = 'Personendaten bearbeiten' },
{ id = 'person.warnhinweis', name = 'Warnhinweise setzen' },
{ id = 'fahrzeug.suchen', name = 'Fahrzeuge abfragen' },
}},
{ 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 = 'Maßnahmen', eintraege = {
{ id = 'anzeige.erstellen', name = 'Anzeige erfassen' },
{ id = 'anzeige.bestaetigen', name = 'Anzeige bestätigen' },
{ id = 'anzeige.abweichen', name = 'Vom Katalogvorschlag abweichen' },
{ id = 'gewahrsam.einweisen', name = 'In Gewahrsam nehmen' },
{ id = 'gewahrsam.entlassen', name = 'Aus Gewahrsam entlassen' },
{ id = 'fahndung.erstellen', name = 'Fahndung ausschreiben' },
{ id = 'fahndung.aufheben', name = 'Fahndung aufheben' },
}},
{ gruppe = 'Asservate & Beweise', eintraege = {
{ id = 'beweis.erfassen', name = 'Beweise erfassen' },
{ id = 'beweis.loeschen', name = 'Beweise entfernen' },
{ id = 'asservat.einlagern', name = 'Asservate einlagern' },
{ id = 'asservat.ausgeben', name = 'Asservate ausgeben' },
{ id = 'asservat.vernichten', name = 'Asservate vernichten' },
}},
{ gruppe = 'Einsätze', eintraege = {
{ id = 'einsatz.erstellen', name = 'Einsatz anlegen' },
{ id = 'einsatz.zuweisen', name = 'Einheiten zuweisen' },
{ id = 'einsatz.schliessen', name = 'Einsatz abschließen' },
}},
{ gruppe = 'Fahrzeugverwaltung', eintraege = {
{ id = 'dienstfahrzeug.sehen', name = 'Dienstfahrzeuge einsehen' },
{ id = 'dienstfahrzeug.zuweisen', name = 'Dienstfahrzeuge zuweisen' },
{ id = 'dienstfahrzeug.wartung', name = 'Wartungsstatus setzen' },
}},
{ 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 = 'Strafenkatalog 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 Polizei.AlleRechte()
local liste = {}
for _, gruppe in ipairs(Polizei.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.
-- ---------------------------------------------------------------------
Polizei.Rollen = {
{
id = 'anwaerter', name = 'Anwärter', stufe = 0,
rechte = {
'dienst.antreten', 'person.suchen', 'fahrzeug.suchen',
'akte.lesen', 'einsatz.erstellen', 'dienstfahrzeug.sehen',
'nachricht.senden',
},
},
{
id = 'officer', name = 'Officer', stufe = 1,
rechte = {
'dienst.antreten', 'person.suchen', 'fahrzeug.suchen',
'akte.lesen', 'akte.erstellen', 'bericht.erstellen',
'anzeige.erstellen', 'beweis.erfassen',
'einsatz.erstellen', 'dienstfahrzeug.sehen', 'nachricht.senden',
},
},
{
id = 'senior_officer', name = 'Senior Officer', stufe = 2,
rechte = {
'dienst.antreten', 'person.suchen', 'person.bearbeiten', 'fahrzeug.suchen',
'akte.lesen', 'akte.erstellen', 'akte.bearbeiten',
'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen',
'beweis.erfassen', 'asservat.einlagern',
'einsatz.erstellen', 'einsatz.schliessen', 'dienstfahrzeug.sehen',
'nachricht.senden',
},
},
{
id = 'sergeant', name = 'Sergeant', stufe = 3,
rechte = {
'dienst.antreten', 'dienst.leitstelle', 'dienst.spezial',
'person.suchen', 'person.bearbeiten', 'person.warnhinweis', 'fahrzeug.suchen',
'akte.lesen', 'akte.erstellen', 'akte.bearbeiten', 'akte.schliessen',
'bericht.erstellen', 'anzeige.erstellen', 'anzeige.bestaetigen',
'gewahrsam.einweisen', 'gewahrsam.entlassen',
'fahndung.erstellen', 'fahndung.aufheben',
'beweis.erfassen', 'asservat.einlagern', 'asservat.ausgeben',
'einsatz.erstellen', 'einsatz.zuweisen', 'einsatz.schliessen',
'dienstfahrzeug.sehen', 'dienstfahrzeug.zuweisen',
'nachricht.senden', 'nachricht.rundmeldung',
},
},
{
id = 'lieutenant', name = 'Lieutenant', stufe = 4,
erbt = 'sergeant',
rechte = {
'akte.freigeben', 'bericht.freigeben', 'anzeige.abweichen',
'personal.sehen', 'statistik.sehen', 'dienstfahrzeug.wartung',
'aushang.schreiben',
},
},
{
id = 'captain', name = 'Captain', stufe = 5,
erbt = 'lieutenant',
rechte = {
'personal.rolle', 'beweis.loeschen', 'asservat.vernichten',
'protokoll.lesen', 'aushang.archivieren',
},
},
{
id = 'deputy_chief', name = 'Deputy Chief', stufe = 6,
erbt = 'captain',
rechte = { 'personal.rechte', 'personal.einstellen', 'katalog.bearbeiten' },
},
{
id = 'chief', name = 'Chief of Police', stufe = 7,
erbt = 'deputy_chief',
rechte = { 'admin.module' },
},
}
--- Sucht eine Rolle
--- @param rollenId string Kennung
--- @return table|nil
function Polizei.HoleRolle(rollenId)
for _, rolle in ipairs(Polizei.Rollen) do
if rolle.id == rollenId then return rolle end
end
return nil
end
--- Loest die Rechte einer Rolle auf (inklusive Vererbung)
--- @param rollenId string Kennung
--- @return table Menge der Rechte { [rechtId] = true }
function Polizei.RechteDerRolle(rollenId)
local menge = {}
local besucht = {}
local aktuelle = rollenId
-- Vererbungskette abarbeiten; Zyklen werden abgefangen
while aktuelle and not besucht[aktuelle] do
besucht[aktuelle] = true
local rolle = Polizei.HoleRolle(aktuelle)
if not rolle then break end
for _, recht in ipairs(rolle.rechte or {}) do
menge[recht] = true
end
aktuelle = rolle.erbt
end
return menge
end
--- Liefert die Stufe einer Rolle (fuer Vergleiche „darf ich das bei dem?")
--- @param rollenId string Kennung
--- @return number
function Polizei.Stufe(rollenId)
local rolle = Polizei.HoleRolle(rollenId)
return rolle and rolle.stufe or -1
end