feat: team org panel, admin CRUD, local deploy tools, bidirectional data sync

Add TeamMember model and APIs, team status UI, /admin page, local server bats,
and scripts to sync data between local PostgreSQL and Render.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
EENE Dashboard
2026-06-06 01:41:00 +09:00
parent d14ff1997c
commit fb2956b0ac
45 changed files with 4104 additions and 376 deletions

View File

@@ -29,6 +29,29 @@ model User {
@@map("users")
}
// ─── 팀 인원 (조직도 마스터) ─────────────────────────────────
model TeamMember {
id String @id @default(cuid())
name String
rank String? // 직급 (수석연구원, 선임연구원 등)
role String? // 직책 (팀장, 셀장, 팀원 등)
cell String? // 셀 (HR, 총무, 리더 — 리더/빈값이면 상단 팀장 영역)
contact String?
photoUrl String?
sortOrder Int @default(0)
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
pmTasks Task[] @relation("PmTasks")
taskAssignees TaskAssignee[]
@@index([cell])
@@index([isActive])
@@map("team_members")
}
enum Role {
ADMIN
MANAGER
@@ -60,11 +83,14 @@ model Task {
keywords String?
creatorId String
assigneeId String?
pmMemberId String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
creator User @relation("CreatedTasks", fields: [creatorId], references: [id])
assignee User? @relation("AssignedTasks", fields: [assigneeId], references: [id])
pmMember TeamMember? @relation("PmTasks", fields: [pmMemberId], references: [id])
taskAssignees TaskAssignee[]
details TaskDetail[]
kpiMetrics KpiMetric[]
files File[]
@@ -73,10 +99,23 @@ model Task {
@@index([quarter])
@@index([status])
@@index([assigneeId])
@@index([pmMemberId])
@@index([section])
@@map("tasks")
}
model TaskAssignee {
taskId String
memberId String
task Task @relation(fields: [taskId], references: [id], onDelete: Cascade)
member TeamMember @relation(fields: [memberId], references: [id], onDelete: Cascade)
@@id([taskId, memberId])
@@index([memberId])
@@map("task_assignees")
}
enum TaskStatus {
TODO
IN_PROGRESS