Apps in Salesforce personalisieren
Immer wieder erreichen uns Fragen, wie User die Reiter (In Salesforce und im folgenden Objekte genannt) in ihren jeweiligen Apps in Salesforce auf Ihre Bedürfnisse anpassen können.
Immer wieder erreichen uns Fragen, wie User die Reiter (In Salesforce und im folgenden Objekte genannt) in ihren jeweiligen Apps in Salesforce auf Ihre Bedürfnisse anpassen können.
In vielen Bereichen von Salesforce kommen Sie mit sogenannten Aufgaben und Ereignissen in Kontakt. Diese sind kategorisiert und erstrecken sich über interne Aufgaben wie Anrufe oder Protokolle über sämtliche externen Aufgaben wie Besichtigungen oder Einhaltung von Fristen. Diese Aufgaben lassen sich, wie sämtliche andere Datensätze in Salesforce, in einer klassischen Listenansicht anzeigen und öffnen.
Neben dieser Listenansicht gibt es allerdings noch eine zweite Möglichkeit, die aktuellen Aufgaben und Ereignisse übersichtlich darzustellen. Hierfür gibt es in Salesforce den sogenannten Kalender, der sich wie andere Informationen über den App Launcher starten lässt:
Dieser Kalender lässt sich wie ein gewöhnlicher, digitaler Kalender bedienen. Es gibt beispielsweise verschiedene Ansichten wie die Wochen- und Monatsansicht oder die Möglichkeit, neue Ereignisse zu erstellen.
Um Ihre vorhandenen Aufgaben anzuzeigen, legen Sie einen neuen Kalender an:
Um einen Kalender für Aufgaben zu erstellen, wählen sie im Folgenden das Salesforceobjekt Aufgabe aus und klicken auf weiter.
Anschließend müssen Sie einen Namen angeben und das Datumsfeld auswählen, auf welches sich die jeweiligen Kalendereinträge beziehen sollen. Bei Aufgaben ist das in der Regel das Feld Fälligkeitsdatum. Falls Ihre Aufgaben auch ein Abschlussdatum haben, können Sie dies ebenfalls angeben. Ansonsten lassen Sie das Feld einfach leer und die Aufgabe wird für den gesamten Tag eingetragen.
Jetzt müssen Sie sich noch für einen Filter entscheiden, welche Aufgaben in diesem Kalender angezeigt werden sollen. Diese Filter sind die jeweiligen Listenansichten des im Schritt vorher ausgewählten Salesforceobjektes.
Im letzten Schritt wählen Sie noch das Feld aus, welches als Name für den jeweiligen Eintrag dienen Soll. Im Falle von Aufgaben macht hierbei zum Beispiel das Feld Thema Sinn.
Nach erfolgreichem Abspeichern können Sie diesen erstellten Kalender nun nutzen. Die Einträge des jeweiligen Kalenders werden in der gewählten Farbe dargestellt:
Wie Sie bei der Auswahl des Salesforceobjektes (in unserem Fall Aufgabe) gesehen haben, lassen sich diese Kalender auch für alle anderen Salesforceobjekte erstellen.
Beispielsweise könnten Sie sich sämtliche Kampagnen anzeigen lassen.
In unserem einführenden Artikel Salesforce Prozessautomatisierung 2.0 haben wir die grundsätzlichen Chancen und Probleme der Prozessautomatisierung in Salesforce erläutert. Nun beginnen wir mit einem Deep Dive in das Thema Process Builder und Process Hierarchies in Salesforce und stellen unser Salesforce Process Builder Pattern als Lösungsansatz vor.
Wie werden Prozesse im Process Builder normalerweise erstellt und gemanaged? Ein Prozess in Salesforce besteht grundlegend aus den folgenden Komponenten:
Für jeden Teilprozess wird ein neuer Flow erstellt. Unabhängig davon, ob sich Prozesse einzelne Informationen wie Object oder Criteria teilen. Das führt auf technischer Ebene zu zwei großen Problemen:
Hinzu kommt eine Salesforce-spezifische Problemstellung, die alle Prozesse betrifft: Salesforce Prozesse lassen sich für das Debugging und Testing nicht aus dem Apex Code heraus deaktivieren. Dieses Problem erschwert es, Apex Klassen und Trigger in ihrem eigenen Kontext zu testen.
Die Lösungsidee dieser Probleme teilt sich die Grundsätze mit den – im Salesforce Umfeld bekannten – Implementierungen eines Trigger Patterns. Im Prozessumfeld können wir jedoch fast gänzlich auf Code verzichten.
Jedes Objekt erhält seinen eigenen Prozess als Master, der die weitere Steuerung aller Subprozesse übernimmt. Über diesen Masterprozess lassen sich beispielsweise die Ausführungsreihenfolge und gemeinsame Criterias festlegen.
Wir beginnen die Umsetzung mit der Erstellung eines Masterprozesses. Dieser zeigt auf ein spezifisches Objekt und wird aufgerufen, sobald ein Record erstellt oder verändert wird.
Um Prozesse für einzelne Objekte deaktivierbar zu machen, legen wir zunächst ein Custom Setting an. Dieses Custom Setting enthält eine Checkbox für jeden Masterprozess. Wollen wir die Prozesse für einem Apex Test deaktivieren, so setzen wir die Checkbox des entsprechenden Custom Setting auf true. Um die Prozessautomatisierung durch den Process Builder zu deaktivieren, fragen wir Im Prozess ab, ob das entsprechende Custom Setting auf true oder false steht.
Ist das Custom Setting aktiviert, soll der Prozess abbrechen. Leider lässt sich ein Prozess ohne definierte Action nicht aktivieren. Wir benötigen eine Apex Klasse als Dummy, die unsere Daten nicht verändert. Diese kann wie folgt aussehen:
Mit dieser Klasse wird der Ausführungszweig geschlossen und sämtliche Prozesse auf diesem Objekt nicht ausgeführt. Der Zweig innerhalb des Masterprozesses kann dann zum Beispiel wie folgt aussehen:
Unterscheidung zwischen neuen und geänderten Records
Unser Masterprozess startet sowohl bei neu erstellten, als auch bei geänderten Datensätzen (Records). Um zwischen den beiden Varianten zu unterscheiden, müssen wir diese Abfrage innerhalb des Masterprozesses nachbauen. Dies erfolgt als einfaches Criteria innerhalb des Prozesses.
Um die Ausführung einzelner Subprozesse selbst zu steuern, nutzen wir ein mächtiges Werkzeug im Process Builder: Die Invocable Processes.
Jeder Subprocess wird als aufrufbarer Prozess definiert. Er enthält dasselbe Objekt wie der Masterprozess und wird entsprechend der Anforderungen an Criterias und Actions definiert. Diese Subprozesse können nun in gewünschter Reihenfolge aus dem Masterprozess gestartet werden. Wichtig hierbei ist, dass jeder Ausführungszweig weitergeführt wird, da die Abarbeitung der einzelnen Ausführungszweige (beginnend mit den formulierten Criterias) sonst nicht mehr abgearbeitet wird.
Ein Ausführungsbaum, der bei allen neuen Records ausgeführt wird und eine gewünschte Ausführungsreihenfolge definiert, kann wie folgt aussehen:
Fügt man alle erläuterten Teilschritte zusammen, erhält man ein mächtiges Entwurfsmuster, welches ermöglicht, viele Hürden der Prozessautomatisierung in Salesforce zu umgehen. Darüberhinaus steigt die generelle Qualität der Prozessautomatisierung vor allem in komplexen Salesforce Organisationen um ein Vielfaches.
Zum generellen Verständnis dient folgende Grafik, welche das Vorgehen nochmals bildlich erläutert:
Sollten Sie weiterführende Fragen zum Process Builder Pattern oder anderen Salesforce-Themen haben, nehmen Sie gerne Kontakt zu uns auf. Wir freuen uns auf Ihre Anfrage!
Prozessautomatisierung in Salesforce ist Fluch und Segen zugleich:
Was wäre ein Customer-Relationship-Management-System (CRM) ohne die Möglichkeit, Aufgaben automatisiert ablaufen zu lassen? An dieser Stelle nimmt uns Salesforce einen Großteil der Aufgaben ab und schafft damit Zeit für wichtigere Aufgaben.
Falsch angewandt, kann die Prozessautomatisierung im CRM die Wertschöpfungskette eines Unternehmens auch stark verlangsamen.
Vielleicht haben Sie sich in Ihrem Salesforce schon mit den Folgen schlecht implementierter Prozessautomatisierung auseinandersetzen müssen:
Salesforce gibt uns verschiedene Tools an die Hand, um Geschäftsprozesse in Salesforce abzubilden und zu automatisieren.
Jedes dieser Tools hat unterschiedlichen Anwendungsgebiete, Stärken und Schwächen. Die visuellen Werkzeuge für Flows und Prozesse haben viel Aufmerksamkeit von Salesforce erhalten und ihr Funktionsumfang hat sich stetig erweitert. Durch den Fokus auf diese Tools erkennen wir einen rasanten Anstieg an implementierten Prozessen bei unseren Kunden. Mit der steigenden Zahl implementierter Prozesse, steigen leider auch die oben genannten Probleme.
Weiterhin arbeiten oftmals verschiedene Salesforce Dienstleister im selben Salesforce, welche die beauftragte Prozessautomatisierung ohne Rücksicht auf bestehende Prozessimplementierungen umsetzen. Dieses Verhalten führt zu noch mehr Problemen und noch weniger Nachvollziehbarkeit.
Um diesen Folgen zu begegnen, haben wir eine Methodik geschaffen, um Prozesse in Salesforce zu strukturieren und deren Ausführung nachvollziehbar zu machen. Dieses Muster lässt sich sowohl auf bestehende, als auch auf neu zu implementierende Prozesse anwenden.
Was haben Sie von diesem Muster?
Gerne analysieren wir Ihr Salesforce, geben Ihnen Feedback zum aktuellen Stand und erarbeiten gemeinsam eine Lösungsstrategie. Nehmen Sie dazu gerne Kontakt zu uns auf.
Eine technische Erläuterung finden Sie im Artikel Process Builder Pattern.
Viele Administratoren kennen das Problem: Ist eine Salesforce Organisation historisch gewachsen, fehlt irgendwann nicht nur ein übergreifendes Berechtigungskonzept, sondern es herrscht auch Unsicherheit über bisher vergebene Berechtigungen. Das kann schnell zu einem gravierenden Problem im Bereich Compliance und Fehleranalyse werden.
Möchte man einem User beispielsweise die Berechtigungen für ein bestimmtes Objekt entziehen, nehmen viele Administratoren den langen Weg auf sich, sämtliche zugewiesenen Permission Sets händisch zu durchsuchen. Noch schwieriger wird es, wenn sich die folgende Fragestellungen stellt:
Welche Profile oder Permission Sets vergeben Rechte für ein bestimmtes Objekt?
Spätestens hier ist der Umweg über eine manuelle Suche im System kaum mehr umsetzbar. Glücklicherweise liefert uns die hinter Salesforce stehende Datenbank die Möglichkeit, solche Fragen mit wenigen Klicks zu beantworten.
Salesforce behandelt Berechtigungen intern als eigenständige Datensätze, welche mit Profilen verknüpft sind (die wiederum mit Usern verknüpft sind). Diese Datensätze lassen sich über die Salesforce-eigene Datenbanksprache SOQL abfragen:
SELECT Id, IsOwnedByProfile, Label FROM PermissionSet
Über das Feld IsOwnedByProfile können wir sofort sehen, ob es sich um eigenständige oder durch ein Profil vergebene Berechtigungssätze handelt:
SELECT Id, IsOwnedByProfile, Label FROM PermissionSet WHERE IsOwnedByProfile = TRUE
Mithilfe dieses Mittels können wir nun auch beispielhalft die folgende Fragen beantworten:
„Welche Nutzer haben Schreibzugriff auf Accounts? Und woher stammt diese Berechtigung?“
SELECT Assignee.Name, PermissionSet.Id, PermissionSet.IsOwnedByProfile, PermissionSet.Profile.Name, PermissionSet.Label FROM PermissionSetAssignment WHERE PermissionSetId IN (SELECT ParentId FROM ObjectPermissions WHERE SObjectType = 'Account' AND PermissionsRead = TRUE )
Auch komplexere Fragen lassen sich so leicht beantworten:
„Welche Felder auf Account kann Christian Blechert sehen und welche kann er verändern? Woher stammen diese Berechtigungen?“
SELECT Id, Field, SObjectType, PermissionsRead, PermissionsEdit, Parent.Label, Parent.IsOwnedByProfile FROM FieldPermissions WHERE (ParentId IN ( SELECT PermissionSetId FROM PermissionSetAssignment WHERE Assignee.Name = 'Christian Blechert')) AND (PermissionsRead = TRUE) AND (SObjectType = 'Account')
Wie im einleitenden Absatz angemerkt, lässt sich die Fragestellung auch umkehren.
„Wie kann ich herausfinden, welche Profile Berechtigungen für ein spezifisches Objekt vergeben?“
SELECT Profile.Name FROM PermissionSet WHERE IsOwnedByProfile = TRUE AND Id IN ( SELECT ParentId FROM ObjectPermissions WHERE PermissionsRead = TRUE AND SObjectType = 'Account' )
Führen wir diese Anfrage in Salesforce – beispielsweise über die Workbench – aus, erhalten wir eine Auflistung aller Profile mit Zugriff auf das Standardobjekt Account:
Das Zusammenspiel der klassischen Salesforce-Oberfläche, der dahinterliegenden Datenbank und von SOQL-Abfragen eröffnet viele Möglichkeiten, Datensätze und Informationen schnell anzuzeigen und gegebenenfalls zu verändern.
Erkennen Sie Hürden aus Ihrem Salesforce wieder oder wünschen eine detaillierte Aufarbeitung Ihres Berechtigungskonzepts? Wir unterstützen Sie gerne, melden Sie sich bei uns.