89 lines
3.7 KiB
XML
89 lines
3.7 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.training.TrainingMapper">
|
|
|
|
<select id="findCourses" resultType="map">
|
|
SELECT c.id, c.course_code, c.course_name, c.course_type,
|
|
c.instructor, c.start_date, c.end_date, c.duration_hours,
|
|
c.is_legal, c.max_attendees, c.status,
|
|
(SELECT COUNT(*) FROM hrm_training_enrollments e WHERE e.course_id=c.id) AS enrolled_count
|
|
FROM hrm_training_courses c
|
|
<where>
|
|
<if test="keyword != null and keyword != ''">AND c.course_name ILIKE '%'||#{keyword}||'%'</if>
|
|
<if test="type != null and type != ''">AND c.course_type=#{type}</if>
|
|
</where>
|
|
ORDER BY c.start_date DESC
|
|
LIMIT #{limit} OFFSET #{offset}
|
|
</select>
|
|
|
|
<select id="countCourses" resultType="long">
|
|
SELECT COUNT(*) FROM hrm_training_courses c
|
|
<where>
|
|
<if test="keyword != null and keyword != ''">AND c.course_name ILIKE '%'||#{keyword}||'%'</if>
|
|
<if test="type != null and type != ''">AND c.course_type=#{type}</if>
|
|
</where>
|
|
</select>
|
|
|
|
<select id="findCourseById" resultType="map">
|
|
SELECT * FROM hrm_training_courses WHERE id=#{id}
|
|
</select>
|
|
|
|
<insert id="insertCourse">
|
|
INSERT INTO hrm_training_courses (course_code, course_name, course_type, instructor, description,
|
|
start_date, end_date, duration_hours, is_legal, max_attendees, status, created_by)
|
|
VALUES (#{courseCode}, #{courseName}, #{courseType}, #{instructor}, #{description},
|
|
#{startDate}, #{endDate}, #{durationHours}, #{isLegal}, #{maxAttendees}, 'SCHEDULED', #{createdBy})
|
|
</insert>
|
|
|
|
<update id="updateCourse">
|
|
UPDATE hrm_training_courses SET
|
|
course_name=#{courseName}, instructor=#{instructor},
|
|
start_date=#{startDate}, end_date=#{endDate},
|
|
duration_hours=#{durationHours}, max_attendees=#{maxAttendees}, updated_at=NOW()
|
|
WHERE id=#{id}
|
|
</update>
|
|
|
|
<select id="findEnrollments" resultType="map">
|
|
SELECT te.id, te.emp_id, e.name AS emp_name, e.emp_no,
|
|
te.course_id, c.course_name, te.status, te.enrolled_at, te.completed_at
|
|
FROM hrm_training_enrollments te
|
|
JOIN hrm_employees e ON te.emp_id=e.id
|
|
JOIN hrm_training_courses c ON te.course_id=c.id
|
|
<where>
|
|
<if test="empId != null">AND te.emp_id=#{empId}</if>
|
|
<if test="courseId != null">AND te.course_id=#{courseId}</if>
|
|
<if test="year > 0">AND EXTRACT(YEAR FROM te.enrolled_at)=#{year}</if>
|
|
</where>
|
|
ORDER BY te.enrolled_at DESC
|
|
</select>
|
|
|
|
<insert id="insertEnrollment">
|
|
INSERT INTO hrm_training_enrollments (emp_id, course_id, status, enrolled_at, created_by)
|
|
VALUES (#{empId}, #{courseId}, #{status}, NOW(), #{createdBy})
|
|
ON CONFLICT (emp_id, course_id) DO NOTHING
|
|
</insert>
|
|
|
|
<update id="updateEnrollmentStatus">
|
|
UPDATE hrm_training_enrollments SET status=#{status}, completed_at=#{completedAt}
|
|
WHERE id=#{id}
|
|
</update>
|
|
|
|
<select id="getLegalTrainingStatus" resultType="map">
|
|
SELECT
|
|
COUNT(DISTINCT c.id) AS total_legal,
|
|
COUNT(DISTINCT CASE WHEN te.status='COMPLETED' THEN te.course_id END) AS completed_legal,
|
|
ROUND(COUNT(DISTINCT CASE WHEN te.status='COMPLETED' THEN te.course_id END)::numeric /
|
|
NULLIF(COUNT(DISTINCT c.id),0) * 100, 1) AS completion_rate
|
|
FROM hrm_training_courses c
|
|
LEFT JOIN hrm_training_enrollments te ON te.course_id=c.id AND te.emp_id=#{empId}
|
|
WHERE c.is_legal=true AND EXTRACT(YEAR FROM c.start_date)=#{year}
|
|
</select>
|
|
|
|
<select id="findLegalCourses" resultType="map">
|
|
SELECT id, course_name, course_type, duration_hours, start_date, end_date
|
|
FROM hrm_training_courses WHERE is_legal=true ORDER BY start_date
|
|
</select>
|
|
|
|
</mapper>
|