# 3.3 RFA Management (การจัดการเอกสารขออนุมัติ)

---

title: 'Functional Requirements: RFA Management'
version: 1.8.2
status: updated
owner: Nattanin Peancharoen
last_updated: 2026-03-31
related:

- specs/01-requirements/01-01-objectives.md
- specs/01-requirements/01-03-modules/01-03-00-index.md
- specs/01-requirements/01-03-modules/01-03-02-correspondence.md
- specs/01-requirements/01-03-modules/01-03-06-unified-workflow.md
- specs/01-requirements/01-06-edge-cases-and-rules.md (EC-RFA-001 ถึง EC-RFA-004)
- specs/03-Data-and-Storage/03-01-data-dictionary.md (§4.1–4.6)
- specs/01-requirements/01-02-business-rules/01-02-01-rbac-matrix.md

---

## 3.3.1. วัตถุประสงค์

เอกสารขออนุมัติ (RFA — Request For Approval) ใช้สำหรับส่งเอกสารหรือสิ่งของเพื่อขออนุมัติจากผู้ว่าจ้างหรือที่ปรึกษา ภายในโครงการ (Project) — **ไม่ได้จำกัดแค่แบบก่อสร้าง** ประเภทของ RFA (RFA Type) เป็นตัวกำหนดว่าต้องแนบ Drawing Revision หรือไฟล์แนบ:

- **ประเภทที่อ้างอิง Drawing** (DDW, SDW, ADW): ผูก Drawing Revision ได้หลายรายการผ่าน `rfa_items`
- **ประเภทอื่น** (DOC, MAT, ฯลฯ): แนบไฟล์ผ่าน revision attachment model (`correspondence_revision_attachments` + `attachments`)

---

## 3.3.2. โครงสร้างข้อมูล (Database Tables)

RFA ใช้ pattern **Correspondence + Extension**:

| Table | บทบาท |
|---|---|
| `correspondences` | ข้อมูลหลัก: เลขเอกสาร, subject, project, originator, recipients |
| `rfas` | ข้อมูลเฉพาะ RFA: `rfa_type_id` (FK → `rfa_types`) |
| `rfa_revisions` | ประวัติแต่ละ Revision: status, approve code, details JSON |
| `rfa_items` | รายการ Drawing Revision ที่อ้างอิงใน Revision นั้น (เฉพาะ type DDW/SDW/ADW) |
| `rfa_types` | Master: ประเภท RFA (ผูกกับ Contract) |
| `rfa_status_codes` | Master: สถานะ RFA |
| `rfa_approve_codes` | Master: ผลการอนุมัติ |

**ข้อสำคัญ:** `rfas.id` ใช้ FK ชี้ไปที่ `correspondences.id` (ไม่มี AUTO_INCREMENT ของตัวเอง)

---

## 3.3.3. ประเภทเอกสาร (RFA Types)

- `rfa_types` เป็น Master ที่ผูกกับ **Contract** (ไม่ใช่ Project) — `contract_id` FK
- แต่ละ Contract มี RFA Types ของตัวเอง สามารถเพิ่มใหม่ได้ในภายหลัง
- ไฟล์แนบรองรับรูปแบบ **PDF**
- RFA สามารถมีได้หลาย Revision (Rev.A, Rev.B, ...)

### type_code ที่กำหนด drawing requirement:

| type_code | ชื่อ | Attachment Mechanism | บังคับ |
|---|---|---|---|
| `DDW` | Drawing for Design | `rfa_items` → Shop Drawing Revision | ≥ 1 |
| `SDW` | Shop Drawing | `rfa_items` → Shop Drawing Revision | ≥ 1 |
| `ADW` | As-Built Drawing | `rfa_items` → As-Built Drawing Revision | ≥ 1 |
| อื่นๆ | เช่น DOC, MAT | `correspondence_revision_attachments` | ไม่บังคับ |

---

## 3.3.4. Fields ที่ต้องกรอกเมื่อสร้าง RFA

| Field | Required | หมายเหตุ |
|---|---|---|
| Project | ✅ | UUID — กรองจาก Project ที่ผู้ใช้มีสิทธิ์ |
| Contract | ✅ | UUID — filter ตาม Project ที่เลือก |
| Discipline | ✅ | INT id — filter ตาม Contract ที่เลือก |
| RFA Type | ✅ | INT id — filter ตาม Contract ที่เลือก |
| To Organization | ✅ | UUID — ผู้รับหลัก (recipients type = 'TO') |
| Subject | ✅ | ขั้นต่ำ 5 ตัวอักษร |
| Body | ❌ | เนื้อหาเพิ่มเติม |
| Description | ❌ | คำอธิบายสั้น |
| Remarks | ❌ | หมายเหตุ |
| Due Date | ❌ | กำหนดส่งคืน |
| Shop Drawing Revisions | บังคับเมื่อ type = DDW/SDW | UUID[] |
| As-Built Drawing Revisions | บังคับเมื่อ type = ADW | UUID[] |

### Document Number Preview

ระบบแสดง Preview เลขเอกสารแบบ Real-time ก่อน Submit เมื่อกรอกครบ: Project + Correspondence Type + Discipline + To Organization โดยเรียก `POST /api/correspondences/preview-number`

### Frontend Routing (v1.8.2)

- รายการ RFA ใช้หน้า Correspondence แบบรวมผ่าน filter: `/correspondences?type=RFA`
- เส้นทาง `/rfas` และ `/rfa` ใช้ redirect ไปยังหน้า list ข้างต้น
- หน้าเฉพาะทางของ RFA ยังคงอยู่:
  - `/rfas/new`
  - `/rfas/[uuid]`
  - `/rfas/[uuid]/edit`

