Zum Hauptinhalt springen
Vorschau-Feature — Apps befindet sich derzeit in der Vorschau-Phase. Funktionalität und API können sich noch ändern. Wir freuen uns über Feedback!
Apps ermöglichen es, eigene HTML-Anwendungen direkt in Enneo zu erstellen und auszuführen. Nutzen Sie Apps für individuelle Dashboards, Berichte, Formulare oder Tools — alles im vertrauten Enneo-Interface.

Überblick

Apps sind benutzerdefinierte Anwendungen, die HTML zurückgeben und direkt in Enneo als eigene Seite angezeigt werden. Jede App wird in einer Sandbox ausgeführt und hat Zugriff auf die Enneo-API. Typische Anwendungsfälle:
  • Individuelle Dashboards — Echtzeitdaten aus dem ERP oder CRM visualisieren
  • Berichte und Auswertungen — Maßgeschneiderte Reports mit eigener Logik
  • Interne Tools — Formulare, Kalkulatoren oder Workflow-Helfer
  • Datenabfragen — Vertragsdaten, Kundenstatus oder Statistiken anzeigen

Aufbau einer App

Jede App besteht aus:
BestandteilBeschreibung
NameAnzeigename in der Seitenleiste und in den Einstellungen
SlugEindeutiger technischer Bezeichner (z.B. mein-dashboard)
BeschreibungOptionale Beschreibung des Zwecks der App
AnbieterOptional: Wer die App erstellt hat
ExecutorDer Code, der bei Aufruf ausgeführt wird (Python, Node.js oder PHP)

Executor-Code

Der Executor-Code wird bei jedem Aufruf der App ausgeführt. Die Ausgabe auf stdout wird als HTML an den Browser zurückgegeben.
# Einfache App: Begrüßungsseite
print("<h1>Willkommen</h1>")
print("<p>Dies ist meine erste Enneo-App.</p>")

Eingabeparameter

Bei jedem Aufruf erhält der Code automatisch Metadaten als Parameter:
{
  "_metadata": {
    "userId": 1,
    "clientId": "1",
    "appId": "a1b2c3d4-..."
  }
}
Zusätzliche GET- oder POST-Parameter werden automatisch übergeben und stehen im Code zur Verfügung.

Apps nutzen

Seitenleiste

Sobald mindestens eine App existiert und der Benutzer die Berechtigung readApps hat, erscheint in der Seitenleiste der Menüpunkt Apps. Hier werden alle verfügbaren Apps als Tabs angezeigt.

App aufrufen

Jede App wird in einem iFrame innerhalb von Enneo ausgeführt. Die App-URL lautet:
/api/mind/app/{appId}/run
GET-Parameter können direkt angehängt werden:
/api/mind/app/{appId}/run?param1=wert1&param2=wert2

Apps verwalten

Die Verwaltung erfolgt unter Einstellungen → Erweiterte Einstellungen → Apps.

Neue App erstellen

  1. Navigieren Sie zu Einstellungen → Apps
  2. Klicken Sie auf App erstellen
  3. Geben Sie Name, Slug und optional Beschreibung ein
  4. Schreiben Sie den Executor-Code
  5. Nutzen Sie die Vorschau, um die Ausgabe zu prüfen
  6. Klicken Sie auf Speichern

App bearbeiten

Jede Änderung erstellt automatisch eine neue Revision. So können Sie jederzeit zu einer früheren Version zurückkehren.

Revisionen und Rollback

Apps unterstützen Versionierung:
  • Jede Speicherung erstellt eine neue Revision
  • Über die Revisions-Übersicht können Sie zu jeder früheren Version zurückkehren
  • Die aktive Revision wird den Benutzern angezeigt

App importieren

Apps können per JSON importiert werden. Dies ermöglicht den Transfer zwischen Umgebungen.

Berechtigungen

BerechtigungBeschreibungStandard-Rollen
readAppsApps ansehen und ausführenAdmin, Agent
appCreatorApps erstellen, bearbeiten und VorschauAdmin
manageAppsApps importieren und löschenAdmin

Beispiele

Dashboard mit Vertragsdaten

import importlib.util, os, json, sys

# SDK laden
file_path = os.getenv('SDK', 'sdk.py')
spec = importlib.util.spec_from_file_location('sdk', file_path)
sdk = importlib.util.module_from_spec(spec)
spec.loader.exec_module(sdk)

# Eingabedaten laden
input_data = sdk.load_input_data()
metadata = input_data.get('_metadata', {})

