summaryrefslogtreecommitdiff
path: root/lib/vendors/approval-handlers.ts
blob: bc4d24a6a8b4e5004258b4aa54ff71bf57f7a879 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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
  }
}