|
@@ -0,0 +1,80 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services\Approval;
|
|
|
+
|
|
|
+use App\Models\Approval;
|
|
|
+use App\Models\Enums\ApprovalObjectType;
|
|
|
+use App\Models\Enums\ObjectAction;
|
|
|
+use App\Models\Enums\ObjectApprovalStatus;
|
|
|
+use App\Repositories\ActionRepository;
|
|
|
+
|
|
|
+class ActionService
|
|
|
+{
|
|
|
+ protected ?Approval $approval = null;
|
|
|
+
|
|
|
+ public function action(Approval $approval, int $status, string $comment = null): void
|
|
|
+ {
|
|
|
+ $this->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)
|
|
|
+ ->modelBuilderAllowed($this->approval->object_id)
|
|
|
+ ->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;
|
|
|
+ }
|
|
|
+}
|