summaryrefslogtreecommitdiff
path: root/lib/vendors/approval-handlers.ts
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-06 15:50:45 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-06 15:50:45 +0900
commitba43cd261d10c6b0c5218a9da3f946993b21de6e (patch)
treef902939afcd7a2c15359dc0a75eda43dadd540da /lib/vendors/approval-handlers.ts
parent9d00afc23fca94056ce630dfdd91e16010cad7aa (diff)
(김준회) 결재: 협력업체관리: 가입승인: 가입승인시 결재절차 구현 (템플릿 관련 부분은 미구현)
Diffstat (limited to 'lib/vendors/approval-handlers.ts')
-rw-r--r--lib/vendors/approval-handlers.ts119
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
+ }
+}
+