- Given Một lead ở bước chuyển đổi (PRD 01) hoặc một học viên được tạo trực tiếp (PRD 02)
- When Bước "Tài khoản FLYER" cho chọn tạo mới (tên đăng nhập sinh từ họ tên và năm sinh) hoặc liên kết có sẵn (tìm theo tên đăng nhập, số điện thoại phụ huynh, email qua
learners/search) - Then Bản ghi học viên lưu
learner_profile_id; liên kết được ghi quaPOST /v3/crm/customers/{id}/learnersvà đặt người học chính nếu là học viên đầu tiên; thông tin đăng nhập hiển thị một lần và có thể gửi lại cho phụ huynh (PRD 02); không thể hoàn tất chuyển đổi khi chưa có hồ sơ người học, trừ khi cấu hình tenant "cho phép học viên chưa có tài khoản FLYER" được bật.
PRD 18 · Học trực tuyến và luyện thi
Nối sản phẩm quản lý trung tâm với hệ thống học trực tuyến FLYER đã vận hành (study.flyer.us, teacher.flyer.us): liên kết hồ sơ người học khi chuyển đổi, ánh xạ lớp của trung tâm với lớp FLYER để giao bài tập về nhà theo bài học và buổi học, đồng bộ kết quả vào hồ sơ học viên và điểm thi, bán gói luyện thi Cambridge và IELTS như một loại gói học phí có cấp và thu hồi quyền truy cập, và đăng nhập một lần từ cổng phụ huynh. Không xây dựng hệ thống học trực tuyến mới.
Xuất xứ / Prompt / Giới hạn
Tài liệu do trợ lý AI soạn trong một phiên làm việc ngày 16/09/2026, mở rộng bộ PRD theo yêu cầu gốc được trích nguyên văn ở trang mục lục. Đây là bản đề xuất để đội thảo luận, chưa phải quyết định của đội sản phẩm.
Nguồn
- Nghiên cứu công khai về đối thủ cạnh tranh (PSE ONE, pse4.one), mã nguồn
center-crm-frontendvà đặc tả OpenAPI/v3trên staging (182 endpoint), tính đến ngày 10/09/2026. - Nhãn existing / extend / new trong trang được xác định bằng cách đối chiếu với đặc tả
/v3trên staging tại thời điểm trên. - Đợt quét thứ hai các nguồn công khai của PSE ONE ngày 16/09/2026 (trang tính năng, bảng phí dịch vụ, mục hướng dẫn sử dụng).
- Tham chiếu đối thủ cạnh tranh: khảo sát công khai pse4.one ngày 16/09/2026 cho thấy gói Enterprise (1.000.000 VND/tháng) bổ sung "xây dựng giáo trình online, khoá học nâng cao, luyện thi, tạo tài khoản học viên với khoá học online, trò chơi giáo dục"; một trang riêng "Luyện thi Cambridge" (Starters, Movers, Flyers) được trình bày như sáng kiến hợp tác; "nền tảng học trực tuyến với khoá học và bài kiểm tra luyện tập" là một phân hệ; các tích hợp được nêu gồm Zalo, Facebook, YouTube, Google Form. Đối thủ phải tự xây và tự cung cấp nội dung.
Giới hạn
- Cần xác minh khi khảo sát trực tiếp trong ứng dụng, vì đăng nhập tự động vào sản phẩm tham chiếu chưa được cấp phép trong phiên soạn:
- Nền tảng học trực tuyến của đối thủ là mô-đun trong cùng phiên đăng nhập hay một trang web riêng với tài khoản riêng cho học viên.
- Cách đối thủ tạo tài khoản học viên cho khoá học trực tuyến: tự động từ hồ sơ học viên hay nhập tay, và học viên đăng nhập bằng gì.
- Khoá học trực tuyến của đối thủ có gắn với lớp học và buổi học tại trung tâm không, hay là các khoá tự học độc lập.
- Nội dung luyện thi Cambridge do ai cung cấp, có cập nhật theo định dạng đề mới không, và có bán riêng cho phụ huynh không.
- Kết quả học trực tuyến có quay về hồ sơ học viên, bảng điểm hay báo cáo phụ huynh không, và có nhắc bài tập qua Zalo không.
- "Trò chơi giáo dục" gắn với bài học hay là kho chung, và có phát sinh dữ liệu kết quả không.
- Gói Enterprise có giới hạn số học viên trực tuyến hay số khoá học không.
Thiết kế đề xuất
Tám màn hình desktop và hai màn hình di động theo đúng thứ tự vận hành: giáo vụ liên kết lớp với lớp FLYER, giáo viên giao bài theo bài học và buổi học, kết quả quay về hồ sơ học viên, kế toán bán gói luyện thi như một gói học phí, và phụ huynh mở ứng dụng học bằng đăng nhập một lần; điều quan trọng nhất là Trường Số không xây trình học nào, mọi màn hình chỉ nối, giao, đọc kết quả và cấp quyền.





