260324:1349 Refactor RFA #01
This commit is contained in:
@@ -3,37 +3,168 @@
|
||||
---
|
||||
|
||||
title: 'Functional Requirements: Correspondence 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-06-unified-workflow.md
|
||||
- specs/01-requirements/01-03-modules/01-03-08-circulation-sheet.md
|
||||
- specs/01-requirements/01-06-edge-cases-and-rules.md (EC-CORR-001 ถึง EC-CORR-003)
|
||||
- specs/03-Data-and-Storage/03-01-data-dictionary.md
|
||||
- specs/01-requirements/01-02-business-rules/01-02-01-rbac-matrix.md
|
||||
|
||||
---
|
||||
|
||||
## 3.2.1. วัตถุประสงค์:
|
||||
## 3.2.1. วัตถุประสงค์
|
||||
|
||||
- เอกสารโต้ตอบ (Correspondences) ระหว่างองค์กรณ์-องค์กรณ์ ภายใน โครงการ (Projects) และระหว่าง องค์กรณ์-องค์กรณ์ ภายนอก โครงการ (Projects), รองรับ To (ผู้รับหลัก) และ CC (ผู้รับสำเนา) หลายองค์กรณ์
|
||||
เอกสารโต้ตอบ (Correspondence) คือ **โครงสร้างข้อมูลหลัก (Parent)** ของเอกสารทุกประเภทในระบบ — ทั้ง RFA, RFI, Transmittal, Letter ฯลฯ เป็นการสื่อสารระหว่างองค์กร-องค์กร ภายในโครงการ (Project) รองรับผู้รับหลัก (TO) และผู้รับสำเนา (CC) ได้หลายองค์กร
|
||||
|
||||
## 3.2.2. ประเภทเอกสาร:
|
||||
---
|
||||
|
||||
- ระบบต้องรองรับเอกสารรูปแบบ ไฟล์ PDF, ZIP
|
||||
- เอกสารโต้ตอบ (Correspondence) สามารถมีได้หลายประเภท (Types) เช่น จดหมาย (Letter), อีเมล์ (Email), Request for Information (RFI), รวมถึง เอกสารขออนุมัติ (RFA) แต่ละ revision และสามารถเพิ่มประเภทใหม่ได้ในภายหลัง
|
||||
## 3.2.2. โครงสร้างข้อมูล (Database Tables)
|
||||
|
||||
## 3.2.3. การสร้างเอกสาร (Correspondence):
|
||||
| Table | บทบาท |
|
||||
|---|---|
|
||||
| `correspondences` | ข้อมูล Master: เลขเอกสาร, type, project, originator — ไม่เปลี่ยนตาม revision |
|
||||
| `correspondence_revisions` | ประวัติแต่ละ Revision: subject, body, status, due_date |
|
||||
| `correspondence_recipients` | ผู้รับ TO/CC (M:N กับ organizations) |
|
||||
| `correspondence_references` | การอ้างอิงข้ามเอกสาร (M:N) |
|
||||
| `correspondence_tags` | Tags ที่ติดกับเอกสาร (M:N) |
|
||||
| `correspondence_attachments` | ไฟล์แนบ (M:N กับ attachments) |
|
||||
| `correspondence_types` | Master: ประเภทเอกสาร (Global) |
|
||||
| `correspondence_status` | Master: สถานะเอกสาร (Global) |
|
||||
|
||||
- ผู้ใช้ที่มีสิทธิ์ (เช่น Document Control) สามารถสร้างเอกสารรอไว้ในสถานะ ฉบับร่าง" (Draft) ได้ ซึ่งผู้ใช้งานต่างองค์กรจะมองไม่เห็น
|
||||
- เมื่อเอกสารเปลี่ยนสถานะเป็น "Submitted" แล้ว การแก้ไข, ถอนเอกสารกลับไปสถานะ Draft, หรือยกเลิก (Cancel) จะต้องทำโดยผู้ใช้ระดับ Admin ขึ้นไป พร้อมระบุเหตุผล
|
||||
**ข้อสำคัญ:** `correspondence_number` ต้อง UNIQUE ภายใน Project เดียวกัน (`uq_corr_no_per_project`)
|
||||
|
||||
## 3.2.4. การอ้างอิงและจัดกลุ่ม:
|
||||
---
|
||||
|
||||
- เอกสารสามารถอ้างถึง (Reference) เอกสารฉบับก่อนหน้าได้หลายฉบับ
|
||||
- สามารถกำหนด Tag ได้หลาย Tag เพื่อจัดกลุ่มและใช้ในการค้นหาขั้นสูง
|
||||
## 3.2.3. ประเภทเอกสาร (correspondence_types)
|
||||
|
||||
## 3.2.5. Workflow (Unified Workflow):
|
||||
ประเภทเป็น Global Master — จัดการโดย Superadmin เท่านั้น:
|
||||
|
||||
- ระบบต้องรองรับ Workflow ที่เป็นแบบ Unified Workflow
|
||||
| type_code | ชื่อ | มี Extension Table |
|
||||
|---|---|---|
|
||||
| `RFA` | Request for Approval | ✅ `rfas` + `rfa_revisions` |
|
||||
| `RFI` | Request for Information | ❌ (ใช้ `details` JSON) |
|
||||
| `TRANSMITTAL` | Transmittal | ❌ (ใช้ `details` JSON) |
|
||||
| `EMAIL` | Email | ❌ |
|
||||
| `INSTRUCTION` | Instruction | ❌ |
|
||||
| `LETTER` | Letter | ❌ |
|
||||
| `MEMO` | Memorandum | ❌ |
|
||||
| `MOM` | Minutes of Meeting | ❌ |
|
||||
| `NOTICE` | Notice | ❌ |
|
||||
| `OTHER` | Other | ❌ |
|
||||
|
||||
ไฟล์แนบรองรับ **PDF, ZIP**
|
||||
|
||||
---
|
||||
|
||||
## 3.2.4. Fields ที่ต้องกรอกเมื่อสร้าง Correspondence
|
||||
|
||||
| Field | Required | หมายเหตุ |
|
||||
|---|---|---|
|
||||
| Project | ✅ | UUID |
|
||||
| Correspondence Type | ✅ | INT id (Global) |
|
||||
| Subject | ✅ | ขั้นต่ำ 5 ตัวอักษร — เก็บใน `correspondence_revisions` |
|
||||
| To Organization | ✅ | UUID — `recipient_type = 'TO'` (≥ 1) |
|
||||
| CC Organizations | ❌ | UUID[] — `recipient_type = 'CC'` |
|
||||
| Discipline | ❌ | INT — กรองตาม Contract |
|
||||
| Body | ❌ | เนื้อหา — เก็บใน `correspondence_revisions` |
|
||||
| Description | ❌ | คำอธิบาย Revision |
|
||||
| Remarks | ❌ | หมายเหตุ |
|
||||
| Document Date | ❌ | วันที่ในเอกสาร |
|
||||
| Due Date | ❌ | กำหนดส่งคืน |
|
||||
| Tags | ❌ | UUID[] — จัดกลุ่มเพื่อค้นหาขั้นสูง |
|
||||
| References | ❌ | UUID[] — อ้างอิงเอกสารฉบับก่อนหน้า |
|
||||
| Attachments | ❌ | PDF/ZIP — ผ่าน ClamAV scan |
|
||||
| Is Internal | ❌ | `is_internal_communication = 1` → ใช้ Circulation แทน |
|
||||
|
||||
### Document Number Preview
|
||||
|
||||
ระบบแสดง Preview เลขเอกสารแบบ Real-time ก่อน Submit เมื่อกรอกครบ: Project + Type + Discipline + To Organization โดยเรียก `POST /api/correspondences/preview-number`
|
||||
|
||||
---
|
||||
|
||||
## 3.2.5. การสร้างและสิทธิ์ (RBAC)
|
||||
|
||||
| การกระทำ | Role ที่อนุญาต | หมายเหตุ |
|
||||
|---|---|---|
|
||||
| สร้าง Correspondence (Draft) | Document Control, Org Admin, Superadmin | ภายในองค์กรตัวเอง |
|
||||
| Submit Correspondence | Document Control, Org Admin, Superadmin | เปลี่ยนสถานะ DRAFT → SUB* |
|
||||
| แก้ไข/ถอนกลับ/ยกเลิก หลัง Submit | **Org Admin ขึ้นไปเท่านั้น** พร้อมระบุเหตุผล | — |
|
||||
| ดู Correspondence ที่ Draft | เฉพาะคนในองค์กรเดียวกัน | องค์กรอื่นมองไม่เห็น |
|
||||
| ดู Correspondence ที่ Submitted แล้ว | ทุกคนที่มีสิทธิ์ใน Project | รวม TO และ CC org |
|
||||
| จัดการ Correspondence Types (Master) | Superadmin | Global |
|
||||
|
||||
---
|
||||
|
||||
## 3.2.6. Status Codes (correspondence_status)
|
||||
|
||||
สถานะแบ่งตามหมวดและ Actor:
|
||||
|
||||
| หมวด | status_code | ชื่อ |
|
||||
|---|---|---|
|
||||
| **Draft** | `DRAFT` | Draft — มองเห็นเฉพาะ Originator Org |
|
||||
| **Submitted** | `SUBOWN` | Submitted to Owner |
|
||||
| | `SUBDSN` | Submitted to Designer |
|
||||
| | `SUBCSC` | Submitted to CSC |
|
||||
| | `SUBCON` | Submitted to Contractor |
|
||||
| | `SUBOTH` | Submitted to Others |
|
||||
| **Reply** | `REPOWN` | Reply by Owner |
|
||||
| | `REPDSN` | Reply by Designer |
|
||||
| | `REPCSC` | Reply by CSC |
|
||||
| | `REPCON` | Reply by Contractor |
|
||||
| | `REPOTH` | Reply by Others |
|
||||
| **Resubmitted** | `RSBOWN` | Resubmitted by Owner |
|
||||
| | `RSBDSN` | Resubmitted by Designer |
|
||||
| | `RSBCSC` | Resubmitted by CSC |
|
||||
| | `RSBCON` | Resubmitted by Contractor |
|
||||
| **Closed** | `CLBOWN` | Closed by Owner |
|
||||
| | `CLBDSN` | Closed by Designer |
|
||||
| | `CLBCSC` | Closed by CSC |
|
||||
| | `CLBCON` | Closed by Contractor |
|
||||
| **Canceled** | `CCBOWN` | Canceled by Owner |
|
||||
| | `CCBDSN` | Canceled by Designer |
|
||||
| | `CCBCSC` | Canceled by CSC |
|
||||
| | `CCBCON` | Canceled by Contractor |
|
||||
|
||||
---
|
||||
|
||||
## 3.2.7. การอ้างอิงและ Tags
|
||||
|
||||
- **References** (`correspondence_references`): M:N — เอกสารหนึ่งอ้างถึงได้หลายฉบับ ทิศทางเดียว (src → tgt)
|
||||
- **Tags** (`correspondence_tags` + `tags`): M:N — Tag ผูกกับ Project หรือ Global (project_id = NULL)
|
||||
- ทั้งสองอย่างใช้ค้นหาขั้นสูงใน Elasticsearch Index
|
||||
|
||||
---
|
||||
|
||||
## 3.2.8. Revision Model
|
||||
|
||||
- 1 Correspondence Master → หลาย Revision (1:N)
|
||||
- `is_current = TRUE` มีได้เพียง 1 แถวต่อ correspondence (UNIQUE constraint)
|
||||
- `revision_label`: A, B, C, ... (หรือ 1.1, 1.2 แล้วแต่ type)
|
||||
- `revision_number`: 0-based integer สำหรับ sorting
|
||||
|
||||
---
|
||||
|
||||
## 3.2.9. Workflow (Unified Workflow)
|
||||
|
||||
Correspondence ใช้ Unified Workflow Engine — ดูรายละเอียดที่ `01-03-06-unified-workflow.md`
|
||||
|
||||
เมื่อ Correspondence ถูก Submit → ผู้รับ (TO/CC) สามารถสร้าง **Circulation Sheet** เพื่อมอบหมายงานภายในองค์กร (ดู `01-03-08-circulation-sheet.md`)
|
||||
|
||||
---
|
||||
|
||||
## 3.2.10. Business Rules และ Edge Cases
|
||||
|
||||
| รหัส | กฎ | Severity |
|
||||
|---|---|---|
|
||||
| **EC-CORR-001** | Cancel Correspondence ที่มี Circulation เปิดอยู่ → ต้องยืนยันก่อน + Force Close Circulation ทั้งหมด + Audit Log | 🔴 Critical |
|
||||
| **EC-CORR-002** | Reply ต่อ Correspondence ที่ถูก Cancel → ทำได้แต่ UI ต้องแสดง Warning | 🟡 Medium |
|
||||
| **EC-CORR-003** | Originator และ Recipient เป็นองค์กรเดียวกัน → Block (ใช้ Circulation แทน) | 🟡 Medium |
|
||||
|
||||
ดูรายละเอียดครบที่ `01-06-edge-cases-and-rules.md` หมวด "Module 7: Correspondence Edge Cases"
|
||||
|
||||
Reference in New Issue
Block a user