guardia-hrm/backend/target/classes/mapper/AttendanceMapper.xml

100 lines
3.8 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zioinfo.hrm.attendance.AttendanceMapper">
<select id="findByEmpAndMonth" resultType="map">
SELECT a.id, a.emp_id, a.work_date, a.check_in_time, a.check_out_time,
a.work_minutes, a.overtime_minutes, a.status
FROM hrm_attendance a
WHERE a.emp_id=#{empId}
AND EXTRACT(YEAR FROM a.work_date)=#{year}
AND EXTRACT(MONTH FROM a.work_date)=#{month}
ORDER BY a.work_date
</select>
<select id="findAll" resultType="map">
SELECT a.*, e.name AS emp_name, e.emp_no, d.dept_name
FROM hrm_attendance a
JOIN hrm_employees e ON a.emp_id=e.id
LEFT JOIN hrm_departments d ON e.department_id=d.id
<where>
<if test="date != null">AND a.work_date=#{date}</if>
<if test="deptId != null">AND e.department_id=#{deptId}</if>
</where>
ORDER BY e.emp_no
LIMIT #{limit} OFFSET #{offset}
</select>
<insert id="checkIn">
INSERT INTO hrm_attendance (emp_id, work_date, check_in_time, status)
VALUES (#{empId}, #{workDate}, #{checkInTime}, 'PRESENT')
ON CONFLICT (emp_id, work_date) DO UPDATE SET check_in_time=#{checkInTime}
</insert>
<update id="checkOut">
UPDATE hrm_attendance SET
check_out_time=#{checkOutTime},
work_minutes=EXTRACT(EPOCH FROM (#{checkOutTime}::timestamp - check_in_time))/60
WHERE emp_id=#{empId} AND work_date=#{workDate}
</update>
<select id="findLeaves" resultType="map">
SELECT l.id, l.emp_id, l.leave_type_id, lt.type_name,
l.start_date, l.end_date, l.days, l.reason, l.status,
l.approved_by, l.created_at
FROM hrm_leaves l
JOIN hrm_leave_types lt ON l.leave_type_id=lt.id
WHERE l.emp_id=#{empId}
<if test="status != null and status != ''">AND l.status=#{status}</if>
<if test="year > 0">AND EXTRACT(YEAR FROM l.start_date)=#{year}</if>
ORDER BY l.start_date DESC
</select>
<insert id="insertLeave">
INSERT INTO hrm_leaves (emp_id, leave_type_id, start_date, end_date, days, reason, status, created_by)
VALUES (#{empId}, #{leaveTypeId}, #{startDate}, #{endDate}, #{days}, #{reason}, #{status}, #{createdBy})
</insert>
<update id="updateLeaveStatus">
UPDATE hrm_leaves SET status=#{status}, approved_by=#{approvedBy}, updated_at=NOW()
WHERE id=#{id}
</update>
<select id="getLeaveBalance" resultType="map">
SELECT
COALESCE(SUM(CASE WHEN lt.type_name='연차' THEN al.total_days ELSE 0 END), 0) AS total_annual,
COALESCE(SUM(CASE WHEN l.status IN ('APPROVED','USED') AND lt.type_name='연차' THEN l.days ELSE 0 END), 0) AS used_annual
FROM hrm_employees e
LEFT JOIN hrm_annual_leaves al ON al.emp_id=e.id AND al.year=#{year}
LEFT JOIN hrm_leaves l ON l.emp_id=e.id AND EXTRACT(YEAR FROM l.start_date)=#{year}
LEFT JOIN hrm_leave_types lt ON l.leave_type_id=lt.id
WHERE e.id=#{empId}
</select>
<select id="findLeaveTypes" resultType="map">
SELECT id, type_code, type_name, is_paid, max_days
FROM hrm_leave_types WHERE active=true ORDER BY sort_order
</select>
<insert id="insertLeaveType">
INSERT INTO hrm_leave_types (type_code, type_name, is_paid, max_days)
VALUES (#{typeCode}, #{typeName}, #{isPaid}, #{maxDays})
</insert>
<select id="findOvertime" resultType="map">
SELECT id, emp_id, ot_date, start_time, end_time, ot_minutes, reason, status
FROM hrm_overtime
WHERE emp_id=#{empId}
AND EXTRACT(YEAR FROM ot_date)=#{year}
AND EXTRACT(MONTH FROM ot_date)=#{month}
ORDER BY ot_date DESC
</select>
<insert id="insertOvertime">
INSERT INTO hrm_overtime (emp_id, ot_date, start_time, end_time, ot_minutes, reason, created_by)
VALUES (#{empId}, #{otDate}, #{startTime}, #{endTime}, #{otMinutes}, #{reason}, #{createdBy})
</insert>
</mapper>