diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-03 10:35:57 +0000 |
| commit | a2bc455f654e011c53968b0d3a14389d7259847e (patch) | |
| tree | 6ff60b8ef0880aaa4cf2c9d4f234772fb0a74537 /lib/bidding/service.ts | |
| parent | bfe354f7633f62350e61eb784cbf1926079339d1 (diff) | |
(최겸) 구매 입찰 개발(벤더 응찰 개발 및 기본계약 요청 개발 필)
Diffstat (limited to 'lib/bidding/service.ts')
| -rw-r--r-- | lib/bidding/service.ts | 143 |
1 files changed, 130 insertions, 13 deletions
diff --git a/lib/bidding/service.ts b/lib/bidding/service.ts index 5d384476..fc96ddfe 100644 --- a/lib/bidding/service.ts +++ b/lib/bidding/service.ts @@ -9,7 +9,8 @@ import { biddingDocuments, prItemsForBidding, specificationMeetings, - prDocuments + prDocuments, + biddingConditions } from '@/db/schema' import { eq, @@ -356,25 +357,35 @@ export interface CreateBiddingInput extends CreateBiddingSchema { materials: string notes: string isRequired: boolean + meetingFiles: File[] } | null // PR 아이템들 (선택사항) - prItemsForBidding?: Array<{ - itemNumber: string - projectInfo: string + prItems?: Array<{ + id: string + prNumber: string + itemCode: string itemInfo: string - shi: string - requestedDeliveryDate: string - annualUnitPrice: string - currency: string quantity: string quantityUnit: string - totalWeight: string - weightUnit: string - materialDescription: string - prNumber: string + requestedDeliveryDate: string specFiles: File[] + isRepresentative: boolean }> + + // 입찰 조건 (선택사항) + biddingConditions?: { + paymentTerms: string + taxConditions: string + incoterms: string + proposedDeliveryDate: string + proposedShippingPort: string + proposedDestinationPort: string + priceAdjustmentApplicable: boolean + specialConditions: string + sparePartRequirement: string + additionalNotes: string + } } export interface UpdateBiddingInput extends UpdateBiddingSchema { @@ -593,7 +604,27 @@ export async function createBidding(input: CreateBiddingInput, userId: string) { } } - // 3. PR 아이템들 저장 (있는 경우) + // 3. 입찰 조건 저장 (있는 경우) + if (input.biddingConditions) { + try { + await tx.insert(biddingConditions).values({ + biddingId, + paymentTerms: input.biddingConditions.paymentTerms, + taxConditions: input.biddingConditions.taxConditions, + incoterms: input.biddingConditions.incoterms, + contractDeliveryDate: input.biddingConditions.proposedDeliveryDate ? new Date(input.biddingConditions.proposedDeliveryDate) : null, + shippingPort: input.biddingConditions.proposedShippingPort, + destinationPort: input.biddingConditions.proposedDestinationPort, + isPriceAdjustmentApplicable: input.biddingConditions.priceAdjustmentApplicable, + sparePartOptions: input.biddingConditions.sparePartRequirement, + }) + } catch (error) { + console.error('Error saving bidding conditions:', error) + // 입찰 조건 저장 실패해도 전체 트랜잭션은 계속 진행 + } + } + + // 4. PR 아이템들 저장 (있는 경우) if (input.prItems && input.prItems.length > 0) { for (const prItem of input.prItems) { // PR 아이템 저장 @@ -1190,4 +1221,90 @@ export async function getBiddingBasicInfoAction( error: "입찰 기본 정보 조회 중 오류가 발생했습니다" } } +} + +// 입찰 조건 조회 +export async function getBiddingConditions(biddingId: number) { + try { + const conditions = await db + .select() + .from(biddingConditions) + .where(eq(biddingConditions.biddingId, biddingId)) + .limit(1) + + if (conditions.length === 0) { + return null + } + + return conditions[0] + } catch (error) { + console.error('Error fetching bidding conditions:', error) + return null + } +} + +// 입찰 조건 업데이트 +export async function updateBiddingConditions( + biddingId: number, + updates: { + paymentTerms?: string + taxConditions?: string + incoterms?: string + contractDeliveryDate?: string + shippingPort?: string + destinationPort?: string + isPriceAdjustmentApplicable?: boolean + sparePartOptions?: string + } +) { + try { + return await db.transaction(async (tx) => { + // 기존 조건 확인 + const existing = await tx + .select() + .from(biddingConditions) + .where(eq(biddingConditions.biddingId, biddingId)) + .limit(1) + + const updateData = { + paymentTerms: updates.paymentTerms, + taxConditions: updates.taxConditions, + incoterms: updates.incoterms, + contractDeliveryDate: updates.contractDeliveryDate ? new Date(updates.contractDeliveryDate) : null, + shippingPort: updates.shippingPort, + destinationPort: updates.destinationPort, + isPriceAdjustmentApplicable: updates.isPriceAdjustmentApplicable, + sparePartOptions: updates.sparePartOptions, + updatedAt: new Date(), + } + + if (existing.length > 0) { + // 업데이트 + await tx + .update(biddingConditions) + .set(updateData) + .where(eq(biddingConditions.biddingId, biddingId)) + } else { + // 새로 생성 + await tx.insert(biddingConditions).values({ + biddingId, + ...updateData, + }) + } + + // 캐시 무효화 + revalidatePath(`/evcp/bid/${biddingId}`) + + return { + success: true, + message: '입찰 조건이 성공적으로 업데이트되었습니다.' + } + }) + } catch (error) { + console.error('Error updating bidding conditions:', error) + return { + success: false, + error: error instanceof Error ? error.message : '입찰 조건 업데이트 중 오류가 발생했습니다.' + } + } }
\ No newline at end of file |
