diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-12 08:01:02 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-12 08:01:02 +0000 |
| commit | a9575387c3a765a1a65ebc179dae16a21af6eb25 (patch) | |
| tree | 347f2b17b07039080fb2f116460004ba0b75a779 /lib/basic-contract | |
| parent | 47e527f5f763658600696ee58451fb666e692f5a (diff) | |
(임수민) 일반 계약 템플릿 구현 및 basic contract 필터 수정
Diffstat (limited to 'lib/basic-contract')
| -rw-r--r-- | lib/basic-contract/service.ts | 60 | ||||
| -rw-r--r-- | lib/basic-contract/template/basic-contract-template.tsx | 3 |
2 files changed, 57 insertions, 6 deletions
diff --git a/lib/basic-contract/service.ts b/lib/basic-contract/service.ts index 2a66824a..52669948 100644 --- a/lib/basic-contract/service.ts +++ b/lib/basic-contract/service.ts @@ -153,18 +153,24 @@ export async function getBasicContractTemplates( const offset = (input.page - 1) * input.perPage;
const { data, total } = await db.transaction(async (tx) => {
- // 간소화된 구현 - 실제 filterColumns 함수는 더 복잡할 수 있습니다
- let whereCondition = undefined;
+ const advancedWhere = filterColumns({
+ table: basicContractTemplates,
+ filters: input.filters,
+ joinOperator: input.joinOperator,
+ });
+ let globalWhere = undefined;
if (input.search) {
const s = `%${input.search}%`;
- whereCondition = or(
+ globalWhere = or(
ilike(basicContractTemplates.templateName, s),
ilike(basicContractTemplates.fileName, s),
ilike(basicContractTemplates.status, s)
);
}
+ const whereCondition = and(advancedWhere, globalWhere);
+
const orderBy =
input.sort.length > 0
? input.sort.map((item) =>
@@ -3438,11 +3444,35 @@ export async function saveGtcDocumentAction({ try {
console.log("📄 GTC 문서 저장 시작:", {
documentId,
+ documentIdType: typeof documentId,
vendorName: vendor.vendorName,
originalFileName,
bufferSize: pdfBuffer.length
})
+ // documentId 유효성 검사
+ if (!documentId || isNaN(Number(documentId))) {
+ throw new Error(`유효하지 않은 문서 ID: ${documentId}`)
+ }
+
+ // 기본계약 존재 여부 확인
+ const existingContract = await db.query.basicContract.findFirst({
+ where: eq(basicContract.id, documentId),
+ })
+
+ if (!existingContract) {
+ throw new Error(`기본계약을 찾을 수 없습니다. ID: ${documentId}`)
+ }
+
+ console.log("📋 기존 계약 정보:", {
+ contractId: existingContract.id,
+ templateId: existingContract.templateId,
+ vendorId: existingContract.vendorId,
+ currentStatus: existingContract.status,
+ currentFileName: existingContract.fileName,
+ currentFilePath: existingContract.filePath
+ })
+
const session = await getServerSession(authOptions)
if (!session?.user) {
@@ -3467,8 +3497,8 @@ export async function saveGtcDocumentAction({ throw new Error(saveResult.error || '파일 저장 실패')
}
- // 3. 데이터베이스 업데이트
- await db.update(basicContract)
+ // 3. 데이터베이스 업데이트 - 트랜잭션으로 처리하고 결과 확인
+ const updateResult = await db.update(basicContract)
.set({
fileName: saveResult.fileName!,
filePath: saveResult.publicPath!,
@@ -3481,18 +3511,36 @@ export async function saveGtcDocumentAction({ updatedAt: new Date()
})
.where(eq(basicContract.id, documentId))
+ .returning({
+ id: basicContract.id,
+ fileName: basicContract.fileName,
+ filePath: basicContract.filePath
+ })
+
+ // DB 업데이트 성공 여부 확인
+ if (!updateResult || updateResult.length === 0) {
+ throw new Error(`기본계약 ID ${documentId}를 찾을 수 없거나 업데이트에 실패했습니다.`)
+ }
console.log("✅ GTC 문서 저장 완료:", {
+ documentId,
+ updatedRecord: updateResult[0],
fileName: saveResult.fileName,
filePath: saveResult.publicPath,
fileSize: saveResult.fileSize
})
+ // 캐시 무효화
+ revalidateTag("basic-contract-requests")
+ revalidateTag("basic-contracts")
+ revalidatePath("/partners/basic-contract")
+
return {
success: true,
fileName: saveResult.fileName,
filePath: saveResult.publicPath,
- fileSize: saveResult.fileSize
+ fileSize: saveResult.fileSize,
+ documentId: updateResult[0].id
}
} catch (error) {
diff --git a/lib/basic-contract/template/basic-contract-template.tsx b/lib/basic-contract/template/basic-contract-template.tsx index 470bc925..8ac421f5 100644 --- a/lib/basic-contract/template/basic-contract-template.tsx +++ b/lib/basic-contract/template/basic-contract-template.tsx @@ -29,6 +29,7 @@ export function BasicContractTemplateTable({ promises }: BasicTemplateTableProps const router = useRouter(); const [rowAction, setRowAction] = React.useState<DataTableRowAction<BasicContractTemplate> | null>(null) + const [selectedRows, setSelectedRows] = React.useState<BasicContractTemplate[]>([]) const [{ data, pageCount }] = React.use(promises) @@ -56,6 +57,7 @@ export function BasicContractTemplateTable({ promises }: BasicTemplateTableProps data, columns, pageCount, + filterFields: advancedFilterFields, enablePinning: true, enableAdvancedFilter: true, initialState: { @@ -73,6 +75,7 @@ export function BasicContractTemplateTable({ promises }: BasicTemplateTableProps <DataTableAdvancedToolbar table={table} filterFields={advancedFilterFields} + shallow={false} > <TemplateTableToolbarActions table={table} /> </DataTableAdvancedToolbar> |
