μ½˜ν…μΈ λ‘œ 이동

πŸ—„οΈ 곡사관리 ERP β€” DB μ„€κ³„μ„œ v1

뢄홍이 ꡬ상 + 뢄홍아빠 기획 기반 λ‚˜μ€‘μ— μ œμž‘ν•˜λ©΄μ„œ μˆ˜μ •/μΆ”κ°€ μ˜ˆμ •


Company
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ name VARCHAR(100) -- νšŒμ‚¬λͺ…
β”œβ”€β”€ business_number VARCHAR(20) -- μ‚¬μ—…μžλ“±λ‘λ²ˆν˜Έ
β”œβ”€β”€ domain VARCHAR(100) -- μ „μš© 도메인
β”œβ”€β”€ address TEXT
β”œβ”€β”€ phone VARCHAR(20)
β”œβ”€β”€ email VARCHAR(100)
β”œβ”€β”€ logo_url VARCHAR(500)
β”œβ”€β”€ settings JSONB -- νšŒμ‚¬λ³„ μ„€μ •
β”œβ”€β”€ subscription ENUM(무료/κΈ°λ³Έ/프리미엄)
β”œβ”€β”€ subscription_expires TIMESTAMP
β”œβ”€β”€ is_active BOOLEAN DEFAULT TRUE
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

User
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ company_id UUID FK β†’ Company
β”œβ”€β”€ name VARCHAR(50)
β”œβ”€β”€ email VARCHAR(100) -- 둜그인ID
β”œβ”€β”€ password_hash VARCHAR(255)
β”œβ”€β”€ phone VARCHAR(20)
β”œβ”€β”€ role ENUM(κ΄€λ¦¬μž/곡사감독/ν˜„μž₯λŒ€λ¦¬/ν˜„μž₯νŒ€/κ³΅λ¬΄νŒ€)
β”œβ”€β”€ team_type ENUM(μ™Έμ„ /접속/기타) -- ν˜„μž₯νŒ€λ§Œ, λ‚˜λ¨Έμ§€ NULL
β”œβ”€β”€ is_active BOOLEAN DEFAULT TRUE
β”œβ”€β”€ last_login_at TIMESTAMP
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP
ViewerPermission
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ user_id UUID FK β†’ User
β”œβ”€β”€ page_key VARCHAR(50) -- 예: 곡사λͺ©λ‘/μžμž¬ν˜„ν™©/μ§„ν–‰μƒνƒœ
β”œβ”€β”€ can_view BOOLEAN DEFAULT TRUE
└── granted_by UUID FK β†’ User -- κ΄€λ¦¬μž

ProjectType
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ company_id UUID FK β†’ Company
β”œβ”€β”€ name VARCHAR(100) -- 예: ν†΅μ‹ μ„ λ‘œκ³΅μ‚¬, 건좕곡사
β”œβ”€β”€ description TEXT
β”œβ”€β”€ is_active BOOLEAN DEFAULT TRUE
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

ProjectTypeStage (μœ ν˜•λ³„ νŒŒμ΄ν”„λΌμΈ 단계)

μ„Ήμ…˜ 제λͺ©: β€œProjectTypeStage (μœ ν˜•λ³„ νŒŒμ΄ν”„λΌμΈ 단계)”
ProjectTypeStage
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_type_id UUID FK β†’ ProjectType
β”œβ”€β”€ stage_group ENUM(λ°œμƒ/싀사/섀계/κ²€ν† /μ§„ν–‰/ν˜„μž₯μ™„λ£Œ/쀀곡/μ™„λ£Œ)
β”œβ”€β”€ stage_name VARCHAR(100) -- 예: 곡가사전검토
β”œβ”€β”€ stage_order INT -- μ •λ ¬μˆœμ„œ
β”œβ”€β”€ is_required BOOLEAN DEFAULT TRUE
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

μ˜ˆμ‹œ (ν†΅μ‹ μ„ λ‘œκ³΅μ‚¬):

