Hiểu hệ thống SSA
Từ nguồn dữ liệu đến phụ huynh, rõ từng điểm kiểm soát.

Toàn cảnh kiến trúcHệ thống gồm gì và các luồng gặp nhau ở đâu? Mở sơ đồ tương tác
Hai UI: Web Admin cho SSA và Zalo Mini App cho phụ huynh. Xem phạm vi tính năng. Admin và Mini App có UI mock; backend và tích hợp thật chưa triển khai. A đã chọn về hướng kỹ thuật. G0 nơi dữ liệu và G1 cửa hàng còn mở; dùng dữ liệu tổng hợp trước khi đủ điều kiện.
1. Quyết định cần nắm trước
Hướng đã chọn, điều kiện còn mở
- A: Mini App qua VPS Việt Nam tới Cloudflare; Airflow điều phối đồng bộ.
- G0 nơi dữ liệu và G1 cửa hàng phải đóng trước production.
- B chỉ là dự phòng; Apps Script không thuộc hệ thống đích.
Phụ trách: Director + phụ trách dữ liệu
Bằng chứng cần có: Quyết định G0/G1 và ADR được SSA xác nhận.

Toàn cảnh kiến trúcHệ thống gồm gì và các luồng gặp nhau ở đâu? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 1
Xây Mini App bằng React + TypeScript + ZaUI + zmp-sdk, phát hành bundle qua nền tảng Zalo. Luồng được chọn: Zalo Mini App → VPS reverse proxy tại Việt Nam → Cloudflare API Worker → D1/R2. Admin, import API, tác vụ giao dịch, lưu trữ và các lớp bảo vệ ứng dụng dùng Cloudflare; Airflow điều phối đồng bộ trên môi trường VPS tại Việt Nam, tách khỏi tiến trình proxy. Không dùng Apps Script trong hệ thống đích. Cloudflare không thay quy trình kiểm duyệt/phát hành Mini App của Zalo.
Có hai điều kiện phải giải quyết trước khi đưa dữ liệu thật lên production:
- Địa điểm dữ liệu. Feedback yêu cầu Việt Nam và điều khoản Zalo vẫn có yêu cầu đó. D1, R2, Queues và Workers cấu hình thông thường chưa cung cấp bằng chứng bảo đảm toàn bộ xử lý/lưu trữ tại Việt Nam. Thiết kế Cloudflare đầy đủ bên dưới là phương án A có điều kiện; chưa đủ cơ sở gọi là production compliant. [Z10, C01-C05, C13]
- Cửa hàng và thanh toán. Yêu cầu ngày 12/11 chọn hướng merchandise có giá/đơn và Checkout SDK. G1 nay cần chốt provider/merchant, cách nhận hàng, hủy/hoàn, settlement và điều kiện duyệt Zalo; không còn là câu hỏi có bổ sung module thanh toán hay không. Chi tiết FEATURES §7.
Đây là các điểm chưa chốt của triển khai, không ngăn việc hoàn thành kế hoạch. Không yêu cầu SSA đăng ký tài khoản lại. Dùng tài khoản đã có và kiểm tra đúng App ID, OA, quyền, chủ thể sở hữu khi bắt đầu thực hiện.
1.1 Phương án kiến trúc
| Phương án | Thành phần | Điều kiện | Đánh giá |
|---|---|---|---|
| A: VPS Việt Nam + Cloudflare (hướng được chọn) | VPS reverse proxy Việt Nam, Airflow orchestration, Workers, D1, R2, Queues, Cron, admin static assets | Có bằng chứng bằng văn bản về địa điểm xử lý/lưu trữ, hoặc xác nhận phạm vi/ngoại lệ hợp lệ từ Zalo; vẫn phải đáp ứng pháp luật | Đã chọn về hướng kỹ thuật; chỉ dùng dữ liệu tổng hợp cho tới khi gate G0 đóng. VPS proxy không chứng minh D1/R2 lưu tại Việt Nam |
| B: Cloudflare kết hợp Việt Nam | Cloudflare DNS và tài nguyên công khai; API, DB, files, jobs, logs, backup tại Việt Nam | SSA chấp thuận thay đổi stack phần dữ liệu; nhà cung cấp cam kết địa điểm; rà soát metadata/traffic | Phương án dự phòng thực dụng để giải quyết residency; không tự động thay thế A |
| C: Apps Script/Sheets | Chỉ là mô tả nguồn cũ trong proposal | Chủ dự án xác nhận loại khỏi stack đích | Không vận hành GAS, không xây adapter GAS hay bridge đồng bộ production |
Trong B, hostname API dùng DNS-only trỏ trực tiếp origin Việt Nam; không mặc nhiên đặt Cloudflare proxy/Tunnel/Worker trước PII. TLS termination, logs, IP metadata và nhà cung cấp email cũng phải nằm trong hồ sơ xử lý. Nếu muốn bật proxy/Access cho luồng nhạy cảm, cần rà soát điều kiện địa điểm riêng. Một DB tại Việt Nam phía sau Worker toàn cầu không giải quyết toàn bộ yêu cầu.
1.2 Các quyết định thiết kế đề xuất
| ADR | Quyết định | Lý do và hệ quả |
|---|---|---|
| ADR-01 | Modular monolith, tách API và background jobs theo runtime | Quy mô ban đầu không cần microservices; vẫn cô lập import/gửi tin khỏi request của phụ huynh |
| ADR-02 | Một DB quan hệ cho giao dịch và quyền | FK, UNIQUE, atomic writes; không dùng Sheet/KV làm nguồn quyền |
| ADR-03 | Snapshot import được công bố nguyên khối | Người dùng không thấy một nửa dữ liệu mới; có thể quay về snapshot cũ |
| ADR-04 | Xác thực Zalo + quan hệ guardian-student đã xác minh | Số điện thoại xác thực chỉ là tín hiệu liên kết, không tự chứng minh quyền giám hộ |
| ADR-05 | Outbox + idempotency | Không để lỗi email tạo mất đơn hoặc bấm lại tạo trùng |
| ADR-06 | Phiếu nhận xét chỉ xuất bản sau duyệt người thật | AI hỗ trợ câu chữ; không tự quyết định điểm hay nhận xét về trẻ |
| ADR-07 | Tách deployment Zalo khỏi deployment backend | Giữ tương thích API với phiên bản Mini App đang live trong khi chờ xét duyệt |
| ADR-08 | Không đưa dữ liệu cá nhân vào cache công khai | Mỗi truy vấn kiểm tra quan hệ hiện hành; thu hồi có hiệu lực ngay |
| ADR-09 | Chọn A để thiết kế, production vẫn qua gate địa điểm | VPS proxy Việt Nam không đổi nơi xử lý của Workers/D1/R2; B chỉ là dự phòng phải được SSA duyệt |
| ADR-10 | Airflow điều phối sync; không dùng Apps Script | DAG có lịch, run ID, retry và reconciliation; Import Worker giữ validation/publish nghiệp vụ |
| ADR-11 | VPS Việt Nam làm reverse proxy cho Mini App | Tách entrypoint khỏi Cloudflare origin; origin phải từ chối request bypass proxy, vẫn kiểm auth/role tại API |
2. Bằng chứng đầu vào và phạm vi tin cậy
Tách đầu vào khỏi điều đã kiểm chứng
- Có proposal, feedback và demo được mô tả trong hồ sơ nguồn.
- Repo hiện chứa tài liệu và công cụ build; chưa có ứng dụng triển khai.
- Nhận source, fixture ẩn danh và inventory tài khoản trước khi dự toán lại.
Phụ trách: Lead + SSA
Bằng chứng cần có: Manifest, source audit và danh sách khoảng trống G2.

