Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

...

Inhalt

...

maxLevel

...

2

...

Status
colourGreen
titleENTWICKLUNG

...

Maik Stüker

...

Jira
serverNuclos Issue Tracking
keyNUCLOS-2726

Ziele

  • Nuclos soll um ein hierarchisches Mandantenwesen erweitert werden.

Hintergrund und strategische Eignung

...

Definition

Menüaufruf: (Administration) - (Mandantenwesen) 

Nuclos besitzt die Fähigkeit, mehrere Mandanten oder Mandanteninstanzen zu unterstützen. Ein Mandant ist in diesem Kontext eine unabhängige Geschäftseinheit oder Organisation, die die Software nutzt, und jede Mandanteninstanz ist eine separate Umgebung, die spezifische Daten, Einstellungen und Benutzer für diese Organisation enthält.

Hierbei steht das Zusammenspiel aus Berechtigung, Anmeldung und Einschränkung von Suchergebnissen eine entscheidende Rolle. Berechtigung und Einschränkung sind aktuell nur über Datensatzfreigaben realisierbar. Es fehlt aber eine Auswahl am Logindialog. Das neue Mandantenwesen soll transparenter im System integriert sein, ein eingerichteter Mandant, die Konfiguration eines Businessobjekts mit Mandantenabhängigkeit und eine Zuweisung zum Benutzer soll genügen.


Annahmen

  • Mandanten werden als Instanzabhängig betrachtet, nicht Teil eines Nuclets
  • Benutzer werden Mandanten zugewiesen (m:n)
  • Unterschiedliche Layouts und Statusmodelle werden nicht benötigt
  • Mandanten wird man in einer Hierarchie (Ebenen) anlegen. Beispiel (Land, Bundesland, Stadt):
    • Deutschland
      • Bayern
        • München
      • Berlin
        • Berlin
  • Ein Businessobjekt wird immer nur Mandanten einer bestimmten Ebene zugeordnet. Also z.B. der Ebene 2 im Beispiel einem Bundesland.
  • Auch in einer Instanz mit Mandanten muss nicht jedes Businessobjekt mandantenabhängig sein. Die Entscheidung soll für jedes Businessobjekt einzeln gefällt werden können.
  • Soll auch für einen Superuser greifen


Anforderungen

#BeschreibungNuclos VersionNotizen
1Neues SystemBO "Mandant"4.2
  • T_MD_MANDATOR
  • PK: UID
  • Name, Beschreibung
  • Referenz auf sich selbst (STRUID_PARENTMANDATOR) -> hierarchisches Mandantenwesen
2Neues SystemBO "Mandanten Parameter"

...


  • Statt Mandanten Parametern können in den Nuclet Parametern pro Mandant ein Wert definiert werden.
3Neues SystemBO "Mandanten Parameter Wert"4.2
  • T_MD_MANDATOR_PARAM_VALUE
  • PK: UID
  • Wert
  • Referenz auf Mandant und Nuclet Parameter
  • Dies ist optional, wird kein spezifischer Wert angegeben, so greift der Default Wert im Nuclet Parameter selbst.
4Neues SystemBO "Mandanten Zuordnung"4.2
  • T_MD_MANDATOR_USER
  • PK: UID
  • Referenz auf Mandant und User

(Warnung) Wird eine Benutzerzuordnung nicht auf einen Mandanten eingeschränkt, so gilt sie für alle Mandanten

5BO Wizard um Konfiguration der Mandantenabhängigkeit erweitern4.2
  • Tabellen erhalten eine neue Spalte STRUID_NUCLOSMANDATOR

(Warnung) Die Mandantenabhängigkeit ist nicht Teil des Nuclets und muss ggf. beim Kunden nach dem Nucletimport manuell nachkonfiguriert werden.

5aNeues SystemBO "Mandanten Ebene"4.2
  • T_MD_MANDATOR_LEVEL
  • PK: UID
  • Beschriftung
  • Referenz auf sich selbst (STRUID_PARENTLEVEL)
  • Wird automatisch verwaltet. Erste Ebene wird mit dem ersten Mandanten erzeugt. Weitere Ebene folgen automatisch wenn von der Möglichkeit einer übergeordneten Ebene Gebrauch gemacht wird. In der Administration der Ebene (Einstieg über die Mandanten Maske) kann nur die Beschriftung der Ebene geändert werden.
