Trường Số PRD/19 Gói dịch vụ
Trường Số · Yêu cầu sản phẩm · 09/2026

PRD 19 · Gói dịch vụ và thuê bao

Danh mục gói dịch vụ của Trường Số với giới hạn theo gói (học viên đang học, chi nhánh, người dùng nhân sự, dung lượng, tin ZNS gộp, mô-đun), vòng đời thuê bao của tenant từ dùng thử đến chấm dứt, điểm kiểm soát giới hạn dùng chung, nâng cấp có tính lại theo chu kỳ 12 tháng, hoá đơn thuê bao thu qua chuyển khoản đối soát SePay, và bảng điều khiển nội bộ của FLYER. Backend hiện chưa có thực thể gói hay thuê bao ở cấp tenant.

Xuất xứ / Prompt / Giới hạn
Trạng thái
Dự thảo v1
Mô-đun phụ trách
Nền tảng
Backend
EXISTING centers/onboarding · EXTEND create-center, accessible-schools, SePay webhook · NEW plan, subscription, usage_counter, subscription_invoice, credit
Giai đoạn
P1 (gói, giới hạn, dùng thử, nâng cấp) / P2 (tự thanh toán, hoá đơn định kỳ, gói mở rộng dung lượng)
Phụ thuộc vào
00 Tổng quan, 10 Cài đặt, 12 Phi chức năng, 14 Giáo trình, 18 Học trực tuyế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-frontend và đặc tả OpenAPI /v3 trê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ả /v3 trê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: bảng giá công khai của PSE ONE (pse4.one, khảo sát ngày 16/09/2026) gồm Basic 199.000 đ/tháng (thanh toán theo năm, tối đa 100 học viên, 1 GB), Pro 400.000 đ/tháng (300 học viên, 2 GB), Business 700.000 đ/tháng (500 học viên, 4 GB) và Enterprise 1.000.000 đ/tháng (không giới hạn học viên, 5 GB, mở thêm giáo trình trực tuyến, khoá học, luyện thi, tài khoản học viên, trò chơi); dung lượng mua thêm 2.500.000 đ/năm cho mỗi 40 GB. Mọi gói đều gồm toàn bộ mô-đun vận hành (ứng dụng di động, nhân sự, lead, học thử, lịch học, điểm danh, tài chính, kho, báo cáo, sao lưu hằng ngày, hỗ trợ 24/7). Quy tắc nâng cấp được công bố nguyên văn: "hợp đồng sẽ được tính lại 12 tháng mới theo gói đã chọn", "phần chi phí còn lại của gói cũ sẽ được khấu trừ trực tiếp vào gói mới", "Hợp đồng cũ chấm dứt ngay tại thời điểm nâng cấp"; ví dụ công bố: Basic đã dùng 7/12 tháng, giá trị còn lại 199.000 × 5 = 995.000 đ, nâng lên Pro 4.800.000 đ, phải trả 3.805.000 đ. Đối thủ không công bố quy tắc hạ gói, thời gian dùng thử, gia hạn và lưu giữ dữ liệu. Các con số trên chỉ dùng để định vị; giá của Trường Số là quyết định của kinh doanh.

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:
    • Thời gian dùng thử của đối thủ, có yêu cầu thông tin thanh toán không, và điều gì xảy ra khi hết dùng thử.
    • Hành vi khi hết hạn gói: khoá hoàn toàn, chỉ đọc hay chỉ cảnh báo; có ân hạn không và bao lâu.
    • Quy tắc hạ gói và liệu có hoàn tiền phần chênh lệch.
    • "Học viên" trong giới hạn gói được đếm là học viên đang học hay toàn bộ hồ sơ; hồ sơ đã nghỉ có tính không.
    • Dung lượng tính trên loại tệp nào, có hiển thị cho tenant không; dung lượng mua thêm có tính theo tỷ lệ thời gian còn lại hay trọn năm.
    • Có trang tự phục vụ để nâng cấp và xem hoá đơn trong ứng dụng hay phải liên hệ kinh doanh.

Thiết kế đề xuất

Tám màn hình theo hệ thiết kế FLYER Cloud: trang Gói dịch vụ trong Cài đặt với thanh mức sử dụng đổi màu từ 90% và bảng so sánh gói để giá ở dạng "Cần quyết định", báo giá nâng cấp theo công thức 12 tháng, hoá đơn thuê bao, banner và hộp thoại chặn 402 trên danh sách học viên, và bảng điều khiển nội bộ của FLYER; điều quan trọng nhất là ở mọi điểm chạm giới hạn người dùng luôn thấy số đang dùng / giới hạn và đường nâng cấp.

1 · Gói dịch vụ

/settings/plan · desktop

Gói dịch vụ
Khối đầu trang nêu gói Tiêu chuẩn đang hoạt động, ngày hết hạn và ba nút Nâng cấp, Hoá đơn, Hạ gói từ kỳ sau; mỗi chỉ số có thanh tiến độ với số đã dùng / giới hạn và phần trăm, chỉ số Học viên đang học ở 92% đổi sang màu cảnh báo kèm chữ "Sắp chạm giới hạn" (SUB-02, SUB-03). Chân khối hiển thị tín dụng 500.000 ₫, thời điểm cập nhật và nút Tính lại ngay. Nút hạ gói bị vô hiệu hoá kèm giải thích "đang có 92 học viên, gói Khởi đầu cho phép 50" (SUB-05, quy tắc 7); bảng so sánh bốn gói công khai đánh dấu gói hiện tại và để giá năm, giá tháng ở dạng "Cần quyết định".

