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.ts143
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