diff --git a/INDEX.md b/INDEX.md index 86a0b0e..aecabe5 100644 --- a/INDEX.md +++ b/INDEX.md @@ -298,6 +298,7 @@ DB 도메인별: | [20260319_card_transaction_display_unification.md](changes/20260319_card_transaction_display_unification.md) | 카드거래 표시 포맷 3개 화면 통일 (계정별원장·일반전표·카드사용내역) | | [20260319_split_card_journal_matching_fix.md](changes/20260319_split_card_journal_matching_fix.md) | 분리 카드거래 분개 매칭 + 개별 행 확장 표시 수정 | | [20260320_income_statement_monthly_total_and_items.md](changes/20260320_income_statement_monthly_total_and_items.md) | 손익계산서 월별보기 합계 열 추가 및 세부계정과목 표시 개선 | +| [20260320_attendance_manual_absent.md](changes/20260320_attendance_manual_absent.md) | 근태현황 자동 결근 처리 → 수동 트리거 전환 (스케줄러 비활성화, 버튼 추가) | --- diff --git a/changes/20260320_attendance_manual_absent.md b/changes/20260320_attendance_manual_absent.md new file mode 100644 index 0000000..275d19a --- /dev/null +++ b/changes/20260320_attendance_manual_absent.md @@ -0,0 +1,76 @@ +# 근태현황 자동 결근 처리 → 수동 트리거 전환 + +**날짜:** 2026-03-20 +**작업자:** Claude Code + +## 변경 개요 + +근태현황의 자동 결근 처리 기능을 **수동 트리거 방식**으로 전환한다. + +- 기존: 매일 23:50 스케줄러가 전체 테넌트 대상으로 자동 실행 +- 변경: 근태현황 페이지에서 관리자가 날짜를 선택하여 수동 실행 + +--- + +## 수정된 파일 + +| 파일 | 변경 내용 | +|------|----------| +| `mng/routes/console.php` | 매일 23:50 스케줄러 비활성화 (주석 처리) | +| `mng/app/Services/HR/AttendanceService.php` | `markAbsentees()` 단일 테넌트 기반 + 제외 사원 필터 + 결과에 사원명 포함 | +| `mng/app/Http/Controllers/Api/Admin/HR/AttendanceController.php` | `markAbsent()` 수동 트리거 API 엔드포인트 추가 | +| `mng/routes/api.php` | `POST /mark-absent` 라우트 등록 | +| `mng/resources/views/hr/attendances/index.blade.php` | 결근 처리 버튼 + 모달 + JavaScript 추가 | +| `mng/app/Console/Commands/MarkAbsentEmployees.php` | 새 반환 형식(`array`)에 맞게 출력 수정 | + +--- + +## 상세 변경 사항 + +### 1. 스케줄러 비활성화 + +`routes/console.php`에서 `attendance:mark-absent` 스케줄 주석 처리. artisan 커맨드는 유지하여 필요 시 CLI에서 수동 실행 가능. + +### 2. `markAbsentees()` 메서드 변경 + +| 항목 | 기존 | 변경 | +|------|------|------| +| 대상 범위 | 전체 테넌트 순회 | 현재 세션 테넌트만 | +| 제외 처리 | 없음 | `getExcludedUserIds()` 적용 (영업팀 + `is_excluded`) | +| 반환값 | `int` (처리 건수) | `array` (`count`, `skipped_weekend`, `names`) | +| `created_by` | `null` (시스템) | `auth()->id()` (실행한 관리자) | +| `remarks` | `'자동 결근 처리'` | `'결근 처리 (수동)'` | + +### 3. API 엔드포인트 + +``` +POST /api/admin/hr/attendances/mark-absent +``` + +| 파라미터 | 타입 | 필수 | 설명 | +|---------|------|:----:|------| +| `date` | date | ✅ | 대상 날짜 (오늘 이전만 허용) | + +응답 예시: + +```json +{ + "success": true, + "message": "3명 결근 처리 완료", + "data": { + "count": 3, + "skipped_weekend": false, + "names": ["홍길동", "김철수", "이영희"] + } +} +``` + +### 4. UI 변경 + +근태현황 페이지 우상단에 빨간색 **"결근 처리"** 버튼 추가. 클릭 시 모달에서 날짜 선택 → 확인 → 실행 → 결과(사원명 목록) 표시. 처리 후 테이블과 통계 자동 갱신. + +--- + +## 관련 문서 + +- [근태현황 승인된 휴가 누락 attendance 레코드 자동 보정](20260319_attendance_leave_sync_fix.md)