approval = $approval; match($status) { 1 => $this->approved(), default => $this->rejected(), }; $this->triggerAction($comment); $this->changeApprovalObjectStatus(); $this->changeApprovalStatus(); } 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): void { $objectAction = match ($this->approval->status) { ObjectApprovalStatus::APPROVED->value => ObjectAction::APPROVAL_APPROVED, ObjectApprovalStatus::DOING->value => ObjectAction::APPROVED_TO_NEXT_NODE, ObjectApprovalStatus::REJECTED->value => ObjectAction::APPROVAL_REJECTED, }; ActionRepository::createByApproval( $this->approval, $objectAction, $comment ); } protected function approved(): void { $approvalFlowNodes = $this->approval->approvalFlow?->nodes; $nextNodeIndex = $this->approval->node_level + 1; $nextNodes = $approvalFlowNodes[$nextNodeIndex] ?? []; if (! $nextNodes) { $this->approval->status = ObjectApprovalStatus::APPROVED->value; return; } $this->approval->node_level = $nextNodeIndex; $this->approval->users = sprintf(",%s,", implode(',', $nextNodes['approval_users'])); } protected function rejected(): void { $this->approval->status = ObjectApprovalStatus::REJECTED->value; } }