summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-11-02 17:12:21 +0900
committerjoonhoekim <26rote@gmail.com>2025-11-02 17:12:21 +0900
commit280f9736c9db3a95436d99aee238725c8d5fe24f (patch)
tree2e6d98b8ed370b62f6d3b3e9790b28a760b1230b /lib
parent46fab28558dab0e6f13b8469e584de756e0709b2 (diff)
(김준회) swp: 리스트: doc class 관련 code 사용하도록 통일
Diffstat (limited to 'lib')
-rw-r--r--lib/vendor-document-list/plant/document-stage-dialogs.tsx16
-rw-r--r--lib/vendor-document-list/plant/document-stages-columns.tsx15
-rw-r--r--lib/vendor-document-list/plant/document-stages-service.ts6
-rw-r--r--lib/vendor-document-list/plant/excel-import-stage.tsx15
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))
}
// 헤더 파싱