6Existiert für ein BO eine Abhängigkeit, wird automatisch in Suchergebnislisten, Unterformulare, Aufgabenlisten, Datenquellenergebnissen eingeschränkt4.2
  • Mit der Anmeldung wird eine Liste der für diese Session gültigen Mandanten generiert (und gecached) und immer den Statements als IN angehängt. WHERE STRUID_NUCLOSMANDATOR IN (...)
  • Eine Berechtigung auf "Deutschland" beinhaltet auch automatisch alle darunter liegenden Ebenen.
  • Beispiel: Anmeldung "Deutschland" = Liste von Mandanten ("Deutschland", "Bayern", "München", "Berlin", "Berlin")
  • Beispiel: Anmeldung "Bayern" = Liste von Mandanten ("Deutschland", "Bayern", "München")
  • Siehe auch Punkt 12 u. 13
7Neue Datensätze werde automatisch mit dem angemeldeten Mandanten verknüpft, falls erforderlich4.2
  • Meldet man sich mit einer höheren Ebene an (im Beispiel mit einer Stadt = Ebene 3) das BO fordert aber Ebene 1, so wird der Hierarchie entsprechend der Mandant aus Ebene 1 verwendet
  • Meldet man sich mit einer niedrigeren Ebene an (im Beispiel mit einem Bundesland = Ebene 2) das BO fordert aber Ebene 3, wird eine Dropdown mit den zur Auswahl stehenden Mandanten der Ebene 3 angeboten. Die Berechtigung des Benutzer muss berücksichtigt werden. Enthält die Auswahl nur einen Eintrag wird dieser automatisch selektiert.
  • Zu klären: Wo und wird die Dropdown dargestellt?
8Der Loginbildschirm wird um die Auswahl des Mandanten erweitert4.2
  • Auswahl soll nur nötig sein, wenn der Benutzer mehr als einen Mandanten zur Auswahl hat
  • Auswahl erscheint erst nach erfolgreicher Authentifizierung
  • Stellt die Auswahl mehr als einen Mandanten zur Verfügung wird der zuletzt verwendete vorselektiert. Der Benutzer hat dann 5 Sekunden Zeit einen anderen Eintrag zu wählen, bevor die Anmeldung den Client öffnet. Der Timer wird unterbrochen, sobald der Benutzer die Mandanten-Dropdown anklickt.
9Arbeitsumgebungen merken sich die zuletzt geöffneten Tabs abhängig pro Mandant

...

4.5
10Nuclet Zuweisung und Transfer um Mandanten Parameter erweitern

...



11Klassen Generierung für Mandanten Parameter und ParameterProvider erweitern

...


  • Man wird nicht direkt mit den Mandanten arbeiten. Nuclos wird automatisch, je nach Abhängigkeit der Daten und/oder Anmeldung des Benutzers die Abfragen (auch in Regeln!) einschränken.
  • Siehe auch Punkt 14
12Datenquellen Ausführung erweitern4.3
  • Ist die Datenquellen mit dem normalen Modell (nicht manuelles SQL Statement) erstellt worden, so werden alle verwendenden Tabellen auf den angemeldeten Mandanten eingeschränkt, sofern solch eine Abhängigkeit besteht.
  • Eine Datenquelle, basierend auf einem manuellen SQL wird nicht automatisch auf Mandanten eingeschränkt, da die Ermittlung hierfür zu komplex und fehleranfällig wäre.

...

  • In Datenquellen steht dafür der Parameter "$mandator" zur Verfügung, der zu einer Liste der UIDs der für den aktuellen Benutzer gültigen mandanten ausgewertet wird. Dementdprechend sollte der Wert immer mit einem "IN" eingebunden werden. Beispiel: "T3.STRUID_NUCLOSMANDATOR in ('$mandator')"
  • Siehe auch Punkt 6
13Neue Berechtigung auf SQL Ebene einer Datenquelle4.3
  • Nur wenn ein Benutzer über dieses Recht verfügt kann er eigene SQL Statements in Datenquellen verfassen. Ansonsten bleibt ihm nur das normale Modell. Mit entsprechendem Wissen könnte man ansonsten die Mandanteneinschränkung aushebeln.
