summaryrefslogtreecommitdiff
path: root/lib/vendor-investigation/handlers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-investigation/handlers.ts')
-rw-r--r--lib/vendor-investigation/handlers.ts187
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,
+ };
+}