|
@@ -0,0 +1,63 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Services\Approval;
|
|
|
+
|
|
|
+use App\Models\Approval;
|
|
|
+use App\Models\ApprovalFlow;
|
|
|
+use App\Models\Enums\ApprovalFlowObjectType;
|
|
|
+use App\Models\Enums\ApprovalFlowType;
|
|
|
+use App\Models\Enums\ApprovalObjectType;
|
|
|
+use App\Models\Enums\ObjectApprovalStatus;
|
|
|
+use Illuminate\Support\Facades\Auth;
|
|
|
+
|
|
|
+class StoreService
|
|
|
+{
|
|
|
+ public function store()
|
|
|
+ {
|
|
|
+ $request = request();
|
|
|
+
|
|
|
+ $approvalObjectType = ApprovalObjectType::from($request->object_type);
|
|
|
+
|
|
|
+ $approvalObject = $approvalObjectType->modelBuilderAllowed($request->object_id)->findOrFail($request->object_id);
|
|
|
+
|
|
|
+ throw_validation_if(
|
|
|
+ in_array($approvalObject?->approval_status, [ObjectApprovalStatus::DOING->value]),
|
|
|
+ 'Do not initiate duplicate approvals'
|
|
|
+ );
|
|
|
+
|
|
|
+ $approvalFlow = $this->getApprovalFlow($approvalObjectType, $approvalObject);
|
|
|
+
|
|
|
+ $firstNode = $approvalFlow->nodes[1];
|
|
|
+ Approval::query()->create([
|
|
|
+ 'approval_flow_id' => $approvalFlow->id,
|
|
|
+ 'object_type' => $approvalObjectType->flowType()->value,
|
|
|
+ 'object_id' => $approvalObject->id,
|
|
|
+ 'node_level' => $firstNode['level'],
|
|
|
+ 'users' => sprintf(",%s,", implode(',', $firstNode['approval_users'])),
|
|
|
+ 'remark' => $request->remark,
|
|
|
+ 'created_by' => Auth::id(),
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $approvalObject->approval_status = ObjectApprovalStatus::DOING;
|
|
|
+ $approvalObject->save();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function getApprovalFlow(ApprovalObjectType $approvalObjectType, $approvalObject)
|
|
|
+ {
|
|
|
+ $approvalFlow = ApprovalFlow::query()
|
|
|
+ ->where("type", $approvalObjectType->flowType())
|
|
|
+ ->when(
|
|
|
+ $approvalObjectType->flowType() == ApprovalFlowType::TASK,
|
|
|
+ fn ($query) => $query->orWhere([
|
|
|
+ 'object_type' => ApprovalFlowObjectType::PROJECT->value,
|
|
|
+ 'object_id' => $approvalObject->id,
|
|
|
+ ])
|
|
|
+ )
|
|
|
+ ->where("status", 1)
|
|
|
+ ->orderByDesc("created_at")
|
|
|
+ ->first();
|
|
|
+ throw_validation_if(! $approvalFlow, 'Clearly set up approval flow rules first.');
|
|
|
+
|
|
|
+ return $approvalFlow;
|
|
|
+ }
|
|
|
+}
|