2 · Báo giá nâng cấp

/settings/plan/upgrade?plan=advanced · desktop

Báo giá nâng cấp
Hộp thoại báo giá theo SUB-04 và quy tắc 6: giá gói Nâng cao 12 tháng, trừ giá trị còn lại của gói Tiêu chuẩn (300.000 ₫ × 5 tháng chưa dùng, tháng đang dùng dở tính là đã dùng), trừ tín dụng, bằng số tiền phải trả 4.000.000 ₫; hạn thanh toán 7 ngày và hạn mới của thuê bao. Ghi chú cố định "Kỳ hiện tại kết thúc tại thời điểm nâng cấp; kỳ mới 12 tháng bắt đầu từ hôm nay" và nút Xác nhận và tạo hoá đơn; báo giá có hiệu lực 24 giờ (409 STALE_QUOTE). Số tiền là ví dụ minh hoạ, giá gói cần quyết định của kinh doanh.

3 · Hoá đơn thuê bao

/settings/plan/invoices · desktop

Hoá đơn thuê bao
Bốn ô số liệu (còn phải trả, đã thanh toán trong năm, tín dụng còn lại, hoá đơn điện tử) và bảng đủ các cột của PRD: số hoá đơn TS-INV-yyyy-nnnnnn, loại, kỳ áp dụng, số tiền, tín dụng đã trừ, còn phải trả, trạng thái, hạn thanh toán, thao tác Xem · PDF · HĐĐT. Các dòng thể hiện bốn trạng thái Chưa thanh toán, Đã thanh toán, Quá hạn, Đã huỷ, hoá đơn gói mở rộng tính theo số tháng còn lại làm tròn lên (quy tắc 8) và hoá đơn nâng cấp bị huỷ khi thay bằng hoá đơn gia hạn (quy tắc 9).

4 · Chi tiết hoá đơn

/settings/plan/invoices/:id · desktop

Chi tiết hoá đơn
Hoá đơn nâng cấp chưa thanh toán: hai dòng mục (gói mới 12 tháng và khấu trừ giá trị còn lại của gói cũ), tạm tính, tín dụng đã trừ và số còn phải trả; khối bên mua lấy từ hồ sơ pháp nhân (PRD 10) và khối hoá đơn điện tử với công tắc tự phát hành trong 24 giờ sau khi thanh toán đủ (quy tắc 10). Cột phải là mã QR chuyển khoản vào tài khoản của FLYER với payment_code làm nội dung, ghi chú đối soát SePay trong 5 phút và thanh toán một phần không kích hoạt gói (SUB-06); nút VNPay gắn nhãn P2.

5 · Banner cảnh báo 90%

/students · desktop

Banner cảnh báo 90%
Danh sách học viên khi số học viên đang học đạt 92/100: banner màu cảnh báo kèm chữ nêu số đã dùng, số chỗ còn lại và hệ quả khi đủ 100, nút Xem gói chỉ hiển thị với vai trò có subscription.manage (SUB-03, quy tắc 4). Thao tác nhập học vẫn thành công; tab Đang học hiển thị 92 / 100 để giáo vụ thấy ngưỡng ngay trên trang làm việc.

6 · Hộp thoại chặn 402

/students · hộp thoại toàn ứng dụng · desktop

Hộp thoại chặn 402
Khi số học viên đang học bằng giới hạn, API trả về 402 PLAN_LIMIT_REACHED và hộp thoại nêu chỉ số, số đang dùng / giới hạn, gói tiếp theo đủ đáp ứng và mã lỗi; khối báo giá tóm tắt công thức 6.000.000 − 1.500.000 − 500.000 = 4.000.000 ₫ để chủ trung tâm quyết định ngay (SUB-03, SUB-04). Bản ghi không được tạo; ghi chú nhắc rằng xem, sửa, điểm danh, thu tiền vẫn hoạt động (quy tắc 5); vai trò không có quyền quản lý gói thấy nút Báo cho chủ trung tâm thay cho Xem gói.

7 · Bảng điều khiển nội bộ FLYER

/admin/tenants · desktop

Bảng điều khiển nội bộ FLYER
Trang chỉ dành cho người dùng FLYER có tenant.admin: bốn ô số liệu, tab Tất cả · Dùng thử sắp hết · Quá hạn · Chưa đối soát, bộ lọc trạng thái, gói, hết hạn trong N ngày, người phụ trách và ô tìm theo tên hoặc center_id. Bảng có đủ cột trung tâm, chủ trung tâm, gói, trạng thái, hạn, học viên đang học / giới hạn kèm thanh tiến độ, chi nhánh, MRR quy đổi; các dòng thể hiện dùng thử, đang hoạt động, sắp hết hạn T-21, quá hạn còn ân hạn, tạm khoá chỉ đọc, gói Doanh nghiệp không giới hạn và gói nội bộ pilot, custom (quy tắc 2, 11).

8 · Gia hạn dùng thử và cấp tín dụng

/admin/tenants/:id · ngăn kéo · desktop

Gia hạn dùng thử và cấp tín dụng
Ngăn kéo chi tiết trung tâm Anh ngữ Sao Mai đang dùng thử còn 5 ngày, tab Thuê bao · Mức sử dụng · Hoá đơn · Tín dụng · Nhật ký. Khối Gia hạn dùng thử chọn 7 / 14 / 30 ngày, tính sẵn hạn mới và tổng 44 / 90 ngày để không cần tenant.admin.override; khối Cấp tín dụng có số tiền, hạn tuỳ chọn và trường lý do bắt buộc đang báo lỗi vì bỏ trống (SUB-08, quy tắc 12). Phía dưới là các thao tác Đặt gói theo hợp đồng, Tạm khoá, Chấm dứt và công tắc Tin cậy thanh toán.

1Mục đích

Trường Số được bán theo gói dịch vụ trả trước cho từng trung tâm (tenant). Mỗi gói quy định số học viên đang học, số chi nhánh, số người dùng nhân sự, dung lượng tài nguyên số, số tin ZNS gộp mỗi tháng và những mô-đun được mở. Mô-đun này là nguồn duy nhất trả lời "trung tâm đang dùng gói nào, còn được dùng bao nhiêu, đến bao giờ hết hạn và phải trả bao nhiêu để nâng cấp". Các mô-đun khác chỉ hỏi một điểm kiểm soát chung trước khi tạo thêm bản ghi. Chủ trung tâm xem mức sử dụng so với giới hạn tại một trang trong Cài đặt, nhận cảnh báo trước khi chạm ngưỡng và tự nâng cấp mà không cần liên hệ bộ phận kinh doanh của FLYER.

Trong phạm vi

Ngoài phạm vi

2Hiện trạng

Backend đã có tenant (Center của CRM) và chi nhánh (School của FLYER) theo quyết định D1 ở PRD 00, cùng luồng onboarding tạo trung tâm. Không có thực thể nào ghi nhận gói, giới hạn hay thời hạn của một tenant; mọi trung tâm hiện được mở không giới hạn. Ứng dụng giáo viên có gói bản quyền cho cá nhân giáo viên; đó là mẫu tham khảo về cấu trúc dữ liệu, không phải gói của tenant.

