|
@@ -10,6 +10,7 @@ use App\Models\Enums\ApprovalMode;
|
|
|
use App\Models\Enums\ApprovalObjectType;
|
|
|
use App\Models\Enums\ObjectAction;
|
|
|
use App\Models\Enums\ObjectApprovalStatus;
|
|
|
+use App\Models\File;
|
|
|
use App\Repositories\ActionRepository;
|
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
|
@@ -23,21 +24,21 @@ class StoreService
|
|
|
|
|
|
$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'
|
|
|
- );
|
|
|
+ $this->checkStatus($approvalObject, $approvalObjectType);
|
|
|
|
|
|
$approvalFlow = $this->getApprovalFlow($approvalObjectType, $approvalObject);
|
|
|
|
|
|
- $this->createApproval($approvalFlow, $approvalObjectType, $approvalObject->id, $request->remark);
|
|
|
-
|
|
|
- $this->changeApprovalStatus($approvalObject);
|
|
|
+ $containerFileIds = $request->get("file_ids", []);
|
|
|
|
|
|
+ $this->createApproval($approvalFlow, $approvalObjectType, $approvalObject, $request->remark, $containerFileIds);
|
|
|
}
|
|
|
|
|
|
protected function createApproval(
|
|
|
- ApprovalFlow $approvalFlow, ApprovalObjectType $approvalObjectType, int $objectId, string $remark = null
|
|
|
+ ApprovalFlow $approvalFlow,
|
|
|
+ ApprovalObjectType $approvalObjectType,
|
|
|
+ $approvalObject,
|
|
|
+ string $remark = null,
|
|
|
+ array $containerFileIds = [],
|
|
|
): void
|
|
|
{
|
|
|
$firstNode = $approvalFlow->nodes[1];
|
|
@@ -45,7 +46,7 @@ class StoreService
|
|
|
$approval = Approval::query()->create([
|
|
|
'approval_flow_id' => $approvalFlow->id,
|
|
|
'object_type' => $approvalObjectType->flowType()->value,
|
|
|
- 'object_id' => $objectId,
|
|
|
+ 'object_id' => $approvalObject->id,
|
|
|
'node_level' => $firstNode['level'],
|
|
|
'approval_mode' => $firstNode['approval_mode'],
|
|
|
'users' => sprintf(",%s,", implode(',', $firstNode['approval_users'])),
|
|
@@ -53,12 +54,17 @@ class StoreService
|
|
|
'created_by' => Auth::id(),
|
|
|
'status' => ObjectApprovalStatus::DOING,
|
|
|
'company_id' => Auth::user()->company_id,
|
|
|
+ 'sub_object_ids' => $containerFileIds,
|
|
|
]);
|
|
|
|
|
|
$extraFields = [
|
|
|
'now' => 0,
|
|
|
'next' => 1,
|
|
|
'approval_mode' => $firstNode['approval_mode'],
|
|
|
+ 'batch' => [
|
|
|
+ 'type' => 'file',
|
|
|
+ 'ids' => $containerFileIds,
|
|
|
+ ]
|
|
|
];
|
|
|
|
|
|
if ($approval->approval_mode == ApprovalMode::SEQUENTIAL_APPROVAL->value) {
|
|
@@ -70,10 +76,34 @@ class StoreService
|
|
|
ObjectAction::APPROVAL_REQUEST,
|
|
|
extraFields: $extraFields,
|
|
|
);
|
|
|
+
|
|
|
+ $this->changeApprovalStatus($approvalObject, $approvalObjectType, $approval, $containerFileIds);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function checkStatus($approvalObject, ApprovalObjectType $approvalObjectType)
|
|
|
+ {
|
|
|
+ if ($approvalObjectType == ApprovalObjectType::CONTAINER_FILE) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw_validation_if(
|
|
|
+ in_array($approvalObject?->approval_status, [ObjectApprovalStatus::DOING->value]),
|
|
|
+ 'Do not initiate duplicate approvals'
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
- protected function changeApprovalStatus($approvalObject): void
|
|
|
+ protected function changeApprovalStatus(
|
|
|
+ $approvalObject, ApprovalObjectType $approvalObjectType, Approval $approval, array $containerFileIds = []
|
|
|
+ ): void
|
|
|
{
|
|
|
+ if ($approvalObjectType == ApprovalObjectType::CONTAINER_FILE) {
|
|
|
+ File::query()->whereIn("id", $containerFileIds)->update([
|
|
|
+ 'approval_status' => ObjectApprovalStatus::DOING,
|
|
|
+ 'latest_approval_id' => $approval->id,
|
|
|
+ ]);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
$approvalObject->approval_status = ObjectApprovalStatus::DOING;
|
|
|
$approvalObject->save();
|
|
|
}
|