이번 글에서는 PHP를 사용하여 직원의 연차 계산 로직을 구현하는 방법을 소개합니다.
이 코드는 직원의 근속기간에 따라 연차를 계산하며, 사용된 연차 일수와 남은 연차 일수를 처리합니다.
이와 함께 공휴일 및 주말(토/일)을 제외한 계산 로직도 포함되어 있습니다.
---
연차 계산 로직 설명
연차 계산 로직은 다음과 같은 흐름으로 구성됩니다:
1. DB에서 데이터 조회
- 연차 데이터(holliday 테이블)에서 현재 사용자와 관련된 승인된 데이터를 가져옵니다.
- 최신 데이터부터 정렬합니다.
2. 근속 기간 계산
- 입사일부터 오늘까지의 기간을 계산합니다.
- 연 단위($calDate->y) 및 월 단위($calDate->m)로 나뉘어 계산됩니다.
3. 총 연차 일수 계산
- 근속기간이 1년 미만일 경우, 근속 월수만큼만 연차를 지급합니다.
- 근속 1년 이상일 경우 기본 15일을 지급하며, 3년마다 1일을 추가로 지급합니다.
4. 연차 사용 일수 계산
- 승인된 연차 데이터($resultData)를 기준으로 사용된 연차를 계산합니다.
- 토요일, 일요일은 연차에서 제외합니다.
5. 기준년도 계산
- 입사일이 오늘보다 뒤에 있는 경우, 기준년도를 전년도(-1년)으로 설정합니다.
- 근속기간이 2년 미만일 경우 기준년도에서 1년을 추가로 뺍니다.
---
코드 구현
$resultData = DB::table('holliday')
->where('user_id', $userData->id)
// ->where('begin_date', '>=', (date('Y') - 1) . date("-m-d", strtotime($userData->hired_date)))
->where('stat', '승인')
->orderBy('begin_date', 'desc')
->get();
$beginDate = new DateTime(date('Y-m-d'));
$endDate = new DateTime($userData->hired_date);
$calDate = $beginDate->diff($endDate);
// 총 연차 일수 계산
if (!$calDate->y) {
$userData->work_days = $calDate->m; // 1년 미만이면 월 단위 지급
} elseif ($calDate->y == 1) {
$userData->work_days = 11 + 15; // 1년 차는 추가 연차 포함
} else {
$userData->work_days = 15; // 기본 15일 지급
}
// 3년마다 추가 연차
$userData->add_days = 0;
if ($calDate->y >= 3) {
$userData->add_days += count(range(3, $calDate->y, 3));
}
$userData->used_days = 0;
// 기준년도 계산
if (date('md', strtotime($userData->hired_date)) > date('md')) {
$userData->targetYear = date('Y', strtotime('-1 year'));
} else {
$userData->targetYear = date('Y');
}
if ($calDate->y < 2) {
$userData->targetYear = $userData->targetYear - 1;
}
// 연차 사용 일수 계산
foreach ($resultData as $key => $value) {
if ($value->category == 'annual' &&
$userData->targetYear . date('md', strtotime($userData->hired_date)) <= date('Ymd', strtotime($value->begin_date))) {
for (
$i = date('Ymd', strtotime($value->begin_date));
$i <= date('Ymd', strtotime($value->end_date));
$i = date('Ymd', strtotime($i . ' +1 day'))
) {
if ($userData->targetYear . date('md', strtotime($userData->hired_date)) <= $i && $i <= date('Ymd')) {
if (date('N', strtotime($i)) == 6 || date('N', strtotime($i)) == 7) {
continue; // 주말 제외
}
if ($value->days == '0.5') {
$userData->used_days += 0.5; // 반차
} else {
$userData->used_days++; // 전체 연차
}
}
}
}
}
---
주요 포인트
1. DateTime과 diff 메서드 활용
DateTime 객체와 diff 메서드를 사용하면 간단히 두 날짜 간의 차이를 구할 수 있습니다.
이 코드는 연차 계산에 필수적인 근속 기간을 쉽게 계산할 수 있게 도와줍니다.
2. 기준년도 설정
입사일이 오늘 이후일 경우 전년도(-1 year)를 기준으로 연차를 계산합니다.
근속 2년 미만일 경우 기준년도에서 1년을 추가로 빼는 로직이 포함되어 있습니다.
3. 연차 사용 일수 계산
반차(0.5)와 일반 연차를 구분하며, 토요일(6)과 일요일(7)은 연차 계산에서 제외합니다.
---
결론
이 코드는 직원의 근속기간에 따른 연차 지급 및 사용 연차 계산을 효율적으로 처리합니다. 주말 및 반차 처리까지 모두 포함되어 있으니, 이 코드를 기반으로 여러분의 프로젝트에 맞게 수정해 보세요.