attempts/{id}/report; học viên chưa nộp hiển thị lần nhắc gần nhất và đã xem hay chưa. Chân ngăn: Thu hồi, Gia hạn (chỉ lùi về sau, quy tắc 6) và nút chính Nhắc 3 học viên chưa nộp.




1Mục đích
Việc luyện tập giữa các buổi học hiện diễn ra rời rạc: giáo viên giao bài trên một ứng dụng học tập, giáo vụ theo dõi trên bảng tính, phụ huynh không thấy tiến độ, kết quả không quay về hồ sơ học viên hay bảng điểm của trung tâm. FLYER đã có một hệ thống học trực tuyến hoàn chỉnh: bài tập giao theo lớp, đề thi, điểm kiểm tra định kỳ, thử thách hằng ngày, chấm nói bằng AI và báo cáo tuần cho phụ huynh. PRD này không xây lại phần nào trong đó; PRD này quy định cách Trường Số nối học viên, lớp học, giáo trình và gói học phí của trung tâm với các đối tượng tương ứng trên FLYER, để giao bài, nhắc nhở, đồng bộ kết quả và bán gói luyện thi trở thành một luồng vận hành duy nhất.
Trong phạm vi
- Liên kết danh tính người học: mỗi học viên nhập học có một hồ sơ người học FLYER, tạo mới hoặc liên kết tại thời điểm chuyển đổi (quyết định D4, PRD 00), dùng các endpoint liên kết đã có.
- Ánh xạ lớp của trung tâm với lớp FLYER, để giáo viên giao bài đến đúng danh sách học viên của lớp tại chi nhánh.
- Bài tập về nhà gắn với một bài học (PRD 14) và một buổi học (PRD 03), có hạn nộp và nhắc tự động cho phụ huynh (PRD 07).
- Đồng bộ kết quả bài tập, lượt thi và thời lượng học vào tab Học tập (PRD 02) và bảng điểm thi (PRD 13).
- Gói luyện thi (Cambridge Starters, Movers, Flyers; IELTS) là mặt hàng bán được: loại gói học phí "gói học trực tuyến" (PRD 05, PRD 19), cấp quyền khi thanh toán và thu hồi khi hết hạn.
- Hiển thị cho phụ huynh và đăng nhập một lần từ cổng phụ huynh vào ứng dụng người học FLYER.
- Phân tích sử dụng theo lớp: tỷ lệ nộp bài, thời lượng học, học viên không hoạt động.
- P2: khoá học trực tuyến do trung tâm tự xây từ bài học ở PRD 14, trò chơi giáo dục gắn với bài học, chứng chỉ hoàn thành khoá luyện thi.
Ngoài phạm vi
- Xây dựng hệ thống học trực tuyến mới hoặc trình soạn câu hỏi riêng; ngân hàng câu hỏi, chấm điểm và trình phát bài học là của FLYER.
- Thay đổi mô hình chấm nói và chấm viết bằng AI của FLYER.
- Ứng dụng di động riêng cho trung tâm; học viên dùng ứng dụng người học FLYER hiện có.
- Dạy trực tiếp qua video (Zoom, Google Meet); PRD 03 chỉ lưu đường dẫn phòng học trực tuyến.
2Hiện trạng
Trường Số có sẵn hệ thống FLYER đang vận hành và chỉ cần nối hai phía.
| Năng lực hiện có | Endpoint | Giữ lại? |
|---|---|---|
| Liên kết khách hàng CRM với hồ sơ người học (nhiều người học, một người học chính); tìm người học theo tên đăng nhập, số điện thoại, email | GET/POST /v3/crm/customers/{id}/learners, POST/DELETE .../learners/{link_id}, POST .../set-primary, GET /v3/crm/customers/learners/search | Giữ; nền tảng của bước liên kết danh tính (PRD 01, 02) |
| Bài tập đã giao theo lớp FLYER kèm trạng thái nộp; tổng hợp trên các lớp của giáo viên; phân tích theo câu hỏi | GET /v3/teacher/classes/{class_id}/assign-tests, GET /v3/teacher/viewer/rollup-assign-tests, GET /v3/teacher/assign-tests/{assign_test_id}/analytics/question-analysis | Giữ; nguồn dữ liệu tỷ lệ nộp bài và liên kết phân tích |
| Đề thi do giáo viên tạo và quản lý | GET/POST /v3/teacher/exams và các đường dẫn con | Giữ; kỳ đánh giá của trung tâm (PRD 13) chọn đề từ đây |
| Phía người học: đề thi, lộ trình học tiếp, thử thách hằng ngày, báo cáo lượt làm bài | GET /v3/learner/exams, GET /v3/learner/journey/continue, POST /v3/learner/daily-challenges, GET /v3/learner/attempts/{id}/report | Giữ nguyên trên ứng dụng người học; Trường Số chỉ đọc kết quả và mở báo cáo |
| Báo cáo tuần và báo cáo tổng hợp cho phụ huynh | GET /v3/parent/learner/{id}/weekly-report, /report | Giữ; nguồn của tab Học tập (PRD 02) và báo cáo học tập (PRD 07) |
| Gói thuê bao giáo viên; cấu hình tính năng theo người học | GET /v3/teacher/package/my-subscriptions, GET /v3/learner/feature-configs | Giữ; kiểm tra quyền giao bài của giáo viên; mở rộng để phản ánh quyền từ gói học trực tuyến |
| Nhắc bài học của lớp qua ứng dụng, email, Zalo | POST /v3/teacher/class-schedules/{id}/remind (PRD 07) | Giữ; tái sử dụng lớp gửi tin cho nhắc hạn nộp |
| Ánh xạ lớp trung tâm với lớp FLYER; bài tập gắn bài học và buổi học; cấp quyền theo gói; trao đổi token đăng nhập một lần | chưa có | Xây mới trong PRD này |
3User story và tiêu chí chấp nhận
- Given Một lớp (PRD 03) có giáo viên chính đã có tài khoản giáo viên FLYER
- When Mở Lớp → Cài đặt → Học trực tuyến và chọn "Tạo lớp FLYER" hoặc "Liên kết lớp có sẵn" từ danh sách lớp FLYER của giáo viên chính
- Then Bản ghi ánh xạ ở trạng thái Đã liên kết; toàn bộ học viên đang ghi danh có hồ sơ người học được thêm vào lớp FLYER; ghi danh, chuyển lớp và kết thúc ghi danh về sau được đồng bộ trong 5 phút; học viên chưa có hồ sơ người học nằm trong danh sách "Chưa liên kết" kèm nút tạo hoặc liên kết; tách liên kết không xoá lớp FLYER và không xoá dữ liệu học tập.
- Given Buổi học hôm nay của một lớp đã liên kết, và bài học tương ứng (PRD 14) có gợi ý bài tập FLYER
- When Từ phiếu điểm danh hoặc trang buổi học chọn "Giao bài", chọn một hoặc nhiều bài tập gợi ý (hoặc tìm trong thư viện FLYER), đặt hạn nộp (mặc định 2 giờ trước buổi học kế tiếp), chọn đối tượng toàn lớp hoặc học viên có mặt
- Then Bài tập được tạo trên FLYER cho lớp đã ánh xạ; bản ghi bài tập về nhà lưu
assign_test_id,lesson_id,session_id, hạn nộp; bài tập hiển thị trên trang lớp, trang buổi học và tab Học tập của từng học viên; phụ huynh nhận tin "Bài tập về nhà" theo chính sách kênh của PRD 07.
- Given Một bài tập có hạn nộp và một hoặc nhiều học viên chưa nộp
- When Còn 24 giờ trước hạn (mốc cấu hình tenant, có thể thêm mốc 2 giờ) hoặc hạn đã qua 12 giờ
- Then Tin "Nhắc bài tập" gửi tới phụ huynh của học viên chưa nộp qua kênh khả dụng đầu tiên (Zalo OA trong cửa sổ 48 giờ, thông báo trong ứng dụng, email), tôn trọng khung giờ yên tĩnh 21:30–07:00; mỗi học viên nhận tối đa một tin cho mỗi mốc; học viên đã nộp trong lúc chờ không nhận tin; trạng thái gửi hiển thị trên bảng bài tập lớp.
- Given Học viên đã nộp bài tập hoặc hoàn thành một lượt thi trên FLYER
- When Bộ đồng bộ chạy theo lịch 15 phút, hoặc webhook nộp bài từ FLYER được nhận (nếu có)
- Then Tab Học tập (PRD 02) hiển thị bài tập, trạng thái nộp, điểm phần trăm, độ chính xác theo kỹ năng, thời lượng và liên kết "Xem báo cáo" tới
attempts/{id}/report; bài tập đánh dấu "tính điểm" ghi một dòng điểm vào kỳ đánh giá tương ứng ở PRD 13 với nguồnflyer_assign_test, không sửa tay, chỉ ghi đè có lý do; kết quả đến sau ngày chốt kỳ vẫn được ghi kèm cờ "sau hạn".
- Given Danh mục gói học phí có một gói loại
online_package(PRD 05) trỏ tới một sản phẩm luyện thi FLYER (ví dụ Movers 6 tháng) cấu hình ở PRD 19 - When Hoá đơn có dòng gói này được thanh toán đủ (hoặc ngay khi tạo, theo cấu hình tenant giống gói buổi); về sau đến ngày hết hạn, hoá đơn bị huỷ hay hoàn tiền, hoặc học viên bảo lưu
- Then Một quyền truy cập được tạo với ngày bắt đầu, hết hạn, sản phẩm FLYER; FLYER được gọi để cấp quyền và
learner/feature-configsphản ánh trong 5 phút; phụ huynh nhận tin "Kích hoạt gói luyện thi" kèm hướng dẫn đăng nhập; cấp thất bại thì hoá đơn vẫn hợp lệ và một công việc "Kích hoạt thủ công" được tạo cho giáo vụ. Khi hết hạn, huỷ, hoàn tiền hoặc bảo lưu, quyền chuyển sang Hết hạn, Đã thu hồi hoặc Tạm dừng và FLYER được gọi để thu hồi hoặc đóng băng; bảo lưu gia hạn ngày hết hạn theo số ngày tạm dừng; phụ huynh nhận tin "Sắp hết hạn" trước 14 và 3 ngày kèm liên kết gia hạn trên cổng phụ huynh; dữ liệu học tập không bị xoá.
- Given Phụ huynh đã đăng nhập cổng phụ huynh bằng OTP (PRD 07) và học viên có hồ sơ người học đã liên kết
- When Mở tab Học tập của học viên và chọn "Mở ứng dụng học"
- Then Cổng phụ huynh gọi endpoint trao đổi token, nhận một mã dùng một lần hiệu lực 60 giây, và chuyển hướng tới ứng dụng người học FLYER (web hoặc liên kết sâu tới ứng dụng di động) với phiên của đúng người học; tab Học tập hiển thị bài tập đang mở kèm hạn, bài đã nộp kèm điểm, thời lượng học tuần này, báo cáo tuần và trạng thái gói luyện thi kèm ngày hết hạn.
- Given Chi nhánh có các lớp đã liên kết
- When Mở Báo cáo → Học trực tuyến với một khoảng thời gian
- Then Bảng theo lớp gồm số bài đã giao, tỷ lệ nộp đúng hạn, tỷ lệ nộp muộn, điểm trung bình, thời lượng học trung bình mỗi học viên mỗi tuần, số học viên không hoạt động 14 ngày, số lớp chưa liên kết; xem chi tiết tới từng học viên và xuất xlsx; học viên không hoạt động 14 ngày tạo một công việc theo dõi cho người phụ trách chăm sóc học viên (như ATT-06).
- Given Giáo trình (PRD 14) có các bài học kèm bài tập FLYER, và tenant có quyền
elearning.course.author - When Tạo khoá học: chọn bài học theo thứ tự, gắn bài tập bắt buộc và trò chơi giáo dục cho mỗi bài, đặt điều kiện hoàn thành (tỷ lệ bài bắt buộc, điểm tối thiểu bài thi cuối), chọn mẫu chứng chỉ có logo trung tâm
- Then Khoá học bán được như một gói học trực tuyến hoặc gắn miễn phí cho một lớp; học viên thấy khoá học trong lộ trình FLYER; khi đủ điều kiện, chứng chỉ có mã tra cứu được sinh dưới dạng PDF, hiển thị trên cổng phụ huynh và ghi vào tab Học tập; mẫu chứng chỉ không dùng tên hay logo của tổ chức khảo thí.
4Màn hình
Phần đầu: trạng thái liên kết (Chưa liên kết / Đã liên kết với [tên lớp FLYER] / Lỗi đồng bộ), giáo viên FLYER được uỷ quyền, lần đồng bộ gần nhất. Nút: Tạo lớp FLYER · Liên kết lớp có sẵn · Đồng bộ ngay · Tách liên kết. Bảng học viên: họ tên, mã học viên, tên đăng nhập FLYER, trạng thái (Đã vào lớp FLYER / Chưa có tài khoản / Chờ đồng bộ), thao tác Tạo tài khoản, Liên kết. Trạng thái trống: "Lớp chưa liên kết với FLYER. Liên kết để giao bài tập về nhà và theo dõi kết quả."
Bảng: bài tập (tên, chip loại), bài học (mã bài trong giáo trình), buổi học (ngày), hạn nộp (chip "Quá hạn" màu đỏ), đã nộp / tổng, điểm trung bình, nhắc gần nhất, thao tác Xem · Nhắc ngay · Gia hạn · Thu hồi. Bộ lọc: trạng thái (Đang mở / Đã hết hạn / Đã đóng), khoảng ngày. Nút + Giao bài mở biểu mẫu: bài học (mặc định bài của buổi gần nhất), bài tập gợi ý từ giáo trình kèm ô tìm trong thư viện FLYER, hạn nộp, đối tượng (toàn lớp / học viên có mặt / chọn tay), công tắc "Tính điểm vào kỳ đánh giá". Chi tiết một bài tập: học viên, trạng thái nộp, điểm, liên kết phân tích theo câu hỏi trên FLYER. Trạng thái trống: "Chưa có bài tập nào. Giao bài từ buổi học gần nhất."
Bổ sung cho tab đã có ở PRD 02. Thẻ tổng hợp: thời lượng học 7 và 30 ngày, tỷ lệ nộp bài 30 ngày, số bài đang mở, ngày hoạt động gần nhất. Phần Gói học trực tuyến: bảng quyền truy cập (sản phẩm, ngày bắt đầu, hết hạn, chip trạng thái, hoá đơn liên quan) và nút Gia hạn (tạo hoá đơn, PRD 05). Phần Bài tập: theo lớp kèm bài học, hạn, trạng thái, điểm, liên kết Xem báo cáo. Phần Lượt thi: đề thi, ngày, điểm theo kỹ năng, thang đo (Cambridge shields, CEFR, IELTS band), cờ "đã ghi vào điểm thi" (PRD 13). Trạng thái trống: "Chưa có dữ liệu học tập. Kiểm tra liên kết tài khoản FLYER."
Biểu mẫu gói học phí (PRD 05) thêm các trường khi loại là gói học trực tuyến: sản phẩm FLYER (chọn từ danh mục FLYER cung cấp: Starters, Movers, Flyers, IELTS, khoá học tự xây ở P2), thời hạn (tháng), thời điểm cấp quyền (khi thanh toán đủ / khi tạo hoá đơn), gia hạn tự động khi thanh toán hoá đơn gia hạn, số ngày báo trước khi hết hạn. Bảng danh mục thêm cột Sản phẩm FLYER và Đang hoạt động (số quyền truy cập còn hiệu lực).
Bộ chuyển đổi giữa các học viên được liên kết (PRD 07). Thẻ "Bài tập cần làm" (tên bài, lớp, hạn, nút Mở ứng dụng học), thẻ "Tuần này" (thời lượng học, số bài đã nộp, điểm trung bình), lượt thi gần nhất kèm liên kết báo cáo, thẻ gói luyện thi kèm ngày hết hạn và nút Gia hạn (mở hoá đơn kèm mã QR). Nút "Mở ứng dụng học" thực hiện đăng nhập một lần. Trạng thái trống: "Học viên chưa có tài khoản học tập. Vui lòng liên hệ trung tâm."
5Quy tắc nghiệp vụ
- Một học viên (PRD 02) trỏ tới đúng một hồ sơ người học FLYER; một hồ sơ người học có thể được nhiều bản ghi học viên ở các chi nhánh khác nhau trỏ tới. Thay đổi liên kết cần giáo vụ trở lên, có lý do và ghi nhật ký; liên kết cũ được giữ trong lịch sử.
- Một lớp của trung tâm ánh xạ tới tối đa một lớp FLYER tại một thời điểm; một lớp FLYER không được ánh xạ tới hai lớp của trung tâm. Tách liên kết yêu cầu không còn bài tập đang mở.
- Trường Số là nguồn có thẩm quyền về thành viên lớp; danh sách trên lớp FLYER được suy ra từ ghi danh đang hoạt động. Thành viên thêm thủ công trên FLYER mà không có ghi danh hiển thị cảnh báo "Ngoài danh sách" và không bị tự động gỡ trong P1.
- Giáo viên chỉ giao bài cho lớp mà người đó là giáo viên chính, trợ giảng hoặc dạy thay trong ngày, và phải có tài khoản giáo viên FLYER còn quyền giao bài (kiểm tra qua
package/my-subscriptions); nếu không, thao tác bị chặn với thông báo rõ ràng và giáo vụ có thể giao thay. - Mỗi bài tập gắn với đúng một bài học và tối đa một buổi học; bài tập giao ngoài lịch (ôn tập, nghỉ lễ) có
session_idrỗng và bắt buộc chọn bài học. - Hạn nộp mặc định là 2 giờ trước buổi học kế tiếp; hạn tối thiểu là 6 giờ sau khi giao; gia hạn chỉ được lùi về sau và ghi nhật ký.
- Nhắc hạn nộp tuân theo chính sách kênh và khung giờ yên tĩnh của PRD 07; tối đa một tin cho mỗi mốc cho mỗi học viên; học viên đã nộp không nhận tin. Mẫu tin "Nhắc bài tập" có tham số tên học viên, lớp, tên bài, hạn nộp.
- Kết quả đồng bộ từ FLYER là dữ liệu chỉ đọc trong Trường Số. Điểm đưa vào kỳ đánh giá (PRD 13) tính theo công thức của kỳ đó; ghi đè phải có lý do và hiển thị cả giá trị gốc.
- Quyền truy cập gói học trực tuyến được cấp khi hoá đơn đạt điều kiện theo cấu hình tenant (thanh toán đủ, hoặc khi tạo hoá đơn); thời hạn tính từ ngày cấp. Gia hạn trước khi hết hạn cộng dồn từ ngày hết hạn cũ. Huỷ hoá đơn hoặc hoàn tiền thu hồi ngay; bảo lưu tạm dừng và gia hạn tương ứng; nghỉ học không thu hồi quyền đã thanh toán trước ngày hết hạn.
- Đăng nhập một lần chỉ khả dụng cho phụ huynh có liên kết với học viên trong tenant, hoặc học viên trưởng thành tự uỷ quyền; mã trao đổi dùng một lần, hiệu lực 60 giây, gắn với thiết bị phát hành; mọi lần phát hành được ghi nhật ký.
- P2: chứng chỉ hoàn thành mang tên và logo của trung tâm, có mã tra cứu công khai, và không mô tả là chứng chỉ của một tổ chức khảo thí.
6Mô hình dữ liệu
| Thực thể | Trường | Ghi chú |
|---|---|---|
| student (PRD 02) | + learner_link_id uuid null; learner_linked_at; learner_link_source enum(convert, create, import, manual) | extend; learner_profile_id đã có |
| class_lms_link | id uuid; tenant_id (center_id); school_id; class_id; flyer_class_id int64; teacher_profile_id int64; status enum(linked, syncing, error, unlinked); last_synced_at; last_error; created_by; created_at; unlinked_at | new; unique (class_id) khi status ≠ unlinked; unique (flyer_class_id) |
| class_lms_member | id; link_id; student_id; learner_profile_id; enrollment_id; status enum(active, pending, removed, external); synced_at | new; external = có trên FLYER nhưng không có ghi danh |
| homework | id uuid; tenant_id; school_id; class_id; link_id; lesson_id (PRD 14) not null; session_id null; assign_test_id int64; title; type; assigned_by_staff_id; assigned_at; due_at; audience enum(class, present, selected); grade_into_assessment bool; assessment_period_id null (PRD 13); status enum(open, expired, closed, revoked); reminder_offsets_hours int[] | new; unique (assign_test_id) |
| homework_result | id; homework_id; student_id; learner_profile_id; attempt_id int64 null; status enum(not_started, in_progress, submitted, late); submitted_at; score_pct; skill_scores jsonb; duration_sec; synced_at; late_after_close bool | new; unique (homework_id, student_id); chỉ đọc. Thời lượng học và ngày hoạt động gần nhất được tổng hợp theo ngày từ báo cáo tuần vào bảng learning_activity_daily |
| homework_reminder | id; homework_id; student_id; offset_hours; message_id (PRD 07); sent_at; outcome | new; unique (homework_id, student_id, offset_hours) |
| fee_plan (PRD 05) | type thêm giá trị online_package; + flyer_product_code; duration_months; grant_on enum(paid, invoiced); auto_renew_on_payment bool; expiry_notice_days int[] | extend |
| online_entitlement | id uuid; tenant_id; school_id; student_id; learner_profile_id; fee_plan_id; flyer_product_code; tuition_id; starts_at; ends_at; status enum(pending, active, paused, expired, revoked, failed); paused_at; pause_days int; flyer_grant_ref; last_error; created_at; updated_at | new; một dòng cho mỗi lần cấp hoặc gia hạn |
| sso_exchange | id uuid; tenant_id; guardian_id; student_id; learner_profile_id; code_hash; issued_at; expires_at; consumed_at null; device_fingerprint; ip | new; chỉ lưu hash của mã |
| online_course, course_enrollment, course_certificate (P2) | course: id; tenant_id; title; level_code; lesson_ids uuid[] có thứ tự; required_assign_test_ids int64[]; game_ids; completion_rule jsonb {min_required_pct, final_exam_min_score}; certificate_template_id; status enum(draft, published, archived). enrollment: course_id; student_id; source enum(entitlement, class, manual); progress_pct; completed_at. certificate: course_id; student_id; number; lookup_code; issued_at; pdf_file_id | new; unique (course_id, student_id) trên chứng chỉ |
| elearning_policy (cấu hình tenant) | require_learner_account bool (mặc định bật); default_due_hours_before_next_session 2; reminder_offsets_hours [24]; inactive_days_threshold 14; grant_on mặc định; expiry_notice_days [14, 3]; sso_enabled bool | lưu trong cấu hình trường (PRD 10) |
Phạm vi dữ liệu: mọi thực thể mang tenant_id; thực thể gắn với lớp hoặc học viên mang thêm school_id để bộ lọc chi nhánh và phạm vi quyền áp dụng trực tiếp. flyer_class_id, assign_test_id, attempt_id, learner_profile_id là khoá phía FLYER, kiểu int64, không hiển thị cho phụ huynh.
7Hợp đồng API
| Method | Path | Mục đích | Status |
|---|---|---|---|
| GET/POST · POST/DELETE · POST | /v3/crm/customers/{id}/learners · .../learners/{link_id} · .../set-primary | Liệt kê, tạo, gỡ liên kết khách hàng với người học; đặt người học chính | existing |
| GET | /v3/crm/customers/learners/search | Tìm hồ sơ người học để liên kết | existing |
| GET/PUT/DELETE | /v3/school/classes/{id}/lms-link | Xem; tạo hoặc liên kết ({flyer_class_id} | {create: true, teacher_profile_id}); tách. PUT trả 409 khi lớp FLYER đã được ánh xạ nơi khác | new |
| POST | /v3/school/classes/{id}/lms-link/sync | Đồng bộ danh sách ngay → {added, removed, pending, external} | new |
| GET | /v3/school/lessons/{lesson_id}/suggested-assign-tests | Bài tập FLYER gợi ý cho một bài học (PRD 14) | new |
| GET/POST | /v3/school/classes/{id}/homework | Danh sách; tạo {lesson_id, session_id?, assign_test_ids[], due_at, audience, student_ids?, grade_into_assessment, reminder_offsets_hours?} → tạo assign-test trên FLYER rồi ghi bản ghi homework | new |
| GET/PATCH/DELETE · POST | /v3/school/homework/{id} · /remind | Chi tiết kèm kết quả từng học viên; gia hạn {due_at, reason}; thu hồi; nhắc ngay học viên chưa nộp (lớp gửi tin PRD 07) | new |
| GET | /v3/teacher/classes/{class_id}/assign-tests · /v3/teacher/viewer/rollup-assign-tests · /v3/teacher/assign-tests/{assign_test_id}/analytics/question-analysis | Nguồn trạng thái nộp cho bộ đồng bộ; màn hình giáo viên; liên kết phân tích theo câu hỏi | existing |
| GET/POST | /v3/teacher/exams và đường dẫn con | Chọn đề thi cho kỳ đánh giá (PRD 13) | existing |
| GET | /v3/learner/attempts/{id}/report · /v3/parent/learner/{id}/weekly-report · /report | Báo cáo lượt làm bài; nguồn thời lượng học, kỹ năng, hoạt động | existing |
| GET | /v3/school/students/{id}/learning | Tổng hợp cho tab Học tập: hoạt động, bài tập, lượt thi, quyền truy cập (gộp từ các endpoint FLYER và bảng của Trường Số) | new |
| POST | /v3/school/homework/results/ingest | Điểm nhận webhook nộp bài từ FLYER (nếu được phát hành); bộ đồng bộ theo lịch là phương án dự phòng | new |
| GET/PUT | /v3/school/fee-plans/{id} | Thêm các trường của loại online_package | extend |
| GET/POST · POST | /v3/school/students/{id}/entitlements · /v3/school/entitlements/{id}/revoke · /pause · /resume · /retry | Liệt kê; cấp thủ công {fee_plan_id, starts_at, reason}; thu hồi, tạm dừng, tiếp tục, thử cấp lại; có lý do, ghi nhật ký. Danh mục sản phẩm FLYER bán được lấy từ /v3/school/online-products | new |
| GET | /v3/teacher/package/my-subscriptions | Kiểm tra quyền giao bài của giáo viên | existing |
| GET | /v3/learner/feature-configs | Phản ánh quyền truy cập của người học; bổ sung nguồn school_entitlement | extend |
| POST | /v3/parent/learner/{id}/sso-code | Phát hành mã trao đổi dùng một lần cho phụ huynh đã đăng nhập cổng | new |
| POST | /v3/learner/auth/exchange | Đổi mã thành phiên người học; 410 khi mã đã dùng hoặc hết hạn | new |
| GET | /v3/parent/learner/{id}/learning | Tổng hợp cho cổng phụ huynh: bài tập cần làm, tuần này, lượt thi, gói | new |
| GET | /v3/school/reports/elearning | school_id, from, to, group_by=class|student; format=xlsx | new |
| GET/PUT | /v3/teacher/school-config | Khối elearning_policy | extend |
| GET/POST/PATCH · POST · GET | /v3/school/courses · /{id}/publish · /{id}/certificates · /v3/public/certificates/{lookup_code} (P2) | Khoá học tự xây từ bài học PRD 14; xuất bản; cấp chứng chỉ; tra cứu công khai | new |
8Phân quyền
| Mã quyền | owner | branch_manager | admissions | academic_admin | teacher | accountant | parent |
|---|---|---|---|---|---|---|---|
elearning.learner.link | tất cả | chi nhánh | khi chuyển đổi | chi nhánh | không | không | không |
elearning.class.link | tất cả | chi nhánh | không | chi nhánh | lớp được phân công (tạo, không tách) | không | không |
elearning.homework.assign | tất cả | chi nhánh | không | chi nhánh | lớp được phân công | không | không |
elearning.homework.view | tất cả | chi nhánh | học viên đang tư vấn | chi nhánh | lớp được phân công | không | học viên được liên kết |
elearning.results.override | tất cả | chi nhánh | không | chi nhánh | không | không | không |
elearning.entitlement.manage | tất cả | chi nhánh | không | chi nhánh | không | xem, cấp theo hoá đơn | không |
elearning.sso.use | không | không | không | không | không | không | học viên được liên kết |
elearning.report, elearning.export | tất cả | chi nhánh | không | chi nhánh | lớp được phân công (không xuất) | báo cáo gói | không |
elearning.policy | có | không | không | không | không | không | không |
elearning.course.author, elearning.certificate.issue (P2) | tất cả | chi nhánh | không | chi nhánh | không | không | không |
9Sự kiện phân tích
| Sự kiện | Thuộc tính |
|---|---|
| learner_linked | source (convert|create|import|manual), mode (create|link), by_role |
| class_lms_linked · class_lms_sync | mode, roster_size, unlinked_students · trigger (schedule|manual|enrollment), added, removed, pending, external, outcome |
| homework_assigned | from (attendance|session|class), suggested_used, assign_test_count, audience, hours_to_due, grade_into_assessment, seconds_to_assign |
| homework_reminder_sent | offset_hours, channel, outcome, remaining_unsubmitted |
| homework_result_synced | via (webhook|schedule), lag_minutes, status, late_after_close |
| entitlement_granted · entitlement_revoked | flyer_product_code, grant_on, duration_months, renewal, outcome, latency_ms · reason (expired|void|refund|paused|manual) |
| entitlement_expiry_notice_sent | days_before, channel, renewed_within_7d (cập nhật sau) |
| parent_sso_used | target (web|app_deeplink), latency_ms, outcome |
| course_published · certificate_issued (P2) | lesson_count, required_count · course_id, days_to_complete |
10Trường hợp biên
- Cùng một hồ sơ người học liên kết với hai học viên ở hai chi nhánh: cho phép (PRD 02); mỗi lớp ánh xạ riêng; bài tập và quyền truy cập ghi theo từng bản ghi học viên, hoạt động học tính chung theo
learner_profile_idvà hiển thị ở cả hai nơi kèm ghi chú. - Học viên chuyển lớp khi có bài tập đang mở: bài tập cũ vẫn thuộc lớp cũ và kết quả vẫn đồng bộ; học viên được thêm vào lớp FLYER mới ở lần đồng bộ kế tiếp.
- Bài tập bị xoá trên FLYER: bản ghi chuyển sang Đã thu hồi, kết quả đã đồng bộ được giữ, nhắc nhở dừng ngay.
- Hoá đơn gói học trực tuyến thanh toán một phần: chưa cấp quyền khi
grant_on = paid; danh sách công nợ hiển thị chip "Chờ cấp quyền". - Cấp quyền trên FLYER thất bại sau khi thanh toán: trạng thái Thất bại, tự thử lại 3 lần trong 30 phút, sau đó tạo công việc cho giáo vụ; phụ huynh không nhận tin kích hoạt cho đến khi thành công.
- Học viên đã có gói FLYER mua trực tiếp trùng với gói trung tâm bán: quyền của trung tâm vẫn được ghi với ngày riêng; FLYER giữ quyền có ngày hết hạn xa hơn; báo cáo của trung tâm chỉ tính quyền do trung tâm cấp.
- Đồng bộ kết quả trễ hơn 60 phút so với FLYER: banner "Dữ liệu đang được đồng bộ" trên tab Học tập và bảng bài tập; tỷ lệ nộp bài không được chốt cho báo cáo tháng cho đến khi đồng bộ hoàn tất.
11Câu hỏi còn mở
- FLYER có phát hành webhook nộp bài và hoàn thành lượt thi cho tenant trường học không, hay bộ đồng bộ theo lịch 15 phút là phương án duy nhất trong P1?
- Danh mục sản phẩm luyện thi bán qua trung tâm và mức chia sẻ doanh thu: gói bán theo giá niêm yết FLYER hay theo giá trung tâm tự đặt (PRD 19)?
- Học viên chưa có tài khoản FLYER có nên tồn tại lâu dài (trung tâm không dùng nội dung FLYER), hay chỉ là trạng thái tạm thời có nhắc nhở?
- Bài tập "tính điểm vào kỳ đánh giá" lấy lượt làm đầu tiên, lượt tốt nhất hay lượt cuối cùng? Đề xuất: lượt tốt nhất trước hạn, cấu hình theo kỳ ở PRD 13.
Trường Số (truongso.net) · Nội bộ FLYER