정글에서 온 개발자

[연차 촉진 시스템] 기획과 문제 해결을 위한 DB설계 본문

정리

[연차 촉진 시스템] 기획과 문제 해결을 위한 DB설계

dev-diver 2024. 6. 17. 09:38

연차 촉진의 개요

  • 휴가가 남으면 휴가를 쓰도록 촉진. 촉진시 미사용 휴가 수당이 면제됨
  • 1차 촉진, 2차 촉진, 노무 거부로 이루어짐
  • 모든 과정은 근로자가 인지할 수 있어야 함.

필요한 이유

연차 촉진

구성원의 자유로운 휴가 사용 장려.
회사의 미사용 연차 수당 지급 부담 경감

번거로운 절차 해소

회사 : 구성원 별 연차 계산, 1차 촉진, 2차 촉진, 노무 수령 거부 등의 프로세스
구성원 : 연차 일수 관리, 변경 시 재결재, 팀원과 일정 조율 등

연차 촉진을 하긴 하고 싶은데, 과정이 너무 복잡해서 필요하다.

해결해야 할 문제들

  1. 법령대로라면 사람마다 연차가 발생하는 시기가 다르고, 촉진해야하는 시기가 다르다.
  2. 개별 관리가 어려워 회계일 기준 관리를 허용해줬다.
    1. 이 과정에서 휴가가 발생하는 기준이 회사마다 다르다. (휴가 선지급 여부, 1년 이하 사원의 회계일 기준 발생 연차 계산법 등)
    2. 중간에 정책이나 법령이 바뀌는 것을 대비해야 한다. (입사일 기준 지급 강제화 등)
  3. 제대로 된 연차 촉진은 '서면'으로 해야한다. 전산으로 하려면 근로자가 확실히 인식해야 한다.

문제 해결 방법

  1. 단순 스케줄러로 '7월1일 1차 촉진, 11월1일 2차촉진' 이런식으로 하면 확장성이 떨어진다. 당장은 일괄적으로 관리하는 것'처럼' 보이더라도 실제로는 DB에서 각 사원의 발생 연차를 따로 관리해야 한다.
    • [연차 발생 테이블]과 [연차 소모 테이블]을 따로 만들고 연차가 소모할 때마다 연차 소모를 기록하고, 연차 발생에는 큐처럼 앞에 있는 순서부터(FIFO) '소모 시간' 과 '남은 시간'을 기록한다.
    • [연차 소모 테이블]에 사용 유형 (연가, 공가 , 병가 등) 에   '촉진' 을 추가하여 촉진된 휴가임을 알 수 있게 한다.연가의 하위 클래스 개념이고, 이후 날짜 변경 불가 등의 기능을 사용할 수 있다.
  2.  중간에 기준이 바뀌었을 때 '근로자에게 불리하지 않게 해야 한다.'는 단서가 있다.
    • 입사일 기준 1년 단위든, 회계일이든, 연차 발생시 연차 발생의 기준을 DB에 같이 적어놓고 회사의 정책이 바뀌더라도 해당 휴가는 원래 발생했을 때의 소모일까지 쓸 수 있도록 한다.
    • 기준이 바뀌면서 휴가가 더 필요하면 추가로 발생시키고 휴가 발생 기준을 '조정용' 으로 기입한다.
    • 기준이 바뀌면서 휴가가 초과돼서 발생한 경우더라도 기존의 휴가를 소멸시키지 않는다.  (조정용 휴가는 삭제 가능)
  3. 회사와 근로자가 촉진 사실을 확실히 인지했음을 기록할 수 있도록 '알림' 과 알림 '승인'을 통해 연차 촉진을 기록한다.

UI 설계

UI 화면

  • 크게 6개의 화면으로 구성된다.
    • 로그인
    • 프로필
    • 달력
    • 대쉬보드
    • 알림
    • 회사 관리

DB 설계

연차 촉진 ERD

주요 테이블의 속성은 다음과 같다.

발생 휴가

  • id
  • member_id - 외래키
  • generate_type_id - 발생 타입
  • duration_year - 몇년차인지
  • given_days - 총 휴가일수
  • generate_date - 발생 일수
  • expire_date - 휴가 소멸일
  • total_hours - 총 시간 . 시간 단위로 쓸 수 있는 시스템을 염두
  • used_hours - 사용 시간
  • reserved_hours - 신청 시간 : 신청만 해놓고, 아직 승인되지 않은 휴가의 시간
  • remaining_hours - 남은 시간
  • is_expired - 소멸 여부 : 모든 시간이 사용되었거나, 소멸일을 지난 경우 True

소모휴가

  • id
  • member_id - 외래키
  • vacation_type_id - 연차 타입
  • vacation_process_type_id - 연차 처리 상태
  • start_datetime - 시작시간
  • end_datetime - 종료시간
  • [start_date] - 시작일 : 달력에 표시하는 등 계산 편의를 위함.
  • [end_date] - 종료일