// 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'; export { getDesignDocumentByMaterialCode, getDesignDocumentsForRfqItems, getDesignDocumentByMaterialCodeAction, getDesignDocumentsForRfqItemsAction } from './design-document-service'; // 타입들은 ./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', }; } }