# 📝 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.