diff options
Diffstat (limited to 'lib/vendors/approval-handlers.ts')
| -rw-r--r-- | lib/vendors/approval-handlers.ts | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/lib/vendors/approval-handlers.ts b/lib/vendors/approval-handlers.ts new file mode 100644 index 00000000..bc4d24a6 --- /dev/null +++ b/lib/vendors/approval-handlers.ts @@ -0,0 +1,119 @@ +'use server' + +import db from "@/db/db" +import { vendors } from "@/db/schema/vendors" +import { inArray } from "drizzle-orm" +import { sendSingleVendorToMDG } from "@/lib/soap/mdg/send/vendor-master/send-single-vendor" +import { approveVendors } from "./service" + +/** + * 벤더 가입 승인 핸들러 (결재 승인 후 자동 실행) + * + * 이 함수는 결재 승인 후 approval-polling-service에 의해 자동으로 호출됩니다. + * 직접 호출하지 마세요. 결재 상신은 approveVendorsWithApproval()을 사용하세요. + * + * @param payload - { vendorIds: number[], userId: number } + * @returns 승인 결과 + */ +export async function approveVendorWithMDGInternal(payload: { + vendorIds: number[] + userId: number +}) { + console.log(`[Vendor Approval Handler] 벤더 승인 시작:`, payload.vendorIds) + + try { + // 1. 벤더 정보 조회 + const vendorRecords = await db + .select({ + id: vendors.id, + vendorName: vendors.vendorName, + status: vendors.status, + }) + .from(vendors) + .where(inArray(vendors.id, payload.vendorIds)) + + if (vendorRecords.length === 0) { + throw new Error(`벤더를 찾을 수 없습니다: ${payload.vendorIds.join(', ')}`) + } + + console.log(`[Vendor Approval Handler] ${vendorRecords.length}개 벤더 조회 완료`) + + // 2. 각 벤더를 개별적으로 MDG에 전송 + const mdgResults: Array<{ + vendorId: number + vendorName: string + success: boolean + error?: string + }> = [] + + for (const vendor of vendorRecords) { + console.log(`[Vendor Approval Handler] MDG 전송 시작: ${vendor.vendorName} (ID: ${vendor.id})`) + + try { + const result = await sendSingleVendorToMDG({ + vendorId: vendor.id, + mode: 'NEW_VENDOR', // 신규 벤더 가입 승인 + }) + + if (result.success) { + console.log(`[Vendor Approval Handler] ✅ MDG 전송 성공: ${vendor.vendorName}`) + mdgResults.push({ + vendorId: vendor.id, + vendorName: vendor.vendorName, + success: true, + }) + } else { + console.error(`[Vendor Approval Handler] ❌ MDG 전송 실패: ${vendor.vendorName} - ${result.message}`) + mdgResults.push({ + vendorId: vendor.id, + vendorName: vendor.vendorName, + success: false, + error: result.message, + }) + // MDG 전송 실패 시 전체 프로세스 중단 + throw new Error(`MDG 전송 실패 (${vendor.vendorName}): ${result.message}`) + } + } catch (error) { + const errorMsg = error instanceof Error ? error.message : 'Unknown error' + console.error(`[Vendor Approval Handler] ❌ MDG 전송 예외: ${vendor.vendorName} - ${errorMsg}`) + mdgResults.push({ + vendorId: vendor.id, + vendorName: vendor.vendorName, + success: false, + error: errorMsg, + }) + throw error + } + } + + console.log(`[Vendor Approval Handler] 모든 벤더 MDG 전송 완료`) + + // 3. 기존 approveVendors 함수 실행 + // (상태 변경, 유저 활성화, 역할 할당, 이메일 발송, 로그 기록 등) + console.log(`[Vendor Approval Handler] 기존 approveVendors 함수 실행`) + + const approveResult = await approveVendors({ + ids: payload.vendorIds, + userId: payload.userId, + }) + + if (approveResult.error) { + console.error(`[Vendor Approval Handler] approveVendors 실패:`, approveResult.error) + throw new Error(`벤더 승인 처리 실패: ${approveResult.error}`) + } + + console.log(`[Vendor Approval Handler] 벤더 승인 완료: ${vendorRecords.length}개`) + + return { + success: true, + message: `${vendorRecords.length}개 벤더가 승인되었습니다.`, + approvedVendors: vendorRecords, + mdgResults, + } + + } catch (error) { + console.error(`[Vendor Approval Handler] 벤더 승인 실패:`, error) + throw error + } +} + |
