|
@@ -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()
|