Add Workflow Manager script for managing BPMN workflows in EspoCRM
This commit is contained in:
26
README.md
26
README.md
@@ -195,3 +195,29 @@ Um EspoCRM anzupassen, bearbeite JSON-Dateien im custom/-Verzeichnis. Änderunge
|
|||||||
Alternative: Web-Interface > Administration > Clear Cache & Rebuild.
|
Alternative: Web-Interface > Administration > Clear Cache & Rebuild.
|
||||||
Effekt: Aktualisiert DB-Schema, Views und entfernt alte Caches. Ohne Rebuild sind Änderungen unsichtbar.
|
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.
|
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 <aktion> [parameter]`
|
||||||
|
- Aktionen:
|
||||||
|
- `list`: Listet alle verfügbaren Workflows auf (ID und Name).
|
||||||
|
- `read <id>`: Zeigt detaillierte Informationen zu einem Workflow (inkl. JSON-Data).
|
||||||
|
- `delete <id>`: Löscht einen Workflow (mit Bestätigung).
|
||||||
|
- `edit <id> <json_data>`: Bearbeitet die Workflow-Data (übergib gültiges JSON).
|
||||||
|
- `execute <workflow_id> <record_id>`: Führt einen Workflow manuell für einen Record aus (simuliert Trigger).
|
||||||
|
- `test <id>`: 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.
|
||||||
|
|||||||
120
custom/scripts/workflow_manager.php
Normal file
120
custom/scripts/workflow_manager.php
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Workflow Manager Script for EspoCRM
|
||||||
|
* Usage: php workflow_manager.php <action> [options]
|
||||||
|
* Actions: list, read <id>, delete <id>, edit <id> <json_data>, execute <id> <record_id>, test <id>
|
||||||
|
*/
|
||||||
|
|
||||||
|
$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 <id>\n");
|
||||||
|
readWorkflow($pdo, $argv[2]);
|
||||||
|
break;
|
||||||
|
case 'delete':
|
||||||
|
if (!isset($argv[2])) die("Usage: delete <id>\n");
|
||||||
|
deleteWorkflow($pdo, $argv[2]);
|
||||||
|
break;
|
||||||
|
case 'edit':
|
||||||
|
if (!isset($argv[2]) || !isset($argv[3])) die("Usage: edit <id> <json_data>\n");
|
||||||
|
editWorkflow($pdo, $argv[2], $argv[3]);
|
||||||
|
break;
|
||||||
|
case 'execute':
|
||||||
|
if (!isset($argv[2]) || !isset($argv[3])) die("Usage: execute <workflow_id> <record_id>\n");
|
||||||
|
executeWorkflow($pdo, $argv[2], $argv[3]);
|
||||||
|
break;
|
||||||
|
case 'test':
|
||||||
|
if (!isset($argv[2])) die("Usage: test <id>\n");
|
||||||
|
testWorkflow($pdo, $argv[2]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
echo "Unbekannte Aktion. Verfügbare: list, read, delete, edit, execute, test\n";
|
||||||
|
}
|
||||||
|
?>
|
||||||
Reference in New Issue
Block a user