Skip to content

Neues Rollen- und Rechtekonzept für ZMS #2065

@coderabbitai

Description

@coderabbitai

Status Quo

ZMS verwendet ein zweidimensionales, stufenbasiertes Berechtigungsmodell, bei welchem die Rechte eines Benutzers als einzelner nummerischer Wert (Berechtigung) in der Datenbank (nutzer Tabelle) gespeichert werden und höhere Stufen automatisch alle Berchtigungen der unteren Stufen übernehmen.

1. Dimension: funktionale Berechtigungsstufen

RightsLevelManager.php (excerpt)


public static $possibleRights = array(
	'superuser' => 90,			// Technische Administration / Superuser
	'organisation' => 70,		// Referatsübergreifende Administration (wird in zmsadmin nicht genutzt)
	'department' => 50,			// Behördenübergreifende Administration (wird in zmsadmin nicht genutzt)
	'cluster' => 40,			// Fachliche Administration
	'useraccount' => 40,		// Fachliche Administration
	'scope' => 30,				// Terminadministration
	'departmentStats' => 25,	// wird in zmsadmin nicht genutzt
	'availability' => 20,	    // wird in zmsadmin nicht genutzt
	'ticketprinter' => 15,	    // wird in zmsadmin nicht genutzt
	'sms' => 10,			    // wird in zmsadmin nicht genutzt
	'audit' => 5,				// Innenrevision
	'basic' => 0				// Sachbearbeitung
);

Vererbung

Useraccount.php (excerpt)


public function getEntityMapping()
{
    return [
        'id' => 'useraccount.Name',
        'password' => 'useraccount.Passworthash',
        'lastLogin' => 'useraccount.lastUpdate',
        'rights__superuser' => self::expression('`useraccount`.`Berechtigung` = 90'),
        'rights__organisation' => self::expression('`useraccount`.`Berechtigung` >= 70'),
        'rights__department' => self::expression('`useraccount`.`Berechtigung` >= 50'),
        'rights__cluster' => self::expression('`useraccount`.`Berechtigung` >= 40'),
        'rights__useraccount' => self::expression('`useraccount`.`Berechtigung` >= 40'),
        'rights__scope' => self::expression('`useraccount`.`Berechtigung` >= 30'),
        'rights__departmentStats' => self::expression('`useraccount`.`Berechtigung` >= 25'),
        'rights__availability' => self::expression('`useraccount`.`Berechtigung` >= 20'),
        'rights__ticketprinter' => self::expression('`useraccount`.`Berechtigung` >= 15'),
        'rights__sms' => self::expression('`useraccount`.`Berechtigung` >= 10'),
        'rights__audit' => self::expression('`useraccount`.`Berechtigung` = 5 OR `useraccount`.`Berechtigung` = 90'),
        'rights__basic' => self::expression('`useraccount`.`Berechtigung` >= 0'),
    ];
}

Beispiel: Ein User, welcher über ZMS-Admin mit der Rolle Terminadmin (= scope) angelegt wurde, erhält zusätzlich alle darunter liegenden Stufen. Eine Ausnahme hiervon bildet lediglich die Rolle audit - sie kann nur explizit zugewiesen oder in der Rolle superuser vererbt werden.

{
   "$schema": "https://schema.berlin.de/queuemanagement/useraccount.json",
   "rights": {
      "superuser": 0,
      "organisation": 0,
      "department": 0,
      "cluster": 0,
      "useraccount": 0,
      "scope": 1,
      "departmentStats": 1,
      "availability": 1,
      "ticketprinter": 1,
      "sms": 1,
      "audit": 0, // Sonderrolle
      "basic": 1
   },
   "id": "fabian-terminadmin",
   "password": "***********************",
   "lastLogin": 1764575771
}

2. Dimension: Nutzer-Behörden-Zuordnung

Benutzer werden explizit einer oder mehrerer Behörden zugewiesen. Über diese Zuordnung wird gesteuert, auf welche Daten der Nutzer zugreifen. Superuser umgehen diese Zuordnung vollständig - ihnen wird lediglich die fiktionale behoerdenid "0" zugewiesen.

