From ef4c533ebacc2cdc97e518f30e9a9350004fcdfb Mon Sep 17 00:00:00 2001 From: dujinkim Date: Mon, 28 Apr 2025 02:13:30 +0000 Subject: ~20250428 작업사항 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- db/schema/basicContractDocumnet.ts | 75 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 db/schema/basicContractDocumnet.ts (limited to 'db/schema/basicContractDocumnet.ts') diff --git a/db/schema/basicContractDocumnet.ts b/db/schema/basicContractDocumnet.ts new file mode 100644 index 00000000..ce22fdc9 --- /dev/null +++ b/db/schema/basicContractDocumnet.ts @@ -0,0 +1,75 @@ +import { pgTable, pgView, text, timestamp, integer, varchar } from 'drizzle-orm/pg-core'; +import { vendors } from './vendors'; +import { eq, sql } from "drizzle-orm"; +import { users } from './users'; + +export const basicContractTemplates = pgTable('basic_contract_templates', { + id: integer("id").primaryKey().generatedAlwaysAsIdentity(), + templateName: text('template_name').notNull(), + status: text('status').notNull().default('ACTIVE'), // ACTIVE, DISPOSED + fileName: varchar("file_name", { length: 255 }).notNull(), + filePath: varchar("file_path", { length: 1024 }).notNull(), + createdAt: timestamp('created_at').defaultNow(), + updatedAt: timestamp('updated_at').defaultNow(), + validityPeriod: integer('validity_period'), // 계약 유효기간(개월) - 새로 추가할 필드 + +}); + +export const basicContract = pgTable('basic_contract', { + id: integer("id").primaryKey().generatedAlwaysAsIdentity(), + templateId: integer('template_id').references(() => basicContractTemplates.id), + vendorId: integer('vendor_id').references(() => vendors.id), + requestedBy: integer('requested_by').references(() => users.id), + status: text('status').notNull().default('PENDING'), // PENDING, COMPLETED, REJECTED + fileName: varchar("file_name", { length: 255 }).notNull(), + filePath: varchar("file_path", { length: 1024 }).notNull(), + createdAt: timestamp('created_at').defaultNow(), + updatedAt: timestamp('updated_at').defaultNow(), + completedAt: timestamp('completed_at'), // 계약 체결 완료 날짜 - 새로 추가할 필드 + +}); + + +// 기본 계약 요청 뷰 +export const basicContractView = pgView('basic_contract_view').as((qb) => { + return qb + .select({ + // 기본 계약 정보 + id: sql`${basicContract.id}`.as('id'), + templateId: sql`${basicContract.templateId}`.as('template_id'), + vendorId: sql`${basicContract.vendorId}`.as('vendor_id'), + requestedBy: sql`${basicContract.requestedBy}`.as('requested_by'), + status: sql`${basicContract.status}`.as('basic_contract_status'), + createdAt: sql`${basicContract.createdAt}`.as('created_at'), + updatedAt: sql`${basicContract.updatedAt}`.as('updated_at'), + completedAt: sql`${basicContract.updatedAt}`.as('completed_at'), + + // 벤더 정보 + vendorCode: sql`${vendors.vendorCode}`.as('vendor_code'), + vendorEmail: sql`${vendors.email}`.as('vendor_email'), + vendorName: sql`${vendors.vendorName}`.as('vendor_name'), + + // 사용자 정보 + userName: sql`${users.name}`.as('user_name'), + + // 템플릿 정보 + templateName: sql`${basicContractTemplates.templateName}`.as('template_name'), + validityPeriod: sql`${basicContractTemplates.validityPeriod}`.as('validityPeriod'), + + filePath: sql`${basicContractTemplates.filePath}`.as('file_path'), + fileName: sql`${basicContractTemplates.fileName}`.as('file_name'), + + signedFilePath: sql`${basicContract.filePath}`.as('signed_file_path'), + + }) + .from(basicContract) + .leftJoin(vendors, eq(basicContract.vendorId, vendors.id)) + .leftJoin(users, eq(basicContract.requestedBy, users.id)) + .leftJoin(basicContractTemplates, eq(basicContract.templateId, basicContractTemplates.id)); +}); + +// 타입 정의 +export type BasicContractTemplate = typeof basicContractTemplates.$inferSelect; +export type BasicContract = typeof basicContract.$inferSelect; +export type BasicContractView = typeof basicContractView.$inferSelect; + -- cgit v1.2.3