'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 } }