이런 사람이라면 재밌게 읽을 수 있어요!
- 회사 휴가 관리가 너무 막막한 HR 담당자
- ERP 시스템에 관심 있는 주니어
- 노션 변태(?)
최근에 회사에서 노션으로 휴가 관리 시스템을 만드는 일을 맡았는데, 꽤나 많은 고민을 했다. 고민이 많은 만큼 만들어 낸 시스템이 생각보다 고퀄리티인 것 같아서 공유를 하고자 한다. 나 같이 노션 변태거나 새로운 SaaS 툴을 도입하는 게 부담이 되는 작은 규모의 스타트업이라면, 어느 정도 만족할 만한 휴가 관리 시스템을 노션에서 구현할 수 있다.
휴가 관리 시스템, 그게 그렇게 어려워?
휴가, 그냥 신청하고 받아주면 되는 거 아니야?
이렇게 생각하는 분들이 많을 것 같다. 휴가 관리는 HR 담당자가 아니면, 이걸 처리하는 게 얼마나 머리 아프고 복잡한 일인지 공감하기 어렵다. 이 프로젝트를 하기 전까지 휴가 관리 시스템이 엄청 쉽고 간단할 줄 알았다. 휴가 관리가 복잡한 이유는 워낙 경우의 수가 많고, 회사 자체 제도와 별개로 근로기준법에 해당하는 부분을 고려해야 하기 때문이다.
반차, 연차, 본인 결혼, 자녀 결혼, 친족 관계 사망 등등…
그래도 아직 체감이 안 되는 분들을 위해 몇 가지 사례를 가져왔다. 많은 분들이 자신이 갖고 있는 휴가일 수를 사용하는 ‘반차’나 ‘연차’ 개념을 알고 있을 것이다. 하지만, 휴가 유형에 ‘반차’나 ‘연차’만 있다고 생각하면 오산이다. 근로기준법에 의해 회사에서 준수해야 하는 몇 가지 휴가 제도가 있다.
예를 들면, 본인이 결혼하는 경우에 자신이 보유한 휴가일 수를 소진하지 않고, 3일을 쉴 수 있다. 이걸 모르고 연차 3일을 박아버린다면? 오우 쉣! 본인이나 배우자의 부모님이 돌아가신 경우에도 휴가일 수를 소진하지 않고 5일을 쉴 수 있다. 앞선 경우에는 유급 휴가가 적용된다. 하지만 한 달마다 쓸 수 있는 생리 휴가는 어떨까? 생리 휴가는 휴가일 소진 없이 하루를 쉴 수 있는데, 여기서는 무급 휴가로 처리된다. 이처럼 휴가 유형은 너무 다양하고, 각 유형마다 적용되는 부분도 다른데, 이 모든 것을 항상 숙지할 수 있을까?
네? 입사 연도는 같은데 전 15일 연차가 안 나온다고요?
휴가 제도 말고도, 생성되는 연차를 계산하는 과정도 복잡하다. A군은 21년 3월 1일, B 군은 21년 10월 1일에 입사했다고 해보자. 그다음 연도의 1월 1일에 A 군은 15일의 휴가일 수를 받는다. 반면, B 군은 22년 10월 1일에 3일의 휴가일 수를 받는다. 왜 A 군과 B 군이 받는 휴가일 수는 다르고, 받는 일자도 다를까?
입사 연도에 1년(365일)의 80% 이상을 근무했다면, 그다음 년 1월 1일에 15일의 휴가일 수를 받는다. 하지만, 80 % 미만을 근무했다면, 입사 날로부터 1년이 지난 시점에 근무일 수에 비례(15일×10월 1일부터 12월 31일까지의 일 수/365일)해 휴가일 수를 부여받는다.
부여된 휴가일 수는 평생 가지 않습니다.
근속에 따라 부여되는 휴가일 수는 크게 ‘연차’와 ‘월차’로 구분된다. ‘월차’는 입사일로부터 1달이 지날 때마다 1개씩 생성이 되며, 총 11개가 생성이 된다. 사용하지 않은 월차는 입사일로부터 1년이 지난 시점에서 소멸된다. 반면 연차는 거의 1월 1일에 생성되고 12월 31일에 모두 소멸된다. 또한 연차 휴가 사용 촉진 제도에 의해 HR 담당자는 연차와 월차가 소멸되기 전에 사람들에게 공지를 해야 한다.
노션으로 만드는 궁극의 휴가 관리 시스템
노션으로 구현한 연차 시스템이 이 모든 경우의 수를 감당할 수 있을까? 정답은 NO다. FLEX 등 다양한 휴가 관리 SaaS 툴을 많은 분들이 찾는 이유도, 회사 자체적으로 이를 모두 커버하기 어렵기 때문이다. 모든 팀원이 입사한 일자가 다르므로 고려해야 하는 경우의 수가 너무 많아져서 관리가 복잡해진다.
하지만 규모가 작은 회사라면, 킹갓 ‘노션’으로 충분히 (1) 다양한 휴가 제도를 모두 반영할 수 있고 (2) 복잡한 휴가 계산을 자동 처리할 수 있다. 이번에 프로젝트로 노션 기반의 휴가 관리 시스템을 만들었는데, 이를 공유해보고자 한다.
0. 시스템 구성
노션 휴가 관리 시스템은 [연차 보드], [연차 기록 대장], [휴가 제도]라는 3가지 데이터베이스로 구성된다. [연차 보드] DB는 [연차 기록 대장] DB와 관계를 맺고 있고, [연차 기록 대장] DB는 [휴가 제도] DB와 관계를 맺는다.
- [연차 보드] DB : 각 팀원이 갖고 있는 휴가일 수를 보여주고, [연차 기록 대장] DB의 휴가 신청 정보를 활용해 잔여 연차를 계산함
- [연차 기록 대장] DB : 팀원이 신청한 휴가를 기록함. 이때, [휴가 제도] DB의 정보를 활용해 반차, 연차, 경조사, 생리 휴가 등의 휴가 유형을 선택
- [휴가 제도] DB : 선택 가능한 휴가 유형을 보여줌. 각 휴가 유형 별(반차, 연차, 경조사 등)로, 연차 소진 유무, 연차 소진일 등의 정보를 저장함
전반적인 플로우는 아래와 같다.
- [연차 보드]에 팀원의 입사일을 적으면, 생성 연차와 월차를 자동 계산
- [휴가 제도]에 회사에서 제공하는 휴가 유형을 저장
- 팀원이 휴가를 신청하면, [연차 기록 대장]에 해당 신청을 기록
- 이때, [휴가 제도]에서 신청한 휴가 유형이 무엇인지 선택
- [연차 기록 대장]에서 기록한 내용은 [연차 보드]에 바로 반영되고, 잔여 연차를 계산함
1. 연차 기록하기
우선 연차를 기록할 공간인 [연차 기록 대장]을 만든다. 노션에서 Table DB를 만들고 아래와 같은 칼럼을 만든다
- [휴가자] 칼럼 : 휴가를 신청한 사람을 선택
- [휴가 기간(시작-끝)] : 휴가 기간을 입력
- [휴가일 수] : 입력한 휴가 기간을 활용해 총 휴가일 수를 계산
[휴가일 수] 칼럼은 휴가 기간을 입력하면, 자동으로 휴가일 수를 집계할 수 있도록 함수 칼럼을 활용한다. 함수 칼럼은 노션에서 제공하는 기능으로, 엑셀의 함수처럼 DB 내 데이터를 불러오고 여러 계산을 할 수 있다.
여기서 활용하는 함수는 dateBetween과 start, end 함수다. dateBetween(date 1, date 2, type) 함수는 서로 다른 두 날짜 사이의 시간을 특정한 유형(월, 일, 시 등)으로 바꿔서 Return한다. start(date range)와 end(date range) 함수는 날짜 범위에서 시작과 끝을 각각 return 한다. 아래와 같이 함수를 입력하면, [휴가 기간(시작-끝)]에 입력한 기간의 일 수를 계산할 수 있다. 마지막에 +1을 더한 이유는 휴가가 끝나는 날도 포함시키기 위해서다.
2. 휴가 제도 설정하기
이 정도 수준에 만족한다면 ‘궁극의 노션 휴가 관리 시스템’이라 말할 수 없다. 앞서 말했듯이, 휴가 유형 중에는 ‘연차를 소진하는 휴가’와 ‘그렇지 않은 휴가’가 있다. 예를 들어 본인이나 자녀의 결혼인 경우, 연차를 소진하지 않고 회사를 쉴 수 있는데 결혼, 출산, 친족 관계 사망 등은 근로기준법상으로 회사가 의무적으로 보장해야 하는 휴가다. 이 모든 것을 하나하나 다 외울 수 있을까? 절대 불가능이다.
따라서 굳이 외울 필요 없이 휴가를 신청할 때, 어떤 휴가 유형을 사용할지 선택할 수 있는 기능을 구현해야 한다. 이를 위해선, 각각의 휴가 유형에 대한 정보를 저장한 [휴가 제도] DB를 만들어야 한다. [휴가 제도] DB를 만들기 위해, 다시 새로운 Table DB를 만들고 아래와 같은 칼럼을 만든다.
- [연차 소비] 칼럼 : 해당 휴가 유형이 연차를 소비하는지 알려줌
- [연차 단위] 칼럼 : 단위 당 회사를 얼마나 쉬는지 보여줌
- [소진 단위] 칼럼 : 단위 당 보유한 연차를 얼마나 소진하는지 보여줌
반차는 한 번 쓸 때마다 0.5일을 쉬고, 0.5의 연차가 소진된다. 따라서 [연차 소비] 칼럼은 True가 되고, [연차 단위]와 [소진 단위] 칼럼은 모두 0.5다. 반면 본인 결혼은 한 번 쓸 때마다 5일을 쉬는데, 이때 근로기준법상으로 연차는 소진되지 않는다. 따라서, [연차 소비] 칼럼은 False가 되고, [연차 단위]는 5, [소진 단위]는 0이다.
이처럼 회사에서 제공하고 있는 휴가 유형을 해당 DB에 모두 만든다. 유급 휴가/무급 휴가를 알려주는 칼럼 등을 추가해 더 많은 정보를 전달할 수도 있다.
여기서 끝나면 뭔가 섭섭하다. 이런 식으로 우리 회사의 휴가 제도를 보여주면 사람들이 재밌어할까? ‘보기 좋은 떡이 먹기도 좋다!’라는 말이 있듯이, 디자인이 이뻐야지 계속 보는 맛이 난다. 이걸 살짝 더 이쁘게 만들고 싶다면, 2개의 함수 칼럼을 추가해주자.
함수 칼럼을 이용해 [연차 단위]와 [소진 단위] 칼럼을 더 이쁘고 직관적으로 보여줄 수 있다. 이번에 사용할 함수는 format()과 concat() 함수다. format(number)은 number 타입을 str 타입으로 바꿔주고, concat(str1, str2)는 str 타입끼리 이어준다. 두 함수를 아래처럼 이용해서 누구나 쉽게 이해 가능한 표현으로 바꿀 수 있다.
이제 이렇게 완성된 [휴가 제도] DB의 View를 Table 형식이 아니라, Gallery 형식으로 바꿔준다.
이렇게 설정한 갤러리 뷰에서 [속성] – [property] – [card preview]에서 ‘None’을 선택한다. 그러면, 아래와 같이 깔끔한 휴가 제도판을 만들 수 있다.
3. 휴가 신청 시 유형 선택하기
이렇게 완성한 [휴가 제도] DB를 앞서 작업한 [연차 기록 대장] DB와 Relation 기능을 통해 이어준다면, [연차 기록 대장]에서 팀원의 휴가 신청을 기록할 때마다 휴가 유형을 선택할 수 있다. 또한, role up 기능을 이용한다면, 선택한 유형과 관련된 데이터도 불러올 수 있다.
이때 [연차 기록 대장] DB를 구성하는 [휴가 일 수] 함수 칼럼에 약간의 수정이 필요하다. 왜냐하면 ‘반차’를 고려해야 하기 때문이다. 예를 들어 2021년 12월 2일에 연차를 쓴다고 해보자. 그러면 [휴가 기간(시작 – 끝)]은 2021.12.2 ~ 2021.12.2를 범위로 설정하면 된다. 하지만, 이때 연차가 아니라 반차를 쓴다면? 마찬가지로 [휴가 기간(시작 – 끝)]은 2021.12.2 ~ 2021.12.2를 범위로 한다.
하지만 전자와 후자에서 소비하는 연차 수는 각각 1과 0.5이다. 즉 동일한 칼럼 값을 갖고 있지만, 실제로 소비하는 연차 수는 다르다. 하지만 앞서 만든 [휴가일 수] 칼럼에서는 이를 반영하지 못한다.
앞서 [휴가 제도] DB와 [연차 기록 대장] DB를 연결함으로써, 쓰고자 하는 휴가 유형을 선택할 수 있다. 여기서 선택한 휴가 유형이 ‘반차’라면, [휴가일 수] 칼럼에서 다른 계산법을 적용하면 된다. 즉, ‘반차’를 쓴다면 0.5의 휴가일이라고 예외적으로 처리하면 되는데, 이는 if()와 contains() 함수를 사용하면 된다.
if(boolean, val 1, val 2) 함수는 boolean이 True인 경우에 val 1을, False인 경우에 val 2를 return 한다. contains(str 1, str 2)는 str 2가 str 1 안에 들어가는지에 대한 boolean을 return 한다. 아래의 이미지처럼 함수를 구성하면, (1) 반차인 경우에 휴가 일 수를 0.5로, (2) 그 외의 경우에는 이전과 마찬가지로 서로 다른 두 날 사이의 일 수를 계산하게 만들 수 있다.
이제 앞서 계산한 휴가일 수를 기반으로, 실제로 연차가 얼마나 소진됐는지를 보여주는 [연차 소진일 수] 칼럼을 만들 차례다. 예를 들어 12월 1일부터 12월 3일까지 나간다고 해보자. 이때 사유가 자녀의 결혼 때문이라면, 근로기준법에 의해서 연차를 소진하지 않고 그냥 나갔다 오면 된다. 하지만, 별다른 이유 없이 그냥 쉬고 싶은 것이라면, 총 3개의 연차를 소비해야 한다. 우리는 팀원이 선택한 휴가 유형이 연차를 소비하는지 그렇지 않은지에 대한 정보를 [휴가 제도] DB에서 이미 갖고 있다.
[연차 기록 대장] DB에서 선택한 휴가 유형이 연차를 소비하는지 보여주기 위해 Role up 칼럼을 이용한다. Role up 칼럼은 관계를 맺은 DB의 아이템이 갖고 있는 특정 칼럼의 데이터를 불러올 수 있다. 예를 들어, 본인 결혼은 연차를 소비하지 않는 의무 휴가이므로, [휴가 제도]에서 [연차 소비] 칼럼이 ‘X’ 값으로 설정했다. 이 데이터를 불러오는 [연차 소비 여부] 칼럼은 아래처럼 ‘X’ 값을 보여주고 있다.
이제 실제로 얼마큼의 연차가 소비되는지를 보여주는 [연차 소진일 수] 함수 칼럼을 만들면 된다. 아래의 이미지처럼, 선택한 휴가 유형이 연차를 소비하지 않는 경우에 if() 함수를 통해 0으로 인식하면 된다.
적용 예시로 101% 이해하기
위 과정을 통해서 팀원이 (1) 얼마나 휴가를 나갔다 오고, (2) 이때 어떤 휴가 유형으로 나갈 수 있는지 선택 가능하며 (3) 선택한 유형에 따라 얼마나 내가 보유한 휴가일 수가 소진되는지 알 수 있다. 더 쉬운 이해를 위해 예를 들어보자.
위의 [연차 기록 대장] DB를 보면 이명성이 총 2번의 휴가를 나갔음을 알 수 있다. 우선 10월 28일부터 11월 1일까지 결혼을 사유로 휴가를 나갔다. 본인 결혼인 경우, 근로기준법상으로 개인이 갖고 있는 휴가일 수를 소비하지 않는다. 이는 [연차 소비 여부] role up 칼럼에서 확인할 수 있다. 따라서, [휴가일 수] 칼럼을 보면 총 5일 휴가를 나갔지만, [연차 소진일 수] 칼럼은 0일을 보여준다.
그다음으로 11월 1일부터 11월 3일까지 여름휴가를 감을 알 수 있다. [휴가 종류] relation 칼럼을 보면, 휴가 유형이 ‘연차’가 아니라 ‘여름 특별 휴가 제도’를 활용했음을 알 수 있다. 해당 제도는 리프레쉬 휴가 차원으로, 개인이 보유한 휴가일 수를 소비하지 않으므로 [연차 소진일 수] 칼럼이 동일하게 0이 된다.
이번 년도 내 휴가 갯수는?
이번에는 입사일만 입력하면 얼만큼의 휴가가 생성되는지 알려주고, 연차 기록 대장과 연동해 연차를 쉽게 보여주는 대시보드를 만들어 보자!
1. 3월 입사자와 4월 입사자는 연차 갯수가 다릅니다.
대시보드를 만들기 전에, 다시 한 번 휴가 생성과 소멸에 대해 알아보자. 휴가 생성은 연차와 월차로 나뉜다. 월차는 입사일로부터 한 달이 지날 때마다, 1개씩 월차가 부여된다. 이 월차는 최대 11개까지 부여되며, 입사일로부터 1년이 지나는 시점에서 모두 소멸된다.
이후부터는 월차는 생성되지 않고, 대신 연차가 생긴다. 연차는 근속연수가 1년이 됐을 때부터 생기는 휴가일로 12월 31일이 지나면 모두 소멸된다. 여기까지는 휴가일 계산이 꽤 쉬워보인다.
하지만, 이 계산이 여기서 끝난다면 휴가 관리가 골치 아프다고 말할 수 없다. 휴가 관리가 복잡한 이유 중 하나는 입사일에 따라서, 휴가 계산 방법에 차이가 생긴다. A군은 21년 3월 1일, B 군은 21년 10월 1일에 입사했다고 해보자. 그다음 연도의 1월 1일에 A 군은 15일의 휴가일 수를 받는다. 반면, B 군은 3일의 휴가일 수를 받는다. 이 차이는 근로기준법을 보면 알 수 있다.
근로기준법상으로 입사 연도에 1년(365일)의 80% 이상을 근무했다면, 그다음 년에 15일의 휴가일 수를 받는다. 하지만, 80 % 미만을 근무했다면, 근무일 수에 비례(15일×10월 1일부터 12월 31일까지의 일 수/365일)해 휴가일 수를 부여받는다.
2. 오래 다닐수록, 연차도 많아져요!
또한 근속연수에 따라서도 휴가일 수가 달라진다. 근속연수가 3년이 되면, 휴가일 수가 15일에서 16일로 바뀐다. 이 후, 매 2년마다 휴가일 수가 +1이 된다. 다시 A군과 B군의 이야기로 가보자. 21년 3월 1일에 입사한 A군은 24년 1월 1일에 16일의 연차를 받는다. 왜냐하면, 22년, 23년, 24년까지 총 3번이 거쳤기 때문이다. 그렇다면 같은 년도의 10월 1일에 입사한 B군도 24년 1월 1일에 16일의 연차를 받을까?
답은 NO다. B군은 25년 1월 1일에 16일의 연차를 받는데, 이는 B군이 15일의 연차를 받는게 23년 1월 1일이기 때문이다. 15일 연차를 받는 년 수를 기준으로 하므로, B군은 25년 1월 1일이 되서야 16일의 연차를 받는다.
결론적으로 입사일이 언제인지에 따라서 서로 다른 연차 계산법이 적용된다. 이를 바꿔 말하면, 입사일을 입력 받고, 각 상황에 맞는 계산법을 적용하면 휴가일 수 계산을 자동화 시킬 수 있다.
월차 계산? 입사일만 입력하세요!
A. 칼럼 구성
휴가 생성에 대해 알아봤으니, 이제 입사일만 입력해도 바로 얼만큼의 휴가가 생성되는지를 계산하는 대시보드를 만들어보자! 우선, 새로운 Table DB를 만든다. 그리고, 입사일을 입력할 [입사일] 칼럼을 만든다. 여기에 입력한 날짜를 함수에 사용함으로써, 휴가일 수를 자동 계산할 것이다.
먼저 월차를 다뤄보자. 입사일로부터 1달이 지날 때마다 월차가 생긴다. 그리고 이 월차는 입사일로부터 1년이 지날 때 모두 소멸되고, 앞으로 월차가 생기지 않는다. 이를 반영하기 위해, 현재 시점에서 (1) 월차가 생성 가능한 상태인지를 보여주는 칼럼과, 그렇다면 (2) 지금까지 생성된 월차는 몇 개인지 보여주는 칼럼을 만들어야 한다. 이 칼럼은 함수 칼럼을 이용한다.
- [입사일] 칼럼 : 입사일을 입력하는 곳으로, 이 입력 값에 따라 다른 칼럼 값이 자동으로 도출된다.
- [월차 생성 여부] 칼럼 : 입력한 입사일과 현재 시점을 비교해, 월차가 생성되는지 보여준다.
- [월차 발생] 칼럼 : 입력한 입사일과 현재 시점을 비교해, 몇 개의 월차가 생성되는지 보여준다.
B. 오늘 날짜를 어떻게 구할까?
[월차 생성 여부] 칼럼은 입사일로부터 1년이 지났는지 그렇지 않은지를 판단하는 함수를 구현하면 된다. 이를 위해 dateBetween(), dateAdd()와 fromTimestamp() 총 3가지 함수를 이용한다. 이 3가지 함수는 이후에도 계속 다룰 예정이니 여기서 완전히 숙지하고 가자!
- dateBetween(date 1, date 2, type)는 서로 다른 두 날짜 사이의 시간을 특정한 유형(월, 일, 시 등)으로 바꿔서 Return한다.
- dateAdd(date, number, type)는날짜로부터 숫자 만큼의 년, 월, 일 등을 더한 날짜를 return 하는 함수다. 예를 들어, dateAdd(now(), 10, “days”)라면, 오늘로부터 10일 이후의 날짜를 return 한다.
- 마지막으로, fromTimestamp(number)은 입력한 숫자를 Unix millisecond로 인식하고 날짜로 바꿔주는 함수다. 이 때, fromTimestamp(0)은 1970년 1월 1일이다.
이 3가지 함수 외에도 now()와 year(), month(), date() 함수가 함께 사용된다. now()는 현재 시점을 return하는 함수인데, 여기서 현재 시점은 날짜와 시간을 모두 포함한다. 예를 들어, 2021년 10월 21일 오후 10시 36분 42초를 리턴한다.
여기서 우리에게 필요한 건 ‘오후 10시 36분 42초’인 시간 데이터가 아니다. 오직, ‘2021년 10월 21일’인 날짜 데이터 뿐이다. 날짜 데이터만 추출하기 위해 year(), month(), date() 함수를 활용한다. year(date), month(date)와 date(date)는 각각 입력한 날짜에서 연, 월, 일을 추출한다. 따라서, 오늘의 날짜 데이터는 year(now()), month(now()), date(now()) 로 추출할 수 있다.
위 함수를 종합해서 아래와 같이 사용하면 오늘 날짜를 리턴할 수 있다. 한 가지 의문이 생길 수 있다. 왜 오늘 시점을 구하는데 now()가 아니라, 이렇게 복잡한 함수를 쓸까? 위에서도 말햇듯이, now()의 리턴값에는 시간도 포함하고 있다. 그러나 계산에서 필요한 건 시간이 아니라 날짜만이므로, dateAdd()와 fromTimestamp()를 이용한다.
dateAdd(dateAdd(dateAdd(fromTimestamp(0), year(now()) – 1970, “years”), month(now()), “months”), date(now()), “days”)
3. 이 사람은 월차가 만들어질까?
다시 [월차 생성 여부] 함수 칼럼으로 돌아가자. 월차는 입사일로부터 1년이 지나기 전까지만 생성되는 휴가가이며, 입사일로부터 1년이 되는 시점에서 모두 소멸된다. 따라서 월차의 생성 및 소멸을 고려하기 위해선 현재 날짜가 입사일로부터 1년이 지난 날과 계속 비교를 해야 한다.
입사일로부터 1년이 지난 날짜는 dateAdd()와 fromTimestamp() 함수를 통해 구할 수 있다. 앞서 말했듯이, fromTimestamp(0)은 1970년 1월 1일을 리턴한다. year(입사일), month(입사일), date(입사일)는 입사일의 년, 월, 일을 리턴한다. 아래와 같은 함수를 입력하면, 입사일로부터 정확히 1년이 지나기 전날을 구할 수 있다.
dateAdd(dateAdd(dateAdd(fromTimestamp(0), year(prop(“입사일”)) – 1969, “years”), month(prop(“입사일”)), “months”), date(prop(“입사일”)) – 1, “days”)
오늘 날짜와 입사일로부터 1년이 지난 날짜를 DateBetween() 을 이용해 비교함으로써, 월차가 아직까지 생성되는지 계산할 수 있다. 아래 왼쪽은 1년이 지나지 않았기에, [월차 생성 여부] 칼럼이 체크됐지만, 오른쪽은 1년이 훨씬 지났으므로 체크되지 않음을 볼 수 있다.
D. 그렇다면, 몇 개의 월차가 생성될까?
이제 현재 날짜에 월차가 몇 개가 생성됐는지를 보여주는 [월차 발생] 칼럼을 만들어보자. 해당 칼럼은 앞서 구한 [월차 생성 여부] 칼럼에 True일 때만 계산이 되고, False가 되면 0이 나오도록 해야 한다. 왜냐하면, 현행법상으로 월차는 입사일로부터 1년이 됐을 때, 모두 사라지기 때문이다. if()로 월차가 생성되는지 판단하고, 생성되는 경우에 월차는 dateBetween()과 now()를 사용해 계산할 수 있다.
연차 계산도, 입사일만 있으면 끝!
A. 칼럼 구성
월차 파트는 끝났으니, 이제 연차 파트로 넘어가보자. 연차 계산을 위해서 아래와 같은 칼럼이 필요하다. 전반적인 계산 방식은 앞선 월차와 비슷하지만, 특이하게 ‘입사년도에 1년 중의 80%를 근무했는가?’를 고려해야 한다.
- [근속 연수] : 15일의 연차가 나오는 년수를 보여준다.
- [입사년도 80% 근무] 칼럼 : 입사년도에 1년 중 80%를 근무했는지를 보여준다.
- [연차 생성 여부] 칼럼 : 연차가 생성되는지 보여주는 칼럼으로, 입사년도로부터 그 다음 년 1월 1일부터 체크된다.
- [연차 발생] 칼럼 : 입력한 입사일과 현재 시점을 비교해 발생하는 연차를 보여준다.
B. 이 사람은 연차가 생성될까?
연차는 입사년도의 그 다음 년에 발생한다. 즉, 현재 시점이 입사년도의 그 다음 년 1월 1일을 지났을 때, 연차가 생성된다고 볼 수 있다. 이를 보여주는 [연차 생성 여부] 칼럼을 아래와 같이 만든다.
C. 입사년도에 80% 이상 근무했나?
여기서 추가적으로 고려해야 할 부분은 입사년도에서 365일 중에 80% 이상을 근무했는지 확인하는 것이다. 법에 따르면, 입사년도에 1년의 80% (=365 * 0.8) 이상을 근무하는 경우, 그 다음 년 1월 1일에 15일의 연차를 제공해야 한다. 80% 미만 근무인 경우, (입사년도의 근무일 수 / 365일 * 15일)의 연차를 제공해야 한다.
입사년도에 80% 이상 근무했는지 파악하려면, 입사일과 입사년도의 12월 31일 사이의 일 수를 계산하고, 이 결과값이 365일 * 0.8보다 큰지를 알아내야 한다. 이는 아래와 같은 함수로 구현 가능하며, 일 수가 365 * 0.8보다 큰 경우에 True를, 그렇지 않으면 False를 리턴한다.
D. 이 사람은 몇 개의 연차가 생성될까?
입사년도의 80% 근무 유무를 파악할 수 있으니, 이제 생성되는 연차를 계산하면 된다. 이 때, 근속 연수가 3년이 됐을 때 연차가 16일이 되며, 그 이후로 2년마다 연차가 +1이 된다는 점을 추가로 고려해야 한다.
여기서의 근속 연수는 ’15일의 연차가 발생한 년도의 수’를 따져야 한다. 예를 들어, 21년 10월 입사자라면, 입사년도에 80% 이상 근무를 하지 못했다. 따라서, 그 다음 년에 ‘입사년도의 근무일 수/365일 * 15’일의 연차가 들어오는데, 이는 15일의 연차에 해당하지 않는다. 이 입사자는 15일의 연차를 23년 1월 1일에 받게 된다. 따라서, 16일의 연차가 발생하는 시점은 24년 1월 1일(입사년도 + 2)이 아니라, 25년 1월 1일(15일 연차가 발생하 년도+ 2)이다.
이 부분을 반영하기 위해 [근속 연수] 칼럼을 만들고, 아래와 같이 구현하면 된다. [입사년도 80% 근무] 칼럼을 통해 입사자가 입사년도에 80% 이상 근무했는지를 알 수 있다. 따라서, 만약 80% 이상 근무시에는 그 다음 년 1월 1일부터 근속 연수(편의상 앞으로 15일의 연차가 받은 년 수를 지칭)를 1이라고 계산하고, 80% 미만 근무 시에는 0으로 계산한다.
이렇게 계산한 근속 연수를 활용해 연차 발생 수를 계산할 수 있다. 근속연수가 1 ~ 2 일 때는 15일의 연차가 발생하고, 3 부터 16일의 연차가 발생한다. 이 후, 2년이 지날 때마다 연차가 + 1이 된다. 또한, 근속 연수가 0이지만 연차가 생성되는 경우(=입사년도에서 80% 미만 근무)에 (입사년도의 근무일 수 / 365일 * 15일)의 연차가 생성된다.
잔여 휴가까지 완벽한 휴가 대시보드!
앞선 과정을 통해 입사일에 따른 연차와 월차 생성 갯수를 자동 계산할 수 있게 됐다. 이제 휴가를 얼마나 소비했는지를 보여주는 [소비 연차]칼럼과, 잔여 연차를 보여주는 [남은 연차] 칼럼을 만들면 대시보드가 완성된다.
1. 소비 연차를 하나하나 신경쓰기 귀찮다면?
그렇다고 여기서 끝나긴 뭔가 아쉽다. 소비 연차를 하나하나 카운팅하는 게 매우 번거롭지 않을까? 앞선 게시글에서 구현한 [연차 기록 대장]을 가져올 차례다. 관계형 칼럼을 하나 추가하고, [연차 기록 대장] DB와 연결한다. 이 후, 해당 유저가 [연차 기록 대장]에서 작성한 내용을 모두 불러온다. 이제 팀원이 어떤 휴가를 등록했는지를 [연차 보드]에서 확인할 수 있다.
이제 기존 [소비 연차] 칼럼을 롤업 칼럼으로 바꾼다. 아래와 같이, 관계를 맺은 [연차 기록 대장] DB 내 [휴가일 수] 칼럼의 데이터를 불러오고, 여기서 SUM 계산을 적용하자! 이제 [연차 기록 대장]에 휴가를 쓰기만 해도, 각자가 얼마나 연차가 남았는지 확인할 수 있다.
2. 이걸 어떻게 다 구현해요?
위와 같은 템플릿을 사이드 프로젝트로 운영하는 노션 무료 템플릿 홈페이지에 업로드했습니다. 필요하신 분은 다운 받아서 쓰시길 바랍니다!
원문: Feme Lee의 브런치
이 필자의 다른 글 보기