# 근태현황 자동 결근 처리 → 수동 트리거 전환

**날짜:** 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)
