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

72 lines
3.2 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.dashboard.DashboardMapper">
<select id="getKpiSummary" resultType="map">
SELECT
(SELECT COUNT(*) FROM hrm_employees WHERE status='ACTIVE') AS total_employees,
(SELECT COUNT(*) FROM hrm_employees WHERE status='ACTIVE' AND hire_date >= DATE_TRUNC('year', CURRENT_DATE)) AS new_hires_ytd,
(SELECT COUNT(*) FROM hrm_employees WHERE status='RETIRED' AND retire_date >= DATE_TRUNC('year', CURRENT_DATE)) AS attrition_ytd,
(SELECT COUNT(*) FROM hrm_job_postings WHERE status='PUBLISHED') AS open_positions,
(SELECT COUNT(*) FROM hrm_leaves WHERE status='PENDING') AS pending_leaves,
(SELECT COUNT(*) FROM hrm_performance_reviews WHERE status='SUBMITTED') AS pending_reviews,
(SELECT COALESCE(SUM(te.completed_at IS NOT NULL::int)::float/NULLIF(COUNT(*),0)*100,0)
FROM hrm_training_enrollments te) AS training_completion_rate
</select>
<select id="getHeadcountTrend" resultType="map">
SELECT
TO_CHAR(gs.month, 'YYYY-MM') AS month,
COUNT(e.id) FILTER (WHERE e.hire_date &lt;= gs.month AND (e.retire_date IS NULL OR e.retire_date > gs.month)) AS headcount
FROM generate_series(
DATE_TRUNC('month', CURRENT_DATE - (#{months}-1||' months')::interval),
DATE_TRUNC('month', CURRENT_DATE),
'1 month'::interval
) AS gs(month)
CROSS JOIN hrm_employees e
GROUP BY gs.month ORDER BY gs.month
</select>
<select id="getDeptHeadcount" resultType="map">
SELECT d.dept_name, COUNT(e.id) AS headcount
FROM hrm_departments d
LEFT JOIN hrm_employees e ON e.department_id=d.id AND e.status='ACTIVE'
WHERE d.active=true
GROUP BY d.id, d.dept_name ORDER BY headcount DESC
</select>
<select id="getAttendanceToday" resultType="map">
SELECT
COUNT(*) FILTER (WHERE status='PRESENT') AS present_count,
COUNT(*) FILTER (WHERE status='ABSENT') AS absent_count,
COUNT(*) FILTER (WHERE status='LEAVE') AS leave_count,
(SELECT COUNT(*) FROM hrm_employees WHERE status='ACTIVE') AS total_active,
ROUND(COUNT(*) FILTER (WHERE status='PRESENT')::numeric /
NULLIF((SELECT COUNT(*) FROM hrm_employees WHERE status='ACTIVE'),0)*100,1) AS attendance_rate
FROM hrm_attendance WHERE work_date=CURRENT_DATE
</select>
<select id="getPayrollSummary" resultType="map">
SELECT
COALESCE(SUM(net_salary),0) AS total_net,
COALESCE(SUM(base_salary),0) AS total_base,
COUNT(*) AS payslip_count
FROM hrm_payslips WHERE year=#{year} AND month=#{month}
</select>
<select id="getRecruitmentPipeline" resultType="map">
SELECT status, COUNT(*) AS cnt
FROM hrm_applicants GROUP BY status ORDER BY cnt DESC
</select>
<select id="getPendingApprovals" resultType="map">
SELECT 'leave' AS type, id, reason AS title, created_at FROM hrm_leaves WHERE status='PENDING'
UNION ALL
SELECT 'review' AS type, id, CONCAT(year::text,' 성과평가') AS title, created_at
FROM hrm_performance_reviews WHERE status='SUBMITTED'
ORDER BY created_at DESC LIMIT 10
</select>
</mapper>