import { execute, queryOne, insertReturning } from '../../../utils/db' import { formatDate } from '../../../utils/week-calc' import { getClientIp } from '../../../utils/ip' import { getCurrentUserEmail } from '../../../utils/user' interface AssignManagerBody { employeeId: number roleType: 'PM' | 'PL' startDate?: string changeReason?: string } /** * PM/PL 지정 (기존 담당자 종료 + 신규 등록) * POST /api/project/[id]/manager-assign */ export default defineEventHandler(async (event) => { const projectId = getRouterParam(event, 'id') const body = await readBody(event) const clientIp = getClientIp(event) const userEmail = await getCurrentUserEmail(event) if (!body.employeeId || !body.roleType) { throw createError({ statusCode: 400, message: '담당자와 역할을 선택해주세요.' }) } if (!['PM', 'PL'].includes(body.roleType)) { throw createError({ statusCode: 400, message: '역할은 PM 또는 PL만 가능합니다.' }) } const today = formatDate(new Date()) const startDate = body.startDate || today // 기존 담당자 종료 (end_date가 NULL인 경우) await execute(` UPDATE wr_project_manager_history SET end_date = $1, change_reason = COALESCE(change_reason || ' / ', '') || '신규 담당자 지정으로 종료', updated_at = NOW(), updated_ip = $2, updated_email = $3 WHERE project_id = $4 AND role_type = $5 AND end_date IS NULL `, [startDate, clientIp, userEmail, projectId, body.roleType]) // 신규 담당자 등록 const history = await insertReturning(` INSERT INTO wr_project_manager_history ( project_id, employee_id, role_type, start_date, change_reason, created_ip, created_email, updated_ip, updated_email ) VALUES ($1, $2, $3, $4, $5, $6, $7, $6, $7) RETURNING * `, [projectId, body.employeeId, body.roleType, startDate, body.changeReason || null, clientIp, userEmail]) return { success: true, historyId: history.history_id } })