summaryrefslogtreecommitdiff
path: root/db/schema
diff options
context:
space:
mode:
Diffstat (limited to 'db/schema')
-rw-r--r--db/schema/rfqLast.ts8
-rw-r--r--db/schema/rfqVendor.ts82
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],
+ }),
})
);