summaryrefslogtreecommitdiff
path: root/lib/pos/download-on-demand-action.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pos/download-on-demand-action.ts')
-rw-r--r--lib/pos/download-on-demand-action.ts193
1 files changed, 193 insertions, 0 deletions
diff --git a/lib/pos/download-on-demand-action.ts b/lib/pos/download-on-demand-action.ts
new file mode 100644
index 00000000..568bae22
--- /dev/null
+++ b/lib/pos/download-on-demand-action.ts
@@ -0,0 +1,193 @@
+/**
+ * POS 파일 온디맨드 다운로드 서버 액션
+ *
+ * 클라이언트 컴포넌트에서 자재코드로 POS 파일을 다운로드할 수 있는 함수들을 제공합니다.
+ */
+
+'use server';
+
+import { getDcmtmIdByMaterialCode } from './get-dcmtm-id';
+
+export interface DownloadPosOnDemandResult {
+ success: boolean;
+ downloadUrl?: string;
+ fileName?: string;
+ availableFiles?: Array<{
+ fileName: string;
+ dcmtmId: string;
+ projNo: string;
+ posNo: string;
+ posRevNo: string;
+ fileSer: string;
+ }>;
+ error?: string;
+}
+
+/**
+ * 자재코드로 POS 파일 다운로드 URL을 생성합니다.
+ *
+ * @param materialCode - 자재코드 (MATNR)
+ * @param fileIndex - 여러 파일이 있을 경우 선택할 파일 인덱스 (기본값: 0)
+ * @returns 다운로드 URL과 파일 정보
+ *
+ * @example
+ * ```typescript
+ * const result = await getDownloadUrlByMaterialCode('SN2693A6410100001');
+ * if (result.success && result.downloadUrl) {
+ * window.open(result.downloadUrl, '_blank');
+ * }
+ * ```
+ */
+export async function getDownloadUrlByMaterialCode(
+ materialCode: string,
+ fileIndex: number = 0
+): Promise<DownloadPosOnDemandResult> {
+ try {
+ if (!materialCode || materialCode.trim() === '') {
+ return {
+ success: false,
+ error: '자재코드가 제공되지 않았습니다.',
+ };
+ }
+
+ // 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.map(file => ({
+ fileName: file.fileName,
+ dcmtmId: file.dcmtmId,
+ projNo: file.projNo,
+ posNo: file.posNo,
+ posRevNo: file.posRevNo,
+ fileSer: file.fileSer,
+ })),
+ };
+ }
+
+ const selectedFile = dcmtmResult.files[fileIndex];
+
+ // 2. 다운로드 URL 생성
+ const downloadUrl = `/api/pos/download-on-demand?materialCode=${encodeURIComponent(materialCode)}&fileIndex=${fileIndex}`;
+
+ return {
+ success: true,
+ downloadUrl,
+ fileName: selectedFile.fileName,
+ availableFiles: dcmtmResult.files.map(file => ({
+ fileName: file.fileName,
+ dcmtmId: file.dcmtmId,
+ projNo: file.projNo,
+ posNo: file.posNo,
+ posRevNo: file.posRevNo,
+ fileSer: file.fileSer,
+ })),
+ };
+ } catch (error) {
+ return {
+ success: false,
+ error: error instanceof Error ? error.message : '알 수 없는 오류가 발생했습니다.',
+ };
+ }
+}
+
+/**
+ * 여러 자재코드에 대한 POS 파일 다운로드 URL을 일괄 조회합니다.
+ *
+ * @param materialCodes - 자재코드 배열
+ * @returns 각 자재코드별 다운로드 정보
+ *
+ * @example
+ * ```typescript
+ * const results = await getDownloadUrlsForMaterialCodes([
+ * 'SN2693A6410100001',
+ * 'SN2693A6410100002'
+ * ]);
+ *
+ * results.forEach(result => {
+ * if (result.success) {
+ * console.log(`${result.materialCode}: ${result.downloadUrl}`);
+ * }
+ * });
+ * ```
+ */
+export async function getDownloadUrlsForMaterialCodes(
+ materialCodes: string[]
+): Promise<Array<DownloadPosOnDemandResult & { materialCode: string }>> {
+ const results = await Promise.all(
+ materialCodes.map(async (materialCode) => {
+ const result = await getDownloadUrlByMaterialCode(materialCode);
+ return {
+ materialCode,
+ ...result,
+ };
+ })
+ );
+
+ return results;
+}
+
+/**
+ * 자재코드의 POS 파일 존재 여부를 확인합니다.
+ *
+ * @param materialCode - 자재코드 (MATNR)
+ * @returns 파일 존재 여부와 파일 수
+ */
+export async function checkPosFileExists(
+ materialCode: string
+): Promise<{
+ exists: boolean;
+ fileCount: number;
+ files?: Array<{
+ fileName: string;
+ dcmtmId: string;
+ projNo: string;
+ posNo: string;
+ posRevNo: string;
+ fileSer: string;
+ }>;
+ error?: string;
+}> {
+ try {
+ const dcmtmResult = await getDcmtmIdByMaterialCode({ materialCode });
+
+ if (!dcmtmResult.success || !dcmtmResult.files) {
+ return {
+ exists: false,
+ fileCount: 0,
+ error: dcmtmResult.error,
+ };
+ }
+
+ return {
+ exists: dcmtmResult.files.length > 0,
+ fileCount: dcmtmResult.files.length,
+ files: dcmtmResult.files.map(file => ({
+ fileName: file.fileName,
+ dcmtmId: file.dcmtmId,
+ projNo: file.projNo,
+ posNo: file.posNo,
+ posRevNo: file.posRevNo,
+ fileSer: file.fileSer,
+ })),
+ };
+ } catch (error) {
+ return {
+ exists: false,
+ fileCount: 0,
+ error: error instanceof Error ? error.message : '알 수 없는 오류',
+ };
+ }
+}
+