72 lines
3.2 KiB
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 <= 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>
|