feat: [approval] 기안함 휴가신청 → 휴가관리 연동

- 기안함에서 휴가/근태신청/사유서 양식 선택 시 전용 입력 폼 표시
- 양식코드별 유형 필터링 (leave/attendance_request/reason_report)
- saveApproval()에서 content에 구조화된 데이터 포함
- handleApprovalCompleted()에서 Leave 없을 시 자동 생성
- createLeaveFromApproval() 메서드 추가
This commit is contained in:
김보곤
2026-03-05 15:57:36 +09:00
parent 7b9c101065
commit a63b501964
4 changed files with 230 additions and 6 deletions

View File

@@ -5,6 +5,7 @@
use App\Models\Finance\BankAccount;
use App\Models\Finance\CorporateCard;
use App\Services\ApprovalService;
use App\Services\HR\LeaveService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\View\View;
@@ -39,8 +40,9 @@ public function create(Request $request): View|Response
$forms = $this->service->getApprovalForms();
$lines = $this->service->getApprovalLines();
[$cards, $accounts] = $this->getCardAndAccountData();
$employees = app(LeaveService::class)->getActiveEmployees();
return view('approvals.create', compact('forms', 'lines', 'cards', 'accounts'));
return view('approvals.create', compact('forms', 'lines', 'cards', 'accounts', 'employees'));
}
/**

View File

@@ -801,6 +801,39 @@ public function markCompletedAsRead(int $userId): int
// Private 헬퍼
// =========================================================================
/**
* 기안함에서 직접 올린 결재 → Leave 레코드 자동 생성
*/
private function createLeaveFromApproval(Approval $approval): \App\Models\HR\Leave
{
$content = $approval->content;
$leaveType = $content['leave_type'];
$leaveService = app(\App\Services\HR\LeaveService::class);
// 사유서는 days=0, 그 외는 자동 계산
if (in_array($leaveType, \App\Models\HR\Leave::REASON_REPORT_TYPES)) {
$days = 0;
} else {
$days = $leaveService->calculateDays(
$leaveType, $content['start_date'], $content['end_date']
);
}
return \App\Models\HR\Leave::create([
'tenant_id' => $approval->tenant_id,
'user_id' => $content['user_id'] ?? $approval->drafter_id,
'leave_type' => $leaveType,
'start_date' => $content['start_date'],
'end_date' => $content['end_date'],
'days' => $days,
'reason' => $content['reason'] ?? null,
'status' => 'pending',
'approval_id' => $approval->id,
'created_by' => $approval->drafter_id,
'updated_by' => $approval->drafter_id,
]);
}
/**
* 휴가/근태신청/사유서 관련 결재 양식인지 확인
*/
@@ -819,6 +852,12 @@ private function handleApprovalCompleted(Approval $approval): void
}
$leave = \App\Models\HR\Leave::where('approval_id', $approval->id)->first();
// 기안함에서 직접 올린 경우: Leave 레코드 자동 생성
if (! $leave && ! empty($approval->content['leave_type'])) {
$leave = $this->createLeaveFromApproval($approval);
}
if ($leave && $leave->status === 'pending') {
app(\App\Services\HR\LeaveService::class)->approveByApproval($leave, $approval);
}