summaryrefslogtreecommitdiff
path: root/lib/vendor-document-list/plant
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-13 12:21:18 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-13 12:21:18 +0900
commitd113d1732f7c6356af6619dfaff98604fb68e5ad (patch)
treeea77e9c4a5da0123e9aa5e1482d9f1c93afe76ba /lib/vendor-document-list/plant
parenta4ceade24d28af0bde985bf750017efc02f053ff (diff)
(김준회) SWP 문서리스트: OWN_DOC_NO로 스테이지 검증 추가
Diffstat (limited to 'lib/vendor-document-list/plant')
-rw-r--r--lib/vendor-document-list/plant/document-stages-service.ts104
1 files changed, 104 insertions, 0 deletions
diff --git a/lib/vendor-document-list/plant/document-stages-service.ts b/lib/vendor-document-list/plant/document-stages-service.ts
index 7740a385..ed4099b3 100644
--- a/lib/vendor-document-list/plant/document-stages-service.ts
+++ b/lib/vendor-document-list/plant/document-stages-service.ts
@@ -1560,3 +1560,107 @@ export async function uploadImportData(data: UploadData) {
}
}
}
+
+/**
+ * SWP 파일 업로드 검증을 위한 문서 정보 조회
+ * - vendorDocNumber → docClass 매핑
+ * - Document Class별 허용 Stage 목록
+ *
+ * @param projectId 프로젝트 ID
+ * @returns vendorDocNumber → Document Class 매핑 + Document Class → 허용 Stage 목록
+ */
+export async function getDocumentClassInfoForSwpUpload(projectId: number): Promise<{
+ vendorDocNumberToDocClassMap: Record<string, string>;
+ documentClassStages: Record<string, string[]>;
+}> {
+ try {
+ console.log(`[getDocumentClassInfoForSwpUpload] 프로젝트 ${projectId} 문서 정보 조회 시작`);
+
+ // 1. 프로젝트의 모든 문서와 해당 docClass 조회
+ const documents = await db
+ .select({
+ vendorDocNumber: stageDocuments.vendorDocNumber,
+ docClass: stageDocuments.docClass,
+ })
+ .from(stageDocuments)
+ .where(
+ and(
+ eq(stageDocuments.projectId, projectId),
+ eq(stageDocuments.status, "ACTIVE")
+ )
+ );
+
+ console.log(`[getDocumentClassInfoForSwpUpload] 조회된 문서 개수: ${documents.length}`);
+
+ // 2. vendorDocNumber → docClass 매핑 생성
+ const vendorDocNumberToDocClassMap: Record<string, string> = {};
+ const documentClassSet = new Set<string>();
+
+ for (const doc of documents) {
+ if (doc.vendorDocNumber && doc.docClass) {
+ vendorDocNumberToDocClassMap[doc.vendorDocNumber] = doc.docClass;
+ documentClassSet.add(doc.docClass);
+ }
+ }
+
+ console.log(`[getDocumentClassInfoForSwpUpload] vendorDocNumber 매핑 개수: ${Object.keys(vendorDocNumberToDocClassMap).length}`);
+ console.log(`[getDocumentClassInfoForSwpUpload] 사용 중인 Document Class: ${Array.from(documentClassSet).join(", ")}`);
+
+ // 3. 프로젝트의 Document Class별 허용 Stage 목록 조회
+ if (documentClassSet.size === 0) {
+ console.log(`[getDocumentClassInfoForSwpUpload] Document Class가 없음 → 빈 결과 반환`);
+ return {
+ vendorDocNumberToDocClassMap: {},
+ documentClassStages: {},
+ };
+ }
+
+ // 프로젝트의 모든 Document Class와 옵션 조회
+ const documentClassesWithOptions = await db
+ .select({
+ docClassValue: documentClasses.value,
+ optionCode: documentClassOptions.optionCode,
+ })
+ .from(documentClasses)
+ .leftJoin(
+ documentClassOptions,
+ eq(documentClasses.id, documentClassOptions.documentClassId)
+ )
+ .where(
+ and(
+ eq(documentClasses.projectId, projectId),
+ eq(documentClasses.isActive, true),
+ eq(documentClassOptions.isActive, true)
+ )
+ )
+ .orderBy(documentClasses.value, documentClassOptions.sdq);
+
+ console.log(`[getDocumentClassInfoForSwpUpload] Document Class 옵션 조회 개수: ${documentClassesWithOptions.length}`);
+
+ // 4. Document Class별로 Stage 목록 그룹핑
+ const documentClassStages: Record<string, string[]> = {};
+
+ for (const row of documentClassesWithOptions) {
+ if (!row.docClassValue || !row.optionCode) continue;
+
+ if (!documentClassStages[row.docClassValue]) {
+ documentClassStages[row.docClassValue] = [];
+ }
+
+ documentClassStages[row.docClassValue].push(row.optionCode);
+ }
+
+ console.log(`[getDocumentClassInfoForSwpUpload] Document Class-Stage 매핑:`, documentClassStages);
+
+ return {
+ vendorDocNumberToDocClassMap,
+ documentClassStages,
+ };
+ } catch (error) {
+ console.error('[getDocumentClassInfoForSwpUpload] 오류:', error);
+ return {
+ vendorDocNumberToDocClassMap: {},
+ documentClassStages: {},
+ };
+ }
+}