14Optionale Mandanten Provider4.2
  • Nuclos wird automatisch, je nach Abhängigkeit der Daten und/oder Anmeldung des Benutzers die Abfragen (auch in Regeln!) einschränken. Wenn allerdings ein Job Datensätze in einem mandantenabhängigen BO anlegen muss, so stellt sich die Frage "Wie wird der Mandant ermittelt?". Für solche Fälle, und auch weil ein Nuclet Produzent die zukünftige Einrichtung der Mandanten seiner Kunden nicht kennt, können Provider individuell pro Kunde implementiert werden.
  • Jedes mandantenabhängige BO erhält ein neues Interface mit dem Namen "NuclosMandatorProvider". Findet Nuclos eine Implementierung in den Server Regeln, so wird die Methode "getNuclosMandatorId(<BusinessObject>) aufgerufen und der zurückgelieferte Mandant im Datensatz eingetragen. Dies geschieht noch vor einer InsertRule und auch nur, wenn nicht schon durch die Verarbeitung anderer Daten eine Mandantenabhängigkeit ermittelt werden konnte. Letzteres könnte z.B. der Fall sein, wenn man durch vorhandene Aufträge iteriert, welche ebenfalls die gleiche Mandantenabhängigkeit ausweisen.
  • Ein Beispiel, wann man solch einen Provider benötigt, könnte ein Rechnungsimport Job sein. Dieser verarbeitet Rechnungen im XML Format für alle Mandanten des Systems. Allerdings würde er keine Rechnungen mehr anlegen, wenn die Rechnung mandantenabhängig ist und solch ein Provider nicht implementiert wird. In der Implementierung steht die anzulegende Rechnung zur Verfügung, womit ein eigens für diesen Zweck geschaffenes Mapping aus Land, PLZ und Straße abgefragt wird. Teil des Mappings ist auch eine Referenz auf einen Mandanten welcher dann letztendlich zurückgeliefert wird. Der Mandant ist somit gefüllt und die Verarbeitung kann normal fortgesetzt werden.
Hinweis

Die Implements Anweisung muss das Interface mit dem Vollqualifizierten Namen (mit Java Package) ansprechen, da ansonsten Nuclos die Zuweisung zum BO nicht identifizieren kann.

Beispiel

Codeblock
languagejava
titleInvoiceMandatorProvider
package com.buymore;
import org.nuclos.api.UID;
public class InvoiceMandatorProvider implements 
com.buymore.Invoice.NuclosMandatorProvider // <-- Wichtig, hier vollqualifiziert!
{
	@Override
	public UID getNuclosMandatorId(Invoice inv) {
		// Anhand der Informationen aus der Invoice den Mandanten ermitteln, 
		// z.B. aus einem Mapping Rechnungsadresse<->Mandant
		throw new RuntimeException("Not implemented");
	}
}


 

15Mandant Teil des Unique SchlüsselsOFFEN
16Jobs
(Warnung) Einem Job, der mandantenabhängige BO's erzeugt muss entweder mitgegeben werden, für welche Mandaten der Job ausgeführt werden soll (er läuft dann mehrfach, je einmal pro Mandant) oder es muss das entsprechende NuclosMandatorProvider  - Interface für dieses BO implementiert werden, was den Mandanten für das neu erzeugte BO ermittelt.


Benutzerinteraktion und -design

Mandanten bzw. die Hierarchie wird in einer neuen Maske in der Administration konfiguriert. Die Parameter Werte für Mandanten werden im Nuclet Management bei den Parametern gepflegt.

Fragen

Unten finden Sie eine Liste von Fragen, die aufgrund dieses Anforderungsdokuments angesprochen werden müssen:

FrageErgebnis
Sollte der Mandant immer Teil des Unique Schlüssels sein oder nur bei Bedarf?

...


Welche Felder benötigt der Mandant ein Parameter noch?

...

Nucletparameter können für Mandanten spezifische Werte annehmen
Man kann eine Ebene nachträglich nur schwer zwischen vorhandenen platzieren. Z.B. man hat Anfangs die "Bundesländer" nicht gebraucht. Sollte man Ebenen extra Definieren?Ja, werden extra definiert. Es kann allerdings nur die Beschriftung geändert werden. (Siehe auch Punkt 5a)
Zu klären: Defaultbelegung bestehender Datensätze bei nachträglicher Einführung der Mandantenfähigkeit in einer Entität?Ja, sind bereits Daten vorhanden, so muss ein Default Mandant ausgewählt werden.
Zu klären: Verletzung der "referentiellen Integrität" bei Umhängen eines referenzierten Datensatzes zu einem anderen Mandanten kann nicht über die DB abgefangen werden. Aus Sicht des vorherigen Mandanten kommt das Umhängen aber einer Löschung gleich, darf also nicht zulässig sein, wenn referenziert.

Wird nicht zugelassen. Für eine nachträgliche Einführung und Aufteilung auf Mandanten muss eine Migration auf Datenbank Ebene entwickelt werden. Nuclos bietet hierfür vorerst keine Unterstützung an.

Zu klären: Dropdowns und LOVs müssen ebenfalls dynamisch auf die für den jeweiligen Mandatenkontext sichtbaren Daten eingeschränkt werden. Was genau ist der Mandantenkontext? Alle hierarchisch unter dem angemeldeten Mandanten hängenden Mandanten?Umgesetzt. Ein Mandantenkontext besteht aus der Schnittmenge der Anmeldung plus den Mandanten des zu verarbeitenden Datensatzes. Dabei wird immer der komplette Baum der Hierarchie (Siehe auch Punkt 6) herangezogen. Somit erfolgt auch eine Einschränkung von LOV & Co. bei einem Superuser

...

Verworfen

...

.