zms.sql (excerpt)
CREATE TABLE `nutzerzuordnung` (
  `nutzerid` int(5) NOT NULL,		// Fremdschlüssel für Nutzer
  `behoerdenid` int(5) NOT NULL		// Fremdschlüssel für Behörde
)

3. Zugriffsprüfung

Backend
Im Backend erfolgt die Zugriffsprüfung über verschiedene Methoden der User- und Useraccount-Klassen. Am häufigsten wird hiebei die Methode checkRights(string ...$rights) verwendet, welche in fast allen zmsapi-Controllern in der ersten Zeile verwendet wird. Sie lädt die Workstation und ruft testRights() auf, welche widerum die hasRights() Methode wrapped. In der hasRights() Methode erfolgt die eigentlich Prüfung. Wichtig: es wird über alle geforderten Rechte iteriert und nur true returned, wenn alle Rehte vorhanden sind.

Useraccount.php (excerpt)


public function hasRights(array $requiredRights)
{
    if ($this->isSuperUser()) {
        return true;
    }
    foreach ($requiredRights as $required) {
        if ($required instanceof Useraccount\RightsInterface) {
            if (!$required->validateUseraccount($this)) {
                return false;
            }
        } elseif (! $this->toProperty()->rights->$required->get()) {
            return false;
        }
    }
    return true;
}

Frontend

Im Frontend werden bestimmte UI-Elemente je nach Nutzer-Rechten ein- bzw. ausgeblendet. Dies erfolgt in den Twig-Templates meist anhand des übergebenen workstation-Objekts und den darin enthaltenen useraccount-Daten.

navigation.twig (excerpt)


{% if rights.ticketprinter and workstation.scope.id %}
    {% if workstation.useraccount.rights.superuser %}
        <li class="nav__link{{ menuActive == 'calldisplay'? ' active' }}">
            <a title="{% trans %}Standortauswahlseite der Aufrufanlage{% endtrans %}" href="{{ urlGet('calldisplay', {}, {}) }}" {{ menuActive == 'calldisplay'? ' aria-current="page"' }}>Anzeige Aufrufsystem</a>
        </li>
        <li class="nav__link{{ menuActive == 'ticketprinter'? ' active' }}">
            <a title="{% trans %}Standortauswahlseite der Wartenummernausgabe{% endtrans %}" href="{{ urlGet('ticketprinter', {}, {}) }}" {{ menuActive == 'ticketprinter'? ' aria-current="page"' }}>Wartenummern</a>
        </li>
    {% endif %}
{% endif %}
{% if workstation.useraccount.rights.scope %}
<li class="nav__link{{ menuActive == 'overviewcalendar'? ' active' }}">
    <a title="{% trans %}Gesamtübersicht mit allen Terminen{% endtrans %}"
        href="{{ urlGet('overviewcalendar', {}, {}) }}"
        {{ menuActive == 'overallcalendar'? ' aria-current="page"' }}>
        Gesamtübersicht
    </a>
</li>
{% endif %}

Identifizierte Probleme

  1. Implizite Vererbung

    • Höhere Rollen bekommen automatisch alle niedrigeren Rechte (z. B. erhält fachliche Administration (40) automatisch Terminadministration (30), auch wenn dies nicht gewünscht ist)
    • Keine Möglichkeit, Vererbung zu deaktivieren
  2. Doppelte Rechte-Level

    • Stufe 40 hat zwei Bedeutungen: cluster und useraccount (verwirrend)
  3. Fehlende Granularität

    • Aktuell keine einfache Möglichkeit für Sachbearbeiter Lite (ohne Warteschlange)
    • Keine granularen Rollen (z. B. keine Rolle für reine Nutzerverwaltung)

Zielbild

Atomares Rechte-Modell

