데이터베이스 엔티티 레퍼런스
모두 BaseEntity를 상속하는 TypeORM 엔티티(UUID PK, createdAt, updatedAt, deletedAt).
⚠️ 이 개요는 낡았습니다. 아래 ER 다이어그램·카테고리는 초기 급여 중심 스냅샷(약 34개 엔티티)이며, 현재 저장소에는 113개 엔티티 파일(
packages/database/src/entities/*.entity.ts)이 있습니다. 드라이브·AI·전자서명·연차사용촉진·Account·외근·급여대장 워크북(sheet) 등 도메인이 여기에 반영되어 있지 않습니다. 최신 테이블 전수는 영문 Database Schema Reference와 엔티티 파일을 참고하세요. (아래에 남은SportsIncentive는FixedIncentive로 통합되어 더 이상 존재하지 않는 엔티티입니다.)
리팩토링 진행 중. 급여 관련 엔티티(
OvertimeRecord,SportsIncentive,EducationSubsidy,LeaveRequest,ResignationRecord,YearEndSettlement)에서 계산된 금액 필드가 제거됩니다. 모든 금액은AllowanceRecord/DeductionRecord에서만 관리됩니다. (제거예정) 표시 필드는 삭제되고, (추가예정) 표시 필드는 신규 추가됩니다. 타겟 스키마: Payroll Schema Refactor
엔티티 관계 개요
직원 관리
Employee
멀티 인증 지원이 포함된 핵심 직원 엔티티.
| 필드 | 타입 | 설명 |
|---|---|---|
email | string | 고유 이메일 주소 |
firstName | string | 이름 |
lastName | string | 성 |
employeeNumber | string | 고유 사번 |
phone | string | 전화번호 |
status | enum | ACTIVE, INACTIVE, ON_LEAVE, TERMINATED |
authMethod | enum | EMAIL, PHONE, BIOMETRIC |
organizationId | UUID | Organization FK |
position | string | 직책 |
hireDate | Date | 입사일 |
profilePicture | string | 프로필 이미지 파일명 |
isSystemAdmin | boolean | 시스템 관리자 플래그 |
passwordHash | string | bcrypt 비밀번호 해시 |
Team
조직 구조의 기본 단위(팀). 팀은 계층 구조(상위 팀)를 가질 수 있습니다.
| 필드 | 타입 | 설명 |
|---|---|---|
name | string | 팀명 |
code | string | 고유 코드 |
description | string | 팀 설명 |
parentTeamId | UUID | 상위 Team FK (계층) |
leaderId | UUID | Employee FK (팀 리더) |
isActive | boolean | 활성 상태 |
TeamMember
| 필드 | 타입 | 설명 |
|---|---|---|
teamId | UUID | Team FK |
employeeId | UUID | Employee FK |
roleId | UUID | Role FK |
joinedAt | Date | 합류일 |
isActive | boolean | 활성 상태 |
Organization
| 필드 | 타입 | 설명 |
|---|---|---|
name | string | 조직명 |
code | string | 고유 조직 코드 |
legalName | string | 법인명 |
timezone | string | 예: Asia/Seoul |
locale | string | 예: ko-KR |
currency | string | 예: KRW |
settings | jsonb | 근무시간, 급여 설정 |
subscriptionTier | string | 요금제 등급 |
EmploymentContract
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
contractNumber | string | 계약 ID |
contractType | enum | PERMANENT, TEMPORARY, PART_TIME |
wageType | enum | MONTHLY, HOURLY, DAILY |
baseSalary | decimal | 기본급 |
startDate | Date | 계약 시작일 |
endDate | Date | 계약 종료일 (nullable) |
급여
PayrollRecord
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
payrollNumber | string | 고유 급여 ID (예: PAY-202601-EMP001) |
year | int | 급여 연도 |
month | int | 급여 월 |
baseSalary | decimal | 기본급 |
overtimePay | decimal | 연장근무 수당 |
nightDifferential | decimal | 야간 차등 |
weekendDifferential | decimal | 주말 차등 |
totalEarnings | decimal | 총 지급액 |
totalDeductions | decimal | 총 공제액 |
netPay | decimal | 실수령액 |
totalWorkDays | int | 기간 내 근무일수 |
totalWorkHours | decimal | 총 근무시간 |
status | enum | DRAFT, CALCULATED, APPROVED, PAID, CANCELLED |
PayrollDetail
| 필드 | 타입 | 설명 |
|---|---|---|
payrollRecordId | UUID | PayrollRecord FK |
category | enum | BASE_SALARY, NIGHT_ALLOWANCE, MEAL_ALLOWANCE 등 |
itemName | string | 한국어 항목명 |
amount | decimal | 금액 |
isDeduction | boolean | 공제 여부 |
SalaryGrade
| 필드 | 타입 | 설명 |
|---|---|---|
category | enum | REHABILITATION, FUNCTIONAL, NURSING |
grade | int | 호봉 번호 |
baseSalary | decimal | 호봉 기본급 |
hobongAmount | decimal | 호봉 금액 |
totalSalary | decimal | 총 급여 |
annualSalary | decimal | 연봉 |
effectiveYear | int | 적용 연도 |
근태
Attendance
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
date | Date | 근무일 |
checkIn | timestamp | 출근 시간 |
checkOut | timestamp | 퇴근 시간 |
status | enum | present, completed, absent, late, early_leave, on_leave, holiday |
totalHours | decimal | 총 근무시간 |
overtimeHours | decimal | 연장근무 시간 |
gpsData | jsonb | 출퇴근 시 GPS 좌표 |
OvertimeRecord
원시 연장근무 관측 데이터. 급여 금액은 OvertimeRecordCalculator가 계산하여 AllowanceRecord에 기록합니다.
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
workDate | Date | 근무일 |
overtimeHours | decimal | 시간 |
mealBreakHours | decimal | 식사시간 (순근무시간 계산 시 차감) |
category | enum | weekday, saturday, holiday, night |
status | enum | pending, approved, rejected (paid 제거 — AllowanceRecord.status로 이동) |
approvedBy | UUID | Employee FK |
hourlyRate | decimal | (제거예정) — Contract.baseSalary / 209로 재계산 |
multiplier | decimal | (제거예정) — 시트 컬럼/조직 파라미터 저장소에 설정 |
calculatedPay | decimal | (제거예정) — AllowanceRecord.amount에 보관 |
LeaveRequest
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
leaveType | enum | annual, sick, personal, maternity, bereavement |
startDate | Date | 시작일 |
endDate | Date | 종료일 |
reason | string | 휴가 사유 |
status | enum | pending, approved, rejected, cancelled |
approvedBy | UUID | Employee FK |
rejectionReason | string | 반려 사유 |
isHalfDay | boolean | 반차 여부 |
halfDayPeriod | enum, nullable | morning, afternoon |
totalDays | decimal | (제거예정) — startDate / endDate / isHalfDay에서 파생 |
간호 스케줄링
NurseProfile
| 필드 | 타입 | 설명 |
|---|---|---|
employeeId | UUID | Employee FK |
workType | enum | three_shift, night_dedicated, day_dedicated, evening_dedicated |
wardId | UUID | Ward FK (병동) |
annualLeaveDays | int | 연차 일수 |
maxConsecutiveNights | int | 최대 연속 야간 근무 |
isHeadNurse | boolean | 수간호사 플래그 |
NurseSchedule
| 필드 | 타입 | 설명 |
|---|---|---|
wardId | UUID | Ward FK |
year | int | 근무표 연도 |
month | int | 근무표 월 |
status | enum | draft, ai_generated, editing, confirmed, published |
settings | jsonb | 생성 설정 |
NurseScheduleEntry
| 필드 | 타입 | 설명 |
|---|---|---|
scheduleId | UUID | NurseSchedule FK |
employeeId | UUID | Employee FK |
date | Date | 근무일 |
assignmentType | enum | day, evening, night, off, annual_leave, bereavement, education, unavailable |
인증 및 권한
Role
| 필드 | 타입 | 설명 |
|---|---|---|
name | string | 역할명 |
code | string | 고유 코드 |
type | enum | system, team, custom |
isActive | boolean | 활성 플래그 |
description | string | 역할 설명 |
Permission
| 필드 | 타입 | 설명 |
|---|---|---|
name | string | 권한명 |
resource | string | 리소스명 (예: employee, payroll) |
actions | string[] | 허용 작업 (read, write, delete) |
description | string | 권한 설명 |