brunch

You can make anything
by writing

C.S.Lewis

by FameLee Nov 17. 2021

노션으로 만드는 궁극의 휴가 시스템 2편

노션 변태(?)의 프로젝트

목차  
1. 이번 년도 내 휴가 갯수는?  
2. 월차 계산? 입사일만 입력하세요!  
3. 연차 계산도 입사일만 있으면 끝!  
4. 잔여 휴가까지 완벽한 대시보드!  
이런 사람이라면 재밌게 읽을 수 있어요
1. 회사 휴가 관리가 너무 막막하다.
2. 연차, 월차 계산이 너무 복잡해서 이해가 1도 안 간다.
3. 노션 변태(?)


 이전 글에서 휴가를 신청할 때, 다양한 휴가 유형을 선택할 수 있는 노션 시스템을 알아봤다. 이번에는 입사일만 입락하면 얼만큼의 휴가가 생성되는지 알려주고, 연차 기록 대장과 연동해 잔여 연차를 쉽게 보여주는 대시보드를 만들어보자!


이번 년도 내 휴가 갯수는?

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일의 연차를 받는다. 꽤나 복잡해보이지만, 결론적으로 입사일이 언제인지에 따라서 서로 다른 연차 계산법이 적용된다. 이를 바꿔 말하면, 입사일을 입력 받고, 각 상황에 맞는 계산법을 적용하면 휴가일 수 계산을 자동화 시킬 수 있다.


월차 계산? 입사일만 입력하세요!

1. 칼럼 구성

 휴가 생성에 대해 알아봤으니, 이제 입사일만 입력해도 바로 얼만큼의 휴가가 생성되는지를 계산하는 대시보드를 만들어보자! 우선, 새로운 Table DB를 만든다. 그리고, 입사일을 입력할 [입사일] 칼럼을 만든다. 여기에 입력한 날짜를 함수에 사용함으로써, 휴가일 수를 자동 계산할 것이다.


 먼저 월차를 다뤄보자. 입사일로부터 1달이 지날 때마다, 월차가 생긴다. 그리고, 이 월차는 입사일로부터 1년이 지날 때 모두 소멸되고, 앞으로 월차가 생기지 않는다. 이를 반영하기 위해, 현재 시점에서 (1) 월차가 생성 가능한 상태인지를 보여주는 칼럼과, 그렇다면 (2) 지금까지 생성된 월차는 몇 개인지 보여주는 칼럼을 만들어야 한다. 이 칼럼은 함수 칼럼을 이용한다.

[입사일] 칼럼 : 입사일을 입력하는 곳으로, 이 입력 값에 따라 다른 칼럼 값이 자동으로 도출된다.
[월차 생성 여부] 칼럼 : 입력한 입사일과 현재 시점을 비교해, 월차가 생성되는지 보여준다.
[월차 발생] 칼럼 : 입력한 입사일과 현재 시점을 비교해, 몇 개의 월차가 생성되는지 보여준다.


2. 오늘 날짜를 어떻게 구할까?

 [월차 생성 여부] 칼럼은 입사일로부터 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년이 훨씬 지났으므로 체크되지 않음을 볼 수 있다. 


4. 그렇다면, 몇 개의 월차가 생성될까?

 이제 현재 날짜에 월차가 몇 개가 생성됐는지를 보여주는 [월차 발생] 칼럼을 만들어보자. 해당 칼럼은 앞서 구한 [월차 생성 여부] 칼럼에 True일 때만 계산이 되고, False가 되면 0이 나오도록 해야 한다. 왜냐하면, 현행법상으로 월차는 입사일로부터 1년이 됐을 때, 모두 사라지기 때문이다. if()로 월차가 생성되는지 판단하고, 생성되는 경우에 월차는 dateBetween()과 now()를 사용해 계산할 수 있다.


연차 계산도, 입사일만 있으면 끝!

1. 칼럼 구성

 월차 파트는 끝났으니, 이제 연차 파트로 넘어가보자. 연차 계산을 위해서 아래와 같은 칼럼이 필요하다. 전반적인 계산 방식은 앞선 월차와 비슷하지만, 특이하게 '입사년도에 1년 중의 80%를 근무했는가?'를 고려해야 한다.


[근속 연수] : 15일의 연차가 나오는 년수를 보여준다.
[입사년도 80% 근무] 칼럼 : 입사년도에 1년 중 80%를 근무했는지를 보여준다.
[연차 생성 여부] 칼럼 : 연차가 생성되는지 보여주는 칼럼으로, 입사년도로부터 그 다음 년 1월 1일부터 체크된다.
[연차 발생] 칼럼 : 입력한 입사일과 현재 시점을 비교해 발생하는 연차를 보여준다.


2. 이 사람은 연차가 생성될까?

연차는 입사년도의 그 다음 년에 발생한다. 즉, 현재 시점이 입사년도의 그 다음 년 1월 1일을 지났을 때, 연차가 생성된다고 볼 수 있다. 이를 보여주는 [연차 생성 여부] 칼럼을 아래와 같이 만든다.



3. 입사년도에 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를 리턴한다.


4. 이 사람은 몇 개의 연차가 생성될까?

 입사년도의 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. 노션박스에서 만나보세요.

 회계연도 기준 연차 계산기가 필요하다면 노션박사를 확인해보세요!


 입사일 기준으로 연차를 계산하시는 분을 위한 템플릿도 확인할 수 있습니다.


매거진의 이전글 노션으로 만드는 궁극의 휴가 관리 시스템 1편
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari