모든 코드와 SQL을 다 게시할 순 없기 때문에, 에러와 에러 해결 과정을 위주로 포스팅을 하려고 한다.
먼저, 인사팀에서 가능한 기능으로는
팀별로 소속된 직원들의 리스트를 가져올 수 있어야 한다. 따라서 해당되는 테이블에 대해 CRUD는 기본적으로 이루어져야 한다.
다음은 직원별 휴가관리이다. 생각해야 할 것은
첫 번째, 휴가 종류.
휴가는 연차, 반차 등의 무급휴가 뿐만 아니라 경조사, 병가 등 유급휴가도 존재하고 휴가별로 휴가의 비율이 연차는 1일 반차는 0.5일 등으로 나눠지기 때문에 휴가종류라는 테이블을 따로 만들어 관리를 하였다.
두 번째, 주말 및 공휴일.
보통 휴가를 사용할 때는 금요일과 월요일을 붙여 주말을 포함해서 쓰는 경우가 많을 것이라고 생각한다.
예를 들어, 9월 23일과 24일이 토요일, 일요일이라면 22일부터 25일로 휴가를 사용했을 때 DB상에서는 금요일과 월요일에 해당되는 2일만 -가 돼야 한다.
또한 공휴일이 포함되어 있어도 마찬가지였다.
공휴일을 관리하기 위해서는 공휴일 테이블을 만들면 간단하지만 이때의 문제는 음력 공휴일이였다.
찾아보니 음력 공휴일은 추석과 구정이 있는데, 음력을 양력으로 변환해 주는 라이브러리가 있었다.
사용방법은
https://comebackworld.tistory.com/58
를 참고하면 된다.
따라서 주말과 공휴일을 참조하여 직원별 잔여휴가를 계산할 때 사용한 로직으로
<select id="selectLocal" parameterType="map" resultType="double">
SELECT employee2_holiday - (
select eh.hdkind_days * (SELECT
COUNT(DATE_ADD(#{attendance_start}, INTERVAL seq.seq DAY)) -
(SELECT COUNT(*) FROM erp_localdate WHERE erp_localdate.localdate_date BETWEEN #{attendance_start} AND #{attendance_end}) AS date_between
FROM (
SELECT (t4.i*1000 + t3.i*100 + t2.i*10 + t1.i) AS seq
FROM
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4
) seq
WHERE DATE_ADD(#{attendance_start}, INTERVAL seq.seq DAY) <= #{attendance_end}) from erp_hdkind eh where eh.hdkind_no = #{hdkind_no}
)
FROM erp_employee2 WHERE employee2_no = #{employee2_no}
</select>
여기서 employee2_holiday라는 컬럼은 잔여휴가 컬럼이며 eh.hdkind_days는 휴가종류별 휴가일수의 비율이다.
이렇게 내가 사용한 휴가시작일과 종료일 사이에 공휴일이 들어있는지 판별을 하고 들어있으면 그만큼 count를 해서 차감시키지 않는다.
그 후에 자바에서
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date start = null;
Date end = null;
try {
start = format.parse(attendance_start);
end = format.parse(attendance_end);
} catch (ParseException e) {
e.printStackTrace();
}
int SATURDAY = Calendar.SATURDAY;
int SUNDAY = Calendar.SUNDAY;
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
int weekendDays = 0;
while (!calendar.getTime().after(end)) {
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == SATURDAY || dayOfWeek == SUNDAY) {
weekendDays++;
}
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
double employee2_holiday = b5.selectLocal(map) - weekendDays;
주말까지 제외한 직원의 잔여휴가를 계산할 수 있었다. 이때 SQL에서 DATE의 자료형이나
SimpleDateFormat을 사용할 때 typemismatchException이 발생되지 않도록 파라미터값 자료형에 유의하도록 한다.
'ERP Project' 카테고리의 다른 글
재무팀 기능구현(1) (0) | 2023.09.20 |
---|---|
인사팀 기능구현(2) (0) | 2023.09.20 |
역할 분담 (0) | 2023.09.20 |
뷰페이지 구성 에러 해결(2) (0) | 2023.07.28 |
뷰페이지 구성 에러 해결(1) (0) | 2023.07.28 |