# 3.1 Project Management (การจัดการโครงสร้างโครงการและองค์กร) --- title: "Functional Requirements: Project Management" version: 1.8.1 status: updated owner: Nattanin Peancharoen last_updated: 2026-03-24 related: - specs/01-requirements/01-01-objectives.md - specs/01-requirements/01-03-modules/01-03-00-index.md - specs/03-Data-and-Storage/03-01-data-dictionary.md - specs/01-requirements/01-02-business-rules/01-02-01-rbac-matrix.md --- ## 3.1.1. วัตถุประสงค์ จัดการโครงสร้างหลักของระบบ ได้แก่ **Project → Contract → Organization → Discipline** — ทุกเอกสารในระบบผูกอยู่กับ Project และ/หรือ Contract เสมอ --- ## 3.1.2. โครงสร้างข้อมูล (Database Tables) | Table | บทบาท | |---|---| | `projects` | ข้อมูล Master โครงการ: code, name, is_active | | `contracts` | สัญญา ผูกกับ Project (N:1) | | `organizations` | ข้อมูล Master องค์กร: code, name, role | | `organization_roles` | Master: ประเภทองค์กร (OWNER/DESIGNER/ฯลฯ) | | `project_organizations` | M:N: Project ↔ Organization | | `contract_organizations` | M:N: Contract ↔ Organization + role_in_contract | | `disciplines` | สาขางาน ผูกกับ Contract (N:1) | ### Hierarchy ``` Project (1) └── Contract (N) ├── Organization (M:N via contract_organizations) └── Discipline (N) Project ↔ Organization (M:N via project_organizations) ``` --- ## 3.1.3. Projects | Field | Type | หมายเหตุ | |---|---|---| | `project_code` | VARCHAR(50) UNIQUE | รหัสโครงการ | | `project_name` | VARCHAR(255) | ชื่อโครงการ | | `is_active` | TINYINT(1) | 1 = Active | - ปัจจุบันมี **4 โครงการ** — รองรับการเพิ่มในอนาคต - จัดการโดย Superadmin เท่านั้น --- ## 3.1.4. Contracts | Field | Type | หมายเหตุ | |---|---|---| | `project_id` | INT FK | ผูกกับ Project | | `contract_code` | VARCHAR(50) UNIQUE | รหัสสัญญา | | `contract_name` | VARCHAR(255) | ชื่อสัญญา | | `start_date` / `end_date` | DATE | ระยะเวลาสัญญา | | `is_active` | BOOLEAN | สถานะ | - 1 Project มีได้หลาย Contract (≥ 1) - Document Number ผูกกับ Contract (ไม่ใช่ Project) --- ## 3.1.5. Organizations และ Organization Roles ### Organization Roles (organization_roles) | role_name | ความหมาย | สามารถอยู่ใน | |---|---|---| | `OWNER` | เจ้าของโครงการ | หลาย Project / หลาย Contract | | `DESIGNER` | ผู้ออกแบบ | หลาย Project / หลาย Contract | | `CONSULTANT` | ที่ปรึกษา | หลาย Project / หลาย Contract | | `CONTRACTOR` | ผู้รับเหมา | **1 Contract / 1 Project เท่านั้น** | | `THIRD PARTY` | บุคคลที่สาม | หลาย Project / หลาย Contract | ### project_organizations (M:N) - ผูก Organization เข้า Project — ไม่มี role_in_contract ระดับ Project ### contract_organizations (M:N) - ผูก Organization เข้า Contract พร้อม `role_in_contract` (Owner/Designer/Consultant/Contractor) - 1 Organization สามารถมีหลาย role ใน Contract เดียวกันได้ --- ## 3.1.6. Disciplines (สาขางาน) Discipline ผูกกับ **Contract** (ไม่ใช่ Project): | Field | หมายเหตุ | |---|---| | `contract_id` | FK → contracts | | `discipline_code` | VARCHAR(10) เช่น GEN, STR, MEP | | `code_name_th` / `code_name_en` | ชื่อภาษาไทย/อังกฤษ | | `is_active` | สถานะ | - UNIQUE KEY `(contract_id, discipline_code)` — code ซ้ำได้ระหว่าง Contract - ใช้กรอง RFA Type และ Correspondence ต่อ Contract --- ## 3.1.7. การสร้างและสิทธิ์ (RBAC) | การกระทำ | Role ที่อนุญาต | Scope | |---|---|---| | สร้าง / แก้ไข Project | Superadmin | Global | | สร้าง / แก้ไข Contract | Superadmin, Org Admin | Project | | สร้าง / แก้ไข Organization | Superadmin | Global | | เพิ่ม Organization เข้า Project/Contract | Superadmin | Global | | จัดการ Disciplines | Superadmin, Org Admin | Contract | | ดู Project / Contract | ทุกคนที่มีสิทธิ์ใน Project | Project |