diff --git a/README.md b/README.md index 214de637..7ee64af4 100644 --- a/README.md +++ b/README.md @@ -195,3 +195,29 @@ Um EspoCRM anzupassen, bearbeite JSON-Dateien im custom/-Verzeichnis. Änderunge Alternative: Web-Interface > Administration > Clear Cache & Rebuild. Effekt: Aktualisiert DB-Schema, Views und entfernt alte Caches. Ohne Rebuild sind Änderungen unsichtbar. Hinweis: Führe den Befehl auf dem Host aus, da der Container den PHP-Zugang hat. + +## 7. Custom Scripts und Tools + +Um die Entwicklung und Wartung zu erleichtern, wurden benutzerdefinierte Scripts im `custom/scripts/`-Ordner abgelegt. Diese Scripts überleben EspoCRM-Updates, da sie außerhalb der Core-Dateien liegen. + +### Verfügbare Scripts: + +#### workflow_manager.php +- **Zweck**: Verwaltung von BPMN-Workflows in EspoCRM. Ermöglicht das Lesen, Bearbeiten, Löschen, Ausführen und Testen von Workflows direkt über die Datenbank. +- **Bedienung**: + - Ausführen im EspoCRM-Container: `docker exec espocrm php /var/www/html/custom/scripts/workflow_manager.php [parameter]` + - Aktionen: + - `list`: Listet alle verfügbaren Workflows auf (ID und Name). + - `read `: Zeigt detaillierte Informationen zu einem Workflow (inkl. JSON-Data). + - `delete `: Löscht einen Workflow (mit Bestätigung). + - `edit `: Bearbeitet die Workflow-Data (übergib gültiges JSON). + - `execute `: Führt einen Workflow manuell für einen Record aus (simuliert Trigger). + - `test `: Testet Workflow-Bedingungen (simuliert Auswertung). +- **Beispiele**: + - `docker exec espocrm php /var/www/html/custom/scripts/workflow_manager.php list` + - `docker exec espocrm php /var/www/html/custom/scripts/workflow_manager.php read 68df9eb6b8d460186` + - `docker exec espocrm php /var/www/html/custom/scripts/workflow_manager.php execute 68df9eb6b8d460186 some_record_id` +- **Hinweise**: + - Sichere Backups vor Lösch- oder Edit-Operationen. + - Für komplexe Änderungen die EspoCRM-UI verwenden. + - Execute simuliert nur einfache Aktionen; für vollständige Ausführung EspoCRM-API nutzen. diff --git a/custom/scripts/workflow_manager.php b/custom/scripts/workflow_manager.php new file mode 100644 index 00000000..92a0e09a --- /dev/null +++ b/custom/scripts/workflow_manager.php @@ -0,0 +1,120 @@ + [options] + * Actions: list, read , delete , edit , execute , test + */ + +$config = require '/var/www/html/data/config-internal.php'; +$dsn = 'mysql:host=' . $config['database']['host'] . ';dbname=' . $config['database']['dbname']; +$user = $config['database']['user']; +$pass = $config['database']['password']; + +function connectDB() { + global $dsn, $user, $pass; + try { + $pdo = new PDO($dsn, $user, $pass); + $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + return $pdo; + } catch (PDOException $e) { + die("DB Fehler: " . $e->getMessage() . "\n"); + } +} + +function listWorkflows($pdo) { + $stmt = $pdo->query("SELECT id, name FROM bpmn_flowchart WHERE deleted = 0"); + $results = $stmt->fetchAll(PDO::FETCH_ASSOC); + echo "Verfügbare Workflows:\n"; + foreach ($results as $row) { + echo "- ID: {$row['id']}, Name: {$row['name']}\n"; + } +} + +function readWorkflow($pdo, $id) { + $stmt = $pdo->prepare("SELECT * FROM bpmn_flowchart WHERE id = ? AND deleted = 0"); + $stmt->execute([$id]); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if ($row) { + echo "Workflow Details:\n"; + echo json_encode($row, JSON_PRETTY_PRINT) . "\n"; + } else { + echo "Workflow nicht gefunden.\n"; + } +} + +function deleteWorkflow($pdo, $id) { + echo "Bist du sicher, dass du den Workflow $id löschen möchtest? (ja/nein): "; + $input = trim(fgets(STDIN)); + if (strtolower($input) === 'ja') { + $stmt = $pdo->prepare("UPDATE bpmn_flowchart SET deleted = 1 WHERE id = ?"); + $stmt->execute([$id]); + echo "Workflow gelöscht.\n"; + } else { + echo "Abgebrochen.\n"; + } +} + +function editWorkflow($pdo, $id, $jsonData) { + $data = json_decode($jsonData, true); + if (json_last_error() !== JSON_ERROR_NONE) { + die("Ungültiges JSON.\n"); + } + $stmt = $pdo->prepare("UPDATE bpmn_flowchart SET data = ?, modified_at = NOW() WHERE id = ?"); + $stmt->execute([json_encode($data), $id]); + echo "Workflow aktualisiert.\n"; +} + +function executeWorkflow($pdo, $id, $recordId) { + // Einfache Simulation: Setze Status oder triggere Event + // In Realität würde man EspoCRM-API verwenden + echo "Workflow $id für Record $recordId ausführen...\n"; + // Beispiel: Status setzen + $stmt = $pdo->prepare("UPDATE c_vmh_erstgespraech SET status = 'Warte auf Mandatierung' WHERE id = ?"); + $stmt->execute([$recordId]); + echo "Status gesetzt. Workflow sollte ausgelöst werden.\n"; +} + +function testWorkflow($pdo, $id) { + // Simuliere Bedingungen + $stmt = $pdo->prepare("SELECT data FROM bpmn_flowchart WHERE id = ?"); + $stmt->execute([$id]); + $row = $stmt->fetch(PDO::FETCH_ASSOC); + if ($row) { + $data = json_decode($row['data'], true); + echo "Teste Workflow: " . (isset($data['list'][0]['text']) ? $data['list'][0]['text'] : 'Unbekannt') . "\n"; + // Prüfe Bedingungen (vereinfacht) + echo "Bedingungen: " . json_encode(isset($data['list'][0]['conditionsAll']) ? $data['list'][0]['conditionsAll'] : []) . "\n"; + } +} + +$pdo = connectDB(); +$action = $argv[1] ?? 'list'; + +switch ($action) { + case 'list': + listWorkflows($pdo); + break; + case 'read': + if (!isset($argv[2])) die("Usage: read \n"); + readWorkflow($pdo, $argv[2]); + break; + case 'delete': + if (!isset($argv[2])) die("Usage: delete \n"); + deleteWorkflow($pdo, $argv[2]); + break; + case 'edit': + if (!isset($argv[2]) || !isset($argv[3])) die("Usage: edit \n"); + editWorkflow($pdo, $argv[2], $argv[3]); + break; + case 'execute': + if (!isset($argv[2]) || !isset($argv[3])) die("Usage: execute \n"); + executeWorkflow($pdo, $argv[2], $argv[3]); + break; + case 'test': + if (!isset($argv[2])) die("Usage: test \n"); + testWorkflow($pdo, $argv[2]); + break; + default: + echo "Unbekannte Aktion. Verfügbare: list, read, delete, edit, execute, test\n"; +} +?> \ No newline at end of file