본문 바로가기
BackEnd

PHP: 연차 계산 로직 구현 및 설명

by E_van 2021. 12. 27.

이번 글에서는 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)은 연차 계산에서 제외합니다.

---

결론

이 코드는 직원의 근속기간에 따른 연차 지급 및 사용 연차 계산을 효율적으로 처리합니다. 주말 및 반차 처리까지 모두 포함되어 있으니, 이 코드를 기반으로 여러분의 프로젝트에 맞게 수정해 보세요.