Zunächst werden die wesentlichen Interaktionen mit ZMS in Rechte übersetzt. Hierbei empfiehlt es sich, die Rechte so atomar wie möglich zu definieren. Nachfolgend unser initiales Zielbild:

Permission Nutzer*in darf...
appointment Sachbearbeiteransicht aufrufen + Termine aufrufen/verwalten/vergeben/verschieben/stornieren (inkl. Benachrichtungsmail senden)
availability Öffnungszeiten erstellen/aktualisieren/löschen (inkl. Sperren und Ausnahmen)
calldisplay Konfiguration/Layouts für Aufrufanzeige anpassen
cherrypick Termine direkt aus der Wartschlange aufrufen (hierfür wird queue benötigt)
cluster Cluster erstellen/aktualiseren/löschen
config Systemkonfiguration anpassen
counter Tresenansicht aufrufen (inkl. Monats- und Wochenkalender)
customersearch Kunden suchen (anstehende Termine, keine Termine aus Vergangenheit)
dayoff Freie Tage festlegen
department Behörde erstellen/aktualiseren/löschen
emergency Notruf auslösen/empfangen
finishedqueue Abgeschlossene Termine sehen
finishedqueuepast Abgeschlossene Termine aus der Vergangenheit anzeigen
logs Logergebnisse sehen
mailtemplates E-Mail-Templates anpassen
missedqueue Verpasste Termine sehen
openqueue Offene Aufrufe sehen
organisation Referat erstellen/aktualiseren/löschen
overviewcalendar Gesamtübersicht aufrufen
parkedqueue Geparkte Termine sehen
restrictedscope Standortkonfiguration lesen und bestimmte Abschnitte der Standortkonfiguration anpassen
scope Standort erstellen/aktualiseren/löschen
source Mandanten anlegen/aktualisieren/löschen (inkl. Pflege von Dienstleister und Dienstleistungen)
statistic Statistiken abrufen/exportieren
ticketprinter Konfiguration für E-Kioske anpassen
useraccount Nutzer*innen erstellen/aktualisieren/löschen/suchen
waitingqueue Wartschlange sehen
superuser alle Funktionen

Rollen-Rechte-Zuordnung

Frontend-Rolle Code/DB-Rollenbezeichnung Permissions
Sachbearbeitung beschränkt agent_basic appointment, emergency, counter*, customersearch*
Sachbearbeitung agent_queue appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue
Sachbearbeitung Plus agent_queue_plus appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue, overviewcalendar
Terminadministration appointment_admin appointment, emergency, counter, customersearch, cherrypick, waitingqueue, parkedqueue, missedqueue, openqueue, finishedqueue, overviewcalendar, restrictedscope, statistic
Controlling reporting_viewer statistic
Benutzerverwaltung user_admin useraccount
Innenrevision audit_viewer customersearch, logs
Technische Administration system_admin superuser

ERM

ERM-Diagramm (Mermaid Live)

