912 lines
62 KiB
Markdown
912 lines
62 KiB
Markdown
# ð Documents Management System Version 1.5.1: Application Requirements Specification
|
||
|
||
**āļŠāļāļēāļāļ°:** FINAL-Rev.01
|
||
**āļ§āļąāļāļāļĩāđ:** 2025-12-04
|
||
**āļāđāļēāļāļāļīāļāļāļ·āđāļāļāļēāļ:** v1.5.0
|
||
**Classification:** Internal Technical Documentation
|
||
|
||
## ð 1. Objectives
|
||
|
||
# ð Section 1: Objectives (āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ)
|
||
---
|
||
title: 'Objectives'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
|
||
āļŠāļĢāđāļēāļāđāļ§āđāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļāļĢāļīāļŦāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāđāļāļĢāļāļāļēāļĢ (Document Management System - DMS) āđāļāļāļāļĢāļāļ§āļāļāļĢ āļāļĩāđāđāļāđāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļŠāļđāļāļŠāļļāļ āļāļ§āļēāļĄāļāļđāļāļāđāļāļāļāļāļāļāđāļāļĄāļđāļĨ (Data Integrity) āđāļĨāļ°āļĢāļāļāļĢāļąāļāļāļēāļĢāļāļĒāļēāļĒāļāļąāļ§āđāļāļāļāļēāļāļ (Scalability) āđāļāļĒāđāļāđāđāļāļāļąāļāļŦāļē Race Condition āđāļĨāļ°āđāļāļīāđāļĄāļāļ§āļēāļĄāđāļŠāļāļĩāļĒāļĢāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļĨāđ āđāļĨāļ°āđāļāđ Unified Workflow Engine āđāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļāļļāļĄāļąāļāļīāļāļąāđāļāļŦāļĄāļāđāļāļ·āđāļāļāļ§āļēāļĄāļĒāļ·āļāļŦāļĒāļļāđāļ
|
||
|
||
- āļĄāļĩāļāļąāļāļāđāļāļąāļāļŦāļĨāļąāļāđāļāļāļēāļĢāļāļąāļāđāļŦāļĨāļ āļāļąāļāđāļāđāļ āļāđāļāļŦāļē āđāļāļĢāđ āđāļĨāļ°āļāļ§āļāļāļļāļĄāļŠāļīāļāļāļīāđāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļāļŠāļēāļĢ
|
||
- āļāđāļ§āļĒāļĨāļāļāļēāļĢāđāļāđāđāļāļāļŠāļēāļĢāļāļĢāļ°āļāļēāļĐ āđāļāļīāđāļĄāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāđāļāļāļēāļĢāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨ
|
||
- āđāļāļīāđāļĄāļāļ§āļēāļĄāļŠāļ°āļāļ§āļāđāļāļāļēāļĢāļāļģāļāļēāļāļĢāđāļ§āļĄāļāļąāļāļĢāļ°āļŦāļ§āđāļēāļāļāļāļāđāļāļĢ
|
||
- āļāļĢāļąāļāļāļĢāļļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļāļāļĢāļ°āļāļāļāđāļ§āļĒāļĄāļēāļāļĢāļāļēāļĢāļāđāļāļāļāļąāļāļāļĩāđāļāļąāļāļŠāļĄāļąāļĒ
|
||
- āđāļāļīāđāļĄāļāļ§āļēāļĄāļāļāļāļēāļāļāļāļāļĢāļ°āļāļāļāđāļ§āļĒāļāļĨāđāļ resilience patterns
|
||
- āļŠāļĢāđāļēāļāļĢāļ°āļāļ monitoring āđāļĨāļ° observability āļāļĩāđāļāļĢāļāļāļāļĨāļļāļĄ
|
||
|
||
## ð ïļ 2. System Architecture
|
||
|
||
# ð ïļ Section 2: System Architecture (āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāđāļĨāļ°āđāļāļāđāļāđāļĨāļĒāļĩ)
|
||
---
|
||
title: 'System Architecture'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: - specs/01-objectives.md
|
||
---
|
||
|
||
āļāļ·āđāļāļāļģāļŦāļāļ āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāđāļāļ Headless/API-First āļāļĩāđāļāļąāļāļŠāļĄāļąāļĒ āļāļģāļāļēāļāļāļąāđāļāļŦāļĄāļāļāļ QNAP Server āļāđāļēāļ Container Station āđāļāļ·āđāļāļāļ§āļēāļĄāļŠāļ°āļāļ§āļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļĨāļ°āļāļģāļĢāļļāļāļĢāļąāļāļĐāļē
|
||
|
||
### 2.1 Infrastructure & Environment
|
||
- Domain: `np-dms.work`, `www.np-dms.work`
|
||
- IP: 159.192.126.103
|
||
- Server: QNAP (Model: TS-473A, RAM: 32GB, CPU: AMD Ryzen V1500B)
|
||
- Containerization: Container Station (Docker & Docker Compose) āđāļāđ UI āļāļāļ Container Station āđāļāđāļāļŦāļĨāļąāļ āđāļāļāļēāļĢ configuration āđāļĨāļ°āļāļēāļĢāļĢāļąāļ docker command
|
||
- Development Environment: VS Code/Cursor on Windows 11
|
||
- Data Storage: /share/dms-data āļāļ QNAP
|
||
- āļāđāļāļāļģāļāļąāļ: āđāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļāđ .env āđāļāļāļēāļĢāļāļģāļŦāļāļāļāļąāļ§āđāļāļĢāļ āļēāļĒāļāļāļāđāļāđ āļāđāļāļāļāļģāļŦāļāļāđāļ docker-compose.yml āđāļāđāļēāļāļąāđāļ
|
||
|
||
### 2.2 Configuration Management
|
||
- āđāļāđ docker-compose.yml āļŠāļģāļŦāļĢāļąāļ environment variables āļāļēāļĄāļāđāļāļāļģāļāļąāļāļāļāļ QNAP
|
||
- Secrets Management: āđāļāđ docker-compose.override.yml (gitignore) āļŠāļģāļŦāļĢāļąāļ secret injection, Docker secrets āļŦāļĢāļ·āļ Hashicorp Vault, encrypted env vars
|
||
- Development environment āļĒāļąāļāđāļāđ .env āđāļāđ āđāļāđāļāđāļāļāđāļĄāđ commit āđāļāđāļē version control
|
||
- āļĄāļĩ configuration validation during application startup
|
||
- āđāļĒāļ configuration āļāļēāļĄ environment (development, staging, production)
|
||
- Docker Network: lcbp3
|
||
|
||
### 2.3 Core Services
|
||
- Code Hosting: Gitea (`git.np-dms.work`)
|
||
- Backend / Data Platform: NestJS (`backend.np-dms.work`)
|
||
- Database: MariaDB 10.11 (`db.np-dms.work`)
|
||
- Database Management UI: phpMyAdmin (`pma.np-dms.work`)
|
||
- Frontend: Next.js (`lcbp3.np-dms.work`)
|
||
- Workflow Automation: n8n (`n8n.np-dms.work`)
|
||
- Reverse Proxy: Nginx Proxy Manager (`npm.np-dms.work`)
|
||
- Search Engine: Elasticsearch
|
||
- Cache: Redis
|
||
|
||
### 2.4 Business Logic & Consistency
|
||
- Unified Workflow Engine (central) with DSL JSON configuration
|
||
- Versioning of workflow definitions, optimistic locking with Redis lock for document numbering
|
||
- No SQL triggers; all business logic in NestJS services
|
||
|
||
## ðĶ 3. Functional Requirements
|
||
|
||
### 3.1 Project Management
|
||
|
||
# 3.1 Project Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļĢāļāļāļēāļĢāđāļĨāļ°āļāļāļāđāļāļĢ)
|
||
---
|
||
title: "Functional Requirements: Project Management"
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.1.1. āđāļāļĢāļāļāļēāļĢ (Projects): āļĢāļ°āļāļāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāļ āļēāļĒāđāļāļŦāļĨāļēāļĒāđāļāļĢāļāļāļēāļĢāđāļāđ (āļāļąāļāļāļļāļāļąāļāļĄāļĩ 4 āđāļāļĢāļāļāļēāļĢ āđāļĨāļ°āļāļ°āđāļāļīāđāļĄāļāļķāđāļāđāļāļāļāļēāļāļ)
|
||
- 3.1.2. āļŠāļąāļāļāļē (Contracts): āļĢāļ°āļāļāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāļ āļēāļĒāđāļāđāļāđāļĨāļ°āļŠāļąāļāļāļēāđāļāđ āđāļāđāļāđāļĨāļ°āđāļāļĢāļāļāļēāļĢ āļĄāļĩāđāļāđāļŦāļĨāļēāļĒāļŠāļąāļāļāļē āļŦāļĢāļ·āļāļāļĒāđāļēāļāļāđāļāļĒ 1 āļŠāļąāļāļāļē
|
||
- 3.1.3. āļāļāļāđāļāļĢ (Organizations):
|
||
- āļĄāļĩāļŦāļĨāļēāļĒāļāļāļāđāļāļĢāđāļāđāļāļĢāļāļāļēāļĢ Owner, Designer, Consultant āļŠāļēāļĄāļēāļĢāļāļāļĒāļđāđāļŦāļĨāļēāļĒāđāļāļĢāļāļāļēāļĢāđāļĨāļ°āļŠāļąāļāļāļēāđāļāđ
|
||
- Contractor āļāļ°āļāļ·āļ 1 āļŠāļąāļāļāļē āđāļĨāļ°āļāļĒāļđāđāđāļ 1 āđāļāļĢāļāļāļēāļĢāđāļāđāļēāļāļąāđāļ
|
||
|
||
### 3.2 Correspondence Management
|
||
|
||
# 3.2 āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāđāļāđāļāļāļ (Correspondence Management)
|
||
---
|
||
title: 'Functional Requirements: Correspondence Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.2.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ: āđāļāļāļŠāļēāļĢāđāļāđāļāļāļāļĢāļ°āļŦāļ§āđāļēāļāļāļāļāđāļāļĢāļ āļēāļĒāđāļāđāļĨāļ°āļ āļēāļĒāļāļāļāđāļāļĢāļāļāļēāļĢ, āļĢāļāļāļĢāļąāļ To āđāļĨāļ° CC āļŦāļĨāļēāļĒāļāļāļāđāļāļĢ
|
||
- 3.2.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ: PDF, ZIP; Types include Letter, Email, RFI, RFA (with revisions)
|
||
- 3.2.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ: āļāļđāđāđāļāđāļāļĩāđāļĄāļĩāļŠāļīāļāļāļīāđāļŠāļĢāđāļēāļ Draft, Submit requires Admin approval
|
||
- 3.2.4. āļāļēāļĢāļāđāļēāļāļāļīāļāđāļĨāļ°āļāļąāļāļāļĨāļļāđāļĄ: āļĢāļāļāļĢāļąāļāļŦāļĨāļēāļĒ Reference, Tagging
|
||
- 3.2.5. Workflow: āļĢāļāļāļĢāļąāļ Unified Workflow
|
||
|
||
### 3.3 RFA Management
|
||
|
||
# 3.3 RFA Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļāļāļāļāļļāļĄāļąāļāļī)
|
||
---
|
||
title: 'Functional Requirements: RFA Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.3.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ: āđāļāļāļŠāļēāļĢāļāļāļāļāļļāļĄāļąāļāļīāļ āļēāļĒāđāļāđāļāļĢāļāļāļēāļĢ
|
||
- 3.3.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ: PDF, āļĢāļāļāļĢāļąāļāļŦāļĨāļēāļĒ revision āđāļĨāļ°āļŦāļĨāļēāļĒāļāļĢāļ°āđāļ āļ RFA
|
||
- 3.3.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ: Draft creation by Document Control, Submit requires Admin
|
||
- 3.3.4. āļāļēāļĢāļāđāļēāļāļāļīāļ: āļŠāļēāļĄāļēāļĢāļāļāđāļēāļāļāļķāļ Shop Drawing āđāļāđāļŦāļĨāļēāļĒāļāļāļąāļ
|
||
- 3.3.5. Workflow: āļĢāļāļāļĢāļąāļ Unified Workflow
|
||
|
||
### 3.4 Contract Drawing Management
|
||
|
||
# 3.4 Contract Drawing Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļāļđāđāļŠāļąāļāļāļē)
|
||
---
|
||
title: 'Functional Requirements: Contract Drawing Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.4.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ: āđāļāđāđāļāļ·āđāļāļāđāļēāļāļāļīāļāđāļĨāļ°āļāļĢāļ§āļāļŠāļāļ
|
||
- 3.4.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ: PDF
|
||
- 3.4.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ: āļāļđāđāļĄāļĩāļŠāļīāļāļāļīāđāļŠāļĢāđāļēāļāđāļĨāļ°āđāļāđāđāļ
|
||
- 3.4.4. āļāļēāļĢāļāđāļēāļāļāļīāļ: āđāļāđāļŠāļģāļŦāļĢāļąāļāļāđāļēāļāļāļīāļāđāļ Shop Drawings
|
||
|
||
### 3.5 Shop Drawing Management
|
||
|
||
# 3.5 Shop Drawing Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļāđāļāļŠāļĢāđāļēāļ)
|
||
---
|
||
title: 'Functional Requirements: Shop Drawing Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.5.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ: āđāļāđāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļĨāļ°āļāļąāļāļŠāđāļāļāđāļ§āļĒ RFA
|
||
- 3.5.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ: PDF, DWG, ZIP
|
||
- 3.5.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ: āļāļđāđāļĄāļĩāļŠāļīāļāļāļīāđāļŠāļĢāđāļēāļ/āđāļāđāđāļ, Draft visibility control
|
||
- 3.5.4. āļāļēāļĢāļāđāļēāļāļāļīāļ: āđāļāđāđāļ RFA, āļĄāļĩāļāļēāļĢāļāļąāļāļŦāļĄāļ§āļāļŦāļĄāļđāđ, āđāļāđāļĨāļ° revision āļĄāļĩ RFA āļŦāļāļķāđāļāļāļāļąāļ
|
||
|
||
### 3.6 Unified Workflow Management
|
||
|
||
# 3.6 Unified Workflow Management (āļāļēāļĢāļāļąāļāļāļēāļĢ Workflow)
|
||
---
|
||
title: 'Functional Requirements: Unified Workflow Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related: -
|
||
---
|
||
- 3.6.1 Workflow Definition: Admin can create/edit rules via UI DSL Editor, define State, Transition, Role, Condition
|
||
- 3.6.2 Workflow Execution: Create instances polymorphic to documents, support actions Approve, Reject, Comment, Return, auto-actions
|
||
- 3.6.3 Flexibility: Parallel Review, Conditional Flow
|
||
- 3.6.4 Approval Flow: Supports complex multi-organization sequences and return paths
|
||
- 3.6.5 Management: Deadline setting, notifications, step skipping, backtrack
|
||
|
||
# 3.7 Transmittals Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāļāļģāļŠāđāļ)
|
||
---
|
||
title: 'Functional Requirements: Transmittals Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
---
|
||
## 3.7.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ:
|
||
- āđāļāļāļŠāļēāļĢāļāļģāļŠāđāļ āđāļāđāļŠāļģāļŦāļĢāļąāļ āļāļģāļŠāđāļ Request for Approval (RFAS) āļŦāļĨāļēāļĒāļāļāļąāļ āđāļāļĒāļąāļāļāļāļāđāļāļĢāļāļ·āđāļ
|
||
|
||
## 3.7.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ:
|
||
- āđāļāļĨāđ PDF
|
||
|
||
## 3.7.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ:
|
||
- āļāļđāđāđāļāđāļāļĩāđāļĄāļĩāļŠāļīāļāļāļīāđ āļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāđāļĨāļ°āđāļāđāđāļāđāļāđ
|
||
|
||
## 3.7.4. āļāļēāļĢāļāđāļēāļāļāļīāļāđāļĨāļ°āļāļąāļāļāļĨāļļāđāļĄ:
|
||
- āđāļāļāļŠāļēāļĢāļāļģāļŠāđāļ āđāļāđāļāļŠāđāļ§āļāļŦāļāļķāđāļāđāļ Correspondence
|
||
|
||
# 3.8 Circulation Sheet Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāđāļ§āļĩāļĒāļāđāļāļāļŠāļēāļĢ)
|
||
---
|
||
title: 'Functional Requirements: Circulation Sheet Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
---
|
||
## 3.8.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ:
|
||
- āļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢ āđāļāļāļŠāļēāļĢ (Correspondence) āļāļļāļāļāļāļąāļ āļāļ°āļĄāļĩāđāļāđāļ§āļĩāļĒāļāđāļāļāļŠāļēāļĢāđāļāļ·āđāļāļāļ§āļāļāļļāļĄāđāļĨāļ°āļĄāļāļāļŦāļĄāļēāļĒāļāļēāļāļ āļēāļĒāđāļāļāļāļāđāļāļĢ (āļŠāļēāļĄāļēāļĢāļāļāļđāđāļĨāļ°āđāļāđāđāļāđāļāđāđāļāļāļēāļ°āļāļāđāļāļāļāļāđāļāļĢ)
|
||
|
||
## 3.8.2. āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ:
|
||
- āđāļāļĨāđ PDF
|
||
|
||
## 3.8.3. āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ:
|
||
- āļāļđāđāđāļāđāļāļĩāđāļĄāļĩāļŠāļīāļāļāļīāđāđāļāļāļāļāđāļāļĢāļāļąāđāļ āļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāđāļĨāļ°āđāļāđāđāļāđāļāđ
|
||
|
||
## 3.8.4. āļāļēāļĢāļāđāļēāļāļāļīāļāđāļĨāļ°āļāļąāļāļāļĨāļļāđāļĄ:
|
||
- āļāļēāļĢāļĢāļ°āļāļļāļāļđāđāļĢāļąāļāļāļīāļāļāļāļ:
|
||
- āļāļđāđāļĢāļąāļāļāļīāļāļāļāļāļŦāļĨāļąāļ (Main): āļĄāļĩāđāļāđāļŦāļĨāļēāļĒāļāļ
|
||
- āļāļđāđāļĢāđāļ§āļĄāļāļāļīāļāļąāļāļīāļāļēāļ (Action): āļĄāļĩāđāļāđāļŦāļĨāļēāļĒāļāļ
|
||
- āļāļđāđāļāļĩāđāļāđāļāļāļĢāļąāļāļāļĢāļēāļ (Information): āļĄāļĩāđāļāđāļŦāļĨāļēāļĒāļāļ
|
||
|
||
## 3.8.5. āļāļēāļĢāļāļīāļāļāļēāļĄāļāļēāļ:
|
||
- āļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļ§āļąāļāđāļĨāđāļ§āđāļŠāļĢāđāļ (Deadline) āļŠāļģāļŦāļĢāļąāļāļāļđāđāļĢāļąāļāļāļīāļāļāļāļāļāļĢāļ°āđāļ āļ Main āđāļĨāļ° Action āđāļāđ
|
||
- āļĄāļĩāļĢāļ°āļāļāđāļāđāļāđāļāļ·āļāļāđāļĄāļ·āđāļāļĄāļĩ Circulation āđāļŦāļĄāđ āđāļĨāļ°āđāļāđāļāđāļāļ·āļāļāļĨāđāļ§āļāļŦāļāđāļēāļāđāļāļāļāļķāļāļ§āļąāļāđāļĨāđāļ§āđāļŠāļĢāđāļ
|
||
- āļŠāļēāļĄāļēāļĢāļāļāļīāļ Circulation āđāļāđāđāļĄāļ·āđāļāļāļģāđāļāļīāļāļāļēāļĢāļāļāļāļāļĨāļąāļāđāļāļĒāļąāļāļāļāļāđāļāļĢāļāļđāđāļŠāđāļ (Originator) āđāļĨāđāļ§ āļŦāļĢāļ·āļ āļĢāļąāļāļāļĢāļēāļāđāļĨāđāļ§ (For Information)
|
||
|
||
# 3.9 Logs Management (āļāļĢāļ°āļ§āļąāļāļīāļāļēāļĢāđāļāđāđāļ)
|
||
---
|
||
title: 'Functional Requirements: Logs Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
---
|
||
## 3.9.1. āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ:
|
||
- āđāļāļ·āđāļ āļāļąāļāļāļķāļāļāļēāļĢāļāļĢāļ°āļāļģ CRUD āļāļāļāđāļāļāļŠāļēāļĢāļāļąāđāļāļŦāļĄāļ āļĢāļ§āļĄāļāļķāļāļāļēāļĢ āđāļāđāļēāđāļāđāļāļēāļ āļāļāļ users
|
||
- admin āļŠāļēāļĄāļēāļĢāļāļāļđāļāļĢāļ°āļ§āļąāļāļīāļāļēāļĢāđāļāđāđāļāļāļāļāđāļāļāļŠāļēāļĢāļāļąāđāļāļŦāļĄāļ āļāļĢāđāļāļĄ āļāļąāļāļāļģāļĢāļēāļĒāļāļēāļĒāļāļēāļĄāļāđāļāļāļģāļŦāļāļāļāļĩāđ āļāđāļāļāļāļēāļĢāđāļāđ
|
||
|
||
# 3.10 File Handling Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļĨāđ)
|
||
---
|
||
title: 'Functional Requirements: File Handling Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
---
|
||
## 3.10.1 Two-Phase Storage Strategy:
|
||
1. Phase 1 (Upload): āđāļāļĨāđāļāļđāļāļāļąāļāđāļŦāļĨāļāđāļāđāļēāđāļāļĨāđāļāļāļĢāđ temp/ āđāļĨāļ°āđāļāđāļĢāļąāļ temp_id
|
||
2. Phase 2 (Commit): āđāļĄāļ·āđāļ User āļāļ Submit āļāļāļĢāđāļĄāļŠāļģāđāļĢāđāļ āļĢāļ°āļāļāļāļ°āļĒāđāļēāļĒāđāļāļĨāđāļāļēāļ temp/ āđāļāļĒāļąāļ permanent/{YYYY}/{MM}/ āđāļĨāļ°āļāļąāļāļāļķāļāļĨāļ Database āļ āļēāļĒāđāļ Transaction āđāļāļĩāļĒāļ§āļāļąāļ
|
||
3. Cleanup: āļĄāļĩ Cron Job āļĨāļāđāļāļĨāđāđāļ temp/ āļāļĩāđāļāđāļēāļāđāļāļīāļ 24 āļāļĄ. (Orphan Files)
|
||
|
||
## 3.10.2 Security:
|
||
- Virus Scan (ClamAV) āļāđāļāļāļĒāđāļēāļĒāđāļāđāļē permanent
|
||
- Whitelist File Types: PDF, DWG, DOCX, XLSX, ZIP
|
||
- Max Size: 50MB
|
||
- Access Control: āļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāļāđāļēāļ Junction Table āļāđāļāļāđāļŦāđ Download Link
|
||
|
||
## 3.10.3 āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļāļāļāļāļēāļĢāļāļąāļāđāļāđāļāđāļāļĨāđ:
|
||
- āļāđāļāļāļĄāļĩāļāļēāļĢ scan virus āļŠāļģāļŦāļĢāļąāļāđāļāļĨāđāļāļĩāđāļāļąāļāđāļŦāļĨāļāļāļąāđāļāļŦāļĄāļ āđāļāļĒāđāļāđ ClamAV āļŦāļĢāļ·āļāļāļĢāļīāļāļēāļĢ third-party
|
||
- āļāļģāļāļąāļāļāļĢāļ°āđāļ āļāđāļāļĨāđāļāļĩāđāļāļāļļāļāļēāļ: PDF, DWG, DOCX, XLSX, ZIP (āļāđāļāļāļĢāļ°āļāļļāļĢāļēāļĒāļāļēāļĢāļāļĩāđāļāļąāļāđāļāļ)
|
||
- āļāļāļēāļāđāļāļĨāđāļŠāļđāļāļŠāļļāļ: 50MB āļāđāļāđāļāļĨāđ
|
||
- āđāļāļĨāđāļāđāļāļāļāļđāļāđāļāđāļāļāļāļ web root āđāļĨāļ°āđāļāđāļēāļāļķāļāđāļāđāļāđāļēāļ authenticated endpoint āđāļāđāļēāļāļąāđāļ
|
||
- āļāđāļāļāļĄāļĩ file integrity check (checksum) āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāđāđāļāđāļāļĨāđ
|
||
- Download links āļāđāļāļāļĄāļĩ expiration time (default: 24 āļāļąāđāļ§āđāļĄāļ)
|
||
- āļāđāļāļāļāļąāļāļāļķāļ audit log āļāļļāļāļāļĢāļąāđāļāļāļĩāđāļĄāļĩāļāļēāļĢāļāļēāļ§āļāđāđāļŦāļĨāļāđāļāļĨāđāļŠāļģāļāļąāļ
|
||
|
||
# 3.11 Document Numbering Management (āļāļēāļĢāļāļąāļāļāļēāļĢāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢ)
|
||
---
|
||
title: 'Functional Requirements: Document Numbering Management'
|
||
version: 1.6.0
|
||
status: draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-12-02
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
- specs/03-implementation/document-numbering.md
|
||
- specs/04-operations/document-numbering-operations.md
|
||
- specs/04-data-dictionary/4_Data_Dictionary_V1_4_4.md
|
||
---
|
||
## 3.11.1 āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ:
|
||
- āļĢāļ°āļāļāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢ (Running Number) āđāļāđāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļīāđāļĨāļ°āļĒāļ·āļāļŦāļĒāļļāđāļāļŠāļđāļ
|
||
- āļĢāļ°āļāļāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāļĢāļđāļāđāļāļ (template) āđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢāđāļāđ āļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ°āđāļāļĢāļāļāļēāļĢ, āļāļāļīāļāđāļāļāļŠāļēāļĢ, āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ
|
||
- āļĢāļ°āļāļāļāđāļāļāļĢāļąāļāļāļĢāļ°āļāļąāļ Uniqueness āļāļāļāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢāđāļāļāļļāļāļŠāļāļēāļāļāļēāļĢāļāđ
|
||
- āļĢāļ°āļāļāļāđāļāļāļĢāļāļāļĢāļąāļāļāļēāļĢāļāļģāļāļēāļāđāļāļ concurrent āđāļāđāļāļĒāđāļēāļāļāļĨāļāļāļ āļąāļĒ
|
||
|
||
## 3.11.2 Logic āļāļēāļĢāļāļąāļāđāļĨāļ (Counter Logic)
|
||
āļāļēāļĢāļāļąāļāđāļĨāļāļāļ°āđāļĒāļāļāļēāļĄ **Counter Key** āļāļĩāđāļāļĢāļ°āļāļāļāļāđāļ§āļĒāļŦāļĨāļēāļĒāļŠāđāļ§āļ āļāļķāđāļāļāļąāļāļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ
|
||
|
||
### Counter Key Components
|
||
| Component | Required? | Description | Database Source | Default if NULL |
|
||
| ---------------------------- | ---------------- | ------------------- | --------------------------------------------------------- | --------------- |
|
||
| `project_id` | â
Yes | ID āđāļāļĢāļāļāļēāļĢ | Derived from user context or organization | - |
|
||
| `originator_organization_id` | â
Yes | ID āļāļāļāđāļāļĢāļāļđāđāļŠāđāļ | `correspondences.originator_id` | - |
|
||
| `recipient_organization_id` | Depends on type | ID āļāļāļāđāļāļĢāļāļđāđāļĢāļąāļāļŦāļĨāļąāļ (TO) | `correspondence_recipients` where `recipient_type = 'TO'` | NULL for RFA |
|
||
| `correspondence_type_id` | â
Yes | ID āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ | `correspondence_types.id` | - |
|
||
| `sub_type_id` | TRANSMITTAL only | ID āļāļĢāļ°āđāļ āļāļĒāđāļāļĒ | `correspondence_sub_types.id` | 0 |
|
||
| `rfa_type_id` | RFA only | ID āļāļĢāļ°āđāļ āļ RFA | `rfa_types.id` | 0 |
|
||
| `discipline_id` | RFA only | ID āļŠāļēāļāļēāļāļēāļ | `disciplines.id` | 0 |
|
||
| `current_year` | â
Yes | āļāļĩ āļ.āļĻ. | System year (āļāļąāļāļāļļāļāļąāļ) | - |
|
||
|
||
### Counter Key āđāļĒāļāļāļēāļĄāļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ
|
||
**LETTER / RFI / MEMO / EMAIL / MOM / INSTRUCTION / NOTICE / OTHER**:
|
||
```
|
||
(project_id, originator_organization_id, recipient_organization_id,
|
||
correspondence_type_id, 0, 0, 0, current_year)
|
||
```
|
||
*āļŦāļĄāļēāļĒāđāļŦāļāļļ*: āđāļĄāđāđāļāđ `discipline_id`, `sub_type_id`, `rfa_type_id`
|
||
|
||
**TRANSMITTAL**:
|
||
```
|
||
(project_id, originator_organization_id, recipient_organization_id,
|
||
correspondence_type_id, sub_type_id, 0, 0, current_year)
|
||
```
|
||
*āļŦāļĄāļēāļĒāđāļŦāļāļļ*: āđāļāđ `sub_type_id` āđāļāļīāđāļĄāđāļāļīāļĄ
|
||
|
||
**RFA**:
|
||
```
|
||
(project_id, originator_organization_id, NULL,
|
||
correspondence_type_id, 0, rfa_type_id, discipline_id, current_year)
|
||
```
|
||
*āļŦāļĄāļēāļĒāđāļŦāļāļļ*: RFA āđāļĄāđāđāļāđ `recipient_organization_id` āđāļāļĢāļēāļ°āđāļāđāļāđāļāļāļŠāļēāļĢāđāļāļĢāļāļāļēāļĢ (CONTRACTOR â CONSULTANT â OWNER)
|
||
|
||
### āļ§āļīāļāļĩāļāļēāļĢāļŦāļē project_id
|
||
1. **User Context** (āđāļāļ°āļāļģ):
|
||
- āđāļĄāļ·āđāļ User āļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ UI āļāļ°āđāļŦāđāđāļĨāļ·āļāļ Project/Contract āļāđāļāļ
|
||
- āđāļāđ `project_id` āļāļēāļ Context āļāļĩāđāđāļĨāļ·āļāļ
|
||
2. **āļāļēāļ Organization**:
|
||
- Query `project_organizations` āļŦāļĢāļ·āļ `contract_organizations`
|
||
- āđāļāđ `originator_organization_id` āļŦāļē project āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ
|
||
- āļāđāļēāļĄāļĩāļŦāļĨāļēāļĒ project āđāļŦāđ User āđāļĨāļ·āļāļ
|
||
3. **Validation**:
|
||
- āļāļĢāļ§āļāļŠāļāļāļ§āđāļē organization āļĄāļĩāļŠāļīāļāļāļīāđāđāļ project āļāļąāđāļ
|
||
- āļāļĢāļ§āļāļŠāļāļāļ§āđāļē project/contract āđāļāđāļ active
|
||
|
||
### Fallback āļŠāļģāļŦāļĢāļąāļāļāđāļē NULL
|
||
- `discipline_id`: āđāļāđ `0` (āđāļĄāđāļĢāļ°āļāļļāļŠāļēāļāļēāļāļēāļ)
|
||
- `sub_type_id`: āđāļāđ `0` (āđāļĄāđāļĄāļĩāļāļĢāļ°āđāļ āļāļĒāđāļāļĒ)
|
||
- `rfa_type_id`: āđāļāđ `0` (āđāļĄāđāļĢāļ°āļāļļāļāļĢāļ°āđāļ āļ RFA)
|
||
- `recipient_organization_id`: āđāļāđ `NULL` āļŠāļģāļŦāļĢāļąāļ RFA, Required āļŠāļģāļŦāļĢāļąāļ LETTER/TRANSMITTAL
|
||
|
||
## 3.11.3 Format Templates by Correspondence Type
|
||
### 3.11.3.1. Letter (TYPE = LETTER)
|
||
**Template**:
|
||
```
|
||
{ORIGINATOR}-{RECIPIENT}-{SEQ:4}-{YEAR:B.E.}
|
||
```
|
||
**Example**: `āļāļāļ.-āļŠāļāļ.3-0001-2568`
|
||
**Token Breakdown**:
|
||
- `āļāļāļ.` = {ORIGINATOR} = āļĢāļŦāļąāļŠāļāļāļāđāļāļĢāļāļđāđāļŠāđāļ
|
||
- `āļŠāļāļ.3` = {RECIPIENT} = āļĢāļŦāļąāļŠāļāļāļāđāļāļĢāļāļđāđāļĢāļąāļāļŦāļĨāļąāļ (TO)
|
||
- `0001` = {SEQ:4} = Running number (āđāļĢāļīāđāļĄ 0001, 0002, ...)
|
||
- `2568` = {YEAR:B.E.} = āļāļĩ āļ.āļĻ.
|
||
> **â ïļ Template vs Counter Separation**
|
||
- {CORR_TYPE} **āđāļĄāđāđāļŠāļāļ**āđāļ template āđāļāļ·āđāļāļāļ§āļēāļĄāļāļĢāļ°āļāļąāļ
|
||
- āđāļāđāļĢāļ°āļāļ**āļĒāļąāļāđāļāđ correspondence_type_id āđāļ Counter Key** āđāļāļ·āđāļāđāļĒāļ counter
|
||
- LETTER, MEMO, RFI **āļĄāļĩ counter āđāļĒāļāļāļąāļ** āđāļĄāđ template format āđāļŦāļĄāļ·āļāļāļāļąāļ
|
||
**Counter Key**: `(project_id, originator_org_id, recipient_org_id, corr_type_id, 0, 0, 0, year)`
|
||
---
|
||
### 3.11.3.2. Transmittal (TYPE = TRANSMITTAL)
|
||
**Template**:
|
||
```
|
||
{ORIGINATOR}-{RECIPIENT}-{SUB_TYPE}-{SEQ:4}-{YEAR:B.E.}
|
||
```
|
||
**Example**: `āļāļāļ.-āļŠāļāļ.3-21-0117-2568`
|
||
**Token Breakdown**:
|
||
- `āļāļāļ.` = {ORIGINATOR}
|
||
- `āļŠāļāļ.3` = {RECIPIENT}
|
||
- `21` = {SUB_TYPE} = āļŦāļĄāļēāļĒāđāļĨāļāļāļĢāļ°āđāļ āļāļĒāđāļāļĒ (11=MAT, 12=SHP, 13=DWG, 14=MET, ...)
|
||
- `0117` = {SEQ:4}
|
||
- `2568` = {YEAR:B.E.}
|
||
> **â ïļ Template vs Counter Separation**
|
||
- {CORR_TYPE} **āđāļĄāđāđāļŠāļāļ**āđāļ template (āđāļŦāļĄāļ·āļāļ LETTER)
|
||
- TRANSMITTAL āļĄāļĩ counter āđāļĒāļāļāļēāļ LETTER
|
||
**Counter Key**: `(project_id, originator_org_id, recipient_org_id, corr_type_id, sub_type_id, 0, 0, year)`
|
||
---
|
||
### 3.11.3.3. RFA (Request for Approval)
|
||
**Template**:
|
||
```
|
||
{PROJECT}-{CORR_TYPE}-{DISCIPLINE}-{RFA_TYPE}-{SEQ:4}-{REV}
|
||
```
|
||
**Example**: `LCBP3-C2-RFA-TER-RPT-0001-A`
|
||
**Token Breakdown**:
|
||
- `LCBP3-C2` = {PROJECT} = āļĢāļŦāļąāļŠāđāļāļĢāļāļāļēāļĢ
|
||
- `RFA` = {CORR_TYPE} = āļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢ (āđāļŠāļāļāđāļ RFA template)
|
||
- `TER` = {DISCIPLINE} = āļĢāļŦāļąāļŠāļŠāļēāļāļēāļāļēāļ (TER=Terminal, STR=Structure, ...)
|
||
- `RPT` = {RFA_TYPE} = āļāļĢāļ°āđāļ āļ RFA (RPT=Report, SDW=Shop Drawing, ...)
|
||
- `0001` = {SEQ:4}
|
||
- `A` = {REV} = Revision code
|
||
> **ð RFA Workflow**
|
||
- RFA āđāļāđāļ **āđāļāļāļŠāļēāļĢāđāļāļĢāļāļāļēāļĢ** (Project-level document)
|
||
- Workflow: **CONTRACTOR â CONSULTANT â OWNER**
|
||
- āđāļĄāđāļĄāļĩ specific `recipient_id` āđāļāļĢāļēāļ°āđāļāđāļ workflow āļāļĩāđāļāļģāļŦāļāļāđāļ§āđāđāļĨāđāļ§
|
||
**Counter Key**: `(project_id, originator_org_id, NULL, corr_type_id, 0, rfa_type_id, discipline_id, year)`
|
||
---
|
||
## 3.11.4. Security & Data Integrity Requirements
|
||
### 3.11.4.1. Concurrency Control
|
||
**Requirements:**
|
||
- āļĢāļ°āļāļ**āļāđāļāļ**āļāđāļāļāļāļąāļ race condition āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļŠāļĢāđāļēāļāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢāļāļĢāđāļāļĄāļāļąāļ
|
||
- āļĢāļ°āļāļ**āļāđāļāļ**āļĢāļąāļāļāļĢāļ°āļāļąāļ uniqueness āļāļāļāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢāđāļāļāļļāļāļŠāļāļēāļāļāļēāļĢāļāđ
|
||
- āļĢāļ°āļāļ**āļāļ§āļĢ**āđāļāđ Distributed Lock (Redis) āđāļāđāļāļāļĨāđāļ primary
|
||
- āļĢāļ°āļāļ**āļāđāļāļ**āļĄāļĩ fallback mechanism āđāļĄāļ·āđāļ Redis āđāļĄāđāļāļĢāđāļāļĄāđāļāđāļāļēāļ
|
||
### 3.11.4.2. Data Integrity
|
||
**Requirements:**
|
||
- āļĢāļ°āļāļ**āļāđāļāļ**āđāļāđ Optimistic Locking āđāļāļ·āđāļāļāļĢāļ§āļāļāļąāļ concurrent updates
|
||
- āļĢāļ°āļāļ**āļāđāļāļ**āļĄāļĩ database constraints āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāđāļāļĄāļđāļĨāļāļīāļāļāļĨāļēāļ:
|
||
- Unique constraint āļāļ `document_number`
|
||
- Foreign key constraints āļāļļāļ relationship
|
||
- Check constraints āļŠāļģāļŦāļĢāļąāļ business rules
|
||
---
|
||
## 3.11.5. Validation Rules
|
||
- āļāđāļāļāļĄāļĩ JSON schema validation āļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļ
|
||
- āļāđāļāļāļĢāļāļāļĢāļąāļ versioning āļāļāļ schema
|
||
- āļāđāļāļāļĄāļĩ default values āļŠāļģāļŦāļĢāļąāļ field āļāļĩāđāđāļĄāđāļāļąāļāļāļąāļ
|
||
- āļāđāļāļāļāļĢāļ§āļāļŠāļāļ data types āđāļĨāļ° format āđāļŦāđāļāļđāļāļāđāļāļ
|
||
---
|
||
## 3.11.6. Performance Requirements
|
||
- JSON field āļāđāļāļāļĄāļĩāļāļāļēāļāđāļĄāđāđāļāļīāļ 50KB
|
||
- āļāđāļāļāļĢāļāļāļĢāļąāļ indexing āļŠāļģāļŦāļĢāļąāļ field āļāļĩāđāđāļāđāļāđāļāļŦāļēāļāđāļāļĒ
|
||
- āļāđāļāļāļĄāļĩ compression āļŠāļģāļŦāļĢāļąāļ JSON āļāļāļēāļāđāļŦāļāđ
|
||
---
|
||
## 3.11.7. Security Requirements
|
||
- āļāđāļāļ sanitize JSON input āđāļāļ·āđāļāļāđāļāļāļāļąāļ injection attacks
|
||
- āļāđāļāļ validate JSON structure āļāđāļāļāļāļąāļāļāļķāļ
|
||
- āļāđāļāļ encrypt sensitive data āđāļ JSON fields
|
||
---
|
||
## 3.11.8. JSON Schema Migration Strategy
|
||
- āļŠāļģāļŦāļĢāļąāļ Schema Breaking Changes:
|
||
- Phase 1 - Add New Column
|
||
ALTER TABLE correspondence_revisions
|
||
ADD COLUMN ref_project_id_v2 INT GENERATED ALWAYS AS
|
||
(JSON_UNQUOTE(JSON_EXTRACT(details, '$.newProjectIdPath'))) VIRTUAL;
|
||
- Phase 2 - Backfill Old Records
|
||
- āđāļāđ background job āđāļāļĨāļ JSON format āđāļāđāļēāđāļāđāļāđāļŦāļĄāđ
|
||
- Update `details` JSON āļāļĩāļĨāļ° batch (1000 records)
|
||
- Phase 3 - Switch Application Code
|
||
- Deploy code āļāļĩāđāđāļāđ path āđāļŦāļĄāđ
|
||
- Phase 4 - Remove Old Column
|
||
- āļŦāļĨāļąāļāļāļēāļ verify āđāļĨāđāļ§āļ§āđāļēāđāļĄāđāļĄāļĩ error
|
||
- Drop old virtual column
|
||
- āļŠāļģāļŦāļĢāļąāļ Non-Breaking Changes
|
||
- āđāļāļīāđāļĄ optional field āđāļ schema
|
||
- Old records āļāļĩāđāđāļĄāđāļĄāļĩ field = āđāļāđ default value
|
||
---
|
||
# 3.12 JSON Details Management (āļāļēāļĢāļāļąāļāļāļēāļĢ JSON Details)
|
||
---
|
||
title: 'Functional Requirements: JSON Details Management'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
- specs/01-requirements/01-objectives.md
|
||
- specs/01-requirements/02-architecture.md
|
||
- specs/01-requirements/03-functional-requirements.md
|
||
---
|
||
## 3.12.1 āļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđ
|
||
- āļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāļāđāļāļāļēāļĄāļīāļāļāļĩāđāđāļāļāļēāļ°āđāļāļēāļ°āļāļāļāļąāļāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļāļāļāļāđāļāļāļŠāļēāļĢ
|
||
- āļĢāļāļāļĢāļąāļāļāļēāļĢāļāļĒāļēāļĒāļāļąāļ§āļāļāļāļĢāļ°āļāļāđāļāļĒāđāļĄāđāļāđāļāļāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ database schema
|
||
- āļāļąāļāļāļēāļĢ metadata āđāļĨāļ°āļāđāļāļĄāļđāļĨāļāļĢāļ°āļāļāļāļŠāļģāļŦāļĢāļąāļ correspondence, routing, āđāļĨāļ° workflows
|
||
## 3.12.2 āđāļāļĢāļāļŠāļĢāđāļēāļ JSON Schema
|
||
- āļĢāļ°āļāļāļāđāļāļāļĄāļĩ predefined JSON schemas āļŠāļģāļŦāļĢāļąāļāļāļĢāļ°āđāļ āļāđāļāļāļŠāļēāļĢāļāđāļēāļāđ:
|
||
- 3.12.2.1 Correspondence Types
|
||
- GENERIC: āļāđāļāļĄāļđāļĨāļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļāđāļāļāļŠāļēāļĢāļāļąāđāļ§āđāļ
|
||
- RFI: āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļģāļāļēāļĄāđāļĨāļ°āļāđāļāļĄāļđāļĨāļāļēāļāđāļāļāļāļīāļ
|
||
- RFA: āļāđāļāļĄāļđāļĨāļāļēāļĢāļāļāļāļāļļāļĄāļąāļāļīāđāļāļāđāļĨāļ°āļ§āļąāļŠāļāļļ
|
||
- TRANSMITTAL: āļĢāļēāļĒāļāļēāļĢāđāļāļāļŠāļēāļĢāļāļĩāđāļŠāđāļāļāđāļ
|
||
- LETTER: āļāđāļāļĄāļđāļĨāļāļāļŦāļĄāļēāļĒāļāļēāļāļāļēāļĢ
|
||
- EMAIL: āļāđāļāļĄāļđāļĨāļāļĩāđāļĄāļĨ
|
||
- 3.12.2.2 Rworkflow Types
|
||
- workflow_definitions: āļāļāđāļĨāļ°āđāļāļ·āđāļāļāđāļāļāļēāļĢāļŠāđāļāļāđāļ
|
||
- workflow_histories: āļŠāļāļēāļāļ°āđāļĨāļ°āļāļĢāļ°āļ§āļąāļāļīāļāļēāļĢāļŠāđāļāļāđāļ
|
||
- workflow_instances: āļāļēāļĢāļāļģāđāļāļīāļāļāļēāļĢāđāļāđāļāđāļĨāļ°āļāļąāđāļāļāļāļ
|
||
- 3.12.2.3 Audit Types
|
||
- AUDIT_LOG: āļāđāļāļĄāļđāļĨāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ
|
||
- SECURITY_SCAN: āļāļĨāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ
|
||
## 3.12.3 Virtual Columns (āļāļĢāļąāļāļāļĢāļļāļ)
|
||
- āļŠāļģāļŦāļĢāļąāļ Field āđāļ JSON āļāļĩāđāļāđāļāļāđāļāđāđāļāļāļēāļĢāļāđāļāļŦāļē (Search) āļŦāļĢāļ·āļāļāļąāļāđāļĢāļĩāļĒāļ (Sort) āļāđāļāļĒāđ āļāđāļāļāļŠāļĢāđāļēāļ Generated Column (Virtual Column) āđāļ Database āđāļĨāļ°āļāļģ Index āđāļ§āđ āđāļāļ·āđāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļŠāļđāļāļŠāļļāļ
|
||
- Schema Consistency: Field āļāļĩāđāļāļđāļāļāļģāļŦāļāļāđāļāđāļ Virtual Column āļŦāđāļēāļĄ āđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ Key Name āļŦāļĢāļ·āļ Data Type āđāļ JSON Schema Version āļāļąāļāđāļ āļŦāļēāļāļāļģāđāļāđāļāļāđāļāļāđāļāļĨāļĩāđāļĒāļ āļāđāļāļāļĄāļĩāđāļāļāļāļēāļĢ Re-index āļŦāļĢāļ·āļ Migration āļāđāļāļĄāļđāļĨāđāļāļīāļĄāļāļĩāđāļāļąāļāđāļāļ
|
||
## 3.12.4 Validation Rules
|
||
- āļāđāļāļāļĄāļĩ JSON schema validation āļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļ
|
||
- āļāđāļāļāļĢāļāļāļĢāļąāļ versioning āļāļāļ schema
|
||
- āļāđāļāļāļĄāļĩ default values āļŠāļģāļŦāļĢāļąāļ field āļāļĩāđāđāļĄāđāļāļąāļāļāļąāļ
|
||
- āļāđāļāļāļāļĢāļ§āļāļŠāļāļ data types āđāļĨāļ° format āđāļŦāđāļāļđāļāļāđāļāļ
|
||
## 3.12.5 Performance Requirements
|
||
- JSON field āļāđāļāļāļĄāļĩāļāļāļēāļāđāļĄāđāđāļāļīāļ 50KB
|
||
- āļāđāļāļāļĢāļāļāļĢāļąāļ indexing āļŠāļģāļŦāļĢāļąāļ field āļāļĩāđāđāļāđāļāđāļāļŦāļēāļāđāļāļĒ
|
||
- āļāđāļāļāļĄāļĩ compression āļŠāļģāļŦāļĢāļąāļ JSON āļāļāļēāļāđāļŦāļāđ
|
||
## 3.12.6 Security Requirements
|
||
- āļāđāļāļ sanitize JSON input āđāļāļ·āđāļāļāđāļāļāļāļąāļ injection attacks
|
||
- āļāđāļāļ validate JSON structure āļāđāļāļāļāļąāļāļāļķāļ
|
||
- āļāđāļāļ encrypt sensitive data āđāļ JSON fields
|
||
---
|
||
|
||
## ð 4. NonâFunctional Requirements
|
||
|
||
# 4.1 Access Control
|
||
# ð Section 4: Access Control (āļāđāļāļāļģāļŦāļāļāļāđāļēāļāļŠāļīāļāļāļīāđāđāļĨāļ°āļāļēāļĢāđāļāđāļēāļāļķāļ)
|
||
|
||
## 4.1. Overview:
|
||
|
||
- Users and organizations can view and edit documents based on the permissions they have. The system's permissions will be based on Role-Based Access Control (RBAC).
|
||
|
||
## 4.2. Permission Hierarchy:
|
||
|
||
- Global: The highest level of permissions in the system
|
||
- Organization: Permissions within an organization, which is the basic permission for users
|
||
- Project: Permissions specific to a project, which will be considered when the user is in that project
|
||
- Contract: Permissions specific to a contract, which will be considered when the user is in that contract
|
||
|
||
## 4.3. Permission Enforcement:
|
||
|
||
- When checking permissions, the system will consider permissions from all levels that the user has and use the most permissive permission as the decision
|
||
- Example: User A is a Viewer in the organization, but is assigned as an Editor in Project X when in Project X, User A will have the right to edit
|
||
|
||
## 4.4. Role and Scope:
|
||
|
||
| Role | Scope | Description | Key Permissions |
|
||
| :------------------- | :----------- | :------------------------- | :-------------------------------------------------------------------------------------------------------------------- |
|
||
| **Superadmin** | Global | System administrator | Do everything in the system, manage organizations, manage global data |
|
||
| **Org Admin** | Organization | Organization administrator | Manage users in the organization, manage roles/permissions within the organization, view organization reports |
|
||
| **Document Control** | Organization | Document controller | Add/edit/delete documents, set document permissions within the organization |
|
||
| **Editor** | Organization | Document editor | Edit documents that have been assigned to them |
|
||
| **Viewer** | Organization | Document viewer | View documents that have access permissions |
|
||
| **Project Manager** | Project | Project manager | Manage members in the project (add/delete/assign roles), create/manage contracts in the project, view project reports |
|
||
| **Contract Admin** | Contract | Contract administrator | Manage users in the contract, manage roles/permissions within the contract, view contract reports |
|
||
|
||
## 4.5. Token Management (āļāļĢāļąāļāļāļĢāļļāļ)
|
||
|
||
- **Payload Optimization:** āđāļ JWT Access Token āđāļŦāđāđāļāđāļāđāļāļāļēāļ° `userId` āđāļĨāļ° `scope` āļāļąāļāļāļļāļāļąāļāđāļāđāļēāļāļąāđāļ
|
||
- **Permission Caching:** āļŠāļīāļāļāļīāđāļĨāļ°āđāļāļĩāļĒāļ (Permissions List) āđāļŦāđāđāļāđāļāđāļ **Redis** āđāļĨāļ°āļāļķāļāļĄāļēāļāļĢāļ§āļāļŠāļāļāđāļĄāļ·āđāļ Request āđāļāđāļēāļĄāļē āđāļāļ·āđāļāļĨāļāļāļāļēāļ Token āđāļĨāļ°āđāļāļīāđāļĄāļāļ§āļēāļĄāđāļĢāđāļ§
|
||
|
||
## 4.6. Onboarding Workflow
|
||
|
||
- 4.6.1. Create Organization
|
||
- **Superadmin** creates a new organization (e.g. Company A)
|
||
- **Superadmin** appoints at least 1 user as **Org Admin** or **Document Control** of Company A
|
||
- 4.6.2. Add Users to Organization
|
||
- **Org Admin** of Company A adds other users (Editor, Viewer) to the organization
|
||
- 4.6.3. Assign Users to Project
|
||
- **Project Manager** of Project X (which may come from Company A or another company) invites or assigns users from different organizations to join Project X
|
||
- In this step, **Project Manager** will assign **Project Role** (e.g. Project Member, or may use organization-level permissions)
|
||
- 4.6.4. Assign Users to Contract
|
||
- **Contract Admin** of Contract Y (which is part of Project X) selects users from Project X and assigns them to Contract Y
|
||
- In this step, **Contract Admin** will assign **Contract Role** (e.g. Contract Member) and specific permissions
|
||
- 4.6.5 Security Onboarding:
|
||
- Force users to change password for the first time
|
||
- Security awareness training for users with high permissions
|
||
- Safe password reset process
|
||
- Audit log recording every permission change
|
||
|
||
### **4.7. Master Data Management**
|
||
|
||
| Master Data | Manager | Scope |
|
||
| :-------------------------------------- | :------------------------------ | :------------------------------ |
|
||
| Document Type (Correspondence, RFA) | **Superadmin** | Global |
|
||
| Document Status (Draft, Approved, etc.) | **Superadmin** | Global |
|
||
| Shop Drawing Category | **Project Manager** | Project (āļŠāļĢāđāļēāļāđāļŦāļĄāđāđāļāđāļ āļēāļĒāđāļāđāļāļĢāļāļāļēāļĢ) |
|
||
| Tags | **Org Admin / Project Manager** | Organization / Project |
|
||
| Custom Roles | **Superadmin / Org Admin** | Global / Organization |
|
||
| Document Numbering Formats | **Superadmin / Admin** | Global / Organization |
|
||
|
||
## 4.8. āļāļēāļĢāļāļąāļāļāļķāļāļāļēāļĢāļāļĢāļ°āļāļģ (Audit Log)
|
||
|
||
- āļāļļāļāļāļēāļĢāļāļĢāļ°āļāļģāļāļĩāđāļŠāļģāļāļąāļāļāļāļāļāļđāđāđāļāđ (āļŠāļĢāđāļēāļ, āđāļāđāđāļ, āļĨāļ, āļŠāđāļ) āļāļ°āļāļđāļāļāļąāļāļāļķāļāđāļ§āđāđāļ audit_logs āđāļāļ·āđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļĒāđāļāļāļŦāļĨāļąāļ
|
||
- āļāļāļāđāļāļāļāļēāļĢāļāļąāļāļāļķāļ Audit Log:
|
||
- āļāļļāļāļāļēāļĢāļŠāļĢāđāļēāļ/āđāļāđāđāļ/āļĨāļ āļāđāļāļĄāļđāļĨāļŠāļģāļāļąāļ (correspondences, RFAs, drawings, users, permissions)
|
||
- āļāļļāļāļāļēāļĢāđāļāđāļēāļāļķāļāļāđāļāļĄāļđāļĨ sensitive (user data, financial information)
|
||
- āļāļļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļŠāļāļēāļāļ° workflow (status transitions)
|
||
- āļāļļāļāļāļēāļĢāļāļēāļ§āļāđāđāļŦāļĨāļāđāļāļĨāđāļŠāļģāļāļąāļ (contract documents, financial reports)
|
||
- āļāļļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ permission āđāļĨāļ° role assignment
|
||
- āļāļļāļāļāļēāļĢāļĨāđāļāļāļāļīāļāļāļĩāđāļŠāļģāđāļĢāđāļāđāļĨāļ°āļĨāđāļĄāđāļŦāļĨāļ§
|
||
- āļāļļāļāļāļēāļĢāļŠāđāļāļāļģāļāļ API āļāļĩāđāļŠāļģāļāļąāļ
|
||
- āļāđāļāļĄāļđāļĨāļāļĩāđāļāđāļāļāļāļąāļāļāļķāļāđāļ Audit Log:
|
||
- āļāļđāđāđāļāđāļāļēāļ (user_id)
|
||
- āļāļēāļĢāļāļĢāļ°āļāļģ (action)
|
||
- āļāļāļīāļāļāļāļ entity (entity_type)
|
||
- ID āļāļāļ entity (entity_id)
|
||
- āļāđāļāļĄāļđāļĨāļāđāļāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ (old_values) - āļŠāļģāļŦāļĢāļąāļ update operations
|
||
- āļāđāļāļĄāļđāļĨāļŦāļĨāļąāļāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ (new_values) - āļŠāļģāļŦāļĢāļąāļ update operations
|
||
- IP address
|
||
- User agent
|
||
- Timestamp
|
||
- Request ID āļŠāļģāļŦāļĢāļąāļ tracing
|
||
|
||
## 4.9. Data Archiving & Partitioning
|
||
|
||
- āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļēāļāļāļĩāđāļĄāļĩāļāļāļēāļāđāļŦāļāđāđāļĨāļ°āđāļāđāļĢāđāļ§ (āđāļāđāļ `audit_logs`, `notifications`, `correspondence_revisions`) āļāđāļāļāļāļāļāđāļāļāđāļāļĒāļĢāļāļāļĢāļąāļ **Table Partitioning** (āđāļāđāļāļāļēāļĄ Range āļ§āļąāļāļāļĩāđ āļŦāļĢāļ·āļ List) āđāļāļ·āđāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāļĢāļ°āļĒāļ°āļĒāļēāļ§
|
||
|
||
## 4.10. āļāļēāļĢāļāđāļāļŦāļē (Search):
|
||
|
||
- āļĢāļ°āļāļāļāđāļāļāļĄāļĩāļāļąāļāļāđāļāļąāļāļāļēāļĢāļāđāļāļŦāļēāļāļąāđāļāļŠāļđāļ āļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāđāļāļŦāļēāđāļāļāļŠāļēāļĢ **correspondence**, **rfa**, **shop_drawing**, **contract-drawing**, **transmittal** āđāļĨāļ° **āđāļāđāļ§āļĩāļĒāļ (Circulations)** āļāļēāļāļŦāļĨāļēāļĒāđāļāļ·āđāļāļāđāļāļāļĢāđāļāļĄāļāļąāļāđāļāđ āđāļāđāļ āļāđāļāļŦāļēāļāļēāļāļāļ·āđāļāđāļĢāļ·āđāļāļ, āļāļĢāļ°āđāļ āļ, āļ§āļąāļāļāļĩāđ, āđāļĨāļ° Tag
|
||
|
||
## 4.11. āļāļēāļĢāļāļģāļĢāļēāļĒāļāļēāļ (Reporting):
|
||
|
||
- āļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļģāļĢāļēāļĒāļāļēāļāļŠāļĢāļļāļāđāļĒāļāļāļĢāļ°āđāļ āļāļāļāļ Correspondence āļāļĢāļ°āļāļģāļ§āļąāļ, āļŠāļąāļāļāļēāļŦāđ, āđāļāļ·āļāļ, āđāļĨāļ°āļāļĩāđāļāđ
|
||
|
||
## 4.12. āļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ (Performance):
|
||
|
||
- āļĄāļĩāļāļēāļĢāđāļāđ Caching āļāļąāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļĢāļĩāļĒāļāđāļāđāļāđāļāļĒ āđāļĨāļ°āđāļāđ Pagination āđāļāļāļēāļĢāļēāļāļāđāļāļĄāļđāļĨāđāļāļ·āđāļāļāļąāļāļāļēāļĢāļāđāļāļĄāļđāļĨāļāļģāļāļ§āļāļĄāļēāļ
|
||
|
||
- āļāļąāļ§āļāļĩāđāļ§āļąāļāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļ:
|
||
|
||
- **API Response Time:** < 200ms (90th percentile) āļŠāļģāļŦāļĢāļąāļ operation āļāļąāđāļ§āđāļ
|
||
- **Search Query Performance:** < 500ms āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāđāļāļŦāļēāļāļąāđāļāļŠāļđāļ
|
||
- **File Upload Performance:** < 30 seconds āļŠāļģāļŦāļĢāļąāļāđāļāļĨāđāļāļāļēāļ 50MB
|
||
- **Concurrent Users:** āļĢāļāļāļĢāļąāļāļāļđāđāđāļāđāļāļĢāđāļāļĄāļāļąāļāļāļĒāđāļēāļāļāđāļāļĒ 100 āļāļ
|
||
- **Database Connection Pool:** āļāļāļēāļāđāļŦāļĄāļēāļ°āļŠāļĄāļāļąāļ workload (default: min 5, max 20 connections)
|
||
- **Cache Hit Ratio:** > 80% āļŠāļģāļŦāļĢāļąāļ cached data
|
||
- **Application Startup Time:** < 30 seconds
|
||
|
||
- Caching Strategy:
|
||
|
||
- **Master Data Cache:** Roles, Permissions, Organizations, Project metadata (TTL: 1 hour)
|
||
- **User Session Cache:** User permissions āđāļĨāļ° profile data (TTL: 30 minutes)
|
||
- **Search Result Cache:** Frequently searched queries (TTL: 15 minutes)
|
||
- **File Metadata Cache:** Attachment metadata (TTL: 1 hour)
|
||
- **Document Cache:** Frequently accessed document metadata (TTL: 30 minutes)
|
||
- **āļāđāļāļāļĄāļĩ cache invalidation strategy āļāļĩāđāļāļąāļāđāļāļ:**
|
||
- Invalidate on update/delete operations
|
||
- Time-based expiration
|
||
- Manual cache clearance āļŠāļģāļŦāļĢāļąāļ admin operations
|
||
- āđāļāđ Redis āđāļāđāļ distributed cache backend
|
||
- āļāđāļāļāļĄāļĩ cache monitoring (hit/miss ratios)
|
||
|
||
- Frontend Performance:
|
||
- **Bundle Size Optimization:** āļāđāļāļāļāļ§āļāļāļļāļĄāļāļāļēāļ Bundle āđāļāļĒāļĢāļ§āļĄāđāļĄāđāđāļāļīāļ 2MB
|
||
- **State Management Efficiency:** āđāļāđ State Management Libraries āļāļĒāđāļēāļāđāļŦāļĄāļēāļ°āļŠāļĄ āđāļĄāđāđāļāļīāļ 2 āļāļąāļ§āļŦāļĨāļąāļ
|
||
- **Memory Management:** āļāđāļāļāļāđāļāļāļāļąāļ Memory Leak āļāļēāļ State āļāļĩāđāđāļĄāđāļāļģāđāļāđāļ
|
||
|
||
## 4.13. System Security (āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļĢāļ°āļāļ):
|
||
|
||
- āļĄāļĩāļĢāļ°āļāļ Rate Limiting āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāļĄāļāļĩāđāļāļ Brute-force
|
||
- āļāļēāļĢāļāļąāļāļāļēāļĢ Secret (āđāļāđāļ āļĢāļŦāļąāļŠāļāđāļēāļ DB, JWT Secret) āļāļ°āļāđāļāļāļāļģāļāđāļēāļ Environment Variable āļāļāļ Docker āđāļāļ·āđāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒāļŠāļđāļāļŠāļļāļ
|
||
- Rate Limiting Strategy:
|
||
- **Anonymous Endpoints:** 100 requests/hour āļāđāļ IP address
|
||
- **Authenticated Endpoints:**
|
||
- Viewer: 500 requests/hour
|
||
- Editor: 1000 requests/hour
|
||
- Document Control: 2000 requests/hour
|
||
- Admin/Superadmin: 5000 requests/hour
|
||
- **File Upload Endpoints:** 50 requests/hour āļāđāļ user
|
||
- **Search Endpoints:** 500 requests/hour āļāđāļ user
|
||
- **Authentication Endpoints:** 10 requests/minute āļāđāļ IP address
|
||
- **āļāđāļāļāļĄāļĩ mechanism āļŠāļģāļŦāļĢāļąāļāļĒāļāđāļ§āđāļ rate limiting āļŠāļģāļŦāļĢāļąāļ trusted services**
|
||
- āļāđāļāļāļāļąāļāļāļķāļ log āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢ trigger rate limiting
|
||
- Error Handling āđāļĨāļ° Resilience:
|
||
- āļāđāļāļāļĄāļĩ circuit breaker pattern āļŠāļģāļŦāļĢāļąāļ external service calls
|
||
- āļāđāļāļāļĄāļĩ retry mechanism āļāđāļ§āļĒ exponential backoff
|
||
- āļāđāļāļāļĄāļĩ graceful degradation āđāļĄāļ·āđāļāļāļĢāļīāļāļēāļĢāļ āļēāļĒāļāļāļāļĨāđāļĄāđāļŦāļĨāļ§
|
||
- Error messages āļāđāļāļāđāļĄāđāđāļāļīāļāđāļāļĒāļāđāļāļĄāļđāļĨ sensitive
|
||
- Input Validation:
|
||
- āļāđāļāļāļĄāļĩ input validation āļāļąāđāļāļāļąāđāļ client āđāļĨāļ° server (defense in depth)
|
||
- āļāđāļāļāļāđāļāļāļāļąāļ OWASP Top 10 vulnerabilities:
|
||
- SQL Injection (āđāļāđ parameterized queries āļāđāļēāļ ORM)
|
||
- XSS (input sanitization āđāļĨāļ° output encoding)
|
||
- CSRF (CSRF tokens āļŠāļģāļŦāļĢāļąāļ state-changing operations)
|
||
- āļāđāļāļ validate file uploads:
|
||
- File type (white-list approach)
|
||
- File size
|
||
- File content (magic number verification)
|
||
- āļāđāļāļ sanitize user inputs āļāđāļāļāđāļŠāļāļāļāļĨāđāļ UI
|
||
- āļāđāļāļāđāļāđ content security policy (CSP) headers
|
||
- āļāđāļāļāļĄāļĩ request size limits āđāļāļ·āđāļāļāđāļāļāļāļąāļ DoS attacks
|
||
- Session āđāļĨāļ° Token Management:
|
||
- **JWT token expiration:** 8 hours āļŠāļģāļŦāļĢāļąāļ access token
|
||
- **Refresh token expiration:** 7 days
|
||
- **Refresh token mechanism:** āļāđāļāļāļĢāļāļāļĢāļąāļ token rotation āđāļĨāļ° revocation
|
||
- **Token revocation on logout:** āļāđāļāļāļāļąāļāļāļķāļ revoked tokens āļāļāļāļ§āđāļēāļāļ° expire
|
||
- **Concurrent session management:**
|
||
- āļāļģāļāļąāļāļāļģāļāļ§āļ session āļāļĢāđāļāļĄāļāļąāļāđāļāđ (default: 5 devices)
|
||
- āļāđāļāļāđāļāđāļāđāļāļ·āļāļāđāļĄāļ·āđāļāļĄāļĩ login āļāļēāļ device/location āđāļŦāļĄāđ
|
||
- **Device fingerprinting:** āļŠāļģāļŦāļĢāļąāļ security āđāļĨāļ° audit purposes
|
||
- **Password policy:**
|
||
- āļāļ§āļēāļĄāļĒāļēāļ§āļāļąāđāļāļāđāļģ: 8 characters
|
||
- āļāđāļāļāļĄāļĩ uppercase, lowercase, number, special character
|
||
- āļāđāļāļāđāļāļĨāļĩāđāļĒāļ password āļāļļāļ 90 āļ§āļąāļ
|
||
- āļāđāļāļāļāđāļāļāļāļąāļāļāļēāļĢāđāļāđ password āļāļĩāđāđāļāļĒāđāļāđāļĄāļēāđāļĨāđāļ§ 5 āļāļĢāļąāđāļāļĨāđāļēāļŠāļļāļ
|
||
|
||
## 4.14. āļāļēāļĢāļŠāļģāļĢāļāļāļāđāļāļĄāļđāļĨāđāļĨāļ°āļāļēāļĢāļāļđāđāļāļ·āļ (Backup & Recovery)
|
||
|
||
- āļĢāļ°āļāļāļāļ°āļāđāļāļāļĄāļĩāļāļĨāđāļāļāļēāļĢāļŠāļģāļĢāļāļāļāđāļāļĄāļđāļĨāļāļąāļāđāļāļĄāļąāļāļīāļŠāļģāļŦāļĢāļąāļāļāļēāļāļāđāļāļĄāļđāļĨ MariaDB [cite: 2.4] āđāļĨāļ°āđāļāļĨāđāđāļāļāļŠāļēāļĢāļāļąāđāļāļŦāļĄāļāđāļ /share/dms-data [cite: 2.1] (āđāļāđāļ āđāļāđ HBS 3 āļāļāļ QNAP āļŦāļĢāļ·āļāļŠāļāļĢāļīāļāļāđāļŠāļģāļĢāļāļāļāđāļāļĄāļđāļĨ) āļāļĒāđāļēāļāļāđāļāļĒāļ§āļąāļāļĨāļ° 1 āļāļĢāļąāđāļ
|
||
- āļāđāļāļāļĄāļĩāđāļāļāļāļēāļĢāļāļđāđāļāļ·āļāļĢāļ°āļāļ (Disaster Recovery Plan) āđāļāļāļĢāļāļĩāļāļĩāđ Server āļŦāļĨāļąāļ (QNAP) āđāļāđāļāļēāļāđāļĄāđāđāļāđ
|
||
- āļāļąāđāļāļāļāļāļāļēāļĢāļāļđāđāļāļ·āļ:
|
||
- **Database Restoration Procedure:**
|
||
- āļŠāļĢāđāļēāļāļāļēāļ full backup āļĨāđāļēāļŠāļļāļ
|
||
- Apply transaction logs āļāļķāļ point-in-time āļāļĩāđāļāđāļāļāļāļēāļĢ
|
||
- Verify data integrity post-restoration
|
||
- **File Storage Restoration Procedure:**
|
||
- Restore āļāļēāļ QNAP snapshot āļŦāļĢāļ·āļ backup
|
||
- Verify file integrity āđāļĨāļ° permissions
|
||
- **Application Redeployment Procedure:**
|
||
- Deploy āļāļēāļ version āļĨāđāļēāļŠāļļāļāļāļĩāđāļĢāļđāđāļ§āđāļēāļāļģāļāļēāļāđāļāđ
|
||
- Verify application health
|
||
- **Data Integrity Verification Post-Recovery:**
|
||
- Run data consistency checks
|
||
- Verify critical business data
|
||
- **Recovery Time Objective (RTO):** < 4 āļāļąāđāļ§āđāļĄāļ
|
||
- **Recovery Point Objective (RPO):** < 1 āļāļąāđāļ§āđāļĄāļ
|
||
|
||
## 4.15. āļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļāđāļāđāļāļ·āļāļ (Notification Strategy - āļāļĢāļąāļāļāļĢāļļāļ)
|
||
|
||
- āļĢāļ°āļāļāļāļ°āļŠāđāļāļāļēāļĢāđāļāđāļāđāļāļ·āļāļ (āļāđāļēāļ Email āļŦāļĢāļ·āļ Line [cite: 2.7]) āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļāļĢāļ°āļāļģāļāļĩāđāļŠāļģāļāļąāļ** āļāļąāļāļāļĩāđ:
|
||
1. āđāļĄāļ·āđāļāļĄāļĩāđāļāļāļŠāļēāļĢāđāļŦāļĄāđ (Correspondence, RFA) āļāļđāļāļŠāđāļāļĄāļēāļāļķāļāļāļāļāđāļāļĢāļāđāļāļāļāđāļĢāļē
|
||
2. āđāļĄāļ·āđāļāļĄāļĩāđāļāđāļ§āļĩāļĒāļ (Circulation) āđāļŦāļĄāđ āļĄāļāļāļŦāļĄāļēāļĒāļāļēāļāļĄāļēāļāļĩāđāđāļĢāļē
|
||
3. (āļāļēāļāđāļĨāļ·āļāļ) āđāļĄāļ·āđāļāđāļāļāļŠāļēāļĢāļāļĩāđāđāļĢāļēāļŠāđāļāđāļ āļāļđāļāļāļģāđāļāļīāļāļāļēāļĢ (āđāļāđāļ āļāļāļļāļĄāļąāļāļī/āļāļāļīāđāļŠāļ)
|
||
4. (āļāļēāļāđāļĨāļ·āļāļ) āđāļĄāļ·āđāļāđāļāļĨāđāļāļķāļāļ§āļąāļāļāļĢāļāļāļģāļŦāļāļ (Deadline) [cite: 3.2.5, 3.6.6, 3.7.5]
|
||
- Grouping/Digest
|
||
- āļāļĢāļāļĩāļĄāļĩāļāļēāļĢāđāļāđāļāđāļāļ·āļāļāļāļĢāļ°āđāļ āļāđāļāļĩāļĒāļ§āļāļąāļāļāļģāļāļ§āļāļĄāļēāļāđāļāļāđāļ§āļāđāļ§āļĨāļēāļŠāļąāđāļāđ (āđāļāđāļ Approve āđāļāļāļŠāļēāļĢ 10 āļāļāļąāļāļĢāļ§āļ) āļĢāļ°āļāļāļāđāļāļ **āļĢāļ§āļĄ (Batch)** āđāļāđāļ 1 Email/Line Notification āđāļāļ·āđāļāđāļĄāđāđāļŦāđāļĢāļāļāļ§āļāļāļđāđāđāļāđ (Spamming)
|
||
- Notification Delivery Guarantees
|
||
- **At-least-once delivery:** āļŠāļģāļŦāļĢāļąāļ important notifications
|
||
- **Retry mechanism:** āļāđāļ§āļĒ exponential backoff (max 3 reties)
|
||
- **Dead letter queue:** āļŠāļģāļŦāļĢāļąāļ notifications āļāļĩāđāļŠāđāļāđāļĄāđāļŠāļģāđāļĢāđāļāļŦāļĨāļąāļāļāļēāļ retries
|
||
- **Delivery status tracking:** āļāđāļāļāļāļąāļāļāļķāļāļŠāļāļēāļāļ°āļāļēāļĢāļŠāđāļ notifications
|
||
- **Fallback channels:** āļāđāļē Email āļĨāđāļĄāđāļŦāļĨāļ§ āđāļŦāđāļŠāđāļāļāđāļēāļ SYSTEM notification
|
||
- **Notification preferences:** āļāļđāđāđāļāđāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļ channel preferences āđāļāđ
|
||
|
||
## 4.16. Maintenance Mode
|
||
|
||
- āļĢāļ°āļāļāļāđāļāļāļĄāļĩāļāļĨāđāļ **Maintenance Mode** āļāļĩāđ Admin āļŠāļēāļĄāļēāļĢāļāđāļāļīāļāđāļāđāļāļēāļāđāļāđ
|
||
- āđāļĄāļ·āđāļāđāļāļīāļ: āļāļđāđāđāļāđāļāļąāđāļ§āđāļāļāļ°āđāļŦāđāļāļŦāļāđāļē "āļāļīāļāļāļĢāļąāļāļāļĢāļļāļ" āđāļĨāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļ API āđāļāđ (āļĒāļāđāļ§āđāļ Admin)
|
||
- āđāļāđāļŠāļģāļŦāļĢāļąāļāļāđāļ§āļ Deploy Version āđāļŦāļĄāđ āļŦāļĢāļ·āļ Database Migration
|
||
|
||
## 4.17. Monitoring āđāļĨāļ° Observability
|
||
|
||
- Application Monitoring
|
||
- **Health checks:** /health endpoint āļŠāļģāļŦāļĢāļąāļ load balancer
|
||
- **Metrics collection:** Response times, error rates, throughput
|
||
- **Distributed tracing:** āļŠāļģāļŦāļĢāļąāļ request tracing across services
|
||
- **Log aggregation:** Structured logging āļāđāļ§āļĒ JSON format
|
||
- **Alerting:** āļŠāļģāļŦāļĢāļąāļ critical errors āđāļĨāļ° performance degradation
|
||
- Business Metrics
|
||
- āļāļģāļāļ§āļ documents created āļāđāļāļ§āļąāļ
|
||
- Workflow completion rates
|
||
- User activity metrics
|
||
- System utilization rates
|
||
- Search query performance
|
||
- Security Monitoring
|
||
- Failed login attempts
|
||
- Rate limiting triggers
|
||
- Virus scan results
|
||
- File download activities
|
||
- Permission changes
|
||
|
||
## 4.18. JSON Processing & Validation
|
||
|
||
- JSON Schema Management
|
||
- āļāđāļāļāļĄāļĩ centralized JSON schema registry
|
||
- āļāđāļāļāļĢāļāļāļĢāļąāļ schema versioning āđāļĨāļ° migration
|
||
- āļāđāļāļāļĄāļĩ schema validation during runtime
|
||
- Performance Optimization
|
||
- **Caching:** Cache parsed JSON structures
|
||
- **Compression:** āđāļāđ compression āļŠāļģāļŦāļĢāļąāļ JSON āļāļāļēāļāđāļŦāļāđ
|
||
- **Indexing:** Support JSON path indexing āļŠāļģāļŦāļĢāļąāļ query
|
||
- Error Handling
|
||
- āļāđāļāļāļĄāļĩ graceful degradation āđāļĄāļ·āđāļ JSON validation āļĨāđāļĄāđāļŦāļĨāļ§
|
||
- āļāđāļāļāļĄāļĩ default fallback values
|
||
- āļāđāļāļāļāļąāļāļāļķāļ error logs āļŠāļģāļŦāļĢāļąāļ validation failures
|
||
|
||
|
||
# 5. UI/UX Guidelines
|
||
# ðĨ Section 5: UI/UX Requirements (āļāđāļāļāļģāļŦāļāļāļāđāļēāļāļāļđāđāđāļāđāļāļēāļ)
|
||
---
|
||
title: 'UI/UX Requirements'
|
||
version: 1.5.0
|
||
status: first-draft
|
||
owner: Nattanin Peancharoen
|
||
last_updated: 2025-11-30
|
||
related:
|
||
|
||
- specs/02-architecture/data-model.md#correspondence
|
||
- specs/03-implementation/backend-guidelines.md#correspondencemodule
|
||
---
|
||
|
||
## 5.1. Layout āļŦāļĨāļąāļ
|
||
|
||
- āļŦāļāđāļēāđāļ§āđāļāđāļāđāļĢāļđāļāđāļāļ App Shell āļāļĩāđāļāļĢāļ°āļāļāļāļāđāļ§āļĒ
|
||
- Navbar (āļŠāđāļ§āļāļāļ): āđāļŠāļāļāļāļ·āđāļāļĢāļ°āļāļ, āđāļĄāļāļđāļāļđāđāđāļāđ (Profile), āđāļĄāļāļđāļŠāļģāļŦāļĢāļąāļ Document Control/āđāļĄāļāļđāļŠāļģāļŦāļĢāļąāļ Admin/Superadmin (āļāļąāļāļāļēāļĢāļāļđāđāđāļāđ, āļāļąāļāļāļēāļĢāļŠāļīāļāļāļīāđ, āđāļĨāļ°āļāļ·āđāļāđ), āđāļĨāļ°āļāļļāđāļĄ Login/Logout
|
||
- Sidebar (āļāđāļēāļāļāđāļēāļ): āđāļāđāļāđāļĄāļāļđāļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļēāļāļķāļāļŠāđāļ§āļāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāļāļąāļāđāļāļāļŠāļēāļĢāļāļąāđāļāļŦāļĄāļ āđāļāđāļ Dashboard, Correspondences, RFA, Drawings
|
||
- Main Content Area: āļāļ·āđāļāļāļĩāđāļŠāļģāļŦāļĢāļąāļāđāļŠāļāļāđāļāļ·āđāļāļŦāļēāļŦāļĨāļąāļāļāļāļāļŦāļāđāļēāļāļĩāđāđāļĨāļ·āļāļ
|
||
|
||
## 5.2. āļŦāļāđāļē Landing Page
|
||
|
||
- āđāļāđāļāļŦāļāđāļēāđāļĢāļāļāļĩāđāđāļŠāļāļāļāđāļāļĄāļđāļĨāļāļēāļāļŠāđāļ§āļāļāļāļāđāļāļĢāļāļāļēāļĢāļŠāļģāļŦāļĢāļąāļāļāļđāđāđāļāđāļāļĩāđāļĒāļąāļāđāļĄāđāđāļāđāļĨāđāļāļāļāļīāļ
|
||
|
||
## 5.3. āļŦāļāđāļē Dashboard
|
||
|
||
- āđāļāđāļāļŦāļāđāļēāđāļĢāļāļŦāļĨāļąāļāļāļēāļāļĨāđāļāļāļāļīāļ āļāļĢāļ°āļāļāļāļāđāļ§āļĒ
|
||
- āļāļēāļĢāđāļāļŠāļĢāļļāļāļ āļēāļāļĢāļ§āļĄ (KPI Cards): āđāļŠāļāļāļāđāļāļĄāļđāļĨāļŠāļĢāļļāļāļāļĩāđāļŠāļģāļāļąāļāļāļāļāļāļāļāđāļāļĢ āđāļāđāļ āļāļģāļāļ§āļāđāļāļāļŠāļēāļĢ, āļāļēāļāļāļĩāđāđāļāļīāļāļāļģāļŦāļāļ
|
||
- āļāļēāļĢāļēāļ "āļāļēāļāļāļāļāļāļąāļ" (My Tasks Table): āđāļŠāļāļāļĢāļēāļĒāļāļēāļĢāļāļēāļāļāļąāđāļāļŦāļĄāļāļāļēāļ Circulation āļāļĩāđāļāļđāđāđāļāđāļāđāļāļāļāļģāđāļāļīāļāļāļēāļĢ
|
||
- Security Metrics: āđāļŠāļāļāļāļģāļāļ§āļ files scanned, security incidents, failed login attempts
|
||
|
||
## 5.4. āļāļēāļĢāļāļīāļāļāļēāļĄāļŠāļāļēāļāļ°
|
||
|
||
- āļāļāļāđāļāļĢāļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļēāļĄāļŠāļāļēāļāļ°āđāļāļāļŠāļēāļĢāļāļąāđāļāļāļāļāļāļāđāļāļ (Originator) āđāļĨāļ°āļŠāļāļēāļāļ°āđāļāļāļŠāļēāļĢāļāļĩāđāļŠāđāļāļĄāļēāļāļķāļāļāļāđāļāļ (Recipient)
|
||
|
||
## 5.5. āļāļēāļĢāļāļąāļāļāļēāļĢāļāđāļāļĄāļđāļĨāļŠāđāļ§āļāļāļąāļ§ (Profile Page)
|
||
|
||
- āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāļāđāļāļĄāļđāļĨāļŠāđāļ§āļāļāļąāļ§āđāļĨāļ°āđāļāļĨāļĩāđāļĒāļāļĢāļŦāļąāļŠāļāđāļēāļāļāļāļāļāļāđāļāļāđāļāđ
|
||
|
||
## 5.6. āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāļāļēāļāđāļāļāļāļīāļ (RFA)
|
||
|
||
- āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļđ RFA āđāļāļĢāļđāļāđāļāļ Workflow Diagram āļāļąāđāļāļŦāļĄāļāđāļāđāđāļāļŦāļāđāļēāđāļāļĩāļĒāļ§
|
||
- Interactive History (āđāļāļīāđāļĄ): āđāļāđāļāļāļ āļēāļ Workflow āļāļđāđāđāļāđāļāđāļāļāļŠāļēāļĄāļēāļĢāļ āļāļĨāļīāļāļāļĩāđ Node āļŦāļĢāļ·āļ Step āđāļāđāļēāļāļĩāđāļāđāļēāļāļĄāļēāđāļĨāđāļ§ āđāļāļ·āđāļāļāļđ Audit Log āļĒāđāļāļĒāļāļāļ Step āļāļąāđāļāđāļāđāļāļąāļāļāļĩ (āđāļāđāļ āđāļāļĢāđāļāđāļāļāļāļāļ Approve, āđāļ§āļĨāļēāđāļŦāļ, āļĄāļĩ Comment āļāļ°āđāļĢ) āđāļāļĒāđāļĄāđāļāđāļāļāļŠāļĨāļąāļāđāļāļāļđāđāļ Tab History āđāļĒāļāļāđāļēāļāļŦāļēāļ
|
||
- āļāļąāđāļāļāļāļāļāļĩāđāļĒāļąāļāđāļĄāđāļāļķāļāļŦāļĢāļ·āļāļāđāļēāļāđāļāđāļĨāđāļ§āļāļ°āđāļāđāļāļĢāļđāļāđāļāļ disabled
|
||
- āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāļīāļāļāļēāļĢāđāļāđāđāļāļāļēāļ°āđāļāļāļąāđāļāļāļāļāļāļĩāđāđāļāđāļĢāļąāļāļĄāļāļāļŦāļĄāļēāļĒāļāļēāļ (active)
|
||
- āļŠāļīāļāļāļīāđ Document Control āļāļķāđāļāđāļ āļŠāļēāļĄāļēāļĢāļāļāļ "Force Proceed" āđāļāļĒāļąāļāļāļąāđāļāļāļāļāļāđāļāđāļāđāļāđāļāļļāļāļāļąāđāļāļāļāļ, āļŦāļĢāļ·āļ "Revert" āļāļĨāļąāļāļāļąāđāļāļāļāļāļāđāļāļāļŦāļāđāļēāđāļāđ
|
||
|
||
## 5.7. āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāđāļ§āļĩāļĒāļāđāļāļāļŠāļēāļĢ (Circulation)
|
||
|
||
- āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļđ Circulation āđāļāļĢāļđāļāđāļāļ Workflow āļāļąāđāļāļŦāļĄāļāđāļāđāđāļāļŦāļāđāļēāđāļāļĩāļĒāļ§,āļāļąāđāļāļāļāļāļāļĩāđāļĒāļąāļāđāļĄāđāļāļķāļāļŦāļĢāļ·āļāļāđāļēāļāđāļāđāļĨāđāļ§āļāļ°āđāļāđāļāļĢāļđāļāđāļāļ disabled, āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāļīāļāļāļēāļĢāđāļāđāđāļāļāļēāļ°āđāļāļāļąāđāļāļāļāļāļāļĩāđāđāļāđāļĢāļąāļāļĄāļāļāļŦāļĄāļēāļĒāļāļēāļ (active) āđāļāđāļ āļāļĢāļ§āļāļŠāļāļāđāļĨāđāļ§ āđāļāļ·āđāļāđāļāļĒāļąāļāļāļąāđāļāļāļāļāļāđāļāđāļ, āļŠāļīāļāļāļīāđ Document Control āļāļķāđāļāđāļ āļŠāļēāļĄāļēāļĢāļāļāļ āđāļāļĒāļąāļāļāļąāđāļāļāļāļāļāđāļāđāļ āđāļāđāļāļļāļāļāļąāđāļāļāļāļ, āļāļēāļĢāļĒāđāļāļāļāļĨāļąāļ āđāļāļāļąāđāļāļāļāļāļāđāļāļāļŦāļāđāļē āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāđāļāļĒ āļŠāļīāļāļāļīāđ Document Control āļāļķāđāļāđāļ
|
||
|
||
## 5.8. āļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļŠāļēāļĢāļāļģāļŠāđāļ (Transmittals)
|
||
|
||
- āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļđ Transmittals āđāļāļĢāļđāļāđāļāļāļĢāļēāļĒāļāļēāļĢāļāļąāđāļāļŦāļĄāļāđāļāđāđāļāļŦāļāđāļēāđāļāļĩāļĒāļ§
|
||
|
||
## 5.9. āļāđāļāļāļģāļŦāļāļ UI/UX āļāļēāļĢāđāļāļāđāļāļĨāđ (File Attachment UX)
|
||
|
||
- āļĢāļ°āļāļāļāđāļāļāļĢāļāļāļĢāļąāļāļāļēāļĢāļāļąāļāđāļŦāļĨāļāđāļāļĨāđāļŦāļĨāļēāļĒāđāļāļĨāđāļāļĢāđāļāļĄāļāļąāļ (Multi-file upload) āđāļāđāļ āļāļēāļĢāļĨāļēāļāđāļĨāļ°āļ§āļēāļ (Drag-and-Drop)
|
||
- āđāļāļŦāļāđāļēāļāļąāļāđāļŦāļĨāļ (āđāļāđāļ āļŠāļĢāđāļēāļ RFA āļŦāļĢāļ·āļ Correspondence) āļāļđāđāđāļāđāļāđāļāļāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāđāļāđāļ§āđāļēāđāļāļĨāđāđāļāđāļāđāļ "āđāļāļāļŠāļēāļĢāļŦāļĨāļąāļ" (Main Document āđāļāđāļ PDF) āđāļĨāļ°āđāļāļĨāđāđāļāđāļāđāļ "āđāļāļāļŠāļēāļĢāđāļāļāļāļĢāļ°āļāļāļ" (Supporting Attachments āđāļāđāļ .dwg, .docx, .zip)
|
||
- **Security Feedback:** āđāļŠāļāļ security warnings āļŠāļģāļŦāļĢāļąāļ file types āļāļĩāđāđāļŠāļĩāđāļĒāļāļŦāļĢāļ·āļ files āļāļĩāđ fail virus scan
|
||
- **File Type Indicators:** āđāļŠāļāļ file type icons āđāļĨāļ° security status
|
||
|
||
## 5.10 Form & Interaction
|
||
|
||
- **Dynamic Form Generator:** āđāļāđ Component āļāļĨāļēāļāļāļĩāđāļĢāļąāļ JSON Schema āđāļĨāđāļ§ Render Form āļāļāļāļĄāļēāļāļąāļāđāļāļĄāļąāļāļī āđāļāļ·āđāļāļĨāļāļāļ§āļēāļĄāļāđāļģāļāđāļāļāļāļāļāđāļāđāļāļŦāļāđāļēāļāđāļēāļ āđāļĨāļ°āļĢāļāļāļĢāļąāļāđāļāļāļŠāļēāļĢāļāļĢāļ°āđāļ āļāđāļŦāļĄāđāđ āđāļāđāļāļąāļāļāļĩ
|
||
- **Optimistic Updates:** āļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļŠāļāļēāļāļ° (āđāļāđāļ āļāļ Approve, āļāļ Read) āđāļŦāđ UI āđāļāļĨāļĩāđāļĒāļāļŠāļāļēāļāļ°āļāļąāļāļāļĩāđāļŦāđāļāļđāđāđāļāđāđāļŦāđāļāļāđāļāļāļĢāļ API Response (Rollback āļāđāļē Failed)
|
||
|
||
## 5.11 Mobile Responsiveness
|
||
|
||
- **Table Visualization:** āļāļāļŦāļāđāļēāļāļāļĄāļ·āļāļāļ·āļ āļāļēāļĢāļēāļāļāđāļāļĄāļđāļĨāļāļĩāđāļĄāļĩāļŦāļĨāļēāļĒ Column (āđāļāđāļ Correspondence List) āļāđāļāļāđāļāļĨāļĩāđāļĒāļāļāļēāļĢāđāļŠāļāļāļāļĨāđāļāđāļāđāļāļ **Card View** āļāļąāļāđāļāļĄāļąāļāļī
|
||
- **Navigation:** Sidebar āļāđāļāļāđāļāđāļāđāļāļ Collapsible Drawer
|
||
|
||
## 5.12 Resilience & Offline Support
|
||
|
||
- **Auto-Save Draft:** āļĢāļ°āļāļāļāđāļāļāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāļāļāļĢāđāļĄāļāļĩāđāļāļģāļĨāļąāļāļāļĢāļāļāļĨāļ **LocalStorage** āļāļąāļāđāļāļĄāļąāļāļī āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāđāļāļĄāļđāļĨāļŦāļēāļĒāļāļĢāļāļĩāđāļāđāļāļŦāļĨāļļāļāļŦāļĢāļ·āļāļāļīāļ Browser āđāļāļĒāđāļĄāđāđāļāđāļāļąāđāļāđāļ
|
||
- **State Management:** āđāļāđ State Management āļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄāđāļĨāļ°āđāļĄāđāļāļąāļāļāđāļāļāđāļāļīāļāđāļ āđāļāļĒāđāļāđāļāļāļēāļĢāđāļāđ React Query āļŠāļģāļŦāļĢāļąāļ Server State āđāļĨāļ° React Hook Form āļŠāļģāļŦāļĢāļąāļ Form State
|
||
- **Graceful Degradation:** āļŦāļēāļ Service āļĢāļāļ (āđāļāđāļ Search, Notification) āļĨāđāļĄ āļĢāļ°āļāļāļŦāļĨāļąāļ (CRUD) āļāđāļāļāļĒāļąāļāļāļģāļāļēāļāļāđāļāđāļāđ
|
||
|
||
## 5.13. Secure In-App PDF Viewer (āđāļŦāļĄāđ)
|
||
|
||
- 5.13.1 Viewer Capabilities: āļĢāļ°āļāļāļāđāļāļāļĄāļĩ PDF Viewer āļ āļēāļĒāđāļāđāļāļāļāļĨāļīāđāļāļāļąāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļāļīāļāļāļđāđāļāļĨāđāđāļāļāļŠāļēāļĢāļŦāļĨāļąāļ (PDF) āđāļāđāļāļąāļāļāļĩāđāļāļĒāđāļĄāđāļāđāļāļāļāļēāļ§āļāđāđāļŦāļĨāļāļĨāļāđāļāļĢāļ·āđāļāļ āđāļāļ·āđāļāļāļ§āļēāļĄāļŠāļ°āļāļ§āļāđāļāļāļēāļĢāļāļĢāļ§āļāļāļēāļ (Review/Approve)
|
||
- 5.13.2 Security: āļāļēāļĢāđāļŠāļāļāļāļĨāđāļāļĨāđāļāđāļāļ āļŦāđāļēāļĄ (Disable) āļāļēāļĢāļāļģ Browser Cache āļŠāļģāļŦāļĢāļąāļāđāļāļĨāđ Sensitive āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāļāļđāđāļāļ·āļāđāļāļĨāđāļāļēāļāđāļāļĢāļ·āđāļāļ Client āļ āļēāļĒāļŦāļĨāļąāļ
|
||
- 5.13.3 Performance: āļāđāļāļāļĢāļāļāļĢāļąāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļ Streaming (Range Requests) āđāļāļ·āđāļāđāļŦāđāđāļāļīāļāļāļđāđāļāļĨāđāļāļāļēāļāđāļŦāļāđ (āđāļāđāļ āđāļāļāđāļāļĨāļ 50MB+) āđāļāđāļĢāļ§āļāđāļĢāđāļ§āđāļāļĒāđāļĄāđāļāđāļāļāļĢāļāđāļŦāļĨāļāđāļŠāļĢāđāļāļāļąāđāļāđāļāļĨāđ
|
||
|
||
## ð§Š 6. Testing Requirements
|
||
## 6.1 Unit Testing
|
||
|
||
- āļāđāļāļāļĄāļĩ unit tests āļŠāļģāļŦāļĢāļąāļ business logic āļāļąāđāļāļŦāļĄāļ
|
||
- Code coverage āļāļĒāđāļēāļāļāđāļāļĒ 70% āļŠāļģāļŦāļĢāļąāļ backend services
|
||
- Business Logic: 80%+
|
||
- Controllers: 70%+
|
||
- Utilities: 90%+
|
||
- āļāđāļāļāļāļāļŠāļāļ RBAC permission logic āļāļļāļāļĢāļ°āļāļąāļ
|
||
|
||
## 6.2 Integration Testing
|
||
|
||
- āļāļāļŠāļāļāļāļēāļĢāļāļģāļāļēāļāļĢāđāļ§āļĄāļāļąāļāļāļāļ modules
|
||
- āļāļāļŠāļāļ database migrations āđāļĨāļ° data integrity
|
||
- āļāļāļŠāļāļ API endpoints āļāđāļ§āļĒ realistic data
|
||
|
||
## 6.3 End-to-End Testing
|
||
|
||
- āļāļāļŠāļāļ complete user workflows
|
||
- āļāļāļŠāļāļ document lifecycle āļāļēāļ creation āļāļķāļ archival
|
||
- āļāļāļŠāļāļ cross-module integrations
|
||
|
||
## 6.4 Security Testing
|
||
|
||
- Penetration Testing: āļāļāļŠāļāļ OWASP Top 10 vulnerabilities
|
||
- Security Audit: Review code āļŠāļģāļŦāļĢāļąāļ security flaws
|
||
- Virus Scanning Test: āļāļāļŠāļāļ file upload security
|
||
- Rate Limiting Test: āļāļāļŠāļāļ rate limiting functionality
|
||
|
||
## 6.5 Performance Testing
|
||
|
||
- **Load Testing:** āļāļāļŠāļāļāļāđāļ§āļĒ realistic workloads
|
||
- **Stress Testing:** āļŦāļē breaking points āļāļāļāļĢāļ°āļāļ
|
||
- **Endurance Testing:** āļāļāļŠāļāļāļāļēāļĢāļāļģāļāļēāļāļāđāļāđāļāļ·āđāļāļāđāļāđāļāđāļ§āļĨāļēāļāļēāļ
|
||
|
||
## 6.6 Disaster Recovery Testing
|
||
|
||
- āļāļāļŠāļāļ backup āđāļĨāļ° restoration procedures
|
||
- āļāļāļŠāļāļ failover mechanisms
|
||
- āļāļāļŠāļāļ data integrity āļŦāļĨāļąāļāļāļēāļĢ recovery
|
||
|
||
## 6.7 Specific Scenario Testing (āđāļāļīāđāļĄ)
|
||
|
||
- **Race Condition Test:** āļāļāļŠāļāļāļĒāļīāļ Request āļāļāđāļĨāļāļāļĩāđāđāļāļāļŠāļēāļĢāļāļĢāđāļāļĄāļāļąāļ 100 Request
|
||
- **Transaction Test:** āļāļāļŠāļāļāļāļīāļāđāļāđāļāļĢāļ°āļŦāļ§āđāļēāļ Upload āđāļāļĨāđ (āļāļĢāļ§āļāļŠāļāļāļ§āđāļēāđāļĄāđāļĄāļĩ Orphan File āļŦāļĢāļ·āļ Broken Link)
|
||
- **Permission Test:** āļāļāļŠāļāļ CASL Integration āļāļąāđāļāļāļąāđāļ Backend āđāļĨāļ° Frontend āđāļŦāđāļāļĢāļāļāļąāļ
|
||
|
||
---
|
||
*Version History*
|
||
- **v1.5.1** â 2025â12â04 â Consolidated requirement specifications into single document.
|