Lộ trình và exit gatesĐược chuyển bước khi có kết quả gì? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 2
| Nguồn | Đã xác nhận từ tài liệu/file | Chưa xác minh được |
|---|---|---|
| Proposal L01 | 5 nhóm tính năng; MISA Excel hằng ngày; Apps Script nhập mỗi giờ; một Sheet nhiều tab; khoảng 640-650 học viên/8 cụm sân | Mã 10 file GAS, chất lượng dữ liệu, import thật, cấu hình secret, quyền Drive, latency/quota, source React |
| Feedback L02 | Yêu cầu đối soát, audit, tracing, bảo mật, khôi phục, kiểm thử và trách nhiệm vận hành; residency Việt Nam | Không coi tình huống rủi ro trong PDF là sự cố đã xảy ra |
| Template L03 | 4 tab; chọn con; lịch/điểm danh; phiếu 6 kỹ năng; store; thông báo; màu vàng/đen | Không có bằng chứng login, lưu đơn/đã đọc, khảo sát hay backend thật đang chạy |
| Repo L04 | Chỉ README, tree sạch lúc bắt đầu | Không có app SSA để build hoặc deploy ngay |
Phát hiện cụ thể trong HTML: Qv trả session mau, Jv trả bản sao dữ liệu mẫu, zc là hàm rỗng; w0 tự mở demo. Nhãn “Dữ liệu mẫu · chưa nối máy chủ” xác nhận mục đích. CSS ban đầu có repeat(3,1fr) nhưng có override repeat(4,1fr) phía sau; render mobile xác nhận 4 tab cùng hàng. Giữ layout cuối và loại bỏ CSS dư khi tái cấu trúc. Không lấy các tên/số mẫu làm hồ sơ thật, không đẩy HTML nguyên trạng lên production.
2.1 Những thứ cần nhận trong giai đoạn discovery
Source ZIP/frontend; package/lockfile; app-config; cấu hình Airflow/VPS và tên biến môi trường không chứa giá trị secret; tài liệu hoặc 10 file Apps Script cũ chỉ nếu cần hiểu mapping nguồn, không phải phụ thuộc triển khai; mapping sheet có kiểu dữ liệu; Excel đã ẩn danh của từng loại và trường hợp lỗi; PDF mẫu; quy tắc 6 kỹ năng/5 mức; quyền chỉnh sửa hiện tại; danh sách quan hệ phụ huynh đã xác minh; quy tắc gia hạn/bảo lưu/học bù; trạng thái App ID/OA/quyền phone; domain sở hữu SSA; mẫu chính sách/consent; giờ trực và đầu mối vận hành.
Không gửi key thật qua chat hoặc commit. Khi nhận source: hash archive, scan secrets/dependencies, inventory từng endpoint/trigger, review cùng fixture ẩn danh. Nếu source không nhận được, dự toán lại phần rebuild; không hứa “reuse toàn bộ”.
3. Phạm vi sản phẩm và tiêu chí chấp nhận
Hai ứng dụng, rõ tính năng và trách nhiệm
- Web Admin: vận hành dữ liệu, merchandise, đơn, thanh toán và audit nguồn thu.
- Mini App: bốn tab; bổ sung Checkout, quản lý đơn/thanh toán và Notification/ZBS.
- Mock là demo; hai UI dùng backend chung nhưng đăng nhập, role và phạm vi dữ liệu riêng.
Phụ trách: SSA nghiệp vụ + QA
Bằng chứng cần có: FEATURES.md: MP-01…20, AD-01…14; FR-01…18. Module mới là scope, chưa là tích hợp chạy thật.
Hai ứng dụng, hai nhóm người dùng
- Web Admin: nhân sự SSA quản lý hồ sơ, xác minh quyền, nhập/duyệt dữ liệu, phiếu Coach, thông báo, khảo sát, merchandise, đơn, thanh toán và đối soát nguồn thu.
- Zalo Mini App: phụ huynh chọn con, xem Trang chủ/Kết quả, đơn/Checkout/thanh toán merchandise, Notification/ZBS và khảo sát theo phạm vi mới. Checkout/ZBS thật và khảo sát chưa tích hợp; đã có giao diện đăng ký mua và đơn mock.
Thiết kế đích dùng chung backend, đăng nhập và phân quyền riêng. Hai UI mock hiện lưu dữ liệu độc lập. Bốn mục trên website này là tài liệu.
Đọc tính năng từng ứng dụng và khoảng trống của mock
Hai ứng dụng và phạm vi tính năng SSA
Sản phẩm gồm hai UI: Web Admin cho nhân sự SSA và Zalo Mini App cho phụ huynh. Hai UI dùng chung backend nghiệp vụ và dữ liệu đã phân quyền, nhưng đăng nhập, quyền thao tác và phạm vi dữ liệu riêng. Bốn mục Tổng quan / Kiến trúc / Sơ đồ / Vận hành là website tài liệu, không phải bốn ứng dụng.
Bản đối chiếu cập nhật ngày 12/11/2026. Kiến trúc toàn cảnh / Phạm vi module / Đặc tả và tiêu chí FR.
1. Phân biệt mock và phạm vi phải triển khai
| Trạng thái | Ý nghĩa |
|---|---|
| Có trong mock | Có giao diện hoặc tương tác trong HTML được cung cấp; chưa chứng minh backend thật |
| Có mã, chưa hoạt động đầy đủ | Có nhánh giao diện/handler nhưng bị bỏ qua, thiếu cấu hình hoặc dùng stub |
| Phải xây theo kế hoạch | Có trong PLAN nhưng chưa có màn hình trong mock này |
| Cần chốt | Không được coi mock là quyết định sản phẩm đã duyệt |
Nguồn mock: SSA Phụ Huynh Mobile (Copy).html, 311475 bytes; SHA-256 810d72984a2ac551600fb4832842781d183dc44a1f7d4e036e584aeb9dc44087, trùng L03 trong manifest. Đã đọc source và chạy bốn tab, kiểm tra chọn biến thể, validation size, tạo đơn mẫu và reload; kết quả ở mock-review.json. Mạng ngoài bị chặn khi kiểm tra; không xác nhận SDK Zalo hay nhà cung cấp hoạt động thật. Tên, giá và số liệu trong mock là dữ liệu minh họa.
2. Tính năng Mini App
Bốn tab giữ theo mock: Trang chủ / Kết quả / Cửa hàng / Thông báo. Một phụ huynh có thể chọn nhiều con đã được SSA xác minh; mọi truy vấn và hành động đều phải kiểm quyền lại ở backend.
| ID / màn hình | Tính năng thấy trong mock | Khi triển khai thật |
|---|---|---|
| MP-01: Truy cập | Có mã chào, giải thích chia sẻ số điện thoại, loading, chưa tìm thấy hồ sơ, lỗi và thử lại; demo tự vào app | Xác minh token Zalo tại backend, tra liên kết verified, tạo/thu hồi session. Số điện thoại không tự cấp quyền giám hộ; có hướng dẫn hỗ trợ nếu không khớp |
| MP-02: Chọn con | Chuyển con ở Trang chủ và Kết quả; chọn trẻ khi đăng ký sản phẩm | Không lẫn dữ liệu giữa trẻ; một trẻ nhiều người giám hộ; quyền revoked có hiệu lực với cả request và file |
| MP-03: Hồ sơ tóm tắt | Họ tên, lớp, Coach, lịch học, cụm sân | Hiển thị dữ liệu đã duyệt theo nguồn và thời điểm; không tự cho phụ huynh sửa nguồn MISA |
| MP-04: Gói học | Số buổi còn lại/tổng buổi, thanh tiến độ; cảnh báo khi còn ≤3 buổi, hạn gói trong cảnh báo | Ngưỡng ≤3 là hành vi mock, cần SSA chốt. Null khác 0; không tự tính lại số dư từ attendance nếu chưa chốt quy tắc bảo lưu/học bù |
| MP-05: Chuyên cần | Tổng có mặt/tháng; 5 buổi gần đây, ngày/giờ, Có mặt/Vắng/Có phép | Giữ đúng grain trẻ/buổi, xử lý hủy/học bù và sửa nguồn có lịch sử; chưa có lịch đầy đủ hay chức năng tự xin nghỉ trong mock |
| MP-06: Trang chủ | Mở phiếu mới nhất; 3 thông báo gần đây theo trẻ hoặc thông báo chung; thời điểm cập nhật và Tải lại | API trả freshness/generation, loading/error/empty/stale rõ; reload không làm mất dữ liệu đã lưu |
| MP-07: Kết quả theo kỳ | Chọn tháng từ mới tới cũ; chuyên cần của kỳ; trạng thái chưa có phiếu | Chỉ trả bản published đúng trẻ/kỳ/revision; lớp và Coach phải phản ánh lịch sử của kỳ, không áp lớp hiện tại cho mọi phiếu |
| MP-08: Năng lực | 6 kỹ năng: Dẫn bóng, Chuyền bóng, Ném rổ, Phòng thủ, Thể lực, Tinh thần đội; 5 mức và chênh lệch kỳ trước | So sánh cùng rubric version. Mock bỏ dòng thiếu điểm; bản thật phải hiện Chưa đánh giá, không đổi null thành 0 |
| MP-09: Nhận xét/PDF | Nhận xét Coach, mục tiêu tháng tới, tên Coach, ngày đánh giá; mở PDF nếu có link | Chỉ PDF đã duyệt, đúng revision; quyền được kiểm lại khi mở. Helper Drive trong mock không thay thế thiết kế R2 private / file có kiểm quyền |
| MP-10: Danh mục | Ảnh hoặc hình minh họa fallback, tên, giá, mô tả, còn hàng/tạm hết; sản phẩm hết hàng không có form mua | Catalog/variant do SSA quản lý; giá và việc hiển thị giá phụ thuộc quyết định G1. Cờ conHang trong mock chưa phải hệ thống tồn kho |
| MP-11: Đăng ký mua | Chọn size/màu, số lượng 1 đến 10, trẻ; ghi chú tối đa 300 ký tự; tạm tính; validation và trạng thái đang gửi | Mock đăng ký từng sản phẩm, không có giỏ nhiều sản phẩm. Backend kiểm variant, scope, giới hạn số lượng, giá và idempotency; lưu yêu cầu + outbox atomic |
| MP-12: Sau đăng ký | Mã đơn, tạm tính, thông báo Sale gọi xác nhận và thu tiền; xem Đơn của tôi | Không thanh toán online trong mock. Trạng thái mẫu gồm Mới, Đã liên hệ, Đã thu tiền, Đã giao, Huỷ; cần SSA chốt chuyển trạng thái và người được đổi |
| MP-13: Thông báo | Badge chưa đọc; Tất cả/Chưa đọc; mở chi tiết tự đánh dấu; đánh dấu toàn bộ; nhóm điểm danh, học phí, lịch học, sự kiện, kết quả, thông báo | Đã đọc phải lưu theo guardian/recipient ở server, không dùng trạng thái của cha cho mẹ; chỉ nhận nội dung đúng audience |
| MP-14: Chi tiết tin | Nội dung, ngày, trẻ hoặc thông báo chung; tệp đính kèm nếu có; tin kết quả mở đúng trẻ/kỳ | Backend cung cấp resource/period ID, không suy kỳ từ tên tiêu đề như mock; file private kiểm quyền |
| MP-15: Liên hệ SSA | Có mã CTA Báo lý do nghỉ và Nhắn SSA gia hạn nhưng phụ thuộc OA ID; hiện OA ID rỗng và hàm gửi rỗng | Chốt kênh hỗ trợ, cấu hình và quyền; mở hội thoại không đồng nghĩa đã ghi nhận nghỉ/gia hạn. Có task để nhân sự xử lý nếu nghiệp vụ yêu cầu |
| MP-16: Khảo sát | Chưa có UI hoặc handler khảo sát trong file | Vẫn thuộc MVP theo FR-07: 8 câu 1 đến 5, 2 câu mở, validation, đúng trẻ/đợt, chống trùng, trạng thái đóng/đã gửi; entry từ Trang chủ/Thông báo là đề xuất cần thiết kế |
| MP-17: Quyền riêng tư/hỗ trợ | Chưa thấy màn hình chính sách, consent, rút quyền/yêu cầu sửa dữ liệu, quản lý phiên | Phải bổ sung theo PLAN §§6,13; định vị entry UI khi thiết kế. Không xem việc đồng ý lấy số là consent cho mọi dữ liệu trẻ |
Yêu cầu ngày 12/11/2026 bổ sung thanh toán online vào kế hoạch; chưa có trong mã chạy. Không suy từ mock rằng đã có: thanh toán online, giỏ hàng, tự đổi/hủy đơn, tự đổi thông tin học viên, tự đăng ký/hủy buổi, chat nội bộ, quản trị hoặc API MISA trực tiếp.
3. Tính năng Web Admin
Đây là phạm vi phải xây để vận hành sản phẩm; chưa có ứng dụng Web Admin trong repo. Web responsive cho nhân sự, đăng nhập riêng với MFA/SSO; menu theo role và sân/lớp. Coach, Sale và người duyệt là các vai trò trong cùng Web Admin, không mặc định là ứng dụng riêng. Dashboard điều hành không đồng nghĩa tất cả nhân sự có quyền xem dữ liệu trẻ.
| ID / module Admin | Người dùng chính | Thao tác và đầu ra | Giới hạn bắt buộc |
|---|---|---|---|
| AD-01: Tổng quan công việc | Vận hành, người quản lý đúng scope | Xem batch lỗi/chờ duyệt, nguồn quá hạn, phiếu nháp/chờ duyệt, yêu cầu Sale chưa xử lý, care task và gửi tin thất bại; đi vào chi tiết | Chỉ số lấy từ dữ liệu thật có định nghĩa; không coi số mẫu là KPI. Dashboard kỹ thuật có thể liên kết công cụ quan sát riêng |
| AD-02: Học viên/lớp/sân | Vận hành | Tra hồ sơ, enrollment lịch sử, lịch, gói và điểm danh; xem nguồn/generation; tiếp nhận yêu cầu sửa | Sửa ở đúng nguồn có authority; không ghi đè MISA bằng thao tác tùy ý trên dashboard |
| AD-03: Phụ huynh/liên kết | Vận hành được giao, người xác minh | Xem candidate, đối chiếu evidence, verify/revoke liên kết, xử lý đổi số, xem lịch sử và thu hồi session liên quan | Excel trùng số không tự verified; lưu actor/reason/evidence; không tự phục hồi link revoked |
| AD-04: Import/đối soát | Vận hành nhập; người duyệt publish | Nhận file MISA/Coach, mapping version, validate, preview diff/count/checksum, xem dòng lỗi/quarantine, duyệt hoặc từ chối | Publish generation bằng CAS, lỗi giữ bản đang phục vụ; có truy vết file→batch→row và rollback được kiểm soát |
| AD-05: Phiếu Coach | Coach soạn, người duyệt công bố | Nhập/import 6 kỹ năng, nhận xét, mục tiêu, rubric, kỳ và revision; preview, yêu cầu sửa, duyệt, tạo PDF private | Coach không mặc nhiên tự publish; chỉ published xuất hiện ở Mini App; AI gợi ý là tùy chọn sau duyệt |
| AD-06: Thông báo | Vận hành nội dung, người duyệt | Soạn, chọn audience theo trẻ/lớp/sân, preview recipient, đính kèm, hẹn giờ, duyệt/phát hành/hủy; xem đã đọc | Snapshot recipient khi publish; kiểm quyền/consent hiện hành khi gửi ngoài; nội dung sửa có revision |
| AD-07: Khảo sát/chăm sóc | Vận hành, người chăm sóc đúng scope | Tạo đợt/câu hỏi versioned, mở/đóng, xem tiến độ và kết quả; tạo/phân công/theo dõi task điểm thấp | Không sửa schema đợt đã có câu trả lời; giữ grain theo trẻ/gia đình đã chốt, bảo vệ câu trả lời tự do |
| AD-08: Catalog | Sale/quản trị catalog | Quản lý sản phẩm, ảnh, mô tả, SKU/size/màu, trạng thái có hàng và giá nếu được duyệt | Không suy ra cần ERP/tồn kho đầy đủ; thay đổi có version. C1/C2 phải đồng bộ với UI phụ huynh |
| AD-09: Đơn/nhu cầu tư vấn | Sale | Nhận task bền vững, phân công, xem nhu cầu/biến thể/trẻ và liên hệ tối thiểu; ghi nhận gọi lại, kết quả, trạng thái, lịch sử | Không tự suy đã thu tiền từ gửi form. Chốt quyền sửa/hủy, lý do, bằng chứng và cập nhật ngược cho phụ huynh; Sale không được xem điểm/survey tự do |
| AD-10: Gửi tin và hỗ trợ | Vận hành kỹ thuật đúng quyền | Tra event/delivery/provider ID, retry, DLQ, ambiguous outcome; liên kết request với batch và màn hình | Không retry mù gây gửi trùng; không đưa token/phone/raw nhận xét vào log; ZBS cần được duyệt quyền/chi phí |
| AD-11: Nhân sự/quyền/audit | Admin kỹ thuật, người kiểm soát | Gán role và scope, quản lý vòng đời tài khoản, tra audit thay đổi/phê duyệt, xử lý quyền tạm break-glass | Backend deny-by-default; admin kỹ thuật không mặc nhiên đọc nội dung trẻ; không đưa secret thành trường hiển thị thông thường |
| AD-12: Riêng tư/phục hồi | Người phụ trách dữ liệu + kỹ thuật | Tiếp nhận rút consent/chỉnh sửa/xóa; theo dõi SLA và evidence; quản lý yêu cầu rollback/restore và đối soát sau khôi phục | Backup/deploy/Airflow không bắt buộc nhúng toàn bộ console vào Admin; thao tác nguy hiểm qua runbook, phân quyền và audit |
4. Tính năng hai UI phối hợp như thế nào?
| Web Admin / hệ thống thực hiện | Mini App nhận được | Điều kiện trước khi hiển thị |
|---|---|---|
| Xác minh giữa guardian và student | Chọn đúng các con được liên kết | Verified, còn hiệu lực; kiểm scope mỗi lần gọi |
| Đối soát và publish file MISA | Hồ sơ, lịch, gói, chuyên cần và freshness | Cùng generation đã duyệt, field authority đúng |
| Duyệt phiếu và PDF | Kết quả kỳ, nhận xét, mục tiêu, PDF | Published, đúng trẻ/kỳ/revision |
| Phát hành thông báo | Danh sách, badge, nội dung và đính kèm | Đúng recipient; đã đọc riêng từng người |
| Mở đợt khảo sát | Form đúng trẻ/đợt, xác nhận đã gửi | Chưa đóng, không trùng, version cố định |
| Sale xử lý đăng ký | Yêu cầu của mình và trạng thái xử lý | Lưu bền vững, idempotency; phân biệt nhu cầu và giao dịch |
Airflow, Jobs/Queues, D1/R2 và VPS là thành phần nền hỗ trợ hai UI, không phải thêm app cho phụ huynh. Quyền và liên kết / Import / Gửi tin.
5. Khoảng trống cần thiết kế và nghiệm thu
- Triển khai phạm vi thương mại mới: yêu cầu ngày 12/11 chọn hướng giá/đơn + Checkout SDK. G1 còn phải chốt provider, merchant, settlement và điều kiện phát hành; C2 chỉ là phương án dự phòng khi được SSA quyết định lại.
- Bổ sung UI còn thiếu: Web Admin, khảo sát, chính sách/consent/hỗ trợ và trạng thái liên kết/session. Cần luồng duyệt cho từng module Admin.
- Thay stub bằng backend: Qv/Jv dữ liệu mẫu; Yv tạo đơn trong bộ nhớ; zc/Ed rỗng. Đơn và đã đọc phải tồn tại sau reload và giữa các thiết bị hợp lệ.
- Chốt quy tắc nghiệp vụ: ngưỡng hết gói, học bù/bảo lưu, rubric, survey grain, chuyển trạng thái đơn, quyền sửa/hủy và bằng chứng thu tiền.
- Nghiệm thu liên UI: phụ huynh không thấy draft; revoke chặn cả PDF; publish mới đổi dữ liệu coherent; Sale không xem điểm; gửi lại yêu cầu không sinh đơn thứ hai; đã đọc không ảnh hưởng người giám hộ khác.
6. Dấu vết đối chiếu source mock
File là bundle minified; tên hàm dùng để định vị trong đúng artifact theo hash, không phải tên component nên giữ khi rebuild.
| Vị trí source | Điều đã kiểm tra |
|---|---|
| C0 / Il / I0 | 4 tab; chọn con; trang chủ, cảnh báo ≤3, 3 tin và 5 buổi gần đây |
| O0 | Chọn kỳ, 6 kỹ năng/5 mức, delta kỳ trước, nhận xét/mục tiêu/PDF; thiếu điểm bị bỏ qua |
| y0 / _0 / v0 | Danh mục, mua từng sản phẩm, form, size/màu, lượng 1 đến 10, ghi chú 300, đơn và nhãn trạng thái |
| A0 / gh / P0 | Lọc/chưa đọc, mở chi tiết, attachment, parse kỳ từ tiêu đề và CTA liên hệ có điều kiện |
| w0 / N0 / k0 / x0 / h0 | Mã onboarding và lỗi; w0 tự vào dữ liệu mẫu, chưa xác minh đăng nhập thực |
| Qv / Jv / Yv / zc / Ed / fo | Session mau, clone dữ liệu, đơn trong bộ nhớ, hai stub rỗng, OA ID rỗng |
| fh | Helper mở Drive/URL; không chứng minh quyền private file đúng thiết kế đích |
FR-01…FR-12 là baseline; FR-13…FR-18 bổ sung theo yêu cầu ngày 12/11/2026. Mã trong apps/miniapp hiện chỉ có UI và dữ liệu mock cục bộ, chưa có backend, SDK checkout hay gửi tin thật.
7. Bổ sung module thông báo, thương mại và thanh toán
Phạm vi đã được yêu cầu, chưa triển khai. Yêu cầu ngày 12/11/2026 mở rộng kế hoạch cũ vốn chỉ nhận đăng ký và để Sale liên hệ. Phần này là đặc tả bổ sung có ưu tiên khi khác với giới hạn thương mại trước đây; không biến dữ liệu mock thành giao dịch thật.
7.1 Đã có gì và còn thiếu gì?
| Nhóm được yêu cầu | Tài liệu/mã hiện tại | Phần bổ sung phải xây |
|---|---|---|
| ZNS + Notification Mini App | MP-13/14 có inbox/badge/đã đọc mock; PLAN có outbox và ZBS | MP-18: gửi theo sự kiện, template, deep link, lịch sử delivery và preference |
| Payment gateway + SDK checkout merchandise | PLAN C1 từng nêu như lựa chọn; mã chỉ tạo đăng ký mẫu | MP-19: checkout qua SDK, backend payment adapter, xác nhận server, xử lý pending/retry |
| Đơn hàng + thanh toán phụ huynh | MP-12 có lịch sử đơn mẫu; chưa tách trạng thái tiền/giao hàng | MP-20: chi tiết đơn, lịch sử thanh toán/hoàn tiền, yêu cầu hủy/hỗ trợ |
| Quản lý merchandise | AD-08 mới mô tả catalog/variant | Mở rộng AD-08: xuất bản sản phẩm, giá, tồn khả dụng, giữ hàng và điều chỉnh có lý do |
| Quản lý thanh toán | AD-09 chỉ có ghi nhận trạng thái Sale | AD-13: giao dịch, pending, hoàn tiền, ngoại lệ và phân quyền tài chính |
| Audit nguồn tiền thanh toán | AD-11 có audit thao tác chung; AD-04 là đối soát file học viên | AD-14: đối soát tài chính, nguồn thu, settlement, phí, thực nhận và evidence |
Thuật ngữ: “ZNS” trong yêu cầu được ánh xạ sang ZBS Template Message theo tài liệu Zalo hiện hành. Inbox trong Mini App là dữ liệu ứng dụng; tin gửi qua Zalo/OA là kênh bên ngoài. Không mặc định có quyền push tự do vào Mini App. SDK Checkout điều phối trải nghiệm thanh toán; cổng thanh toán xử lý giao dịch, còn đối soát xác nhận khoản tiền thực nhận. Ba phần này không thay thế nhau. Nguồn Zalo, Checkout SDK.
7.2 Mini App phụ huynh
| ID | Màn hình và hành vi | Điều kiện nghiệm thu |
|---|---|---|
| MP-18 / FR-13 | Inbox theo người nhận; tin đơn mới, thanh toán được xác nhận, giao/nhận hàng, hủy/hoàn tiền; ZBS dẫn về đúng đơn hoặc nội dung; quản lý lựa chọn kênh trong phạm vi nền tảng cho phép | Quyền/template/audience hợp lệ; người không có quyền mở deep link bị từ chối. Delivered bên Zalo không đồng nghĩa đã đọc inbox. Gửi tin lỗi không làm mất đơn hay đảo trạng thái thanh toán |
| MP-19 / FR-14 | Từ sản phẩm → chọn biến thể/số lượng/trẻ → xem giá cuối, cách nhận hàng và phí nếu có → xác nhận → SDK Checkout → xem kết quả do server xác nhận | Server định giá, kiểm tồn và tạo payment attempt. Hủy SDK, mất mạng, app đóng, pending, timeout và retry đều có màn hình. Không ghi “đã thanh toán” từ callback phía client. Đổi giá/tồn phải yêu cầu phụ huynh xác nhận lại |
| MP-20 / FR-15 | Đơn của tôi → chi tiết dòng hàng, giá chốt, cách nhận, trạng thái xử lý, trạng thái tiền riêng, lần thanh toán, hoàn tiền và liên hệ hỗ trợ | Chỉ người đặt hoặc người được cấp quyền xem; cùng con không tự cho mọi guardian xem đơn. Chỉ cho thanh toán lại sau xác minh lần trước; yêu cầu hủy/hoàn cần xử lý nghiệp vụ, không tự hoàn chỉ vì bấm nút |
Giữ bốn tab hiện tại: checkout/chi tiết đơn nằm dưới Cửa hàng, inbox ở Thông báo; không cần thêm một app. Giai đoạn đầu giữ mua từng sản phẩm như mock; giỏ nhiều sản phẩm chưa nằm trong yêu cầu. Checkout merchandise không tự mở rộng sang thu học phí. Cách nhận tại sân hay giao hàng, phí vận chuyển và chính sách hủy/đổi trả phải được SSA chốt trước tích hợp thật.
7.3 Trang vận hành Web Admin
| ID | Màn hình/chức năng | Vai trò và kiểm soát |
|---|---|---|
| AD-08 / FR-16: Merchandise | Danh mục; chi tiết SKU/size/màu/ảnh; giá và lịch sử; nháp/xuất bản/ẩn; tồn khả dụng/đang giữ; nhập/điều chỉnh; lịch sử biến động; danh sách gần hết | Nhân sự catalog soạn; người được giao quyền duyệt giá/xuất bản. Không xóa SKU đã có đơn; đơn giữ snapshot. Sổ tồn có tham chiếu đơn/điều chỉnh; ERP nhiều kho nằm ngoài phạm vi hiện tại |
| AD-09 mở rộng: Đơn hàng | Tìm/lọc theo mã, người đặt, ngày, trạng thái; xử lý xác nhận, chuẩn bị, giao/nhận, yêu cầu hủy; xem lịch sử và liên kết giao dịch | Sale/fulfillment theo scope. Không có quyền tự đánh dấu đã trả tiền hoặc hoàn tiền. Chỉnh đơn sau thanh toán phải qua quy trình chênh lệch/hoàn và audit |
| AD-13 / FR-17: Thanh toán | Danh sách payment/attempt; chi tiết provider transaction; hàng đợi pending/unknown; tra cứu provider; thu ngoài cổng nếu được bật; yêu cầu/duyệt hoàn; theo dõi kết quả hoàn | Kế toán/tài chính; người lập khác người duyệt thu thủ công, hoàn tiền và điều chỉnh. Không cho sửa trực tiếp số tiền giao dịch đã xác nhận; dùng bản ghi điều chỉnh liên kết |
| AD-14 / FR-18: Audit nguồn tiền | Nhập/nhận báo cáo cổng và sao kê; matching; đối soát theo ngày/kỳ; tiền thu, phí, hoàn, net thực nhận; unmatched/thiếu/thừa/trùng; duyệt xử lý lệch; xuất hồ sơ truy vết | Người đối soát, người duyệt và kiểm soát viên có quyền riêng. Bằng chứng hạn chế truy cập, thông tin tài khoản được che; mọi thay đổi có actor/time/reason và trước/sau |
| AD-06/10 mở rộng: Notification | Template/version, loại sự kiện, audience preview, phát hành, delivery log, quota/chi phí và retry/DLQ | Quyền biên tập khác quyền cấu hình gửi. Chỉ gửi sau sự kiện nghiệp vụ được commit, chống gửi trùng theo event/recipient/channel |
“Audit nguồn tiền” ở đây là truy vết nguồn thu và đối soát khoản thực nhận, không phải kết luận pháp lý về nguồn gốc tài sản hoặc hệ thống AML. Phải trả lời: đơn nào → ai đặt → phương thức/kênh nào → giao dịch nào → đơn vị/tài khoản merchant nào thu → settlement/sao kê nào → phí/hoàn/điều chỉnh nào → tiền ròng bao nhiêu → ai xác nhận. Người chuyển tiền có thể khác người đặt; chứng từ không tự chứng minh quan hệ giám hộ.
7.4 Luồng và trạng thái cần tách
- Catalog → đơn: backend chốt snapshot tên/SKU/giá/quantity/currency, kiểm tồn, tạo đơn và giữ hàng có TTL nếu dùng tồn kho. Server dùng số nguyên VND; không tin tổng tiền client.
- Đơn → checkout: tạo payment attempt với idempotency key; gọi SDK bằng dữ liệu server. Một đơn có thể có nhiều lần thử, nhưng không được ghi nhận thu hai lần như một giao dịch bình thường.
- Provider → backend: xác minh chữ ký, merchant, transaction, amount/currency và order; lưu event chống trùng; cập nhật payment + outbox atomic. Callback trễ/đảo thứ tự không được hạ
paidthànhfailed. Unknown phải truy vấn trước khi thu lại. - Tiền → xử lý đơn: xác nhận thu tiền mới kích hoạt bước fulfillment được quy định. Gửi ZBS/inbox từ outbox; tin lỗi vẫn giữ công việc vận hành. Hết thời gian giữ hàng nhưng tiền tới muộn chuyển ngoại lệ để giao/hoàn có người duyệt.
- Settlement → đối soát: khớp giao dịch với báo cáo cổng/sao kê; tiền thu gộp trừ hoàn, phí và điều chỉnh giải thích được phải bằng net thực nhận theo kỳ, kể cả khoản chuyển kỳ. Provider báo paid chưa có nghĩa tiền đã về ngân hàng.
| Đối tượng | Trạng thái đề xuất | Quy tắc |
|---|---|---|
| Đơn | chờ xác nhận, xác nhận, chuẩn bị, sẵn sàng nhận/đang giao, hoàn tất, hủy | Độc lập trạng thái tiền; hủy không tự đồng nghĩa đã hoàn |
| Payment attempt | created, pending, succeeded, failed, cancelled, expired, unknown | Retry cùng attempt dùng cùng key; thành công từ server evidence |
| Thanh toán của đơn | unpaid, pending, paid, partially_refunded, refunded | Thu thừa/trùng là ngoại lệ, không âm thầm bỏ; hoàn không vượt phần đã thu còn có thể hoàn |
| Refund | requested, approved, processing, succeeded, failed, unknown | SDK/client không tự xác nhận; retry chống hoàn hai lần |
| Đối soát | unmatched, matched, discrepancy, resolved | Lưu kết quả matching và lý do điều chỉnh; khóa kỳ đã duyệt, mở lại có quyền/audit |
7.5 Dữ liệu, API và bằng chứng
Các thực thể bổ sung: order_items snapshot; inventory_reservations và stock_movements; payment_attempts; payment_transactions; payment_events; refunds; settlement_batches/lines; reconciliation_cases; financial_adjustments; notification_recipients/deliveries. Một order có nhiều attempts, một transaction có thể có nhiều refunds trong giới hạn; settlement line liên kết transaction hoặc được đưa vào unmatched. Ràng buộc unique (provider, merchant, transaction_id) và event ID chống xử lý lặp.
API dự kiến, chưa tồn tại: tạo đơn/checkout attempt; đọc đơn/payment status; yêu cầu hủy/hoàn; payment webhook; Admin CRUD catalog, fulfillment, refund approval, import settlement và reconcile. Parent endpoint kiểm order ownership; webhook không dùng session phụ huynh mà xác minh provider; endpoint tài chính yêu cầu role và scope riêng. Secret chỉ ở server. CSV import cũng có preview, kiểm trùng và audit; không cho import tự đánh dấu tất cả paid.
Bằng chứng một khoản thu: order ID, attempt ID, provider transaction ID, merchant/phương thức, amount/currency, thời điểm nghiệp vụ/nhận event, reference chứng từ, settlement ID, gross/fee/refund/net, người nhập/duyệt, lý do và correlation ID. Không lưu PAN/CVV; không đưa token hoặc thông tin tài khoản đầy đủ vào log. Hạch toán ERP/MISA và hóa đơn điện tử chưa được coi là tích hợp đã có.
7.6 Điều kiện triển khai và nghiệm thu
| Mã kiểm thử mới | Phải chứng minh |
|---|---|
| T17 Notification | Inbox đúng recipient; read riêng; deep link kiểm quyền; template bị từ chối/quota/retry không làm gửi trùng nghiệp vụ hoặc mất đơn |
| T18 Checkout | Client giả success không đổi paid; webhook giả/sai tiền/sai merchant bị từ chối; duplicate và out-of-order an toàn; đóng app rồi mở lại thấy trạng thái server |
| T19 Orders/stock | Hai người mua SKU cuối không bán vượt; giá thay đổi cần xác nhận; giữ hàng hết hạn/tiền tới muộn được xử lý; không xem được đơn người khác |
| T20 Refund | Maker không tự duyệt; gửi lại không hoàn hai lần; partial refund không vượt số thu; lỗi provider giữ trạng thái thật và hồ sơ xử lý |
| T21 Reconciliation | Bộ mẫu có thiếu/thừa/trùng, phí, hoàn và chuyển kỳ; truy nguyên tới đơn và khoản nhận; tổng khớp hoặc lệch có owner, evidence, người duyệt; phát lại file không nhân đôi |
Phụ thuộc cần cung cấp khi bắt đầu tích hợp: OA/App đã liên kết và được cấp quyền, template được duyệt, merchant/provider sandbox và production, tài khoản nhận tiền, phương thức thanh toán, phí/chu kỳ settlement, quy trình nhận hàng/hủy/hoàn, kế toán lập/duyệt và retention bằng chứng. Chưa chọn cổng cụ thể; không mặc định Checkout SDK đồng nghĩa bắt buộc chỉ dùng ZaloPay. Cấu hình chính thức.
Thứ tự: chốt nghiệp vụ/provider → thiết kế schema/quyền/state → backend/Admin merchandise và đơn → sandbox Checkout/webhook → notification → refund/đối soát → UAT liên UI và thử trên Zalo iOS/Android → duyệt phát hành. Tính lại effort/chi phí; không dùng ước tính baseline làm cam kết cho scope mới. Bộ sơ đồ bổ sung dưới đây mô tả scope mới. commerce-data giữ baseline survey/outbox; payment-data và settlement-data bổ sung quan hệ tiền, không phải migration vật lý.
8. Bản đồ sơ đồ cho buổi trình bày
| Câu hỏi | Sơ đồ Archify | Dùng khi |
|---|---|---|
| Từ mua hàng đến tiền thực nhận? | Tổng quan thương mại | Giới thiệu luồng cho quản lý |
| Ai quản lý hàng và giữ tồn? | Merchandise | Phân công vận hành |
| Khi nào được ghi nhận đã trả tiền? | Sequence Checkout | Review kỹ thuật/backend |
| Inbox khác tin Zalo thế nào? | Notification/ZNS–ZBS | Giải thích kênh nhận tin |
| Ai có quyền hoàn, lúc nào đã hoàn? | Hủy và hoàn tiền | Chính sách và phân quyền tài chính |
| Tiền về thiếu/thừa xử lý ra sao? | Đối soát nguồn thu | Kế toán/kiểm soát |
| Đơn, lần thử, giao dịch, hoàn liên hệ thế nào? | ERD payment | Thiết kế dữ liệu logic |
| Khoản tiền về khớp giao dịch nào? | ERD settlement | Thiết kế đối soát logic |
Mọi sơ đồ mới là thiết kế đề xuất theo yêu cầu đã ghi, không xác nhận tích hợp chạy thật. Các ERD chỉ chọn trường khóa và nghiệp vụ quan trọng; schema vật lý/migration sẽ được thiết kế khi triển khai.
Bảng tính năng Markdown / Tính năng Mini App / Tính năng Web Admin

