guardia-hrm/backend/target/classes/mapper/TrainingMapper.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>