# 인사관리 (슬라이드 28-46)

## 1. 개요

인사관리 모듈은 부서, 사원, 근태, 휴가를 관리합니다.

## 2. 부서관리 (슬라이드 30-31)

### 2.1 전체 선택 체크박스
- 클릭: 전체 선택 설정/해제 토글
- 디폴트: 설정 해제 상태

### 2.2 개별 선택 체크박스
- 클릭: 개별 선택 설정/해제 토글
- 디폴트: 설정 해제 상태

### 2.3 추가 버튼
- 클릭: 선택된 부서의 하위 부서 일괄 생성
- 관리 권한이 없을 경우 숨김

### 2.4 삭제 버튼
- 클릭: "선택한 부서 N개를 삭제하시겠습니까?" 확인 Alert 표시
- 확인 선택 시 삭제된 부서 사원의 인원은 회사(기본) 인원으로 변경

### 2.5 확대 버튼
- 클릭: (6) 확대 버튼으로 변경, 하위 부서 숨김 처리

### 2.6 축소 버튼
- 클릭: (5) 축소 버튼으로 변경, 하위 부서 표시 처리

### 2.7 추가 버튼
- 클릭: 부서 추가 팝업 표시

### 2.8 수정 버튼
- 클릭: 부서 수정 팝업 표시

### 2.9 부서 추가/수정 팝업
- 부서명 인풋박스: 기존 부서명 표시, 수정 가능

## 3. 사원관리 (슬라이드 32-40)

### 3.1 기간 설정 영역
- 입사일 기준

### 3.2 기간 설정 버튼 영역
- 종류: 당해년도, 전전월, 전월, 당월, 어제, 오늘
- 클릭: 해당 기간이 (1) 영역에 설정되며 화면 전체에 적용 처리

### 3.3 CSV 일괄 등록 버튼
- 클릭: CSV 일괄 등록 화면으로 이동

### 3.4 사원 등록 버튼
- 클릭: 사원 상세 화면으로 이동

### 3.5 사용자 초대 버튼
- 클릭: 사용자 초대 팝업 표시

### 3.6 필터 셀렉트 박스
- 종류: 전체, 사용자 아이디 보유, 사용자 아이디 미보유, 재직, 휴직, 퇴직
- 디폴트: 전체

### 3.7 정렬 셀렉트 박스
- 종류: 직급순, 부서 오름차순, 부서 내림차순, 이름 오름차순, 이름 내림차순
- 디폴트: 직급순

### 3.8 현황 카드
| 항목 | 설명 |
|------|------|
| 현직 | 전체 현직 사원 수 |
| 휴직 | 전체 휴직 사원 수 |
| 퇴직 | (1) 해당 기간의 퇴직 사원 수 |
| 평균근속년수 | 전체 현직 사원 기준 |

## 4. 사원 상세 (슬라이드 33-36)

### 4.1 사원 정보 영역 (필수)
| 필드명 | 필수 | 설명 |
|--------|------|------|
| 이름 | Y | |
| 주민등록번호 | Y | |
| 휴대폰 | Y | |
| 이메일 | Y | |
| 연봉 | N | |
| 급여계좌 은행 | N | 은행 선택 |
| 계좌 | N | |
| 예금주 | N | |

### 4.2 사용자 정보 영역
| 필드명 | 필수 | 설명 |
|--------|------|------|
| 아이디 | N | 이메일 또는 아이디 |
| 비밀번호 | N | 최소 8자 이상 영문+숫자+특수문자 조합 |
| 권한 | N | 권한관리의 목록 표시 |
| 상태 | N | 종류: 정상, 재직, 중지. 재직 상태인 경우 로그아웃 처리, 로그인 시 '재정중인 아이디입니다.' 팝업 |

### 4.3 사원 상세 영역 (선택)
| 필드명 | 필수 | 설명 |
|--------|------|------|
| 프로필 사진 | N | 1250x250px, 10MB 이하 PNG, JPEG, GIF |
| 사원코드 | N | |
| 성별 | N | 남성/여성 |
| 주소 | N | 우편번호 찾기 + 상세주소 |

### 4.4 인사 정보 영역
| 필드명 | 필수 | 설명 |
|--------|------|------|
| 입사일 | N | |
| 고용 형태 | N | 종류: 정규직, 계약직, 파견직, 용역직, 시간제 근로자 |
| 직급 | N | 직급관리 화면에서 설정 |
| 상태 | N | 종류: 재직, 병가휴직, 육아휴직, 개인사정휴직, 무급휴직, 퇴사, 해고, 권고사직, 계약만료, 정년퇴직 |
| 부서 | N | 부서관리 화면에서 설정 |
| 직책 | N | 직책관리 화면에서 설정 |
| 출근 위치 | N | 본사, 현장 목록 |
| 퇴근 위치 | N | 본사, 현장 목록 |
| 퇴사일 | N | |
| 퇴사 사유 | N | |