Phạm vi sản phẩmPhụ huynh và SSA cần những module nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 3
| ID | Tính năng bắt buộc | Tiêu chí chấp nhận | Nguồn |
|---|---|---|---|
| FR-01 | Onboarding, cấp quyền, liên kết phụ huynh | Từ chối quyền vẫn xem hướng dẫn/chính sách; không lộ danh sách trẻ; số không khớp có hỗ trợ | L01, L02, L03 |
| FR-02 | Một phụ huynh nhiều con; một trẻ nhiều người giám hộ | Chọn con không lẫn dữ liệu; kiểm tra quyền mọi endpoint | L01 + mở rộng mô hình cần thiết |
| FR-03 | Trang chủ | Lớp, lịch, sân, gói/buổi còn lại, chuyên cần, cập nhật nguồn; null khác 0 | L01, L03 |
| FR-04 | Điểm danh | Có mặt/Có phép/Vắng; học bù/hủy được xác định trước khi tính tỷ lệ; sửa nguồn có lịch sử | L01, L02 |
| FR-05 | Kết quả tháng | 6 kỹ năng × 5 mức, kỳ trước, nhận xét, mục tiêu, PDF đúng trẻ; chỉ bản published | L01, L03 |
| FR-06 | Thông báo | Theo trẻ/lớp/cụm sân, có hẹn giờ, lọc, đếm chưa đọc, đã đọc theo người nhận | L01, L03 |
| FR-07 | Khảo sát | 8 câu 1-5 và 2 câu mở, validation, chống gửi trùng, đợt đóng, chăm sóc điểm thấp | L01 |
| FR-08 | Cửa hàng/đăng ký nhu cầu | Size, màu, số lượng, đúng trẻ; server tính giá nếu biến thể có giá được duyệt; Sale nhận task bền vững | L01, L03; gate Z11 |
| FR-09 | Import Excel MISA và phiếu Coach | Có preview/đối soát, quarantine, audit, publish atomic và rollback | L01, L02 |
| FR-10 | Admin vận hành | Import, duyệt phiếu, lịch tin, khảo sát, đơn/lead, quyền liên kết, audit theo role | L02 + yêu cầu thay Sheet |
| FR-11 | Vận hành | Alert chủ động, trace source→screen, backup độc lập, restore diễn tập, runbook | L02 |
| FR-12 | Phát hành Zalo | Testing, quyền phone cho user thường, QA iOS/Android, duyệt, Publish, OA entry | L01, Z04-Z09 |
MVP baseline bao gồm khảo sát và admin tối thiểu. Phạm vi bổ sung ngày 12/11/2026 bao gồm FR-13…FR-18; phải tính lại kế hoạch và nghiệm thu, chưa phải tính năng đang chạy. Kênh ZBS chỉ bật khi quyền/template và chi phí được duyệt. AI rewrite vẫn tùy chọn; chat riêng, mạng xã hội, LMS, MISA API, đa học viện SaaS và push tự do không thuộc phạm vi.
| FR bổ sung | Module | Điều kiện đạt |
|---|---|---|
| FR-13 | ZNS/ZBS + Notification Mini App | Inbox đúng recipient, delivery riêng từng kênh, template và deep link kiểm quyền; T17 |
| FR-14 | Payment gateway + Checkout SDK merchandise | Server định giá và xác nhận tiền, webhook/idempotency, pending/recovery; T18 |
| FR-15 | Đơn hàng + thanh toán phụ huynh | Chi tiết đơn, payment/refund và fulfillment riêng, ownership; T19 |
| FR-16 | Merchandise Admin | Catalog/variant, giá versioned, tồn/giữ hàng, xuất bản và audit; T19 |
| FR-17 | Thanh toán Admin | Tra giao dịch, pending, thu ngoài cổng nếu được bật, duyệt hoàn và ngoại lệ; T20 |
| FR-18 | Audit nguồn tiền/đối soát | Trace đơn → transaction → settlement/sao kê → net, lệch có owner/evidence; T21 |
Đặc tả màn hình, trạng thái, schema/API bổ sung và T17–T21 nằm trong FEATURES §7, được nhúng trong chương này của bản HTML. Đây là mở rộng được yêu cầu, không phải xác nhận triển khai.
4. Kiến trúc hệ thống Cloudflare
Hai đường chạy, một nơi giữ luật
- Phụ huynh đi qua VPS; API Worker kiểm quyền và xử lý nghiệp vụ.
- Airflow gọi Import Worker; không ghi trực tiếp DB và không tự duyệt.
- Origin phải chặn bypass; proxy không giải quyết residency Cloudflare.
Phụ trách: Lead + hạ tầng
Bằng chứng cần có: T15/T16: bypass, replay, DAG retry và khôi phục scheduler.

Toàn cảnh kiến trúcHệ thống gồm gì và các luồng gặp nhau ở đâu? Mở sơ đồ tương tác

B dự phòng, chưa chọnNếu A không đóng G0, thay đổi phần nào? Mở sơ đồ tương tác

Airflow và lineageLịch đồng bộ nối tới generation ra sao? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 4
4.1 Ranh giới và thành phần phương án A
| Thành phần | Trách nhiệm | Không làm |
|---|---|---|
| VPS proxy Việt Nam | TLS ingress, reverse proxy API, rate limit và metadata tối thiểu; xác thực đường gọi origin | Không sở hữu nghiệp vụ/quyền; không cache PII, không công khai Airflow UI |
| Airflow tại Việt Nam | Lịch đồng bộ, nhận file từ nguồn được duyệt, run/batch correlation, sensor trạng thái và cảnh báo | Không ghi trực tiếp D1, không tự duyệt bất thường, không thay outbox giao dịch |
| Zalo Mini App | UI React/ZaUI, zmp-sdk, trạng thái màn hình, gọi API qua VPS | Không giữ App Secret, không quyết định quyền theo số điện thoại client gửi |
| API Worker | Auth/session, resource authorization, validation, business commands, read models | Không parse Excel lớn hoặc gọi AI đồng bộ trong request phụ huynh |
| Import Worker | Đọc file private R2, validate, stage, đối soát, publish generation | Không tự publish file bất thường hoặc bỏ qua lỗi FK |
| Jobs Worker + Queues | Outbox dispatch, email/ZBS, report tasks, retry/DLQ | Không coi delivery là exactly-once |
| Cron | Tìm outbox tới hạn, phát hiện import trễ, recovery lease | Không dùng clock client quyết định lịch |
| D1 | Học viên, liên kết, attendance, reports, orders, surveys, outbox, audit, sessions | Không lưu PDF/blob; không lưu raw access token |
| R2 private | Raw Excel, report PDF, exports/backup phù hợp gate | Không public bucket hồ sơ; tên object không có tên trẻ/SĐT |
| Admin static assets | UI vận hành; gọi API với auth nhân sự riêng | Không dùng auth phụ huynh cho nhân viên |
| Observability | Structured events/metrics, correlation ID, alarm | Không ghi token, raw phone, nội dung phiếu hay survey tự do vào logs |
DNS/domain minh họa: api.<domain-SSA>, admin.<domain-SSA>, docs.<domain-SSA>; không phải tên đã đăng ký. Frontend Mini App vẫn được upload Zalo, không trỏ người dùng sang website Cloudflare để đăng nhập. Admin và tài liệu có thể dùng Workers Static Assets; Pages là lựa chọn tương đương cho static nếu đội đã có quy chuẩn. Không cần vận hành cả Pages lẫn Static Assets cho cùng một UI.
D1 chỉ là lựa chọn kỹ thuật có điều kiện G0. Giới hạn Paid 10 GB/DB, thực thi từng DB single-threaded: dùng index, pagination, batch; không suy từ 650 phụ huynh ra khả năng chịu tải. Không bật read replicas ngay; nếu bật, phải kiểm chứng read-after-write và tuyệt đối không dùng dữ liệu quyền cũ. [C07]
Không dùng KV cho session revocation, guardian relation, order status hoặc idempotency do cần nhất quán. Durable Objects chỉ bổ sung nếu cần điều phối singleton/token-refresh theo App/OA; không biến thành nguồn dữ liệu thứ hai. Workers AI không thay thế Claude mặc định: cả hai đều phải qua đánh giá nội dung, nơi xử lý và consent.
4.2 Cấu trúc code dự kiến
apps/miniapp/ React, ZaUI, routes, Zalo SDK adapter
apps/admin/ nhân sự SSA, review/import/support
workers/api/ HTTP và auth middleware
workers/import/ validation, staging, publish
workers/jobs/ outbox, notification, scheduled tasks
packages/domain/ quyền, rule nghiệp vụ, state transitions
packages/contracts/ schema request/response, errors, generated clients
packages/storage/ repository ports + D1 adapter (A), PostgreSQL adapter (B)
packages/importers/ mapping MISA/Coach versioned, fixture ẩn danh
migrations/ schema versioned, forward-compatible
infra/ cấu hình từng environment, secret names
runbooks/ sự cố, restore, phát hành, thu hồi quyền
tests/ integration, security, migration, E2E, load
TypeScript dùng chung ở client/Worker; tách domain khỏi env.DB để phương án B có thể chạy Node LTS + PostgreSQL tại Việt Nam mà không viết lại nghiệp vụ. D1/SQLite và PostgreSQL không dùng nguyên một SQL migration; adapter phải có integration contract tests. Không khóa version SDK/Vite theo DOCX cũ: thử build source nhận được, chọn tổ hợp được Zalo hỗ trợ, commit lockfile, lưu version toolchain và compatibility date.
4.3 Phương án B nếu gate A không đóng (chưa được chọn)
API Node/TypeScript và job worker chạy tại nhà cung cấp Việt Nam; PostgreSQL giữ dữ liệu/quyền/outbox; object storage có cam kết Việt Nam; job runner dùng outbox PostgreSQL và lease, chưa cần Redis. TLS terminate tại VN, origin WAF/rate limits, admin OIDC/identity có đánh giá nơi xử lý. Backup sang tài khoản/điểm lưu độc lập tại Việt Nam. Cloudflare DNS/public site vẫn được dùng; không đưa thông tin định danh vào public assets, analytics hay URL. Đây là thay đổi hạ tầng có thật, phải dự toán vận hành/patching; không gọi nó là “all Cloudflare”.
4.4 VPS proxy, Airflow và ranh giới triển khai được chọn
Luồng phụ huynh: Mini App → HTTPS api.<domain-SSA> tại VPS Việt Nam → HTTPS origin Cloudflare → API Worker → D1/R2. Domain API cho Zalo trỏ DNS-only tới VPS; hostname origin Cloudflare được bảo vệ riêng. Đây là sơ đồ logic đề xuất, chưa phải domain/console đã kiểm chứng. Admin có identity riêng và đường vào được hạn chế; không dùng một session chung với phụ huynh.
Cloudflare WAF/rate limiting bảo vệ origin Cloudflare; request đã tới VPS trước khi tới Cloudflare, nên không được tuyên bố Cloudflare bảo vệ mọi cuộc tấn công vào ingress VPS. VPS cần firewall/provider DDoS phù hợp, OS patching, TLS rotation, giới hạn body/timeouts/concurrency, egress allowlist khi khả thi, health checks, monitoring và phương án thay thế/khôi phục cấu hình. Một VPS là single point of failure; trước live phải chốt standby hoặc chấp nhận rủi ro kèm RTO đã đo. Không tự retry POST sau timeout nếu chưa tra idempotency key.
Bảo vệ origin fail-closed: cấu hình service identity hoặc chữ ký request proxy→origin (timestamp, nonce, method, path và body digest; cửa sổ replay có giới hạn); Worker xác minh trước khi xử lý. Không chỉ dựa vào header tĩnh dễ sao chép, CORS hoặc giấu URL. Nếu dùng Cloudflare Access service token, phải thử tương thích với route Worker và tiếp tục kiểm role/phạm vi tại ứng dụng. Vô hiệu hóa đường public bypass như route workers.dev không được bảo vệ. VPS xóa header giả từ client trước khi đặt forwarding metadata; tin forwarded IP chỉ từ proxy đã xác minh. TLS được kiểm chứng ở cả hai chặng; không dùng chế độ bỏ kiểm certificate. Không log query/token/body chứa dữ liệu trẻ.
Airflow là control plane đồng bộ, không là API public cho Zalo. Scheduler, UI, metadata DB và executor nằm trong mạng quản trị riêng tại Việt Nam; tách service account, tài nguyên và secrets khỏi proxy (hai VPS hoặc isolation tương đương cần benchmark). Metadata DB của Airflow phục vụ scheduler, không thay D1 là database nghiệp vụ. Không đặt hồ sơ trẻ/raw Excel trong XCom hoặc log task: truyền object reference, hash và batch ID. Chốt phiên bản Airflow/provider tương thích qua lockfile/container digest khi triển khai, không khóa bản chưa thử build.
DAG đề xuất: detect_source → register_file → trigger_import → wait_validation → reconcile → wait_approval → request_publish → verify_generation → notify_ops. MISA vẫn xuất Excel theo lịch của SSA; connector chỉ dùng nguồn đã được cấp quyền, chưa có bằng chứng MISA API. Có thể upload vào private object storage qua admin rồi Airflow nhận manifest; không đưa lại Apps Script/Sheets thành dependency. Trigger import bằng service principal scope theo dataset/sân, qua endpoint nội bộ có auth; response trả batch ID để sensor theo dõi. API server giữ rule validation, CAS và publish; DAG không được ghi trực tiếp D1 hoặc tự mở gate duyệt.
DAG run gắn dag_id/run_id, source hash, mapping version, scope, source date, batch ID và generation. File trùng/sensor chạy lại phải dùng cùng idempotency key; retry không đổi business key. Chặn hai publish cùng scope bằng lease/fencing và CAS trong backend, không chỉ bằng max_active_runs. Catchup/backfill có cửa sổ và phê duyệt, giữ delta history; DAG lỗi phải giữ snapshot đang active, cảnh báo và replay đúng task. Không dùng lịch Airflow để gửi từng đơn hay email giao dịch: outbox + Queues/Cron tiếp tục đảm nhận các side effect đó.
Điểm kiểm chứng trước live: trace Zalo→VPS→Worker thành công; truy cập origin trực tiếp bị chặn; giả forwarding header và replay chữ ký bị từ chối; proxy chết có cảnh báo/failover; Airflow retry/backfill không trùng batch; task logs/XCom không PII; scheduler metadata backup/restore và patching có owner. Tham chiếu thiết kế Airflow: A01, A02. Origin routing và service credentials: [C15, C16]. Toàn bộ Cloudflare data services vẫn thuộc G0: VPS tại Việt Nam không làm dữ liệu D1/R2/Queues tự có residency Việt Nam.
5. Dữ liệu, grain và nguồn sự thật
Nguồn sự thật theo từng nhóm dữ liệu
- MISA sở hữu dữ liệu lớp, gói và điểm danh nhập.
- SSA xác minh liên kết; hệ thống giữ consent, đơn, khảo sát và đã đọc.
- Rollback generation MISA không quay ngược các giao dịch này.
Phụ trách: SSA dữ liệu + backend
Bằng chứng cần có: Fixture grain, full/delta và công thức có expected output.

Quan hệ giám hộGuardian, học viên và lịch sử quyền liên hệ thế nào? Mở sơ đồ tương tác

Giao dịch và gửi tinYêu cầu, dòng sản phẩm, survey và outbox liên hệ thế nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 5
Nguồn sự thật nghiệp vụ được phân theo field, không tuyên bố một hệ thống sở hữu mọi thứ. MISA sở hữu số liệu gói/lớp và điểm danh nhập; SSA xác minh liên kết giám hộ; hệ thống mới sở hữu đơn/lead, survey, read receipts, consent và audit. Cập nhật MISA không được ghi đè consent/quyền/order.
5.1 Mô hình quan hệ chính
| Entity | Grain / unique | Field đáng chú ý / quy tắc |
|---|---|---|
| students | Một học viên, UNIQUE(source_system, external_student_id) | internal ID ổn định; tên, trạng thái; không tái dùng ID khi học lại |
| guardians | Một người dùng nội bộ | Không lấy phone làm PK; encrypted phone + keyed lookup digest |
| zalo_identities | UNIQUE(app_id, zalo_user_id) | FK guardian; không mặc định UID Mini App = OA UID |
| guardian_student_links | Một quan hệ guardian/student, có lịch sử | status pending/verified/revoked, effective dates, evidence reference, verified_by, auth_version |
| consent_records | Một chủ thể/mục đích/version/quyết định | guardian, child nếu áp dụng, thời gian, kênh, scope, withdrawal; không dùng checkbox phone thay consent trẻ |
| sessions | Một thiết bị/phiên | hash refresh/opaque token, expires_at, revoked_at, version, rotated_from |
| campuses/classes/enrollments | Một sân/lớp và mỗi đợt học | enrollment có valid_from/to; không lấy lớp hiện tại áp vào báo cáo lịch sử |
| package_snapshots | Một trẻ/gói/generation | purchased/used/remaining, source row, effective_at; giữ null và âm để phát hiện lỗi |
| attendance | Một trẻ/buổi học | Ưu tiên source session ID; fallback student+date+class chỉ khi SSA xác nhận không có hai buổi/ngày/lớp |
| report_periods/reports | Một trẻ/kỳ/revision | 6 scores, original/revised text, reviewer, published_at, private object reference |
| import_batches/import_rows | Một file/mapping version và từng dòng | SHA-256, source date, counts, checksum, rule errors, generation, state |
| active_datasets | Một scope/dataset | active generation; compare-and-swap publish; coherent manifest cho profile/package/attendance |
| audit_events | Một thay đổi có actor | resource, before/after tối thiểu, batch_id/request_id, reason; append-only theo quyền app |
guardian_student_links không tự được upsert thành verified chỉ vì Excel có cùng số. Import mới tạo candidate, đối chiếu hồ sơ ghi danh, người có thẩm quyền duyệt. Quan hệ đã revoked không tự hồi sinh sau import. Đổi số phải kiểm chứng lại và thu hồi sessions liên quan; không tự chuyển quyền sang người đang sở hữu số tái cấp.
5.2 Nghiệp vụ phụ huynh và thông báo
| Entity | Grain / constraints | Ghi chú |
|---|---|---|
| notifications | Một thông điệp/revision | draft, scheduled, published, cancelled; audience rule + snapshot |
| notification_recipients | UNIQUE(notification_id, guardian_id, student_scope) | Chốt recipient khi phát hành; gửi ra ngoài vẫn kiểm tra quyền hiện hành |
| notification_reads | UNIQUE(notification_id, guardian_id) | Đọc của bố không tự thành đọc của mẹ; định nghĩa analytics theo recipient |
| survey_rounds/questions | Một đợt và version câu hỏi | Không thay schema câu hỏi của đợt đã thu câu trả lời |
| survey_submissions/answers | UNIQUE(round_id, guardian_id, student_id) đề xuất | SSA quyết định theo trẻ hay gia đình; chọn theo trẻ để báo cáo đúng sân/lớp tại thời điểm nộp |
| care_tasks | Một sự kiện cần chăm sóc | score threshold/version, assignee, state; không dùng email làm task duy nhất |
| products/variants | Một SP và tổ hợp size/màu | active, catalog version, integer VND price nếu được phép |
| orders/order_lines | Một yêu cầu đặt hàng, nhiều dòng | snapshot SKU/price; UNIQUE(guardian_id, idempotency_key); child FK |
| consultation_requests | Một nhu cầu tư vấn | Dùng thay order ở biến thể không Checkout; không biểu diễn “đã mua/đã thanh toán” |
| outbox_events/deliveries | Một domain event và từng lần gửi | event ID, attempts, due_at, lease, provider ID, ambiguous outcome |
| webhook_events | UNIQUE(provider,event_id) hoặc canonical digest | signature check, replay window; redact body sau thời gian debug được duyệt |
Index tối thiểu: links(guardian_id,status,student_id), attendance(student_id,session_date DESC), reports(student_id,status,period), recipients(guardian_id,published_at), orders(guardian_id,created_at), outbox(status,due_at), import_rows(batch_id,row_no). Foreign key checks phải bật/kiểm chứng trong migration tests. Tiền là integer VND; timestamp UTC, ngày học và lịch gửi dùng Asia/Ho_Chi_Minh. SĐT chuẩn hóa +84 theo số hợp lệ, không cắt/ghép tùy tiện hoặc làm mất số 0 từ Excel.
ERD đơn và thanh toán / ERD settlement: mô hình logic mở rộng, chưa phải migration triển khai.
5.3 Ma trận trao đổi dữ liệu giữa ứng dụng
| Bên gửi → nhận | Dữ liệu và authority | Điểm kiểm soát / truy vết | Không được truyền |
|---|---|---|---|
| MISA export → Airflow → Import Worker | File học viên/gói/điểm danh, source authority MISA | Hash, source date, mapping, DAG run, batch/row; preview trước publish | Không gửi secret MISA vào client; không tự gọi MISA API chưa có quyền |
| Coach → Admin → Import Worker | 6 kỹ năng, nhận xét, kỳ/rubric; người duyệt quyết định published | Draft/revision, reviewer, audit và PDF đúng revision | Không để AI/DAG tự publish hoặc đổi điểm |
| Hồ sơ liên hệ SSA → Admin → verified links | Quan hệ phụ huynh được xác minh riêng | Evidence, actor, effective dates, revoke; import chỉ candidate | Không suy quyền giám hộ chỉ từ cùng số điện thoại |
| Mini App → VPS Việt Nam → Worker | Session, child scope, command có idempotency key | Proxy identity + auth ứng dụng; request ID xuyên hai chặng | Không giữ App Secret trên client; không tin forwarded headers từ client |
| Worker ↔ D1 / R2 | Quan hệ/quyền/giao dịch; raw file/PDF private | Atomic writes, generation manifest, resource authorization | Không public PDF, không cache PII công khai |
| D1 outbox → Jobs → ZBS/email | Event reference, recipient hợp lệ, nội dung tối thiểu | Consent, quyền hiện hành, event/delivery/provider ID, retry/DLQ | Không gửi full profile/điểm/survey tự do theo mặc định |
| API → Mini App/Admin | Read models theo role, published data, source freshness | Request ID, sourceAsOf, importedAt, generation | Không trả toàn bộ Sheet hay hồ sơ ngoài scope |
| Airflow/API/jobs → observability / backup | Metadata redacted và bản sao có quyền riêng | Run/batch/event IDs; retention; restore manifest và deletion ledger | Không raw token/phone/nhận xét trong logs hoặc XCom |
5.4 Công thức cần chốt bằng fixture
Chuyên cần đề xuất = số buổi Có mặt / số buổi theo lịch đủ điều kiện trong kỳ; Có phép không tự bằng Có mặt. Phải chốt có loại trừ buổi hủy và cách tính học bù. Số buổi còn lại lấy snapshot MISA được duyệt, không tự tính từ bảng attendance khi quy tắc bảo lưu/gia hạn chưa rõ. So sánh 6 kỹ năng chỉ giữa cùng rubric version; thiếu điểm hiển thị “Chưa đánh giá”, không đổi thành 0. Hai bản nhận xét cùng tháng cần revision và bản published duy nhất.
6. Xác thực, liên kết và phân quyền
Đăng nhập không đồng nghĩa có quyền
- Backend xác minh token; phone khớp chưa đủ cấp quyền trẻ.
- Mỗi request/PDF kiểm session và link verified hiện hành.
- Admin có identity riêng; Sale không được đọc toàn bộ hồ sơ.
Phụ trách: Backend + SSA xác minh
Bằng chứng cần có: T01/T02/T03: token sai, xem trẻ khác, thu hồi giữa phiên.

Xác thực và quyền trẻĐiều gì cho phép một phụ huynh xem một trẻ? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 6
- Người dùng xem onboarding giải thích mục đích và chính sách. Chỉ sau hành động chủ động mới xin phone permission. Từ chối: màn hình hướng dẫn/hỗ trợ, không tự đóng app.
- Client lấy access token từ SDK, gửi server; server gọi profile API với
appsecret_proof = HMAC-SHA256(access_token, AppSecret)theo tài liệu chính thức. Chỉ yêu cầu trường cần thiết như ID. Không tin UID/name do client tự khai. [Z07] - Khi cần liên kết hồ sơ:
getPhoneNumber()trả token; backend gọiGET https://graph.zalo.me/v2.0/me/infovới headersaccess_token,code(phone token),secret_keycủa cùng app. Token dùng một lần, hết hạn sau 2 phút; nếu timeout không biết đã đổi thành công hay chưa, xác minh kết quả login theo nonce hoặc yêu cầu token mới, không retry token cũ vô hạn. Không gửi App Secret về client. Token sai/hết hạn/mismatch phải fail closed; không fallback sang nhập số để tự mở dữ liệu. [Z08] - Chuẩn hóa số đã xác thực; tra candidate contact; cần link verified hiện hành. Không trả tên trẻ để “gợi ý chọn” khi chưa đủ quyền. Hồ sơ chưa khớp tạo support case với thông tin tối thiểu.
- Tạo guardian identity theo
(app_id, zalo_user_id), cấp session ứng dụng. Backend trả danh sách trẻ được phép và phiên bản quyền, không trả toàn bộ data Sheet. - Mọi request/file/deeplink kiểm tra session còn hiệu lực và link chưa revoked. Xóa cache riêng khi đổi con/logout/revoke. Thu hồi không phụ thuộc thời hạn token 30 ngày.
Session đề xuất: access token ứng dụng 15 phút; rotating refresh/opaque session tối đa 7 ngày, idle 24 giờ; đây là policy khởi điểm phải thử UX Zalo. Khi hết phiên ưu tiên tái xác thực nền bằng SDK nếu quyền còn hợp lệ, tránh bắt người dùng đăng nhập lại thủ công trái trải nghiệm liên kết. Refresh token hash lưu server; rotation single-use, replay thu hồi chain. Không lưu PII trong JWT. Mini App storage adapter dùng khả năng SDK được hỗ trợ; không giữ hồ sơ trẻ offline lâu dài. Với trình duyệt demo chỉ fixture; không fallback sang session production giả.
6.1 Ma trận quyền
| Vai trò | Xem trẻ/phiếu | Sửa nguồn | Duyệt/phát hành | Đơn/khảo sát | Quản trị |
|---|---|---|---|---|---|
| Phụ huynh | Trẻ có link verified; published reports | Không | Không | Chỉ của mình; survey đúng scope | Rút consent/yêu cầu chỉnh sửa |
| Coach | Lớp được phân công, tối thiểu PII | Draft nhận xét | Không tự publish nếu rule hai người | Không | Không |
| Vận hành | Theo sân/lớp được giao | Import/stage, đề xuất sửa link | Tin/phiếu theo quyền | Care tasks | Không quản lý secret |
| Người duyệt | Scope được giao | Không sửa raw Excel | Approve report/import bất thường | Xem số liệu cần duyệt | Không admin toàn hệ thống |
| Sale | Thông tin liên hệ cần cho yêu cầu mua | Catalog theo quyền | Không | Xử lý order/lead | Không xem điểm, survey tự do |
| Admin kỹ thuật | Metadata vận hành | Migration có quy trình | Deploy | Không mặc định đọc nội dung trẻ | Secrets, account roles, recovery |
| Break-glass | Quyền tạm theo sự cố | Có audit/reason/expiry | Theo sự cố | Tối thiểu cần thiết | Review sau sử dụng |
Admin authentication tách parent flow, MFA/SSO và deny-by-default backend. Cloudflare Access ở A chỉ là lớp cửa vào: Worker vẫn kiểm chứng JWT audience/issuer và role nghiệp vụ. Không tin header tự đặt hoặc UI ẩn nút. Với B chọn giải pháp identity phù hợp địa điểm, không tự đẩy tên/email nhân sự sang dịch vụ chưa duyệt.
6.1a Quyền merchandise và tài chính bổ sung
| Vai trò | Được thao tác | Không tự thực hiện |
|---|---|---|
| Catalog | Soạn SKU/giá/tồn; đề nghị xuất bản/điều chỉnh | Vượt quyền duyệt; xóa SKU đã có đơn |
| Sale/fulfillment | Xác nhận, chuẩn bị, giao/nhận và yêu cầu hủy | Đánh dấu paid, xác nhận hoàn hoặc sửa settlement |
| Kế toán lập | Tra giao dịch, đề nghị thu thủ công/hoàn/điều chỉnh và đối soát | Tự duyệt đề nghị của mình |
| Người duyệt tài chính | Duyệt đề nghị đủ evidence và trong hạn mức được giao | Duyệt giao dịch do chính mình lập; bỏ qua kết quả provider |
| Kiểm soát viên | Đọc audit, truy nguyên và xuất hồ sơ theo scope | Sửa giao dịch hoặc xóa bằng chứng |
Backend kiểm role, scope, người lập/người duyệt và version ở mỗi lệnh; điều chỉnh bằng bản ghi liên kết. Quyền giao diện không thay quyền server. Hoàn tiền / Đối soát.
7. Import MISA và xuất bản dữ liệu
Duyệt trước, công bố nguyên phiên bản
- File được validate, stage và đối soát trước khi SSA duyệt.
- Publish CAS đổi manifest nguyên khối; lỗi giữ bản đang phục vụ.
- Delta giữ lịch sử; conflict phải hợp nhất và đối soát lại.
Phụ trách: SSA vận hành + người duyệt
Bằng chứng cần có: T04/T16: file trùng, crash giữa chừng, delta ngày 2 giữ ngày 1.

Duyệt và publish MISAKhi nào file mới được phép xuất hiện trên màn hình? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 7
MISA vẫn do SSA xuất Excel hằng ngày; không hứa realtime hoặc tự động truy cập MISA. Phương án đích: Airflow điều phối nhận manifest/file từ nguồn đã duyệt, gọi Import Worker qua API có quyền và theo dõi batch đến publish. Nhân sự upload qua admin khi chưa có connector phù hợp. Không dùng Apps Script, không đồng bộ qua Sheet production; Drive chỉ là nguồn file nếu SSA chủ động chọn và gate dữ liệu cho phép. Chi tiết orchestration tại §4.4.
7.1 Pipeline
Quy tắc duyệt khởi đầu đề xuất cho MVP: mỗi batch/generation đều cần người có quyền của SSA duyệt bản đối soát trước publish, kể cả batch không vượt ngưỡng cảnh báo. Bất thường phải được giải thích/xử lý trước khi duyệt. Airflow dừng chờ approval; service principal không được tự tạo approval hoặc bypass. SSA phải bố trí người duyệt theo lịch nhập; thời điểm công bố phụ thuộc file và approval. Sau pilot có thể đề xuất tự động hóa batch bình thường nhưng cần quyết định mới, test và policy version riêng; chưa nằm trong phạm vi tự động publish hiện tại.
- Upload: role đúng, giới hạn kích thước/số dòng đề xuất 10 MB/50.000 dòng sau khi benchmark; chỉ
.xlsx/CSV mapping đã cho phép, kiểm tra nội dung thực. Lưu private object key và hash, không lấy filename người dùng làm path. - Quarantine: kiểm tra ZIP bomb, archive expansion, macro/embedded links, formula cells; không thực thi formula và không fetch URL từ workbook. Parser được pin version, scan dependency. File quá lớn chuyển luồng batch, không vượt memory/CPU Worker.
- Classify: loại HocVien/LienHePH/DiemDanh/Coach; required headers, mapping version, source effective date, timezone, campus scope. Giữ row_no để truy ngược.
- Validate: duplicate business key, phone invalid, missing FK, unknown campus, negative sessions, total<used, future dates, kỳ sai. Tách warnings khỏi hard errors; không nuốt lỗi để import “thành công”.
- Stage: ghi generation mới theo chunks idempotent, chưa chuyển active pointer. Giữ count/read hash từng chunk. Job chết giữa chừng resume cùng batch.
- Reconcile: source count = accepted + rejected; distinct students; attendance by status; diff remaining per student; records removed; contacts changed; tổng theo sân; review mọi delta bất thường. Ngưỡng đề xuất: giảm >20% số trẻ hoặc thay remaining >5 buổi hàng loạt phải duyệt, không coi ngưỡng là đúng nghiệp vụ mặc định.
- Publish: trong transaction/batch atomic chỉ chuyển manifest active từ expected old generation sang new, ghi audit và outbox import-published. Không tạo side effect email trước commit.
- Derived notifications: chỉ sau publish và nguồn đủ mới. Event key gồm loại+student+session/package/report revision để dedupe; import lại không gửi lần hai. Source sửa “Vắng” thành “Có mặt” tạo correction, không xóa dấu vết.
- Archive: giữ raw và normalized reference theo retention; hiển thị source_as_of và imported_at riêng. Import mới không biến timestamp file cũ thành dữ liệu mới.
Snapshot atomic áp dụng dữ liệu MISA; orders/consent/links/read receipts không bị đảo về generation cũ. Mỗi API request giữ cùng dataset generation khi đọc nhiều bảng. Không dùng “batch từng chunk đã commit” như bằng chứng atomic của toàn file. Hai import chạy cùng scope dùng lease + fencing/version; publish CAS ngăn worker cũ overwrite worker mới. Reject file cũ hơn source date trừ thao tác backfill có lý do.
7.2 Full snapshot và delta theo dataset
Generation là ảnh đọc hoàn chỉnh sau hợp nhất, không mặc định đồng nghĩa với một file upload. Batch bắt buộc ghi dataset, input_mode, scope sân/lớp, kỳ hiệu lực, base generation và mapping version; không đoán full/delta từ tên file.
| Dataset | Chế độ đầu vào | Quy tắc hợp nhất |
|---|---|---|
| HocVien | Full snapshot trong scope được SSA xác nhận đầy đủ | Thay dữ liệu học viên MISA trong scope; giữ scope khác. Trẻ vắng khỏi file chỉ thành inactive candidate sau review, không xóa lịch sử, contact hay verified link |
| DiemDanh | Delta append/update theo mô tả nguồn | Carry forward toàn bộ attendance của base generation rồi upsert theo học viên + ngày + lớp; nếu có nhiều buổi cùng ngày/lớp phải chốt session key tại G3 trước import. Không thấy một dòng trong delta không có nghĩa xóa dòng đó |
| LienHePH | Delta theo contact authority riêng | Chỉ cập nhật field được mapping cho phép; ô trống không tự xóa contact/link. Thay quan hệ giám hộ phải qua xác minh |
| Coach | Delta theo học viên + kỳ + rubric version | Tạo draft/revision để duyệt; không ghi đè phiếu đã published hoặc tự phát hành |
Full replacement của attendance chỉ được phép với scope/window được đánh dấu complete và được SSA duyệt; giữ mọi dòng ngoài window. Xóa/cancel là tombstone hoặc correction có lý do, actor, audit và review, không suy ra từ dòng thiếu. Backfill lịch sử không làm mất các ngày mới hơn. Khi base generation thay đổi trước publish, CAS thất bại; phải hợp nhất/reconcile lại trên base mới, không chỉ đổi expected version rồi publish staging cũ. G2/G3 xác nhận grain và mode thực tế trước triển khai.
Acceptance fixture bắt buộc cho T04: import ngày 1 có học viên A/lớp X; import delta ngày 2 của A/X phải trả cả ngày 1 và ngày 2. Gửi lại delta không nhân đôi; sửa trạng thái ngày 1 chỉ cập nhật đúng business key, giữ ngày 2 và audit correction. Thêm fixture scope sân khác, tombstone được duyệt và CAS conflict để chứng minh không mất lịch sử.
7.3 Xử lý lỗi điển hình
| Lỗi | Hành vi hệ thống | Người xử lý |
|---|---|---|
| Sai file/ngày/cụm sân | Quarantine, không đổi active generation | SSA Vận hành |
| Rớt mạng khi upload | Retry cùng upload/batch ID, không nhân đôi | Client + backend |
| Parser/job chết | Retry từ checkpoint, lease hết hạn, DLQ sau giới hạn | Đối tác |
| Thiếu phone ở file học viên | Giữ contact authority riêng, không xóa link | Mapping + Vận hành |
| Thiếu trẻ trong snapshot | Mark inactive candidate; không hard delete dữ liệu lịch sử | Người duyệt |
| File trễ | Hiện ngày nguồn, cảnh báo nội bộ; hoãn tin vắng tự động | Vận hành |
| Đã gửi tin sai | Ngừng campaign, xác định recipients, gửi correction được duyệt | SSA + đối tác |
8. Thiết kế UI theo template và các trạng thái
Thiết kế cả lúc chưa có dữ liệu
- Bốn tab giữ nhận diện SSA; khảo sát mở từ home hoặc thông báo.
- Tách null, nguồn trễ, chưa liên kết, từ chối quyền và lỗi mạng.
- Checkout merchandise là hướng được yêu cầu; G1 còn chốt provider/merchant, nhận hàng, hoàn và settlement.
Phụ trách: Frontend + SSA nghiệp vụ
Bằng chứng cần có: T10 trên Zalo iOS/Android và tài khoản thường.

Phạm vi sản phẩmPhụ huynh và SSA cần những module nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 8
Giữ nhận diện vàng #FFC20E, đen #111113, nền sáng, cách trình bày học viên và 4 tab của template. Không coi font online sẵn có: self-host font có license hoặc system fallback; không tải font bên ngoài vào Mini App chưa được kiểm tra. ZaUI dùng cho Page/Header/BottomNavigation/Sheet/Modal/Toast/Form; nội dung báo cáo giữ thiết kế SSA. Không bắt buộc thay mọi component chỉ để “thuần ZaUI”. [Z02]
| Route / màn hình | Dữ liệu và hành vi | Trạng thái phải có |
|---|---|---|
| welcome/link | Chính sách, lý do xin quyền, hỗ trợ | Chưa xin/từ chối/hết quyền/SDK lỗi/số chưa khớp/link chờ duyệt |
| home | Chọn con, gói, lịch, chuyên cần, tin mới | Loading, chưa có con, nguồn trễ, null remaining, hết gói, lỗi mạng |
| results | Chọn con/kỳ, 6 mức, tiến bộ, nhận xét, PDF | Không có kỳ, draft ẩn, thiếu điểm, rubric đổi, file hết quyền |
| notifications | Filter loại/con, badge, detail, deeplink | Trống, đã thu hồi, đã đọc chưa sync, thông báo bị hủy |
| survey/:round | 10 câu theo version, progress, submit | Đợt đóng, thiếu câu, offline, gửi lại, đã nộp, lỗi server |
| store | Catalog, variants, chọn trẻ, xác nhận | Hết hàng/inactive, giá đổi nếu được duyệt, retry, success có server ID |
| privacy/help | Quyền dữ liệu, contact OA, đổi số/yêu cầu xóa | Không tự liên kết khi user khai số khác |
Khảo sát mở từ home và thông báo, không cần tab thứ năm. Chọn trẻ phải reset query key theo guardian+student; không giữ phiếu con trước trong lúc con mới đang loading. Back button native, safe areas, bàn phím, text scaling, bottom nav 4 cột và tap target khoảng 44 px phải kiểm tra trong Zalo iOS/Android. Loading không chỉ spinner vô hạn: có timeout thông điệp/retry. Mutation retry cùng idempotency key; không hiện “thành công” trước response server.
PDF: backend authorize và trả file/proxy hoặc URL ngắn hạn phù hợp SDK openDocument; kiểm chứng headers/redirects/thời hạn trong thiết bị thật. URL ký vẫn là bearer link có cửa sổ chia sẻ; ưu tiên URL hạn ngắn và không ghi analytics, có đánh giá rủi ro thu hồi. Không dùng link Drive public, không cho phép arbitrary external URL trong thông báo.
8.1 Quyết định cửa hàng (G1)
Merchandise / Checkout sequence / Hoàn tiền
C1 là hướng được chọn theo yêu cầu 12/11/2026: chỉ triển khai production sau khi Zalo xác nhận mô hình hoặc tích hợp Checkout được duyệt. Giữ schema orders/price snapshots. Trong phạm vi thanh toán mới phải bổ sung provider order ID, callback chữ ký, pending/paid/failed/refunded, reconciliation, refund support và dự toán riêng; client callback không xác nhận đã trả tiền.
C2 chỉ còn là dự phòng khi SSA quyết định đổi phạm vi: catalog không giá, CTA “Đăng ký tư vấn”; lưu consultation_request với size/màu/số lượng/trẻ, Sale liên hệ báo giá và thu tiền theo quy trình ngoài app. Không dùng total/đã thanh toán trong UI. Đây là thay đổi so với L01/L03, phải SSA chốt; không âm thầm bỏ giá trong scope.
Prototype hiện là C1 mock, có nhãn dữ liệu mẫu; không gọi là checkout đã hoạt động. G1 chỉ đóng sau khi chốt cấu hình/provider và kiểm duyệt phù hợp. Không dùng feature flag bí mật để bật lại giá sau kiểm duyệt.
9. API contract và tương thích
Contract rõ để hai phía cùng làm
- API /v1 trả requestId và provenance nguồn khi phù hợp.
- Resource scope kiểm trên server; lỗi có code và retryable.
- Timeout có thể đã commit: tra cùng key trước khi gửi lại.
Phụ trách: Backend + frontend
Bằng chứng cần có: Contract tests và tương thích bundle Zalo đang live.

Xác thực và quyền trẻĐiều gì cho phép một phụ huynh xem một trẻ? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 9
API version /v1; response {data, meta:{requestId,sourceAsOf,importedAt,generation}}; lỗi {error:{code,message,retryable},requestId}. Dùng HTTPS JSON đúng MIME, CORS allowlist origin thực quan sát trong Zalo; không dùng wildcard với credentials. CORS không phải authorization. Rate limit theo session/identity và IP với ngưỡng theo test, tránh khóa cả phụ huynh chung NAT. Không trả stack trace.
| Endpoint dự kiến | Quyền / input chính | Invariant |
|---|---|---|
| POST /v1/auth/zalo | accessToken, phoneToken khi liên kết, nonce | Verify server; không log token, không tin phone text |
| POST /v1/auth/refresh; DELETE /v1/session | refresh token / session | Rotation/revoke atomic |
| GET /v1/me/children | session | Chỉ verified links hiện hành |
| GET /v1/students/:id/summary | link | Source/generation cùng request |
| GET /v1/students/:id/attendance?cursor | link; date bounds | Page limit, index, timezone rõ |
| GET /v1/students/:id/reports | link | Chỉ published |
| GET /v1/reports/:id/document | report→student→link | Không dựa vào URL khó đoán |
| GET /v1/notifications?cursor; PUT /:id/read | recipient + current scope | Idempotent read, không sửa read của guardian khác |
| GET /v1/surveys/:round | audience | Trả question version và close_at |
| POST /v1/surveys/:round/submissions | student, answers, version, idempotency key | Validate server; unique submission; không gửi chăm sóc hai lần |
| GET /v1/catalog | approved variant | C2 không trả price field cho parent client |
| POST /v1/orders hoặc /consultations | variant IDs, qty, child, idempotency key | Quyền trẻ, server price, stock policy; không tin total client |
| GET /v1/orders/:id | owner | Không đọc đơn qua ID của người khác |
| POST /v1/admin/imports; GET /:id | staff scope | Signed upload giới hạn file/size/path |
| POST /v1/admin/imports/:id/publish | reviewer, expectedGeneration | CAS + audit + outbox |
| POST /v1/internal/sync-runs; GET /:id | Airflow service principal; hash, run ID, scope | Idempotency theo file/scope; không có quyền sửa guardian links |
| POST /v1/internal/sync-runs/:id/publish | service principal + approval reference + expectedGeneration | Không bypass người duyệt; CAS/audit/outbox như admin |
| POST /v1/admin/reports/:id/publish | reviewer, expectedVersion | Không publish draft đã đổi |
| POST /v1/webhooks/:provider | signature/provider contract | Dedup; ACK sau persist; xử lý async |
Errors: UNAUTHENTICATED 401, FORBIDDEN/NOT_FOUND không lộ tài nguyên, LINK_PENDING 409, VALIDATION_FAILED 422, VERSION_CONFLICT 409, RATE_LIMITED 429 + Retry-After, SOURCE_STALE metadata/read warning, SERVICE_UNAVAILABLE 503. Write timeout có thể đã commit: client query theo key, không tạo key mới tự động.
Các action Apps Script trong proposal (dangNhap, duLieu, daDoc, datHang, guiKhaoSat) chỉ dùng đối chiếu nghiệp vụ; không xây adapter GAS runtime hoặc transition test bắt buộc phụ thuộc GAS. Endpoint duLieu trả mọi thứ cần tách pagination. Các action dangNhapThu, timHocVien, xemNhu, gopY phải bị loại khỏi production routing, không chỉ ẩn nút. Nếu giữ support impersonation sau này phải riêng role/timebound/audit và thông báo rõ.
10. Giao dịch, tác vụ nền và tính đúng
Ghi nhận trước, gửi tin sau
- Transaction ghi nghiệp vụ, idempotency response và outbox.
- Queue có thể giao lại; consumer chống trùng và kiểm quyền trước gửi.
- Provider timeout sau accepted cần tra kết quả; không hứa exactly-once.
Phụ trách: Backend + người trực
Bằng chứng cần có: T05/T06: bấm hai lần, timeout sau commit, queue duplicate.

Từ đơn đến tiền thực nhậnCheckout, giao hàng và đối soát nối nhau ra sao? Mở sơ đồ tương tác

Outbox và gửi tinGửi thất bại hoặc mơ hồ được xử lý thế nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 10
Khi tạo order/consultation: kiểm quyền và validate → transaction ghi header + lines + idempotency response + outbox → commit → trả ID. Email/ZBS thất bại không rollback đơn đã tồn tại. Cùng key/cùng payload trả lại kết quả cũ; cùng key/khác payload trả 409. Chốt thời gian giữ key đề xuất 30 ngày; không reuse sau timeout.
D1 dùng batch transactional phù hợp API đã chọn [C14]; không giả định có transaction dài qua nhiều await. Sinh ID trước, insert có constraint, kiểm tra affected rows/version trong cùng cơ chế atomic; test hai request cạnh tranh. Nếu logic bắt buộc read-modify-write phức tạp, dùng conditional SQL/state version hoặc thiết kế lại, không giữ lock tưởng tượng ở Worker. Trong B dùng PostgreSQL transaction ngắn.
Outbox poller chọn pending/due, claim bằng lease/version rồi enqueue event ID. Nếu chết sau enqueue nhưng trước marked sent, có thể gửi queue lần nữa; consumer dedupe theo delivery key. Queue chứa reference và loại event, không raw phone/nhận xét. Gửi thành công rồi crash trước lưu provider result vẫn có nguy cơ duplicate external delivery: dùng provider idempotency/query status nếu có; nếu không, chuyển ambiguous/manual review, không hứa exactly-once. [C06]
Retry đề xuất exponential backoff + jitter cho timeout/429/5xx; respect Retry-After, tối đa 5 lần/24 giờ trước DLQ; lỗi quyền/template/recipient invalid dừng ngay và báo owner. Scheduled notification giữ due_at trong DB, Cron enqueue khi đến hạn; không dựa vào delay queue dài tùy ý. Recheck cancelled/revoked/source freshness trước gửi. Quiet hours đề xuất 20:00-07:00, trừ tin khẩn được SSA duyệt. Lưu provider message ID, attempt, trạng thái accepted/delivered/failed tách read trong app.
11. Phiếu Coach, khảo sát và AI
Người thật duyệt, hệ thống giữ revision
- Coach tạo draft; người duyệt quyết định published và PDF đúng revision.
- AI tùy chọn, không sửa điểm và không tự xuất bản.
- Khảo sát khóa version; care task theo threshold được SSA duyệt.
Phụ trách: Coach + reviewer + chăm sóc
Bằng chứng cần có: T07/T08: draft ẩn, PDF khác trẻ, survey gửi lại, AI đổi nghĩa.

Phiếu Coach và PDFAi duyệt nội dung trước khi phụ huynh đọc? Mở sơ đồ tương tác

Khảo sát và chăm sócPhản hồi nào trở thành việc chăm sóc? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 11
Coach file → validate 6 skill IDs và 1-5 → draft có original text → rewrite tùy chọn → người duyệt so sánh → published revision → PDF và notification. Không sửa điểm bằng AI. Mỗi lần rewrite lưu prompt/model/version, input hash, output và reviewer; input chứa nội dung đã giảm định danh, không gửi tên/phone/campus nếu không cần. Văn bản tự do vẫn có thể nhận dạng trẻ; pseudonym không đồng nghĩa anonymized.
Mặc định khi chưa có cơ sở chuyển dữ liệu/consent: tắt outbound AI, người thật duyệt thủ công. Timeout AI không chặn import điểm; output lỗi giữ draft. Prompt injection trong file là dữ liệu, không được cấp tool/network quyền từ nội dung Coach. Kiểm tra hallucination, đổi nghĩa, đánh giá tiêu cực/quá mức, lộ dữ liệu giữa học viên bằng fixture. Mục tiêu đề xuất 0 thay đổi điểm và không thêm sự kiện không có trong input; người duyệt chịu trách nhiệm cuối.
Khảo sát: khóa question version lúc nộp; 8 điểm bắt buộc trong 1-5, 2 câu mở theo mức bắt buộc SSA chốt, giới hạn độ dài và sanitize rendering. Điểm thấp đề xuất bất kỳ câu ≤2 → care task; threshold phải owner duyệt. Email chỉ chứa task ID/link admin, không copy câu trả lời nhạy cảm. Tổng hợp theo campus enrollment tại thời điểm submission; suppress nhóm quá nhỏ theo policy được duyệt để tránh nhận dạng. Không show câu trả lời của bố cho mẹ mặc định. Thay đổi câu trả lời sau nộp nếu cho phép phải revision và audit, không nhân đôi care event.
12. OA, Social và ZBS
Tách danh tính và kênh gửi
- UID Mini App, OA và Social không dùng thay nhau.
- Thông báo trong app là cơ sở; ZBS chỉ bật khi quyền/template được duyệt.
- Token OA server-side; webhook xác minh, persist rồi ACK.
Phụ trách: SSA OA + backend
Bằng chứng cần có: Quyền, template, quota và test forged/replayed webhook.

Outbox và gửi tinGửi thất bại hoặc mơ hồ được xử lý thế nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 12
Mini App SDK identity phục vụ login; OA là kênh liên hệ và nhắn tin; Social OAuth dành use case ngoài Mini App, không cần triển khai một login Social riêng. App ID, OA ID, ZBS account ID và UID theo app/OA không được trộn. Ghi rõ loại ID trong schema, config và test. [Z12-Z14]
Kênh trong app luôn là chức năng cơ sở. ZBS cho vắng học, nhắc gia hạn và phiếu mới chỉ kích hoạt sau khi template và use case được duyệt, quyền OA cấp, số dư/quota kiểm tra, consent/audience phù hợp. Không dùng OA messaging như push miễn phí cho mọi user. Follow OA là lựa chọn có ngữ cảnh, không ép follow để xem hồ sơ.
Token OA lưu encrypted server-side, refresh có single flight/lease, version CAS để token cũ không ghi đè token mới. Không ghi token vào logs; revoke/re-auth có runbook. Webhook phải kiểm tra theo đúng signature contract của API đã chọn (chưa có payload tài khoản để kiểm chứng); reject replay/forged requests, persist trước ACK rồi xử lý bất đồng bộ. Theo dõi hết quota/số dư, template rejected, refresh failure và delivery ambiguous.
Không gửi thông báo vắng theo event chưa đối soát. Không đưa điểm chi tiết/tên đầy đủ của trẻ lên preview màn hình khóa; tin tối thiểu + deeplink resource. Deeplink luôn xác thực lại; không chứa phone/access token.
13. Riêng tư, bảo mật và nơi xử lý
Kiểm soát từ thu hồi đến bản sao
- Mục đích, consent, bên xử lý và retention cần SSA phê duyệt.
- Thu hồi quyền có hiệu lực; xóa tách scope và nghĩa vụ phải giữ.
- Restore áp deletion ledger; decommission có quy trình riêng.
Phụ trách: SSA dữ liệu + kỹ thuật
Bằng chứng cần có: G0/G4 và negative tests; không coi mã hóa là bằng chứng residency.

Thu hồi và xóa dữ liệuYêu cầu dữ liệu đi qua những nơi nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 13
Điều khoản nền tảng là một đầu vào thiết kế, không thay đánh giá pháp lý đầy đủ. Cần người phụ trách pháp lý/dữ liệu SSA phê duyệt mục đích, consent trẻ/người giám hộ, retention, bên xử lý và cách thực hiện quyền dữ liệu trước live. Không suy rằng một checkbox chung hoặc mã hóa là đủ để đáp ứng địa điểm. [Z10]
13.1 Danh mục dữ liệu và lưu giữ đề xuất
| Dữ liệu | Nơi ở A (chỉ sau G0) / B | Retention đề xuất và quyền |
|---|---|---|
| Phone, guardian relation, consent | D1 / PostgreSQL VN | Theo vòng đời quan hệ và nghĩa vụ được SSA chốt; xóa/ẩn sau thời gian cần thiết |
| Profile, attendance, reports | D1 + R2 / DB + object VN | Đề xuất 24 tháng sau kết thúc học; phải xác nhận nhu cầu lịch sử/pháp lý |
| Raw Excel | R2 private / object VN | 90 ngày, sau đó normalized provenance đủ truy vết; giữ case tranh chấp có lý do |
| Orders/consultations | DB | Retention nghiệp vụ/kế toán theo loại dữ liệu; không tự áp 24 tháng cho chứng từ |
| Survey tự do | DB | Đề xuất 12 tháng; aggregate giảm định danh lâu hơn khi được chấp thuận |
| Operational logs | Workers logs hoặc sink / VN logs | 30 ngày, không payload/token/phone; IP metadata cũng cần đánh giá |
| Audit | DB + export hạn chế / VN archive | 12 tháng đề xuất; append-only app, người có quyền hạ tầng vẫn là rủi ro cần backup tách quyền |
| Backups | Bản sao độc lập đủ điều kiện / VN backup | Daily 35 ngày, monthly theo policy; expiry và deletion ledger áp dụng sau restore |
Những con số này là đầu vào thương lượng, không được ghi thành “pháp luật bắt buộc”. Yêu cầu xóa phải phân biệt dữ liệu cần giữ theo nghĩa vụ với dữ liệu có thể xóa; theo dõi consent withdrawal và tombstone để restore không hồi sinh quyền/dữ liệu đã xóa. Không xóa backup bất chấp tính toàn vẹn: hạn chế truy cập, expiry theo policy, tái áp deletion ledger khi restore.
13.2 Rút quyền, xóa dữ liệu và ngừng dịch vụ
Mini App cần màn hình Quyền dữ liệu: xem mục đích/consent đã cấp, yêu cầu xuất/chỉnh sửa, rút consent và chủ động khởi tạo xóa dữ liệu. Đề xuất POST /v1/privacy/requests (type, scope, consent version, idempotency key) và GET /v1/privacy/requests/:id chỉ cho chủ thể. Server xác minh phiên, thu hồi quyền bị tác động ngay, tạo task có hạn xử lý và audit; không yêu cầu nhập lại toàn bộ PII qua email. Xóa tài khoản phụ huynh không tự xóa hồ sơ học viên thuộc quyền người giám hộ khác hoặc hồ sơ SSA có cơ sở giữ độc lập; phải tách scope và giải thích rõ.
Điều khoản Zalo còn có yêu cầu xử lý khi ngừng Mini App, gồm hoàn trả/xóa dữ liệu trong 24 giờ trừ trường hợp có cơ sở ngoại lệ được nêu trong điều khoản. Vì vậy retention 35 ngày của backup ở bảng trên không mặc nhiên được áp dụng cho decommission hoặc yêu cầu xóa đặc biệt. Trước live phải chốt với SSA/Zalo quy trình hoàn trả, phạm vi xóa, ngoại lệ hợp lệ, và khả năng xóa trong DB, file, logs, queue, replicas, exports, bên thứ ba và bản sao provider. D1 Time Travel/immutable backup có thể không hỗ trợ xóa chọn lọc từng chủ thể: ghi thành gap cần đánh giá, không tuyên bố tombstone đã đáp ứng xóa không khôi phục. Gate G0/G4 bao gồm cả vấn đề này. [Z10, mục con 6.16.5]
Runbook decommission: freeze login/writes/sends → xác định nghĩa vụ và người nhận hợp lệ → export mã hóa tại nơi được duyệt → xác nhận bàn giao → revoke access/token/connector → xóa theo phạm vi/timeline hợp lệ kể cả các bản sao → thu chứng nhận/biên bản nhà cung cấp → kiểm tra không còn truy cập. Chỉ giữ evidence tối thiểu có căn cứ, không giữ lại nội dung đã cam kết xóa. Đây là quy trình phải diễn tập trên dữ liệu tổng hợp trước khi nhận dữ liệu thật.
13.3 Threat model và kiểm soát
| Nguy cơ | Điểm thực thi | Bằng chứng cần có trước live |
|---|---|---|
| IDOR xem con khác/PDF/đơn | Resource-scoped backend authorization | Negative tests toàn bộ object endpoints |
| Phone nhầm/tái cấp | Verified links, re-verification, revoke | Test đổi phone không tự đổi guardian |
| Token bị lấy cắp/replay | TLS, hash refresh, rotation, short TTL | Replay token cũ fail; revoke có hiệu lực |
| SQLi/XSS/formula injection | Prepared statements, schema validation, escaped rendering/CSV | Malicious fixture và code review |
| Abuse/quota exhaustion | Rate limits, body limits, import quotas, CPU caps | Burst/load test; UX 429 có retry |
| File bomb/path traversal | Archive validation, opaque paths, allowlist MIME | Rejected fixture, private bucket check |
| Leaked secrets | Secret bindings, least privilege, secret scanning | Build bundle scan; rotation drill |
| Supply-chain | Lockfile, dependency review, pinned toolchain | SBOM/dependency report và xử lý critical findings |
| Wrong bulk import | Staging, diff approval, atomic publish | Fault injection giữa chunks/publish |
| Account compromise/ransomware | MFA, scoped roles, backup tách quyền | Restore khi tài khoản chính không dùng được |
| Data exfil qua AI/email/log | Data minimization, gate bên thứ ba | Payload/log sampling không PII ngoài phạm vi |
Public static cache chỉ cho assets/catalog đã được chấp thuận. Parent API và file trả Cache-Control: private, no-store; không cache CDN theo URL chứa child ID. Backup keys khác credential app; app chỉ đọc object được phép; CI token không có quyền xóa backup. Chỉ dùng WAF/challenge phù hợp Zalo WebView; không đặt captcha khiến SDK flow không thể dùng.
14. Quan sát, cảnh báo và hỗ trợ
Tìm được nguồn của mỗi số liệu
- Nối request, DAG run, batch, dòng nguồn, generation và event.
- Cảnh báo dữ liệu trễ/sai tách khỏi availability HTTP.
- Mỗi cảnh báo có owner và cách xử lý; không log hồ sơ trẻ.
Phụ trách: SSA support + kỹ thuật
Bằng chứng cần có: Trace source-to-screen, alert routing và log sampling.

Audit và truy vếtTừ số sai trên màn hình tìm lại nguồn thế nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 14
Mỗi request có request_id; mỗi import có batch_id, hash, mapping_version, source_as_of, counts, generation; mutation có actor/resource/action và event_id. UI hiển thị mã hỗ trợ không chứa PII. Khi phụ huynh báo “8 buổi thành 2”, support truy từ student → active snapshot → source row → batch → audit diff, không dò raw logs chứa toàn bộ hồ sơ.
| Chỉ số / trigger đề xuất | Ngưỡng khởi điểm | Owner và hành động |
|---|---|---|
| API availability | Mục tiêu 99.5% tháng, phải thương lượng | Đối tác kiểm tra lỗi/origin/dependency |
| API p95 | <800 ms cho read backend, không gồm Zalo API | Query/index, đo từ mạng VN |
| Login end-to-end | p95 <5 giây khi provider bình thường | Tách latency SDK/provider/backend |
| Data freshness | Quá lịch xuất +2 giờ cảnh báo; >24 giờ banner | SSA kiểm tra file; hoãn tin tự động liên quan |
| Import counts/diff | 0 hard errors trước publish; delta bất thường giữ review | Vận hành xác nhận |
| Queue age | >15 phút khi không chủ động schedule | Đối tác replay sau sửa; xem DLQ |
| Auth/provider error | Tăng gấp 3 baseline trong 15 phút | Kiểm tra quyền/token, không bypass auth |
| Backup/restore | Backup daily thành công; restore drill hàng quý | Đối tác + SSA chứng kiến |
| Link/revoke | Truy cập sau revoke = sự cố ưu tiên cao | Ngừng endpoint/thu hồi phiên, điều tra phạm vi |
Ngưỡng chưa phải kết quả đo. Email cảnh báo phải có kênh dự phòng nếu email provider hỏng; cần dashboard có import cuối, outbox tồn, DLQ, backup status. Trace không thay đối soát nghiệp vụ. Tách báo động sai dữ liệu khỏi availability: HTTP 200 với số buổi sai vẫn là lỗi quan trọng.
Incident đề xuất: P1 lộ dữ liệu/mất toàn hệ thống → trực nhận 30 phút trong khung đã ký, cô lập, giữ bằng chứng, thông báo SSA; P2 chức năng chính lỗi → 4 giờ làm việc; P3 vấn đề nhỏ → ngày làm việc tiếp theo. Đây là mức để định giá, không hứa 24/7 khi chưa có người trực/hợp đồng.
14.1 Kế hoạch audit triển khai và bằng chứng bàn giao
| Đợt kiểm tra | Phạm vi / người thực hiện | Evidence phải lưu | Exit gate |
|---|---|---|---|
| P0 audit nguồn và data contract | Lead + SSA Ops: file, mapping, authority, connector Airflow, tài khoản | Manifest/hash, schema samples ẩn danh, inventory quyền, gap register | G2/G3 có owner; không vận hành lại GAS |
| Review thiết kế và threat model | Người review độc lập + phụ trách dữ liệu | ADR, data-flow matrix, processor inventory, origin trust boundary | G0/G1/G4 có quyết định trước dữ liệu thật |
| Audit mỗi batch import | Airflow + backend evidence; người duyệt SSA xử lý bất thường | DAG/run → batch → row/hash → diff → approval → generation | Count cân, hard error bằng 0, CAS đúng, không partial data |
| Review thay đổi code/infra | Kỹ sư thứ hai, CI; không tự duyệt thay đổi auth/import | PR, secret/dependency scans, migration contract, artifact SHA | T01-T09/T13, không bypass VPS/origin |
| Security/UAT trước live | QA + SSA + ops trên dữ liệu được phép | IDOR/revoke/PDF tests, T15 proxy, T16 DAG, thiết bị thường | Không còn lỗi critical/important chưa xử lý trong phạm vi gate |
| Restore và cutover rehearsal | Ops + SSA chứng kiến | Backup manifest, restore biệt lập, replay revoke/deletion, reconciliation, đo RPO/RTO | T09/T12 pass, owner ký, rollback khả thi |
| Kiểm tra sau live | Theo lịch vận hành được chốt | Access review, logs sampling, source freshness, failed DAG/DLQ, chi phí, incident review | Có owner và thời hạn khắc phục; diễn tập restore quý theo đề xuất |
Audit trail nghiệp vụ khác operational logs: audit lưu tối thiểu actor, action, resource, thời gian, request/batch/event/run ID, lý do, version trước/sau hoặc diff đã giảm định danh và approval reference. Role ứng dụng không có quyền sửa/xóa audit; export tách quyền để giảm rủi ro tài khoản hạ tầng. Người được xem audit không mặc nhiên có quyền xem nội dung trẻ. Báo cáo audit phải phân biệt “đã thiết kế”, “đã chạy test” và “đã ký nghiệm thu”; tài liệu này chỉ chứng minh phần thiết kế.
15. Sao lưu, rollback và chuyển đổi
Phục hồi đúng phạm vi sự cố
- Import sai quay generation; app lỗi quay artifact tương thích.
- DB hỏng restore biệt lập, đối soát và áp lại revoke/deletion.
- Không blind PITR làm mất đơn mới; cần SSA ký kết quả.
Phụ trách: Ops + SSA chứng kiến
Bằng chứng cần có: T09/T12 và RPO/RTO đo; các mục tiêu hiện chỉ là đề xuất.

Phục hồi và đối soátKhôi phục mà không mất giao dịch mới thế nào? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 15
15.1 Di chuyển nguồn cũ sang Airflow + Cloudflare
- Inventory từng tab L01, Drive objects, ownership, public sharing và lịch trigger. Export snapshot bất biến có hash và schema version; dữ liệu thật chỉ qua kênh/nơi đã được duyệt.
- Dry-run mapping với dữ liệu ẩn danh; giữ external IDs. Chuyển HocVien/LienHePH riêng, không mất liên hệ khi file học viên không phone. Dedup student/attendance/order với ledger các dòng hợp nhất.
- Nhập nguồn thật vào môi trường đủ điều kiện; so row counts, sums và mẫu từng sân, từng case nhiều con/học bù/gia hạn. SSA ký reconciliation report.
- Shadow read trên cohort cho phép; không dual-write tự do giữa hai nguồn. Nguồn cũ chỉ tiếp tục ghi nếu đã được xác minh đang chạy; không giả định proposal là hệ thống live. Airflow chạy dry-run trước cutover, chưa publish tự động.
- Chốt cửa sổ freeze writes ngắn; nếu có GAS/trigger/email cũ thực sự chạy thì tắt và thu hồi quyền. Chụp export cuối, chạy DAG Airflow với import delta, chuyển writer mới. Giữ archive cũ read-only có hạn, đóng endpoint thử nghiệm và thu hồi keys không cần.
- Verify canary, mutation/idempotency, report scope, source dates; mở cohort dần 10→50→toàn bộ theo danh sách đã cho phép và cơ chế phân phối Zalo thực có. Con số là kế hoạch pilot, không cam kết nền tảng có rollout %.
- Hypercare 2 tuần đề xuất; giải quyết sai lệch rồi hủy connector và quyền nguồn cũ theo retention, không để hai hệ thống gửi tin.
15.2 Rollback phân loại
| Sự cố | Cách xử lý | Bảo vệ dữ liệu mới |
|---|---|---|
| UI lỗi | Dùng phiên bản đã duyệt trước nếu console cho phép; feature flag server tắt chức năng | API duy trì backward compatibility |
| Worker regression | Redeploy artifact trước, config/version đã lưu | Schema expand-contract còn tương thích |
| MISA import sai | Chuyển active generation trước, ghi audit/correction | Không rollback orders/consent/surveys |
| Migration sai | Freeze writes, backup bookmark, forward fix ưu tiên | Tránh blind PITR làm mất đơn mới |
| DB corruption/xóa lớn | Restore trong môi trường cách ly, đối soát, replay events hợp lệ | Replay deletion/revocation ledger, reconcile provider side effects |
A có D1 Time Travel theo gói; cần export độc lập định kỳ vì cùng account không chống mọi compromise. RPO đề xuất ≤24 giờ với export độc lập, mục tiêu cải thiện ≤1 giờ khi đã có cơ chế/đo thử; RTO đề xuất ≤4 giờ. Không ghi “RPO 0” nhờ có PITR. Backup của files và DB cần cùng manifest; test PDF references sau restore. Với B chốt PostgreSQL WAL/PITR và backup object tại VN theo nhà cung cấp, không giả định sẵn có.
16. Kế hoạch kiểm thử và bằng chứng go-live
Nghiệm thu bằng tình huống lỗi thật
- Kiểm identity, phân quyền, import, giao dịch, thiết bị và phục hồi.
- Test proxy/DAG riêng; mock SDK không thay điện thoại thật.
- Tải và mục tiêu latency phải đo; số học viên không phải concurrency.
Phụ trách: QA + SSA + lead
Bằng chứng cần có: T01–T16 baseline; T17–T21 bổ sung Notification, Checkout, order/stock, refund và reconciliation.

CI và phát hành ZaloBằng chứng nào cho phép phát hành? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 16
| Gate | Test cụ thể | Tiêu chí pass |
|---|---|---|
| T01 Identity | Token sai/app khác/hết hạn, phone từ chối, user thường | Không cấp session sai; hướng dẫn đúng |
| T02 Authorization | Đổi child/report/order/notification IDs, signed file, role admin | 0 tài nguyên ngoài scope trả về |
| T03 Revocation | Gỡ link trong phiên đang mở, đổi phone, rút consent | Request kế tiếp bị chặn theo policy; cache bị xóa |
| T04 Import | Duplicate, missing phone, wrong dates, chunk crash, two imports, stale publish | Không partial visibility, không mất nguồn đúng, audit đủ |
| T05 Commerce | Double click, concurrent key, commit rồi timeout, variant inactive/price changed | Một order/lead đúng; status có thể tra lại |
| T06 Messaging | Queue duplicate, email timeout sau accepted, webhook fake/replay, quota hết | Không hứa success sai; ambiguous có xử lý; DLQ có owner |
| T07 Surveys | 0/6/NaN, text XSS, round closed, version mismatch, retry | Server validate; một submission; care task không trùng |
| T08 Reports | Draft visibility, cross-child PDF, rubric version, AI thay nghĩa | Draft không lộ; người thật duyệt; artifact đúng revision |
| T09 Migration | Snapshot counts/checksums, sample từng sân, restore | Không mất/trùng record không giải thích; links được xác minh |
| T10 Devices | Zalo iOS/Android, bàn phím, back, font lớn, mạng chậm, app resume | Không crash/che nút; SDK permission chạy thật |
| T11 Load | 50 concurrent/10 phút, burst 100; import cùng lúc; ghi đo được | SLO đề xuất đạt, không lost write/quota overload; điều chỉnh sau benchmark |
| T12 Recovery | Xóa nhầm/import sai/credential compromise giả lập | Restore và reconcile đo RPO/RTO, owner ký |
| T13 Release | No demo endpoints/fixtures/secret, đúng app/domain/env | Bundle production không có bypass và đúng version |
| T15 VPS/origin | Bypass origin, replay chữ ký, giả forwarding header, proxy down, TLS expiry | Fail-closed, không mất POST, alert/failover có evidence |
| T16 Airflow | DAG retry, source trùng, sensor timeout, concurrent scope, backfill, scheduler restore | Không trùng/mất dữ liệu, không bypass approval, log/XCom không PII |
| T14 Policy | G0 residency, G1 shop, consent, review account/dataset | Hồ sơ quyết định đầy đủ trước dữ liệu thật/live |
Phân lớp: domain tests cho rule và state transitions; integration thật với D1 hoặc PostgreSQL, private file auth và queue emulator; staging E2E; device test thật; fault injection; load và restore. Mock SDK không thay thiết bị thật. 650 học viên không đồng nghĩa 650 phụ huynh, không đồng nghĩa concurrency; đo DAU/phiên và kích thước Excel rồi chỉnh test profile.
16.1 Nghiệm thu phạm vi thương mại mới
| Gate bổ sung | Điều kiện mở production |
|---|---|
| T17 Notification | Đúng recipient, kiểm quyền deep link, retry và inbox/read độc lập delivery |
| T18 Checkout | Chặn client giả thành công/webhook giả; duplicate, sai tiền, sai merchant và pending được xử lý |
| T19 Đơn và tồn | Không vượt tồn, giá đổi được xác nhận, ownership và tiền đến muộn có case |
| T20 Hoàn tiền | Người lập khác người duyệt, không hoàn trùng/vượt tiền đã thu, unknown được tra cứu |
| T21 Đối soát | Trace đơn tới tiền thực nhận; phí/hoàn/chuyển kỳ giải thích được, file nhập lại không nhân đôi |
T17–T21 bắt buộc khi phát hành module mới cùng T01–T16. Chi tiết fixture/evidence ở FEATURES §7.6; QA, SSA nghiệp vụ và tài chính ký, không dùng mock SDK thay kết quả sandbox/thiết bị thật.
17. Deployment và hồ sơ Zalo
Deploy backend khác phát hành Zalo
- Môi trường tách DB, bucket, queue và secret; API giữ tương thích.
- Testing, xét duyệt và Publish là các bước riêng.
- Bàn giao source, ownership, artifact, runbook và evidence.
Phụ trách: Release owner + SSA
Bằng chứng cần có: T13/G6: đúng app, user thường, không demo bypass.

CI và phát hành ZaloBằng chứng nào cho phép phát hành? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 17
17.1 Môi trường và CI
Dev dùng fixture, local Worker/DB; staging tài khoản/quyền riêng và dữ liệu tổng hợp; production chỉ sau G0. Tách DB/bucket/queue/secret/bindings theo môi trường, không suy chỉ env là đã cách ly. Nếu chỉ có một Mini App ID, lập rõ Testing và live cùng ID, đảm bảo từng build trỏ backend đúng; không dùng quyền admin như bằng chứng user thường.
PR: lint/typecheck/domain+integration tests, schema drift, dependency/secret scan, build frontend/API, contract compatibility. Artifact lưu git SHA, lockfile hash, build time, SDK/tool versions, migration ID, target App ID, backend version. Preview không có credentials production. Review changes đặc biệt auth/import/payment bởi người thứ hai.
Promote backend: backup/bookmark → expand migration → deploy tương thích → smoke test → enable cohort. Sau khi phiên bản frontend mới đủ phổ biến mới contract/drop fields. Rollback artifact kèm config, không chỉ source code. Khi chưa có source package, lệnh npm ci, build và Wrangler phải được khóa trong runbook dự án thực nhận; không trình bày lệnh chưa chạy là đã kiểm chứng.
17.2 Checklist phát hành thực hiện khi build sẵn sàng
- Đối chiếu tài khoản đã có: App ID, owner verified, OA association, vai trò Admin/Developer; giữ bằng chứng console, không tạo app khác tùy ý.
- Kiểm tra domain API/file, HTTPS certificate, CORS/preflight, redirect, allowlist theo console hiện hành. A dùng domain SSA; B dùng origin VN. Không giữ whitelist
script.google.comchỉ vì proposal cũ nói vậy. - Cấu hình public App/OA IDs và API base URL; secret chỉ server. Chọn version SDK/ZaUI/plugin tương thích sau spike; kiểm tra bundle size/constraints theo tooling hiện hành.
- Cài Extension chính thức, đăng nhập bằng QR với tài khoản có quyền, liên kết đúng App ID; deploy Development kiểm tra nhanh, sau đó Testing có mô tả version. Lưu QR/deeplink và artifact SHA. [Z03, Z04]
- Nộp
getPhoneNumbervới video/screenshot use case thật; khai mục đích và privacy URL; quyền người dùng và quyền App đều phải đạt. Test thêm phụ huynh không thuộc Admin/Developer sau khi nền tảng cho phép. [Z06, Z09] - Hồ sơ review: tên/logo sở hữu SSA, mô tả đúng chức năng, category, privacy/terms, contact support, demo workflow an toàn, dữ liệu tổng hợp cho reviewer, evidence consent/residency, lựa chọn store G1. Không mở
xemNhuhoặc mật khẩu dùng chung trên production để reviewer vào. - Gửi Testing xét duyệt; theo dõi lý do reject, sửa và nộp lại. Chính sách nêu vòng kiểm duyệt trong 3 ngày làm việc, không phải SLA hoàn thành toàn dự án. [Z05, Z11 §9.1]
- Sau approved, SSA/owner phát hành Publish, gắn menu OA/QR/deeplink, kiểm tra từ thiết bị/tài khoản thường. Backend deployment thành công không chứng minh Mini App đã live.
- Kiểm tra privacy/support links, source freshness, order/lead vào admin, receipt, disable thử nghiệm, rollback candidate; lưu release record và bàn giao.
17.3 Bộ hồ sơ bàn giao
Source/lockfile/license, architecture/ADR/contracts/schema, mapping importer, fixture ẩn danh, test evidence, infra config không secret, account ownership matrix, secret rotation process, release artifact/QR/version, migration reconciliation, backup/restore report, monitoring/dashboard/alert routes, runbooks, training SSA, scope hỗ trợ và chi phí.
18. Lộ trình, nguồn lực và chi phí
Tính đủ công triển khai và vận hành
- Baseline cũ chưa tính đủ Airflow/VPS, cần re-estimate tại P0.
- Chi phí gồm compute, dữ liệu, gửi tin, hỗ trợ và diễn tập restore.
- Mỗi hạng mục có owner; chưa có tổng giá hoặc ngày live cam kết.
Phụ trách: Director + lead
Bằng chứng cần có: SOW, báo giá mới, giờ trực và chi phí provider.

Lộ trình và exit gatesĐược chuyển bước khi có kết quả gì? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 18
Lưu ý dự toán: các con số dưới đây là baseline trước khi bổ sung Airflow/VPS, chưa phải ước tính hiện hành để ký hợp đồng. P0 phải tính lại effort, lịch và chi phí cho stack đã chọn.
18.1 Work breakdown đề xuất
| Giai đoạn | Thời lượng lịch ước tính | Deliverable / exit gate | Owner |
|---|---|---|---|
| P0 Discovery & quyết định | 3-5 ngày làm việc | Source audit, schema samples, G0/G1, topology VPS/origin, source connector Airflow, backlog/re-estimate; chạy spike SDK | Lead + SSA + phụ trách dữ liệu |
| P1 Nền tảng và identity | 1-2 tuần | Environments, auth/links/roles, contracts, secret/audit foundation; T01-T03 | Backend + frontend |
| P2 Import và dữ liệu | 1-2 tuần | Mapping, stage/publish/reconcile, migration rehearsal; T04/T09 | Backend + SSA Ops |
| P3 UI và nghiệp vụ | 2 tuần, có thể song song P2 sau contract | 4 tabs, surveys, admin, reports, commerce variant; T05-T08 | Frontend + backend |
| P4 Hardening/UAT | 1-2 tuần | Device/load/security/restore tests, training, policy evidence | QA + ops + SSA |
| P5 Review & cutover | 1-2 tuần dự phòng, phụ thuộc vòng duyệt | Testing approved, publish, migration sign-off, OA entry | Release owner + SSA |
| P6 Hypercare | 2 tuần sau live | Incident review, tuning, bàn giao vận hành | Đối tác + SSA |
Ước tính tổng 6-10 tuần trước live nếu 1 frontend + 1 backend/lead + QA bán thời gian, source usable và G0/G1 được giải quyết sớm; các giai đoạn có overlap, không cộng máy móc tất cả dòng. Đây không phải báo giá hoặc cam kết deadline. Scope Checkout/Notification/đối soát mới chưa nằm trong ước tính baseline; thiếu source, chọn hạ tầng B hoặc chờ thỏa thuận Cloudflare/Zalo sẽ thay critical path. Không tính thời gian chờ pháp lý/provider là effort lập trình nhưng vẫn tác động ngày live.
Ước lượng effort để lập ngân sách: discovery 4-6, nền tảng/auth 8-12, importer/migration 10-15, frontend/admin 12-18, nghiệp vụ/outbox 8-12, QA/security/restore 8-12, release/training 3-5 person-days; tổng baseline 53-80 person-days chưa gồm Checkout, Notification/ZBS mở rộng và đối soát tài chính mới, tránh cộng phần overlap vai trò hai lần khi chốt SOW. Báo giá = effort chốt × đơn giá từng vai trò + dự phòng 15-20% được thống nhất; chưa có đơn giá nên không bịa số tiền triển khai.
18.2 Chi phí sử dụng
| Hạng mục | Công thức / tham chiếu | Lưu ý |
|---|---|---|
| Workers A | Base Paid 5 USD/tháng + request/CPU vượt included | Không bao gồm Enterprise residency, support hoặc toàn bộ hệ thống [C09] |
| D1 A | Rows read/write vượt included + GB vượt included | Index giảm scan; audit/import cũng tính usage [C10] |
| R2 A | Standard 0.015 USD/GB-tháng trước free allowance + operations | Backup, PDF và raw retention làm tăng dung lượng [C11] |
| Queues A | Tổng write/read/delete/retry operations theo bảng giá | Không lấy số events bằng số billable operations [C12] |
| VPS + Airflow trong A | VPS ingress + scheduler/executor + metadata DB/backup + patching/monitoring | Tính riêng khỏi phí Cloudflare; sizing, standby, license/support theo nhà cung cấp, chưa có báo giá |
| B | Compute + PostgreSQL/PITR + object/backup + monitoring + patching | Lấy báo giá VN có cam kết residency; chưa có provider/account |
| ZBS | Số tin thành công × đơn giá template + CTA/thành phần/thuế nếu áp dụng | Base nhóm còn lại 200 VND; 1.300 tin × 200 = 260.000 VND chỉ là ví dụ, không báo giá [Z15] |
| Gateway / hoàn / settlement | Phí cố định, tỷ lệ theo giao dịch, phí hoàn và đối soát theo hợp đồng provider/merchant | Chưa chọn provider; lấy báo giá, thuế và chu kỳ tiền về; không mặc định hoàn phí khi hoàn đơn |
| OA, email, AI, domain | Theo gói/quota/thực dùng | AI tắt vẫn vận hành được; OA và ZBS là dòng riêng |
| Vận hành | Giờ hỗ trợ + trực + patch + backup drill + thay đổi | Không gộp vào “hosting 5 USD” |
Mô hình tải minh họa để điền calculator: 650 tài khoản giả định × 30 ngày × 2 phiên/ngày × 12 API = 468.000 API/tháng; 650 × 12 buổi = 7.800 attendance rows/tháng. Đây là giả định sizing, không phải số đo SSA và không dùng làm proof capacity. Nếu PDF 650 × 12 × 0.5 MB ≈3.9 GB/năm, thêm revision/raw/backup; phải đo file thật. Cảnh báo ngân sách ở 50/80/100% ngân sách tháng; giới hạn CPU, import và sending để tránh chi phí bất thường.
18.3 Trách nhiệm và vận hành
SSA chịu trách nhiệm xuất MISA đúng lịch, xác minh quan hệ phụ huynh, duyệt điểm/nhận xét/tin, consent/chính sách, sở hữu tài khoản và ngân sách, xử lý Sale/care. Đối tác chịu triển khai kỹ thuật, review/QA, bảo mật app, monitoring, backup/restore, cập nhật và hỗ trợ theo hợp đồng. Provider cung cấp dịch vụ theo điều khoản riêng; không chuyển trách nhiệm dữ liệu của SSA cho provider chỉ vì “serverless”.
Mỗi gate phải có một người accountable có tên trong kickoff; không để “team” chung chung. Bàn giao quyền owner cho SSA và least privilege cho đối tác, tránh tài khoản cá nhân duy nhất giữ quyền deploy/backup.
19. Decision register và rủi ro còn mở
Quyết định có owner và bằng chứng
- G0 tới G7 quản lý nơi dữ liệu, scope, nguồn, rule và vận hành.
- Duyệt hướng công nghệ chưa đồng nghĩa duyệt production.
- Engineer hay Vibecode cùng chịu chuẩn bàn giao và nghiệm thu.
Phụ trách: Director + owner từng gate
Bằng chứng cần có: Decision register với đầu ra và chữ ký, không chỉ nhãn done.

Từ đơn đến tiền thực nhậnCheckout, giao hàng và đối soát nối nhau ra sao? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 19
| Gate | Câu hỏi / quyết định | Bằng chứng cần thu | Có thể làm trước khi đóng |
|---|---|---|---|
| G0 | A được chọn (VPS VN + Cloudflare) chứng minh nơi xử lý/lưu trữ thế nào; có cần xin duyệt B không? | Data-flow inventory, cam kết từng dịch vụ, phản hồi Zalo, phê duyệt SSA | UI/contract/fixture/spike tổng hợp |
| G1 | Hướng Checkout đã yêu cầu; chốt provider/merchant, nhận hàng, hoàn và settlement | SSA nghiệp vụ + tài chính + kỹ thuật; sandbox/UAT và use case được Zalo duyệt | Giữ mock; không bật thu tiền thật trước nghiệm thu |
| G2 | Source reusable tới đâu? | ZIP, code audit, build, Airflow connector/run evidence; GAS chỉ là tài liệu nguồn cũ nếu có | Plan/contract không phụ thuộc source |
| G3 | Quy tắc buổi học/bảo lưu/chuyên cần | Fixture và expected outputs do SSA ký | Import framework/schema |
| G4 | Quan hệ phụ huynh hợp lệ và consent | Quy trình xác minh + hồ sơ có thẩm quyền | Deny-by-default model |
| G5 | Scope survey/threshold/retention | Business rule version có owner | Form/schema/versioning |
| G6 | SDK permission/review | Tài khoản thường test thật, quyền App, version approved | Mock E2E và Developer device spike |
| G7 | SLA/cost/ops | Giờ trực, RPO/RTO đo, đơn giá, provider plan | Dashboard/runbook dự thảo |
Không cần các câu trả lời này để đọc/đánh giá bản kế hoạch. Chúng là backlog quyết định ở kickoff, không bị dùng để trì hoãn nghiên cứu. Những bằng chứng còn thiếu không được gắn nhãn “đã đạt”.
19.1 Hồ sơ quyết định bổ sung theo xác nhận chủ dự án
Đã xác nhận ngày 11/11/2026: không dùng Apps Script; Airflow cho sync; VPS proxy tại Việt Nam; Cloudflare cho deployment, security và database. Chưa xác nhận: nhà cung cấp/region VPS, số lượng VPS/standby, nguồn file/connector, lịch sync, domain/origin auth, phiên bản Airflow/executor và cam kết nơi dữ liệu Cloudflare. Không coi việc chọn stack là evidence đã deploy. Ước tính effort/timeline ở §18 là baseline trước bổ sung VPS/Airflow; cần re-estimate tại P0, chưa phải ngân sách đã cập nhật.
19.2 Engineer, Vibecode và tiêu chí bàn giao
“Vibecode” trong tài liệu này là cách dùng AI để tạo/chỉnh ứng dụng nhanh theo phản hồi. Đây không phải phân loại năng lực hoặc bằng chứng chất lượng của một cá nhân/nhà thầu. Kỹ sư có thể dùng cùng công cụ AI. Cần so sánh mức hoàn thiện, trách nhiệm và evidence, không so “gõ code tay” với “dùng AI”. Bản demo hữu ích để chốt giao diện/luồng; chỉ đủ điều kiện production khi vượt cùng tiêu chí nghiệm thu.
| Khía cạnh | Demo/vibecode chưa qua nghiệm thu vận hành | Triển khai có trách nhiệm kỹ thuật | Director kiểm tra gì? |
|---|---|---|---|
| Phạm vi | Chứng minh vài luồng thuận trên dữ liệu mẫu | Backlog module, trạng thái lỗi/trống/từ chối quyền, giới hạn scope | Có danh sách chức năng và tiêu chí đạt đã ký |
| Dữ liệu | Dữ liệu mẫu hiển thị đúng không chứng minh import thật đúng | Mapping, authority, full/delta, đối soát, lịch sử và rollback theo dataset | T04/T09/T16 có kết quả từ file được phép dùng |
| Bảo mật | UI ẩn nút hoặc demo login chưa chứng minh phân quyền | Backend kiểm scope, revoke, private PDF, quản lý secret, origin trust | Thử tài khoản thường, xem con khác, gỡ quyền và bypass origin |
| Lỗi và tác vụ nền | Bấm thành công trong demo chưa chứng minh gửi lại an toàn | Idempotency, outbox, retry, DLQ/ambiguous outcome và owner xử lý | Thử timeout sau commit, file trùng, DAG lỗi giữa chừng |
| Phát hành/vận hành | Link chạy thử chưa phải Mini App đã phát hành | CI/artifact, compatibility, xét duyệt Zalo, monitoring, restore drill | Release record, measured recovery và hướng dẫn người trực |
| Bàn giao | Có thể chưa gồm source, tài khoản, bảo trì và chi phí sau demo | SSA có quyền sở hữu, lockfile/config, runbooks, SLA/support scope và ngân sách | Truy cập repo/tài khoản, bàn giao đổi người, báo giá đầy đủ |
Không có cơ sở để khẳng định cách nào nhanh/rẻ hơn theo một tỷ lệ cố định. Dự toán phụ thuộc scope, chất lượng source, số người, G0/G1, UAT và vận hành. Nếu đội Vibecode bàn giao đủ bằng chứng trên thì đánh giá theo cùng chuẩn; nếu Engineer không cung cấp được thì chưa đạt. Dùng AI không chuyển trách nhiệm bảo mật, số liệu hoặc hỗ trợ khỏi bên đã cam kết triển khai.
19.3 Giới hạn phương án Apps Script và Sheets ban đầu
Phạm vi nhận xét là proposal L01 và HTML demo L03, chưa phải audit source/runtime GAS. Việc chưa có bằng chứng một kiểm soát không đồng nghĩa đã phát hiện lỗ hổng hoặc sự cố. Apps Script có thể phù hợp automation nội bộ/prototype; SSA đã chọn không dùng trong hệ thống đích. Đánh giá dưới đây giải thích điều cần chứng minh, không quy kết bên đề xuất.
Consumer là tài khoản Google cá nhân; Workspace là tài khoản theo gói tổ chức.
Hạn mức Google đối chiếu ngày 11/11/2026, có thể thay đổi; tài khoản trial còn có điều kiện riêng. G01
| Hạn mức | Consumer / Workspace | Ý nghĩa với SSA |
|---|---|---|
| Script thông thường mỗi lượt | 6 phút / 6 phút | Import dài cần chia việc và lưu tiến độ |
| Tổng runtime trigger/ngày | 90 phút / 6 giờ | Tính cả retry và lịch chạy thực tế |
| Chạy đồng thời theo user | 30 / 30 | Phụ thuộc danh tính thực thi; không phải số phụ huynh |
| Chạy đồng thời theo script | 1.000 / 1.000 | Không suy thành năng lực API bảo đảm |
| URL Fetch/ngày | 20.000 / 100.000 | Chia sẻ nhu cầu gọi dịch vụ; cần đo |
Hạn mức không chứng minh 650 học viên vượt khả năng Apps Script. Cần tài khoản, danh tính thực thi, số request, thời gian xử lý và kích thước file thật mới đánh giá được. Vượt quota có thể dừng thực thi; không suy thành mất dữ liệu chắc chắn. Google cho phép web app chạy theo chủ triển khai hoặc người truy cập; phải xác minh cấu hình và auth ứng dụng, không coi mọi lượt gọi tự có quyền đúng trẻ. G02
Trigger chạy theo tài khoản người tạo và thời gian có thể lệch trong cửa sổ lịch; không cam kết cập nhật đúng từng phút. Import mỗi giờ vẫn chỉ cập nhật tới thời điểm file MISA được xuất: file xuất hôm qua không thành dữ liệu hôm nay nhờ chạy lại. G03
| Điểm cần audit ở proposal | Bằng chứng còn thiếu | Hướng đã chọn cho SSA |
|---|---|---|
| Sheet nhiều tab và ghi đồng thời | Dedupe, khóa/consistency, xử lý partial update, các quyền chỉnh tay | Database có constraints; staging/reconcile; publish coherent generation |
| Phân quyền người dùng | Backend xác minh danh tính và quan hệ giám hộ; revoke; PDF theo scope | Identity và resource authorization riêng, T01-T03/T08 |
| Đồng bộ/tác vụ lỗi | Run history, retry có kiểm soát, cảnh báo file trễ, resume và người xử lý | Airflow orchestration + Import Worker; không dựa chỉ vào lịch chạy |
| Audit và khôi phục | Actor/change log, source lineage, backup tách quyền, restore đã thử | Audit/outbox, export và recovery rehearsal |
| Sở hữu/vận hành | Ai sở hữu deployment/trigger, đổi người thế nào, account/quota monitoring | Tài khoản SSA, role/service identity và bàn giao có kiểm chứng |
| Địa điểm dữ liệu | Hồ sơ nơi xử lý/lưu trữ từng dịch vụ, không suy từ brand/tài khoản | G0 áp dụng cả Cloudflare/VPS; đổi stack không tự đóng gate |
Apps Script có LockService hỗ trợ phối hợp vùng mã truy cập tài nguyên dùng chung; không được viết “Apps Script không có khóa”. Khóa ứng dụng không tự tạo transaction nhiều bảng hoặc kiểm soát mọi chỉnh sửa thủ công trong Sheet. Cần test toàn bộ writer và fault cases thực tế. G04
19.4 Giới hạn của hướng mới và cách Director nghiệm thu
Airflow không tạo tích hợp MISA API; lịch, retry và lịch sử chạy chỉ hữu ích khi nguồn file/quy tắc nghiệp vụ được chốt. VPS Việt Nam là ingress proxy, không phải bằng chứng dữ liệu Cloudflare ở Việt Nam. Cloudflare có quota, single-DB execution và phí usage như §§4/18; không dùng “serverless” để hứa vô hạn hoặc không cần bảo trì. Một VPS hoặc scheduler đơn lẻ có thể gây gián đoạn, phải có owner và recovery plan. Apps Script bị loại nhưng chi phí patching, metadata DB, secrets, backup và giám sát Airflow/VPS được bổ sung; phải tính lại dự toán.
Director duyệt theo module và luồng trong PRESENTATION.md; engineering sign-off theo FR/T/decision gates. Nghiệm thu không chỉ là “màn hình chạy được”: dữ liệu đối soát, quyền người dùng thường, gửi lại an toàn, báo lỗi, phục hồi, Zalo approved+published, tài khoản/source và người vận hành đều phải được chứng minh. Chưa có kết quả test runtime nào được tạo ra chỉ bằng việc xuất tài liệu.
20. Ma trận truy vết feedback và định nghĩa hoàn thành
Theo dõi từng yêu cầu đến tiêu chí đạt
- Feedback được nối với chương, kiểm soát và bài test.
- Hoàn thành tài liệu khác hoàn thành ứng dụng.
- Khoảng trống đầu vào và quyết định còn mở tiếp tục được theo dõi.
Phụ trách: Lead + QA + SSA
Bằng chứng cần có: Ma trận truy vết và evidence triển khai khi có source.

Lộ trình và exit gatesĐược chuyển bước khi có kết quả gì? Mở sơ đồ tương tác
Đọc đặc tả, quy tắc và nguồn chương 20
| Yêu cầu từ đầu vào | Chỗ thiết kế | Bằng chứng nghiệm thu triển khai |
|---|---|---|
| DOCX: 5 màn hình/nghiệp vụ + nhiều con | §§3,5,8-12 | FR-01…FR-12 và T01…T16 |
| DOCX: MISA/Drive/Sheet, từng tab | §§5,7,15 | Mapping + counts/source hashes + owner sign-off |
| DOCX: trả lời khả năng backend/chi phí | §§1,4,18 | Benchmark, provider quote, không dùng số users thay tải |
| PDF: “8 buổi thành 2”, đối soát/tracing/audit | §§7,14 | Truy ngược source row/generation và diff thật |
| PDF: bảo mật, thu hồi, chống trùng | §§6,9,10,13 | IDOR/revoke/concurrent request tests |
| PDF: backup độc lập, phục hồi, incident | §§14-16 | Restore report và measured RPO/RTO |
| PDF: nơi xử lý Việt Nam, trẻ em, bên thứ ba | §§1,11,13,19 | G0/G4, consent và processor register |
| PDF: tài khoản đã có, vận hành/bảo trì | §§17-18 | Console evidence, ownership, signed service scope |
| HTML: nhận diện, 4 tabs, kết quả/PDF/store | §8 | Device screenshots + UX acceptance; G1 resolved |
| Chủ dự án: bỏ GAS, Airflow, VPS Việt Nam + Cloudflare | §§1,4.4,7,9,15,16,19.1 | T15/T16 và kiểm chứng origin/DAG trước live |
| Người dùng: Cloudflare, Markdown + HTML + diagrams | §§4,17 và artifacts cùng thư mục | Build/render/link checks của bộ kế hoạch |
Hoàn thành gói kế hoạch: có nguồn đầu vào và nghiên cứu hiện hành, kiến trúc Cloudflare đầy đủ cùng điều kiện, mô hình dữ liệu/flow/API/UI/security/import/migration/testing/release/ops/cost/ownership, sơ đồ đọc được, HTML đồng bộ Markdown và báo cáo kiểm tra. Không yêu cầu đã có tài khoản production để hoàn thành việc lập kế hoạch.
Hoàn thành dự án triển khai sau này: toàn bộ FR/T gates được chứng minh, G0/G1/G4 đóng, dữ liệu đối soát đúng, quyền user thường chạy thật, phiên bản Zalo approved+published, OA entry hoạt động, restore thực hiện được và người vận hành nhận bàn giao. Bộ kế hoạch này không tự chứng minh các điều kiện triển khai đó đã xảy ra.
Hồ sơ nguồn nghiên cứu SSA
Ngày đối chiếu: 11/11/2026. Nguồn web là tài liệu chính thức; các quyết định thiết kế trong PLAN.md là đề xuất, không phải chứng nhận của nhà cung cấp. File gốc không được sao chép vào repo vì có thể chứa dữ liệu cá nhân. Hash và đường dẫn lưu trong input-manifest.json.
Đầu vào của SSA
| ID | Nguồn | Bằng chứng và giới hạn |
|---|---|---|
| L01 | SSA_PhuHuynh_MoTa_ZaloMiniApp.docx, 27/10/2026 | Proposal mô tả 640-650 học viên, 8 cụm sân, pilot 7 người, 10 file Apps Script, React 18.3, SDK 2.53, Vite 5. Đây là thông tin bên đề xuất, chưa có source ZIP hoặc runtime để kiểm chứng. |
| L02 | SSA_PREVIEW.pdf, 7 trang | Feedback yêu cầu đối soát, audit, tracing, thu hồi quyền, chống trùng, backup/restore, xử lý tại Việt Nam, kiểm thử thực tế và trách nhiệm vận hành. Đã trích xuất toàn bộ 7 trang; kiểm tra hình trang 4 chứa bảng policy. |
| L03 | SSA Phụ Huynh Mobile (Copy).html | HTML bundle demo, có SDK nhưng login bị bypass. Qv trả session mau; Jv clone dữ liệu mẫu; zc không ghi gì; 4 tab home/ketqua/cuahang/thongbao. Không tìm thấy guiKhaoSat/khaoSat. CSS có khai báo 3 cột cũ nhưng được override 4 cột; render mobile xác nhận layout 4 tab. Không phải source frontend có thể bảo trì. |
| L04 | README.md của repo | Repo SSA chỉ có README tại lúc bắt đầu; ứng dụng Saigon Heat đã chuyển sang repo khác. Không sử dụng domain/deployment Saigon Heat cho SSA. |
Zalo
| ID | URL | Kết luận sử dụng |
|---|---|---|
| Z01 | https://docs.zaloplatforms.com/docs/MA/intro/getting-started | Tạo, xây dựng, xác thực Mini App; xác thực trước phát hành. |
| Z02 | https://docs.zaloplatforms.com/docs/MA/zaui | ZaUI là bộ component/design system dành cho Mini App. |
| Z03 | https://docs.zaloplatforms.com/docs/MA/devtools/ext/install | Extension VS Code hỗ trợ init/start/build/deploy. |
| Z04 | https://docs.zaloplatforms.com/docs/MA/devtools/ext/deploy | Development bị ghi đè; Testing có lịch sử phiên bản, QR/deeplink và dùng để nộp duyệt. |
| Z05 | https://docs.zaloplatforms.com/docs/MA/intro/public-mini-program | Testing → xét duyệt → được duyệt → Publish là các bước riêng. |
| Z06 | https://docs.zaloplatforms.com/docs/MA/intro/request-permission | Quyền ứng dụng và sự đồng ý người dùng là hai điều kiện riêng. |
| Z07 | https://docs.zaloplatforms.com/docs/MA/intro/best-practices/authen-user | Backend xác minh profile bằng access_token và appsecret_proof; UID có phạm vi App ID. |
| Z08 | https://docs.zaloplatforms.com/docs/MA/api/user/user-information/getPhoneNumber | SDK trả token số điện thoại; đổi ở server, không đặt secret trên client. |
| Z09 | https://docs.zaloplatforms.com/docs/MA/intro/getting-started/frequently-solved-issues | Simulator không chứng minh login thật; Developer/Admin có thể dùng quyền mà người dùng thường chưa được dùng. |
| Z10 | https://miniapp.zaloplatforms.com/documents/zalo-mini-app-developer-program-agreement/ | Điều 5.3.3.b: nơi xử lý/lưu trữ Việt Nam. Điều khoản con 6.16.3 về đồng ý dữ liệu trẻ em; hiện nằm dưới heading 6.17 do số mục trên trang chưa đồng nhất. |
| Z11 | https://miniapp.zaloplatforms.com/documents/zalo-mini-app-censorship-policy/ | Mục 6.4 cho trường hợp nội bộ/trường học có giải thích xin quyền; mục 7 dữ liệu bên thứ ba; mục 8 Checkout/no-price consultation; mục 9.1 thời gian một vòng duyệt. |
| Z12 | https://docs.zaloplatforms.com/docs/OA | OA OAuth/token và messaging độc lập với session phụ huynh. |
| Z13 | https://docs.zaloplatforms.com/docs/Social | Social OAuth là sản phẩm riêng; không dùng redirect Social login thay cho SDK login bên trong Mini App. |
| Z14 | https://docs.zaloplatforms.com/docs/ZBS/bat-dau/gioi-thieu-zbs-template-message | Cần OA, Zalo App, quyền dịch vụ, tài khoản ZBS và liên kết số dư. |
| Z15 | https://zalo.solutions/business-message/pricing | Bảng giá base 200 VND cho nhóm còn lại, một số mẫu 300 VND; thành phần/CTA và cách gửi ảnh hưởng giá. Không dùng base như báo giá trọn gói. |
| Z16 | https://docs.zaloplatforms.com/docs/MA/devtools/app-config | Cấu hình Mini App phải được kiểm tra theo project/SDK thực nhận. |
| Z17 | https://docs.zaloplatforms.com/docs/MA/intro/send-notification | Kênh thông báo Zalo phải được triển khai theo quyền và dịch vụ thực tế. |
Cloudflare
| ID | URL | Kết luận sử dụng |
|---|---|---|
| C01 | https://developers.cloudflare.com/d1/configuration/data-location/ | D1 jurisdiction công bố EU/US/FedRAMP; hint không thay cho cam kết Việt Nam. |
| C02 | https://developers.cloudflare.com/r2/reference/data-location/ | R2 location hint là best effort, không bảo đảm địa điểm. |
| C03 | https://developers.cloudflare.com/data-localization/regional-services/ | Có thể giới hạn TLS termination/Workers trong vùng được cấu hình; không tự áp dụng cho mọi storage. |
| C04 | https://developers.cloudflare.com/data-localization/region-support/ | Không thấy Vietnam trong managed region list. Custom region cần account team, chỉ áp dụng sản phẩm được nêu. Không suy ra Enterprise chắc chắn giải quyết toàn bộ. |
| C05 | https://developers.cloudflare.com/queues/configuration/data-location/ | Queues mặc định toàn cầu; jurisdiction EU/US/FedRAMP, worker producer/consumer không tự bị giới hạn theo queue. |
| C06 | https://developers.cloudflare.com/queues/reference/delivery-guarantees/ | At least once; ứng dụng phải chống trùng. |
| C07 | https://developers.cloudflare.com/d1/platform/limits/ | Paid tối đa 10 GB/database, single-threaded từng DB, Time Travel 30 ngày; Free 500 MB/database và 7 ngày. |
| C08 | https://developers.cloudflare.com/d1/reference/time-travel/ | PITR/bookmark phục hồi; không phải bản sao độc lập chống mất tài khoản. |
| C09 | https://developers.cloudflare.com/workers/platform/pricing/ | Workers Paid base 5 USD/tháng, usage theo requests/CPU. |
| C10 | https://developers.cloudflare.com/d1/platform/pricing/ | Tính theo rows đọc/ghi và dung lượng, không theo số phụ huynh. |
| C11 | https://developers.cloudflare.com/r2/pricing/ | Standard storage 0.015 USD/GB-tháng; operations tính riêng, egress Internet không tính phí theo bảng hiện hành. |
| C12 | https://developers.cloudflare.com/queues/platform/pricing/ | Phí theo operations, retry làm tăng operations. |
| C13 | https://developers.cloudflare.com/workers/configuration/placement/ | Placement tối ưu thực thi không được coi là bảo đảm residency Việt Nam. |
Nguồn kỹ thuật bổ sung
| ID | URL | Kết luận sử dụng |
|---|---|---|
| C14 | https://developers.cloudflare.com/d1/worker-api/d1-database/ | D1 batch là giao dịch; failure abort/rollback chuỗi statements. Không có transaction dài tùy ý qua nhiều request. |
Phương pháp thiết kế
| ID | Nguồn | Cách dùng |
|---|---|---|
| D01 | https://github.com/cathrynlavery/diagram-design | Sơ đồ SVG, phân rã từng luồng, accessible title/desc, không nhồi mọi thành phần vào một hình. |
| D02 | https://github.com/nutlope/hallmark | Bản HTML có token, focus, responsive, cấu trúc tài liệu phục vụ đọc/ra quyết định. Yêu cầu tài liệu đầy đủ của người dùng ưu tiên hơn giới hạn số chữ của landing page. |
Cách cập nhật
Trước implementation và trước mỗi đợt nộp duyệt: mở lại Z04-Z11, Z14-Z16, C01-C05, C07-C12. Ghi ngày, thay đổi và ADR bị tác động. Không thay số liệu cũ bằng suy đoán. Console tài khoản SSA chưa được kiểm tra trong nghiên cứu này; trạng thái đã đăng ký/xác thực được ghi nhận từ người dùng và feedback, không yêu cầu đăng ký lại.
Bổ sung bản 1.1: Airflow, VPS origin và công cụ trình bày
Kiểm tra tài liệu chính thức ngày 11/11/2026. Thiết kế DAG, topology và cơ chế auth cụ thể là đề xuất của dự án; không coi các trang hướng dẫn là bằng chứng cấu hình SSA đã chạy.
| ID | Nguồn | Cách dùng |
|---|---|---|
| A01 | https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html | Task retry phải cho kết quả nhất quán; dùng source partition/hash ổn định. Chọn thiết kế idempotency theo run/batch; chưa pin version Airflow. |
| A02 | https://airflow.apache.org/docs/apache-airflow/stable/core-concepts/xcoms.html | XCom dành cho dữ liệu nhỏ; thiết kế SSA chỉ truyền reference/hash, không raw file/PII. |
| C15 | https://developers.cloudflare.com/workers/configuration/routing/workers-dev/ | Khóa route workers.dev trong cấu hình deployment nếu không dùng; không chỉ tắt tạm trên console. |
| C16 | https://developers.cloudflare.com/cloudflare-one/access-controls/service-credentials/service-tokens/ | Service credentials là lựa chọn xác thực máy→origin; vẫn phải kiểm scope nghiệp vụ và thử route Worker thực tế. |
| D03 | https://github.com/tt-a1i/archify | JSON typed specification, validate/deliver showcase, light/dark Viewer, browser evidence và receipts cho từng HTML. |
| L05 | Xác nhận của chủ dự án trong hội thoại ngày 11/11/2026 | Không Apps Script; Airflow sync; VPS proxy tại Việt Nam; Cloudflare deployment/security/database. Provider, sizing, domain và residency chưa có evidence. |
Bổ sung bản 1.2: giới hạn proposal Apps Script
Tài liệu Google chính thức được đọc ngày 11/11/2026; quota không phải benchmark của SSA. L01/L03 chỉ chứng minh mô tả proposal và demo, chưa chứng minh cấu hình hoặc lỗi thực tế.
| ID | Nguồn | Cách sử dụng |
|---|---|---|
| G01 | https://developers.google.com/apps-script/guides/services/quotas | Runtime, trigger runtime/ngày, concurrency và URL Fetch theo loại tài khoản; quota có thể đổi. |
| G02 | https://developers.google.com/apps-script/guides/web | Web app chạy theo người triển khai hoặc người truy cập; quyền và ownership phải được kiểm tra. |
| G03 | https://developers.google.com/apps-script/guides/triggers/installable | Trigger theo người tạo, thời gian có thể lệch trong cửa sổ lịch; không hứa chính xác từng phút. |
| G04 | https://developers.google.com/apps-script/reference/lock/lock-service | Có cơ chế khóa vùng truy cập dùng chung; không suy thành transaction cho mọi writer hoặc chỉnh tay. |
Phạm vi rebuild bộ đọc 2.0
Đợt rebuild ngày 11/11/2026 tái tổ chức nội dung và sơ đồ từ PLAN.md bản 1.2. Các mốc đối chiếu nhà cung cấp phía trên là hồ sơ nghiên cứu đã có; không tuyên bố đợt biên tập này đã tái xác minh toàn bộ chính sách, quota hoặc giá. Trước implementation vẫn thực hiện quy trình cập nhật nguồn nêu trên.
Archify được cài từ tt-a1i/archify, revision 7e45f36c66de1254d5ad6ba1d878f6499ea269fd, doctor xác nhận package sẵn sàng. Các sơ đồ mô tả thiết kế SSA trong PLAN tại commit 05bb7ca2dfe249d1bfb325b901ee8d7d2958d19e; không dùng tài liệu kế hoạch để khẳng định hệ thống đã triển khai.
Đối chiếu lại mock L03 ngày 11/11/2026
File người dùng gửi lại có hash trùng input-manifest.json. Đã đọc component/handler và chạy tương tác bốn tab, validation size, tạo đơn mẫu, reload. FEATURES.md tách rõ tính năng mock, stub, phạm vi Admin đề xuất và phần còn thiếu; mock-review.json lưu bằng chứng cục bộ. Chặn request ngoài khi review; không suy ra xác thực hay lưu dữ liệu thật đã hoạt động.
Nguồn bổ sung scope ngày 12/11/2026
- REQ-20261112: Chủ dự án yêu cầu bổ sung trong tài liệu: Mini App có ZNS/notification, payment gateway + SDK checkout merchandise, quản lý đơn/thanh toán; Web Admin có merchandise, thanh toán và audit nguồn tiền. Đây là nguồn yêu cầu phạm vi, không phải bằng chứng tích hợp hoạt động.
- Z-PAY-01: Checkout SDK — giới thiệu, kiểm tra 12/11/2026: vai trò điều phối thanh toán Mini App.
- Z-PAY-02: Khai báo phương thức thanh toán, kiểm tra 12/11/2026: cấu hình phương thức/merchant/callback; không coi SDK là một cổng thanh toán duy nhất.
- Z-MSG-01: Thông báo hợp nhất thành ZBS Template Message, kiểm tra 12/11/2026: ánh xạ tên ZNS trong yêu cầu sang tài liệu hiện hành.
State machine, schema, quyền tài chính và quy trình đối soát trong FEATURES §7 là thiết kế đề xuất của SSA, không phải API hay chính sách được trích nguyên từ nhà cung cấp.