diff --git a/WorkflowEngine.php b/WorkflowEngine.php index d86bd6a..01467be 100644 --- a/WorkflowEngine.php +++ b/WorkflowEngine.php @@ -216,10 +216,15 @@ class WorkflowEngine { } // 2. Create a new process instance. + $initialDataJson = null; + if (isset($definition_json['initial_data'])) { + $initialDataJson = json_encode($definition_json['initial_data']); + } + $stmt_insert = $this->pdo->prepare( - "INSERT INTO process_instances (person_id, process_definition_id, current_node_id, current_status, last_activity_at) VALUES (?, ?, ?, 'in_progress', NOW())" + "INSERT INTO process_instances (person_id, process_definition_id, current_node_id, current_status, last_activity_at, data_json) VALUES (?, ?, ?, 'in_progress', NOW(), ?)" ); - $stmt_insert->execute([$personId, $definition['id'], $startNodeId]); + $stmt_insert->execute([$personId, $definition['id'], $startNodeId, $initialDataJson]); $instanceId = $this->pdo->lastInsertId(); // 3. Create a system event for process start. @@ -341,7 +346,7 @@ class WorkflowEngine { $instanceId ]); - $message = $inputPayload['message'] ?? $transition['name']; + $message = $inputPayload['note'] ?? $inputPayload['message'] ?? $transition['name']; $this->addEvent($instanceId, 'transition_applied', $message, $newNodeId, $inputPayload, $userId); if (isset($transition['actions'])) { @@ -351,6 +356,10 @@ class WorkflowEngine { } elseif ($action['type'] === 'set_data') { // Pass the instance by reference to be updated with new data $this->executeSetDataAction($instanceId, $instance, $action, $inputPayload); + } elseif ($action['type'] === 'increment_data') { + $this->executeIncrementDataAction($instanceId, $instance, $action); + } elseif ($action['type'] === 'reset_data') { + $this->executeResetDataAction($instanceId, $instance, $action); } } } @@ -712,6 +721,10 @@ class WorkflowEngine { $condition = $transition['condition']; $data = isset($instanceData['data_json']) ? json_decode($instanceData['data_json'], true) : []; + if (isset($condition['type']) && $condition['type'] === 'always_true') { + return true; + } + if (isset($condition['type']) && $condition['type'] === 'all_true') { if (!isset($condition['fields']) || !is_array($condition['fields'])) return false; foreach ($condition['fields'] as $f) { @@ -751,6 +764,12 @@ class WorkflowEngine { } } } + + if (isset($action['params']['map']) && is_array($action['params']['map'])) { + foreach ($action['params']['map'] as $key => $val) { + $data[$key] = $val; + } + } $newDataJson = json_encode($data); @@ -762,6 +781,41 @@ class WorkflowEngine { $instance['data_json'] = $newDataJson; } + private function executeIncrementDataAction(int $instanceId, array &$instance, array $action): void { + $dataJson = $instance['data_json']; + $data = $dataJson ? json_decode($dataJson, true) : []; + + $key = $action['params']['key'] ?? null; + $by = $action['params']['by'] ?? 1; + + if ($key) { + $default_base = $action['params']['default_base'] ?? 0; + $val = isset($data[$key]) ? (int)$data[$key] : $default_base; + $data[$key] = $val + $by; + } + + $newDataJson = json_encode($data); + $stmt_update = $this->pdo->prepare("UPDATE process_instances SET data_json = ? WHERE id = ?"); + $stmt_update->execute([$newDataJson, $instanceId]); + $instance['data_json'] = $newDataJson; + } + + private function executeResetDataAction(int $instanceId, array &$instance, array $action): void { + $dataJson = $instance['data_json']; + $data = $dataJson ? json_decode($dataJson, true) : []; + + if (isset($action['params']['keys']) && is_array($action['params']['keys'])) { + foreach ($action['params']['keys'] as $key) { + $data[$key] = null; + } + } + + $newDataJson = json_encode($data); + $stmt_update = $this->pdo->prepare("UPDATE process_instances SET data_json = ? WHERE id = ?"); + $stmt_update->execute([$newDataJson, $instanceId]); + $instance['data_json'] = $newDataJson; + } + public function deleteInstance(int $instanceId): void { $inTransaction = $this->pdo->inTransaction(); if (!$inTransaction) { $this->pdo->beginTransaction(); }