summaryrefslogtreecommitdiff
path: root/db
diff options
context:
space:
mode:
Diffstat (limited to 'db')
-rw-r--r--db/schema/basicContractDocumnet.ts12
-rw-r--r--db/schema/compliance.ts7
-rw-r--r--db/schema/pq.ts29
-rw-r--r--db/schema/vendors.ts6
4 files changed, 48 insertions, 6 deletions
diff --git a/db/schema/basicContractDocumnet.ts b/db/schema/basicContractDocumnet.ts
index e571c7e0..7c8d4bc5 100644
--- a/db/schema/basicContractDocumnet.ts
+++ b/db/schema/basicContractDocumnet.ts
@@ -7,6 +7,7 @@ import { rfqLastVendorResponses } from './rfqVendor';
import { rfqLastDetails } from './rfqLast';
import { generalContracts } from './generalContract';
import { legalWorks } from './legal';
+import { vendorPQSubmissions } from './pq';
export const basicContractTemplates = pgTable('basic_contract_templates', {
id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
@@ -42,6 +43,10 @@ export const basicContract = pgTable('basic_contract', {
biddingCompanyId: integer('bidding_company_id').references(() => biddingCompanies.id),
rfqCompanyId: integer('rfq_company_id').references(() => rfqLastDetails.id),
generalContractId: integer('general_contract_id').references(() => generalContracts.id),
+ pqSubmissionId: integer('pq_submission_id').references(() => vendorPQSubmissions.id, {
+ onDelete: "cascade",
+ onUpdate: "cascade",
+ }),
requestedBy: integer('requested_by').references(() => users.id),
// 상태값을 더 세분화
@@ -88,6 +93,8 @@ export const basicContractView = pgView('basic_contract_view').as((qb) => {
vendorId: sql<number | null>`${basicContract.vendorId}`.as('vendor_id'),
requestedBy: sql<number | null>`${basicContract.requestedBy}`.as('requested_by'),
status: sql<string>`${basicContract.status}`.as('basic_contract_status'),
+ pqSubmissionId: sql<number | null>`${basicContract.pqSubmissionId}`.as('pq_submission_id'),
+ pqNumber: sql<string | null>`${vendorPQSubmissions.pqNumber}`.as('pq_number'),
//견적,입찰, 계약
rfqCompanyId: sql<number | null>`${basicContract.rfqCompanyId}`.as('rfq_company_id'),
@@ -156,7 +163,8 @@ export const basicContractView = pgView('basic_contract_view').as((qb) => {
.from(basicContract)
.leftJoin(vendors, eq(basicContract.vendorId, vendors.id))
.leftJoin(users, eq(basicContract.requestedBy, users.id))
- .leftJoin(basicContractTemplates, eq(basicContract.templateId, basicContractTemplates.id));
+ .leftJoin(basicContractTemplates, eq(basicContract.templateId, basicContractTemplates.id))
+ .leftJoin(vendorPQSubmissions, eq(basicContract.pqSubmissionId, vendorPQSubmissions.id));
});
// 타입 정의
@@ -276,6 +284,8 @@ export type BasicContractTemplateStatsView = typeof basicContractTemplateStatsVi
export const buyerSignatures = pgTable('buyer_signatures', {
id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
name: varchar('name', { length: 255 }).notNull().default('삼성중공업'),
+ shiAddress: text('shi_address'),
+ shiCeoName: varchar('shi_ceo_name', { length: 255 }),
imageUrl: text('image_url').notNull(),
dataUrl: text('data_url'), // Base64 데이터
mimeType: varchar('mime_type', { length: 100 }),
diff --git a/db/schema/compliance.ts b/db/schema/compliance.ts
index 09d945d1..efad9bf0 100644
--- a/db/schema/compliance.ts
+++ b/db/schema/compliance.ts
@@ -82,11 +82,12 @@ export const complianceResponseFiles = pgTable('compliance_response_files', {
uploadedAt: timestamp('uploaded_at').defaultNow(),
});
-// 7. 레드플래그 담당자 관리
+// 7. 담당자 관리(레드플래그, 준법, 안전)
export const redFlagManagers = pgTable('red_flag_managers', {
id: serial('id').primaryKey(),
purchasingManagerId: integer('purchasing_manager_id').references(() => users.id), // 구매기획 담당자
complianceManagerId: integer('compliance_manager_id').references(() => users.id), // 준법 담당자
+ hseManagerId: integer('hse_manager_id').references(() => users.id), // 안전(HSE) 담당자
createdAt: timestamp('created_at').defaultNow(),
updatedAt: timestamp('updated_at').defaultNow(),
});
@@ -158,6 +159,10 @@ export const redFlagManagersRelations = relations(redFlagManagers, ({ one }) =>
fields: [redFlagManagers.complianceManagerId],
references: [users.id],
}),
+ hseManager: one(users, {
+ fields: [redFlagManagers.hseManagerId],
+ references: [users.id],
+ }),
}));
// 타입 정의
diff --git a/db/schema/pq.ts b/db/schema/pq.ts
index a9d92953..33f095c4 100644
--- a/db/schema/pq.ts
+++ b/db/schema/pq.ts
@@ -63,6 +63,23 @@ export const pqCriterias = pgTable("pq_criterias", {
.notNull()
.default("TEXT"),
+ // 내자/외자/내외자 구분 (nullable, 기본값: 내외자)
+ type: varchar("type", { length: 20 }).default("내외자"),
+
+ createdAt: timestamp("created_at").defaultNow().notNull(),
+ updatedAt: timestamp("updated_at").defaultNow().notNull(),
+});
+
+// PQ 기준 첨부파일
+export const pqCriteriasAttachments = pgTable("pq_criterias_attachments", {
+ id: serial("id").primaryKey(),
+ pqCriteriaId: integer("pq_criteria_id")
+ .notNull()
+ .references(() => pqCriterias.id, { onDelete: "cascade", onUpdate: "cascade" }),
+ fileName: varchar("file_name", { length: 255 }).notNull(),
+ originalFileName: varchar("original_file_name", { length: 255 }),
+ filePath: varchar("file_path", { length: 1024 }).notNull(),
+ fileSize: integer("file_size"),
createdAt: timestamp("created_at").defaultNow().notNull(),
updatedAt: timestamp("updated_at").defaultNow().notNull(),
});
@@ -132,10 +149,12 @@ export const vendorPQSubmissions = pgTable("vendor_pq_submissions", {
status: varchar("status", {
length: 20,
enum: [
- "REQUESTED", // PQ 요청됨
- "SUBMITTED", // PQ 제출됨
- "APPROVED", // PQ 승인됨
- "REJECTED", // PQ 거절됨
+ "REQUESTED", // PQ 요청됨
+ "SUBMITTED", // PQ 제출됨
+ "SAFETY_APPROVED", // 안전 승인됨
+ "SAFETY_REJECTED", // 안전 거절됨
+ "APPROVED", // PQ 승인됨
+ "REJECTED", // PQ 거절됨
"QM_REVIEWING", // QM 검토중
"QM_APPROVED", // QM 승인됨
"QM_REJECTED" // QM 거절됨
@@ -416,9 +435,11 @@ export const vendorInvestigationsView = pgView(
// Essential vendor fields
vendorName: vendors.vendorName,
vendorCode: vendors.vendorCode,
+ vendorCountry: vendors.country,
// PQ 정보
pqItems: vendorPQSubmissions.pqItems,
+ pqType: vendorPQSubmissions.type,
pqNumber: vendorPQSubmissions.pqNumber,
// User names and emails instead of just IDs
diff --git a/db/schema/vendors.ts b/db/schema/vendors.ts
index c194cf61..79ac994b 100644
--- a/db/schema/vendors.ts
+++ b/db/schema/vendors.ts
@@ -64,6 +64,9 @@ export const vendors = pgTable("vendors", {
creditRating: varchar("credit_rating", { length: 50 }),
cashFlowRating: varchar("cash_flow_rating", { length: 50 }),
+ // 안전적격성 평가 통과 여부 (null: 해당없음, true: 승인, false: 거절)
+ safetyQualificationPassed: boolean("safety_qualification_passed"),
+
businessSize: varchar("business_size", { length: 255 }), // 기업규모
// 성조회 가입여부: 공제회 가입여부이며, 구매에서 직접 입력하겠다는 값임. 'E'=해당없음, 'Y'=가입, 'N'=미가입, null='-'
@@ -540,6 +543,9 @@ export const vendorsWithTypesAndMaterialsView = pgView("vendors_with_types_and_m
END
`.as("vendor_category"),
+ // 안전적격성 평가 통과 여부
+ safetyQualificationPassed: sql<boolean | null>`${vendors.safetyQualificationPassed}`.as("safety_qualification_passed"),
+
// 업체대표품목 1, 2, 3 - isConfirmed = true를 우선적으로, 그 다음 false 순으로 정렬
primaryMaterial1: sql<string>`
(SELECT CASE