Freigabe-Prozess für ein (zu individualisierendes) Druckprodukt aus dem Closed Shop

Beschreibung

Ein User erstellt und bestellt ein Produkt (Draft) für das eine Freigabe nötig ist.
Daraufhin wird eine Bestellbestätigung versendet und die Bestellung ist im Admin-Bereich sichtbar.

Zusätzlich erhalten vordefinierte Empfänger (printformer User) eine Freigabemail.
Sie können durch diese den Entwurf (Draft) freigeben oder ablehnen und kommentieren.

Verlauf 1:
Der Draft wird freigegeben, daraufhin wird (per Workflow) der Bestellstatus auf Angenommen gesetzt und die Druckdaten werden automatisch generiert (sowie falls vorhanden an den Produzenten gesendet).
Der Besteller erhält eine Benachrichtigung darüber, dass der Draft freigegeben wurde.

Verlauf 2:
Wird der Draft abgelehnt läuft die Bestellung ins Leere. Der Besteller erhält eine Benachrichtigung mit dem Grund der Ablehnung.
Wird der Draft kommentiert (überarbeiten) erhält der Besteller erhält eine Benachrichtigung und kann anhand der Kommentare sowie einem Link in der E-Mail den Draft entsprechend korrigieren.
(Ebenso können Callbacks an andere Systeme geschickt werden. In diesem Fall wartet der Workflow auf die Antwort der API.)
Nach der Anpassung des Drafts (Bestätigung der Preview) startet der Workflow (Freigabe-Prozess) dann erneut.

Workflow Definition

Über Workflow-Definitionen hinzufügen (Workflow > Definitionen) wird der Workflow definiert.

Unter Typ wird der gewünschte Name des Workflows eingegeben und ggf. der gewünschte Mandant (sofern mehr als ein Mandant im System vorhanden sind) ausgewählt.
Die Maximale Anzahl der Instanzen beträgt in der Regel 1.

Unter Konfiguration wird dann der unten stehende Beispiel-Workflow eingefügt.

Hinweis: zur Verwendung dieser Vorlage muss der User Identifier des im jeweiligen printformer System bestehenden Benutzer an den Stellen INSERT USER IDENTIFIER HERE eingefügt werden.

