/** * PQ 실사 관련 결재 액션 핸들러 * * 실제 비즈니스 로직만 포함 (결재 로직은 approval-workflow에서 처리) */ 'use server'; import { requestInvestigationAction } from '@/lib/pq/service'; import { debugLog, debugError, debugSuccess } from '@/lib/debug-utils'; /** * PQ 실사 의뢰 핸들러 (결재 승인 후 실행됨) * * 이 함수는 직접 호출하지 않고, 결재 워크플로우에서 자동으로 호출됨 * * @param payload - withApproval()에서 전달한 actionPayload */ export async function requestPQInvestigationInternal(payload: { pqSubmissionIds: number[]; qmManagerId: number; qmManagerName?: string; forecastedAt: Date; investigationAddress: string; investigationNotes?: string; vendorNames?: string; // 복수 업체 이름 (표시용) currentUser: { id: number; epId: string | null; email?: string }; }) { debugLog('[PQInvestigationHandler] 실사 의뢰 핸들러 시작', { pqCount: payload.pqSubmissionIds.length, qmManagerId: payload.qmManagerId, currentUser: payload.currentUser, vendorNames: payload.vendorNames, }); try { // 실제 실사 의뢰 처리 debugLog('[PQInvestigationHandler] requestInvestigationAction 호출'); const result = await requestInvestigationAction( payload.pqSubmissionIds, payload.currentUser, { qmManagerId: payload.qmManagerId, forecastedAt: payload.forecastedAt, investigationAddress: payload.investigationAddress, investigationNotes: payload.investigationNotes, } ); if (!result.success) { debugError('[PQInvestigationHandler] 실사 의뢰 실패', result.error); throw new Error(result.error || '실사 의뢰에 실패했습니다.'); } debugSuccess('[PQInvestigationHandler] 실사 의뢰 완료', { count: result.count, }); return { success: true, count: result.count, message: `${result.count}개 업체에 대해 실사가 의뢰되었습니다.`, }; } catch (error) { debugError('[PQInvestigationHandler] 실사 의뢰 중 에러', error); throw error; } } /** * PQ 실사 의뢰 데이터를 결재 템플릿 변수로 매핑 * * @param payload - 실사 의뢰 데이터 * @returns 템플릿 변수 객체 (Record) */ export async function mapPQInvestigationToTemplateVariables(payload: { vendorNames: string; // 여러 업체명 (쉼표로 구분) qmManagerName: string; qmManagerEmail?: string; forecastedAt: Date; investigationAddress: string; investigationNotes?: string; requestedAt: Date; }): Promise> { // 담당자 연락처 (QM담당자 이메일) const contactInfo = payload.qmManagerEmail ? `

${payload.qmManagerName}: ${payload.qmManagerEmail}

` : `

${payload.qmManagerName}

`; // 실사 사유/목적 (있으면 포함, 없으면 빈 문자열) const investigationPurpose = payload.investigationNotes || ''; return { 협력사명: payload.vendorNames, 실사요청일: new Date(payload.requestedAt).toLocaleDateString('ko-KR'), 실사예정일: new Date(payload.forecastedAt).toLocaleDateString('ko-KR'), 실사장소: payload.investigationAddress, QM담당자: payload.qmManagerName, 담당자연락처: contactInfo, 실사사유목적: investigationPurpose, }; } /** * PQ 실사 재의뢰 핸들러 (결재 승인 후 실행됨) * * 이 함수는 직접 호출하지 않고, 결재 워크플로우에서 자동으로 호출됨 * * @param payload - withApproval()에서 전달한 actionPayload */ export async function reRequestPQInvestigationInternal(payload: { investigationIds: number[]; vendorNames?: string; // 복수 업체 이름 (표시용) }) { debugLog('[PQReRequestHandler] 실사 재의뢰 핸들러 시작', { investigationCount: payload.investigationIds.length, vendorNames: payload.vendorNames, }); try { // 실제 실사 재의뢰 처리 const { reRequestInvestigationAction } = await import('@/lib/pq/service'); debugLog('[PQReRequestHandler] reRequestInvestigationAction 호출'); const result = await reRequestInvestigationAction(payload.investigationIds); if (!result.success) { debugError('[PQReRequestHandler] 실사 재의뢰 실패', result.error); throw new Error(result.error || '실사 재의뢰에 실패했습니다.'); } debugSuccess('[PQReRequestHandler] 실사 재의뢰 완료', { count: result.count, }); return { success: true, count: result.count, message: `${result.count}개 업체에 대해 실사가 재의뢰되었습니다.`, }; } catch (error) { debugError('[PQReRequestHandler] 실사 재의뢰 중 에러', error); throw error; } } /** * PQ 실사 재의뢰 데이터를 결재 템플릿 변수로 매핑 * * @param payload - 실사 재의뢰 데이터 * @returns 템플릿 변수 객체 (Record) */ export async function mapPQReRequestToTemplateVariables(payload: { vendorNames: string; // 여러 업체명 (쉼표로 구분) investigationCount: number; canceledDate?: Date; reRequestedAt: Date; reason?: string; // 기존 실사 정보 (재의뢰 시 필요) forecastedAt?: Date; investigationAddress?: string; qmManagerName?: string; qmManagerEmail?: string; }): Promise> { // 실사요청일은 재의뢰 요청일로 설정 const requestDate = new Date(payload.reRequestedAt).toLocaleDateString('ko-KR'); // 실사예정일 (기존 실사 정보 사용, 없으면 빈 문자열) const forecastedDate = payload.forecastedAt ? new Date(payload.forecastedAt).toLocaleDateString('ko-KR') : ''; // 담당자 연락처 (QM담당자 이메일, 없으면 빈 문자열) const contactInfo = payload.qmManagerEmail ? `

${payload.qmManagerName || 'QM담당자'}: ${payload.qmManagerEmail}

` : '

담당자 정보 없음

'; // 실사 사유/목적 (재의뢰 사유, 있으면 포함, 없으면 빈 문자열) const investigationPurpose = payload.reason || ''; return { 협력사명: payload.vendorNames, 실사요청일: requestDate, 실사예정일: forecastedDate, 실사장소: payload.investigationAddress || '', QM담당자: payload.qmManagerName || '', 담당자연락처: contactInfo, 실사사유목적: investigationPurpose, }; }