summaryrefslogtreecommitdiff
path: root/lib/vendor-regular-registrations/handlers.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vendor-regular-registrations/handlers.ts')
-rw-r--r--lib/vendor-regular-registrations/handlers.ts180
1 files changed, 180 insertions, 0 deletions
diff --git a/lib/vendor-regular-registrations/handlers.ts b/lib/vendor-regular-registrations/handlers.ts
new file mode 100644
index 00000000..4b21263d
--- /dev/null
+++ b/lib/vendor-regular-registrations/handlers.ts
@@ -0,0 +1,180 @@
+/**
+ * 정규업체 등록 관련 결재 액션 핸들러
+ *
+ * 실제 비즈니스 로직만 포함 (결재 로직은 approval-workflow에서 처리)
+ */
+
+'use server';
+
+import { submitRegistrationRequest } from './service';
+import { debugLog, debugError, debugSuccess } from '@/lib/debug-utils';
+import type { RegistrationRequestData } from '@/components/vendor-regular-registrations/registration-request-dialog';
+import db from '@/db/db';
+import { eq } from 'drizzle-orm';
+import { vendors } from '@/db/schema/vendors';
+import { vendorAdditionalInfo } from '@/db/schema/vendorRegistrations';
+
+/**
+ * 정규업체 등록 핸들러 (결재 승인 후 실행됨)
+ *
+ * 이 함수는 직접 호출하지 않고, 결재 워크플로우에서 자동으로 호출됨
+ *
+ * @param payload - withApproval()에서 전달한 actionPayload
+ */
+export async function registerVendorInternal(payload: {
+ registrationId: number;
+ requestData: RegistrationRequestData;
+}) {
+ debugLog('[VendorRegistrationHandler] 정규업체 등록 핸들러 시작', {
+ registrationId: payload.registrationId,
+ companyName: payload.requestData.companyNameKor,
+ });
+
+ try {
+ // 실제 정규업체 등록 처리
+ debugLog('[VendorRegistrationHandler] submitRegistrationRequest 호출');
+ const result = await submitRegistrationRequest(
+ payload.registrationId,
+ payload.requestData
+ );
+
+ if (!result.success) {
+ debugError('[VendorRegistrationHandler] 정규업체 등록 실패', result.error);
+ throw new Error(result.error || '정규업체 등록에 실패했습니다.');
+ }
+
+ debugSuccess('[VendorRegistrationHandler] 정규업체 등록 완료', {
+ registrationId: payload.registrationId,
+ });
+
+ return {
+ success: true,
+ message: '정규업체 등록이 완료되었습니다.',
+ };
+ } catch (error) {
+ debugError('[VendorRegistrationHandler] 정규업체 등록 중 에러', error);
+ throw error;
+ }
+}
+
+/**
+ * 정규업체 등록 데이터를 결재 템플릿 변수로 매핑
+ *
+ * 제공된 HTML 템플릿의 변수명에 맞춰 매핑
+ *
+ * @param payload - 정규업체 등록 데이터
+ * @returns 템플릿 변수 객체 (Record<string, string>)
+ */
+export async function mapRegistrationToTemplateVariables(payload: {
+ requestData: RegistrationRequestData;
+ requestedAt: Date;
+ vendorId?: number; // vendors 테이블에서 정보를 가져오기 위한 vendorId
+}): Promise<Record<string, string>> {
+ const { requestData, requestedAt, vendorId } = payload;
+
+ // vendors 테이블에서 추가 정보 가져오기
+ let vendorInfo: any = {};
+ if (vendorId) {
+ try {
+ const vendorResult = await db
+ .select({
+ postalCode: vendors.postalCode,
+ businessSize: vendors.businessSize,
+ addressDetail: vendors.addressDetail,
+ // FAX, 사업유형, 산업유형은 vendors 테이블에 없으므로 빈 값으로 처리
+ })
+ .from(vendors)
+ .where(eq(vendors.id, vendorId))
+ .limit(1);
+
+ vendorInfo = vendorResult[0] || {};
+ } catch (error) {
+ console.warn('[Template Variables] Failed to fetch vendor info:', error);
+ }
+ }
+ // 추가정보 조회
+ let additionalInfo = {
+ businessType: '',
+ industryType: '',
+ companySize: '',
+ revenue: '',
+ factoryEstablishedDate: '',
+ preferredContractTerms: '',
+ };
+
+ if (vendorId) {
+ const additionalInfoResult = await db
+ .select({
+ businessType: vendorAdditionalInfo.businessType,
+ industryType: vendorAdditionalInfo.industryType,
+ companySize: vendorAdditionalInfo.companySize,
+ revenue: vendorAdditionalInfo.revenue,
+ factoryEstablishedDate: vendorAdditionalInfo.factoryEstablishedDate,
+ preferredContractTerms: vendorAdditionalInfo.preferredContractTerms,
+ })
+ .from(vendorAdditionalInfo)
+ .where(eq(vendorAdditionalInfo.vendorId, vendorId))
+ .limit(1);
+
+ additionalInfo = additionalInfoResult[0] || additionalInfo;
+ }
+
+ console.log('[Template Variables] Additional info:', additionalInfo);
+ const variables = {
+ // 협력업체 기본정보 (템플릿의 정확한 변수명 사용)
+ ' 협력업체 기본정보-사업자번호 ': requestData.businessNumber || '',
+ ' 협력업체 기본정보-업체명 ': requestData.companyNameKor || '',
+ ' 협력업체 기본정보-대표자명 ': requestData.representativeNameKor || '',
+ ' 협력업체 기본정보 대표전화 ': requestData.headOfficePhone || '',
+ ' 협력업체 기본정보 -FAX ': '', // FAX 정보는 vendors 테이블에 없으므로 빈 문자열
+ ' 협력업체 기본정보 -E-mail ': requestData.representativeEmail || '',
+ ' 협력업체 기본정보-우편번호 ': vendorInfo.postalCode || '', // vendors 테이블에서 우편번호 가져오기
+ ' 협력업체 기본정보-회사주소': requestData.headOfficeAddress || '',
+ ' 협력업체 기본정보-상세주소': vendorInfo.addressDetail || '', // 상세주소는 벤더 상세주소로
+ ' 협력업체 기본정보-사업유형': additionalInfo.businessType || '', // 주요품목을 사업유형으로 사용
+ ' 협력업체 기본정보-산업유형': additionalInfo.industryType || '', // 주요품목을 산업유형으로도 사용
+ ' 협력업체 기본정보-회사규모': additionalInfo.companySize || '', // 기업규모
+
+ // 담당자 연락처 (각 담당자별로 동일한 정보 반복 - 템플릿에서 여러 번 사용됨)
+ ' 협력업체 관리-상세보기-영업담당자-담당자명 ': requestData.businessContacts.sales.name || '',
+ ' 협력업체 관리-상세보기-영업담당자-직급 ': requestData.businessContacts.sales.position || '',
+ ' 협력업체 관리-상세보기-영업담당자-부서 ': requestData.businessContacts.sales.department || '',
+ ' 협력업체 관리-상세보기-영업담당자-담당업무 ': requestData.businessContacts.sales.responsibility || '',
+ ' 협력업체 관리-상세보기-영업담당자-이메일 ': requestData.businessContacts.sales.email || '',
+ ' 협력업체 관리-상세보기-설계담당자-담당자명 ': requestData.businessContacts.design.name || '',
+ ' 협력업체 관리-상세보기-설계담당자-직급 ': requestData.businessContacts.design.position || '',
+ ' 협력업체 관리-상세보기-설계담당자-부서 ': requestData.businessContacts.design.department || '',
+ ' 협력업체 관리-상세보기-설계담당자-담당업무 ': requestData.businessContacts.design.responsibility || '',
+ ' 협력업체 관리-상세보기-설계담당자-이메일 ': requestData.businessContacts.design.email || '',
+ ' 협력업체 관리-상세보기-납기담당자-담당자명 ': requestData.businessContacts.delivery.name || '',
+ ' 협력업체 관리-상세보기-납기담당자-직급 ': requestData.businessContacts.delivery.position || '',
+ ' 협력업체 관리-상세보기-납기담당자-부서 ': requestData.businessContacts.delivery.department || '',
+ ' 협력업체 관리-상세보기-납기담당자-담당업무 ': requestData.businessContacts.delivery.responsibility || '',
+ ' 협력업체 관리-상세보기-납기담당자-이메일 ': requestData.businessContacts.delivery.email || '',
+ ' 협력업체 관리-상세보기-품질담당자-담당자명 ': requestData.businessContacts.quality.name || '',
+ ' 협력업체 관리-상세보기-품질담당자-직급 ': requestData.businessContacts.quality.position || '',
+ ' 협력업체 관리-상세보기-품질담당자-부서 ': requestData.businessContacts.quality.department || '',
+ ' 협력업체 관리-상세보기-품질담당자-담당업무 ': requestData.businessContacts.quality.responsibility || '',
+ ' 협력업체 관리-상세보기-품질담당자-이메일 ': requestData.businessContacts.quality.email || '',
+ ' 협력업체 관리-상세보기-세금계산서담당자-담당자명 ': requestData.businessContacts.taxInvoice.name || '',
+ ' 협력업체 관리-상세보기-세금계산서담당자-직급 ': requestData.businessContacts.taxInvoice.position || '',
+ ' 협력업체 관리-상세보기-세금계산서담당자-부서 ': requestData.businessContacts.taxInvoice.department || '',
+ ' 협력업체 관리-상세보기-세금계산서담당자-담당업무 ': requestData.businessContacts.taxInvoice.responsibility || '',
+ ' 협력업체 관리-상세보기-세금계산서담당자-이메일 ': requestData.businessContacts.taxInvoice.email || '',
+
+ // 기본계약서 현황 (정규업체 등록 시점에는 아직 계약서가 없으므로 빈 값)
+ '정규업체등록관리-문서현황-계약동의현황-계약유형 ': '정규업체 등록 요청',
+ '정규업체등록관리-문서현황-계약동의현황-상태 ': '등록 대기',
+ '정규업체등록관리-문서현황-계약동의현황-서약일자 ': new Date(requestedAt).toLocaleDateString('ko-KR'),
+ };
+
+ // 디버깅을 위한 로그 출력
+ console.log('[Template Variables] Generated variables:', Object.keys(variables));
+ console.log('[Template Variables] Sample values:', {
+ companyName: variables[' 협력업체 기본정보-업체명 '],
+ businessNumber: variables[' 협력업체 기본정보-사업자번호 '],
+ representative: variables[' 협력업체 기본정보-대표자명 '],
+ });
+
+ return variables;
+}