{
  "places": [
    "start",
    "Approval",
    "TryAgain",
    "Approved",
    "Rejected",
    "end"
  ],
  "actions": {
    "places": {
      "Approval": {
        "enter": [
          {
            "args": {
              "locale": "'de'",
              "template": "'preview-approval'",
              "variables": {
                "url": "url.auth(getUser('INSERT USER IDENTIFIER HERE'), url.userAction('preview-approval'))"
              },
              "recipients": "[getUser('INSERT USER IDENTIFIER HERE').email]",
              "recipientsCC": "[]",
              "recipientsBCC": "[]"
            },
            "action": "send-mail"
          }
        ]
      },
      "Approved": {
        "enter": [
          {
            "args": {
              "data": {
                "approval-status": "'approved'"
              }
            },
            "sync": true,
            "action": "modify-draft-custom-attribute"
          },
          {
            "args": {
              "locale": "'de'",
              "template": "'preview-approved'",
              "variables": [],
              "recipients": "[user.email]",
              "recipientsCC": "[]",
              "recipientsBCC": "[]"
            },
            "action": "send-mail"
          }
        ]
      },
      "Rejected": {
        "enter": [
          {
            "args": {
              "data": {
                "approval-status": "'rejected'"
              }
            },
            "action": "modify-draft-custom-attribute"
          },
          {
            "args": {
              "locale": "'de'",
              "template": "'preview-rejected'",
              "variables": {
                "reason": "wf('reason')"
              },
              "recipients": "[user.email]",
              "recipientsCC": "[]",
              "recipientsBCC": "[]"
            },
            "action": "send-mail"
          }
        ]
      },
      "TryAgain": {
        "enter": [
          {
            "args": {
              "locale": "'de'",
              "template": "'try-again'",
              "variables": {
                "url": "url.auth(user, url.editor(draft, null, url.cmsPageUrl('aenderungen-gemacht', null)))",
                "reason": "wf('reason')"
              },
              "recipients": "[user.email]",
              "recipientsCC": "[]",
              "recipientsBCC": "[]"
            },
            "action": "send-mail"
          }
        ]
      }
    },
    "transitions": {
      "Skip": [
        {
          "args": {
            "data": {
              "approval-status": "'approved'"
            }
          },
          "action": "modify-draft-custom-attribute"
        }
      ],
      "triedAgain": [
        {
          "args": {
            "data": "{'approved': null}"
          },
          "sync": true,
          "action": "modify-data"
        }
      ],
      "SetDraftOrdered": [
        {
          "args": {
            "order": "draft.project.order",
            "status": "'Angenommen'"
          },
          "action": "set-order-status"
        }
      ],
      "SetDraftAbgelehnt": [
        {
          "args": {
            "order": "draft.project.order",
            "status": "'Abgelehnt'"
          },
          "action": "set-order-status"
        }
      ]
    }
  },
  "transitions": {
    "Skip": {
      "to": [
        "Approved"
      ],
      "from": [
        "start"
      ],
      "guard": [
        "draft.project.product.customAttributes.requiresApproval === false"
      ]
    },
    "Approval": {
      "to": [
        "Approval"
      ],
      "from": [
        "start"
      ],
      "guard": []
    },
    "TryAgain": {
      "to": [
        "TryAgain"
      ],
      "from": [
        "Approval"
      ],
      "guard": [
        "wf('approved') === 'try-again'"
      ]
    },
    "Approving": {
      "to": [
        "Approved"
      ],
      "from": [
        "Approval"
      ],
      "guard": [
        "wf('approved') === 'approved'"
      ]
    },
    "Rejection": {
      "to": [
        "Rejected"
      ],
      "from": [
        "Approval"
      ],
      "guard": [
        "wf('approved') === 'rejected'"
      ]
    },
    "triedAgain": {
      "to": [
        "Approval"
      ],
      "from": [
        "TryAgain"
      ],
      "guard": [
        "draft.progress === 'complete'"
      ]
    },
    "SetDraftOrdered": {
      "to": [
        "end"
      ],
      "from": [
        "Approved"
      ],
      "guard": [
        "draft.project.order.everyDraftAttribute('approval-status', 'approved')"
      ]
    },
    "SetDraftAbgelehnt": {
      "to": [
        "end"
      ],
      "from": [
        "Rejected"
      ],
      "guard": []
    },
    "Warte-auf-andere-freigaben": {
      "to": [
        "end"
      ],
      "from": [
        "Approved"
      ],
      "guard": [
        "draft.project.order.everyDraftAttribute('approval-status', 'approved') === false"
      ]
    }
  },
  "userActions": {
    "Approval": {
      "try-again": {
        "args": {
          "footer": "cmsBlockContent('preview-approval-footer')",
          "header": "cmsBlockContent('preview-approval-header')",
          "buttons": {
            "cancel": {
              "label": "'Abbrechen'",
              "redirect": "url.userAction('preview-approval')"
            },
            "submit": {
              "label": "'Übermitteln'",
              "inputs": [
                {
                  "name": "'reason'",
                  "type": "'textarea'",
                  "label": "'Bitte hier Begründung abgeben:'",
                  "required": false
                }
              ],
              "redirect": "url.cmsPageUrl('preview-approval-not-okay')",
              "propChange": {
                "prop": "'approved'",
                "value": "'try-again'"
              }
            }
          },
          "description": "cmsBlockContent('preview-approval-description')"
        },
        "user-action": "feedback"
      },
      "preview-approval": {
        "args": {
          "pages": {
            "show": {
              "files": [
                {
                  "file": "draft.preview",
                  "label": "'Vorschau PDF'"
                }
              ],
              "links": [
                {
                  "link": "'approve'",
                  "label": "'Freigeben'"
                },
                {
                  "label": "'Überarbeiten'",
                  "redirect": "url.userAction('try-again')"
                },
                {
                  "link": "'decline'",
                  "label": "'Ablehnen'"
                }
              ],
              "footer": "cmsBlockContent('preview-approval-footer')",
              "header": "cmsBlockContent('preview-approval-header')",
              "description": "cmsBlockContent('preview-approval-description')"
            },
            "approve": {
              "footer": "cmsBlockContent('preview-approval-footer')",
              "header": "cmsBlockContent('preview-approval-header')",
              "buttons": {
                "cancel": {
                  "link": "'show'",
                  "label": "'Nein'"
                },
                "submit": {
                  "label": "'Ja'",
                  "redirect": "url.cmsPageUrl('preview-approval-okay')",
                  "propChange": {
                    "prop": "'approved'",
                    "value": "'approved'"
                  }
                }
              },
              "description": "cmsBlockContent('preview-approval-description')"
            },
            "decline": {
              "footer": "cmsBlockContent('preview-approval-footer')",
              "header": "cmsBlockContent('preview-approval-header')",
              "buttons": {
                "cancel": {
                  "link": "'show'",
                  "label": "'Abbrechen'"
                },
                "submit": {
                  "label": "'Übermitteln'",
                  "inputs": [
                    {
                      "name": "'reason'",
                      "type": "'textarea'",
                      "label": "'Bitte hier Begründung abgeben:'",
                      "required": false
                    }
                  ],
                  "redirect": "url.cmsPageUrl('preview-approval-not-okay')",
                  "propChange": {
                    "prop": "'approved'",
                    "value": "'rejected'"
                  }
                }
              },
              "description": "cmsBlockContent('preview-approval-description')"
            }
          }
        },
        "user-action": "file-approval-with-feedback"
      }
    },
    "Approved": {
      "try-again": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      },
      "preview-approval": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      }
    },
    "Rejected": {
      "try-again": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      },
      "preview-approval": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      }
    },
    "TryAgain": {
      "try-again": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      },
      "preview-approval": {
        "args": {
          "page": {
            "identifier": "'preview-approval-nothing-to-see-here'"
          }
        },
        "user-action": "view-cms-content"
      }
    }
  },
  "initialPlace": [
    "start"
  ]
}
   