Năng lực hiện cóEndpointGiữ lại?
Danh sách và chi tiết trung tâm (tenant) của người dùngGET /v3/crm/centers existingGiữ; mở rộng response với khối subscription_summary.
Onboarding: trung tâm đã tạo, tạo trung tâm mớiGET /v3/crm/onboarding/centers, POST /v3/crm/onboarding/create-center existingGiữ; create-center khởi tạo thuê bao dùng thử 30 ngày ngay khi tạo trung tâm.
Chi nhánh mà người dùng được truy cậpGET /v3/crm/me/accessible-schools existingGiữ; nguồn đếm chi nhánh và nơi gắn cờ read_only khi tenant bị tạm khoá.
Gói bản quyền cá nhân của giáo viên FLYERGET /v3/teacher/package/my-subscriptions existingGiữ nguyên cho ứng dụng giáo viên; chỉ tham khảo cấu trúc (package, start, end, status).
Đối soát chuyển khoản SePay trên tài khoản của trung tâmwebhook SePay (PRD 05) extendMở rộng để nhận giao dịch vào tài khoản của FLYER và khớp hoá đơn thuê bao theo payment_code.
Gói, giới hạn, thuê bao, bộ đếm mức sử dụng, hoá đơn thuê bao, tín dụng, bảng điều khiển nội bộkhông có newXây mới ở /v3/crm/subscription/* (tenant tự phục vụ) và /v3/admin/tenants/* (nội bộ FLYER).

3User story và tiêu chí chấp nhận

SUB-01Dùng thử 30 ngày khi tạo trung tâm
Chủ trung tâm mới dùng đầy đủ tính năng mà không cần thanh toán.
  • Given Một trung tâm vừa được tạo qua luồng onboarding
  • When Việc tạo trung tâm hoàn tất
  • Then Một thuê bao trialing với gói dùng thử (giới hạn bằng gói cao nhất không phải Doanh nghiệp, 1 chi nhánh, 5 người dùng nhân sự) và hạn = ngày tạo + 30 ngày được tạo; thanh trên cùng hiển thị "Dùng thử, còn N ngày"; không yêu cầu thông tin thanh toán; bộ phận kinh doanh của FLYER nhận thông báo.
SUB-02Xem mức sử dụng so với giới hạn
Chủ trung tâm biết còn được dùng bao nhiêu trước khi phải nâng cấp.
  • Given Có quyền subscription.view
  • When Mở Cài đặt → Gói dịch vụ
  • Then Trang hiển thị tên gói, trạng thái, ngày hết hạn và một thanh cho mỗi chỉ số dạng "đã dùng / giới hạn" kèm phần trăm; chỉ số từ 90% đổi sang màu cảnh báo kèm chữ; số liệu không cũ quá 15 phút và có nút "Tính lại ngay".
SUB-03Cảnh báo mềm ở 90% và chặn khi vượt giới hạn
Giáo vụ được nhắc trước khi hết chỗ; hệ thống từ chối bản ghi vượt gói và chỉ đường nâng cấp.
  • Given Số học viên đang học đạt 90% giới hạn của gói
  • When Bất kỳ người dùng nào tạo hoặc chuyển đổi thêm học viên (PRD 01, PRD 02)
  • Then Thao tác vẫn thành công; banner "Đã dùng 92/100 học viên của gói Tiêu chuẩn" xuất hiện trên danh sách học viên và trang tổng quan; chủ trung tâm nhận thông báo trong ứng dụng và email một lần cho mỗi chỉ số, lặp lại tối đa 7 ngày một lần.
  • Given Số học viên đang học đã bằng giới hạn
  • When Giáo vụ nhập học thêm một học viên hoặc chuyển một học viên bảo lưu về đang học
  • Then API trả về 402 PLAN_LIMIT_REACHED kèm chỉ số, giới hạn, mức đang dùng; hộp thoại "Gói Tiêu chuẩn cho phép 100 học viên đang học. Nâng cấp lên gói Nâng cao để tiếp tục." có nút Xem gói (chủ trung tâm) hoặc Báo cho chủ trung tâm (vai trò khác); bản ghi không được tạo; xem, sửa, điểm danh, thu tiền trên bản ghi hiện có vẫn hoạt động.
SUB-04Nâng cấp gói có tính lại 12 tháng
Chủ trung tâm nâng cấp giữa kỳ và thấy số tiền phải trả trước khi xác nhận.
  • Given Thuê bao kỳ năm, gói Tiêu chuẩn, đã dùng 7 trong 12 tháng
  • When Chọn gói Nâng cao tại trang Gói dịch vụ
  • Then Báo giá hiển thị giá gói mới 12 tháng, trừ giá trị còn lại của gói cũ (đơn giá tháng × 5 tháng chưa dùng), trừ tín dụng, bằng số tiền phải trả; hạn mới = ngày xác nhận + 12 tháng; sau khi xác nhận, một hoá đơn thuê bao kèm mã QR được tạo; giới hạn gói mới có hiệu lực khi hoá đơn được thanh toán đủ, hoặc ngay lập tức nếu bảng điều khiển nội bộ đã bật "tin cậy thanh toán" cho tenant.
SUB-05Hạ gói vào cuối kỳ
Chủ trung tâm chọn gói thấp hơn cho kỳ tiếp theo.
  • Given Mức sử dụng nằm trong giới hạn của gói thấp hơn
  • When Chọn "Hạ xuống gói Khởi đầu từ kỳ tiếp theo"
  • Then Yêu cầu được lưu với ngày hiệu lực = ngày hết hạn hiện tại; trang hiển thị "Sẽ chuyển sang gói Khởi đầu vào dd/MM/yyyy" kèm nút Huỷ yêu cầu; tại T-1 hệ thống kiểm tra lại: nếu vượt giới hạn gói mới, yêu cầu bị huỷ và chủ trung tâm nhận thông báo liệt kê chỉ số cần giảm; nếu không, hoá đơn gia hạn được lập theo gói mới.
  • Given Mức sử dụng vượt giới hạn của gói thấp hơn
  • When Chọn hạ gói
  • Then Nút bị vô hiệu hoá kèm giải thích "Đang có 180 học viên, gói Khởi đầu cho phép 100".
SUB-06Thanh toán hoá đơn thuê bao bằng chuyển khoản
Kế toán của trung tâm thanh toán và thuê bao được kích hoạt tự động.
  • Given Hoá đơn thuê bao chưa thanh toán với payment_code trong mã QR và nội dung chuyển khoản
  • When Giao dịch đến tài khoản của FLYER với đúng mã và đủ tiền
  • Then Trong 5 phút, hoá đơn chuyển sang đã thanh toán, thuê bao chuyển sang active với gói và hạn theo hoá đơn, phiếu thu PDF gửi đến email người thanh toán và chủ trung tâm; giao dịch sai mã hoặc thiếu tiền vào mục Chưa đối soát của bảng điều khiển nội bộ.
SUB-07Hết hạn, ân hạn và tạm khoá chỉ đọc
Trung tâm quên gia hạn không mất dữ liệu và không bị gián đoạn đột ngột.
  • Given Thuê bao đang hoạt động, ngày hết hạn sắp đến
  • When Đến T-30, T-7, T-1 và T+0
  • Then Chủ trung tâm và kế toán nhận thông báo trong ứng dụng và email tại từng mốc, hoá đơn gia hạn được tạo sẵn tại T-30; tại T+0 thuê bao chuyển sang past_due, banner đỏ "Gói dịch vụ đã hết hạn, còn 14 ngày ân hạn" hiển thị cho mọi người dùng, tính năng vẫn dùng được; tại T+14 chưa thanh toán, thuê bao chuyển sang suspended: endpoint ghi trả về 423 TENANT_READ_ONLY, người dùng vẫn đăng nhập, xem, tìm kiếm, xuất Excel và tải phiếu thu; phụ huynh vẫn xem được cổng phụ huynh; tin nhắn tự động dừng gửi.
  • Given Thuê bao ở trạng thái suspended
  • When Hoá đơn gia hạn được thanh toán đủ
  • Then Thuê bao trở lại active trong 5 phút; kỳ mới tính từ ngày hết hạn cũ (thời gian ân hạn và tạm khoá thuộc kỳ mới, không được cộng thêm).
SUB-08Nhân viên FLYER đặt gói, gia hạn dùng thử, cấp tín dụng
Bộ phận kinh doanh của FLYER xử lý hợp đồng ký ngoài hệ thống.
  • Given Người dùng nội bộ có quyền tenant.admin
  • When Chọn một trung tâm trong bảng điều khiển nội bộ, đặt gói Doanh nghiệp kỳ 12 tháng từ ngày ký, nhập số hợp đồng và lý do
  • Then Thuê bao được cập nhật ngay, một hoá đơn thuê bao được tạo ở trạng thái đã thanh toán ngoài hệ thống (phương thức offline, kèm số hợp đồng), chủ trung tâm nhận email xác nhận, nhật ký ghi người thực hiện, giá trị trước và sau.
  • Given Trung tâm dùng thử sắp hết hạn và đang đàm phán
  • When Chọn "Gia hạn dùng thử" thêm 7, 14 hoặc 30 ngày kèm lý do
  • Then Hạn được cộng thêm; tổng thời gian dùng thử không vượt 90 ngày nếu không có quyền tenant.admin.override.
  • Given Cần bù đắp sự cố dịch vụ
  • When Cấp tín dụng kèm lý do
  • Then Tín dụng cộng vào số dư của tenant, tự động trừ vào hoá đơn tiếp theo, hiển thị tại trang Gói dịch vụ.

4Màn hình

Gói dịch vụ /settings/plan
┌────────────────────────────────────────────────────┐ │ Gói Tiêu chuẩn · Đang hoạt động · Hết hạn 15/03/2027 │ │ [Nâng cấp] [Hoá đơn] [Hạ gói từ kỳ sau] │ ├────────────────────────────────────────────────────┤ │ Học viên đang học 92 / 100 █████████░ 92% (!) │ │ Chi nhánh 2 / 3 ██████░░░░ 67% │ │ Người dùng nhân sự 11 / 15 ███████░░░ 73% │ │ Dung lượng 1,4 / 2 GB ███████░░░ 70% │ │ Tin ZNS tháng 9 640 / 1.000 ██████░░░░ 64% │ │ Mô-đun: Giáo trình số Có · Học trực tuyến Không │ ├────────────────────────────────────────────────────┤ │ Tín dụng 500.000 đ · Cập nhật 10:42 · [Tính lại ngay]│ └────────────────────────────────────────────────────┘

Phần đầu: tên gói, chip trạng thái (Đang hoạt động, Sắp hết hạn, Quá hạn, Dùng thử), ngày hết hạn, nút Nâng cấp, Hoá đơn, Hạ gói từ kỳ sau. Phần thân: một dòng cho mỗi chỉ số với thanh tiến độ và phần trăm, dấu cảnh báo kèm chữ từ 90%, dòng mô-đun theo gói. Phần cuối: tín dụng còn lại, thời điểm cập nhật, nút Tính lại ngay. Bên dưới là bảng so sánh các gói (giá năm, giá tháng, từng giới hạn, mô-đun) với gói hiện tại được đánh dấu. Không có trạng thái rỗng vì mọi tenant luôn có thuê bao; khi dùng thử, phần đầu hiển thị "Dùng thử, còn N ngày" và bảng so sánh được mở sẵn. Chọn Nâng cấp mở hộp thoại báo giá (/settings/plan/upgrade?plan=advanced): giá gói mới 12 tháng, trừ giá trị còn lại của gói cũ (đơn giá tháng × số tháng chưa dùng), trừ tín dụng, số tiền phải trả, ngày hết hạn mới, ghi chú cố định "Kỳ hiện tại kết thúc tại thời điểm nâng cấp; kỳ mới 12 tháng bắt đầu từ hôm nay", nút Xác nhận và tạo hoá đơn.

Hoá đơn thuê bao /settings/plan/invoices · /settings/plan/invoices/:id

Danh sách: số hoá đơn (TS-INV-yyyy-nnnnnn), loại (gia hạn, nâng cấp, gói mở rộng, điều chỉnh), kỳ áp dụng, số tiền, tín dụng đã trừ, còn phải trả, trạng thái (Chưa thanh toán, Đã thanh toán, Quá hạn, Đã huỷ), hạn thanh toán, thao tác (Xem, Tải PDF, Tải HĐĐT). Chi tiết: dòng mục, mã QR chuyển khoản với tài khoản của FLYER và payment_code, nút Thanh toán qua VNPay (P2), khối hoá đơn điện tử (số, mã tra cứu, PDF), bên mua lấy từ hồ sơ pháp nhân (PRD 10). Trạng thái rỗng: "Chưa có hoá đơn. Hoá đơn đầu tiên được tạo khi chọn gói."

Banner và hộp thoại giới hạn (toàn ứng dụng) mọi trang

Banner ở thanh trên cùng theo trạng thái: dùng thử (xanh dương, "Dùng thử, còn N ngày. Chọn gói"), sắp hết hạn (vàng cam, từ T-30), quá hạn (đỏ, đếm ngược ngày ân hạn), tạm khoá (đỏ, "Chỉ xem. Thanh toán để tiếp tục"). Nút hành động chỉ hiển thị với vai trò có subscription.manage hoặc subscription.pay; vai trò khác thấy "Liên hệ chủ trung tâm". Hộp thoại chặn tạo mới (402): giới hạn, số đang dùng, gói tiếp theo đủ đáp ứng, nút Xem gói hoặc Báo cho chủ trung tâm. Hộp thoại chỉ đọc (423): "Trung tâm đang ở chế độ chỉ xem do gói dịch vụ chưa được gia hạn."

Bảng điều khiển nội bộ (FLYER) /admin/tenants · /admin/tenants/:id

Chỉ dành cho người dùng FLYER có tenant.admin, tách khỏi điều hướng của tenant. Danh sách: bộ lọc trạng thái, gói, hết hạn trong N ngày, người phụ trách, tìm theo tên hoặc center_id; cột trung tâm, chủ trung tâm, gói, trạng thái, hạn, học viên đang học / giới hạn, chi nhánh, MRR quy đổi; tab Dùng thử sắp hết · Quá hạn · Chưa đối soát. Chi tiết: tab Thuê bao (đặt gói và kỳ, gia hạn dùng thử, tạm khoá / mở khoá, chấm dứt, "tin cậy thanh toán"), Mức sử dụng (90 ngày), Hoá đơn (điều chỉnh, đánh dấu đã thanh toán ngoài hệ thống, huỷ), Tín dụng, Nhật ký. Mọi hành động ghi đều yêu cầu lý do. Trạng thái rỗng theo tab, ví dụ "Không có trung tâm nào quá hạn."

5Quy tắc nghiệp vụ

  1. Mỗi tenant (Center) có đúng một thuê bao, tạo tự động ở trạng thái trialing khi tạo trung tâm; thuê bao không bao giờ bị xoá, chỉ chuyển trạng thái.
  2. Chuyển đổi hợp lệ: trialing → active (thanh toán hoặc đặt gói nội bộ) hoặc → past_due (hết 30 ngày); active → expiring (T-30, chỉ là cờ hiển thị) → past_due (T+0) → suspended (T+14) → terminated (T+14+90 hoặc theo yêu cầu bằng văn bản của chủ trung tâm) → xoá dữ liệu 90 ngày sau chấm dứt theo PRD 12. Thanh toán đủ tại bất kỳ trạng thái nào trước terminated đưa thuê bao về active. Chuyển đổi khác trả về 409 INVALID_TRANSITION. Mốc thời gian tính theo cuối ngày múi giờ Asia/Ho_Chi_Minh, lưu trữ theo UTC.
  3. Cách đếm: học viên đang học = học viên ở trạng thái Đang học trên mọi chi nhánh (Bảo lưu, Chờ xếp lớp, Học thử không tính); chi nhánh = School thuộc Center chưa lưu trữ; người dùng nhân sự = tài khoản đăng nhập chưa vô hiệu hoá (nhân sự không có tài khoản và tài khoản phụ huynh không tính); dung lượng = tổng dung lượng tệp do tenant tải lên (tài liệu giáo trình PRD 14, bài giảng PRD 18, tệp đính kèm, PDF phiếu thu), không tính nội dung học tập của FLYER; tin ZNS = số tin gửi thành công trong tháng dương lịch, đặt lại ngày 1.
  4. Điểm kiểm soát chung enforce_limit(metric) chạy trước mọi thao tác làm tăng chỉ số: tạo học viên, chuyển đổi lead, đổi trạng thái về Đang học, nhập từ Excel (PRD 11, kiểm tra trước toàn bộ tệp), tạo chi nhánh, mời người dùng, tải tệp, gửi ZNS. Từ 90%: cho phép và cảnh báo. Từ 100%: từ chối với 402 PLAN_LIMIT_REACHED. Riêng ZNS khi hết hạn mức: chuyển sang kênh dự phòng theo thứ tự của PRD 07 (Zalo OA, trong ứng dụng, email) với lý do "Hết hạn mức ZNS"; tenant có thể bật "Cho phép vượt hạn mức ZNS" và trả phí phần vượt trên hoá đơn tiếp theo (P2).
  5. Xem, sửa bản ghi hiện có, điểm danh, thu tiền, xuất dữ liệu không bao giờ bị chặn bởi giới hạn số lượng. Ở trạng thái suspended, endpoint ghi trả về 423 TENANT_READ_ONLY, trừ thanh toán hoá đơn thuê bao, đăng nhập, đổi mật khẩu, quản lý sự đồng ý của phụ huynh và yêu cầu xuất dữ liệu.
  6. Phí nâng cấp = giá gói mới (12 tháng) − giá trị còn lại của gói cũ, trong đó giá trị còn lại = đơn giá tháng của gói cũ × số tháng chưa dùng; tháng đang dùng dở tính là đã dùng; kỳ cũ chấm dứt tại thời điểm nâng cấp, kỳ mới 12 tháng bắt đầu từ ngày xác nhận. Tín dụng trừ sau cùng; kết quả âm ghi thành tín dụng, không hoàn tiền. Gói mới có hiệu lực khi hoá đơn nâng cấp được thanh toán đủ. Nâng cấp trong thời gian dùng thử kết thúc dùng thử ngay, số ngày còn lại không quy đổi thành tiền.
  7. Hạ gói chỉ có hiệu lực vào ngày hết hạn của kỳ hiện tại và chỉ khi mọi chỉ số tại T-1 nằm trong giới hạn gói mới; không hoàn tiền phần chênh lệch; mỗi thuê bao có tối đa một yêu cầu hạ gói đang chờ.
  8. Gói mở rộng (khối 40 GB, khối 1.000 tin ZNS/tháng, thêm chi nhánh, thêm 5 người dùng) có kỳ hạn trùng với thuê bao; giá lần đầu tính theo tỷ lệ số tháng còn lại làm tròn lên; giới hạn tăng ngay khi thanh toán; tự động vào hoá đơn gia hạn theo giá trọn năm trừ khi bị gỡ trước T-1; chỉ mua được khi thuê bao active hoặc expiring.
  9. Hoá đơn thuê bao đánh số TS-INV-yyyy-nnnnnn theo dãy toàn hệ thống; hạn thanh toán 7 ngày với hoá đơn nâng cấp và gói mở rộng, bằng ngày hết hạn với hoá đơn gia hạn. Thanh toán một phần không kích hoạt gói. Hoá đơn gia hạn được tạo tại T-30 theo gói hiện tại (hoặc gói đã yêu cầu hạ), cộng gói mở rộng, trừ tín dụng; kỳ mới luôn nối tiếp ngày hết hạn cũ, kể cả khi thanh toán trong ân hạn hoặc tạm khoá; hoá đơn gia hạn chưa thanh toán bị huỷ khi thuê bao chấm dứt.
  10. Hoá đơn điện tử cho thuê bao do FLYER phát hành cho tenant qua nhà cung cấp của FLYER; bên mua lấy từ hồ sơ pháp nhân (SchoolCompany); phát hành tự động trong 24 giờ sau khi thanh toán đủ nếu tenant đã bật "Nhận hoá đơn điện tử", hoặc theo yêu cầu.
  11. Trung tâm thử nghiệm và hợp đồng đặc thù dùng gói nội bộ pilot hoặc custom do bảng điều khiển nội bộ đặt, có giới hạn riêng và ngày hết hạn tường minh; không hiển thị trong bảng so sánh của tenant.
  12. Mọi thay đổi trạng thái thuê bao, gói, giới hạn, tín dụng, hoá đơn và mọi hành động của bảng điều khiển nội bộ đều ghi nhật ký (PRD 12) với người thực hiện, lý do, giá trị trước và sau; tenant xem được lịch sử của chính tenant tại Cài đặt → Nhật ký.

6Mô hình dữ liệu

Thực thểTrườngGhi chú
plan (toàn hệ thống)id uuid; code enum(trial, starter, standard, advanced, enterprise, pilot, custom); name_vi; name_en; price_month_vnd; price_year_vnd; billing_cycles [year | month]; is_public bool; sort_order; modules jsonb {curriculum bool, elearning bool}; retired_at nullnew; giá là placeholder "cần quyết định"; gói ngừng bán vẫn giữ để thuê bao cũ tham chiếu
plan_limitid; plan_id; metric enum(active_students, branches, staff_users, storage_gb, zns_month); limit_value int null (null = không giới hạn)new; unique (plan_id, metric)
subscription (cấp tenant)id uuid; center_id (unique); plan_id; status enum(trialing, active, expiring, past_due, suspended, terminated); billing_cycle; term_start; term_end; trial_end null; grace_end null; suspended_at null; terminated_at null; purge_after null; pending_downgrade_plan_id null; trust_payment bool; contract_no null; account_manager_id null; version int; updated_atnew; mọi mốc thông báo tính từ term_end
subscription_addonid; subscription_id; type enum(storage_40gb, zns_1000, branch, staff_5); quantity int; unit_price_year_vnd; starts_at; ends_at (= term_end); auto_renew bool; invoice_idnew
subscription_eventid; subscription_id; type enum(trial_started, trial_extended, activated, plan_changed, downgrade_scheduled, downgrade_cancelled, addon_changed, state_changed, credit_applied); from jsonb; to jsonb; reason; actor_type enum(tenant_user, flyer_admin, system); actor_id; created_atnew; nguồn cho nhật ký
usage_counterid; center_id; metric; value numeric; limit_snapshot int null; computed_at; source enum(incremental, nightly, manual); history_daily jsonb (90 ngày)new; unique (center_id, metric); tăng dần khi ghi, tính lại toàn bộ 02:00 hằng đêm
subscription_invoiceid uuid; number (TS-INV-yyyy-nnnnnn, unique); center_id; subscription_id; type enum(renewal, upgrade, addon, adjustment); status enum(unpaid, paid, overdue, void); lines jsonb [{description, plan_id | addon_type, qty, unit_price, amount}]; subtotal; credit_applied; total_due; paid_amount; payment_code (unique); due_at; paid_at null; payment_method enum(bank_transfer, vnpay, offline) null; payments jsonb [{amount, method, sepay_transaction_id, received_at}]; einvoice {provider, number, lookup_code, pdf_url} null; buyer jsonbnew; hoá đơn của FLYER xuất cho tenant, tách khỏi Tuition của PRD 05
creditid; center_id; amount_vnd; remaining_vnd; reason; granted_by; expires_at null; created_atnew; trừ theo thứ tự hết hạn sớm nhất
Center (mở rộng)+ subscription_id; + read_only bool (dẫn xuất)extend; read_only trả kèm trong accessible-schools

Phạm vi: plan và plan_limit là dữ liệu toàn hệ thống do FLYER quản lý. subscription, usage_counter, subscription_invoice, credit thuộc cấp tenant (center_id), không thuộc chi nhánh; chỉ số chi nhánh tổng hợp từ các School của Center. Tenant chỉ đọc được bản ghi mang center_id của chính tenant; id của tenant khác trả về 404 theo PRD 12.

7Hợp đồng API

MethodPathMục đíchTrạng thái
GET/v3/crm/centersDanh sách trung tâm; thêm subscription_summary {plan_code, status, term_end, read_only}extend
GET/v3/crm/onboarding/centersTrung tâm đã tạo trong onboardingexisting
POST/v3/crm/onboarding/create-centerTạo trung tâm; sau khi tạo, khởi tạo thuê bao trialing 30 ngàyextend
GET/v3/crm/me/accessible-schoolsChi nhánh của người dùng; thêm cờ read_only và subscription_statusextend
GET/v3/teacher/package/my-subscriptionsGói cá nhân của giáo viên FLYER; không thay đổi, chỉ tham khảo cấu trúcexisting
GET/v3/crm/subscription→ {subscription, plan, limits, usage: [{metric, value, limit, percent}], addons, credit_remaining, pending_downgrade}new
GET/v3/crm/subscription/plansDanh mục gói công khai kèm giới hạn và mô-đun, theo X-Localenew
GET/v3/crm/subscription/usagemetric, from, to → lịch sử theo ngày; ?recompute=true tính lại ngay (1 lần/5 phút)new
POST/v3/crm/subscription/upgrade-quote{plan_code, billing_cycle} → {new_price, remaining_value, months_unused, credit_applied, total_due, new_term_end, quote_hash}new
POST/v3/crm/subscription/upgrade{plan_code, billing_cycle, quote_hash} → subscription_invoice; 409 STALE_QUOTE khi báo giá quá 24 giờ; Idempotency-Keynew
POST · DELETE/v3/crm/subscription/downgrade{plan_code} lên lịch hạ gói tại term_end; 422 USAGE_EXCEEDS_PLAN kèm danh sách chỉ số; DELETE huỷ yêu cầunew
GET · POST · DELETE/v3/crm/subscription/addons{type, quantity} → báo giá theo tỷ lệ và hoá đơn; DELETE tắt tự gia hạnnew
GET/v3/crm/subscription/invoices · /{id} · /{id}/pdf · /{id}/qrDanh sách, chi tiết, PDF, mã QR chuyển khoản của hoá đơn thuê baonew
POST/v3/crm/subscription/invoices/{id}/vnpay · /einvoice→ {redirect_url}, callback cập nhật thanh toán (P2); {buyer} → phát hành hoá đơn điện tử, trả về số và mã tra cứunew
GET · POST/v3/crm/subscription/events · /notify-ownerLịch sử thuê bao của tenant, phân trang; báo cho chủ trung tâm về giới hạn đã chạm (1 lần/giờ/người)new
POST/v3/internal/sepay/webhookWebhook SePay hiện có (PRD 05) nhận thêm tài khoản của FLYER; khớp payment_code dạng TS-INVextend
GET/v3/admin/tenants · /{center_id}status, plan_code, expiring_within_days, account_manager_id, q → danh sách kèm usage; chi tiết → subscription, usage, invoices, credits, events; chỉ tenant.adminnew
PATCH/v3/admin/tenants/{center_id}/subscription{plan_code, term_start, term_end, billing_cycle, contract_no, trust_payment, reason, version}; tuỳ chọn tạo hoá đơn offline đã thanh toánnew
POST/v3/admin/tenants/{center_id}/trial-extend · /credits · /suspend · /reactivate · /terminate{days ∈ 7|14|30, reason} (quá 90 ngày tổng cần tenant.admin.override); {amount_vnd, reason, expires_at?}; {reason}; terminate đặt purge_after = now + 90 ngàynew
GET · POST · PATCH/v3/admin/plans · /{id} · /v3/admin/subscription-transactions/unmatched · /{id}/matchDanh mục gói và giới hạn (PATCH giới hạn của gói đang có thuê bao chỉ áp dụng cho kỳ mới); giao dịch SePay chưa khớp trên tài khoản FLYER (bảng unmatched_subscription_transaction, cùng mẫu PRD 05) và gán vào hoá đơnnew
middlewaremọi endpoint ghi dưới /v3/crm và /v3/school402 PLAN_LIMIT_REACHED {metric, limit, usage, suggested_plan}; 423 TENANT_READ_ONLY {term_end, grace_end}; header X-Plan-Warning: metric=active_students;percent=92 khi từ 90%new

8Phân quyền

Mã quyềnownerbranch_manageradmissionsacademic_adminaccountantteacherparent
subscription.view (trang Gói dịch vụ, mức sử dụng)tất cảtất cả (chỉ xem)khôngkhôngtất cả (chỉ xem)khôngkhông
subscription.manage (nâng cấp, hạ gói, gói mở rộng, bật hoá đơn điện tử)cókhôngkhôngkhôngkhôngkhôngkhông
subscription.pay (hoá đơn thuê bao, mã QR, VNPay, tải HĐĐT)cókhôngkhôngkhôngcókhôngkhông
subscription.notify_owner (báo cho chủ trung tâm khi bị chặn)không cầncócócócócókhông
Banner trạng thái thuê baocó, kèm nút hành độngcócócócó, kèm nút thanh toáncóchỉ thông báo chỉ đọc trên cổng phụ huynh khi tạm khoá
tenant.admin, tenant.admin.override (bảng điều khiển nội bộ)Chỉ cấp cho người dùng nội bộ FLYER qua vai trò hệ thống; không xuất hiện trong permissions-catalog của tenant; mọi hành động yêu cầu lý do và ghi nhật ký.

9Sự kiện phân tích

Sự kiệnThuộc tính
trial_startedcenter_id, source (onboarding|admin)
trial_converted · trial_expireddays_in_trial, plan_code, billing_cycle, actor_type, max_active_students
plan_page_viewedstatus, highest_percent_metric, highest_percent
limit_warning_shownmetric, percent, surface (banner|email|in_app)
limit_block_shownmetric, limit, usage, action (view_plans|notify_owner|dismiss), by_role
upgrade_quote_viewed · upgrade_completedfrom_plan, to_plan, months_unused, total_due, trigger (limit_block|plan_page|admin)
downgrade_scheduled · downgrade_cancelledfrom_plan, to_plan, cancelled_by (user|usage_check)
addon_purchasedtype, quantity, prorated_months, total_due
subscription_invoice_paidtype, method, hours_to_pay, matched (auto|manual)
expiry_notification_sentmilestone (T-30|T-7|T-1|T+0|T+14), channel
subscription_state_changedfrom, to, actor_type
admin_tenant_actionaction (set_plan|trial_extend|credit|suspend|reactivate|terminate), admin_id (không có dữ liệu cá nhân của tenant)

10Trường hợp biên

11Câu hỏi còn mở

Trường Số (truongso.net) · Nội bộ FLYER