/SimpleHR project
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

현재 급여 계산 흐름

근무 정책 스펙WorkPolicy 엔티티는 현재 급여 계산 경로에서 완전히 분리되어 있다. 근로정책-급여-연동-현황분석.md

이슈 상세

이슈 1 — 소정근로시간 209시간 하드코딩

항목내용
위치payroll_service.py:604-605
현상EmployeePayBase.monthly_work_hours 기본값 209. 관리자가 수동 입력하지 않으면 그대로 사용됨
WorkPolicy.monthly_standard_hourswork_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)
WorkPolicystart_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.py604-605standard_wage / monthly_work_hours
1일 통상임금payroll_service.py941hourly_wage × 8 하드코딩
근태 수당 할증률payroll_service.py993-1001연장 1.5 / 야간 0.5 / 휴일 1.5 / 휴일초과 2.0
고정 수당 루프payroll_service.py960-989ATTENDANCE 카테고리 스킵, FIXED_OVERTIME(ALLOWANCE)은 통과
근태 수당 루프payroll_service.py1003-1018PAY_OVERTIME 등 근태 기반 수당 추가
연차수당 계산payroll_service.py1020-1037daily_wage × 미사용연차일수
소정근로시간 자동계산policy_service.py65-82_calc_monthly_standard_hours()
근로정책 업데이트policy_service.py108-132update_work_policy() — 급여기초 후처리 없음
엑셀 할증률payroll_excel.py428-431동일한 하드코딩 중복 존재
고정연장수당 시드seed/helpers.py402category=ALLOWANCE
4대보험 요율payroll_service.py국민연금 4.5%·건강보험 3.545%·장기요양 12.81%·고용보험 0.9% 하드코딩 (pay_items.rate 미활용)

근로정책-급여-연동-현황분석.md


관련 페이지


추가 이슈 (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 — 근로정책 수정 폼 할증률 하드코딩 버그

항목내용
위치근로정책 수정 폼 (프론트엔드)
현상 1formNightSurcharge / formHolidaySurchargeuseState("50")으로 하드코딩되어 있고 setter가 없어, 수정 시 항상 50을 전송함
현상 2shift_day_boundarynull일 때 "06:00" 폴백 처리 → 값을 변경하지 않아도 달라진 것으로 감지되어 불필요한 scheduled_change 레코드가 생성됨
현상 3night/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일 수정사항)

Made with CairniExplore public wikis →