diff --git a/CLAUDE.md b/CLAUDE.md
index 18adf690..785d508b 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -593,6 +593,73 @@ import { FormField } from '@/components/molecules/FormField';
---
+## Module Separation Architecture
+**Priority**: π΄
+
+### κ°μ
+λ©ν°ν
λνΈ λͺ¨λ λΆλ¦¬ μν€ν
μ². ν
λνΈλ³λ‘ νμν λͺ¨λλ§ νμ±ννμ¬ λΆνμν κΈ°λ₯ μ¨κΉ.
+`tenant.options.industry` λ―Έμ€μ μ **λͺ¨λ λͺ¨λ νμ±ν** (κΈ°μ‘΄ λμ 100% μ μ§).
+
+### ν΅μ¬ ν¨ν΄: moduleAware μμ μ₯μΉ
+```typescript
+const { isEnabled, tenantIndustry } = useModules();
+const moduleAware = !!tenantIndustry; // industry λ―Έμ€μ β false β μ λΆ νμ©
+
+if (!moduleAware) return allData; // κΈ°μ‘΄κ³Ό λμΌ
+return filteredData; // λͺ¨λ κΈ°λ° νν°λ§
+```
+
+### λͺ¨λ ꡬ쑰
+```
+src/modules/
+βββ types.ts # ModuleId, TenantIndustry, MODULE_REGISTRY
+βββ config.ts # INDUSTRY_MODULES (μ
μ’
λ³ νμ± λͺ¨λ λ§€ν)
+βββ ModuleGuard.tsx # λΌμ°νΈ κΈ°λ° μ κ·Ό μ μ΄ (layout.tsxμμ μ¬μ©)
+βββ ModuleProvider.tsx # React Context (tenant API β enabledModules κ³μ°)
+
+src/hooks/useModules.ts # { isEnabled, tenantIndustry, enabledModules, ... }
+```
+
+### λͺ¨λ ID λͺ©λ‘
+| ModuleId | μ€λͺ
| ν
λνΈ |
+|----------|------|--------|
+| `production` | μμ°κ΄λ¦¬ | κ²½λ |
+| `quality` | νμ§κ΄λ¦¬ | κ²½λ |
+| `construction` | μ곡κ΄λ¦¬ | μ£ΌμΌ |
+| `vehicle-management` | μ°¨λκ΄λ¦¬ | μ νμ |
+
+### λΌμ°νΈ κ°λ vs λͺ
μμ κ°λ
+- **λΌμ°νΈ κ°λ (ModuleGuard)**: `/production/*`, `/quality/*` λ± μ μ© λΌμ°νΈ
+- **λͺ
μμ κ°λ (useModules)**: κ³΅ν΅ λΌμ°νΈ λ΄ λͺ¨λ μμ‘΄ νμ΄μ§ (μ: `/sales/*/production-orders`)
+
+```typescript
+// κ³΅ν΅ λΌμ°νΈ λ΄ λͺ¨λ μμ‘΄ νμ΄μ§ β λͺ
μμ κ°λ νμ
+if (tenantIndustry && !isEnabled('production')) {
+ return
μμ°κ΄λ¦¬ λͺ¨λμ΄ νμ±νλμ΄ μμ§ μμ΅λλ€.
;
+}
+```
+
+### ν¬λ‘μ€ λͺ¨λ μν¬νΈ κ·μΉ
+- **Common β Tenant μ§μ import κΈμ§** (κ²μ¦ μ€ν¬λ¦½νΈ: `scripts/verify-module-separation.sh`)
+- **νμ© μμΈ**: `// MODULE_SEPARATION_OK` μ£Όμ + `src/lib/api/` 곡μ λνΌ
+- **Tenant β Common import**: μμ
+- **Tenant β Tenant import**: κΈμ§ (dynamic importλ§ νμ©)
+
+### MODULE.md κ²½κ³ λ§μ»€
+κ° ν
λνΈ λͺ¨λ λλ ν 리μ `MODULE.md` νμΌλ‘ λͺ¨λ κ²½κ³ λ¬Έμν:
+- `src/components/production/MODULE.md`
+- `src/components/quality/MODULE.md`
+- `src/components/business/construction/MODULE.md`
+- `src/components/vehicle-management/MODULE.md`
+
+### Path Aliases
+```json
+// tsconfig.json
+"@modules/*": ["./src/modules/*"]
+```
+
+---
+
## User Environment
**Priority**: π’
diff --git a/claudedocs/architecture/module-separation-guide.md b/claudedocs/architecture/module-separation-guide.md
new file mode 100644
index 00000000..eab259f8
--- /dev/null
+++ b/claudedocs/architecture/module-separation-guide.md
@@ -0,0 +1,234 @@
+# SAM ERP λ©ν°ν
λνΈ λͺ¨λ λΆλ¦¬ μν€ν
μ²
+
+> μμ±μΌ: 2026-03-18
+> μν: νλ‘ νΈμλ Phase 0~3 μλ£ / λ°±μλ μμ
νμ
+
+---
+
+## 1. κ°μ
+
+### λͺ©ν
+νλμ SAM ERP μ½λλ² μ΄μ€μμ **ν
λνΈ(νμ¬)λ³λ‘ νμν λͺ¨λλ§ νμ±ν**νμ¬,
+λΆνμν λ©λ΄Β·νμ΄μ§Β·λμ보λ μΉμ
μ μ¨κΈ°λ ꡬ쑰.
+
+### νμ¬ ν
λνΈλ³ λͺ¨λ ꡬμ±
+| μ
μ’
μ½λ | ν
λνΈ μμ | νμ± λͺ¨λ |
+|-----------|------------|-----------|
+| `shutter_mes` | κ²½λ | μμ°κ΄λ¦¬, νμ§κ΄λ¦¬, μ°¨λκ΄λ¦¬ |
+| `construction` | μ£ΌμΌ | μ곡κ΄λ¦¬, μ°¨λκ΄λ¦¬ |
+| (λ―Έμ€μ ) | κΈ°ν λͺ¨λ ν
λνΈ | **μ 체 λͺ¨λ νμ±ν (κΈ°μ‘΄κ³Ό λμΌ)** |
+
+### μμ μμΉ
+```
+tenant.options.industryκ° μ€μ λμ§ μμ ν
λνΈ β λͺ¨λ κΈ°λ₯ κ·Έλλ‘ μ¬μ© κ°λ₯
+= κΈ°μ‘΄ λμ 100% μ μ§, λΆμμ© μ λ‘
+```
+
+---
+
+## 2. νλ‘ νΈμλ ꡬ쑰 (μλ£)
+
+### νμΌ κ΅¬μ‘°
+```
+src/modules/
+βββ types.ts # ModuleId νμ
μ μ
+βββ tenant-config.ts # μ
μ’
βλͺ¨λ λ§€ν (resolveEnabledModules)
+βββ index.ts # λͺ¨λ λ μ§μ€νΈλ¦¬ (λΌμ°νΈ λ§€ν, λμ보λ μΉμ
)
+
+src/hooks/
+βββ useModules.ts # React ν
: isEnabled(), isRouteAllowed(), tenantIndustry
+```
+
+### λͺ¨λ ID λͺ©λ‘
+| ModuleId | μ΄λ¦ | μμ λΌμ°νΈ | λμ보λ μΉμ
|
+|----------|------|------------|--------------|
+| `common` | κ³΅ν΅ ERP | /dashboard, /accounting, /sales, /hr, /approval, /settings λ± | μ λΆ |
+| `production` | μμ°κ΄λ¦¬ | /production | dailyProduction, unshipped |
+| `quality` | νμ§κ΄λ¦¬ | /quality | - |
+| `construction` | μ곡κ΄λ¦¬ | /construction | construction |
+| `vehicle-management` | μ°¨λκ΄λ¦¬ | /vehicle-management, /vehicle | - |
+
+### νλ‘ νΈμλ λμ νλ¦
+```
+1. λ‘κ·ΈμΈ β authStoreμ tenant μ 보 μ μ₯
+2. useModules() ν
μ΄ tenant.options.industry μ½μ
+3. industry κ°μΌλ‘ INDUSTRY_MODULE_MAP μ‘°ν β νμ± λͺ¨λ λͺ©λ‘ κ²°μ
+4. κ° μ»΄ν¬λνΈμμ isEnabled('production') λ±μΌλ‘ λΆκΈ°
+```
+
+### μ μ©λ μμ
+
+#### A. CEO λμ보λ
+- **μΉμ
νν°λ§**: λΉνμ± λͺ¨λμ λμ보λ μΉμ
μλ μ μΈ
+- **API νΈμΆ μ°¨λ¨**: λΉνμ± λͺ¨λμ APIλ νΈμΆνμ§ μμ (null endpoint)
+- **μ€μ νμ
**: λΉνμ± λͺ¨λ μΉμ
μ μ€μ μμλ μ 보μ
+- **μΊλ¦°λ**: λΉνμ± λͺ¨λμ μΌμ μ ν νν° μ¨κΉ
+- **μμ½ λ€λΉ**: λΉνμ± μΉμ
μλ μ μΈ
+
+#### B. λΌμ°νΈ μ κ·Ό μ μ΄
+- `/production/*`, `/quality/*`, `/construction/*` λ± μ μ© λΌμ°νΈλ λͺ¨λ λΉνμ± μ μ κ·Ό μ°¨λ¨
+- `/sales/*/production-orders` κ°μ κ³΅ν΅ λΌμ°νΈ λ΄ λͺ¨λ μμ‘΄ νμ΄μ§λ λͺ
μμ κ°λ μ μ©
+
+#### C. μ¬μ΄λλ° λ©λ΄
+- λΉνμ± λͺ¨λμ λ©λ΄ νλͺ© μ¨κΉ (isRouteAllowed κΈ°λ°)
+
+---
+
+## 3. λ°±μλ νμ μμ
+
+### 3.1 tenants ν
μ΄λΈ options νλμ industry μΆκ°
+**μ°μ μμ: π΄ νμ**
+
+νμ¬ νλ‘ νΈμλλ `tenant.options.industry` κ°μ μ½μ΄μ λͺ¨λμ κ²°μ ν©λλ€.
+μ΄ κ°μ΄ λ°±μλμμ λ΄λ €μμΌ μ€μ λ‘ λμν©λλ€.
+
+```php
+// tenants ν
μ΄λΈμ options JSON 컬λΌμ industry μΆκ°
+// μμ λ°μ΄ν°:
+{
+ "industry": "shutter_mes" // κ²½λ: μ
ν° MES
+}
+{
+ "industry": "construction" // μ£ΌμΌ: 건μ€
+}
+// λ€λ₯Έ ν
λνΈ: industry ν€ μμ β νλ‘ νΈμμ μ 체 λͺ¨λ νμ±ν
+```
+
+**μμ
λ΄μ©:**
+1. `tenants` ν
μ΄λΈμ `options` JSON 컬λΌμ `industry` ν€ μΆκ° (λ§μ΄κ·Έλ μ΄μ
λΆνμ, JSONμ΄λ―λ‘)
+2. κ²½λ ν
λνΈ: `options->industry = 'shutter_mes'`
+3. μ£ΌμΌ ν
λνΈ: `options->industry = 'construction'`
+4. ν
λνΈ μ 보 API μλ΅μ `options.industry` ν¬ν¨ νμΈ
+
+**νμΈ ν¬μΈνΈ:**
+- νλ‘ νΈμλμμ `authStore.currentUser.tenant.options.industry`λ‘ μ κ·Ό
+- νμ¬ λ‘κ·ΈμΈ API(`/api/v1/auth/me` λλ μ μ¬)μ μλ΅μμ tenant.optionsκ° ν¬ν¨λλμ§ νμΈ
+- ν¬ν¨ μ λλ©΄ μλ΅μ μΆκ° νμ
+
+### 3.2 (μ ν) ν
λνΈ κ΄λ¦¬ νλ©΄μμ industry μ€μ UI
+**μ°μ μμ: π‘ μ ν**
+
+κ΄λ¦¬μκ° ν
λνΈλ³ μ
μ’
μ μ€μ ν μ μλ UI. κΈνμ§ μμ β DB μ§μ μμ μΌλ‘ μΆ©λΆ.
+
+### 3.3 (Phase 2 μμ ) λͺ
μμ λͺ¨λ λͺ©λ‘ API
+**μ°μ μμ: π’ ν₯ν**
+
+νμ¬λ `industry` β νλ‘ νΈμλ νλμ½λ© λ§€νμΌλ‘ λͺ¨λ κ²°μ .
+ν₯ν λ°±μλμμ μ§μ λͺ¨λ λͺ©λ‘μ λ΄λ €μ£Όλ©΄ λ μ μ°ν΄μ§.
+
+```php
+// tenant.options μμ (Phase 2)
+{
+ "industry": "shutter_mes",
+ "modules": ["production", "quality", "vehicle-management"] // λͺ
μμ λͺ©λ‘
+}
+```
+
+νλ‘ νΈμλλ μ΄λ―Έ μ΄ κ΅¬μ‘°λ₯Ό μ§μνλλ‘ μ€λΉλμ΄ μμ:
+```typescript
+// src/modules/tenant-config.ts
+export function resolveEnabledModules(options) {
+ // Phase 2: λ°±μλκ° λͺ
μμ λͺ¨λ λͺ©λ‘ μ 곡 β μ°μ μ¬μ©
+ if (explicitModules && explicitModules.length > 0) {
+ return explicitModules;
+ }
+ // Phase 1: industry κΈ°λ° κΈ°λ³Έκ° (νμ¬)
+ if (industry) {
+ return INDUSTRY_MODULE_MAP[industry] ?? [];
+ }
+ return [];
+}
+```
+
+---
+
+## 4. μ
μ’
λ³ λͺ¨λ λ§€ν (νλ‘ νΈμλ νλμ½λ©)
+
+```typescript
+// src/modules/tenant-config.ts
+const INDUSTRY_MODULE_MAP: Record = {
+ shutter_mes: ['production', 'quality', 'vehicle-management'],
+ construction: ['construction', 'vehicle-management'],
+};
+```
+
+μλ‘μ΄ μ
μ’
μΆκ° μ:
+1. μ¬κΈ°μ λ§€ν μΆκ°
+2. νμνλ©΄ `ModuleId` νμ
μ μ λͺ¨λ ID μΆκ°
+3. `MODULE_REGISTRY` (src/modules/index.ts)μ λΌμ°νΈ/λμ보λ μΉμ
λ±λ‘
+
+---
+
+## 5. ν΅μ¬ μ½λ ν¨ν΄
+
+### κΈ°λ³Έ μ¬μ©λ²
+```typescript
+import { useModules } from '@/hooks/useModules';
+
+function MyComponent() {
+ const { isEnabled, tenantIndustry } = useModules();
+
+ // μμ μ₯μΉ: industry λ―Έμ€μ μ΄λ©΄ λͺ¨λ κΈ°λ₯ νμ±
+ const moduleAware = !!tenantIndustry;
+
+ if (moduleAware && !isEnabled('production')) {
+ return μμ°κ΄λ¦¬ λͺ¨λμ΄ λΉνμ±νλμ΄ μμ΅λλ€.
;
+ }
+
+ // μμ°κ΄λ¦¬ κΈ°λ₯ λ λλ§...
+}
+```
+
+### ν¬λ‘μ€ λͺ¨λ μν¬νΈ κ·μΉ
+```
+β
Common β Common (μμ )
+β
Tenant β Common (μμ )
+β
Common β Tenant (λνΌ κ²½μ ) (src/lib/api/μμ MODULE_SEPARATION_OK μ£Όμκ³Ό ν¨κ»)
+β Common β Tenant (μ§μ ) (scripts/verify-module-separation.shκ° κ²μΆ)
+β Tenant β Tenant (κΈμ§, dynamic importλ§ νμ©)
+```
+
+---
+
+## 6. ꡬν μ΄λ ₯
+
+| Phase | λ΄μ© | μ»€λ° | μν |
+|-------|------|------|------|
+| Phase 0 | ν¬λ‘μ€ λͺ¨λ μμ‘΄μ± ν΄μ | `a99c3b39` | β
μλ£ |
+| Phase 1 | λͺ¨λ λ μ§μ€νΈλ¦¬ + λΌμ°νΈ κ°λ | `0a65609e` | β
μλ£ |
+| Phase 2 | CEO λμ보λ λͺ¨λ λ컀νλ§ | `46501214` | β
μλ£ |
+| Phase 3 | 물리μ λΆλ¦¬ (κ²½κ³ λ§μ»€, κ²μ¦, κ°λ, λ¬Έμ) | (미컀λ°) | β
μλ£ |
+
+---
+
+## 7. ν
μ€νΈ μλ리μ€
+
+### ν
μ€νΈ λ°©λ²
+λ°±μλμμ `tenant.options.industry`λ₯Ό μ€μ ν ν:
+
+| μλλ¦¬μ€ | μμ κ²°κ³Ό |
+|----------|----------|
+| industry λ―Έμ€μ ν
λνΈ λ‘κ·ΈμΈ | κΈ°μ‘΄κ³Ό μμ λμΌ (λͺ¨λ λ©λ΄/κΈ°λ₯ νμ) |
+| `shutter_mes` ν
λνΈ λ‘κ·ΈμΈ | μ곡κ΄λ¦¬ λ©λ΄ μ¨κΉ, λμ보λ μ곡 μΉμ
μ 보μ |
+| `construction` ν
λνΈ λ‘κ·ΈμΈ | μμ°/νμ§ λ©λ΄ μ¨κΉ, λμ보λ μμ° μΉμ
μ 보μ |
+| `shutter_mes`μμ `/construction` μ§μ μ κ·Ό | μ κ·Ό μ°¨λ¨ λ©μμ§ νμ |
+| `construction`μμ `/production` μ§μ μ κ·Ό | μ κ·Ό μ°¨λ¨ λ©μμ§ νμ |
+
+### λ‘€λ°± λ°©λ²
+λ¬Έμ λ°μ μ DBμμ `tenant.options.industry` κ°λ§ μ κ±°νλ©΄ μ¦μ μ볡.
+νλ‘ νΈμλ μ½λ λ³κ²½ λΆνμ.
+
+---
+
+## 8. ν₯ν λ‘λλ§΅
+
+```
+νμ¬ (Phase 1) ν₯ν (Phase 2) μ΅μ’
(Phase 3)
+βββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββββββββββ
+β industry νλμ½λ© β β β λ°±μλ modules λͺ©λ‘ β β β JSON μ€ν€λ§ κΈ°λ° β
+β λ§€νμΌλ‘ λͺ¨λ κ²°μ β β APIμμ μ§μ μμ β β λμ νμ΄μ§ 쑰립 β
+βββββββββββββββββββ ββββββββββββββββββββββββ βββββββββββββββββββββββ
+```
+
+- **Phase 2**: `tenant.options.modules = ["production", "quality"]` ννλ‘ λ°±μλμμ λͺ
μμ λͺ¨λ λͺ©λ‘ μ λ¬ β μ
μ’
λ§€ν ν
μ΄λΈ λΆνμ
+- **Phase 3**: κ° λͺ¨λμ νμ΄μ§ ꡬμ±μ JSON μ€ν€λ§λ‘ μ μ β μ½λ λ³κ²½ μμ΄ ν
λνΈλ³ νλ©΄ 컀μ€ν°λ§μ΄μ§
diff --git a/scripts/verify-module-separation.sh b/scripts/verify-module-separation.sh
new file mode 100755
index 00000000..df268a26
--- /dev/null
+++ b/scripts/verify-module-separation.sh
@@ -0,0 +1,97 @@
+#!/bin/bash
+# ===================================================================
+# Module Separation Verification Script
+#
+# κ³΅ν΅ ERP β ν
λνΈ λͺ¨λ κ° κΈμ§λ μ μ importλ₯Ό κ²μ¬ν©λλ€.
+# Phase 0μμ ν΄μν μμ‘΄μ±μ΄ λ€μ λ°μνμ§ μλλ‘ CIμμ μ€ν κ°λ₯.
+#
+# μ¬μ©λ²: bash scripts/verify-module-separation.sh
+# μ’
λ£μ½λ: 0 = ν΅κ³Ό, 1 = μλ° λ°κ²¬
+# ===================================================================
+
+set -euo pipefail
+
+echo "================================================="
+echo " Module Separation Verification"
+echo "================================================="
+echo ""
+
+# ν
λνΈ μ μ© κ²½λ‘ ν¨ν΄ (from 'xxx' λλ from "xxx" ννλ‘ κ²μ)
+TENANT_PATHS=(
+ "@/components/production/"
+ "@/components/quality/"
+ "@/components/business/construction/"
+ "@/components/vehicle-management/"
+)
+
+# κ³΅ν΅ ERP μμ€ λλ ν 리 (ν
λνΈ νμ΄μ§ μ μΈ)
+COMMON_DIRS=(
+ "src/components/approval"
+ "src/components/accounting"
+ "src/components/auth"
+ "src/components/atoms"
+ "src/components/board"
+ "src/components/business/CEODashboard"
+ "src/components/business/DashboardSwitcher.tsx"
+ "src/components/clients"
+ "src/components/common"
+ "src/components/customer-center"
+ "src/components/document-system"
+ "src/components/hr"
+ "src/components/items"
+ "src/components/layout"
+ "src/components/material"
+ "src/components/molecules"
+ "src/components/organisms"
+ "src/components/orders"
+ "src/components/outbound"
+ "src/components/pricing"
+ "src/components/providers"
+ "src/components/reports"
+ "src/components/settings"
+ "src/components/stocks"
+ "src/components/templates"
+ "src/components/ui"
+ "src/lib"
+ "src/hooks"
+ "src/stores"
+ "src/contexts"
+)
+
+VIOLATIONS=0
+
+for dir in "${COMMON_DIRS[@]}"; do
+ # λλ ν 리/νμΌμ΄ μμΌλ©΄ μ€ν΅
+ [ -e "$dir" ] || continue
+
+ for tenant_path in "${TENANT_PATHS[@]}"; do
+ # μ μ import κ²μ (dynamic importλ νμ©)
+ found=$(grep -rn "from ['\"]${tenant_path}" "$dir" \
+ --include="*.ts" --include="*.tsx" 2>/dev/null \
+ | grep -v "dynamic(" \
+ | grep -v "// MODULE_SEPARATION_OK" \
+ || true)
+
+ if [ -n "$found" ]; then
+ echo "VIOLATION: $dir β $tenant_path"
+ echo "$found"
+ echo ""
+ VIOLATIONS=$((VIOLATIONS + 1))
+ fi
+ done
+done
+
+echo "================================================="
+if [ $VIOLATIONS -eq 0 ]; then
+ echo " PASSED: No forbidden imports found."
+ exit 0
+else
+ echo " FAILED: Found $VIOLATIONS forbidden import(s)."
+ echo ""
+ echo " ν΄κ²° λ°©λ²:"
+ echo " - dynamic import (next/dynamic)λ‘ κ΅μ²΄"
+ echo " - @/lib/api/ λλ @/interfaces/λ‘ νμ
μ΄λ"
+ echo " - @/components/document-system/μΌλ‘ 곡μ λͺ¨λ¬ μ΄λ"
+ echo " - λΆκ°νΌν κ²½μ° // MODULE_SEPARATION_OK μ£Όμ μΆκ°"
+ exit 1
+fi
diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/production-order/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/production-order/page.tsx
index b7e20aba..bf39bcda 100644
--- a/src/app/[locale]/(protected)/sales/order-management-sales/[id]/production-order/page.tsx
+++ b/src/app/[locale]/(protected)/sales/order-management-sales/[id]/production-order/page.tsx
@@ -16,6 +16,7 @@
import { useState, useEffect, useCallback } from "react";
import { useRouter, useParams } from "next/navigation";
+import { useModules } from "@/hooks/useModules";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import {
@@ -345,6 +346,24 @@ export default function ProductionOrderCreatePage() {
const router = useRouter();
const params = useParams();
const orderId = params.id as string;
+ const { isEnabled, tenantIndustry } = useModules();
+
+ // μμ° λͺ¨λ λΉνμ± μ μ κ·Ό μ°¨λ¨ (tenantIndustry λ―Έμ€μ μ μ λΆ νμ©)
+ if (tenantIndustry && !isEnabled('production')) {
+ return (
+
+
+
μμ°κ΄λ¦¬ λͺ¨λμ΄ νμ±νλμ΄ μμ§ μμ΅λλ€.
+
+
+
+ );
+ }
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/[id]/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/[id]/page.tsx
index 0e0c97f8..1b0ec878 100644
--- a/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/[id]/page.tsx
+++ b/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/[id]/page.tsx
@@ -11,6 +11,7 @@
import { useState, useEffect } from "react";
import { useRouter, useParams } from "next/navigation";
+import { useModules } from "@/hooks/useModules";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
@@ -194,6 +195,24 @@ export default function ProductionOrderDetailPage() {
const router = useRouter();
const params = useParams();
const orderId = params.id as string;
+ const { isEnabled, tenantIndustry } = useModules();
+
+ // μμ° λͺ¨λ λΉνμ± μ μ κ·Ό μ°¨λ¨ (tenantIndustry λ―Έμ€μ μ μ λΆ νμ©)
+ if (tenantIndustry && !isEnabled('production')) {
+ return (
+
+
+
μμ°κ΄λ¦¬ λͺ¨λμ΄ νμ±νλμ΄ μμ§ μμ΅λλ€.
+
+
+
+ );
+ }
const [detail, setDetail] = useState(null);
const [loading, setLoading] = useState(true);
diff --git a/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/page.tsx b/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/page.tsx
index da143646..1ac16634 100644
--- a/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/page.tsx
+++ b/src/app/[locale]/(protected)/sales/order-management-sales/production-orders/page.tsx
@@ -12,6 +12,7 @@
import { useState, useCallback } from "react";
import { useRouter } from "next/navigation";
+import { useModules } from "@/hooks/useModules";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
@@ -174,6 +175,23 @@ const TABLE_COLUMNS: TableColumn[] = [
export default function ProductionOrdersListPage() {
const router = useRouter();
+ const { isEnabled, tenantIndustry } = useModules();
+
+ // μμ° λͺ¨λ λΉνμ± μ μ κ·Ό μ°¨λ¨ (tenantIndustry λ―Έμ€μ μ μ λΆ νμ©)
+ if (tenantIndustry && !isEnabled('production')) {
+ return (
+
+
μμ°κ΄λ¦¬ λͺ¨λμ΄ νμ±νλμ΄ μμ§ μμ΅λλ€.
+
+
+ );
+ }
+
const [stats, setStats] = useState({
total: 0,
waiting: 0,
diff --git a/src/components/business/construction/MODULE.md b/src/components/business/construction/MODULE.md
new file mode 100644
index 00000000..b1498417
--- /dev/null
+++ b/src/components/business/construction/MODULE.md
@@ -0,0 +1,32 @@
+# Construction Module (건μ€κ΄λ¦¬)
+
+**Module ID**: `construction`
+**Tenant**: Juil (μ£ΌμΌκ±΄μ€)
+**Route Prefixes**: `/construction`
+**Component Count**: 161 files
+
+## Dependencies on Common ERP
+- `@/lib/api/*` β Server actions, API client
+- `@/components/ui/*` β UI primitives (shadcn/ui)
+- `@/components/templates/*` β IntegratedListTemplateV2 λ±
+- `@/components/organisms/*` β PageLayout, PageHeader
+- `@/hooks/*` β usePermission, useModules λ±
+- `@/stores/authStore` β Tenant μ 보
+- `@/components/common/*` β κ³΅ν΅ μ»΄ν¬λνΈ
+
+## Exports to Common ERP
+**NONE** β κ±΄μ€ λͺ¨λμ λ
립μ μΌλ‘ μλ.
+
+## Related Dashboard Sections
+- `construction` (μ곡 νν©)
+
+## Subdirectories
+- `bidding/` β μ
μ°° κ΄λ¦¬
+- `contract/` β κ³μ½ κ΄λ¦¬
+- `estimates/` β 견μ κ΄λ¦¬
+- `progress-billing/` β κΈ°μ± κ΄λ¦¬
+- `site-management/` β νμ₯ κ΄λ¦¬
+- `labor-management/` β λ
Έλ¬΄ κ΄λ¦¬
+- `item-management/` β μμ¬ κ΄λ¦¬
+- `partners/` β νλ ₯μ
체 κ΄λ¦¬
+- κΈ°ν 20κ° νμ λλ©μΈ
diff --git a/src/components/production/MODULE.md b/src/components/production/MODULE.md
new file mode 100644
index 00000000..98e75450
--- /dev/null
+++ b/src/components/production/MODULE.md
@@ -0,0 +1,25 @@
+# Production Module (μμ°κ΄λ¦¬)
+
+**Module ID**: `production`
+**Tenant**: Kyungdong (κ²½λ μ
ν° MES)
+**Route Prefixes**: `/production`
+**Component Count**: 56 files
+
+## Dependencies on Common ERP
+- `@/lib/api/*` β Server actions, API client
+- `@/components/ui/*` β UI primitives (shadcn/ui)
+- `@/components/templates/*` β IntegratedListTemplateV2 λ±
+- `@/components/organisms/*` β PageLayout, PageHeader
+- `@/hooks/*` β usePermission, useModules λ±
+- `@/stores/authStore` β Tenant μ 보
+- `@/stores/menuStore` β μ¬μ΄λλ° μν
+
+## Exports to Common ERP
+**NONE** β Phase 0μμ λͺ¨λ κ΅μ°¨ μ°Έμ‘° ν΄μ μλ£.
+- νμ
: `@/lib/api/production-orders/types.ts` (re-export)
+- μλ² μ‘μ
: `@/lib/api/production-orders/actions.ts` (async wrapper)
+- λͺ¨λ¬: `@/components/document-system/modals/` (dynamic import wrapper)
+
+## Related Dashboard Sections
+- `production` (μμ° νν©)
+- `shipment` (μΆκ³ νν©)
diff --git a/src/components/quality/MODULE.md b/src/components/quality/MODULE.md
new file mode 100644
index 00000000..539e77cf
--- /dev/null
+++ b/src/components/quality/MODULE.md
@@ -0,0 +1,21 @@
+# Quality Module (νμ§κ΄λ¦¬)
+
+**Module ID**: `quality`
+**Tenant**: Kyungdong (κ²½λ μ
ν° MES)
+**Route Prefixes**: `/quality`
+**Component Count**: 35 files
+
+## Dependencies on Common ERP
+- `@/lib/api/*` β Server actions, API client
+- `@/components/ui/*` β UI primitives (shadcn/ui)
+- `@/components/templates/*` β IntegratedListTemplateV2 λ±
+- `@/components/organisms/*` β PageLayout, PageHeader
+- `@/hooks/*` β usePermission, useModules λ±
+- `@/stores/authStore` β Tenant μ 보
+
+## Exports to Common ERP
+**NONE** β Phase 0μμ κ΅μ°¨ μ°Έμ‘° ν΄μ μλ£.
+- λͺ¨λ¬: `@/components/document-system/modals/` (WorkLogModal β dynamic import)
+
+## Related Dashboard Sections
+μμ (νμ§ λμ보λ μΉμ
μ μμ§ λ―Έκ΅¬ν)
diff --git a/src/components/vehicle-management/MODULE.md b/src/components/vehicle-management/MODULE.md
new file mode 100644
index 00000000..cce7d21d
--- /dev/null
+++ b/src/components/vehicle-management/MODULE.md
@@ -0,0 +1,20 @@
+# Vehicle Management Module (μ°¨λκ΄λ¦¬)
+
+**Module ID**: `vehicle-management`
+**Tenant**: Optional (κ²½λ + μ£ΌμΌ κ³΅ν΅ μ ν)
+**Route Prefixes**: `/vehicle-management`, `/vehicle`
+**Component Count**: 13 files
+
+## Dependencies on Common ERP
+- `@/lib/api/*` β Server actions, API client
+- `@/components/ui/*` β UI primitives (shadcn/ui)
+- `@/components/templates/*` β IntegratedListTemplateV2 λ±
+- `@/components/organisms/*` β PageLayout, PageHeader
+- `@/hooks/*` β usePermission, useModules λ±
+- `@/stores/authStore` β Tenant μ 보
+
+## Exports to Common ERP
+**NONE**
+
+## Related Dashboard Sections
+μμ
diff --git a/src/lib/api/production-orders/actions.ts b/src/lib/api/production-orders/actions.ts
index e863b576..307927a2 100644
--- a/src/lib/api/production-orders/actions.ts
+++ b/src/lib/api/production-orders/actions.ts
@@ -11,7 +11,7 @@ import {
getProductionOrders as _getProductionOrders,
getProductionOrderStats as _getProductionOrderStats,
getProductionOrderDetail as _getProductionOrderDetail,
-} from '@/components/production/ProductionOrders/actions';
+} from '@/components/production/ProductionOrders/actions'; // MODULE_SEPARATION_OK β 곡μ μ‘μ
λνΌ (Phase 0)
import type { ProductionOrderListParams } from './types';
export async function getProductionOrders(params: ProductionOrderListParams) {
diff --git a/src/lib/api/production-orders/types.ts b/src/lib/api/production-orders/types.ts
index 95c61370..2ed15da6 100644
--- a/src/lib/api/production-orders/types.ts
+++ b/src/lib/api/production-orders/types.ts
@@ -19,4 +19,4 @@ export type {
ApiProductionWorkOrder,
ApiBomProcessGroup,
ApiBomItem,
-} from '@/components/production/ProductionOrders/types';
+} from '@/components/production/ProductionOrders/types'; // MODULE_SEPARATION_OK β 곡μ μΈν°νμ΄μ€ (Phase 0)
diff --git a/tsconfig.json b/tsconfig.json
index 50296bbe..417c2930 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -25,6 +25,9 @@
"paths": {
"@/*": [
"./src/*"
+ ],
+ "@modules/*": [
+ "./src/modules/*"
]
}
},