stage_groupstage_nameorder
λ°œμƒμ ‘μˆ˜1
싀사싀사2
섀계섀계3
κ²€ν† κ²€ν† (승인)4
진행곡가사전검토5
μ§„ν–‰μ„ λ‘œν¬μ„€6
μ§„ν–‰μ„ λ²ˆμ‘°μ‚¬7
μ§„ν–‰μ ˆμ²΄8
μ§„ν–‰μ„ λ‘œμ² κ±°9
ν˜„μž₯μ™„λ£Œν˜„μž₯μ™„λ£Œ10
μ€€κ³΅μ„œλ₯˜μž‘μ„±11
쀀곡곡가신청12
μ€€κ³΅μ„œλ₯˜μ ‘μˆ˜13
μ™„λ£Œμ™„λ£Œ14

Project
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ company_id UUID FK β†’ Company
β”œβ”€β”€ project_type_id UUID FK β†’ ProjectType
β”œβ”€β”€ title VARCHAR(200) -- 곡사λͺ…
β”œβ”€β”€ description TEXT
β”œβ”€β”€ location TEXT -- 곡사 μœ„μΉ˜
β”œβ”€β”€ current_stage ENUM(λ°œμƒ/싀사/섀계/κ²€ν† /μ§„ν–‰/ν˜„μž₯μ™„λ£Œ/쀀곡/μ™„λ£Œ)
β”œβ”€β”€ current_step VARCHAR(100) -- ν˜„μž¬ 진행단계λͺ…
β”œβ”€β”€ approval_status ENUM(λŒ€κΈ°/승인/μ·¨μ†Œ) DEFAULT 'λŒ€κΈ°'
β”œβ”€β”€ agent_id UUID FK β†’ User -- ν˜„μž₯λŒ€λ¦¬ (1λͺ…, ꡐ체가λŠ₯)
β”œβ”€β”€ started_at TIMESTAMP
β”œβ”€β”€ completed_at TIMESTAMP
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

ProjectTeam
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_id UUID FK β†’ Project
β”œβ”€β”€ user_id UUID FK β†’ User
β”œβ”€β”€ team_type ENUM(μ™Έμ„ /접속/기타)
β”œβ”€β”€ assigned_at TIMESTAMP
└── removed_at TIMESTAMP -- νŒ€μ—μ„œ 빠질 λ•Œ

ProjectStageLog
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_id UUID FK β†’ Project
β”œβ”€β”€ stage_group ENUM(λ°œμƒ/싀사/섀계/κ²€ν† /μ§„ν–‰/ν˜„μž₯μ™„λ£Œ/쀀곡/μ™„λ£Œ)
β”œβ”€β”€ stage_name VARCHAR(100)
β”œβ”€β”€ status ENUM(μ‹œμž‘/μ™„λ£Œ/μ·¨μ†Œ)
β”œβ”€β”€ note TEXT -- λΉ„κ³ 
β”œβ”€β”€ updated_by UUID FK β†’ User
β”œβ”€β”€ started_at TIMESTAMP
β”œβ”€β”€ completed_at TIMESTAMP
└── created_at TIMESTAMP

Material
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ company_id UUID FK β†’ Company
β”œβ”€β”€ name VARCHAR(100) -- 자재λͺ…
β”œβ”€β”€ code VARCHAR(50) -- μžμž¬μ½”λ“œ
β”œβ”€β”€ unit VARCHAR(20) -- λ‹¨μœ„ (개/m/λ“±)
β”œβ”€β”€ supply_type ENUM(사급/μ§€μž…)
β”œβ”€β”€ unit_price DECIMAL(12,2) -- 단가 (μ§€μž…λ§Œ ν•΄λ‹Ή)
β”œβ”€β”€ is_active BOOLEAN DEFAULT TRUE
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

MaterialInput
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_id UUID FK β†’ Project
β”œβ”€β”€ material_id UUID FK β†’ Material
β”œβ”€β”€ input_type ENUM(졜초/μ‚¬μš©/반영)
β”œβ”€β”€ quantity INT
β”œβ”€β”€ input_by UUID FK β†’ User
β”œβ”€β”€ team_type ENUM(μ™Έμ„ /접속/κ΄€λ¦¬μž) -- λˆ„κ°€ μž…λ ₯ν–ˆλ‚˜
β”œβ”€β”€ input_at TIMESTAMP
└── created_at TIMESTAMP
뢈용자재 = μ‚¬μš©μžμž¬ - 반영자재 (같은 project_id + material_id κΈ°μ€€)
재고 = μ΅œμ΄ˆμž…λ ₯ - μ‚¬μš©μžμž¬

