62 KiB
ð 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:
- Phase 1 (Upload): āđāļāļĨāđāļāļđāļāļāļąāļāđāļŦāļĨāļāđāļāđāļēāđāļāļĨāđāļāļāļĢāđ temp/ āđāļĨāļ°āđāļāđāļĢāļąāļ temp_id
- Phase 2 (Commit): āđāļĄāļ·āđāļ User āļāļ Submit āļāļāļĢāđāļĄāļŠāļģāđāļĢāđāļ āļĢāļ°āļāļāļāļ°āļĒāđāļēāļĒāđāļāļĨāđāļāļēāļ temp/ āđāļāļĒāļąāļ permanent/{YYYY}/{MM}/ āđāļĨāļ°āļāļąāļāļāļķāļāļĨāļ Database āļ āļēāļĒāđāļ Transaction āđāļāļĩāļĒāļ§āļāļąāļ
- 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
- User Context (āđāļāļ°āļāļģ):
- āđāļĄāļ·āđāļ User āļŠāļĢāđāļēāļāđāļāļāļŠāļēāļĢ UI āļāļ°āđāļŦāđāđāļĨāļ·āļāļ Project/Contract āļāđāļāļ
- āđāļāđ
project_idāļāļēāļ Context āļāļĩāđāđāļĨāļ·āļāļ
- āļāļēāļ Organization:
- Query
project_organizationsāļŦāļĢāļ·āļcontract_organizations - āđāļāđ
originator_organization_idāļŦāļē project āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ - āļāđāļēāļĄāļĩāļŦāļĨāļēāļĒ project āđāļŦāđ User āđāļĨāļ·āļāļ
- Query
- 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
- Unique constraint āļāļ
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
detailsJSON āļāļĩāļĨāļ° 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.2.1 Correspondence Types
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
- āļāļāļāđāļāļāļāļēāļĢāļāļąāļāļāļķāļ Audit Log:
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 āļāļĢāļąāđāļāļĨāđāļēāļŠāļļāļ
- Rate Limiting Strategy:
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 āļāļąāđāļ§āđāļĄāļ
- Database Restoration Procedure:
4.15. āļāļĨāļĒāļļāļāļāđāļāļēāļĢāđāļāđāļāđāļāļ·āļāļ (Notification Strategy - āļāļĢāļąāļāļāļĢāļļāļ)
- āļĢāļ°āļāļāļāļ°āļŠāđāļāļāļēāļĢāđāļāđāļāđāļāļ·āļāļ (āļāđāļēāļ Email āļŦāļĢāļ·āļ Line [cite: 2.7]) āđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāļāļĢāļ°āļāļģāļāļĩāđāļŠāļģāļāļąāļ** āļāļąāļāļāļĩāđ:
- āđāļĄāļ·āđāļāļĄāļĩāđāļāļāļŠāļēāļĢāđāļŦāļĄāđ (Correspondence, RFA) āļāļđāļāļŠāđāļāļĄāļēāļāļķāļāļāļāļāđāļāļĢāļāđāļāļāļāđāļĢāļē
- āđāļĄāļ·āđāļāļĄāļĩāđāļāđāļ§āļĩāļĒāļ (Circulation) āđāļŦāļĄāđ āļĄāļāļāļŦāļĄāļēāļĒāļāļēāļāļĄāļēāļāļĩāđāđāļĢāļē
- (āļāļēāļāđāļĨāļ·āļāļ) āđāļĄāļ·āđāļāđāļāļāļŠāļēāļĢāļāļĩāđāđāļĢāļēāļŠāđāļāđāļ āļāļđāļāļāļģāđāļāļīāļāļāļēāļĢ (āđāļāđāļ āļāļāļļāļĄāļąāļāļī/āļāļāļīāđāļŠāļ)
- (āļāļēāļāđāļĨāļ·āļāļ) āđāļĄāļ·āđāļāđāļāļĨāđāļāļķāļāļ§āļąāļāļāļĢāļāļāļģāļŦāļāļ (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.