diff options
Diffstat (limited to 'lib/vendor-document-list/workflow-service.ts')
| -rw-r--r-- | lib/vendor-document-list/workflow-service.ts | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/lib/vendor-document-list/workflow-service.ts b/lib/vendor-document-list/workflow-service.ts new file mode 100644 index 00000000..6efff012 --- /dev/null +++ b/lib/vendor-document-list/workflow-service.ts @@ -0,0 +1,195 @@ +// lib/vendor-document-list/workflow-service.ts +class WorkflowService { + /** + * 워크플로우 상태 조회 + */ + async getWorkflowStatus( + contractId: number, + targetSystem: string = 'SWP' + ): Promise<any> { + 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<any> { + 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<any> { + // 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<any> { + // 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<any> { + // 수정된 문서 목록 재전송 로직 + return await this.submitDocumentList(contractId, targetSystem, documents, userId, userName) + } + + /** + * 최종 승인 확인 + */ + private async checkApproval( + contractId: number, + targetSystem: string + ): Promise<any> { + // 최종 승인 상태 확인 로직 + return await this.checkConfirmation(contractId, targetSystem) + } +} + +export const workflowService = new WorkflowService()
\ No newline at end of file |
