Files
lcbp3/specs/01-requirements/01-03-modules/01-03-03-rfa.md
T
admin 7231870e02
CI / CD Pipeline / build (push) Successful in 22m7s
CI / CD Pipeline / deploy (push) Failing after 9m6s
690331:1259 Correspondence Page Refactor by GPT-5.3-Codex Medium #01
2026-03-31 12:59:30 +07:00

178 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.14.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"