diff --git a/ProcessMaker/Console/Commands/Consumer.php b/ProcessMaker/Console/Commands/Consumer.php index 660b2107cb..8adaed13f6 100644 --- a/ProcessMaker/Console/Commands/Consumer.php +++ b/ProcessMaker/Console/Commands/Consumer.php @@ -4,6 +4,7 @@ use Exception; use Illuminate\Console\Command; +use Illuminate\Support\Facades\Log; use ProcessMaker\Facades\MessageBrokerService; class Consumer extends Command @@ -40,7 +41,8 @@ public function handle() try { MessageBrokerService::worker(); } catch (Exception $e) { - $this->warn($e->getMessage()); + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); } } } diff --git a/ProcessMaker/Jobs/RunNayraServiceTask.php b/ProcessMaker/Jobs/RunNayraServiceTask.php new file mode 100644 index 0000000000..bc72724654 --- /dev/null +++ b/ProcessMaker/Jobs/RunNayraServiceTask.php @@ -0,0 +1,53 @@ +tokenId = $token->getKey(); + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + // Get token + $token = ProcessRequestToken::find($this->tokenId); + $token->loadTokenProperties(); + $instance = $token->processRequest; + $instance->loadProcessRequestInstance(); + $token->setInstance($instance); + + // Run service task + WorkflowManager::handleServiceTask($token); + } +} diff --git a/ProcessMaker/Models/ProcessRequest.php b/ProcessMaker/Models/ProcessRequest.php index f963d47589..0a33689a78 100644 --- a/ProcessMaker/Models/ProcessRequest.php +++ b/ProcessMaker/Models/ProcessRequest.php @@ -907,4 +907,18 @@ public function getMedia(string $collectionName = 'default', $filters = []): Col { return \ProcessMaker\Models\Media::getFilesRequest($this); } + + public function getErrors() + { + if ($this->errors) { + return $this->errors; + } + // select tokens with errors + return $this->tokens() + ->select('token_properties->error as message', 'created_at', 'element_name') + ->where('status', '=', ActivityInterface::TOKEN_STATE_FAILING) + ->limit(10) + ->get() + ->toArray(); + } } diff --git a/ProcessMaker/Models/ProcessRequestToken.php b/ProcessMaker/Models/ProcessRequestToken.php index c81a46d41f..bede518863 100644 --- a/ProcessMaker/Models/ProcessRequestToken.php +++ b/ProcessMaker/Models/ProcessRequestToken.php @@ -823,7 +823,7 @@ public function logError(Throwable $error, FlowElementInterface $bpmnElement) public function updateTokenProperties() { - $allowed = ['conditionals', 'loopCharacteristics', 'data']; + $allowed = ['conditionals', 'loopCharacteristics', 'data', 'error']; $this->token_properties = array_filter( $this->getProperties(), function ($key) use ($allowed) { diff --git a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php index 53247c6ef6..0107bfc846 100644 --- a/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php +++ b/ProcessMaker/Nayra/Managers/WorkflowManagerRabbitMq.php @@ -10,13 +10,14 @@ use ProcessMaker\Facades\MessageBrokerService; use ProcessMaker\Facades\WorkflowManager; use ProcessMaker\GenerateAccessToken; +use ProcessMaker\Jobs\RunNayraServiceTask; use ProcessMaker\Managers\DataManager; use ProcessMaker\Managers\SignalManager; use ProcessMaker\Models\EnvironmentVariable; use ProcessMaker\Models\Process as Definitions; -use ProcessMaker\Models\Process; use ProcessMaker\Models\ProcessCollaboration; use ProcessMaker\Models\ProcessRequest; +use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\Script; use ProcessMaker\Models\User; use ProcessMaker\Nayra\Contracts\Bpmn\BoundaryEventInterface; @@ -30,11 +31,17 @@ class WorkflowManagerRabbitMq extends WorkflowManagerDefault implements WorkflowManagerInterface { const ACTION_START_PROCESS = 'START_PROCESS'; + 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'; + const ACTION_TRIGGER_MESSAGE_EVENT = 'TRIGGER_MESSAGE_EVENT'; + const ACTION_TRIGGER_SIGNAL_EVENT = 'TRIGGER_SIGNAL_EVENT'; /** @@ -222,6 +229,16 @@ public function runServiceTask(ServiceTaskInterface $serviceTask, TokenInterface // Log execution Log::info('Dispatch a service task: ' . $serviceTask->getId()); + RunNayraServiceTask::dispatch($token)->onQueue('bpmn'); + } + + /** + * Run a service task. + * + * @param ProcessRequestToken $token + */ + public function handleServiceTask(ProcessRequestToken $token) + { // Get complementary information $element = $token->getDefinition(true); $instance = $token->processRequest; @@ -395,7 +412,7 @@ public function throwSignalEventProcess($processId, $signalRef, array $data) // Get complementary information $userId = $this->getCurrentUserId(); // get process variable - $process = Process::find($processId); + $process = Definitions::find($processId); $definitions = $process->getDefinitions(); $catches = SignalManager::getSignalCatchEvents($signalRef, $definitions); $processVariable = ''; @@ -480,17 +497,25 @@ private function serializeState(ProcessRequest $instance) $tokensRows = []; $tokens = $request->tokens()->where('status', '!=', 'CLOSED')->where('status', '!=', 'TRIGGERED')->get(); foreach ($tokens as $token) { - $tokensRows[] = array_merge($token->token_properties ?: [], [ + $tokenRow = array_merge($token->token_properties ?: [], [ 'id' => $token->uuid, 'status' => $token->status, 'index' => $token->element_index, 'element_id' => $token->element_id, 'created_at' => $token->created_at->getTimestamp(), ]); + if ($token->subprocess_request_id) { + $subRequest = ProcessRequest::select(['process_version_id', 'uuid']) + ->find($token->subprocess_request_id); + $tokenRow['subprocess_request_id'] = $subRequest->uuid; + $tokenRow['subprocess_request_version'] = $subRequest->process_version_id; + } + $tokensRows[] = $tokenRow; } return [ 'id' => $request->uuid, + 'process_version_id' => $request->process_version_id, 'callable_id' => $request->callable_id, 'collaboration_uuid' => $request->collaboration_uuid, 'data' => $request->data, diff --git a/ProcessMaker/Nayra/Repositories/Deserializer.php b/ProcessMaker/Nayra/Repositories/Deserializer.php index 002f7031ad..33b8952336 100644 --- a/ProcessMaker/Nayra/Repositories/Deserializer.php +++ b/ProcessMaker/Nayra/Repositories/Deserializer.php @@ -12,6 +12,7 @@ use ProcessMaker\Nayra\Contracts\Bpmn\EventDefinitionInterface; use ProcessMaker\Nayra\Contracts\Bpmn\TokenInterface; use ProcessMaker\Nayra\Contracts\Engine\ExecutionInstanceInterface; +use ProcessMaker\Nayra\Contracts\Storage\BpmnDocumentInterface; use ProcessMaker\Repositories\BpmnDocument; use ProcessMaker\Repositories\DefinitionsRepository; use ProcessMaker\Repositories\ExecutionInstanceRepository; @@ -56,7 +57,7 @@ private function findProcessDefinition($modelId): BpmnDocument $version = ProcessVersion::find($modelId); $model = $version->process; - $definition = new BpmnDocument($model); + $definition = app(BpmnDocumentInterface::class, ['process' => $model]); $definition->setFactory($this->factory); $definition->loadXML($version->bpmn); diff --git a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php index d66b07ded5..c202028b04 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceHandler.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceHandler.php @@ -116,6 +116,9 @@ public function save(array $transaction) case 'instance_updated': $this->persistInstanceUpdated($transaction); break; + case 'call_activity_activated': + $this->persistCallActivityActivated($transaction); + break; case 'schedule_date': $this->persistScheduleDate($transaction); break; @@ -138,8 +141,10 @@ public function save(array $transaction) throw new Exception('Unknown transaction type ' . $transaction['type']); } } catch (Exception $error) { + error_log($error->getMessage()); Log::error($error->getMessage()); - if ($transaction['token']) { + Log::error($error->getTraceAsString()); + if (!empty($transaction['token'])) { $token = $this->deserializer->unserializeToken($transaction['token']); $request = $token->getInstance(); if ($request && $request instanceof ProcessRequest) { diff --git a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php index c05cc193cb..ba1d4d4c20 100644 --- a/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php +++ b/ProcessMaker/Nayra/Repositories/PersistenceTokenTrait.php @@ -2,8 +2,12 @@ namespace ProcessMaker\Nayra\Repositories; +use ProcessMaker\Repositories\TokenRepository; + trait PersistenceTokenTrait { + protected TokenRepository $tokenRepository; + /** * Persists instance and token data when a token arrives to an activity * @@ -208,4 +212,17 @@ public function persistEventBasedGatewayActivated(array $transaction) $consumedTokens = $this->deserializer->unserializeTokensCollection($transaction['consumed_tokens']); $this->tokenRepository->persistEventBasedGatewayActivated($gateway, $passedToken, $consumedTokens); } + + /** + * Persists a Call Activity Activated + * + * @param array $transaction + */ + public function persistCallActivityActivated(array $transaction) + { + $token = $this->deserializer->unserializeToken($transaction['token']); + $subprocessInstance = $this->deserializer->unserializeInstance($transaction['subprocess']); + $startId = $transaction['start_id']; + $this->tokenRepository->persistCallActivityActivated($token, $subprocessInstance, $startId); + } } diff --git a/ProcessMaker/Repositories/TokenRepository.php b/ProcessMaker/Repositories/TokenRepository.php index a839075a91..19e693da23 100644 --- a/ProcessMaker/Repositories/TokenRepository.php +++ b/ProcessMaker/Repositories/TokenRepository.php @@ -8,6 +8,7 @@ use ProcessMaker\Models\ProcessCollaboration; use ProcessMaker\Models\ProcessRequest as Instance; use ProcessMaker\Models\ProcessRequestToken as Token; +use ProcessMaker\Models\ProcessRequestToken; use ProcessMaker\Models\User; use ProcessMaker\Nayra\Bpmn\Collection; use ProcessMaker\Nayra\Bpmn\Models\EndEvent; @@ -201,7 +202,7 @@ private function assignTaskUser(ActivityInterface $activity, TokenInterface $tok * Persists instance and token data when a token within an activity change to error state * * @param ActivityInterface $activity - * @param TokenInterface $token + * @param TokenInterface|ProcessRequestToken $token * * @return mixed */ diff --git a/resources/js/requests/components/RequestErrors.vue b/resources/js/requests/components/RequestErrors.vue index db79a66dbb..e060f804a1 100644 --- a/resources/js/requests/components/RequestErrors.vue +++ b/resources/js/requests/components/RequestErrors.vue @@ -63,7 +63,7 @@