(Bewusst neue Naming Convention für neue Tabellen, vgl. #1427)


Umsetzungsplan

Phase 1: Grundlage

Ticket Titel Status
ZMSKVR-1161 Tabellen für neues Rollen- und Rechtekonzept anlegen ✅ Erledigt
ZMSKVR-1170 Migration der bestehenden Nutzer in das neue Rollenmodell (Befüllung user_role) ✅ Erledigt
ZMSKVR-1171 Backend-Vorarbeiten für atomares Berechtigungsmodell 🔲 Offen

Phase 2: Controller & Templates schrittweise umstellen

Die Reihenfolge ist hier grundsätzlich egal.

Ticket Titel Status
ZMSKVR-1172 Umstellung Rechteprüfung – Statistik und Innenrevision 🔲 Offen
ZMSKVR-1294 Umstellung Rechteprüfung – Behörden, Standorte und Öffnungszeiten 🔲 Offen
ZMSKVR-1295 Umstellung Rechteprüfung – Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen, Wartenummern und Systemkonfiguration 🔲 Offen
ZMSKVR-1296 Umstellung Rechteprüfung – Sachbearbeitung, Tresen und Warteschlangen 🔲 Offen

Phase 3: UI-Umbau

Folgende Tickets sind noch zu erstellen.

  • Nutzer-Erstellung/-Änderung: Neue Rollennamen anzeigen + Schreibrichtung ändern
    • Vorher: Formular sendet rights, getRightsLevel() berechnet Berechtigung, Mapping-Logik leitet daraus die neue Rolle ab und schreibt sie in user_role
    • Nachher: Formular sendet Rollen direkt in user_role, Reverse-Mapping leitet daraus die Berechtigung ab
    • Außerdem: Restliche Controller müssen umgestellt und ggf. noch refactored werden: UseraccountAdd, UseraccountDelete, UseraccountGet, UseraccountList, UseraccountListByDepartments, UseraccountListByRole, UseraccountListByRoleAndDepartments, UseraccountUpdate
  • Neuer UI-Bereich + CRUD, um Roles und Permissions zu verwalten

Phase 4: Aufräumen

Ticket Titel Status
ZMSKVR-1173 Entfernung der Legacy-Berechtigungsstrukturen 🔲 Offen

Folgendes muss aufgeräumt werden:

  • Datenbank-Tabellen
  • Entity und Schema (Fallbacks entfernen)
  • Query-Klassen
  • Unit Tests

Ticket-Details


ZMSKVR-1170 – Migration der bestehenden Nutzer in das neue Rollenmodell (Befüllung user_role)

User Story

Als Systemadministrator von ZMS
möchte ich die bestehenden Nutzerberechtigungen automatisiert in fachliche Rollen des neuen Rechte-Modells überführen,
damit alle bestehenden Nutzer*innen nach der Umstellung weiterhin arbeitsfähig sind und die neue Rollenlogik technisch genutzt werden kann.

Hintergrundinformationen

Bisher wurden die "Rollen" als einzelner nummerischer Wert (Berechtigung) in der nutzer-Tabelle gespeichert, wobei höhere Stufen automatisch alle Berechtigungen der unteren Stufe übernehmen.

Für die Migration ist eine Übersetzung der bestehenden numerischen Berechtigungsstufen in die neuen fachlichen Rollen notwendig. Das Ergebnis der Migration ist die Befüllung der neuen Verknüpfungstabelle user_role (Nutzer ↔ Rolle).

Relevante Übersetzung der alten Rollen:

Alte Berechtigung Bedeutung alt Neue Rolle
90 Technische Administration Technische Administration (superuser)
40 Fachliche Administration Terminadministration oder Benutzerverwaltung
30 Terminadministration Terminadministration
5 Innenrevision Innenrevision
0 Sachbearbeitung Sachbearbeitung oder Sachbearbeitung beschränkt

Für die initiale Migration genügt eine vereinfachte Übersetzung der alten Berechtigungsstufen in neue Rollen, um den Systembetrieb sicherzustellen. Alle User der Stufe 40 erhalten die Rolle "Terminadministration", alle User der Stufe 0 erhalten die Rolle "Sachbearbeitung".

Akzeptanzkriterien

  • Für alle bestehenden Nutzer*innen wird eine/mehrere Rollen-Zuordnung(en) in der Tabelle user_role angelegt
  • Die Übersetzung der alten Berechtigungsstufen erfolgt gemäß der definierten Mapping-Tabelle:
    • Nutzer*innen mit Berechtigung = 90 erhalten die Rolle Technische Administration
    • Nutzer*innen mit Berechtigung = 40 oder 30 erhalten die Rolle Terminadministration
    • Nutzer*innen mit Berechtigung = 5 erhalten die Rolle Innenrevision
    • Nutzer*innen mit Berechtigung = 0 erhalten die Rolle Sachbearbeitung

ZMSKVR-1171 – Backend-Vorarbeiten für atomares Berechtigungsmodell

User Story

Als Entwickler*in
möchte ich die technischen Grundlagen für das neue atomare Berechtigungsmodell schaffen, ohne bestehende Funktionalität zu beeinträchtigen,
damit die schrittweise Umstellung der Controller und Frontend-Komponenten in Folgetickets sicher erfolgen kann.

Hintergrundinformationen

Dieses Ticket schafft die Voraussetzungen für die Migration auf das neue Berechtigungsmodell. Alle Änderungen müssen abwärtskompatibel sein: Das bestehende rights-Array bleibt erhalten und wird weiterhin aus den neuen Berechtigungen abgeleitet. Die Controller und Twig-Templates werden in diesem Ticket noch nicht angepasst – sie arbeiten weiterhin mit dem rights-Array.

Betroffene Komponenten:

Komponente Datei Änderung
JSON-Schema zmsentities/schema/useraccount.json Neues permissions-Objekt hinzufügen
Entity zmsentities/src/Zmsentities/Useraccount.php getDefaults(), hasRights(), testRights(), isSuperUser() erweitern/refactoren
DB Query zmsdb/src/Zmsdb/Query/Useraccount.php getEntityMapping() und reverseEntityMapping() umstellen
Neue Query-Klassen zmsdb/src/Zmsdb/Query/Permission.php, Role.php, UserRole.php Neu anlegen

Nach Abschluss existieren altes und neues System parallel.

Akzeptanzkriterien

  • Das JSON-Schema useraccount.json enthält ein neues permissions-Objekt
  • Useraccount::getDefaults() liefert sowohl rights als auch permissions
  • getEntityMapping() befüllt rights weiterhin aus Berechtigung (unverändert) und befüllt zusätzlich permissions aus den neuen Tabellen
  • Superuser erhalten alle Einträge im permissions-Array auf true
  • reverseEntityMapping() schreibt sowohl nach Berechtigung als auch nach user_role (Mapping-Logik aus ZMSKVR-1170 wiederverwendet)
  • Die alte Benutzerverwaltungs-UI funktioniert weiterhin korrekt und hält Berechtigung und user_role konsistent zueinander
  • hasRights() prüft zuerst permissions, dann Fallback auf rights
  • isSuperUser() prüft beide Arrays
  • Neue Query-Klassen für die neuen Tabellen existieren
  • checkRights() akzeptiert sowohl alte (scope, basic, ...) als auch neue Berechtigungsnamen (statistic, appointment, ...)

ZMSKVR-1172 – Umstellung Rechteprüfung – Statistik und Innenrevision

User Story

Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich Statistik und Innenrevision auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.

Hintergrundinformationen

Controller:

Controller Aktuell Neu
ProcessLog checkRights('audit') checkRights('logs')
WarehousePeriodGet checkRights('scope') checkRights('statistic')
WarehousePeriodListGet checkRights('scope') checkRights('statistic')
WarehouseSubjectGet checkRights('scope') checkRights('statistic')
WarehouseSubjectListGet checkRights('scope') checkRights('statistic')

Akzeptanzkriterien

  • Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
  • Nutzer*innen mit der Rolle "Controlling" können Statistiken abrufen
  • Nutzer*innen mit der Rolle "Innenrevision" können Log-Ergebnisse in der Kundensuche abrufen

ZMSKVR-1294 – Umstellung Rechteprüfung – Behörden, Standorte und Öffnungszeiten

User Story

Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich "Behörden und Standorte" sowie Öffnungszeiten auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.

Hintergrundinformationen

Controller:

Controller Aktuell Neu
AvailabilityClosureRead checkRights('scope') checkRights('availability')
AvailabilityClosureToggle checkRights() checkRights('availability') oder nur Login-Prüfung?
AvailabilityDelete checkRights() checkRights('availability') oder nur Login-Prüfung?
AvailabilityGet checkRights() checkRights('availability') oder nur Login-Prüfung?
AvailabilityListByScope checkRights('availability') keine Änderung
AvailabilityListUpdate checkRights() checkRights('availability') oder nur Login-Prüfung?
AvailabilitySlotsUpdate checkRights() checkRights('availability') oder nur Login-Prüfung?
ClusterCalldisplayImageDataDelete checkRights('cluster') checkRights('calldisplay')
ClusterCalldisplayImageDataUpdate checkRights('cluster') checkRights('calldisplay')
ClusterDelete checkRights('cluster') keine Änderung
ClusterUpdate checkRights('cluster') keine Änderung
ConflictListByScope checkRights('basic') checkRights('availability')
DepartmentAddCluster checkRights('department') keine Änderung
DepartmentAddScope checkRights('scope') keine Änderung
DepartmentDelete checkRights('department') keine Änderung
DepartmentUpdate checkRights('department') keine Änderung
OrganisationAddDepartment checkRights('department') keine Änderung
OrganisationDelete checkRights('organisation') keine Änderung
OrganisationGet checkRights('department') keine Änderung
OrganisationUpdate checkRights('organisation') keine Änderung
OverallCalendarRead checkRights('scope') checkRights('overviewcalendar')
OwnerAddOrganisation checkRights() checkRights('organisation') oder nur Login-Prüfung?
OwnerDelete checkRights() checkRights('organisation') oder nur Login-Prüfung?
OwnerGet checkRights() checkRights('organisation') oder nur Login-Prüfung?
OwnerList checkRights() checkRights('organisation') oder nur Login-Prüfung?
OwnerUpdate checkRights() checkRights('organisation') oder nur Login-Prüfung?
ScopeCalldisplayImageDataDelete checkRights('scope') keine Änderung
ScopeCalldisplayImageDataUpdate checkRights('scope') keine Änderung
ScopeDelete checkRights('scope') keine Änderung
ScopeGet checkRights() checkRights('scope') oder nur Login-Prüfung?
ScopeList checkRights('scope') checkRights('restrictedscope')
ScopePreferedByCluster checkRights() checkRights('scope') oder nur Login-Prüfung?
ScopeUpdate checkRights('scope') keine Änderung

Akzeptanzkriterien

  • Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
  • Nutzer*innen mit der Rolle "Terminadministration" können die Gesamtübersicht aufrufen und Öffnungszeiten anlegen/bearbeiten/löschen
  • Nutzer*innen mit der Rolle "Technische Administration" können die Seite "Behörden und Standorte" sowie alle darunter befindlichen Seiten (Referat, Behörde, Cluster, Standort, Öffnungszeiten) wie gewohnt bedienen und Veränderungen vornehmen: Referat, Behörde, Cluster, Standort und Öffnungszeit anlegen/bearbeiten/löschen
  • Nutzer*innen mit der Rolle "Sachbearbeitung Plus" (agent_queue_plus) können die Seite "Gesamtübersicht" öffnen und Daten abrufen

ZMSKVR-1295 – Umstellung Rechteprüfung – Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen, Wartenummern und Systemkonfiguration

User Story

Als Systemadministrator*in
möchte ich, dass die Rechteprüfung in den Bereichen Freie Tage, Mandanten, Mailtemplates, Benachrichtigungen und Systemkonfiguration auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.

Hintergrundinformationen

Controller:

Controller Aktuell Neu
ConfigGet checkRights('basic') Zu klären: checkRights('config') oder checkRights('counter')
ConfigUpdate checkRights('superuser') checkRights('config')
DayoffList checkRights('superuser') checkRights('dayoff')
DayoffUpdate checkRights('superuser') checkRights('dayoff')
MailAdd checkRights('basic') checkRights('appointment')
MailCustomTemplatesGet checkRights('superuser') checkRights('mailtemplates')
MailDelete checkRights('superuser') keine Änderung
MailGet checkRights('superuser') keine Änderung
MailList checkRights('superuser') keine Änderung
MailTemplatesCreateCustomization checkRights('superuser') checkRights('mailtemplates')
MailTemplatesDelete checkRights('superuser') checkRights('mailtemplates')
MailTemplatesGet checkRights('superuser') checkRights('mailtemplates')
MailTemplatesPreview checkRights('superuser') checkRights('mailtemplates')
MailTemplatesUpdate checkRights('superuser') checkRights('mailtemplates')
NotificationAdd checkRights('sms') checkRights('appointment')
NotificationDelete checkRights('superuser') keine Änderung
NotificationList checkRights('superuser') keine Änderung
ProcessAddLog checkRights('superuser') keine Änderung
SourceUpdate checkRights('useraccount') checkRights('source')
TicketprinterListByScopeList checkRights() checkRights('ticketprinter') oder nur Login-Prüfung?

Akzeptanzkriterien

  • Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
  • Nutzer*innen mit der Rolle "Terminadministration" können die Gesamtübersicht aufrufen und Öffnungszeiten anlegen/bearbeiten/löschen
  • Keine Rolle außer "Technische Administration" darf:
    • Mailtemplates anlegen/bearbeiten/löschen
    • Freie Tage anlegen/bearbeiten/löschen
    • Mandanten anlegen/bearbeiten/löschen
    • Konfiguration auf den Seiten "Wartenummern" und "Wartenummernausgabe am Kiosk" anpassen
    • Systemkonfiguration bearbeiten

ZMSKVR-1296 – Umstellung Rechteprüfung – Sachbearbeitung, Tresen und Warteschlangen

User Story

Als Systemadministrator*in
möchte ich, dass die Rechteprüfung im Bereich Sachbearbeitung und Warteschlange auf die neuen atomaren Berechtigungen umgestellt wird,
damit die schrittweise Ablösung des alten Berechtigungsmodells voranschreitet.

Hintergrundinformationen

Controller:

Controller Aktuell Neu
AppointmentUpdate checkRights() checkRights('appointment') oder nur Login-Prüfung?
CalendarGet checkRights() checkRights('counter') oder nur Login-Prüfung?
ClusterByScopeId checkRights('basic') checkRights('counter')
ClusterGet checkRights('basic') checkRights('counter')
ClusterQueue checkRights('basic') checkRights('waitingqueue')
ClusterWithWorkstationCount checkRights() checkRights('counter') oder nur Login-Prüfung?
CounterGhostWorkstation checkRights('basic') checkRights('counter')
DepartmentByScopeId checkRights('basic') checkRights('counter')
DepartmentGet checkRights('basic') checkRights('counter')
DepartmentList checkRights('basic') checkRights('counter')
OrganisationByCluster checkRights('basic') checkRights('counter')
OrganisationByDepartment checkRights('basic') checkRights('counter')
OrganisationByScope checkRights('basic') checkRights('counter')
OrganisationList checkRights('basic') checkRights('counter')
OwnerByOrganisation checkRights('basic') checkRights('counter')
ProcessDeleteQuick checkRights('basic') checkRights('appointment')
ProcessFinished checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessFree checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessFreeUnique checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessListByClusterAndDate checkRights('basic') checkRights('appointment')
ProcessListByExternalUserId checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessListByScopeAndDate checkRights('basic') checkRights('appointment')
ProcessListByScopeAndStatus checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessNextByCluster checkRights() checkRights('cherrypick') oder checkRights('appointment') oder nur Login-Prüfung?
ProcessNextByScope checkRights() checkRights('cherrypick') oder checkRights('appointment') oder nur Login-Prüfung?
ProcessQueued checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessRedirect checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessReserve checkRights() checkRights('appointment') oder nur Login-Prüfung?
ProcessReservedList checkRights('basic') checkRights('appointment')
ProcessSearch checkRights() checkRights('customersearch') oder nur Login-Prüfung?
ScopeEmergency checkRights() checkRights('emergency') oder nur Login-Prüfung?
ScopeEmergencyRespond checkRights() checkRights('emergency') oder nur Login-Prüfung?
ScopeEmergencyStop checkRights() checkRights('emergency') oder nur Login-Prüfung?
ScopeListByCluster checkRights() checkRights('counter') oder nur Login-Prüfung?
ScopeQueue checkRights('basic') checkRights('waitingqueue')
ScopeWithWorkstationCount checkRights('basic') checkRights('counter')
UserQueue checkRights('basic') checkRights('waitingqueue')
WorkstationDelete checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationGet checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationPassword checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationProcess checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationProcessDelete checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationProcessGet checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationProcessParked checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationProcessWaitingnumber checkRights() checkRights('appointment') oder nur Login-Prüfung?
WorkstationUpdate checkRights() checkRights('appointment') oder nur Login-Prüfung?

Templates (optional)

Aktuell gibt es in den Twig-Templates für die Sachbearbeiter-/Tresenansicht keine explizite Rechteabfrage. Um die verschiedenen Warteschlangen für bestimmte Sachbearbeiter-Rollen auszublenden, muss zmsadmin/templates/block/queue/table.twig angepasst werden:

Schlange Benötigte Permission
Geparkte Termine permission.parkedqueue
Offene Aufrufe / In Bearbeitung permission.openqueue
Warteschlange permission.waitingqueue
Verpasste Termine permission.missedqueue
Abgeschlossene Termine permission.finishedqueue

Akzeptanzkriterien

  • Rechteprüfung in den Controllern wurde entsprechend der Hintergrundinformationen angepasst
  • Nutzer*innen mit der Rolle "Sachbearbeitung beschränkt" (agent_basic) können keine einzige Schlange sehen
  • Nutzer*innen mit der Rolle "Sachbearbeitung" (agent_queue) können alle Schlangen sehen
  • Nutzer*innen mit den Rollen "Sachbearbeitung beschränkt", "Sachbearbeitung" oder "Sachbearbeitung Plus" können:
    • den Notruf aktivieren/zur Hilfe kommen/beenden
    • Termine anlegen/aktualisieren/aufrufen/bearbeiten/abschließen/löschen/etc.

ZMSKVR-1173 – Entfernung der Legacy-Berechtigungsstrukturen

User Story

Als Entwickler*in
möchte ich, dass die veralteten Berechtigungsstrukturen aus dem Code und der Datenbank entfernt werden,
damit der Code wartbar bleibt, keine Verwirrung durch Parallelstrukturen entsteht und technische Schulden abgebaut werden.

Hintergrundinformationen

Nach erfolgreicher Umstellung auf das neue atomare Berechtigungsmodell und Abschluss der Frontend-Migration existieren im System weiterhin Legacy-Strukturen, die nur noch für die Abwärtskompatibilität benötigt wurden:

Komponente Legacy-Struktur
Datenbank Feld „Berechtigung" in nutzer-Tabelle
Entity Berechnete alte Rechte (basic, scope, sms, etc.) in rights-Struktur
Helper Klasse RightsLevelManager
Schema Alte Rechte-Namen in useraccount.json

Vorbedingungen für diese Story:

  • Die Backend-Umstellung auf das atomare Berechtigungsmodell ist abgeschlossen
  • Alle Frontend-Templates verwenden die neuen atomaren Berechtigungen
  • Alle Tests sind auf die neuen Rechte angepasst

Akzeptanzkriterien

  • Das Feld „Berechtigung" wurde per Migration aus der nutzer-Tabelle entfernt
  • Die Berechnung der alten Rechte-Namen in getEntityMapping() wurde entfernt
  • Die Methode reverseEntityMapping() schreibt keine Werte mehr in das Feld Berechtigung
  • Alle Referenzen auf das Feld Berechtigung in SQL-Queries wurden entfernt
  • Die Klasse Helper/RightsLevelManager.php wurde vollständig entfernt
  • Alle Aufrufe von RightsLevelManager::getLevel() und RightsLevelManager::$possibleRights wurden entfernt
  • Die rights-Struktur enthält nur noch die neuen atomaren Berechtigungen
  • Die alten Rechte-Namen (basic, scope, sms, audit, cluster als berechneter Wert) wurden aus der rights-Struktur entfernt
  • Die Methode getDefaults() enthält nur noch die neuen atomaren Berechtigungen

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions