## 3.11.15. Database Schema Requirements ### 3.11.15.1. Counter Table Schema ตาราง `document_number_counters` ต้องมีโครงสร้างดังนี้: ```sql CREATE TABLE document_number_counters ( project_id INT NOT NULL, originator_organization_id INT NOT NULL, recipient_organization_id INT NULL, -- NULL for RFA correspondence_type_id INT NOT NULL, sub_type_id INT DEFAULT 0, -- for TRANSMITTAL rfa_type_id INT DEFAULT 0, -- for RFA discipline_id INT DEFAULT 0, -- for RFA current_year INT NOT NULL, version INT DEFAULT 0 NOT NULL, -- Optimistic Lock last_number INT DEFAULT 0, PRIMARY KEY ( project_id, originator_organization_id, COALESCE(recipient_organization_id, 0), correspondence_type_id, sub_type_id, rfa_type_id, discipline_id, current_year ), FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (originator_organization_id) REFERENCES organizations(id) ON DELETE CASCADE, FOREIGN KEY (recipient_organization_id) REFERENCES organizations(id) ON DELETE CASCADE, FOREIGN KEY (correspondence_type_id) REFERENCES correspondence_types(id) ON DELETE CASCADE ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'ตารางเก็บ Running Number Counters'; ``` ### 3.11.15.2. Index Requirements ```sql -- Index สำหรับ Performance CREATE INDEX idx_counter_lookup ON document_number_counters ( project_id, correspondence_type_id, current_year ); -- Index สำหรับ Originator lookup CREATE INDEX idx_counter_org ON document_number_counters ( originator_organization_id, current_year ); ``` ### 3.11.15.3. Important Notes > **💡 Counter Key Design** > - ใช้ `COALESCE(recipient_organization_id, 0)` ใน Primary Key เพื่อรองรับ NULL > - `version` column สำหรับ Optimistic Locking (ป้องกัน race condition) > - `last_number` เริ่มจาก 0 และเพิ่มขึ้นทีละ 1 > - Counter reset ทุกปี (เมื่อ `current_year` เปลี่ยน) > **⚠️ Migration Notes** > - ไม่มีข้อมูลเก่า ไม่ต้องทำ backward compatibility > - สามารถสร้าง table ใหม่ได้เลยตาม schema ข้างต้น > - ต้องมี seed data สำหรับ `correspondence_types`, `rfa_types`, `disciplines` ก่อน ### 3.11.15.4. Example Counter Records ```sql -- Example: LETTER from คคง. to สคฉ.3 in LCBP3-C2 year 2025 INSERT INTO document_number_counters ( project_id, originator_organization_id, recipient_organization_id, correspondence_type_id, sub_type_id, rfa_type_id, discipline_id, current_year, version, last_number ) VALUES ( 2, -- LCBP3-C2 22, -- คคง. 10, -- สคฉ.3 6, -- LETTER 0, 0, 0, 2025, 0, 0 ); -- Example: RFA from ผรม.2 in LCBP3-C2, discipline TER, type RPT, year 2025 INSERT INTO document_number_counters ( project_id, originator_organization_id, recipient_organization_id, correspondence_type_id, sub_type_id, rfa_type_id, discipline_id, current_year, version, last_number ) VALUES ( 2, -- LCBP3-C2 42, -- ผรม.2 NULL, -- RFA ไม่มี specific recipient 1, -- RFA 0, 18, -- RPT (Report) 5, -- TER (Terminal) 2025, 0, 0 ); ```