เหตุผล: RFA ยังใช้ extension table (`rfas`, `rfa_revisions`, `rfa_items`) และมีฟอร์ม/รายละเอียดเฉพาะทาง

---

## 3.3.5. การสร้างและสิทธิ์ (RBAC)

| การกระทำ | Role ที่อนุญาต | หมายเหตุ |
|---|---|---|
| สร้าง RFA (Draft) | Document Control, Org Admin, Superadmin | ภายในองค์กรตัวเอง |
| Submit RFA | Document Control, Org Admin, Superadmin | เปลี่ยนสถานะ Draft → FAP/FRE |
| แก้ไข/ถอนกลับ/ยกเลิก หลัง Submit | **Org Admin ขึ้นไปเท่านั้น** พร้อมระบุเหตุผล | — |
| ดู RFA ที่ Draft | เฉพาะคนในองค์กรเดียวกัน | องค์กรอื่นมองไม่เห็น |
| ดู RFA ที่ Submitted แล้ว | ทุกคนที่มีสิทธิ์ใน Project | — |
| จัดการ RFA Types (Master) | Superadmin | Global |

---

## 3.3.6. การอ้างอิง Drawing Revisions (rfa_items)

- 1 RFA Revision สามารถอ้างอิง Drawing Revision ได้หลายรายการ
- 1 แถวใน `rfa_items` อ้างอิง Drawing Revision ได้ **เพียง 1 รายการเท่านั้น** โดยต้องเป็น `shop_drawing_revision` หรือ `asbuilt_drawing_revision` อย่างใดอย่างหนึ่ง (ไม่ใช่ทั้งคู่)
- `item_type` ENUM: `'SHOP'` | `'AS_BUILT'` — กำหนดว่า FK ไหนที่ต้อง NOT NULL
- 1 Drawing Revision สามารถถูกอ้างอิงโดยหลาย RFA ได้ (แต่ดู EC-RFA-001)

### Unique Constraint:
- `(rfa_revision_id, shop_drawing_revision_id)` — ห้าม Drawing เดิมซ้ำใน RFA เดียวกัน
- `(rfa_revision_id, asbuilt_drawing_revision_id)` — เช่นเดียวกัน

---

## 3.3.7. Status Codes (rfa_status_codes)

| status_code | ชื่อ | ความหมาย |
|---|---|---|
| `DFT` | Draft | ฉบับร่าง — มองเห็นเฉพาะ Originator Org |
| `FAP` | For Approve | ส่งเพื่อขออนุมัติ |
| `FRE` | For Review | ส่งเพื่อตรวจสอบ |
| `FCO` | For Construction | อนุมัติให้ก่อสร้างได้ |
| `ASB` | AS-Built | แบบก่อสร้างจริง |
| `OBS` | Obsolete | ไม่ใช้งานแล้ว |
| `CC` | Canceled | ยกเลิก |

---

## 3.3.8. Approve Codes (rfa_approve_codes)

ผลการอนุมัติบันทึกใน `rfa_revisions.rfa_approve_code_id`:

| approve_code | ชื่อ | ความหมาย |
|---|---|---|
| `1A` | Approved by Authority | อนุมัติโดยหน่วยงานที่มีอำนาจ |
| `1C` | Approved by CSC | อนุมัติโดย CSC |
| `1N` | Approved As Note | อนุมัติพร้อมบันทึก |
| `1R` | Approved with Remarks | อนุมัติพร้อมข้อสังเกต |
| `3C` | Consultant Comments | มีความเห็นจากที่ปรึกษา |
| `3R` | Revise and Resubmit | ขอให้แก้ไขและส่งใหม่ |
| `4X` | Reject | ปฏิเสธ |
| `5N` | No Further Action | ไม่ต้องดำเนินการเพิ่มเติม |

---

## 3.3.9. Workflow (Unified Workflow)

RFA ใช้ Unified Workflow Engine — ดูรายละเอียดที่ `01-03-06-unified-workflow.md`

สถานะการสร้าง Revision ใหม่:
- ห้ามมี 2 Active Revision พร้อมกัน (EC-RFA-002)
- สร้าง Rev.B ได้ก็ต่อเมื่อ Rev.A มีผลสุดท้ายแล้ว (`3R`, `4X`, หรือ Approved)

---

## 3.3.10. Business Rules และ Edge Cases

| รหัส | กฎ | Severity |
|---|---|---|
| **EC-RFA-001** | 1 Shop Drawing Revision มี Active RFA ได้สูงสุด 1 ฉบับ (ยกเว้นถูก REJECTED/CANCELLED แล้ว) | 🔴 Critical |
| **EC-RFA-002** | ห้ามสร้าง Revision ใหม่ถ้า Revision ก่อนหน้ายังไม่มีคำตอบสุดท้าย | 🟠 High |
| **EC-RFA-003** | Discipline ต้องเลือกก่อนเสมอ ไม่มี Auto-detection (AI Classification เป็น Phase 3) | 🟡 Medium |
| **EC-RFA-004** | Transmittal ที่มี RFA Submit ได้ก็ต่อเมื่อทุก RFA อยู่ในสถานะ READY (ไม่ใช่ DRAFT) | 🟠 High |

ดูรายละเอียดครบที่ `01-06-edge-cases-and-rules.md` หมวด "Module 4: RFA & Drawing Edge Cases"
