summaryrefslogtreecommitdiff
path: root/db/schema
diff options
context:
space:
mode:
authorjoonhoekim <26rote@gmail.com>2025-07-23 06:06:27 +0000
committerjoonhoekim <26rote@gmail.com>2025-07-23 06:06:27 +0000
commitf9bfc82880212e1a13f6bbb28ecfc87b89346f26 (patch)
treeee792f340ebfa7eaf30d2e79f99f41213e5c5cf3 /db/schema
parentedc0eabc8f5fc44408c28023ca155bd73ddf8183 (diff)
(김준회) 메뉴접근제어(부서별) 메뉴 구현
Diffstat (limited to 'db/schema')
-rw-r--r--db/schema/departmentDomainAssignments.ts88
1 files changed, 88 insertions, 0 deletions
diff --git a/db/schema/departmentDomainAssignments.ts b/db/schema/departmentDomainAssignments.ts
new file mode 100644
index 00000000..5a391578
--- /dev/null
+++ b/db/schema/departmentDomainAssignments.ts
@@ -0,0 +1,88 @@
+import {
+ pgTable,
+ varchar,
+ timestamp,
+ integer,
+ text,
+ boolean
+} from "drizzle-orm/pg-core";
+
+// 부서별 도메인 할당 정보 테이블
+export const departmentDomainAssignments = pgTable("department_domain_assignments", {
+ id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
+
+ // 부서 정보 (Knox 조직과 연결되지만 FK 제약조건은 걸지 않음)
+ companyCode: varchar("company_code", { length: 10 }).notNull(),
+ departmentCode: varchar("department_code", { length: 50 }).notNull(),
+ departmentName: varchar("department_name", { length: 255 }).notNull(), // 검색 편의를 위해 저장
+
+ // 할당할 도메인 (users.domain enum과 동일)
+ assignedDomain: varchar("assigned_domain", {
+ length: 20,
+ enum: ["pending", "evcp", "procurement", "sales", "engineering", "partners"]
+ }).notNull(),
+
+ // 할당 설정 상태
+ isActive: boolean("is_active").notNull().default(true),
+
+ // 메타데이터
+ description: text("description"), // 할당 이유나 설명
+ createdBy: integer("created_by"), // 생성자 (users.id 참조하지만 FK는 걸지 않음)
+ updatedBy: integer("updated_by"), // 수정자
+
+ createdAt: timestamp("created_at").defaultNow().notNull(),
+ updatedAt: timestamp("updated_at").defaultNow().notNull(),
+});
+
+// 고립된 레코드 관리를 위한 매핑 테이블 (추후 구현용)
+export const departmentDomainMappings = pgTable("department_domain_mappings", {
+ id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
+
+ // 기존 할당 레코드 참조
+ assignmentId: integer("assignment_id").notNull(),
+
+ // 기존 부서 정보 (더 이상 Knox에 존재하지 않는 부서)
+ oldCompanyCode: varchar("old_company_code", { length: 10 }).notNull(),
+ oldDepartmentCode: varchar("old_department_code", { length: 50 }).notNull(),
+ oldDepartmentName: varchar("old_department_name", { length: 255 }),
+
+ // 새로운 부서 정보 (현재 Knox에 존재하는 부서)
+ newCompanyCode: varchar("new_company_code", { length: 10 }),
+ newDepartmentCode: varchar("new_department_code", { length: 50 }),
+ newDepartmentName: varchar("new_department_name", { length: 255 }),
+
+ // 매핑 상태
+ mappingStatus: varchar("mapping_status", {
+ length: 20,
+ enum: ["pending", "mapped", "rejected"]
+ }).notNull().default("pending"),
+
+ mappedBy: integer("mapped_by"), // 매핑 처리자
+ mappedAt: timestamp("mapped_at"),
+
+ createdAt: timestamp("created_at").defaultNow().notNull(),
+ updatedAt: timestamp("updated_at").defaultNow().notNull(),
+});
+
+// 할당 이력 추적 테이블 (감사 목적)
+export const departmentDomainAssignmentHistory = pgTable("department_domain_assignment_history", {
+ id: integer("id").primaryKey().generatedAlwaysAsIdentity(),
+
+ assignmentId: integer("assignment_id").notNull(),
+
+ // 변경 정보
+ action: varchar("action", {
+ length: 20,
+ enum: ["created", "updated", "deleted", "activated", "deactivated"]
+ }).notNull(),
+
+ // 변경 전후 값 (JSON으로 저장)
+ previousValues: text("previous_values"), // JSON string
+ newValues: text("new_values"), // JSON string
+
+ // 변경자 정보
+ changedBy: integer("changed_by"),
+ changeReason: text("change_reason"),
+
+ createdAt: timestamp("created_at").defaultNow().notNull(),
+}); \ No newline at end of file