diff --git a/app/Http/Controllers/Api/Admin/HR/LeaveController.php b/app/Http/Controllers/Api/Admin/HR/LeaveController.php index 58742888..6151a450 100644 --- a/app/Http/Controllers/Api/Admin/HR/LeaveController.php +++ b/app/Http/Controllers/Api/Admin/HR/LeaveController.php @@ -53,6 +53,8 @@ public function store(Request $request): JsonResponse 'end_date' => 'required|date|after_or_equal:start_date', 'reason' => 'nullable|string|max:1000', 'approval_line_id' => 'nullable|integer|exists:approval_lines,id', + 'references' => 'nullable|array', + 'references.*.user_id' => 'required|integer|exists:users,id', ]); try { diff --git a/app/Services/HR/LeaveService.php b/app/Services/HR/LeaveService.php index 8e0b4fe4..76387094 100644 --- a/app/Services/HR/LeaveService.php +++ b/app/Services/HR/LeaveService.php @@ -118,7 +118,7 @@ public function storeLeave(array $data): Leave ]); // 결재 자동 생성 + 상신 (유형에 맞는 결재양식 자동 선택) - $approval = $this->createLeaveApproval($leave, $tenantId, $data['approval_line_id'] ?? null); + $approval = $this->createLeaveApproval($leave, $tenantId, $data['approval_line_id'] ?? null, $data['references'] ?? []); $leave->update(['approval_id' => $approval->id]); return $leave; @@ -992,7 +992,7 @@ public function sendPromotionNotices(array $employeeIds, string $noticeType, int /** * 휴가/근태신청/사유서 결재 자동 생성 + 상신 */ - private function createLeaveApproval(Leave $leave, int $tenantId, ?int $approvalLineId = null): Approval + private function createLeaveApproval(Leave $leave, int $tenantId, ?int $approvalLineId = null, array $references = []): Approval { $approvalService = app(ApprovalService::class); @@ -1033,6 +1033,21 @@ private function createLeaveApproval(Leave $leave, int $tenantId, ?int $approval 'step_type' => $s['step_type'] ?? $s['type'] ?? 'approval', ])->toArray(); + // 4-1. 개별 참조자 추가 (결재선에 없는 사용자만) + if (! empty($references)) { + $existingUserIds = collect($steps)->pluck('user_id')->toArray(); + foreach ($references as $ref) { + $refUserId = (int) ($ref['user_id'] ?? 0); + if ($refUserId && ! in_array($refUserId, $existingUserIds)) { + $steps[] = [ + 'user_id' => $refUserId, + 'step_type' => 'reference', + ]; + $existingUserIds[] = $refUserId; + } + } + } + // 5. 결재 제목 생성 (유형별 차별화) $typeName = Leave::TYPE_MAP[$leave->leave_type] ?? $leave->leave_type; $userName = $leave->user->name ?? ''; diff --git a/resources/views/hr/leaves/index.blade.php b/resources/views/hr/leaves/index.blade.php index 683fdca6..165d4b30 100644 --- a/resources/views/hr/leaves/index.blade.php +++ b/resources/views/hr/leaves/index.blade.php @@ -272,6 +272,56 @@ class="text-xs text-blue-600 hover:underline mt-1"> @endif + {{-- 참조 선택 --}} +
+ +
+ +
+
+ +
+ + +
+
+
+