approval = $approval; $this->actionExtraFields = [ 'now' => $this->approval->node_level ]; $fileInfo = $uploadedFile ? $this->chunkUploadFileByCompany($uploadedFile, FileObjectType::ACTION->value) : []; match($status) { 1 => $this->approved(), default => $this->rejected(), }; $this->actionExtraFields['approval_mode'] = $this->approval->approval_mode; $action = $this->triggerAction($comment); $this->changeApprovalObjectStatus(); $this->changeApprovalStatus(); $this->fileToDatabase($fileInfo, $action->id); } protected function changeApprovalStatus(): void { $this->approval->save(); } protected function changeApprovalObjectStatus(): void { $object = ApprovalObjectType::from($this->approval->object_type) ->modelBuilder() ->findOrFail($this->approval->object_id); $object->approval_status = $this->approval->status; $object->save(); } protected function triggerAction (string $comment = null) { return ActionRepository::createByApproval( $this->approval, $this->objectAction, $comment, extraFields: $this->actionExtraFields ); } protected function approved(): void { $approvalFlowNodes = $this->approval->approvalFlow?->nodes; $nextNodeIndex = $this->approval->node_level + 1; $nextNode = $approvalFlowNodes[$nextNodeIndex] ?? []; $approvalObjectUsers = array_values(array_filter(explode(",", $this->approval->users), function($value) { return $value != Auth::id() && $value; })); switch (ApprovalMode::tryFrom($this->approval->approval_mode)) { case ApprovalMode::ALTERNATIVE_APPROVAL: if (! $nextNode) { $this->approvedHandle(); } else { $this->approvedToNextNodeHandle($nextNodeIndex, $nextNode); } break; case ApprovalMode::COUNTERSIGNATURE: case ApprovalMode::SEQUENTIAL_APPROVAL: if (count($approvalObjectUsers) > 0 ) { $this->approvedWaitOthers($approvalObjectUsers); } elseif (! $nextNode) { $this->approvedHandle(); } else { $this->approvedToNextNodeHandle($nextNodeIndex, $nextNode); } break; } } protected function approvedWaitOthers(array $approvalObjectUsers) { $this->approval->users = sprintf(",%s,", implode(',', $approvalObjectUsers)); $this->objectAction = ObjectAction::APPROVED_WAIT_OTHERS; if ($this->approval->approval_mode == ApprovalMode::SEQUENTIAL_APPROVAL->value) { $this->actionExtraFields['next_sequential_user'] = $approvalObjectUsers[0]; } } protected function cleanApprovalFields() { $this->approval->node_level = null; $this->approval->users = null; $this->approval->approval_mode = null; } protected function approvedHandle() { $this->approval->status = ObjectApprovalStatus::APPROVED->value; $this->cleanApprovalFields(); $this->objectAction = ObjectAction::APPROVAL_APPROVED; } protected function approvedToNextNodeHandle(int $nextNodeIndex, array $nextNode) { $this->actionExtraFields['next'] = $nextNodeIndex; $this->approval->node_level = $nextNodeIndex; $this->approval->users = sprintf(",%s,", implode(',', $nextNode['approval_users'])); $this->approval->approval_mode = $nextNode['approval_mode']; $this->objectAction = ObjectAction::APPROVED_TO_NEXT_NODE; if ($this->approval->approval_mode == ApprovalMode::SEQUENTIAL_APPROVAL->value) { $this->actionExtraFields['next_sequential_user'] = $nextNode['approval_users'][0]; } } protected function rejected(): void { $this->approval->status = ObjectApprovalStatus::REJECTED->value; $this->cleanApprovalFields(); $this->objectAction = ObjectAction::APPROVAL_REJECTED; } }