# FlexDMA Schnelleinstieg Das nachfolgende Tutorial bietet einen Schnelleinstieg in die wichtigsten Features der Workflow-Engine FlexDMA am Beispiel eines Reiseantragsworkflows. ![](img/prozessdiagramm.svg) ## Schrittweises Vorgehen in der Entwicklungsumgebung ### Neues Prozessmodell anlegen ![](img/entwicklungsumgebung_schritt_1.png) Es beginnt mit einen Klick auf den Button __Neues Prozessmodell anlegen__. ![](img/entwicklungsumgebung_schritt_2.png) Danach erhalten Sie ein neues leeres Prozessmodell, in dessen Schema bereits ein minimales Code-Beispiel mit einem einzelnen Attribut (sample) bereitgestellt wird. ![](img/entwicklungsumgebung_schritt_3.png) Danach können Sie im Reiter Schema das Datenmodell ihres Prozessmodells definieren. Es soll am Ende alle Felder enthalten, die in den Prozessschritten benötigt werden. ### Vollständiges Schema des Beispiel-Reiseantrags ```yaml schema_uniquename: tutorial_reiseantrag schema_title: Beispiel Reiseantrag initial_status: initial types: hotel: attributes: - attribute_name: name label: Name type: string control: textbox - attribute_name: kosten label: "Kosten" type: string regex: "^[0-9]+(,[0-9]+)?$" control: textbox reisetyp: attributes: - attribute_name: typ label: Reisetyp type: string control: textbox loader: type: python code_location: "tutorial_reiseantrag/loaders/reisetyp.py" attributes: - attribute_name: reisetyp label: "Typ der Reise" type: reisetyp control: select required: true - attribute_name: vorname label: Vorname type: string control: textbox required: true - attribute_name: nachname label: Nachname type: string control: textbox required: true - attribute_name: zielort label: Zielort type: string control: textbox - attribute_name: beginn label: Reisebeginn type: date control: datepicker - attribute_name: ende label: Reiseende type: date control: datepicker - attribute_name: uebernachtungen label: "Übernachtungen" type: hotel cardinality: many control: tableedit - attribute_name: genehmigungskommentar label: "Kommentar der/des Vorgesetzten" type: string control: textarea ``` Für das Attribut _reisetyp_ vom Typ _reisetyp_ ist im Schema ein dynamisches Laden mittels eigenem Code in Python oder SQL vorgesehen worden. Aus diesem Grund muss als nächstes die dafür vorgesehene Funktion im Reiter __Code__ definiert werden. Wie das geht zeigt der nächste Screenshot. ![](img/entwicklungsumgebung_schritt_4.png) Damit sind die grundlegenden Arbeiten an unserem Prozessmodell abgeschlossen und wir können uns nun um die Abbildung der einzelnen Prozessschritte kümmern. ### Abbildung der Prozessschritte als Views Durch einen Klick auf den Button __View hinzufügen__ in der folgenden Maske kann eine neue View angelegt werden. ![](img/entwicklungsumgebung_schritt_6.png) Nach dem Klick erscheint ein Dialog, der bereits einen Code-Vorlage für die Erstellung der View mit empfehlungen für die verpflichtend zu definierenden und einige weitere Attribute beinhaltet. ![](img/entwicklungsumgebung_schritt_7.png) Dieser Code kann nun vor dem tatsächlichen Anlegen der View noch wie im folgenden Screenshot angepasst werden. ![](img/entwicklungsumgebung_schritt_8.png) Nach dem Klick auf __View anlegen__ erscheint die neue View dann in einem neuen Tab im Quellcodeeditor. ![](img/entwicklungsumgebung_schritt_9.png) Dort lässt sie sich über den Button __View-Vorschau__ auch schon so betrachten, wie sie in der finalen Anwendung dann aussehen wird. ![](img/entwicklungsumgebung_schritt_10.png) Nun kann die View des Antragstellers so gestaltet werden, wie sie final aussehen soll. ![](img/entwicklungsumgebung_schritt_11.png) Das hat dann in der Vorschau das folgende Resultat: ![](img/entwicklungsumgebung_schritt_12.png) Hier noch der vollständige Code unserer ersten View: ```yaml view_for: "tutorial_reiseantrag" # Bezieht sich auf schema_uniquename title: "Reiseantrag anlegen" state: initial roles_allowed: - role: reisende restricted_by: "username == owner_username" transitions: - name: "to_beantragt" label: "Antrag stellen" state: "beantragt" - name: "to_initial" label: "Zwischenspeichern" state: "initial" tabs: - name: "Allgemein" panels: - name: "Stammdaten" visible_attributes: - nachname - vorname - name: "Reisedaten" visible_attributes: - reisetyp - zielort - beginn - ende ``` Damit ist die erste View unseres Prozessmodells erfolgreich erzeugt. Im Code-Abschnitt __transitions__ enthält unsere erste View übrigens auch schon den Übergang zur nächsten View __Reiseantrag prüfen__, die für Nutzende mit der Rolle _vorgesetzte_ bereitsteht und alle Anträge im Status _beantragt_ zur Bearbeitung bereitstellt. Über die Einschränkung (__restricted_by__) wird festgelegt, dass Reisende in dieser View nur ihre eigenen Reiseanträge sehen dürfen. ### Eine View für Reiseantrag prüfen anlegen Das Vorgehen zur Anlage der View _Reiseantrag prüfen_ ist exakt das gleiche wie bei der View _Reiseantrag stellen_. Der resultierende Code sieht wie folgt aus: ```yaml view_for: "tutorial_reiseantrag" # Bezieht sich auf schema_uniquename title: "Reiseantrag prüfen" state: beantragt roles_allowed: - role: vorgesetzte transitions: - name: "to_initial" label: "Antrag ablehnen" state: "initial" post_transition: code_location: "tutorial_reiseantrag/transitions/send_email.py" - name: "to_genehmigt" label: "Antrag genehmigen" state: "genehmigt" post_transition: code_location: "tutorial_reiseantrag/transitions/send_email.py" tabs: - name: "Allgemein" panels: - name: "Stammdaten" visible_attributes: - nachname - vorname - name: "Reisedaten" visible_attributes: - reisetyp - zielort - beginn - ende - name: "Kommentare" visible_attributes: - genehmigungskommentar readonly_fields: - vorname - nachname - zielort - beginn - ende ``` Die Maske enthält nun einige Felder, die vom Vorgesetzten nicht bearbeitet werden dürfen, eine E-Mail-Benachrichtigung an den Antragsteller bei Genehmigung und Ablehnung sowie vollständige Sichtrechte aller Nutzer mit der Rolle __vorgesetzte__ auf alle Anträge im Status __beantragt__. Die Vorschau der Maske: ![](img/vorschau_view_2.png) Auf die gleiche Weise werden nun alle weiteren laut Prozessdiagramm erforderlichen Views erzeugt. Das von FlexDMA automatisch generierte Diagramm zum abgebildeten Prozess sieht wie folgt aus: ![](img/prozessdiagramm_flexdma_generated.png) Ein Durchlauf durch den daraus resultierenden Prozess wird im folgenden Video gezeigt. ![](img/Bildschirmaufzeichnung.webm)