Browse Source

approval detail & approval logs

moell 8 months ago
parent
commit
ca6e49388a

+ 36 - 1
app/Http/Controllers/API/ApprovalController.php

@@ -5,6 +5,10 @@ namespace App\Http\Controllers\API;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Approval\ActionRequest;
 use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
+use App\Http\Resources\API\ActionByApprovalLogResource;
+use App\Http\Resources\API\ApprovalFlowDetailResource;
+use App\Http\Resources\API\UserProfileResource;
+use App\Models\Action;
 use App\Models\Approval;
 use App\Models\ApprovalFlow;
 use App\Models\Enums\ApprovalFlowObjectType;
@@ -41,7 +45,38 @@ class ApprovalController extends Controller
      */
     public function show(string $id)
     {
-        //
+        $approval = Approval::query()
+            ->where("id", $id)
+            ->where(fn($query) => $query->where("users", 'like', '%,'.Auth::id().',%')->orWhere("created_by", Auth::id()))
+            ->firstOrFail();
+
+        $approvalObjectType = ApprovalObjectType::from($approval->object_type);
+        $object = $approvalObjectType
+            ->modelBuilder()
+            ->find($approval->object_id);
+
+        $actions = Action::with(['createdBy'])->where([
+            'object_type' => $approvalObjectType->actionObjectType(),
+            'object_id' => $object->id,
+            'additional_id' => $approval->id,
+        ])->orderByDesc("created_at")->get();
+
+        return $this->success([
+            'data' => [
+                'id' => $approval->id,
+                'status' => $approval->status,
+                'object_type' => $approval->object_type,
+                'object_id' => $approval->object_id,
+                'object' => [
+                    'id' => $object->id,
+                    'name' => $object[$approvalObjectType->nameField()],
+                ],
+                'node_level' => $approval->node_level,
+                'created_by' => new UserProfileResource($approval->createdBy),
+                'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
+                'approval_logs' => ActionByApprovalLogResource::collection($actions),
+            ]
+        ]);
     }
 
     public function action(ActionRequest $request, string $id, ActionService $actionService)

+ 25 - 0
app/Http/Resources/API/ActionByApprovalLogResource.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ActionByApprovalLogResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'action' => $this->action,
+            'action_label' => __('action-labels.label.' . $this->action),
+            'comment' => $this->comment,
+            'created_at' => (string)$this->created_at,
+            'created_by' => new UserProfileResource($this->createdBy),
+        ];
+    }
+}

+ 6 - 0
app/Models/Approval.php

@@ -18,10 +18,16 @@ class Approval extends Model
         'users',
         'remark',
         'created_by',
+        'status',
     ];
 
     public function approvalFlow()
     {
         return $this->belongsTo(ApprovalFlow::class)->withTrashed();
     }
+
+    public function createdBy()
+    {
+        return $this->belongsTo(User::class, 'created_by');
+    }
 }

+ 2 - 0
app/Models/Enums/ObjectAction.php

@@ -78,6 +78,8 @@ enum ObjectAction: string
 
     case WAITED ="waited";
 
+    case APPROVAL_REQUEST= 'approvalRequest';
+
     case APPROVAL_APPROVED = 'approvalApproved';
 
     case APPROVAL_REJECTED = 'approvalRejected';

+ 3 - 0
app/Repositories/ActionRepository.php

@@ -34,6 +34,7 @@ class ActionRepository
         string $comment = null,
         array $extraFields = [],
         array $objectChanges = [],
+        int $additionalId = null,
     ): \Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Builder
     {
         $action = Action::query()->create([
@@ -44,6 +45,7 @@ class ActionRepository
             "comment" => $comment,
             "extra_fields" => $extraFields ?: null,
             "created_by" => Auth::id(),
+            "additional_id" => $additionalId,
         ]);
 
         if ($objectChanges) {
@@ -73,6 +75,7 @@ class ActionRepository
             $comment,
             $extraFields,
             $objectChanges,
+            $approval->id,
         );
     }
 

+ 1 - 1
app/Services/Approval/ActionService.php

@@ -36,7 +36,7 @@ class ActionService
     protected function changeApprovalObjectStatus(): void
     {
         $object = ApprovalObjectType::from($this->approval->object_type)
-            ->modelBuilderAllowed($this->approval->object_id)
+            ->modelBuilder()
             ->findOrFail($this->approval->object_id);
 
         $object->approval_status = $this->approval->status;

+ 36 - 3
app/Services/Approval/StoreService.php

@@ -7,7 +7,9 @@ use App\Models\ApprovalFlow;
 use App\Models\Enums\ApprovalFlowObjectType;
 use App\Models\Enums\ApprovalFlowType;
 use App\Models\Enums\ApprovalObjectType;
+use App\Models\Enums\ObjectAction;
 use App\Models\Enums\ObjectApprovalStatus;
+use App\Repositories\ActionRepository;
 use Illuminate\Support\Facades\Auth;
 
 class StoreService
@@ -27,21 +29,52 @@ class StoreService
 
         $approvalFlow = $this->getApprovalFlow($approvalObjectType, $approvalObject);
 
+        $this->createApproval($approvalFlow, $approvalObjectType, $approvalObject->id, $request->remark);
+
+        $this->changeApprovalStatus($approvalObject);
+
+    }
+
+    protected function createApproval(
+        ApprovalFlow $approvalFlow, ApprovalObjectType $approvalObjectType, int $objectId,  string $remark = null
+    ): void
+    {
         $firstNode =  $approvalFlow->nodes[1];
-        Approval::query()->create([
+
+        $approval = Approval::query()->create([
             'approval_flow_id' => $approvalFlow->id,
             'object_type' => $approvalObjectType->flowType()->value,
-            'object_id' => $approvalObject->id,
+            'object_id' => $objectId,
             'node_level' => $firstNode['level'],
             'users' => sprintf(",%s,", implode(',', $firstNode['approval_users'])),
-            'remark' => $request->remark,
+            'remark' => $remark,
             'created_by' => Auth::id(),
+            'status' => ObjectApprovalStatus::DOING,
         ]);
 
+        ActionRepository::createByApproval(
+            $approval,
+            ObjectAction::APPROVAL_REQUEST,
+        );
+    }
+
+    protected function changeApprovalStatus($approvalObject): void
+    {
         $approvalObject->approval_status = ObjectApprovalStatus::DOING;
         $approvalObject->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,
+        };
+
+
+    }
+
     protected function getApprovalFlow(ApprovalObjectType $approvalObjectType, $approvalObject)
     {
         $approvalFlow = ApprovalFlow::query()

+ 28 - 0
database/migrations/2024_06_25_202905_add_additional_id_to_actions.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('actions', function (Blueprint $table) {
+            $table->integer("additional_id")->nullable()->index();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('actions', function (Blueprint $table) {
+            $table->dropColumn(['additional_id']);
+        });
+    }
+};

+ 1 - 0
lang/en/action-labels.php

@@ -43,6 +43,7 @@ return[
         ObjectAction::UNLINK_CHILDREN_TASK->value => "unlinked a child task",
         ObjectAction::BATCH_CREATE_TASK->value => "batch created tasks",
         ObjectAction::DELETE_CHILDREN_TASK->value => "delete children task",
+        ObjectAction::APPROVAL_REQUEST->value => "approval request",
         ObjectAction::APPROVAL_APPROVED->value => "approval approved",
         ObjectAction::APPROVAL_REJECTED->value => "approval rejected",
         ObjectAction::APPROVED_CANCELED->value => "approval canceled",