### 4.5 항목 설정 버튼
- 클릭: 항목 설정 팝업 표시

### 4.6 항목 설정 팝업 (슬라이드 34)
- 전체 설정 ON/OFF 버튼
- 개별 설정 ON/OFF 버튼
- 디폴트: 설정 OFF 상태

## 5. CSV 일괄 등록 (슬라이드 39-40)

### 5.1 양식 다운로드 버튼
- 클릭: 등록된 양식 CSV 다운로드

### 5.2 파일 선택 버튼
- 클릭: 파일 탐색기 팝업, CSV 1개만 등록

### 5.3 파일 변환 버튼
- 클릭: CSV 데이터를 (3-1) 정보 등록 영역에 변환값 표시
- 범위: 사원 상세 화면의 전체 항목

### 5.4 등록 버튼
- 파일변환 완료 & (2) 체크 설정 항목 있을 경우에만 버튼 활성화
- 클릭: "(등록)의 정보를 정말 등록하시겠습니까?" 확인 Alert 표시
- 확인 클릭 시 (2) 체크 된 정보만 등록, "정보 등록이 완료되었습니다." 알림 Alert 표시

## 6. 사용자 초대 (슬라이드 37-38)

### 6.1 사용자 초대 프로세스
- 초대 이메일로 발송 → 약관 동의 (아이디를 이메일로 사용) → 비밀번호 설정 → 로그인

### 6.2 초대할 이메일 주소 인풋박스
- ','로 구분하여 여러 주소 입력 가능

### 6.3 권한 셀렉트 박스, 검색
- 종류: 권한관리의 목록 표시

### 6.4 초대 메시지 인풋박스

### 6.5 초대 버튼
- 클릭: 사용자 초대 이메일 발송
- 이메일 주소 기준 사원 정보가 있을 경우에는 대량하여 사용자 등록 처리
- 없을 경우에는 사용자에만 등록하고 나머지 사원 정보는 직접 입력 필요
- 사용자 아이디 중복 불가

## 7. 근태관리 (슬라이드 41-42)

### 7.1 근태관리 현황 카드
| 항목 | 설명 |
|------|------|
| 정시 출근 | 전체 정시 출근 수 |
| 지각 | 전체 지각 수 |
| 결근 | 전체 결근 수 |
| 휴가 | 전체 휴가 수 |

### 7.2 기간 설정 버튼 영역
- 종류: 당해년도, 전전월, 전월, 당월, 어제, 오늘
- 클릭: 해당 기간이 설정되며 화면 전체에 적용 처리
- 근태관리 자동 설정 시: 모든 사원이 정시 출퇴근한 것으로 기록, 예외사항만 경우 작성

### 7.3 근태 등록 버튼
- 클릭: 근태 정보 팝업 표시

### 7.4 사유 등록 버튼
- 클릭: 사유 정보 팝업 표시

### 7.5 필터 셀렉트 박스
- 종류: 전체, 정시 출근, 지각, 결근, 휴가, 출장, 외근, 연장근무
- 디폴트: 전체

### 7.6 정렬 셀렉트 박스
- 종류: 직급순, 부서 오름차순, 부서 내림차순, 이름 오름차순, 이름 내림차순
- 디폴트: 직급순

### 7.7 근태 정보 팝업
| 필드명 | 설명 |
|--------|------|
| 대상 | 사원 셀렉트 박스, 검색&다중 선택 |
| 기준일 | 달력 팝업 표시, 일자 다중 선택 가능, 디폴트: 당일 |
| 출근 시간 | 시/분 선택 |
| 퇴근 시간 | 시/분 선택 |
| 야간 연장 시간 | 주당 연장 근로 시간에서 주말 연장 시간을 차감한 이내에만 설정 가능 |
| 주말 연장 시간 | 주당 연장 근로 시간에서 야간 연장 시간을 차감한 이내에만 설정 가능 |

### 7.8 사유 정보 팝업
| 필드명 | 설명 |
|--------|------|
| 대상 | 사원 셀렉트 박스 |
| 기준일 | 달력 팝업 |
| 내용 | 내용 입력 |

## 8. 휴가관리 (슬라이드 43-46)

### 8.1 휴가관리 탭
- 휴가 사용 현황
- 휴가 부여 현황
- 휴가 신청 현황

### 8.2 휴가관리 현황 카드
| 항목 | 설명 |
|------|------|
| 휴가 승인 대기 | |
| 연차 | 전체 연차 사원 수 |
| 결조사 | |
| 연간 연차 사용률 | |

### 8.3 필터 셀렉트 박스
- 종류: 전체, 모든 사원 목록
- 항목: 부서명, 직급명, 사원명 표시
- 디폴트: 전체

### 8.4 정렬 셀렉트 박스
- 종류: 직급순, 부서 오름차순, 부서 내림차순, 이름 오름차순, 이름 내림차순
- 디폴트: 직급순