# Vertragsdaten laden (Beispiel)
contract_id = input_data.get('contractId', '715559')
try:
    contract = sdk.ApiEnneo.get_contract(contract_id)
    name = f"{contract.get('firstname', '')} {contract.get('lastname', '')}"
    status = contract.get('status', 'Unbekannt')
except Exception:
    name = "Nicht gefunden"
    status = "-"

# HTML ausgeben
print(f"""
<!DOCTYPE html>
<html>
<head>
    <style>
        body {{ font-family: Arial, sans-serif; padding: 20px; }}
        .card {{ background: #f5f5f5; padding: 16px; border-radius: 8px; margin: 8px 0; }}
        h1 {{ color: #333; }}
    </style>
</head>
<body>
    <h1>Vertragsübersicht</h1>
    <div class="card">
        <strong>Name:</strong> {name}<br>
        <strong>Status:</strong> {status}<br>
        <strong>Vertragsnummer:</strong> {contract_id}
    </div>
</body>
</html>
""")

Einfaches Ticket-Suchformular

import importlib.util, os, json, sys

file_path = os.getenv('SDK', 'sdk.py')
spec = importlib.util.spec_from_file_location('sdk', file_path)
sdk = importlib.util.module_from_spec(spec)
spec.loader.exec_module(sdk)

input_data = sdk.load_input_data()
search_query = input_data.get('q', '')

html = """
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; }
        input { padding: 8px; width: 300px; border: 1px solid #ccc; border-radius: 4px; }
        button { padding: 8px 16px; background: #9575ef; color: white; border: none;
                 border-radius: 4px; cursor: pointer; }
        table { width: 100%; border-collapse: collapse; margin-top: 16px; }
        th, td { padding: 8px; text-align: left; border-bottom: 1px solid #eee; }
        th { background: #f5f5f5; }
    </style>
</head>
<body>
    <h1>Ticket-Suche</h1>
    <form method="GET">
        <input name="q" placeholder="Suchbegriff..." value="{QUERY}">
        <button type="submit">Suchen</button>
    </form>
"""

html = html.replace("{QUERY}", search_query)

if search_query:
    try:
        results = sdk.ApiEnneo.get('/api/mind/ticket/search', {
            'q': search_query,
            'limit': 10
        }, 'serviceWorker')
        tickets = results.get('tickets', [])

        html += "<table><tr><th>ID</th><th>Betreff</th><th>Status</th></tr>"
        for t in tickets:
            html += f"<tr><td>{t['id']}</td><td>{t.get('subject','')}</td>"
            html += f"<td>{t.get('status','')}</td></tr>"
        html += "</table>"

        if not tickets:
            html += "<p>Keine Ergebnisse gefunden.</p>"
    except Exception as e:
        html += f"<p style='color:red'>Fehler: {e}</p>"

html += "</body></html>"
print(html)

Statische Info-Seite

print("""
<!DOCTYPE html>
<html>
<head>
    <style>
        body { font-family: Arial, sans-serif; padding: 20px; max-width: 800px; margin: 0 auto; }
        .info { background: #e8f5e9; padding: 16px; border-radius: 8px;
                border-left: 4px solid #4caf50; }
        .warning { background: #fff3e0; padding: 16px; border-radius: 8px;
                   border-left: 4px solid #ff9800; }
    </style>
</head>
<body>
    <h1>Wichtige Informationen</h1>
    <div class="info">
        <strong>Servicezeiten:</strong> Mo-Fr, 8:00 - 18:00 Uhr
    </div>
    <br>
    <div class="warning">
        <strong>Hinweis:</strong> Wartungsarbeiten am Wochenende geplant.
    </div>
</body>
</html>
""")
Apps haben Zugriff auf das gleiche Enneo SDK, das auch für regelbasierte KI-Agenten verwendet wird. Damit können Sie Verträge abfragen, Tickets lesen, Einstellungen abrufen und externe APIs aufrufen. Weitere Informationen finden Sie in der SDK-Dokumentation.

API-Referenz

MethodeEndpunktBeschreibung
GET/api/mind/appAlle Apps auflisten
POST/api/mind/appNeue App erstellen
GET/api/mind/app/{appId}App-Details abrufen
PATCH/api/mind/app/{appId}App aktualisieren (neue Revision)
DELETE/api/mind/app/{appId}App löschen
GET/api/mind/app/{appId}/revisionsAlle Revisionen anzeigen
POST/api/mind/app/{appId}/rollback/{revision}Auf Revision zurücksetzen
POST/api/mind/app/{appId}/previewVorschau ausführen
POST/api/mind/app/importApp importieren
GET/POST/api/mind/app/{appId}/runApp ausführen (HTML-Antwort)