diff options
Diffstat (limited to 'db')
| -rw-r--r-- | db/schema/fileSystem.ts | 4 | ||||
| -rw-r--r-- | db/schema/index.ts | 1 | ||||
| -rw-r--r-- | db/schema/project-doc-templates.ts | 124 |
3 files changed, 127 insertions, 2 deletions
diff --git a/db/schema/fileSystem.ts b/db/schema/fileSystem.ts index a66e3180..0ce47c87 100644 --- a/db/schema/fileSystem.ts +++ b/db/schema/fileSystem.ts @@ -67,8 +67,8 @@ export const fileItems = pgTable("file_items", { // 파일 정보 mimeType: varchar("mime_type", { length: 255 }), size: bigint("size", { mode: "number" }).default(0).notNull(), - filePath: text("file_path"), // S3 키 또는 로컬 경로 - fileUrl: text("file_url"), // 직접 접근 URL (CDN 등) + filePath: text("file_path"), + fileUrl: text("file_url"), // 권한 카테고리 (외부 사용자용) category: fileCategoryEnum("category").default("confidential").notNull(), diff --git a/db/schema/index.ts b/db/schema/index.ts index 61d477e6..384c6e9c 100644 --- a/db/schema/index.ts +++ b/db/schema/index.ts @@ -43,6 +43,7 @@ export * from './rfqVendor'; export * from './generalContract'; export * from './rfqLastTBE'; export * from './pcr'; +export * from './project-doc-templates'; export * from './permissions'; diff --git a/db/schema/project-doc-templates.ts b/db/schema/project-doc-templates.ts new file mode 100644 index 00000000..6ec9500a --- /dev/null +++ b/db/schema/project-doc-templates.ts @@ -0,0 +1,124 @@ +// db/schema/project-doc-templates.ts +import { pgTable, serial, varchar, text, timestamp, boolean, integer, jsonb, AnyPgColumn } from "drizzle-orm/pg-core"; +import { relations } from "drizzle-orm"; +import { projects } from "./projects"; +import { users } from "./users"; + +// 프로젝트 문서 템플릿 테이블 +export const projectDocTemplates = pgTable("project_doc_templates", { + id: serial("id").primaryKey(), + + // 템플릿 기본 정보 + templateName: varchar("template_name", { length: 255 }).notNull(), + templateCode: varchar("template_code", { length: 100 }).unique().notNull(), + description: text("description"), + + // 프로젝트 정보 (선택적 - 전사 템플릿인 경우 null) + projectId: integer("project_id").references(() => projects.id), + projectCode: varchar("project_code", { length: 50 }), + projectName: varchar("project_name", { length: 255 }), + + // 템플릿 타입 + templateType: varchar("template_type", { length: 50 }).notNull().default("PROJECT"), // PROJECT, COMPANY_WIDE + documentType: varchar("document_type", { length: 100 }).notNull(), // CONTRACT, SPECIFICATION, REPORT, etc. + + // 파일 정보 + filePath: text("file_path").notNull(), + fileName: varchar("file_name", { length: 255 }).notNull(), + fileSize: integer("file_size"), + mimeType: varchar("mime_type", { length: 100 }), + + // 버전 관리 + version: integer("version").notNull().default(1), + isLatest: boolean("is_latest").notNull().default(true), + parentTemplateId: integer("parent_template_id").references((): AnyPgColumn => projectDocTemplates.id), + + // 변수 정보 + variables: jsonb("variables").$type<DocTemplateVariable[]>().notNull().default([]), + requiredVariables: jsonb("required_variables").$type<string[]>().notNull().default([]), + + // 사용 권한 및 상태 + status: varchar("status", { length: 20 }).notNull().default("ACTIVE"), // ACTIVE, INACTIVE, DRAFT, ARCHIVED + isPublic: boolean("is_public").notNull().default(false), // 다른 프로젝트에서도 사용 가능 여부 + requiresApproval: boolean("requires_approval").notNull().default(false), + + // 감사 필드 + createdBy: integer('created_by').references(() => users.id), // 생성자 + createdByName: varchar("created_by_name", { length: 50 }), // 생성자 + + updatedBy: integer('updated_by').references(() => users.id), // 수정자 + updatedByName: varchar("updated_by_name", { length: 50 }), // 생성자 + + createdAt: timestamp("created_at").notNull().defaultNow(), + updatedAt: timestamp("updated_at").notNull().defaultNow(), + deletedAt: timestamp("deleted_at"), +}); + +// 템플릿 변수 타입 +export type DocTemplateVariable = { + name: string; + displayName: string; + type: "text" | "number" | "date" | "select"; + required: boolean; + defaultValue?: string; + options?: string[]; // select 타입인 경우 + description?: string; + validation?: { + pattern?: string; + min?: number; + max?: number; + }; +}; + +// 템플릿 사용 이력 테이블 +export const projectDocTemplateUsage = pgTable("project_doc_template_usage", { + id: serial("id").primaryKey(), + templateId: integer("template_id").notNull().references(() => projectDocTemplates.id), + + // 생성된 문서 정보 + generatedDocumentId: varchar("generated_document_id", { length: 100 }).unique(), + generatedFilePath: text("generated_file_path"), + generatedFileName: varchar("generated_file_name", { length: 255 }), + + // 사용된 변수 값 + usedVariables: jsonb("used_variables").$type<Record<string, any>>(), + + // 프로젝트 정보 + usedInProjectId: integer("used_in_project_id"), + usedInProjectCode: varchar("used_in_project_code", { length: 50 }), + + // 사용자 정보 + usedBy: varchar("used_by", { length: 100 }), + usedAt: timestamp("used_at").notNull().defaultNow(), + + // 추가 메타데이터 + metadata: jsonb("metadata"), +}); + + +// Relations +export const projectDocTemplatesRelations = relations(projectDocTemplates, ({ one, many }) => ({ + project: one(projects, { + fields: [projectDocTemplates.projectId], + references: [projects.id], + }), + parentTemplate: one(projectDocTemplates, { + fields: [projectDocTemplates.parentTemplateId], + references: [projectDocTemplates.id], + }), + childTemplates: many(projectDocTemplates), + usageHistory: many(projectDocTemplateUsage), +})); + +export const projectDocTemplateUsageRelations = relations(projectDocTemplateUsage, ({ one }) => ({ + template: one(projectDocTemplates, { + fields: [projectDocTemplateUsage.templateId], + references: [projectDocTemplates.id], + }), +})); + +// 타입 정의 +export type ProjectDocTemplate = typeof projectDocTemplates.$inferSelect; +export type NewProjectDocTemplate = typeof projectDocTemplates.$inferInsert; +export type ProjectDocTemplateUsage = typeof projectDocTemplateUsage.$inferSelect; +export type NewProjectDocTemplateUsage = typeof projectDocTemplateUsage.$inferInsert;
\ No newline at end of file |
