diff options
Diffstat (limited to 'db')
| -rw-r--r-- | db/schema/basicContractDocumnet.ts | 12 | ||||
| -rw-r--r-- | db/schema/compliance.ts | 7 | ||||
| -rw-r--r-- | db/schema/pq.ts | 29 | ||||
| -rw-r--r-- | db/schema/vendors.ts | 6 |
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 |
