// lib/vendor-document-list/workflow-service.ts class WorkflowService { /** * 워크플로우 상태 조회 */ async getWorkflowStatus( contractId: number, targetSystem: string = 'SWP' ): Promise { try { // 워크플로우 상태를 DB나 외부 시스템에서 조회 // 실제 구현에서는 workflow_states 테이블이나 외부 API를 사용 const mockStatus = { status: 'IDLE', lastUpdatedAt: new Date().toISOString(), pendingActions: ['SUBMIT_LIST'], confirmationData: null, revisionComments: [], approvalData: null } return mockStatus } catch (error) { console.error('Failed to get workflow status:', error) throw error } } /** * 워크플로우 액션 실행 */ async executeWorkflowAction( contractId: number, targetSystem: string, action: string, documents: any[], userId: number, userName: string ): Promise { try { console.log(`Executing workflow action: ${action} for contract ${contractId}`) switch (action) { case 'SUBMIT_LIST': return await this.submitDocumentList(contractId, targetSystem, documents, userId, userName) case 'CHECK_CONFIRMATION': return await this.checkConfirmation(contractId, targetSystem) case 'RESUBMIT_REVISED': return await this.resubmitRevisedList(contractId, targetSystem, documents, userId, userName) case 'CHECK_APPROVAL': return await this.checkApproval(contractId, targetSystem) default: throw new Error(`Unknown workflow action: ${action}`) } } catch (error) { console.error('Workflow action failed:', error) throw error } } /** * 문서 목록 전송 */ private async submitDocumentList( contractId: number, targetSystem: string, documents: any[], userId: number, userName: string ): Promise { // SWP 시스템으로 문서 목록 전송 const endpoint = process.env.SWP_SUBMIT_URL if (!endpoint) { throw new Error('SWP submit endpoint not configured') } const payload = { contractId, documents: documents.map(doc => ({ documentNo: doc.documentNo, documentName: doc.documentName, documentType: doc.documentType, status: doc.documentStatus })), submittedBy: userName, submittedAt: new Date().toISOString() } const response = await fetch(endpoint, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Basic ${Buffer.from(`${process.env.SWP_USER}:${process.env.SWP_PASSWORD}`).toString('base64')}` }, body: JSON.stringify(payload) }) if (!response.ok) { const errorText = await response.text() throw new Error(`SWP submit failed: HTTP ${response.status} - ${errorText}`) } const result = await response.json() // 워크플로우 상태 업데이트 (DB 저장) // await this.updateWorkflowStatus(contractId, targetSystem, 'SUBMITTED', result) return { success: true, message: '문서 목록이 성공적으로 전송되었습니다.', submissionId: result.submissionId } } /** * 컨펌 상태 확인 */ private async checkConfirmation( contractId: number, targetSystem: string ): Promise { // SWP 시스템에서 컨펌 상태 조회 const endpoint = process.env.SWP_STATUS_URL if (!endpoint) { throw new Error('SWP status endpoint not configured') } const response = await fetch(`${endpoint}?contractId=${contractId}`, { method: 'GET', headers: { 'Authorization': `Basic ${Buffer.from(`${process.env.SWP_USER}:${process.env.SWP_PASSWORD}`).toString('base64')}` } }) if (!response.ok) { const errorText = await response.text() throw new Error(`SWP status check failed: HTTP ${response.status} - ${errorText}`) } const result = await response.json() // 상태에 따른 다음 액션 결정 let nextStatus = 'UNDER_REVIEW' let message = '검토가 진행 중입니다.' if (result.status === 'CONFIRMED') { nextStatus = 'CONFIRMED' message = '문서 목록이 컨펌되었습니다.' } else if (result.status === 'REVISION_REQUIRED') { nextStatus = 'REVISION_REQUIRED' message = '수정이 요청되었습니다.' } return { success: true, message, status: nextStatus, confirmationData: result } } /** * 수정된 목록 재전송 */ private async resubmitRevisedList( contractId: number, targetSystem: string, documents: any[], userId: number, userName: string ): Promise { // 수정된 문서 목록 재전송 로직 return await this.submitDocumentList(contractId, targetSystem, documents, userId, userName) } /** * 최종 승인 확인 */ private async checkApproval( contractId: number, targetSystem: string ): Promise { // 최종 승인 상태 확인 로직 return await this.checkConfirmation(contractId, targetSystem) } } export const workflowService = new WorkflowService()