From 6b33eaf43a4ddf6ddd8982824bd7404cf9e9a101 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Thu, 22 Jun 2023 17:04:38 -0400 Subject: [PATCH 1/4] Set default MESSAGE_BROKER_DRIVER for phpunittests --- phpunit.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/phpunit.xml b/phpunit.xml index 6628c79e14..3e5a0f996d 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -44,6 +44,7 @@ + From 929eafc22c9a0bfde1f2fdd21f62cc519f292aac Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Thu, 22 Jun 2023 17:07:17 -0400 Subject: [PATCH 2/4] Refactor triggerBoundaryEvent --- .../Managers/WorkflowManagerRabbitMq.php | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php index db6789e4f2..e6aa89486f 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php @@ -12,6 +12,7 @@ use ProcessMaker\Models\Process as Definitions; use ProcessMaker\Models\ProcessRequest; use ProcessMaker\Models\User; +use ProcessMaker\Nayra\Contracts\Bpmn\BoundaryEventInterface; use ProcessMaker\Nayra\Contracts\Bpmn\ScriptTaskInterface; use ProcessMaker\Nayra\Contracts\Bpmn\StartEventInterface; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; @@ -23,6 +24,7 @@ class WorkflowManagerRabbitMq extends WorkflowManagerDefault implements Workflow const ACTION_COMPLETE_TASK = 'COMPLETE_TASK'; const ACTION_TRIGGER_INTERMEDIATE_EVENT = 'TRIGGER_INTERMEDIATE_EVENT'; const ACTION_RUN_SCRIPT = 'RUN_SCRIPT'; + const ACTION_TRIGGER_BOUNDARY_EVENT = 'TRIGGER_BOUNDARY_EVENT'; /** * Trigger a start event and return the process request instance. @@ -193,6 +195,49 @@ public function runScripTask(ScriptTaskInterface $scriptTask, TokenInterface $to ]); } + /** + * Trigger a boundary event + * + * @param Definitions $definitions + * @param ExecutionInstanceInterface $instance + * @param TokenInterface $token + * @param BoundaryEventInterface $boundaryEvent + * @param array $data + * + * @return void + */ + public function triggerBoundaryEvent( + Definitions $definitions, + ExecutionInstanceInterface $instance, + TokenInterface $token, + BoundaryEventInterface $boundaryEvent, + array $data + ) { + //Validate data + $this->validateData($data, $definitions, $boundaryEvent); + + // Get complementary information + $version = $instance->process->getLatestVersion(); + $userId = $this->getCurrentUserId(); + $state = $this->serializeState($instance); + + // Dispatch complete task action + $this->dispatchAction([ + 'bpmn' => $version->getKey(), + 'action' => self::ACTION_TRIGGER_BOUNDARY_EVENT, + 'params' => [ + 'request_id' => $token->process_request_id, + 'token_id' => $token->uuid, + 'element_id' => $token->element_id, + 'data' => [], + ], + 'state' => $state, + 'session' => [ + 'user_id' => $userId, + ], + ]); + } + /** * Build a state object. * From f92b3b7c4aab55d1038c1a0aeac569438abb8c44 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Thu, 22 Jun 2023 17:14:42 -0400 Subject: [PATCH 3/4] Fix typo --- ProcessMaker/Jobs/BoundaryEvent.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProcessMaker/Jobs/BoundaryEvent.php b/ProcessMaker/Jobs/BoundaryEvent.php index f45602e1ba..d5a56a7f0c 100644 --- a/ProcessMaker/Jobs/BoundaryEvent.php +++ b/ProcessMaker/Jobs/BoundaryEvent.php @@ -62,7 +62,7 @@ public function action(BpmnDocumentInterface $definitions, TokenInterface $token } /** - * Updata data for a message event + * Update data for a message event * * If variableName is set, then the event payload will be set to that variable name. * If the data name exists, then the data is merged. From 85f0771bb031619f23311b62d257bbd680533761 Mon Sep 17 00:00:00 2001 From: David Callizaya Date: Tue, 27 Jun 2023 09:55:41 -0400 Subject: [PATCH 4/4] Implementation of Task Scheduler-Nayra --- ProcessMaker/Models/Process.php | 2 +- .../Managers/WorkflowManagerRabbitMq.php | 3 +- .../Nayra/Repositories/Deserializer.php | 24 +++++++++++ .../Nayra/Repositories/PersistenceHandler.php | 13 ++++++ .../PersistenceTimerEventsTrait.php | 42 +++++++++++++++++++ 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 ProcessMaker/Nayra/Repositories/PersistenceTimerEventsTrait.php diff --git a/ProcessMaker/Models/Process.php b/ProcessMaker/Models/Process.php index 09ee450575..cb4bf19c3f 100644 --- a/ProcessMaker/Models/Process.php +++ b/ProcessMaker/Models/Process.php @@ -584,7 +584,7 @@ private function scalateToManagerIfEnabled($user, $activity, $token, $assignment if ($escalateToManager) { $user = WorkflowUserManager::escalateToManager($token, $user); } else { - $res = WorkflowManager::runProcess($assignmentProcess, 'assign', [ + $res = (new \ProcessMaker\Nayra\Managers\WorkflowManagerDefault)->runProcess($assignmentProcess, 'assign', [ 'user_id' => $user, 'process_id' => $this->id, 'request_id' => $token->getInstance()->getId(), diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php index e6aa89486f..648481f803 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php @@ -228,7 +228,7 @@ public function triggerBoundaryEvent( 'params' => [ 'request_id' => $token->process_request_id, 'token_id' => $token->uuid, - 'element_id' => $token->element_id, + 'element_id' => $boundaryEvent->getId(), 'data' => [], ], 'state' => $state, @@ -255,6 +255,7 @@ private function serializeState(ProcessRequest $instance) 'status' => $token->status, 'index' => $token->element_index, 'element_id' => $token->element_id, + 'created_at' => $token->created_at->getTimestamp(), ]); } diff --git a/ProcessMaker/Nayra/Repositories/Deserializer.php b/ProcessMaker/Nayra/Repositories/Deserializer.php index c2c019dc6d..4485a81f3e 100644 --- a/ProcessMaker/Nayra/Repositories/Deserializer.php +++ b/ProcessMaker/Nayra/Repositories/Deserializer.php @@ -9,6 +9,7 @@ use ProcessMaker\Nayra\Bpmn\Collection; use ProcessMaker\Nayra\Contracts\Bpmn\CollectionInterface; use ProcessMaker\Nayra\Contracts\Bpmn\EntityInterface; +use ProcessMaker\Nayra\Contracts\Bpmn\EventDefinitionInterface; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; use ProcessMaker\Repositories\BpmnDocument; @@ -19,10 +20,15 @@ class Deserializer { private $definitions = []; + private $requests = []; + private $tokens = []; + private ExecutionInstanceRepository $instanceRepository; + private TokenRepository $tokenRepository; + private DefinitionsRepository $factory; /** @@ -230,6 +236,7 @@ public function unserializeToken(array $serialized): TokenInterface public function unserializeEntity(array $serialized): EntityInterface { $definition = $this->findProcessDefinition($serialized['model_id']); + return $definition->getElementInstanceById($serialized['id']); } @@ -248,4 +255,21 @@ public function unserializeTokensCollection(array $serialized): CollectionInterf return $collection; } + + /** + * Return event definition from serialized data + * + * @param array $serialized + * @return EventDefinitionInterface + */ + public function unserializeEventDefinition(array $serialized): EventDefinitionInterface + { + $definition = $this->findProcessDefinition($serialized['model_id']); + $element = $definition->getElementInstanceById($serialized['element_id']); + $node = $element->getBpmnElement(); + $childNode = $node->childNodes->item($serialized['index']); + $eventDefinition = $childNode->getBpmnElementInstance(); + + return $eventDefinition; + } } diff --git a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php index 8f1595b1fa..1600e38155 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php @@ -4,6 +4,7 @@ use Exception; use Illuminate\Support\Facades\Auth; +use ProcessMaker\Managers\TaskSchedulerManager; use ProcessMaker\Repositories\ExecutionInstanceRepository; use ProcessMaker\Repositories\TokenRepository; @@ -11,10 +12,12 @@ class PersistenceHandler { use PersistenceRequestTrait; use PersistenceTokenTrait; + use PersistenceTimerEventsTrait; protected Deserializer $deserializer; protected ExecutionInstanceRepository $instanceRepository; protected TokenRepository $tokenRepository; + protected TaskSchedulerManager $taskSchedulerManager; /** * PersistenceHandler constructor @@ -24,6 +27,7 @@ public function __construct() $this->deserializer = new Deserializer(); $this->instanceRepository = new ExecutionInstanceRepository(); $this->tokenRepository = new TokenRepository($this->instanceRepository); + $this->taskSchedulerManager = new TaskSchedulerManager(); } /** @@ -105,6 +109,15 @@ public function save(array $transaction) case 'instance_updated': $this->persistInstanceUpdated($transaction); break; + case 'schedule_date': + $this->persistScheduleDate($transaction); + break; + case 'schedule_cycle': + $this->persistScheduleCycle($transaction); + break; + case 'schedule_duration': + $this->persistScheduleDuration($transaction); + break; default: throw new Exception('Unknown transaction type ' . $transaction['type']); } diff --git a/ProcessMaker/Nayra/Repositories/PersistenceTimerEventsTrait.php b/ProcessMaker/Nayra/Repositories/PersistenceTimerEventsTrait.php new file mode 100644 index 0000000000..cdbcfd65c0 --- /dev/null +++ b/ProcessMaker/Nayra/Repositories/PersistenceTimerEventsTrait.php @@ -0,0 +1,42 @@ +deserializer->unserializeEventDefinition($transaction['event_definition']); + $element = $this->deserializer->unserializeEntity($transaction['element']); + $token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null; + $this->taskSchedulerManager->scheduleDate($dateTime, $eventDefinition, $element, $token); + } + + public function persistScheduleCycle(array $transaction) + { + $cycle = unserialize($transaction['cycle']); + $eventDefinition = $this->deserializer->unserializeEventDefinition($transaction['event_definition']); + $element = $this->deserializer->unserializeEntity($transaction['element']); + $token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null; + $this->taskSchedulerManager->scheduleCycle($cycle, $eventDefinition, $element, $token); + } + + public function persistScheduleDuration(array $transaction) + { + $duration = unserialize($transaction['duration']); + $eventDefinition = $this->deserializer->unserializeEventDefinition($transaction['event_definition']); + $element = $this->deserializer->unserializeEntity($transaction['element']); + $token = $transaction['token'] ? $this->deserializer->unserializeToken($transaction['token']) : null; + $this->taskSchedulerManager->scheduleDuration($duration, $eventDefinition, $element, $token); + } +}