diff options
Diffstat (limited to 'lib/bidding/service.ts')
| -rw-r--r-- | lib/bidding/service.ts | 96 |
1 files changed, 87 insertions, 9 deletions
diff --git a/lib/bidding/service.ts b/lib/bidding/service.ts index 80e4850f..a7cd8286 100644 --- a/lib/bidding/service.ts +++ b/lib/bidding/service.ts @@ -3076,7 +3076,14 @@ export async function searchVendorsForBidding(searchTerm: string = "", biddingId } // 차수증가 또는 재입찰 함수 -export async function increaseRoundOrRebid(biddingId: number, userId: string, type: 'round_increase' | 'rebidding') { +export async function increaseRoundOrRebid(biddingId: number, userId: string | undefined, type: 'round_increase' | 'rebidding') { + if (!userId) { + return { + success: false, + error: '사용자 정보가 필요합니다.', + } + } + try { const userName = await getUserNameById(userId) @@ -3429,7 +3436,8 @@ export async function getBiddingsForReceive(input: GetBiddingsSchema) { or( eq(biddings.status, 'received_quotation'), eq(biddings.status, 'bidding_opened'), - eq(biddings.status, 'bidding_closed') + eq(biddings.status, 'bidding_closed'), + eq(biddings.status, 'evaluation_of_bidding'), )! ) @@ -3577,9 +3585,9 @@ export async function getBiddingsForReceive(input: GetBiddingsSchema) { ), 0) `.as('participant_pending'), - // 개찰 정보 (bidding_opened 상태에서만 의미 있음) - openedAt: biddings.updatedAt, // 개찰일은 업데이트 일시로 대체 - openedBy: biddings.updatedBy, // 개찰자는 업데이트자로 대체 + // 개찰 정보 + openedAt: biddings.openedAt, + openedBy: biddings.openedBy, }) .from(biddings) .where(finalWhere) @@ -3756,8 +3764,13 @@ export async function getBiddingsForFailure(input: GetBiddingsSchema) { // 기본 필터 조건들 (유찰된 입찰만) const basicConditions: SQL<unknown>[] = [] - // 유찰된 상태만 필터링 - basicConditions.push(eq(biddings.status, 'bidding_disposal')) + // 유찰된 상태만 필터링, 폐찰된 상태도 포함 + basicConditions.push( + or( + eq(biddings.status, 'bidding_disposal'), + eq(biddings.status, 'bid_closure') + )! + ) if (input.biddingNumber) { basicConditions.push(ilike(biddings.biddingNumber, `%${input.biddingNumber}%`)) @@ -3848,8 +3861,8 @@ export async function getBiddingsForFailure(input: GetBiddingsSchema) { orderByColumns.push(desc(biddings.updatedAt)) // 유찰된 최신순 } - // bid-failure 페이지용 데이터 조회 - const data = await db + // bid-failure 페이지용 데이터 조회 (폐찰 문서 정보 포함) + const rawData = await db .select({ // 기본 입찰 정보 id: biddings.id, @@ -3878,6 +3891,15 @@ export async function getBiddingsForFailure(input: GetBiddingsSchema) { disposalUpdatedAt: biddings.updatedAt, // 폐찰수정일 disposalUpdatedBy: biddings.updatedBy, // 폐찰수정자 + // 폐찰 정보 + closureReason: biddings.description, // 폐찰사유 + + // 폐찰 문서 정보 + documentId: biddingDocuments.id, + documentFileName: biddingDocuments.fileName, + documentOriginalFileName: biddingDocuments.originalFileName, + documentFilePath: biddingDocuments.filePath, + // 기타 정보 createdBy: biddings.createdBy, createdAt: biddings.createdAt, @@ -3885,11 +3907,67 @@ export async function getBiddingsForFailure(input: GetBiddingsSchema) { updatedBy: biddings.updatedBy, }) .from(biddings) + .leftJoin(biddingDocuments, and( + eq(biddingDocuments.biddingId, biddings.id), + eq(biddingDocuments.documentType, 'evaluation_doc'), // 폐찰 문서 + eq(biddingDocuments.isPublic, false) // 폐찰 문서는 비공개 + )) .where(finalWhere) .orderBy(...orderByColumns) .limit(input.perPage) .offset(offset) + // 데이터를 그룹화하여 폐찰 문서들을 배열로 묶기 + const groupedData = rawData.reduce((acc, item) => { + const existing = acc.find(b => b.id === item.id) + if (existing) { + // 이미 존재하는 입찰이면 문서 추가 + if (item.documentId) { + existing.closureDocuments.push({ + id: item.documentId, + fileName: item.documentFileName!, + originalFileName: item.documentOriginalFileName!, + filePath: item.documentFilePath! + }) + } + } else { + // 새로운 입찰 추가 + acc.push({ + id: item.id, + biddingNumber: item.biddingNumber, + originalBiddingNumber: item.originalBiddingNumber, + title: item.title, + status: item.status, + contractType: item.contractType, + prNumber: item.prNumber, + targetPrice: item.targetPrice, + currency: item.currency, + biddingRegistrationDate: item.biddingRegistrationDate, + submissionStartDate: item.submissionStartDate, + submissionEndDate: item.submissionEndDate, + bidPicName: item.bidPicName, + supplyPicName: item.supplyPicName, + disposalDate: item.disposalDate, + disposalUpdatedAt: item.disposalUpdatedAt, + disposalUpdatedBy: item.disposalUpdatedBy, + closureReason: item.closureReason, + closureDocuments: item.documentId ? [{ + id: item.documentId, + fileName: item.documentFileName!, + originalFileName: item.documentOriginalFileName!, + filePath: item.documentFilePath! + }] : [], + createdBy: item.createdBy, + createdAt: item.createdAt, + updatedAt: item.updatedAt, + updatedBy: item.updatedBy, + }) + } + return acc + }, [] as any[]) + + const data = groupedData + const pageCount = Math.ceil(total / input.perPage) return { data, pageCount, total } |
