근무 정책 스펙
개요
근무 정책(WorkPolicy)은 Simple HR 시스템에서 각 회사·부서의 근무 형태, 연장·휴일근로 처리 방식, 퇴근 미체크 처리 방식 등을 정의하는 핵심 설정 단위입니다. 정책 변경 시 적용 시점을 지정할 수 있어야 하며, 과거 데이터에 소급 적용되지 않도록 관리해야 합니다. 0714 수정에서 변경 시점 이후만 새 정책이 적용되고, 이전 근태 기록은 변경 전 정책이 그대로 유지됨을 최종 확인하였습니다. fix-task-0714 (26년 07월 14일 수정사항) 근무 정책 ↔ 급여 연동 및 근태 관리와 밀접하게 연동됩니다.
정책 적용 시점 관리 (구현 완료)
근로정책 수정 시 수정 시점을 입력할 수 있으며, 해당 시점 이후부터만 변경된 정책이 적용됩니다. 기존에는 정책 수정 시 과거 데이터까지 소급 적용되는 버그가 존재했으며, 이를 수정하였습니다. 0624 수정사항 fix-task-0624 (26년 06월 24일 수정사항)
0714 수정에서 이 동작을 재확인 완료하였습니다. 근로정책 삭제 시에도 과거 출퇴근·급여 기록에 저장된 정책 정보는 삭제되지 않고 보존됩니다. fix-task-0714 (26년 07월 14일 수정사항)
퇴근 미체크 자동 처리 스케줄러 (구현 완료)
퇴근을 기록하지 않은 레코드(check_out_time IS NULL)를 매일 KST 00:15에 자동 처리하는 배치 스케줄러가 구현되었습니다. 0624 수정사항 fix-task-0624 (26년 06월 24일 수정사항)
unchecked_checkout_policy 처리 모드
| 모드 | 동작 |
|---|---|
AUTO_END_TIME | scheduled_end 시간으로 퇴근 자동 기록 + 근무시간/상태 재계산 |
LEAVE_BLANK | 스킵 (빈 값 유지) |
- 처리 대상: 최근 7일 이내 미체크 레코드
- 중복 실행 방지: advisory lock(
820620) 적용 - 급여 영향 없음 — 급여는
OvertimeRequest기반이며,AttendanceRecord.overtime_hours를 직접 읽지 않음
배포 후 수동 보정 현황
| 대상 | 건수 | 처리 방법 |
|---|---|---|
| HNT 6/17~6/24 미체크 | 19건 | 스케줄러 자동 처리 대상 |
HNT 2~3월 (scheduled_end NULL) | 4건 | 관리자 UI에서 수동 처리 |
form_id=NULL 레거시 계약 (HNT) | 0건 | 조치 불필요 |
근무 정책 설정 항목 현황
미구현 항목 상세 및 리스크
급여에 직접 영향을 주는 미구현 항목
| 항목 | 필드명 | 상태 | 리스크 |
|---|---|---|---|
| 법정근로 내 연장 구분 | legal_overtime_split | DB·UI 있음, 로직 없음 | 법내 연장(할증 없음) vs 법외 연장(1.5배) 미구분 시 급여 오산 |
| 저녁시간 연장근로 제외 | exclude_dinner_from_overtime | UI 토글만 | 활성화 시 18~19시 구간 연장근로에서 제외되어야 함 → UI 숨김/비활성화 검토 필요 |
| 대체휴일/대체근무 | substitution_enabled | UI 토글만 | 활성화 시 가산수당 대신 휴무로 상쇄 처리 → UI 숨김/비활성화 검토 필요 |
| 근무일 변경 기준시간 | shift_day_boundary | DB 저장, 로직 없음 | 야간 교대근무 시 휴일근로/야간시간 집계 오류 가능 |
| 점심시간 휴게 차감 | use_lunch_as_break | UI만, DB 없음 | 근로시간 계산에 영향 |
| 근무제 연동(LINKED) | _attendance_data_map() | 미구현 | 현재 BASIC과 동일 동작; AttendanceRecord.overtime_hours 기반으로 전환 필요 |
⚠️ 미구현 상태에서 UI 토글이 노출되면 사용자가 설정 완료로 오해할 수 있으므로, 구현 전까지 UI 숨김 또는 비활성화 처리가 권장됩니다.
기능 미연동 항목 (기능 자체 미완성)
| 항목 | 필드명 | 상태 |
|---|---|---|
| 출장 일정 사용 | business_trip_enabled | ✅ 구현 완료 (0629) — BusinessTripRequest 모델, 신청/승인/반려 API, 승인 시 ATT_BUSINESS_TRIP 자동 생성 |
| 연장근로 입력 단위 제한 | overtime_input_unit | DB·UI 있음; 신청 API 검증 없음 |
| 연장근로 최소시간 제한 | overtime_min_input | DB·UI 있음; 신청 API 검증 없음 |
| 선택근무 퇴근 허용시간 | checkout_allow_from/to | UI만, DB 필드 없음 |
| 탄력근로 시작 날짜 | flexible_start_date | ✅ 구현 완료 (0629) — WorkPolicy/WorkPolicyHistory 컬럼 추가, 스키마·스냅샷·직렬화 전부 반영 |
휴일근로 급여 반영 (구현 완료)
출장 일정 관리 (business_trip_enabled) — 구현 완료 (0629)
0629 수정사항에서 출장 일정 사용 기능이 완료되었습니다. fix-task-0629 (26년 06월 29일 수정사항)
BusinessTripRequest모델 추가, 신청·승인·반려 API 구현- 승인 시 기간 내 각 근무일에
ATT_BUSINESS_TRIP상태의AttendanceRecord자동 생성 - 전자결재 출장/외근 승인 → 근태 레코드 자동 생성 연동 수정
- 근태 신청 캘린더 날짜 1일 밀림 수정 (UTC → 로컬 타임존)
- 통합 테스트 추가:
test_business_trip.py,test_business_trip_existing_update.py,test_attendance_doc_approval.py
탄력근로 시작 날짜 (flexible_start_date) — 구현 완료 (0629)
근로 정책 삭제·수정 조건 개선 — 구현 완료 (0630)
근로정책 변경 시점 보호 — 시스템 확인 완료 (0702)
근로정책 수정 폼 초기화 버그 — 수정 완료 (0706)
근로정책 변경 시점 보호 — 수정 완료 (0714)
0702 우선수정사항에서 근로정책 수정 폼의 초기화 버그가 식별되었습니다. fix-taskNew-0702 (26년 07월 02일 우선수정사항)
| 버그 항목 | 내용 | 리스크 |
|---|---|---|
formNightSurcharge / formHolidaySurcharge | useState("50")으로 하드코딩, setter 없음 → 수정 시 항상 50을 전송 | DB 기본값(1.5배수)과 단위 불일치로 야간·휴일 가산수당 오산 |
shift_day_boundary null 폴백 | null일 때 "06:00" 폴백 → 값 변경 없어도 scheduled_change 불필요하게 생성 | 불필요한 정책 예약 변경 레코드 누적 |
| 가산율 단위 불일치 | night/holiday surcharge rate가 1.5(배수) vs 50(퍼센트) 혼재 | 급여 계산 코드에서 사용하는 형식 확인 후 단위 통일 필요 |
✅ 0706 수정 완료: surcharge rate 하드코딩 전송 제거(법정 가산율 DB 기본값 1.5 유지), shift_day_boundary null 폴백 "06:00" 제거. fix-taskNew-0706 (26년 07월 06일 우선수정사항)
⚠️ 이 버그는 급여 계산에 직접 영향을 줍니다. 급여 계산 하드코딩 이슈와 함께 검토가 필요합니다.
0702 수정사항에서 근로정책 수정 시 적용 시점 반영 동작을 재확인하였습니다. fix-task-0702 (26년 07월 02일 수정사항)
- 근로정책을 수정해도 즉시 적용되지 않으며, 수정 확인 시 "언제부터 적용할지" 날짜를 선택할 수 있음 (최소 내일부터)
- 지정한 날짜가 되면 자동으로 새 정책이 적용되고, 이전 기록은 당시 정책 기준으로 그대로 보존됨
- 현재 정상 구현 상태 확인 완료
ℹ️ 단, 기본 근로정책의 경우 최초 수정 시 당일 적용이 가능하도록 해야 합니다. 현재 기본 근로정책 수정 시 적용일자 선택 모달이 나타나지 않고 자동으로 다음날 적용으로 처리되는 문제가 확인되었습니다. fix-taskNew-0702 (26년 07월 02일 우선수정사항)
근로정책 변경 시점 보호 — 코드 확인 완료 (0701)
0701 수정사항에서 근로정책 변경 시 과거 데이터 보호 여부를 코드 레벨에서 재확인하였습니다. fix-task-0701 (26년 07월 01일 수정사항)
- 과거 출퇴근 기록: 생성 시점의 근무시간이 저장되어 있어, 이후 정책이 바뀌어도 과거 기록은 변경되지 않음
- 시간인정 계산: 과거 출퇴근의 인정근로시간도 당시 저장된 근무시간 기준으로 계산되므로 영향 없음
- 급여 산출: 해당 기간에 적용되던 정책 기준으로 계산되므로 영향 없음
- 정책 적용 시점: 예약 변경은 지정한 적용일 당일에만 반영되며, 그 이전에 미리 바뀌지 않음
- 직원 목록의 정책명: 적용일 당일에 변경되므로 적용일 이전에는 기존 정책명이 그대로 표시됨
현재 코드상 문제 없음. 과거 이력이 변경되는 구체적인 케이스가 식별될 경우 해당 흐름을 바탕으로 재검토합니다.
0630 수정사항에서 근로 정책 삭제·수정 가드 로직이 개선되었습니다. fix-task-0630 (26년 06월 30일 수정사항)
삭제 조건 변경
- 기존: 부서 할당이 존재하면 삭제 차단
- 변경:
Employee.work_policy_id및ShiftSchedule기반 가드로 전환 - 해당 정책을 사용하는 직원 또는 스케줄이 없으면 부서 할당을 자동 정리 후 삭제 허용
- 직원 또는 스케줄이 있으면 삭제 차단 유지
수정 조건 변경
- 미사용 정책: 직원·스케줄 어느 쪽도 사용하지 않는 정책은
scheduled_change(예약 변경) 없이 즉시 적용 - 사용 중인 정책: 기존 예약 변경 방식 유지
- 프론트엔드: 미사용 정책 수정 시 적용시점·변경사유 확인 모달을 건너뛰고 즉시 저장
근로정책 수정 시 적용 시점 이전의 출퇴근 기록 및 급여 데이터는 변경되지 않습니다. fix-task-0630 (26년 06월 30일 수정사항)
0629 수정사항에서 탄력근로 시작 날짜 필드가 완전 구현되었습니다. fix-task-0629 (26년 06월 29일 수정사항)
WorkPolicy및WorkPolicyHistory에flexible_start_date컬럼 추가- 스키마·스냅샷·직렬화 전부 반영
- 프론트 폼 로드 시
flexible_start_date누락 수정 (work/page.tsx) - 통합 테스트 추가:
test_flexible_start_date.py
캘린더 휴일 부서별 스코프 필터 (버그 수정)
근로정책-출퇴근 연동 보완 (추후 예정)
개인별 근로정책 변경 — 적용 시점 선택 구현 완료 (0706)
work_days OFF 요일 출근 차단 — 수정 완료 (0715)
교대근로 수동 배정 시 최소 연속 휴식 시간 검증 미구현 (버그, 0715 기준)
직원 상세 드로어 — 예약된 근로정책 변경 표시 미구현
교대근로 순환 패턴(cycle_pattern) 기반 자동 배정 미구현 (0715 기준)
교대근무 법정 초과 시간 정책 저장 — 수정 완료 (0714)
교대근무 패턴이 주 52시간을 초과할 경우 저장 버튼이 비활성화되어 정책 등록 자체가 불가능하던 문제가 수정되었습니다. fix-task-0714 (26년 07월 14일 수정사항)
- 이제 법정 기준 초과 시에도 저장 버튼이 활성화됨
- 저장 시 "법정 기준을 초과합니다. 저장하시겠습니까?" 확인 팝업 표시
- 확인 후 정상 저장되며, 화면에 "법정 기준 초과 — 초과분은 대체 휴가로 해결할 수 있습니다" 안내 노출
- 삼성서울병원 전화예약실의 교대근무 정책 등록 테스트 정상 완료
휴일 근로 시 근태 반영 — 수정 완료 (0714)
출퇴근관리 통계 집계 오류 — 수정 완료 (0714)
출퇴근관리 화면 상단 통계에서 세 가지 집계 오류가 수정되었습니다. fix-task-0714 (26년 07월 14일 수정사항)
- 1.휴일 출근자·외근자 누락: 휴일 출근자는 "출근"으로, 미출근자는 "미출근"으로, 외근자는 "출근"으로 정상 집계
- 2.미출근자 오분류: 오늘 및 미래 날짜에서 아직 출근하지 않은 직원이 "결근"으로 표시되던 것을 "출근 전"으로 구분
- 3.부서별 휴일 적용: 회사 전체 휴일뿐 아니라 특정 부서에만 지정한 휴일도 해당 부서 직원에게만 동일하게 처리
근로정책 적용 시점 이력 관리 — 수정 완료 (0715)
근로정책 수정 시 적용 시점이 반영되지 않고 이력이 덮어써지던 문제가 0715에서 수정 완료되었습니다. fix-task-0715 수정사항
원인
- 정책 변경 시 기존
EmployeeWorkPolicy(EWP)레코드를 UPDATE(재사용)하여 과거 이력 소실 is_primary즉시 플립으로 미래 예약 후 동기화 불일치
수정 내용
- 이력 덮어쓰기 방지: 항상 신규 EWP INSERT, 기존 EWP는
effective_to설정으로 종료 - 날짜 기반 활성 판정:
is_primary플립 대신effective_from/to날짜 범위 +ORDER BY effective_from DESC로 활성 정책 결정 - 미래 예약 시: 적용일 도래 시 Read 쿼리가 자연 전환, 스케줄러(
close_superseded_ewps)가 이전 EWP의effective_to자동 채움 - 적용시점 표시:
EmployeeDetail응답에work_policy_effective_from,scheduled_work_policy_name,scheduled_work_policy_date추가, 드로어에 표시 - 이력 모달:
GET /employees/{id}/work-policy-historyAPI + 프론트 변경이력 모달 (적용중/예약중/취소 배지) - 배포 체크리스트:
docs/fix_tasks/0715/report/deploy-checklist.md
요구사항: 근로정책 수정 → 변경시점 클릭 → 적용하기 순으로 반영하고, 적용시점이 드로어 오른쪽에 명기되어야 함.
교대(변형)근로에서 cycle_pattern(예: ["D","D","D","OFF","N","N","OFF"])과 rotation_cycle_days 저장·로드는 정상이지만, SHIFT 모드에서 패턴 기반 자동 순환 배정 로직이 없음. fix-task-0713 (26년 07월 13일 수정사항) fix-task-0715 수정사항
- 현재 자동배정(
auto_assign_variant_shifts)은 변형근무(VARIANT) 모드 전용 - SHIFT 모드는 관리자가 수동으로 셀 배정해야 함
- 프론트에서 패턴 기반 법정한도 체크(주간시간 검증)는 구현됨; 백엔드 저장 시 패턴 유효성 재검증 없음
직원별 근로정책을 "날짜 지정"으로 미래 적용일을 선택하면 EmployeeWorkPolicy에 effective_from=미래날짜로 저장되지만, 드로어에서는 현재 적용 중인 정책명만 표시되어 예약 변경 정보가 보이지 않는 문제가 확인되었습니다. fix-task-0713 (26년 07월 13일 수정사항)
- 수정 대상 (백엔드):
EmployeeDetail스키마에pending_work_policy_name,pending_work_policy_effective_from필드 추가 +_employee_to_detail()에서 미래 EWP 조회 - 수정 대상 (프론트): 드로어 읽기 모드에 "2026-08-01 부터 '야간정책' 변경 예정" 형식의 표시 추가
교대(변형)근로 수동 셀 클릭 배정(assign_shift_roster, bulkCreate) 시 전일 퇴근~당일 출근 간격 검증이 없는 버그가 확인되었습니다. fix-task-0713 (26년 07월 13일 수정사항)
- 정책의
min_consecutive_rest_hours값 저장·로드는 정상 - 변형근무 자동배정(
auto_assign_variant_shifts)에서는rest_hours검증이 구현됨 - 수동 배정 시: 야간(18:00~06:00) 다음날 바로 주간(06:00~18:00) 배정 시 휴식 0시간이지만 경고/차단 없음
- 수정 대상:
backend/app/services/policy_service.py—assign_shift_roster()및 프론트bulkCreate시 전일 퇴근~당일 출근 간격 검증 추가 fix-task-0715 수정사항
근태 관리의 _resolve_scheduled_for_day() 함수가 ShiftSchedule과 Holiday만 확인하고, 근로정책의 work_days OFF 요일을 체크하지 않아 비근무 요일(예: 토요일)에도 출근이 차단되지 않는 버그가 확인되었으며 0715에서 수정 완료되었습니다. fix-task-0713 (26년 07월 13일 수정사항) fix-task-0715 수정사항
- 조회(
get_my_attendance) 시에는 합성ATT_HOLIDAY레코드로 "휴무" 표시가 됨 check_in()시점에는is_off판정에work_days가 반영되지 않아 실제 출근 차단 불가- 수정 완료:
_resolve_scheduled_for_day()에work_daysOFF 체크 추가 +get_user_dashboard()에 주휴일 판정 추가로 출근 버튼 비활성화. OT_HOLIDAY 승인 시 출근 허용 흐름 동일. (0e9ac95) fix-task-0715 수정사항
0706 우선수정사항에서 개인별 근로정책 변경 시 적용 시점을 선택할 수 있도록 구현되었습니다. fix-taskNew-0706 (26년 07월 06일 우선수정사항)
- 직원 수정 시 적용 시점 선택 모달 추가
EmployeeWorkPolicy.effective_from필드 활용- 기존에는 정책 변경이 즉시 반영되어 이력 관리가 어려웠으나, 이제 적용 시작일을 명시적으로 지정 가능
다음 항목은 추후 구현 예정입니다. fix-task-0630 (26년 06월 30일 수정사항)
- 근로정책
work_daysOFF 요일 →check_in()시점 출근 차단 반영 ✅ 0715 수정 완료 fix-task-0715 수정사항 - 근로정책 적용 시점 이력 관리(EWP INSERT 방식, 이력 모달) ✅ 0715 수정 완료 fix-task-0715 수정사항
- 교대근로 수동 배정 시
min_consecutive_rest_hours검증 추가 (미구현) - 직원 상세 드로어 — 예약된 근로정책 변경 표시 (
work_policy_effective_from/scheduled_work_policy_name) — 0715에서 드로어 표시 항목 추가됨 fix-task-0715 수정사항 - 교대근로 순환 패턴(cycle_pattern) 기반 자동 배정 로직 구현 (SHIFT 모드 전용, 미구현)
- 표준(REGULAR) 근로 자동 스케줄 생성 기능 추가
- 회사 지정 휴일(Holiday) — 스케줄 생성 시 적극 차단 반영
- 출퇴근 버튼 근무일 제약 — 비근무일·휴가일 출퇴근 차단
- 휴가 취소 시 원본
ShiftSchedule자동 복원 로직 구현
위 항목들은 07.01 기준으로도 미구현 상태가 유지됩니다. fix-task-0701 (26년 07월 01일 수정사항)
추가로 다음 항목도 수정 대기 중입니다. fix-taskNew-0702 (26년 07월 02일 우선수정사항)
- 근로정책 수정 및 등록 시, 소속 직원 모두에게 적용 옵션 검토 → ✅ 0706 완료: 체크박스 제거, 부서 정책 배정은 사용 가능 정책 등록으로 단순화, 안내 문구 추가 fix-taskNew-0706 (26년 07월 06일 우선수정사항)
- 취업규칙 문구(
"취업규칙에 근무시간을 명시해야 합니다.") 근로정책 등록·수정 모달에서 제거 ✅ 완료
DEPARTMENT 스코프로 지정된 휴일이 전 직원에게 노출되던 버그가 수정되었습니다. 해당 부서 직원에게만 표시되도록 필터가 적용되었습니다. 0624 수정사항 fix-task-0624 (26년 06월 24일 수정사항)
관련 페이지
- 근무 정책 ↔ 급여 연동 현황 및 이슈 — 근무 정책 항목별 급여 연동 상세 분석
- 급여관리 스펙 — 급여 계산 로직 전반
- 근태 관리 스펙 — 출퇴근 기록 처리
- 교대(변형)근로 관리 스펙 — 교대근무 정책 연동
- 휴일 관리 스펙 — 휴일 생성 및 스코프 관리
- 급여 계산 하드코딩 이슈 — 미구현 정책 항목으로 인한 하드코딩 이슈
- 근로정책-급여-연동-현황분석.md — 원본 분석 소스
- fix-task-0629 (26년 06월 29일 수정사항) — 출장 일정·탄력근로 시작 날짜 구현 완료 수정사항
- fix-task-0630 (26년 06월 30일 수정사항) — 근로 정책 삭제·수정 조건 개선, 근로정책-출퇴근 연동 보완 예정 항목- fix-task-0701 (26년 07월 01일 수정사항) — 근로정책 변경 시점 보호 코드 확인 완료
- fix-task-0702 (26년 07월 02일 수정사항) — 근로정책 수정 시 적용 시점 반영 동작 재확인
- fix-taskNew-0702 (26년 07월 02일 우선수정사항) — 근로정책 수정 폼 초기화 버그, 기본 근로정책 최초 수정 시 당일 적용, 소속 직원 일괄 적용 옵션 검토
- fix-taskNew-0706 (26년 07월 06일 우선수정사항) — 근로정책 수정 폼 초기화 버그 수정 완료, 개인별 근로정책 적용 시점 선택 구현, 소속 직원 일괄 적용 옵션(체크박스) 제거
- fix-task-0713 (26년 07월 13일 수정사항) — work_days OFF 요일 출근 차단 미구현, 수동 배정 시 최소 연속 휴식 시간 검증 미구현, 직원 드로어 예약 정책 표시 미구현, 교대근로 순환 패턴 자동 배정 미구현 확인
- fix-task-0714 (26년 07월 14일 수정사항) — 근로정책 변경 시점 보호 최종 확인, 교대근무 법정 초과 저장 허용 수정, 휴일근로 근태 반영 수정, 출퇴근관리 통계 집계 오류 수정
- fix-task-0715 수정사항 — work_days OFF 요일 출근 차단 수정 완료, 근로정책 적용 시점 이력 관리 수정 완료(EWP INSERT 방식·이력 모달), 교대근로 순환 패턴 자동 배정·수동 배정 최소 휴식 시간 검증 미구현 확인