178 lines
10 KiB
Markdown
178 lines
10 KiB
Markdown
# 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"
|