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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user