import { defineEventHandler, getQuery } from 'h3' import { query } from '../../../utils/db' /** * 주차별 취합 목록 * GET /api/report/summary/weekly-list */ export default defineEventHandler(async (event) => { const queryParams = getQuery(event) const year = queryParams.year ? parseInt(queryParams.year as string) : new Date().getFullYear() // 주차별로 그룹핑 const rows = await query(` SELECT s.report_year, s.report_week, COUNT(DISTINCT s.project_id) as project_count, SUM(s.member_count) as total_members, SUM(COALESCE(s.total_work_hours, 0)) as total_work_hours, MAX(s.aggregated_at) as latest_aggregated_at, ARRAY_AGG(DISTINCT p.project_name ORDER BY p.project_name) as project_names FROM wr_aggregated_report_summary s JOIN wr_project_info p ON s.project_id = p.project_id WHERE s.report_year = $1 GROUP BY s.report_year, s.report_week ORDER BY s.report_week DESC `, [year]) return { weeks: rows.map((r: any) => { const { monday, sunday } = getWeekDates(r.report_year, r.report_week) return { reportYear: r.report_year, reportWeek: r.report_week, weekStartDate: monday, weekEndDate: sunday, projectCount: parseInt(r.project_count), totalMembers: parseInt(r.total_members), totalWorkHours: parseFloat(r.total_work_hours) || 0, latestAggregatedAt: r.latest_aggregated_at, projects: r.project_names || [] } }) } }) // ISO 8601 주차 기준 월요일~일요일 계산 function getWeekDates(year: number, week: number): { monday: string, sunday: string } { // 해당 연도의 1월 4일이 속한 주가 1주차 (ISO 8601) const jan4 = new Date(year, 0, 4) const jan4DayOfWeek = jan4.getDay() || 7 // 일요일=7 // 1주차의 월요일 const week1Monday = new Date(jan4) week1Monday.setDate(jan4.getDate() - jan4DayOfWeek + 1) // 요청된 주차의 월요일 const monday = new Date(week1Monday) monday.setDate(week1Monday.getDate() + (week - 1) * 7) // 일요일 const sunday = new Date(monday) sunday.setDate(monday.getDate() + 6) return { monday: formatDate(monday), sunday: formatDate(sunday) } } function formatDate(date: Date): string { const y = date.getFullYear() const m = String(date.getMonth() + 1).padStart(2, '0') const d = String(date.getDate()).padStart(2, '0') return `${y}-${m}-${d}` }