diff options
Diffstat (limited to 'db/schema/rfqVendor.ts')
| -rw-r--r-- | db/schema/rfqVendor.ts | 82 |
1 files changed, 77 insertions, 5 deletions
diff --git a/db/schema/rfqVendor.ts b/db/schema/rfqVendor.ts index dea196b1..f7fcce64 100644 --- a/db/schema/rfqVendor.ts +++ b/db/schema/rfqVendor.ts @@ -1,4 +1,4 @@ -import { pgTable, pgView, serial, varchar, text, timestamp, boolean, integer, numeric, date, alias, jsonb } from "drizzle-orm/pg-core"; +import { pgTable, pgView, serial, varchar, text, timestamp, boolean, integer, numeric, date, alias, jsonb, decimal } from "drizzle-orm/pg-core"; import { eq, sql, relations,and } from "drizzle-orm"; import { rfqsLast, rfqLastDetails, rfqPrItems } from "./rfqLast"; import { users } from "./users"; @@ -30,8 +30,6 @@ export const rfqLastVendorResponses = pgTable( isLatest: boolean("is_latest").notNull().default(true), isDocumentConfirmed: boolean("is_document_confirmed").default(false), - - // 참여 여부 관련 필드 (새로 추가) participationStatus: varchar("participation_status", { length: 20 }) .$type<"미응답" | "참여" | "불참">() @@ -44,10 +42,9 @@ export const rfqLastVendorResponses = pgTable( // 응답 상태 (수정: 참여 결정 후에만 의미 있음) status: varchar("status", { length: 30 }) - .$type<"대기중" | "작성중" | "제출완료" | "수정요청" | "최종확정" | "취소">() + .$type<"대기중" | "작성중" | "제출완료" | "수정요청" | "최종확정" | "취소" | "삭제">() .notNull() .default("대기중"), - // 제출 정보 submittedAt: timestamp("submitted_at"), submittedBy: integer("submitted_by") @@ -239,6 +236,65 @@ export const rfqLastVendorResponseHistory = pgTable( ); // ========================================== +// 5. RFQ-last 연동제 폼 테이블 +// ========================================== +export const rfqLastPriceAdjustmentForms = pgTable('rfq_last_price_adjustment_forms', { + id: serial('id').primaryKey(), + + // rfqLastVendorResponses 테이블과 외래 키로 연결 + rfqLastVendorResponsesId: integer('rfq_last_vendor_responses_id') + .notNull() + .references(() => rfqLastVendorResponses.id, { onDelete: 'cascade' }), + + // 품목등의 명칭 + itemName: varchar('item_name', { length: 255 }), + + // 조정대금 반영시점 + adjustmentReflectionPoint: varchar('adjustment_reflection_point', { length: 255 }), + + // 연동대상 주요 원재료 + majorApplicableRawMaterial: text('major_applicable_raw_material'), + + // 하도급대금등 연동 산식 + adjustmentFormula: text('adjustment_formula'), + + // 원재료 가격 기준지표 + rawMaterialPriceIndex: text('raw_material_price_index'), + + // 기준시점 및 비교시점 + referenceDate: date('reference_date'), // 기준시점 + comparisonDate: date('comparison_date'), // 비교시점 + + // 연동 비율 + adjustmentRatio: decimal('adjustment_ratio', { precision: 5, scale: 2 }), // 소수점 2자리까지 + + // 기타 사항 + notes: text('notes'), + + // 조정요건 + adjustmentConditions: text('adjustment_conditions'), + + // 연동 미적용 주요 원재료 + majorNonApplicableRawMaterial: text('major_non_applicable_raw_material'), + + // 조정주기 + adjustmentPeriod: varchar('adjustment_period', { length: 100 }), + + // 수탁기업(협력사) 작성자 + contractorWriter: varchar('contractor_writer', { length: 100 }), + + // 조정일 + adjustmentDate: date('adjustment_date'), + + // 연동 미적용 사유 + nonApplicableReason: text('non_applicable_reason'), + + // 메타 정보 + createdAt: timestamp('created_at').defaultNow().notNull(), + updatedAt: timestamp('updated_at').defaultNow().notNull(), +}); + +// ========================================== // Views // ========================================== @@ -453,6 +509,22 @@ export const vendorQuotationItemsRelations = relations( quotationItems: many(rfqLastVendorQuotationItems), attachments: many(rfqLastVendorAttachments), history: many(rfqLastVendorResponseHistory), + priceAdjustmentForm: one(rfqLastPriceAdjustmentForms, { + fields: [rfqLastVendorResponses.id], + references: [rfqLastPriceAdjustmentForms.rfqLastVendorResponsesId], + relationName: "vendorResponsePriceAdjustmentForm", + }), + }) + ); + + // 연동제 폼 테이블의 relation + export const priceAdjustmentFormRelations = relations( + rfqLastPriceAdjustmentForms, + ({ one }) => ({ + vendorResponse: one(rfqLastVendorResponses, { + fields: [rfqLastPriceAdjustmentForms.rfqLastVendorResponsesId], + references: [rfqLastVendorResponses.id], + }), }) ); |
