summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-10-13 17:29:33 +0900
committerjoonhoekim <26rote@gmail.com>2025-10-13 17:29:33 +0900
commite84cf02a1cb4959a9d3bb5bbf37885c13a447f78 (patch)
treecfb2817e3bd8f5ef08b4428b9e6fc619ef3884a1 /db
parent89274bffa596ffdfc4275fb8d11cdb02ff9a2d02 (diff)
(김준회) SHI/벤더 PO 구현
Diffstat (limited to 'db')
-rw-r--r--db/schema/contract.ts214
1 files changed, 128 insertions, 86 deletions
diff --git a/db/schema/contract.ts b/db/schema/contract.ts
index 34f49c96..e2a070ec 100644
--- a/db/schema/contract.ts
+++ b/db/schema/contract.ts
@@ -15,94 +15,136 @@ import { vendorContacts, vendors } from "./vendors"
import { eq, sql } from "drizzle-orm";
import { items } from "./items";
-// ============ contracts (계약/PO 정보) ============
-export const contracts = pgTable("contracts", {
- // 주 키
- id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
-
- // 프로젝트와 협력업체 참조
- // .notNull() 제외(0912 구매 프로젝트 id 없는 계약 case 존재-최겸)
- projectId: integer("project_id")
- .references(() => projects.id, { onDelete: "cascade" }),
+/**
+ * PO 상태 << 정의서에 적어놓고 또 다르게 쓰고 있음. 신뢰가 안감
+ * ENG : KO : 의미
+ * 1. Contract Transfer : 계약번호생성 : 이 상태는 안 쓰이는 것인가?
+ * 2. Request to Review Conditions : 조건검토요청 : 조건검토를 할 수 있는 기능의 요구사항이 없음. 무시
+ * 3. Confirm to Review Conditions : 조건검토완료 : 조건검토를 할 수 있는 기능의 요구사항이 없음. 무시
+ * 4. Contract Accept Request : 계약승인요청 : PO가 들어오면 계약승인 요청으로 처리
+ * 5. Complete the Contract : 계약체결(승인) : 벤더가 PO 승인하면 이 상태로 변경
+ * 6. Reject to Accept Contract : 계약승인거절 : 벤더가 PO 거절하면 이 상태로 변경
+ * 7. Contract Delete : 계약폐기 : 계약폐기를 할 수 있는 기능의 요구사항이 없음. 중공업측에서 변경하거나 무시
+ * 8. PCR Request : PCR요청 : PCR 요청 시 이 상태로 변경
+ * 9. VO Request : VO요청 : VO 요청 기능 요구사항 없음. 요구사항이 정의되지 않은 상태임. 무시. (요구사항 정의되면 나중에 VO 요청 시 이 상태로 변경)
+ * 10. PCR Accept : PCR승인 : PCR 요청 승인 시 이 상태로 변경
+ * 11. PCR Reject : PCR거절 : PCR 요청 거절 시 이 상태로 변경
+ */
+
+// 계약 상태 enum (영어 키를 타입 안전하게 사용, i18n으로 다국어 지원)
+export enum ContractStatus {
+ CONTRACT_TRANSFER = "Contract Transfer",
+ REQUEST_TO_REVIEW_CONDITIONS = "Request to Review Conditions",
+ CONFIRM_TO_REVIEW_CONDITIONS = "Confirm to Review Conditions",
+ CONTRACT_ACCEPT_REQUEST = "Contract Accept Request",
+ COMPLETE_THE_CONTRACT = "Complete the Contract",
+ REJECT_TO_ACCEPT_CONTRACT = "Reject to Accept Contract",
+ CONTRACT_DELETE = "Contract Delete",
+ PCR_REQUEST = "PCR Request",
+ VO_REQUEST = "VO Request",
+ PCR_ACCEPT = "PCR Accept",
+ PCR_REJECT = "PCR Reject"
+}
- vendorId: integer("vendor_id")
- .notNull()
- .references(() => vendors.id, { onDelete: "cascade" }),
-
- // 계약/PO 번호(유니크)
- contractNo: varchar("contract_no", { length: 100 }).notNull().unique(), // EBELN
- contractName: varchar("contract_name", { length: 255 }).notNull(), // ZTITLE
-
- // 계약/PO 상태나 기간
- status: varchar("status", { length: 50 }).notNull().default("ACTIVE"), // ?
- startDate: date("start_date"), // 발주일(혹은 유효 시작일)
- endDate: date("end_date"), // 계약 종료일/유효 기간 등
-
- // --- SAP ECC 인터페이스 매핑 필드들 ---
- // 기본 PO 정보
- paymentTerms: text("payment_terms"), // 지급 조건 (ZTERM - 지급조건코드)
- deliveryTerms: text("delivery_terms"), // 납품 조건 (INCO1 - 인도조건코드)
- deliveryDate: date("delivery_date"), // 납품 기한 (ZPO_DLV_DT - PO납기일자, 개별 품목별)
- shippmentPlace: varchar("shippment_place", { length: 255 }), // 선적지 (ZSHIPMT_PLC_CD - 선적지코드)
- deliveryLocation: varchar("delivery_location", { length: 255 }), // 하역지 (ZUNLD_PLC_CD - 하역지코드)
-
- // SAP ECC 추가 필드들
- poVersion: integer("po_version"), // PO 버전 (ZPO_VER - 발주버전)
- purchaseDocType: varchar("purchase_doc_type", { length: 10 }), // 구매문서유형 (BSART)
- purchaseOrg: varchar("purchase_org", { length: 10 }), // 구매조직 (EKORG - 구매조직코드)
- purchaseGroup: varchar("purchase_group", { length: 10 }), // 구매그룹 (EKGRP - 구매그룹코드)
- exchangeRate: numeric("exchange_rate", { precision: 9, scale: 5 }), // 환율 (WKURS)
- poConfirmStatus: varchar("po_confirm_status", { length: 10 }), // PO확인상태 (ZPO_CNFM_STAT)
-
- // 계약/보증 관련
- contractGuaranteeCode: varchar("contract_guarantee_code", { length: 2 }), // 계약보증코드 (ZCNRT_GRNT_CD)
- defectGuaranteeCode: varchar("defect_guarantee_code", { length: 2 }), // 하자보증코드 (ZDFCT_GRNT_CD)
- guaranteePeriodCode: varchar("guarantee_period_code", { length: 2 }), // 보증기간코드 (ZGRNT_PRD_CD)
- advancePaymentYn: varchar("advance_payment_yn", { length: 1 }), // 선급금여부 (ZPAMT_YN)
-
- // 금액 관련 (KRW 변환)
- budgetAmount: numeric("budget_amount", { precision: 17, scale: 2 }), // 예산금액 (ZBGT_AMT)
- budgetCurrency: varchar("budget_currency", { length: 5 }), // 예산통화 (ZBGT_CURR)
- totalAmountKrw: numeric("total_amount_krw", { precision: 17, scale: 2 }), // 발주금액KRW (ZPO_AMT_KRW)
-
- // 전자계약/승인 관련
- electronicContractYn: varchar("electronic_contract_yn", { length: 1 }), // 전자계약필요여부 (ZELC_CNRT_ND_YN)
- electronicApprovalDate: date("electronic_approval_date"), // 전자승인일자 (ZELC_AGR_DT)
- electronicApprovalTime: varchar("electronic_approval_time", { length: 6 }), // 전자승인시간 (ZELC_AGR_TM)
- ownerApprovalYn: varchar("owner_approval_yn", { length: 1 }), // 선주승인필요여부 (ZOWN_AGR_IND_YN)
-
- // 기타
- plannedInOutFlag: varchar("planned_in_out_flag", { length: 1 }), // 계획내외구분 (ZPLN_INO_GB)
- settlementStandard: varchar("settlement_standard", { length: 1 }), // 정산기준 (ZECAL_BSE)
- weightSettlementFlag: varchar("weight_settlement_flag", { length: 1 }), // 중량정산구분 (ZWGT_ECAL_GB)
-
- // 연동제 관련
- priceIndexYn: varchar("price_index_yn", { length: 1 }), // 납품대금연동제대상여부 (ZDLV_PRICE_T)
- writtenContractNo: varchar("written_contract_no", { length: 20 }), // 서면계약번호 (ZWEBELN)
- contractVersion: integer("contract_version"), // 서면계약차수 (ZVER_NO)
-
- // 가격/금액 관련
- currency: varchar("currency", { length: 10 }).default("KRW"), // 통화 (KRW, USD 등) // ZPO_CURR
- totalAmount: numeric("total_amount", { precision: 12, scale: 2 }), // 총 계약 금액(아이템 합산 등) // ZPO_AMT
- discount: numeric("discount", { precision: 12, scale: 2 }), // 전체 할인 // 인터페이스에 없음 (개별 품목별로는 있음)
- tax: numeric("tax", { precision: 12, scale: 2 }), // 전체 세금 // 인터페이스에 없음 (개별 품목별로는 있음)
- shippingFee: numeric("shipping_fee", { precision: 12, scale: 2 }), // 배송비 // 인터페이스에 없음 (개별 품목별로는 있음)
- netTotal: numeric("net_total", { precision: 12, scale: 2 }), // (합계) - (할인) + (세금) + (배송비) // 인터페이스에 없음 (개별 품목별로는 있음)
-
- // 부분 납품/부분 결제 가능 여부
- partialShippingAllowed: boolean("partial_shipping_allowed").default(false),
- partialPaymentAllowed: boolean("partial_payment_allowed").default(false),
-
- // 추가 메모/비고
- remarks: text("remarks"), // 발주노트 1, 2가 있는데 메모용인것으로 추정
-
- // 버전 관리 (PO 재발행 등)
- version: integer("version").default(1),
+// ============ contracts (계약/PO 정보) ============
+export const contracts = pgTable('contracts', {
+ // 주 키
+ id: integer('id').primaryKey().generatedAlwaysAsIdentity(),
+
+ // 프로젝트와 협력업체 참조
+ // .notNull() 제외(0912 구매 프로젝트 id 없는 계약 case 존재-최겸)
+ projectId: integer('project_id').references(() => projects.id, {
+ onDelete: 'cascade',
+ }),
+
+ vendorId: integer('vendor_id')
+ .notNull()
+ .references(() => vendors.id, { onDelete: 'cascade' }),
+
+ // 계약/PO 번호(유니크)
+ contractNo: varchar('contract_no', { length: 100 }).notNull().unique(), // EBELN
+ contractName: varchar('contract_name', { length: 255 }).notNull(), // ZTITLE
+
+ // 계약/PO 상태나 기간
+ status: varchar('status', { length: 50 })
+ .notNull()
+ .default(ContractStatus.CONTRACT_ACCEPT_REQUEST), // default value: 'Contract Accept Request'
+ startDate: date('start_date'), // 발주일(혹은 유효 시작일)
+ endDate: date('end_date'), // 계약 종료일/유효 기간 등
+
+ // 거절사유
+ rejectionReason: varchar('rejection_reason', { length: 1000 }),
+
+ // --- SAP ECC 인터페이스 매핑 필드들 ---
+ // 기본 PO 정보
+ paymentTerms: text('payment_terms'), // 지급 조건 (ZTERM - 지급조건코드)
+ deliveryTerms: text('delivery_terms'), // 납품 조건 (INCO1 - 인도조건코드)
+ deliveryDate: date('delivery_date'), // 납품 기한 (ZPO_DLV_DT - PO납기일자, 개별 품목별)
+ shippmentPlace: varchar('shippment_place', { length: 255 }), // 선적지 (ZSHIPMT_PLC_CD - 선적지코드)
+ deliveryLocation: varchar('delivery_location', { length: 255 }), // 하역지 (ZUNLD_PLC_CD - 하역지코드)
+
+ // SAP ECC 추가 필드들
+ poVersion: integer('po_version'), // PO 버전 (ZPO_VER - 발주버전)
+ purchaseDocType: varchar('purchase_doc_type', { length: 10 }), // 구매문서유형 (BSART)
+ purchaseOrg: varchar('purchase_org', { length: 10 }), // 구매조직 (EKORG - 구매조직코드)
+ purchaseGroup: varchar('purchase_group', { length: 10 }), // 구매그룹 (EKGRP - 구매그룹코드)
+ exchangeRate: numeric('exchange_rate', { precision: 9, scale: 5 }), // 환율 (WKURS)
+ poConfirmStatus: varchar('po_confirm_status', { length: 10 }), // PO확인상태 (ZPO_CNFM_STAT)
+
+ // 계약/보증 관련
+ contractGuaranteeCode: varchar('contract_guarantee_code', { length: 2 }), // 계약보증코드 (ZCNRT_GRNT_CD)
+ defectGuaranteeCode: varchar('defect_guarantee_code', { length: 2 }), // 하자보증코드 (ZDFCT_GRNT_CD)
+ guaranteePeriodCode: varchar('guarantee_period_code', { length: 2 }), // 보증기간코드 (ZGRNT_PRD_CD)
+ advancePaymentYn: varchar('advance_payment_yn', { length: 1 }), // 선급금여부 (ZPAMT_YN)
+
+ // 금액 관련 (KRW 변환)
+ budgetAmount: numeric('budget_amount', { precision: 17, scale: 2 }), // 예산금액 (ZBGT_AMT)
+ budgetCurrency: varchar('budget_currency', { length: 5 }), // 예산통화 (ZBGT_CURR)
+ totalAmountKrw: numeric('total_amount_krw', { precision: 17, scale: 2 }), // 발주금액KRW (ZPO_AMT_KRW)
+
+ // 전자계약/승인 관련
+ electronicContractYn: varchar('electronic_contract_yn', { length: 1 }), // 전자계약필요여부 (ZELC_CNRT_ND_YN)
+ electronicApprovalDate: date('electronic_approval_date'), // 전자승인일자 (ZELC_AGR_DT)
+ electronicApprovalTime: varchar('electronic_approval_time', { length: 6 }), // 전자승인시간 (ZELC_AGR_TM)
+ ownerApprovalYn: varchar('owner_approval_yn', { length: 1 }), // 선주승인필요여부 (ZOWN_AGR_IND_YN)
+
+ // 기타
+ plannedInOutFlag: varchar('planned_in_out_flag', { length: 1 }), // 계획내외구분 (ZPLN_INO_GB)
+ settlementStandard: varchar('settlement_standard', { length: 1 }), // 정산기준 (ZECAL_BSE)
+ weightSettlementFlag: varchar('weight_settlement_flag', { length: 1 }), // 중량정산구분 (ZWGT_ECAL_GB)
+
+ // 연동제 관련
+ priceIndexYn: varchar('price_index_yn', { length: 1 }), // 납품대금연동제대상여부 (ZDLV_PRICE_T)
+ writtenContractNo: varchar('written_contract_no', { length: 20 }), // 서면계약번호 (ZWEBELN)
+ contractVersion: integer('contract_version'), // 서면계약차수 (ZVER_NO)
+
+ // 가격/금액 관련
+ currency: varchar('currency', { length: 10 }).default('KRW'), // 통화 (KRW, USD 등) // ZPO_CURR
+ totalAmount: numeric('total_amount', { precision: 12, scale: 2 }), // 총 계약 금액(아이템 합산 등) // ZPO_AMT
+ discount: numeric('discount', { precision: 12, scale: 2 }), // 전체 할인 // 인터페이스에 없음 (개별 품목별로는 있음)
+ tax: numeric('tax', { precision: 12, scale: 2 }), // 전체 세금 // 인터페이스에 없음 (개별 품목별로는 있음)
+ shippingFee: numeric('shipping_fee', { precision: 12, scale: 2 }), // 배송비 // 인터페이스에 없음 (개별 품목별로는 있음)
+ netTotal: numeric('net_total', { precision: 12, scale: 2 }), // (합계) - (할인) + (세금) + (배송비) // 인터페이스에 없음 (개별 품목별로는 있음)
+
+ // 부분 납품/부분 결제 가능 여부
+ partialShippingAllowed: boolean('partial_shipping_allowed').default(false),
+ partialPaymentAllowed: boolean('partial_payment_allowed').default(false),
+
+ // 추가 메모/비고
+ remarks: text('remarks'),
+ vendorComment: text('vendor_comment'),
+ shiComment: text('shi_comment'),
+
+ // PO 계약서 내용
+ contractContent: text('contract_content'),
+
+ // 버전 관리 (PO 재발행 등)
+ version: integer('version').default(1),
- // 생성/수정 시각
- createdAt: timestamp("created_at").defaultNow().notNull(),
- updatedAt: timestamp("updated_at").defaultNow().notNull(),
-})
+ // 생성/수정 시각
+ createdAt: timestamp('created_at').defaultNow().notNull(),
+ updatedAt: timestamp('updated_at').defaultNow().notNull(),
+});
// 타입 추론
export type Contract = typeof contracts.$inferSelect