diff options
| author | joonhoekim <26rote@gmail.com> | 2025-11-02 17:12:21 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-11-02 17:12:21 +0900 |
| commit | 280f9736c9db3a95436d99aee238725c8d5fe24f (patch) | |
| tree | 2e6d98b8ed370b62f6d3b3e9790b28a760b1230b /lib | |
| parent | 46fab28558dab0e6f13b8469e584de756e0709b2 (diff) | |
(김준회) swp: 리스트: doc class 관련 code 사용하도록 통일
Diffstat (limited to 'lib')
4 files changed, 38 insertions, 14 deletions
diff --git a/lib/vendor-document-list/plant/document-stage-dialogs.tsx b/lib/vendor-document-list/plant/document-stage-dialogs.tsx index 6c8fa797..a738eba9 100644 --- a/lib/vendor-document-list/plant/document-stage-dialogs.tsx +++ b/lib/vendor-document-list/plant/document-stage-dialogs.tsx @@ -378,9 +378,18 @@ export function AddDocumentDialog({ const selectedDocClass = documentClasses.find(cls => String(cls.id) === data.documentClassId) const docClassCode = selectedDocClass?.code || '' + // documentNumberTypeId는 SHI를 우선 사용, 없으면 CPY 사용 + const documentNumberTypeId = shiType?.id || cpyType?.id + + if (!documentNumberTypeId) { + toast.error('Document Number Type is not configured.') + return + } + try { const submitData = { contractId, + documentNumberTypeId, documentClassId: Number(data.documentClassId), docClass: docClassCode, // 첫 번째 선택기의 code 값 사용 (A, B, C 등) title: data.title, @@ -601,7 +610,8 @@ export function AddDocumentDialog({ <SelectContent> {documentClasses.map((cls) => ( <SelectItem key={cls.id} value={String(cls.id)}> - {cls.value} + <span className="font-mono font-semibold">{cls.code}</span> + {cls.description && <span className="text-muted-foreground"> - {cls.description}</span>} </SelectItem> ))} </SelectContent> @@ -616,6 +626,10 @@ export function AddDocumentDialog({ {documentClassId && ( <p className="text-xs text-gray-600 dark:text-gray-400"> Options from the selected class will be automatically created as stages. + {(() => { + const selected = documentClasses.find(cls => String(cls.id) === documentClassId) + return selected ? ` (Selected: ${selected.code})` : '' + })()} </p> )} </div> diff --git a/lib/vendor-document-list/plant/document-stages-columns.tsx b/lib/vendor-document-list/plant/document-stages-columns.tsx index c74f2d71..3ee5996e 100644 --- a/lib/vendor-document-list/plant/document-stages-columns.tsx +++ b/lib/vendor-document-list/plant/document-stages-columns.tsx @@ -334,16 +334,23 @@ export function getDocumentStagesColumns({ return ( <div className="flex items-center gap-2"> {doc.docClass ? ( - <span className="text-sm font-medium text-blue-600 dark:text-blue-400"> - {doc.docClass} - </span> + <Tooltip> + <TooltipTrigger asChild> + <span className="text-sm font-mono font-semibold text-blue-600 dark:text-blue-400 cursor-help"> + {doc.docClass} + </span> + </TooltipTrigger> + <TooltipContent> + <p className="text-xs">Document Class: {doc.docClass}</p> + </TooltipContent> + </Tooltip> ) : ( <span className="text-gray-400 dark:text-gray-500 text-sm">-</span> )} </div> ) }, - size: 120, + size: 100, enableResizing: true, meta: { excelHeader: "Doc. Class" diff --git a/lib/vendor-document-list/plant/document-stages-service.ts b/lib/vendor-document-list/plant/document-stages-service.ts index 47bc6ff8..30f57a23 100644 --- a/lib/vendor-document-list/plant/document-stages-service.ts +++ b/lib/vendor-document-list/plant/document-stages-service.ts @@ -1374,18 +1374,18 @@ export async function uploadImportData(data: UploadData) { } - // 2. Document Class 매핑 가져오기 (트랜잭션 밖에서) + // 2. Document Class 매핑 가져오기 (트랜잭션 밖에서) - code 기반으로 통일 const documentClassesData = await db .select({ id: documentClasses.id, - value: documentClasses.value, + code: documentClasses.code, description: documentClasses.description, }) .from(documentClasses) .where(and(eq(documentClasses.projectId, contract.projectId), eq(documentClasses.isActive, true))) const classMap = new Map( - documentClassesData.map(dc => [dc.value, dc.id]) + documentClassesData.map(dc => [dc.code, dc.id]) ) console.log(classMap) diff --git a/lib/vendor-document-list/plant/excel-import-stage.tsx b/lib/vendor-document-list/plant/excel-import-stage.tsx index 53e12eeb..9bd9ed4c 100644 --- a/lib/vendor-document-list/plant/excel-import-stage.tsx +++ b/lib/vendor-document-list/plant/excel-import-stage.tsx @@ -460,7 +460,7 @@ async function createImportTemplate(projectType: "ship" | "plant", contractId: n const sampleRow = [ projectType === "ship" ? "SH-2024-001" : "PL-2024-001", "샘플 문서명", - firstClass ? firstClass.description : "", + firstClass ? firstClass.code : "", ...(projectType === "plant" ? ["V-001"] : []), ...allStageNames.map((s) => (firstClassStages.includes(s) ? "2024-03-01" : "")), ] @@ -648,7 +648,8 @@ if (projectType === "plant") { styleHeaderRow(matrixHeaderRow, "FF34495E") for (const docClass of documentClasses) { const validStages = new Set(optionsByClassId.get(docClass.id) ?? []) - const row = [docClass.description, ...allStageNames.map((stage) => (validStages.has(stage) ? "✓" : ""))] + // Code를 사용하고 설명을 괄호 안에 추가 + const row = [`${docClass.code}`, ...allStageNames.map((stage) => (validStages.has(stage) ? "✓" : ""))] const dataRow = matrixSheet.addRow(row) allStageNames.forEach((stage, idx) => { const cell = dataRow.getCell(idx + 2) @@ -711,7 +712,9 @@ if (projectType === "plant") { const referenceSheet = workbook.addWorksheet("ReferenceData", { state: "hidden" }) referenceSheet.getCell("A1").value = "DocumentClasses" documentClasses.forEach((dc, idx) => { - referenceSheet.getCell(`A${idx + 2}`).value = dc.description + // 코드를 메인으로, 설명을 참고용으로 표시 + referenceSheet.getCell(`A${idx + 2}`).value = dc.code + referenceSheet.getCell(`B${idx + 2}`).value = dc.description }) // ================= Stage 열별 서식/검증 ================= @@ -800,14 +803,14 @@ async function parseDocumentsWithStages( errors.push("Document Class 정보를 불러올 수 없습니다") return { validData: [], errors } } - const documentClasses = res.data.classes as Array<{ id: number; description: string }> + const documentClasses = res.data.classes as Array<{ id: number; code: string; description: string }> const options = res.data.options as Array<{ documentClassId: number; optionValue: string }> - // 클래스별 유효한 스테이지 맵 + // 클래스별 유효한 스테이지 맵 (code 기반) const validStagesByClass = new Map<string, Set<string>>() for (const c of documentClasses) { const stages = options.filter((o) => o.documentClassId === c.id).map((o) => o.optionValue) - validStagesByClass.set(c.description, new Set(stages)) + validStagesByClass.set(c.code, new Set(stages)) } // 헤더 파싱 |
