100 lines
3.8 KiB
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>
|