Plugin
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ company_id UUID FK β†’ Company
β”œβ”€β”€ plugin_key VARCHAR(50) -- 예: 곡가신청/μ„ λ²ˆμ‘°μ‚¬κ²°κ³Ό
β”œβ”€β”€ name VARCHAR(100) -- ν‘œμ‹œλͺ…
β”œβ”€β”€ enabled BOOLEAN DEFAULT FALSE
β”œβ”€β”€ config JSONB -- ν”ŒλŸ¬κ·ΈμΈλ³„ μ„€μ •
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

ProjectTypePlugin (κ³΅μ‚¬μœ ν˜•λ³„ ν”ŒλŸ¬κ·ΈμΈ μ—°κ²°)

μ„Ήμ…˜ 제λͺ©: β€œProjectTypePlugin (κ³΅μ‚¬μœ ν˜•λ³„ ν”ŒλŸ¬κ·ΈμΈ μ—°κ²°)”
ProjectTypePlugin
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_type_id UUID FK β†’ ProjectType
β”œβ”€β”€ plugin_id UUID FK β†’ Plugin
└── enabled BOOLEAN DEFAULT TRUE

10. Document (곡가신청/ν•΄μ§€ β€” ν”ŒλŸ¬κ·ΈμΈ μ „μš©)

μ„Ήμ…˜ 제λͺ©: β€œ10. Document (곡가신청/ν•΄μ§€ β€” ν”ŒλŸ¬κ·ΈμΈ μ „μš©)”
Document
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_id UUID FK β†’ Project
β”œβ”€β”€ doc_type ENUM(곡가신청/곡가해지) -- ν”ŒλŸ¬κ·ΈμΈ ν™œμ„±ν™” μ‹œλ§Œ
β”œβ”€β”€ status ENUM(μž‘μ„±μ€‘/μ‹ μ²­/μ ‘μˆ˜/μ™„λ£Œ)
β”œβ”€β”€ content JSONB -- μ„œλ₯˜ λ‚΄μš©
β”œβ”€β”€ created_by UUID FK β†’ User
β”œβ”€β”€ created_at TIMESTAMP
└── updated_at TIMESTAMP

OCRUpload
β”œβ”€β”€ id UUID PK
β”œβ”€β”€ project_id UUID FK β†’ Project
β”œβ”€β”€ uploaded_by UUID FK β†’ User -- ν˜„μž₯(접속)νŒ€
β”œβ”€β”€ file_path VARCHAR(500)
β”œβ”€β”€ ocr_result JSONB -- OCR 뢄석 κ²°κ³Ό
β”œβ”€β”€ reviewed_by UUID FK β†’ User -- ν˜„μž₯λŒ€λ¦¬
β”œβ”€β”€ review_status ENUM(λŒ€κΈ°/확인/μˆ˜μ •)
β”œβ”€β”€ uploaded_at TIMESTAMP
└── reviewed_at TIMESTAMP

Company ──── User ──── ViewerPermission
β”‚
β”œβ”€β”€β”€β”€ ProjectType ── ProjectTypeStage
β”‚ β”‚
β”‚ └──── ProjectTypePlugin ── Plugin
β”‚
β”œβ”€β”€β”€β”€ Project ── ProjectTeam
β”‚ β”‚
β”‚ β”œβ”€β”€β”€β”€ ProjectStageLog
β”‚ β”œβ”€β”€β”€β”€ MaterialInput ←── Material
β”‚ β”œβ”€β”€β”€β”€ Document (ν”ŒλŸ¬κ·ΈμΈ)
β”‚ └──── OCRUpload
β”‚
└──── Material

  • 감사 둜그 (AuditLog) β€” λˆ„κ°€ 뭘 μ–Έμ œ λ³€κ²½ν–ˆλ‚˜
  • μ•Œλ¦Ό μ‹œμŠ€ν…œ β€” 단계 λ³€κ²½ μ‹œ μ•Œλ¦Ό
  • 파일 첨뢀 β€” 곡사별 μ²¨λΆ€νŒŒμΌ
  • 톡계/리포트 β€” κ΄€λ¦¬μž λŒ€μ‹œλ³΄λ“œμš©
  • API 토큰 β€” μ™ΈλΆ€ μ—°λ™μš©