diff options
Diffstat (limited to 'db/schema')
| -rw-r--r-- | db/schema/rfqLast.ts | 8 | ||||
| -rw-r--r-- | db/schema/rfqVendor.ts | 82 |
2 files changed, 84 insertions, 6 deletions
diff --git a/db/schema/rfqLast.ts b/db/schema/rfqLast.ts index b4ec968b..19c213c0 100644 --- a/db/schema/rfqLast.ts +++ b/db/schema/rfqLast.ts @@ -14,7 +14,8 @@ export type RfqStatus = | "TBE 완료" | "RFQ 발송" | "견적접수" - | "최종업체선정"; + | "최종업체선정" + | "RFQ 삭제"; export const rfqsLast = pgTable( @@ -96,6 +97,9 @@ export const rfqsLast = pgTable( // SS = 시리즈 통합, II = 품목 통합, 공란 = 통합 없음 series: varchar("series", { length: 50 }), + // RFQ 삭제 사유 + deleteReason: text("delete_reason"), + }, ); @@ -296,6 +300,7 @@ export const rfqsLastView = pgView("rfqs_last_view").as((qb) => { // Basic RFQ identification id: sql<number>`${rfqsLast.id}`.as("id"), rfqCode: sql<string>`${rfqsLast.rfqCode}`.as("rfq_code"), + ANFNR: sql<string | null>`${rfqsLast.ANFNR}`.as("ANFNR"), series: sql<string | null>`${rfqsLast.series}`.as("series"), rfqSealedYn: sql<boolean | null>`${rfqsLast.rfqSealedYn}`.as("rfq_sealed_yn"), @@ -384,6 +389,7 @@ export const rfqsLastView = pgView("rfqs_last_view").as((qb) => { updatedAt: sql<Date>`${rfqsLast.updatedAt}`.as("updated_at"), remark: sql<string | null>`${rfqsLast.remark}`.as("remark"), + deleteReason: sql<string | null>`${rfqsLast.deleteReason}`.as("delete_reason"), // PR Items related information majorItemMaterialCode: sql<string | null>`( 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], + }), }) ); |
