diff options
Diffstat (limited to 'lib/vendor-investigation/handlers.ts')
| -rw-r--r-- | lib/vendor-investigation/handlers.ts | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/lib/vendor-investigation/handlers.ts b/lib/vendor-investigation/handlers.ts new file mode 100644 index 00000000..6c0edbd7 --- /dev/null +++ b/lib/vendor-investigation/handlers.ts @@ -0,0 +1,187 @@ +/** + * 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; // 복수 업체 이름 (표시용) +}) { + debugLog('[PQInvestigationHandler] 실사 의뢰 핸들러 시작', { + pqCount: payload.pqSubmissionIds.length, + qmManagerId: payload.qmManagerId, + vendorNames: payload.vendorNames, + }); + + try { + // 실제 실사 의뢰 처리 + debugLog('[PQInvestigationHandler] requestInvestigationAction 호출'); + const result = await requestInvestigationAction( + payload.pqSubmissionIds, + { + 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<string, string>) + */ +export async function mapPQInvestigationToTemplateVariables(payload: { + vendorNames: string; // 여러 업체명 (쉼표로 구분) + qmManagerName: string; + qmManagerEmail?: string; + forecastedAt: Date; + investigationAddress: string; + investigationNotes?: string; + requestedAt: Date; +}): Promise<Record<string, string>> { + // 담당자 연락처 (QM담당자 이메일) + const contactInfo = payload.qmManagerEmail + ? `<p>${payload.qmManagerName}: ${payload.qmManagerEmail}</p>` + : `<p>${payload.qmManagerName}</p>`; + + // 실사 사유/목적 (있으면 포함, 없으면 빈 문자열) + 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<string, string>) + */ +export async function mapPQReRequestToTemplateVariables(payload: { + vendorNames: string; // 여러 업체명 (쉼표로 구분) + investigationCount: number; + canceledDate?: Date; + reRequestedAt: Date; + reason?: string; + // 기존 실사 정보 (재의뢰 시 필요) + forecastedAt?: Date; + investigationAddress?: string; + qmManagerName?: string; + qmManagerEmail?: string; +}): Promise<Record<string, string>> { + // 실사요청일은 재의뢰 요청일로 설정 + 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 + ? `<p>${payload.qmManagerName || 'QM담당자'}: ${payload.qmManagerEmail}</p>` + : '<p>담당자 정보 없음</p>'; + + // 실사 사유/목적 (재의뢰 사유, 있으면 포함, 없으면 빈 문자열) + const investigationPurpose = payload.reason || ''; + + return { + 협력사명: payload.vendorNames, + 실사요청일: requestDate, + 실사예정일: forecastedDate, + 실사장소: payload.investigationAddress || '', + QM담당자: payload.qmManagerName || '', + 담당자연락처: contactInfo, + 실사사유목적: investigationPurpose, + }; +} |
