Browse Source

PDF signature for approval

moell 5 months ago
parent
commit
d26733f360

+ 2 - 2
app/Http/Controllers/API/ApprovalController.php

@@ -77,7 +77,7 @@ class ApprovalController extends Controller
             ->modelBuilder()
             ->find($approval->object_id);
 
-        $actions = Action::with(['createdBy'])->where([
+        $actions = Action::with(['createdBy', 'file'])->where([
             'object_type' => $approvalObjectType->actionObjectType(),
             'object_id' => $object->id,
             'additional_id' => $approval->id,
@@ -113,7 +113,7 @@ class ApprovalController extends Controller
 
         throw_validation_if(! $approval, "No authority for approval");
 
-        $actionService->action($approval, $request->status, $request->get("comment"));
+        $actionService->action($approval, $request->status, $request->get("comment"), $request->file("signature_file"));
 
         return $this->noContent();
     }

+ 1 - 1
app/Http/Controllers/API/ContainerController.php

@@ -94,7 +94,7 @@ class ContainerController extends Controller
             $request->get("file_uuid"),
         );
 
-        $service->fileNameNamingRuleCheckByContainer($request->library_id, $request->naming_rule_id);
+        $service->fileNameNamingRuleCheckByContainer($request->library_id, (int)$request->naming_rule_id);
 
         if ($request->has("naming_rule_id") && $request->get("naming_rule_id") > 0) {
             $keys = $customFieldRepo->keysByGroup($request->get("naming_rule_id"));

+ 5 - 0
app/Http/Requests/API/Approval/ActionRequest.php

@@ -3,6 +3,7 @@
 namespace App\Http\Requests\API\Approval;
 
 use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rules\File;
 
 class ActionRequest extends FormRequest
 {
@@ -24,6 +25,10 @@ class ActionRequest extends FormRequest
         return [
             "status" => "required|in:1,2",
             "comment" => "max:255",
+            "signature_file" => [
+                'file',
+                File::types(['pdf'])->max("10mb")
+            ]
         ];
     }
 }

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

@@ -20,6 +20,7 @@ class ActionByApprovalLogResource extends JsonResource
             'comment' => $this->comment,
             'created_at' => (string)$this->created_at,
             'created_by' => new UserProfileResource($this->createdBy),
+            'signature_file' => new FileByObjectResource($this->file),
         ];
     }
 }

+ 7 - 0
app/Models/Action.php

@@ -2,9 +2,11 @@
 
 namespace App\Models;
 
+use App\Models\Enums\FileObjectType;
 use EloquentFilter\Filterable;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\HasOne;
 
 class Action extends Model
 {
@@ -25,4 +27,9 @@ class Action extends Model
     {
         return $this->hasMany(History::class);
     }
+
+    public function file(): HasOne
+    {
+        return $this->hasOne(File::class, "object_id")->where("object_type", FileObjectType::ACTION);
+    }
 }

+ 13 - 4
app/Services/Approval/ActionService.php

@@ -5,20 +5,25 @@ namespace App\Services\Approval;
 use App\Models\Approval;
 use App\Models\Enums\ApprovalMode;
 use App\Models\Enums\ApprovalObjectType;
+use App\Models\Enums\FileObjectType;
 use App\Models\Enums\ObjectAction;
 use App\Models\Enums\ObjectApprovalStatus;
 use App\Repositories\ActionRepository;
+use App\Services\File\Upload\FileUploadHelper;
+use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Auth;
 
 class ActionService
 {
+    use FileUploadHelper;
+
     protected ?Approval $approval = null;
 
     protected array $actionExtraFields = [];
 
     protected ?ObjectAction $objectAction = null;
 
-    public function action(Approval $approval, int $status, string $comment = null): void
+    public function action(Approval $approval, int $status, string $comment = null, ?UploadedFile $uploadedFile = null): void
     {
         $this->approval = $approval;
 
@@ -26,6 +31,8 @@ class ActionService
             'now' => $this->approval->node_level
         ];
 
+        $fileInfo = $uploadedFile ? $this->chunkUploadFileByCompany($uploadedFile, FileObjectType::ACTION->value) : [];
+
         match($status) {
             1 => $this->approved(),
             default => $this->rejected(),
@@ -33,11 +40,13 @@ class ActionService
 
         $this->actionExtraFields['approval_mode'] = $this->approval->approval_mode;
 
-        $this->triggerAction($comment);
+        $action = $this->triggerAction($comment);
 
         $this->changeApprovalObjectStatus();
 
         $this->changeApprovalStatus();
+
+        $this->fileToDatabase($fileInfo, $action->id);
     }
 
     protected function changeApprovalStatus(): void
@@ -55,9 +64,9 @@ class ActionService
         $object->save();
     }
 
-    protected function triggerAction (string $comment = null): void
+    protected function triggerAction (string $comment = null)
     {
-        ActionRepository::createByApproval(
+        return ActionRepository::createByApproval(
             $this->approval,
             $this->objectAction,
             $comment,

+ 55 - 0
app/Services/File/Upload/FileUploadHelper.php

@@ -0,0 +1,55 @@
+<?php
+
+namespace App\Services\File\Upload;
+
+use App\Libraries\ChunkedUpload\ChunkedUploadFactory;
+use App\Models\File;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Http\UploadedFile;
+use Illuminate\Support\Facades\Auth;
+
+trait FileUploadHelper
+{
+    protected function getFileExtension(UploadedFile $file): string
+    {
+        return $file->getClientOriginalExtension()
+            ? $file->getClientOriginalExtension()
+            : pathinfo($file->getClientOriginalName(), PATHINFO_EXTENSION);
+    }
+
+    protected function chunkUploadFileByCompany(
+        UploadedFile $file, string $objectType, ?ProgressBar $progressBar = null
+    ) {
+        $extension = $this->getFileExtension($file);
+
+        $pathname = ChunkedUploadFactory::make()->upload(
+            $file,
+            cos_upload_prefix(Auth::user()->company_id, $objectType),
+            sprintf("%s.%s", md5(uniqid()), $extension),
+            $progressBar
+        );
+
+        return [
+            'pathname' => $pathname,
+            'title' => $file->getClientOriginalName(),
+            'size' => $file->getSize(),
+            'extension' => $extension,
+            'object_type' => $objectType,
+            'created_by' => Auth::id(),
+            'company_id' => Auth::user()->company_id,
+        ];
+    }
+
+    protected function fileToDatabase(array $fileInfo = [], int $objectId = null, array $fields = []): Model|\Illuminate\Database\Eloquent\Builder|null
+    {
+        if (! $fileInfo || ! $objectId) {
+            return null;
+        }
+
+        return File::query()->create([
+            ...$fileInfo,
+            'object_id' => $objectId,
+            ...$fields,
+        ]);
+    }
+}