### 8.5 휴가 부여 팝업
| 필드명 | 설명 |
|--------|------|
| 유형 | 종류: 연차, 보상, 경조, 보건, 병가, 반차, 반수 선택 |
| 사유 | |
| 일수 | 개월/일/시간 선택 |

### 8.6 휴가 신청 팝업
| 필드명 | 설명 |
|--------|------|
| 잔여 | 잔여 일수 표시 |
| 유형 | 종류: 연차, 보상, 경조, 보건, 병가, 반차 |
| 기간 | 날짜 선택, (5) 반차 선택 시에는 시간으로 변경 |

### 8.7 휴가 신청 현황 필터
- 종류: 승인, 거절
- 1/3 완료: 결재선 승인 진행도에 따라 표시

---

## 데이터 모델

### Department (부서)
```
- id: bigint
- tenant_id: bigint (FK)
- parent_id: bigint (FK, nullable)
- name: string
- order: int
- is_active: boolean
- created_at: timestamp
```

### Employee (사원)
```
- id: bigint
- tenant_id: bigint (FK)
- user_id: bigint (FK, nullable)
- department_id: bigint (FK, nullable)
- employee_code: string
- name: string
- resident_number: string (encrypted)
- phone: string
- email: string
- salary: decimal
- bank_code: string
- account_number: string
- account_holder: string
- profile_image: string
- gender: enum('male', 'female')
- address: string
- hire_date: date
- employment_type: enum('regular', 'contract', 'dispatch', 'service', 'part_time')
- position_id: bigint (FK)
- job_title_id: bigint (FK)
- status: enum('active', 'leave', 'sick_leave', 'parental_leave', 'personal_leave', 'unpaid_leave', 'resigned', 'dismissed', 'recommended_resignation', 'contract_expired', 'retired')
- check_in_location_id: bigint (FK, nullable)
- check_out_location_id: bigint (FK, nullable)
- resignation_date: date
- resignation_reason: text
- created_at: timestamp
```

### AttendanceRecord (근태 기록)
```
- id: bigint
- tenant_id: bigint (FK)
- employee_id: bigint (FK)
- date: date
- check_in_time: time
- check_out_time: time
- status: enum('on_time', 'late', 'absent', 'leave', 'business_trip', 'outside_work', 'overtime')
- night_overtime_hours: decimal
- weekend_overtime_hours: decimal
- reason: text
- created_at: timestamp
```

### Leave (휴가)
```
- id: bigint
- tenant_id: bigint (FK)
- employee_id: bigint (FK)
- type: enum('annual', 'reward', 'congratulation', 'health', 'sick', 'half_day', 'half_day_am', 'half_day_pm')
- start_date: date
- end_date: date
- days: decimal
- reason: text
- status: enum('pending', 'approved', 'rejected')
- created_at: timestamp
```

### LeaveBalance (휴가 잔여)
```
- id: bigint
- tenant_id: bigint (FK)
- employee_id: bigint (FK)
- year: int
- type: enum('annual', 'reward', ...)
- granted: decimal
- used: decimal
- remaining: decimal
```

---

## API 도출

### 부서관리 API
```
GET    /api/departments                  # 부서 목록 (트리 구조)
POST   /api/departments                  # 부서 추가
PUT    /api/departments/{id}             # 부서 수정
DELETE /api/departments/{id}             # 부서 삭제
DELETE /api/departments/bulk             # 부서 일괄 삭제
```

### 사원관리 API
```
GET    /api/employees                    # 사원 목록
POST   /api/employees                    # 사원 등록
GET    /api/employees/{id}               # 사원 상세
PUT    /api/employees/{id}               # 사원 수정
DELETE /api/employees/{id}               # 사원 삭제
POST   /api/employees/import             # CSV 일괄 등록
GET    /api/employees/template           # CSV 템플릿 다운로드
POST   /api/employees/invite             # 사용자 초대
```

### 근태관리 API
```
GET    /api/attendance                   # 근태 목록
POST   /api/attendance                   # 근태 등록
PUT    /api/attendance/{id}              # 근태 수정
GET    /api/attendance/summary           # 근태 현황 요약
POST   /api/attendance/reason            # 사유 등록
```

### 휴가관리 API
```
GET    /api/leaves                       # 휴가 목록
POST   /api/leaves                       # 휴가 신청
PUT    /api/leaves/{id}                  # 휴가 수정
DELETE /api/leaves/{id}                  # 휴가 취소
POST   /api/leaves/{id}/approve          # 휴가 승인
POST   /api/leaves/{id}/reject           # 휴가 거절
GET    /api/leaves/balance/{employee_id} # 휴가 잔여 조회
POST   /api/leaves/grant                 # 휴가 부여
GET    /api/leaves/summary               # 휴가 현황 요약
```