SSA Phụ Huynh
Sơ đồ Toàn cảnh kiến trúcSơ đồ Toàn cảnh kiến trúcToàn cảnh kiến trúc

Hệ 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.

Khám phá luồng tương tác

Sơ đồ Toàn cảnh kiến trúcSơ đồ Toàn cảnh kiến trúcToàn cảnh kiến trúc

Hệ 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:

  1. Đị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]
  2. 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.

Khám phá luồng tương tác

Sơ đồ Lộ trình và exit gatesSơ đồ Lộ trình và exit gatesLộ 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.

Khám phá luồng tương tác

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

  1. 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.
  2. 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.
  3. 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ệ.
  4. 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.
  5. 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

  1. 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.
  2. Đơ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.
  3. 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ạ paid thành failed. Unknown phải truy vấn trước khi thu lại.
  4. 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.
  5. 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

Sơ đồ Phạm vi sản phẩmSơ đồ Phạm vi sản phẩmPhạm vi sản phẩm

Phụ 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.

Khám phá luồng tương tác

Sơ đồ Toàn cảnh kiến trúcSơ đồ Toàn cảnh kiến trúcToàn cảnh kiến trúc

Hệ thống gồm gì và các luồng gặp nhau ở đâu? Mở sơ đồ tương tác

Sơ đồ B dự phòng, chưa chọnSơ đồ B dự phòng, chưa chọnB dự phòng, chưa chọn

Nếu A không đóng G0, thay đổi phần nào? Mở sơ đồ tương tác

Sơ đồ Airflow và lineageSơ đồ Airflow và lineageAirflow và lineage

Lị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

Sơ đồ: context

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)

Sơ đồ: hybrid

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.

Khám phá luồng tương tác

Sơ đồ Quan hệ giám hộSơ đồ Quan hệ giám hộ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

Sơ đồ Giao dịch và gửi tinSơ đồ Giao dịch và gửi tinGiao dịch và gửi tin

Yê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.

Sơ đồ: data-core

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

Sơ đồ: commerce-data

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.

Khám phá luồng tương tác

Sơ đồ Xác thực và quyền trẻSơ đồ Xác thực và quyền trẻ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

Sơ đồ: auth

  1. 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.
  2. 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]
  3. Khi cần liên kết hồ sơ: getPhoneNumber() trả token; backend gọi GET https://graph.zalo.me/v2.0/me/info với headers access_token, code (phone token), secret_key củ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]
  4. 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.
  5. 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.
  6. 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.

Khám phá luồng tương tác

Sơ đồ Duyệt và publish MISASơ đồ Duyệt và publish MISADuyệt và publish MISA

Khi 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

Sơ đồ: import

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.

  1. 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.
  2. 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.
  3. Classify: loại HocVien/LienHePH/DiemDanh/Coach; required headers, mapping version, source effective date, timezone, campus scope. Giữ row_no để truy ngược.
  4. 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”.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.

Khám phá luồng tương tác

Sơ đồ Phạm vi sản phẩmSơ đồ Phạm vi sản phẩmPhạm vi sản phẩm

Phụ 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.

Khám phá luồng tương tác

Sơ đồ Xác thực và quyền trẻSơ đồ Xác thực và quyền trẻ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.

Khám phá luồng tương tác

Sơ đồ Từ đơn đến tiền thực nhậnSơ đồ Từ đơn đến tiền thực nhậnTừ đơn đến tiền thực nhận

Checkout, giao hàng và đối soát nối nhau ra sao? Mở sơ đồ tương tác

Sơ đồ Outbox và gửi tinSơ đồ Outbox và gửi tinOutbox và gửi tin

Gử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

Sơ đồ: order

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.

Sơ đồ: delivery

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.

Khám phá luồng tương tác

Sơ đồ Phiếu Coach và PDFSơ đồ Phiếu Coach và PDFPhiếu Coach và PDF

Ai duyệt nội dung trước khi phụ huynh đọc? Mở sơ đồ tương tác

Sơ đồ Khảo sát và chăm sócSơ đồ Khảo sát và chăm sócKhảo sát và chăm sóc

Phả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

Sơ đồ: report

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.

Sơ đồ: survey

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.

Khám phá luồng tương tác

Sơ đồ Outbox và gửi tinSơ đồ Outbox và gửi tinOutbox và gửi tin

Gử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.

Khám phá luồng tương tác

Sơ đồ Thu hồi và xóa dữ liệuSơ đồ Thu hồi và xóa dữ liệuThu hồi và xóa dữ liệu

Yê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.

Khám phá luồng tương tác

Sơ đồ Audit và truy vếtSơ đồ Audit và truy vếtAudit và truy vết

Từ 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.

Khám phá luồng tương tác

Sơ đồ Phục hồi và đối soátSơ đồ Phục hồi và đối soátPhục hồi và đối soát

Khô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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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 %.
  7. 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.

Khám phá luồng tương tác

Sơ đồ CI và phát hành ZaloSơ đồ CI và phát hành ZaloCI và phát hành Zalo

Bằ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.

Khám phá luồng tương tác

Sơ đồ CI và phát hành ZaloSơ đồ CI và phát hành ZaloCI và phát hành Zalo

Bằ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

Sơ đồ: deployment

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

  1. Đố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 ý.
  2. 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.com chỉ vì proposal cũ nói vậy.
  3. 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.
  4. 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]
  5. Nộp getPhoneNumber vớ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]
  6. 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ở xemNhu hoặc mật khẩu dùng chung trên production để reviewer vào.
  7. 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]
  8. 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.
  9. 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.

Khám phá luồng tương tác

Sơ đồ Lộ trình và exit gatesSơ đồ Lộ trình và exit gatesLộ 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.

Khám phá luồng tương tác

Sơ đồ Từ đơn đến tiền thực nhậnSơ đồ Từ đơn đến tiền thực nhậnTừ đơn đến tiền thực nhận

Checkout, 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.

Khám phá luồng tương tác

Sơ đồ Lộ trình và exit gatesSơ đồ Lộ trình và exit gatesLộ 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.