diff options
Diffstat (limited to 'lib/pos/index.ts')
| -rw-r--r-- | lib/pos/index.ts | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/lib/pos/index.ts b/lib/pos/index.ts new file mode 100644 index 00000000..7611d5c5 --- /dev/null +++ b/lib/pos/index.ts @@ -0,0 +1,164 @@ +// POS 관련 모든 기능을 하나로 통합하는 인덱스 파일 + +import { getEncryptDocumentumFile } from './get-pos'; +import { createDownloadUrl } from './download-pos-file'; +import { getDcmtmIdByMaterialCode } from './get-dcmtm-id'; +import type { PosFileInfo } from './types'; + +export { + getEncryptDocumentumFile +} from './get-pos'; + +export { + downloadPosFile, + createDownloadUrl +} from './download-pos-file'; + +export { + getDcmtmIdByMaterialCode, + getFirstDcmtmId +} from './get-dcmtm-id'; + +export { + syncRfqPosFiles +} from './sync-rfq-pos-files'; + +// 타입들은 ./types 에서 export +export type * from './types'; + +/** + * POS 파일을 가져와서 다운로드 URL을 생성하는 통합 함수 + * + * @example + * ```typescript + * const result = await getPosFileAndCreateDownloadUrl({ + * objectID: "0900746983f2e12a" + * }); + * + * if (result.success && result.downloadUrl) { + * // 클라이언트에서 다운로드 링크 사용 + * window.open(result.downloadUrl, '_blank'); + * } + * ``` + */ +export async function getPosFileAndCreateDownloadUrl(params: { + objectID: string; + sabun?: string; + appCode?: string; + fileCreateMode?: number; + securityLevel?: string; + isDesign?: boolean; +}): Promise<{ + success: boolean; + downloadUrl?: string; + fileName?: string; + error?: string; +}> { + try { + // 1. POS에서 파일 경로 가져오기 + const posResult = await getEncryptDocumentumFile(params); + + if (!posResult.success || !posResult.result) { + return { + success: false, + error: posResult.error || 'POS에서 파일 정보를 가져올 수 없습니다.', + }; + } + + // 2. 다운로드 URL 생성 + const downloadUrl = await createDownloadUrl(posResult.result); + + // 파일명 추출 (경로의 마지막 부분) + const fileName = posResult.result.split(/[\\\/]/).pop() || 'unknown'; + + return { + success: true, + downloadUrl, + fileName, + }; + } catch (error) { + return { + success: false, + error: error instanceof Error ? error.message : 'Unknown error', + }; + } +} + +/** + * 자재코드부터 POS 파일 다운로드까지 전체 워크플로우를 처리하는 통합 함수 + * + * @example + * ```typescript + * const result = await getPosFileByMaterialCode({ + * materialCode: "SN2693A6410100001" + * }); + * + * if (result.success && result.downloadUrl) { + * // 클라이언트에서 다운로드 링크 사용 + * window.open(result.downloadUrl, '_blank'); + * } + * ``` + */ +export async function getPosFileByMaterialCode(params: { + materialCode: string; + /** + * 여러 파일이 있을 경우 선택할 파일 인덱스 (기본값: 0) + */ + fileIndex?: number; +}): Promise<{ + success: boolean; + downloadUrl?: string; + fileName?: string; + availableFiles?: PosFileInfo[]; + error?: string; +}> { + try { + const { materialCode, fileIndex = 0 } = params; + + // 1. 자재코드로 DCMTM_ID 조회 + const dcmtmResult = await getDcmtmIdByMaterialCode({ materialCode }); + + if (!dcmtmResult.success || !dcmtmResult.files || dcmtmResult.files.length === 0) { + return { + success: false, + error: dcmtmResult.error || '해당 자재코드에 대한 POS 파일을 찾을 수 없습니다.', + }; + } + + // 선택된 파일이 범위를 벗어나는지 확인 + if (fileIndex >= dcmtmResult.files.length) { + return { + success: false, + error: `파일 인덱스가 범위를 벗어났습니다. 사용 가능한 파일 수: ${dcmtmResult.files.length}`, + availableFiles: dcmtmResult.files, + }; + } + + const selectedFile = dcmtmResult.files[fileIndex]; + + // 2. DCMTM_ID로 POS 파일 정보 가져오기 + const posResult = await getPosFileAndCreateDownloadUrl({ + objectID: selectedFile.dcmtmId, + }); + + if (!posResult.success) { + return { + success: false, + error: posResult.error, + availableFiles: dcmtmResult.files, + }; + } + + return { + success: true, + downloadUrl: posResult.downloadUrl, + fileName: selectedFile.fileName, // 오라클에서 가져온 파일명 사용 + availableFiles: dcmtmResult.files, + }; + } catch (error) { + return { + success: false, + error: error instanceof Error ? error.message : 'Unknown error', + }; + } +} |
