SimpleHR project
급여 계산 하드코딩 이슈 목록 및 개선 방향
answeredited by Cairni · 방금 · AIv3
개요
급여관리 스펙의 핵심 함수인 generate_payslips() (payroll_service.py:833)는 근태 데이터·미사용연차·만근수당 판단은 자동으로 연동하지만, 할증률과 소정근로시간은 코드에 하드코딩되어 있어 근무 정책 스펙(WorkPolicy)의 설정값이 급여 계산에 전혀 반영되지 않는다. 근로정책-급여-연동-현황분석.md 분석을 토대로 이슈 목록과 개선 방향을 정리한다.
연동 현황 요약
근로정책 ↔ 급여 연동 현황AI · 출처 클릭
연동됨3
근태 시간 데이터 (_attendance_data_map)
근로정책-급여-연동-현황분석.md
만근수당 판단 (has_absence_or_late)
근로정책-급여-연동-현황분석.md
미사용연차 일수 (unused_leave_days)
근로정책-급여-연동-현황분석.md
미연동5
월 소정근로시간 (monthly_standard_hours) → 209 하드코딩
근로정책-급여-연동-현황분석.md
야간 할증률 (night_surcharge_rate) → 0.5 하드코딩
근로정책-급여-연동-현황분석.md
휴일 할증률 (holiday_surcharge_rate) → 1.5 하드코딩
근로정책-급여-연동-현황분석.md
1일 소정근로시간 → 8시간 하드코딩
근로정책-급여-연동-현황분석.md
고정연장수당 vs 실제연장수당 이중지급 가능
근로정책-급여-연동-현황분석.md
법정 고정2
연장 할증률 1.5배 (근로기준법)
근로정책-급여-연동-현황분석.md
휴일초과 할증률 2.0배 (근로기준법)
근로정책-급여-연동-현황분석.md
현재 급여 계산 흐름
이슈 상세
이슈 1 — 소정근로시간 209시간 하드코딩
| 항목 | 내용 |
|---|---|
| 위치 | payroll_service.py:604-605 |
| 현상 | EmployeePayBase.monthly_work_hours 기본값 209. 관리자가 수동 입력하지 않으면 그대로 사용됨 |
| 갭 | WorkPolicy.monthly_standard_hours는 work_days + start_time / end_time / break_minutes로 자동 계산 (policy_service.py:65-82). 주 4일 근무(174시간 등) 비표준 정책이 반영되지 않음 |
| 파급 | 시급 = standard_wage / monthly_work_hours → 시급이 달라지면 연장·야간·휴일·연차 모든 수당 오산 |
근로정책-급여-연동-현황분석.md
이슈 2 — 고정연장수당 vs 실제연장수당 이중지급
| 항목 | 내용 |
|---|---|
| 위치 | payroll_service.py:960-989 (고정 수당 루프), payroll_service.py:1003-1018 (근태 수당 루프) |
| 현상 | FIXED_OVERTIME(category=ALLOWANCE)은 고정 수당 루프에서 처리되고, PAY_OVERTIME은 근태 기반으로 별도 추가됨 |
| 이중지급 조건 | 급여기초에 FIXED_OVERTIME이 등록된 직원에게 해당 월 실제 연장근로가 발생하면 둘 다 명세서에 포함 |
근로정책-급여-연동-현황분석.md
이슈 3 — 할증률 하드코딩
| 수당 유형 | 하드코딩 값 | WorkPolicy 필드 | 상태 |
|---|---|---|---|
| 연장근로 | 1.5배 | *(별도 필드 없음)* | 법정 고정 |
| 야간근로 (가산분) | 0.5배 | night_surcharge_rate (기본 1.5) | 미연동 |
| 휴일근로 | 1.5배 | holiday_surcharge_rate (기본 1.5) | 미연동 |
| 휴일초과 | 2.0배 | *(별도 필드 없음)* | 법정 고정 |
코드 위치: payroll_service.py:993-1001, payroll_excel.py:428-431 (엑셀 다운로드에도 동일 하드코딩) 근로정책-급여-연동-현황분석.md
이슈 4 — 근로정책 변경 시 급여기초 미갱신
| 항목 | 내용 |
|---|---|
| 위치 | policy_service.py:108-132 |
| 현상 | update_work_policy() 실행 후 WorkPolicy.monthly_standard_hours는 갱신되지만, 해당 정책이 적용된 직원의 EmployeePayBase.monthly_work_hours에 대한 후처리가 없음 |
| 결과 | 근로정책 변경 후에도 이전 값 기준으로 시급·수당이 계산됨 |
근로정책-급여-연동-현황분석.md
이슈 5 — 1일 통상임금 8시간 하드코딩
| 항목 | 내용 |
|---|---|
| 위치 | payroll_service.py:941 |
| 코드 | daily_wage = int(hourly_wage * 8) |
| 갭 | WorkPolicy의 start_time, end_time, break_minutes로 1일 소정근로시간 계산 가능 (예: 09:00~17:00 / 휴게 1시간 = 7시간) |
| 영향 | 휴가 관리 스펙과 연동되는 연차수당 계산 시, 7시간 근무자에게 8시간 기준 과다 지급 |
근로정책-급여-연동-현황분석.md
개선 방향 (미결 의사결정 사항)
아래 세 가지는 개발팀이 의사결정을 요청한 항목이다. 결정 후 의사결정 로그와 액션 아이템에 반영 필요.
Q1. 고정연장수당 이중지급 처리 정책
| 옵션 | 내용 |
|---|---|
| A) 포괄임금제 | 실제 연장이 고정분 초과 시에만 초과분만 PAY_OVERTIME 지급. 미초과 시 PAY_OVERTIME = 0 |
| B) 현행 유지 | 고정연장은 고정 수당, 실제연장은 근태 기반 별도 수당. 이중지급 허용 (회사 정책에 따라) |
| C) 플래그 추가 | PayItem 또는 WorkPolicy에 "고정연장 적용 시 근태연장 스킵" 플래그 추가 |
Q2. 근로정책 변경 시 급여기초 처리
| 옵션 | 내용 |
|---|---|
| A) 자동 갱신 | update_work_policy() 후처리로 해당 정책 적용 직원의 EmployeePayBase 일괄 업데이트 |
| B) 알림만 | 관리자에게 "근로정책 변경됨, 급여기초 확인 필요" 알림 발송. 수동 갱신 |
| C) 명세서 생성 시 동적 조회 | EmployeePayBase.monthly_work_hours 미사용, 명세서 생성 시 직원별 유효 근로정책에서 월 소정근로시간을 동적으로 가져옴 |
Q3. 야간수당 배율 해석
- 현행
PAY_NIGHT= 가산분 0.5배 (기본급에 야간분 미포함 가정) WorkPolicy.night_surcharge_rate= 1.5 (전체 배율)- 연동 시 가산분 =
night_surcharge_rate - 1.0으로 변환 필요 여부 확인 필요
Q4. 근로정책 할증률 직접 사용 여부
- 현재
holiday_surcharge_rate,night_surcharge_rate는 UI 표시용으로만 사용 - 법정 할증률(연장 1.5, 야간 0.5 가산, 휴일 1.5, 휴일초과 2.0)은 근로기준법 고정이므로 정책별 설정 실익이 제한적
- 단, 회사 자체 규정으로 법정 이상 할증 적용 시(예: 휴일 2.0배)에는
WorkPolicy참조가 필요
근로정책-급여-연동-현황분석.md
코드 위치 참조표
| 이슈 | 파일 | 라인 | 설명 |
|---|---|---|---|
| 시급 계산 | payroll_service.py | 604-605 | standard_wage / monthly_work_hours |
| 1일 통상임금 | payroll_service.py | 941 | hourly_wage × 8 하드코딩 |
| 근태 수당 할증률 | payroll_service.py | 993-1001 | 연장 1.5 / 야간 0.5 / 휴일 1.5 / 휴일초과 2.0 |
| 고정 수당 루프 | payroll_service.py | 960-989 | ATTENDANCE 카테고리 스킵, FIXED_OVERTIME(ALLOWANCE)은 통과 |
| 근태 수당 루프 | payroll_service.py | 1003-1018 | PAY_OVERTIME 등 근태 기반 수당 추가 |
| 연차수당 계산 | payroll_service.py | 1020-1037 | daily_wage × 미사용연차일수 |
| 소정근로시간 자동계산 | policy_service.py | 65-82 | _calc_monthly_standard_hours() |
| 근로정책 업데이트 | policy_service.py | 108-132 | update_work_policy() — 급여기초 후처리 없음 |
| 엑셀 할증률 | payroll_excel.py | 428-431 | 동일한 하드코딩 중복 존재 |
| 고정연장수당 시드 | seed/helpers.py | 402 | category=ALLOWANCE |
| 4대보험 요율 | payroll_service.py | — | 국민연금 4.5%·건강보험 3.545%·장기요양 12.81%·고용보험 0.9% 하드코딩 (pay_items.rate 미활용) |
근로정책-급여-연동-현황분석.md
관련 페이지
- 근무 정책 스펙 —
WorkPolicy필드 정의 (monthly_standard_hours,night_surcharge_rate,holiday_surcharge_rate등) - 급여관리 스펙 —
generate_payslips()전체 흐름 - 근태 관리 스펙 —
_attendance_data_map()등 근태 데이터 연동 - 연차 자동계산 로직 스펙 —
unused_leave_days계산 기준 - 만근 수당 스펙 —
has_absence_or_late판단 로직 - 휴가 관리 스펙 — 연차수당 기초 (1일 통상임금) 연관
- 교대(변형)근로 관리 스펙 — 비표준 소정근로시간 설정 케이스
- 의사결정 로그 — Q1~Q4 결정 사항 기록 필요
- 근무 정책 ↔ 급여 연동 현황 및 이슈 — 연동 상태 전반 현황
- fix-task-0626 — 0626 업데이트 원본 소스
- fix-task-0703 — 0703 업데이트 원본 소스
- 액션 아이템 — 후속 개발 작업 등록 필요
추가 이슈 (0626 업데이트)
이슈 6 — 4대보험 요율 하드코딩
| 항목 | 내용 |
|---|---|
| 위치 | payroll_service.py (하드코딩) |
| 현상 | 국민연금 4.5%, 건강보험 3.545%, 장기요양 12.81%, 고용보험 0.9%가 코드에 고정되어 있음 |
| 갭 | PayItem.rate 컬럼이 이미 존재하지만 활용되지 않음. 매년 요율 변경 시 코드 수정 필요 |
| 개선 방향 | pay_items.rate 컬럼을 활용해 DB 기반으로 전환, 관리자 UI에서 요율 변경 가능하도록 구현 필요 |
fix-task-0626 (26년 06월 26일 수정사항)
이슈 7 — 연차수당(PAY_ANNUAL_LEAVE) 매월 중복 지급 문제
이슈 10 — 근로정책 수정 폼 할증률 하드코딩 버그
| 항목 | 내용 |
|---|---|
| 위치 | 근로정책 수정 폼 (프론트엔드) |
| 현상 1 | formNightSurcharge / formHolidaySurcharge가 useState("50")으로 하드코딩되어 있고 setter가 없어, 수정 시 항상 50을 전송함 |
| 현상 2 | shift_day_boundary가 null일 때 "06:00" 폴백 처리 → 값을 변경하지 않아도 달라진 것으로 감지되어 불필요한 scheduled_change 레코드가 생성됨 |
| 현상 3 | night/holiday surcharge rate 단위 불일치 — DB 기본값 1.5(배수) vs 폼 전송값 50(퍼센트) |
| 개선 방향 | setter 추가 및 단위 통일(배수 또는 퍼센트 중 하나로 정리), null 폴백 시 변경 감지 제외 처리 필요 |
| 상태 | ⚠️ 미구현 — 수정 필요 |
fix-task-0703 (26년 07월 03일 수정사항)
| 항목 | 내용 |
|---|---|
| 현상 | 매월 반복 지급 시 중복 지급 문제 발생 → 현재 비활성화 상태 |
| 개선 방향 | 퇴직 시 또는 회계연도 종료 시 일괄 정산 방식으로 재구현 필요. 지급 시점 설정(매월/연1회/퇴직시) 관리자 UI 추가 필요 |
| 상태 | ⚠️ 미구현 — 재설계 필요 |
fix-task-0626 (26년 06월 26일 수정사항)
이슈 8 — 회계·급여 정책(fiscal_year_start_month, salary_calc_start_day 등) 급여 미반영
| 필드 | 저장 여부 | 급여 반영 여부 |
|---|---|---|
fiscal_year_start_month | ✅ 저장됨 | ❌ 급여/회계에서 미참조 |
salary_calc_start_day / end_day | ✅ 저장됨 | ❌ 급여 계산 기간에 미반영 |
salary_pay_day | ✅ 저장됨 | ⚠️ 부분 사용 (근로계약서 생성 시만 참조) |
annual_leave_basis | ✅ 저장됨 | ⚠️ 부분 사용 (일부 연차 계산에만 참조) |
holiday_rules | ✅ 저장됨 | ❌ 급여/근태 로직에 미반영 |
| 부서별 정책 분기 (DEPARTMENT 모드) | — | ❌ 미구현 |
UI/CRUD 및 백엔드 API·서비스·DB 모델은 모두 완비되어 있으나, 비즈니스 로직 연동이 대부분 미완료 상태이다. fix-task-0626 (26년 06월 26일 수정사항)
이슈 9 — 중소기업 감면 연간 한도 200만원 누적 체크 미구현
| 항목 | 내용 |
|---|---|
| 현상 | 대상 여부 및 감면율은 end-to-end 동작하나, 연간 한도 200만원 누적 체크가 미구현 |
| 추가 필요 | 감면 기간 날짜 입력 UI (백엔드는 준비됨, 프론트엔드만 추가 필요) |
| 개선 방향 | 연간 누적 감면액 집계 로직 및 한도 초과 시 자동 차단 구현 |
fix-task-0626 (26년 06월 26일 수정사항)