diff options
Diffstat (limited to 'lib/forms')
| -rw-r--r-- | lib/forms/services.ts | 65 |
1 files changed, 62 insertions, 3 deletions
diff --git a/lib/forms/services.ts b/lib/forms/services.ts index bd6e4bbc..fd521132 100644 --- a/lib/forms/services.ts +++ b/lib/forms/services.ts @@ -19,12 +19,12 @@ import { vendorDataReportTemps, VendorDataReportTemps, } from "@/db/schema/vendorData"; -import { eq, and, desc, sql, DrizzleError, or,type SQL ,type InferSelectModel } from "drizzle-orm"; +import { eq, and, desc, sql, DrizzleError, inArray, or,type SQL ,type InferSelectModel } from "drizzle-orm"; import { unstable_cache } from "next/cache"; import { revalidateTag } from "next/cache"; import { getErrorMessage } from "../handle-error"; import { DataTableColumnJSON } from "@/components/form-data/form-data-table-columns"; -import { contractItems, contracts, projects } from "@/db/schema"; +import { contractItems, contracts, items, projects } from "@/db/schema"; import { getSEDPToken } from "../sedp/sedp-token"; @@ -356,6 +356,64 @@ export async function getFormData(formCode: string, contractItemId: number) { } } +/** + * contractId와 formCode(itemCode)를 사용하여 contractItemId를 찾는 서버 액션 + * + * @param contractId - 계약 ID + * @param formCode - 폼 코드 (itemCode와 동일) + * @returns 찾은 contractItemId 또는 null + */ +export async function findContractItemId(contractId: number, formCode: string): Promise<number | null> { + try { + console.log(`[findContractItemId] 계약 ID ${contractId}와 formCode ${formCode}에 대한 contractItem 조회 시작`); + + // 1. forms 테이블에서 formCode에 해당하는 모든 레코드 조회 + const formsResult = await db + .select({ + contractItemId: forms.contractItemId + }) + .from(forms) + .where(eq(forms.formCode, formCode)); + + if (formsResult.length === 0) { + console.warn(`[findContractItemId] formCode ${formCode}에 해당하는 form을 찾을 수 없습니다.`); + return null; + } + + // 모든 contractItemId 추출 + const contractItemIds = formsResult.map(form => form.contractItemId); + console.log(`[findContractItemId] formCode ${formCode}에 해당하는 ${contractItemIds.length}개의 contractItemId 발견`); + + // 2. contractItems 테이블에서 추출한 contractItemId 중에서 + // contractId가 일치하는 항목 찾기 + const contractItemResult = await db + .select({ + id: contractItems.id + }) + .from(contractItems) + .where( + and( + inArray(contractItems.id, contractItemIds), + eq(contractItems.contractId, contractId) + ) + ) + .limit(1); + + if (contractItemResult.length === 0) { + console.warn(`[findContractItemId] 계약 ID ${contractId}와 일치하는 contractItemId를 찾을 수 없습니다.`); + return null; + } + + const contractItemId = contractItemResult[0].id; + console.log(`[findContractItemId] 계약 아이템 ID ${contractItemId} 발견`); + + return contractItemId; + } catch (error) { + console.error(`[findContractItemId] contractItem 조회 중 오류 발생:`, error); + return null; + } +} + export async function syncMissingTags( contractItemId: number, @@ -1015,7 +1073,8 @@ async function transformDataToSEDPFormat( TAG_NO: row.TAG_NO || "", TAG_DESC: row.TAG_DESC || "", ATTRIBUTES: [], - SCOPE: objectCode, + // SCOPE: objectCode, + SCOPE: formCode, TOOLID: "eVCP", // Changed from VDCS ITM_NO: row.TAG_NO || "", OP_DELETE: false, |
