const { getPool } = require('../middleware/auth'); const vacationDashboardModel = { async getSummary(year) { const db = getPool(); const [rows] = await db.query(` SELECT d.department_id, COALESCE(d.department_name, '미배정') as department_name, COUNT(DISTINCT su.user_id) as employee_count, AVG(vb.total_days - vb.used_days) as avg_remaining, SUM(CASE WHEN (vb.total_days - vb.used_days) <= 2 THEN 1 ELSE 0 END) as low_balance_count FROM sso_users su LEFT JOIN departments d ON su.department_id = d.department_id LEFT JOIN sp_vacation_balances vb ON su.user_id = vb.user_id AND vb.year = ? AND vb.balance_type = 'AUTO' WHERE su.is_active = 1 GROUP BY d.department_id `, [year]); return rows; }, async getEmployeeList(year, filters = {}) { const db = getPool(); let query = ` SELECT su.user_id, su.name, su.username, su.hire_date, su.department_id, COALESCE(d.department_name, '미배정') as department_name, vb.id, vb.balance_type, vb.total_days, vb.used_days, (vb.total_days - vb.used_days) as remaining_days, vb.expires_at, vt.type_name, vt.type_code FROM sso_users su LEFT JOIN departments d ON su.department_id = d.department_id LEFT JOIN sp_vacation_balances vb ON su.user_id = vb.user_id AND (vb.year = ? OR (vb.balance_type = 'LONG_SERVICE' AND vb.expires_at IS NULL)) LEFT JOIN vacation_types vt ON vb.vacation_type_id = vt.id WHERE su.is_active = 1 `; const params = [year]; if (filters.department_id) { query += ' AND su.department_id = ?'; params.push(filters.department_id); } if (filters.search_name) { query += ' AND su.name LIKE ?'; params.push(`%${filters.search_name}%`); } query += ' ORDER BY su.name ASC'; const [rows] = await db.query(query, params); return rows; } }; module.exports = vacationDashboardModel;