summaryrefslogtreecommitdiff
path: root/lib/vendor-document-list/workflow-service.ts
diff options
context:
space:
mode:
authordujinkim <dujin.kim@dtsolution.co.kr>2025-06-05 01:53:35 +0000
committerdujinkim <dujin.kim@dtsolution.co.kr>2025-06-05 01:53:35 +0000
commit610d3bccf1cb640e2a21df28d8d2a954c2bf337e (patch)
treee7e6d72fecf14ddcff1b5b52263d14119b7c488c /lib/vendor-document-list/workflow-service.ts
parent15969dfedffc4e215c81d507164bc2bb383974e5 (diff)
(대표님) 변경사항 0604 - OCR 관련 및 drizzle generated sqls
Diffstat (limited to 'lib/vendor-document-list/workflow-service.ts')
-rw-r--r--lib/vendor-document-list/workflow-service.ts195
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