CODE

Workflow Hook

Durch den Hook wird nun festgelegt, dass der Workflow durch die ausgelöste Bestellung startet.

Über Workflow-Hook hinzufügen (Workflow > Hooks) wird dieser angelegt.
Als Event wird im Drop-Down-Menü Nach Bestellung eines Entwurfs ausgewählt und die (vorher angelegte) Workflow-Defintion angeklickt (ggf. muss wie beim Einreichten der Definition ein Mandant gewählt werden)

Weitere Einstellungen

CMS > Seiten

Folgende CMS-Seiten müssen hinzugefügt werden:

  1. preview-approval-not-okay

  2. preview-approval-okay

  3. preview-approval-nothing-to-see-here

  4. aenderungen-gemacht

CMS > Blöcke

Folgende CMS-Blöcke müssen hinzugefügt werden:

  1. preview-approval-header

  2. preview-approval-description

  3. preview-approval-footer

Mailverwaltung

Folgende Mail-Templates inkl. Template Verwendungen und Template Zuweisungen müssen erstellt werden:

  1. preview-approval (benötigt ein call-to-action Mail-Template)

  2. preview-rejected

  3. preview-approved

  4. try-again (hier muss in einem der Textfelder der DataKey ${reason} eingegeben werden)

In den Screenshots wurden jeweils Beispiel-Texte für Betreff, Begrüßung, E-Mail-Inhalt und Footer eingesetzt. Diese sowie die DataKeys-Platzhalter können frei gewählt werden.

Die in den Screenshots markierten Angaben müssen identisch übernommen werden.

Mail-Templates

Template Verwendungen

Template Zuweisungen

Ggf. muss hier zusätzlich der Mandant zugewiesen werden.

Produkt Attribut anlegen und Produkt(e) im Shop bestimmen

Um später festlegen zu können für welche Produkte aus dem Shop der Workflow greifen soll wird zunächst ein Shop Attribut angelegt: Shop > Produkte > Attribute.

Ist dieses angelegt erscheint in der Konfiguration der einzelnen Produkte unter Benutzerdefinierte Attribute eine Checkbox die nach dem vorher angelegtem Attribut benannt ist. Wird sie aktiviert greift der Workflow sobald dieses Produkt über den Closed Shop bestellt wurde.

Einstellungen > Shop

Druckdatengenerierung bei Bestellstaus > auf angenommen setzen (durch den Workflow werden alle Bestellungen für die dieser nicht greift automatisch auf angenommen gesetzt)

Workflow Instanzen

In diesem Menü werden nun die laufenden Workflows inkl. der aktuellen Position aufgelistet. Diese können (per Klick) geöffnet werden und einzelne Parameter manuell über die Instanz Daten (JSON) geändert werden.

Bestell-Übersicht

Hier sind alle Bestellungen aufgelistet und der jeweilige Bestellstatus ist einsehbar.

Wurde eine Bestellung freigegeben (1) wird der Status auf Angenommen gesetzt und die Druckdatei produziert (parallel dazu erhält der Besteller per E-Mail die Information, dass der Auftrag freigegeben wurde). Besteht ein Produzent im System wird dieser ebenfalls informiert und erhält die Druckdaten.

Wurde eine Bestellung abgelehnt (2) bleibt der Status auf Offen.
Falls gewünscht kann ein Benutzer mit entsprechenden Admin Rechten den Status hier nachträglich auf Angenommen setzen und so die Generierung der Druckdaten auslösen (sowie ggf. den Produzenten benachrichtigen).

In der Übersicht ist über den Bestellstatus ist sichtbar ob die Druckdaten bereits freigegeben wurden, entsprechend sind bei diesen Bestellungen diese auch bereits produziert.
Wurde eine Freigabe fälschlicherweise abgelehnt kann der Bestellstatus hier auch manuell auf Angenommen gesetzt (und damit die Druckdaten-Generierung gestartet) werden.