summaryrefslogtreecommitdiff
path: root/lib/bidding/service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'lib/bidding/service.ts')
-rw-r--r--lib/bidding/service.ts96
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 }