Singapore Education Account Lifecycle Management (Sprint 1 MVP)#
F01 – Automatic Account Creation & Business Rules QA Architecture Specification#
Dự án: Singapore Public Sector - Education Account Lifecycle Management (MOE / GovTech / CPF Board Context)
Phiên bản: Sprint 1 MVP Specification (v1.0-QA)
Phạm vi thẩm định: F01 (Tạo tài khoản tự động), F02 (Đóng tài khoản tự động), F03 (Simulated CPF Transfer)
Mục tiêu: Trực quan hóa toàn diện Main Flow, Ma trận Business Rules, Phân tích Lỗ hổng (Gaps) và Bộ Test Case chuẩn QA.
1. Executive Summary & Hero KPIs#
Báo cáo thẩm định kỹ thuật này phân tích chi tiết quy trình tự động hóa vòng đời tài khoản giáo dục (Education Account Lifecycle), đối chiếu giữa tài liệu đặc tả nghiệp vụ (Functional Specification) và các giả định triển khai thực tế (Working Assumptions - [WA]). Hệ thống được thiết kế theo tiêu chuẩn dịch vụ công Singapore: bảo toàn tính toàn vẹn dữ liệu tài chính, tuân thủ định dạng định danh công dân NRIC, vận hành phi trạng thái và ghi nhận nhật ký kiểm toán (Audit Trail) bất biến.
- 100% Path Coverage: Bao phủ toàn bộ 5 cổng kiểm định điều kiện (Validation Gates), 5 luồng thay thế (AF01-AF05) và 3 luồng ngoại lệ (EF01-EF03).
- 6 Critical Gaps: Nhận diện các điểm mâu thuẫn then chốt giữa Spec và thực tế triển khai (Initial Migration vs Daily Delta, Scheduled Closure Date, Trigger cơ chế đóng).
- 0.00 SGD Initial Balance: Khởi tạo tài khoản phi số dư, ngăn ngừa rủi ro tài chính trước khi có giao dịch Top-up hoặc Grant.
- SGT Timezone Compliant: Đồng bộ tuyệt đối múi giờ Singapore Time (UTC+8) nhằm triệt tiêu lỗi lệch ngày sinh nhật và xử lý năm nhuận 29/02.
2. Visual Architecture & Workflow Topologies#
2.1. End-to-End Batch Execution Flowchart (F01 Main Flow)#
Sơ đồ quy trình hoàn chỉnh dưới đây khắc phục toàn bộ các lỗ hổng của luồng 11 bước dạng văn bản: bổ sung Vòng lặp Dataset (Batch Loop), làm rõ Tất cả các nhánh rẽ điều kiện (Decision Gates & Else Branches), xác lập Ranh giới Transaction cơ sở dữ liệu (Atomic DB Boundary) và cơ chế Ghi nhận Log xử lý (Lifecycle Processing Record) tại mọi điểm dừng.
2.2. Trình Tự Tương Tác Hệ Thống (Sequence Diagram)#
Sơ đồ tuần tự thể hiện sự giao tiếp giữa các thành phần kiến trúc: Bộ lập lịch (Scheduler), Động cơ Batch, Các nguồn dữ liệu ngoại vi (ICA/MOE), Cơ sở dữ liệu tài khoản và Hệ thống ghi nhật ký kiểm toán.
2.3. Vòng Đời Trạng Thái Tài Khoản (Account State Machine)#
Sơ đồ chuyển đổi trạng thái của Education Account từ thời điểm đủ điều kiện tạo mới (F01) đến khi phát sinh giao dịch, và đóng tài khoản kèm chuyển số dư sang CPF (F02/F03).
3. Ma Trận Quy Tắc Nghiệp Vụ (Business Rules Matrix)#
Bảng đối chiếu toàn diện 10 quy tắc nghiệp vụ F01-BR01 đến F01-BR10, làm rõ sự khác biệt giữa Tài liệu Đặc tả (Spec), Ghi chú triển khai thực tế (Dev Notes [WA]) và Rủi ro QA cần kiểm thử.
| Mã Rule | Tên Quy Tắc & Mô Tả Spec | Phân Tích Kỹ Thuật & Giả Định Triển Khai [WA] | Mức Độ Rủi Ro | Tiêu Chí Kiểm Thử QA (Verification Criteria) |
|---|---|---|---|---|
| F01-BR01 | Chỉ Singapore Citizens được tạo Account Quốc tịch của Student bắt buộc phải là Singapore Citizen. |
Bỏ qua toàn bộ Permanent Residents (PR) và Foreigners (Pass holders). Không hỗ trợ tạo tài khoản chờ nhập tịch. | 🔴 Critical | Kiểm thử với các giá trị: Singapore Citizen, Permanent Resident, Foreigner, NULL, Invalid Enum. |
| F01-BR02 | Độ tuổi đủ điều kiện: [7, 16) Từ ngày sinh nhật 7 tuổi đến trước ngày sinh nhật 16 tuổi. |
Tính dựa trên DOB và Processing Date theo múi giờ Singapore Time (SGT UTC+8). Cần xử lý ca biên ngày nhuận 29/02. | 🔴 Critical | Boundary Value Analysis: Đúng ngày sinh nhật 7 tuổi, 7 tuổi - 1 ngày, trước sinh nhật 16 tuổi 1 ngày, đúng sinh nhật 16 tuổi. |
| F01-BR03 | Tính duy nhất: 1 Công dân = 1 Account Một Person ID chỉ có thể sở hữu tối đa một Education Account. |
Unique constraint cấp Database trên trường Person ID. Kiểm tra cả tài khoản đang Active lẫn tài khoản đã Closed. |
🔴 Critical | Giả lập chạy 2 thread song song tạo tài khoản cho cùng 1 Person ID (Race Condition test). Đảm bảo chỉ 1 record thành công. |
| F01-BR04 | Trạng thái Active & Khởi tạo Balance = 0.00 Account sinh ra ở trạng thái sẵn sàng giao dịch, số dư ban đầu 0. |
Tiền tệ mặc định là SGD. Balance lưu định dạng Decimal(18,2), không bao giờ nhận giá trị âm hoặc null. |
🟡 Medium | Verify DB: Account Status == 'Active', Balance == 0.00, Currency == 'SGD' ngay sau khi tạo. |
| F01-BR05 | Account Number phải Unique Mỗi tài khoản được cấp một số định danh tài khoản duy nhất. |
Sinh chuỗi số có cấu trúc (hoặc kèm tiền tố), đảm bảo thuật toán sinh số không bị trùng lặp giữa các máy chủ batch. | 🟡 Medium | Kiểm tra tính duy nhất (Uniqueness) trên bảng Education Account, kiểm tra định dạng và độ dài Account Number. |
| F01-BR06 | Scheduled Closure Date = DOB + 16 năm Xác định ngày dự kiến đóng tài khoản khi đủ 16 tuổi. |
[XUNG ĐỘT]: Ghi chú thực tế ghi → 0 làm. Nếu không lưu trường này, luồng đóng tự động F02 sẽ bị mất điều kiện truy vấn! |
🔴 Critical | Cần làm rõ với BA/Dev: Nếu không lưu thì F02 chạy bằng gì? Nếu lưu, verify công thức DOB + 16 Years chuẩn xác. |
| F01-BR07 | Độc lập với School / Schooling Status Không phụ thuộc vào trường học, lớp học hay tình trạng đi học. |
Học sinh học tại nhà (homeschooling), chưa nhập học, hoặc nghỉ học vẫn có quyền nhận Education Account. | 🟢 Low | Test data gồm các học sinh có School = NULL, Schooling Status = Inactive/Withdrawn vẫn phải tạo được tài khoản. |
| F01-BR08 | Tính Lũy Đẳng (Idempotency) khi chạy lại Job Chạy lại Job nhiều lần không được tạo trùng hoặc reset tài khoản. |
Job phải kiểm tra tồn tại trước khi tạo. Không được ghi đè Created Date hoặc Balance của tài khoản đang có. |
🔴 Critical | Chạy Daily Job 3 lần liên tiếp trên cùng 1 Dataset. Verify: Số lượng Account không đổi, số dư và trạng thái giữ nguyên. |
| F01-BR09 | Xử lý Học sinh Bổ sung Muộn (Late Onboarding) Học sinh được thêm vào dataset muộn (7-15 tuổi) vẫn được tạo. |
[XUNG ĐỘT]: Ghi chú thực tế ghi → 0 valid. Cần làm rõ hệ thống có cho phép tạo bù tài khoản cho trẻ mới nhập tịch ở tuổi 10 không? |
🔴 Critical | Inject học sinh 10 tuổi mới nhập quốc tịch vào dataset ngày N+1. Kiểm tra tài khoản có được tạo bù hay bị reject. |
| F01-BR10 | Không bắt buộc Parent/Guardian Relationship Thiếu dữ liệu quan hệ cha mẹ không ngăn cản tạo tài khoản. |
Cho phép tạo Account cho trẻ mồ côi hoặc trẻ chưa đồng bộ được dữ liệu hộ gia đình. Không sinh liên kết giả. | 🟡 Medium | Test data với Student không có bản ghi nào trong Relationship Dataset. Verify Account tạo thành công với Parent list rỗng. |
4. Ma Trận Luồng Thay Thế & Ngoại Lệ (Alternative & Exception Flows)#
| Mã Flow | Phân Loại | Tình Huống Kích Hoạt (Trigger Scenario) | Hành Vi Hệ Thống Kỳ Vọng (Expected Behavior) | Mã Kết Quả Ghi Log |
|---|---|---|---|---|
| AF01 | Alternative | Học sinh trong Dataset không phải Singapore Citizen (PR, Foreigner). | Bỏ qua bản ghi, không tạo tài khoản, tiếp tục xử lý bản ghi kế tiếp trong dataset. | Skipped (Reason: Non-Citizen) |
| AF02 | Alternative | Học sinh chưa đủ 7 tuổi (vd: 6 tuổi 364 ngày) hoặc từ đủ 16 tuổi trở lên. | Bỏ qua bản ghi, không tạo tài khoản, tiếp tục xử lý bản ghi kế tiếp. | Skipped (Reason: Age Ineligible) |
| AF03 | Alternative | Học sinh đã có Education Account (Active hoặc Closed) trong cơ sở dữ liệu. | Bỏ qua bản ghi, không tạo mới, bảo toàn tuyệt đối số dư và thông tin tài khoản cũ. | Skipped (Reason: Account Exists) |
| AF04 | Alternative | Học sinh 8-15 tuổi mới được thêm vào Dataset (New Citizen / Late sync). | Hệ thống nhận diện chưa có tài khoản và đủ điều kiện -> Tạo tài khoản bổ sung bình thường. | Success (Reason: New Creation) |
| AF05 | Alternative | Học sinh không có thông tin trong Relationship Dataset. | Vẫn tạo Account thành công, không tạo liên kết giả, ghi nhận trạng thái chưa có guardian. | Success (Guardian Count: 0) |
| EF01 | Exception | Thiếu hoặc sai format các trường bắt buộc (Person ID, Name, DOB, Citizenship). | Không tạo tài khoản, ghi log lỗi chi tiết trường dữ liệu lỗi, không làm dừng Job. | Blocked (Reason: Invalid Data) |
| EF02 | Exception | Dataset có nhiều dòng trùng Person ID nhưng DOB/Citizenship xung đột. | Ghi nhận Data Conflict, không tạo tài khoản cho Person ID này, chờ giải trình dữ liệu thủ công. | Blocked (Reason: Data Conflict) |
| EF03 | Exception | Lỗi hệ thống trong quá trình tạo (DB timeout, mất kết nối, unique collision). | Rollback toàn bộ transaction dở dang, không lưu tài khoản chắp vá, ghi log lỗi để retry. | Failed (Reason: System Error) |
5. Phân Tích 6 Gaps Kỹ Thuật Then Chốt (QA Deep-Dive)#
GAP 1 (CRITICAL): Rủi ro mất trắng dữ liệu khi phân tách "Lần đầu chạy" vs "Hằng ngày chạy"
Thực trạng: Có quan điểm cho rằng: Lần đầu chạy quét trẻ 7-15 tuổi, các ngày sau chỉ quét trẻ đúng 7 tuổi.
Nguy cơ QA chỉ ra: Nếu máy chủ bảo trì hoặc job bị gián đoạn 3 ngày (15/06 đến 17/06), những trẻ sinh nhật vào ngày 15 và 16/06 sẽ bị bỏ sót vĩnh viễn vì khi job chạy lại vào ngày 18/06, các trẻ này đã "7 tuổi 2 ngày"! Ngoài ra, trẻ mới nhập quốc tịch ở tuổi 10 sẽ không bao giờ có tài khoản.
Khuyến nghị kiến trúc: Câu lệnh truy vấn của Daily Job bắt buộc phải luôn là:
WHERE Citizenship = 'Singapore Citizen' AND Age >= 7 AND Age < 16 AND Account_ID IS NULL. Như vậy cơ chế tự động bù (catch-up) luôn hoạt động an toàn mà không cần tách 2 job.
GAP 2 (CRITICAL): Xung đột kiến trúc về Scheduled Closure Date & Cơ chế đóng F02
Thực trạng: Spec yêu cầu tính Scheduled Closure Date = DOB + 16 năm để F02 chạy batch quét tự động. Tuy nhiên ghi chú của Dev ghi [WA] → 0 làm và F02 chuyển sang trigger từ parent.
Nguy cơ QA chỉ ra: Nếu không lưu ngày đóng và chuyển sang chờ Parent trigger: (1) Nếu phụ huynh không bao giờ bấm trigger thì tài khoản sẽ mở vô thời hạn, vi phạm luật Edusave của Singapore; (2) Khoản tiền chuyển sang CPF (F03) sẽ bị đóng băng vô thời hạn; (3) Main Flow Step 9 trở thành dead code.
Khuyến nghị kiến trúc: Bắt buộc duy trì trường Scheduled Closure Date trên bảng Education Account để bảo toàn tính độc lập của dịch vụ công.
GAP 3 (HIGH): Chuẩn hóa định dạng định danh NRIC Singapore & Xử lý năm nhuận (29/02)
Format NRIC: Singapore NRIC có 9 ký tự (ví dụ: T1234567A), tuân theo thuật toán Modulus 11 với trọng số xác định. Step 2 cần quy định rõ validation thuật toán hay chỉ kiểm tra chuỗi rỗng.
Xử lý ngày 29/02: Đối với trẻ sinh ngày 29/02 (năm nhuận), năm tròn 7 tuổi (năm không nhuận) sinh nhật tính là 28/02 hay 01/03? Cần chốt quy ước thống nhất để tránh lệch ngày kích hoạt tài khoản.
Múi giờ Singapore (SGT UTC+8): Toàn bộ phép tính ngày phải ép kiểu timezone Asia/Singapore. Nếu máy chủ chạy UTC, job chạy lúc 00:30 SGT sẽ tính lùi 1 ngày, gây sai lệch tuổi.
GAP 4 (MEDIUM): Nguy cơ phình to Cơ sở dữ liệu (Database Bloat) tại bảng Lifecycle Log
Thực trạng: Bảng Lifecycle Processing Record lưu kết quả cho từng Person ID. Với tập dữ liệu 500,000 học sinh, mỗi ngày có khoảng 480,000 học sinh bị Skipped (do đã có tài khoản hoặc chưa đủ tuổi).
Nguy cơ: Nếu ngày nào cũng ghi 480,000 dòng log Skipped, chỉ sau 1 năm bảng log sẽ vượt 175 triệu bản ghi, làm chậm toàn bộ hệ thống.
Khuyến nghị QA: Chỉ ghi nhận bản ghi chi tiết cho Success, Blocked và Failed. Đối với các bản ghi Skipped, hệ thống chỉ tăng bộ đếm tổng kết (Aggregate Counter) trong bản ghi tổng kết của Batch Job.
GAP 5 (HIGH): Tính nguyên tử của Giao dịch (Database Transaction Atomicity)
Thực trạng: Main Flow chia nhỏ việc khởi tạo thành Step 7, 8, 9 và lưu ở Step 11.
Nguy cơ: Nếu hệ thống bị crash sau khi tạo Account nhưng trước khi map Parent hoặc trước khi ghi log kiểm toán, dữ liệu sẽ ở trạng thái không toàn vẹn (Incomplete Record).
Khuyến nghị QA: Toàn bộ quá trình Insert Account + Map Guardian + Insert Audit Record phải nằm trong 1 Database Transaction duy nhất. Nếu có lỗi bất kỳ, phải ROLLBACK toàn bộ.
6. Ma Trận Kịch Bản Kiểm Thử Chấp Nhận (Acceptance Test Suite Matrix)#
Bảng phân bổ chi tiết các Test Cases từ F01-AC01 đến F01-AC11 kết hợp các ca kiểm thử biên (Boundary & Stress Cases) phục vụ đội ngũ QA thực thi kiểm thử tự động (Automation Test Suite).
| Mã Test Case | Phân Nhóm Kiểm Thử | Dữ Liệu Đầu Vào (Input Data) | Trạng Thái Tiền Điều Kiện (Pre-condition) | Kết Quả Kỳ Vọng (Expected Result) | Trạng Thái Thẩm Định |
|---|---|---|---|---|---|
| TC-F01-01 | Happy Path | SC, DOB = Hôm nay - 7 năm chính xác, Đủ fields | Chưa có Education Account | Tạo 1 Active Account, Balance = SGD 0.00, Ghi log Success | ✅ Đã bao phủ toàn diện: F01-AC01 |
| TC-F01-02 | Late Sync / Catch-up | SC, 10 tuổi (DOB = Hôm nay - 10 năm) | Chưa có Education Account | Tạo Account trong đợt Daily Job chạy kế tiếp | ✅ Đã bao phủ toàn diện: F01-AC02 |
| TC-F01-03 | Boundary Lower | SC, DOB = Hôm nay - 7 năm + 1 ngày (Thiếu 1 ngày) | Chưa có Account | Không tạo Account, Ghi log Skipped (Age Ineligible) | ✅ Đã bao phủ toàn diện: F01-AC03 |
| TC-F01-04 | Boundary Upper | SC, DOB = Hôm nay - 16 năm chính xác (Tròn 16 tuổi) | Chưa có Account | Không tạo Account, Ghi log Skipped (Đã từ đủ 16 tuổi) | ✅ Đã bao phủ toàn diện: F01-AC03 |
| TC-F01-05 | Citizenship Gate | PR hoặc Foreigner, Tuổi = 8, Đủ fields | Chưa có Account | Bỏ qua record, không tạo Account, Log Skipped (Non-SC) | ✅ Đã bao phủ toàn diện: F01-AC04 |
| TC-F01-06 | Duplicate Gate | SC, 8 tuổi, Đã có Account Active với Balance = SGD 50 | Account ID đã tồn tại | Không tạo duplicate, giữ nguyên Balance SGD 50 và Created Date | ✅ Đã bao phủ toàn diện: F01-AC05 |
| TC-F01-07 | Independence | SC, 7 tuổi, School = NULL, Schooling Status = Rỗng | Chưa có Account | Tạo Account thành công, không phụ thuộc thông tin trường học | ✅ Đã bao phủ toàn diện: F01-AC06 |
| TC-F01-08 | Guardian Mapping | SC, 7 tuổi, Relationship Dataset có Cha và Mẹ | Chưa có Account | Tạo Account, liên kết chính xác cả 2 Guardian records | ✅ Đã bao phủ toàn diện: F01-AC07 |
| TC-F01-09 | Orphan / No Guardian | SC, 7 tuổi, Relationship Dataset không có dữ liệu | Chưa có Account | Vẫn tạo Account thành công, không tạo quan hệ phụ huynh giả | ✅ Đã bao phủ toàn diện: F01-AC08 |
| TC-F01-10 | Closure Calculation | SC, DOB = 15/06/2019, Processing Date = 15/06/2026 | Chưa có Account | Created Date = 15/06/2026, Scheduled Closure = 15/06/2035 | ⚠️ Khoảng trống kỹ thuật: Cần chốt F01-BR06 |
| TC-F01-11 | Idempotency Re-run | Chạy Daily Job 2 lần trong cùng 1 ngày trên 1 dataset | Đã chạy xong lần 1 | Lần 2 quét qua không tạo thêm tài khoản, không reset trạng thái | ✅ Đã bao phủ toàn diện: F01-AC10 |
| TC-F01-12 | Data Conflict | 2 dòng cùng Person ID nhưng DOB lệch nhau 1 năm | Chưa có Account | Blocked cả 2 dòng, ghi nhận Data Conflict, không tạo Account | ✅ Đã bao phủ toàn diện: F01-AC11 |
| TC-F01-13 | Leap Year Handling | SC sinh ngày 29/02/2016, Job chạy ngày 28/02 & 01/03/2023 | Chưa có Account | Tạo tài khoản đúng theo quy ước ngày nhuận của Singapore | ⚠️ Khoảng trống kỹ thuật: Cần chốt quy ước 29/02 |
| TC-F01-14 | Transaction Rollback | Giả lập lỗi ngắt kết nối DB khi đang ghi log Step 11 | Bắt đầu tạo Account | Rollback hoàn toàn, không để lại Account mồ côi trong Database | 🛑 Khoảng trống phi chức năng: Phục vụ EF03 |
7. Khuyến Nghị Phối Hợp Cho QA, BA & Dev#
- Thống nhất biểu đồ Main Flow trực quan: Thay thế hoàn toàn 11 bước mô tả đơn tuyến bằng Sơ đồ Khối (Section 2.1) trong tài liệu bàn giao kỹ thuật của Sprint 1.
- Khai tử logic "chỉ quét đúng 7 tuổi hằng ngày": Chốt câu lệnh SQL truy vấn hợp nhất để cơ chế tự động bù tài khoản (Catch-up Mechanism) luôn hoạt động ổn định.
- Giải quyết dứt điểm trường
Scheduled Closure Date: Làm rõ sự mâu thuẫn giữa việc bỏ trường này và luồng tự động đóng tài khoản F02 để không gây đứt gãy vòng đời tài khoản. - Quy định tiêu chuẩn Kiểm toán & Giảm tải DB: Thống nhất chỉ lưu bản ghi
Lifecycle Processing Recordcho các trạng thái có tác động nghiệp vụ (Success,Blocked,Failed), giảm thiểu chi phí lưu trữ cho hàng triệu học sinh.