260324:1349 Refactor RFA #01
This commit is contained in:
@@ -1,44 +1,166 @@
|
||||
# 3.3 RFA Management (การจัดการเอกสาขออนุมัติ)
|
||||
# 3.3 RFA Management (การจัดการเอกสารขออนุมัติ)
|
||||
|
||||
---
|
||||
|
||||
title: 'Functional Requirements: RFA Management'
|
||||
version: 1.8.0
|
||||
status: first-draft
|
||||
version: 1.8.1
|
||||
status: updated
|
||||
owner: Nattanin Peancharoen
|
||||
last_updated: 2026-02-23
|
||||
last_updated: 2026-03-24
|
||||
related:
|
||||
|
||||
- specs/01-requirements/01-01-objectives.md
|
||||
- specs/02-architecture/README.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. วัตถุประสงค์:
|
||||
## 3.3.1. วัตถุประสงค์
|
||||
|
||||
- เอกสารขออนุมัติ (RFA) ภายใน โครงการ (Projects)
|
||||
เอกสารขออนุมัติ (RFA — Request For Approval) ใช้สำหรับส่งเอกสารหรือสิ่งของเพื่อขออนุมัติจากผู้ว่าจ้างหรือที่ปรึกษา ภายในโครงการ (Project) — **ไม่ได้จำกัดแค่แบบก่อสร้าง** ประเภทของ RFA (RFA Type) เป็นตัวกำหนดว่าต้องแนบ Drawing Revision หรือไฟล์แนบ:
|
||||
|
||||
## 3.3.2. ประเภทเอกสาร:
|
||||
- **ประเภทที่อ้างอิง Drawing** (DDW, SDW, ADW): ผูก Drawing Revision ได้หลายรายการผ่าน `rfa_items`
|
||||
- **ประเภทอื่น** (DOC, MAT, ฯลฯ): แนบได้เพียง 1 ไฟล์ผ่าน `correspondence_attachments`
|
||||
|
||||
- ระบบต้องรองรับเอกสารรูปแบบ ไฟล์ PDF
|
||||
- เอกสารขออนุมัติ (RFA) สามารถมีได้หลาย revision
|
||||
- มีประถทของเอกสาร ได้หลายประเภท (RFA Types) และสามารถเพิ่มประเภทใหม่ได้ในภายหลัง
|
||||
---
|
||||
|
||||
## 3.3.3. การสร้างเอกสาร:
|
||||
## 3.3.2. โครงสร้างข้อมูล (Database Tables)
|
||||
|
||||
- ผู้ใช้ที่มีสิทธิ์ (เช่น Document Control) สามารถสร้างเอกสารขออนุมัติ (RFA) รอไว้ในสถานะ ฉบับร่าง" (Draft) ได้ ซึ่งผู้ใช้งานต่างองค์กรจะมองไม่เห็น
|
||||
- เมื่อเอกสารเปลี่ยนสถานะเป็น "Submitted" แล้ว การแก้ไข, ถอนเอกสารกลับไปสถานะ Draft, หรือยกเลิก (Cancel) จะต้องทำโดยผู้ใช้ระดับ Admin ขึ้นไป พร้อมระบุเหตุผล
|
||||
RFA ใช้ pattern **Correspondence + Extension**:
|
||||
|
||||
## 3.3.4. การอ้างอิงและจัดกลุ่ม:
|
||||
| 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: ผลการอนุมัติ |
|
||||
|
||||
- RFA สามารถอ้างถึง (Reference) แบบก่อสร้าง (Shop Drawing) ได้หลายฉบับ
|
||||
- การสร้าง RFA ต้องสร้างเอกสารแม่ใน `correspondences` โดยใช้ `correspondence_types.type_code = 'RFA'`
|
||||
- ประเภทย่อยของ RFA ต้องเก็บใน `rfas.rfa_type_id`
|
||||
- ถ้า `rfa_types.type_code` เป็น `DDW` หรือ `SDW` ระบบต้องบังคับให้เลือกอย่างน้อย 1 `shop_drawing_revision`
|
||||
- ถ้า `rfa_types.type_code` เป็น `ADW` ระบบต้องบังคับให้เลือกอย่างน้อย 1 `asbuilt_drawing_revision`
|
||||
- 1 แถวใน `rfa_items` ต้องอ้างอิง Drawing Revision ได้เพียง 1 รายการเท่านั้น โดยเป็น `shop_drawing_revision` หรือ `asbuilt_drawing_revision` อย่างใดอย่างหนึ่ง
|
||||
**ข้อสำคัญ:** `rfas.id` ใช้ FK ชี้ไปที่ `correspondences.id` (ไม่มี AUTO_INCREMENT ของตัวเอง)
|
||||
|
||||
## 3.3.5. Workflow (Unified Workflow):
|
||||
---
|
||||
|
||||
- ระบบต้องรองรับ Workflow ที่เป็นแบบ Unified Workflow
|
||||
## 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_attachments` (1 ไฟล์) | ไม่บังคับ |
|
||||
|
||||
---
|
||||
|
||||
## 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`
|
||||
|
||||
---
|
||||
|
||||
## 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"
|
||||
|
||||
Reference in New Issue
Block a user