# 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"