summaryrefslogtreecommitdiff
path: root/db/schema/avl/avl.ts
blob: addbba949932a40270bca7a3120664978956bee2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import { pgTable, text, boolean, integer, timestamp, varchar, decimal } from "drizzle-orm/pg-core";
import { createInsertSchema, createSelectSchema } from "drizzle-zod";

// AVL 리스트 테이블 (프로젝트 AVL 및 선종별 표준 AVL 리스트)
export const avlList = pgTable("avl_list", {
  // 기본 식별자
  id: integer("id").primaryKey().generatedAlwaysAsIdentity(),

  // 구분자
  isTemplate: boolean("is_template").default(false), // false: 프로젝트 AVL, true: 표준 AVL

  // 기본 정보
  constructionSector: varchar("construction_sector", { length: 10 }).notNull(), // 조선/해양
  projectCode: varchar("project_code", { length: 50 }), // 프로젝트코드 (프로젝트 AVL일 경우)
  shipType: varchar("ship_type", { length: 50 }), // 선종
  avlKind: varchar("avl_kind", { length: 50 }), // AVL 종류
  htDivision: varchar("ht_division", { length: 10 }), // H=Hull, T=Top, 공통
  rev: integer("rev").default(1), // 리비전 정보

  // 타임스탬프
  createdAt: timestamp("created_at").defaultNow(), // 등재일
  createdBy: varchar("created_by", { length: 50 }), // 등재자
  updatedAt: timestamp("updated_at").defaultNow(), // 최종변경일
  updatedBy: varchar("updated_by", { length: 50 }), // 최종변경자
});

// AVL별 자재그룹 취급사 정보 테이블
export const avlVendorInfo = pgTable("avl_vendor_info", {
  // 기본 식별자
  id: integer("id").primaryKey().generatedAlwaysAsIdentity(),

  projectCode: varchar("project_code", { length: 50 }), // 프로젝트코드 (프로젝트 AVL일 경우)

  // AVL 리스트와의 관계 (외래키)
  avlListId: integer("avl_list_id").references(() => avlList.id),

  // 제안방향
  ownerSuggestion: boolean("owner_suggestion").default(false), // 선주 제안사인 경우
  shiSuggestion: boolean("shi_suggestion").default(false), // SHI 제안사인 경우

  // 설계 정보
  equipBulkDivision: varchar("equip_bulk_division", { length: 1 }), // E 또는 B
  disciplineCode: varchar("discipline_code", { length: 10 }), // 설계공종코드
  disciplineName: varchar("discipline_name", { length: 50 }), // 설계공종명

  // 자재 정보
  materialNameCustomerSide: varchar("material_name_customer_side", { length: 100 }), // 고객사 AVL 자재명

  // 패키지 정보
  packageCode: varchar("package_code", { length: 50 }), // 패키지 코드
  packageName: varchar("package_name", { length: 100 }), // 패키지 명

  // 자재그룹 정보
  materialGroupCode: varchar("material_group_code", { length: 50 }), // 자재그룹 코드
  materialGroupName: varchar("material_group_name", { length: 100 }), // 자재그룹 명

  // 협력업체 정보
  vendorId: integer("vendor_id"), // 협력업체 ID (nullable - 없는 경우도 있음)
  vendorName: varchar("vendor_name", { length: 100 }), // 협력업체 명
  vendorCode: varchar("vendor_code", { length: 50 }), // 협력업체 코드

  // AVL 정보
  avlVendorName: varchar("avl_vendor_name", { length: 100 }), // AVL 등재업체명
  tier: varchar("tier", { length: 20 }), // 등급

  // FA 정보
  faTarget: boolean("fa_target").default(false), // FA 대상
  faStatus: varchar("fa_status", { length: 50 }), // FA 현황

  // Agent 정보
  isAgent: boolean("is_agent").default(false), // Agent 여부

  // 계약 서명주체
  contractSignerId: integer("contract_signer_id"), // 계약서명주체 ID (nullable)
  contractSignerName: varchar("contract_signer_name", { length: 100 }), // 계약서명주체 명
  contractSignerCode: varchar("contract_signer_code", { length: 50 }), // 계약서명주체 코드

  // 위치 정보
  headquarterLocation: varchar("headquarter_location", { length: 50 }), // 본사 위치 (국가)
  manufacturingLocation: varchar("manufacturing_location", { length: 50 }), // 제작/선적지 (국가)

  // SHI Qualification
  hasAvl: boolean("has_avl").default(false), // AVL
  isBlacklist: boolean("is_blacklist").default(false), // Blacklist
  isBcc: boolean("is_bcc").default(false), // BCC

  // 기술영업 견적결과
  techQuoteNumber: varchar("tech_quote_number", { length: 50 }), // 기술영업 견적번호
  quoteCode: varchar("quote_code", { length: 50 }), // 견적서 Code
  quoteVendorId: integer("quote_vendor_id"), // 견적 협력업체 ID (nullable)
  quoteVendorName: varchar("quote_vendor_name", { length: 100 }), // 견적 협력업체 명
  quoteVendorCode: varchar("quote_vendor_code", { length: 50 }), // 견적 협력업체 코드
  quoteCountry: varchar("quote_country", { length: 50 }), // 국가
  quoteTotalAmount: decimal("quote_total_amount", { precision: 15, scale: 2 }), // 총 금액
  quoteReceivedDate: varchar("quote_received_date", { length: 10 }), // 견적접수일 (YYYY-MM-DD)

  // 업체 실적 현황
  recentQuoteDate: varchar("recent_quote_date", { length: 10 }), // 최근견적일 (YYYY-MM-DD)
  recentQuoteNumber: varchar("recent_quote_number", { length: 50 }), // 최근견적번호
  recentOrderDate: varchar("recent_order_date", { length: 10 }), // 최근발주일 (YYYY-MM-DD)
  recentOrderNumber: varchar("recent_order_number", { length: 50 }), // 최근발주번호

  // 기타
  remark: varchar("remark", { length: 1000 }), // 비고

  // 타임스탬프
  createdAt: timestamp("created_at").defaultNow(),
  updatedAt: timestamp("updated_at").defaultNow(),
});

// Zod 스키마 생성
export const insertAvlListSchema = createInsertSchema(avlList);
export const selectAvlListSchema = createSelectSchema(avlList);
export const insertAvlVendorInfoSchema = createInsertSchema(avlVendorInfo);
export const selectAvlVendorInfoSchema = createSelectSchema(avlVendorInfo);

// 타입 추론
export type AvlList = typeof avlList.$inferSelect;
export type NewAvlList = typeof avlList.$inferInsert;
export type AvlVendorInfo = typeof avlVendorInfo.$inferSelect;
export type NewAvlVendorInfo = typeof avlVendorInfo.$inferInsert;