Trường Số PRD/05 Tài chính
Trường Số · Yêu cầu sản phẩm · 09/2026

PRD 05 · Học phí và tài chính

Gói học phí và gói buổi, hoá đơn và phiếu thu, thanh toán tiền mặt và chuyển khoản có đối soát qua SePay, giảm giá và mã giảm giá, công nợ theo tuổi nợ, hoàn tiền và phiếu giảm, phiếu chi, điểm kết nối hoá đơn điện tử, và báo cáo doanh thu. Tái sử dụng các đối tượng Tuition, GroupInvoice, Course, tài khoản ngân hàng và công ty đã có sẵn.

Xuất xứ / Prompt / Giới hạn
Trạng thái
Dự thảo v1
Mô-đun phụ trách
Tài chính
Backend
EXISTING Tuition/GroupInvoice/SePay · NEW fee plans, packages, vouchers, refunds, expenses, e-invoice
Giai đoạn
P1 cốt lõi · P2 mã giảm giá, hoàn tiền, phiếu chi, hoá đơn điện tử
Phụ thuộc vào
02 Học viên, 03 Lớp học, 04 Điểm danh

Tài liệu do trợ lý AI soạn trong một phiên làm việc ngày 10/09/2026, theo yêu cầu gốc được trích nguyên văn ở trang mục lục; mục Thiết kế đề xuất được bổ sung ngày 16/09/2026. Đâ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.

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:
    • Luồng học phí của đối thủ "đăng ký gói học, nộp tiền, đặt lịch" và "chốt số buổi còn": cách gói buổi và số buổi còn lại được mô hình hoá.
    • Các trường, cách đánh số và phân nhóm của phiếu thu và phiếu chi.
    • Các trường của mã giảm giá: theo phần trăm hay số tiền, dùng một lần hay nhiều lần, phạm vi áp dụng.
    • Liệu có tự động khớp chuyển khoản hay chỉ ghi nhận thủ công.
    • Cách "công nợ" được hiển thị (theo học viên, theo hoá đơn) và liệu có phân loại theo tuổi nợ hay không.
    • Liệu đã có tích hợp hoá đơn điện tử hay chưa, và với nhà cung cấp nào.

Thiết kế đề xuất

Bảy màn hình dùng chung khung School OS: danh sách hoá đơn với KPI và tuổi nợ, biểu mẫu tạo hoá đơn dạng ngăn kéo, chi tiết hoá đơn với bảng thanh toán, hộp thoại thu tiền có đối soát SePay, công nợ theo nhóm tuổi nợ, sổ quỹ với phiếu chi và cấu hình gói học phí. Điều quan trọng nhất: mọi ngoại lệ về tiền (vượt hạn mức giảm giá, vượt ngưỡng phiếu chi, quá hạn) đều hiện thành trạng thái Chờ duyệt hoặc chip đỏ ngay trong danh sách, không giấu trong chi tiết.

1 · Học phí

/finance/tuition · desktop

Danh sách hoá đơn học phí
Bốn ô KPI (đã lập, đã thu, còn phải thu, quá hạn), tab theo trạng thái thanh toán và bảng đủ mười cột như mục 5. Hàng quá hạn tô đỏ cột Còn lại kèm chip số ngày quá hạn (FIN-06); hàng giảm giá vượt hạn mức đứng ở trạng thái Chờ duyệt (quy tắc 6); hàng Đã huỷ chỉ còn thao tác In vì hoá đơn void không có thanh toán (quy tắc 2).

2 · Biểu mẫu hoá đơn

/finance/tuition/new?student_id= · desktop

Ngăn kéo tạo hoá đơn
Ngăn kéo mở trên danh sách với hai dòng mục: gói buổi (VAT 0%) và tài liệu mặc định của gói (VAT 5%). Tư vấn tuyển sinh nhập giảm 15% vượt hạn mức 10% của vai trò nên ô báo lỗi và khung cảnh báo nêu rõ hoá đơn sẽ ở trạng thái Chờ duyệt (FIN-02, quy tắc 6); mã giảm giá được kiểm tra hợp lệ và chỉ kết hợp khi được đánh dấu (quy tắc 7). Chân ngăn kéo tính tạm tính, giảm giá, mã giảm giá, VAT, tổng theo quy tắc 1 và nút chính đổi thành "Tạo và gửi duyệt".

3 · Chi tiết hoá đơn

/finance/tuition/:id · desktop

Chi tiết hoá đơn
Phần đầu gồm mã, học viên, chip trạng thái và bốn chỉ số tổng tiền, đã thu, còn lại, hạn. Bảng thanh toán có số phiếu thu theo chi nhánh và tháng (quy tắc 3), khoản chuyển khoản mang mã SePay và người thu là "Tự động" (FIN-05), khoản tiền mặt có người thu; phiếu giảm còn trống (FIN-08), nhật ký nhắc và cột phải gồm trả góp, khối hoá đơn điện tử chưa xuất (FIN-11) và nhật ký thay đổi (quy tắc 11). Nút Huỷ không khả dụng vì đã có thanh toán.

4 · Hộp thoại thanh toán

/finance/tuition/:id/pay · desktop

Hộp thoại thu tiền
Hộp thoại thu tiền trên chi tiết hoá đơn: khung đầu cho biết giao dịch SePay đã khớp theo payment code và không bị trùng (FIN-05, trường hợp biên webhook gửi lại); số tiền 2.000.000 ₫ nhỏ hơn số còn lại nên hệ thống ghi thanh toán một phần và chặn vượt số cần thu (quy tắc 2); ngày mặc định hiện tại và không được chọn tương lai; công tắc gửi biên lai Zalo (FIN-04) và số phiếu thu sẽ cấp hiển thị trước khi ghi nhận.

5 · Công nợ

/finance/debt · desktop

Danh sách công nợ theo tuổi nợ
Năm ô tổng hợp theo nhóm tuổi nợ 0–7, 8–30, 31–60 và trên 60 ngày (FIN-06), nhóm trên 60 ngày đánh dấu ưu tiên. Bảng theo học viên đủ các cột số điện thoại phụ huynh, số hoá đơn, tổng nợ, hạn xa nhất, nhóm tuổi nợ, nhắc gần nhất, ngày hẹn trả và người phụ trách; ba học viên đang được chọn để gửi nhắc theo lô với mẫu tin, thao tác dòng gồm Thu tiền, Gửi nhắc và menu Ghi cuộc gọi, Kế hoạch trả.

6 · Thu chi

/finance/cashbook · desktop

Sổ quỹ với bộ lọc phiếu chi
Sổ quỹ đang lọc Loại: Chi theo nhóm chi phí, các ô trên cho biết số dư quầy tiền mặt, tài khoản SePay, tổng chi theo bộ lọc và phiếu chờ duyệt. Phiếu chi thuê mặt bằng 25.000.000 ₫ vượt ngưỡng 5.000.000 ₫ nên đứng ở Chờ duyệt (FIN-10, quy tắc 9); khoản hoàn tiền xuất hiện như một khoản chi gắn phiếu giảm (FIN-08). Tab Chưa đối soát đếm ba giao dịch SePay chưa khớp và nút Chốt quỹ ngày khoá các khoản trong ngày (quy tắc 10).

7 · Gói học phí

/settings/fee-plans · desktop

Cấu hình gói học phí
Danh sách nhóm theo khoá học với bốn loại gói (trọn khoá, theo tháng, gói buổi, tài liệu đi kèm); gói ngừng hoạt động vẫn giữ trên hoá đơn cũ (FIN-01). Ngăn kéo sửa gói gồm loại, giá, số buổi, số tháng hiệu lực, trả góp, VAT, tài liệu mặc định và công tắc hoạt động; phần ghi chú nhắc cấu hình tenant về thời điểm cộng buổi (quy tắc 4).

1Mục đích

Các trung tâm bán việc học theo ba hình thức: một khoá học trả một lần (hoặc trả góp), một mức học phí theo tháng, hoặc một gói N buổi học được trừ dần theo điểm danh. Trung tâm thu tiền qua chuyển khoản kèm mã QR, tiền mặt tại quầy, và đôi khi qua thẻ. Trung tâm cần một phiếu thu khiến phụ huynh tin tưởng, một danh sách công nợ mà bộ phận lễ tân có thể xử lý, và một bức tranh hằng tháng về doanh thu, số tiền đã thu và chi phí theo từng chi nhánh. Backend hiện đã có đối tượng Tuition với chi phí, giảm giá, VAT, trạng thái thanh toán, các giao dịch (tiền mặt và chuyển khoản) và tài khoản ngân hàng đã xác thực qua SePay, một hoá đơn nhóm (group invoice) cho việc lập hoá đơn hàng loạt theo tháng, một hồ sơ pháp lý công ty và tính năng tạo mã QR thanh toán. PRD này bổ sung các gói học phí, gói buổi có số dư, thanh toán một phần và đánh số phiếu thu, mã giảm giá, hoàn tiền, phiếu chi và điểm kết nối hoá đơn điện tử.

Trong phạm vi

Ngoài phạm vi

2Hiện trạng

Đối tượng / endpointTrường và hành viTái sử dụng
Tuition (/v3/teacher/school-finance/tuitions)student, class_id, course, title, description, note, cost, amount, discount_pct, vat_pct, payment_status UNPAID|PAID, overdue, notification_status, paid_amount, payment_code, bank_account_id, due_date, paid_at, teacher; chi tiết bổ sung bank_account, qr_url, transactions[]Là hoá đơn (invoice). Mở rộng thêm fee_plan, dòng mục, trạng thái PARTIAL, phiếu thu
POST .../tuitions (CreateTuitionRequest)students[{student_id, cost, amount, discount_pct, note}], class_id, course_id, title, description, vat_pct, bank_account_id, due_dateTạo theo lô cho từng lớp; giữ nguyên
POST .../tuitions/{id}/pay (PayTuitionRequest)amount, method CASH|BANK_TRANSFER, note → TuitionTransaction (sepay_transaction_id khi khớp được)Là khoản thanh toán (payment). Mở rộng thêm phương thức CARD, số phiếu thu, người thu tiền (cashier)
GroupInvoicetitle, course_id, classes[], totals, notify_app/zalo/emailLượt lập hoá đơn hàng tháng
tuitions/stats, classes/{id}/students/tuitions (month groups), students/{id}/tuitions, students/{id}/statstổng số liệu, theo lớp, theo học viênBáo cáo và hồ sơ
tuitions/{id}/notify, tuitions/notify (batch)kênh app, email, zalo kèm kết quả theo từng kênh và lý do bỏ quaNhắc học phí
SchoolBankAccount, link-token, manual accountsKết nối SePay hoặc thủ công; cờ đang hoạt độngTài khoản nhận tiền theo từng chi nhánh
SchoolCompanylegal_name, type ENTERPRISE|INDIVIDUAL, tax_id or citizen_id, address, issued info, sepay_company_xidĐơn vị phát hành phiếu thu và hoá đơn điện tử
POST /v3/payment/qraccount, bank id, amount, add_info → QRMã QR thanh toán kèm payment_code
Courseprice, pricing_method ONE_TIME|MONTHLY, split_payment_countNền tảng cho các gói học phí
/v3/parent/tuitions, /overviewgiao diện phụ huynh xem hoá đơn theo từng conCổng phụ huynh
CRM packages, customers/{id}/packagesdanh mục bán hàng và giá trị dự kiến trên một leadChỉ dùng trước khi bán; không phải gói học phí

3Khái niệm và các loại gói học phí

Loại gói học phíVICách lập hoá đơnSố dưVí dụ
one_timeTrọn khoáMột hoá đơn khi nhập học; có thể trả góp (n phần với ngày đến hạn)không có; quyền học kết thúc khi lớp kết thúcMovers 2 · 48 buổi · 9.600.000
monthlyTheo thángLập hoá đơn mỗi tháng qua lượt lập hoá đơn (GroupInvoice), tháng đầu tính theo tỷ lệ số buổi họckhông có1.200.000 / tháng
session_packageGói buổiLập hoá đơn khi mua; số buổi được cộng vào số dư của học viên, có hạn sử dụngsessions_remainingGói 24 buổi · 6.000.000 · hạn 6 tháng
materialTài liệu / phí khácDòng mục trên bất kỳ hoá đơn nào (sách, đồng phục, phí thi)không cóSách Family and Friends 2 · 180.000

Một hoá đơn (đối tượng Tuition đã có) có các dòng mục, một khoản giảm giá, VAT, một ngày đến hạn, một trạng thái thanh toán unpaid | partial | paid | void và các khoản thanh toán. Một phiếu thu được phát hành cho mỗi lần thanh toán, đánh số tuần tự theo từng chi nhánh. Một phiếu giảm hoàn lại một phần giá trị của hoá đơn; một khoản hoàn tiền là một khoản chi gắn với một phiếu giảm. Một phiếu chi là một khoản chi không gắn với học viên. Sổ quỹ liệt kê toàn bộ các khoản thu và chi theo từng tài khoản (quầy tiền mặt hoặc tài khoản ngân hàng).

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

FIN-01Định nghĩa gói học phí cho một khoá học
Kế toán thiết lập cách một khoá học được bán.
  • Given Có một khoá học
  • When Thêm các gói học phí (loại, tên, giá, số buổi, số tháng có hiệu lực, số lần trả góp, mức VAT, tài liệu mặc định)
  • Then Các gói xuất hiện trong wizard chuyển đổi và biểu mẫu nhập học; một khoá học có thể có nhiều gói; các gói đã ngừng hoạt động vẫn được giữ trên các hoá đơn cũ.
FIN-02Tạo hoá đơn cho một học viên
Lễ tân hoặc kế toán lập hoá đơn cho một học viên.
  • Given Có một học viên và quyền finance.invoice.create
  • When Chọn gói học phí hoặc các dòng tự do, số lượng, giảm giá (theo phần trăm hoặc số tiền, kèm lý do), mã giảm giá, ngày đến hạn, tài khoản nhận tiền
  • Then Một hoá đơn được tạo (dùng chức năng tạo Tuition hiện có) với các dòng mục, tổng tiền, VAT, payment_code và mã QR; giảm giá vượt hạn mức của người dùng đặt trạng thái pending_approval và thông báo cho quản lý chi nhánh; một gói buổi được cộng số buổi khi thanh toán đủ (hoặc ngay khi tạo hoá đơn nếu cấu hình tenant "cấp buổi khi tạo hoá đơn" được bật).
FIN-03Lập hoá đơn hàng tháng theo lô
Kế toán lập hoá đơn cho toàn bộ học viên đóng theo tháng trong một lượt.
  • Given Có các lớp dùng gói học phí theo tháng
  • When Chạy "Lập hoá đơn tháng 10" cho các lớp đã chọn
  • Then Một GroupInvoice được tạo với một Tuition cho mỗi lượt ghi danh đang hoạt động, tính theo tỷ lệ cho học viên bắt đầu học giữa tháng dựa trên số buổi còn lại trên tổng số buổi trong tháng, bỏ qua các học viên đang bảo lưu trong toàn bộ tháng đó, kèm bảng xem trước trước khi xác nhận và thông báo theo kênh đã chọn.
FIN-04Ghi nhận thanh toán tiền mặt và phát hành phiếu thu
Thủ quỹ thu tiền mặt tại quầy.
  • Given Có một hoá đơn chưa thanh toán hoặc thanh toán một phần
  • When Ghi nhận số tiền, phương thức Tiền mặt, tên người thanh toán
  • Then Một khoản thanh toán được tạo (dùng endpoint thanh toán hiện có, đã mở rộng), số phiếu thu PT-<branch>-YYYYMM-#### được cấp, một bản PDF phiếu thu được tạo kèm thông tin pháp lý của công ty, và phụ huynh nhận được phiếu qua Zalo nếu đã đồng ý; hoá đơn chuyển sang trạng thái thanh toán một phần hoặc đã thanh toán.
FIN-05Chuyển khoản được tự động khớp
Kế toán không cần nhập tay các giao dịch chuyển khoản.
  • Given Có một tài khoản đã liên kết SePay và một hoá đơn có payment_code trong mã QR
  • When Khi giao dịch chuyển khoản đến với mã trong nội dung chuyển khoản
  • Then Khoản thanh toán được tạo tự động kèm sepay_transaction_id, phiếu thu được phát hành, phụ huynh được thông báo; các giao dịch chuyển khoản không khớp được mã sẽ vào mục "Chưa đối soát" để đối soát thủ công với một hoá đơn hoặc số dư của học viên; số tiền chuyển một phần được chấp nhận là thanh toán một phần.
FIN-06Danh sách công nợ và nhắc học phí
Nhân viên lễ tân đôn đốc các hoá đơn quá hạn.
  • Given Có các hoá đơn đã quá ngày đến hạn
  • When Mở Công nợ
  • Then Xem được danh sách học viên còn nợ, phân theo nhóm tuổi nợ (0–7, 8–30, 31–60, trên 60 ngày), ngày nhắc gần nhất, ngày hẹn thanh toán; có thể gửi nhắc theo lô (dùng chức năng gửi thông báo theo lô hiện có) với một mẫu tin, ghi lại cuộc gọi, hoặc đặt một kế hoạch trả góp (chia thành các phần theo ngày).
FIN-07Trừ số dư gói buổi
Hệ thống tự động tính số buổi dựa trên số dư của học viên.
  • Given Học viên có 24 buổi đã được cộng vào số dư
  • When Khi điểm danh ghi nhận có mặt, muộn hoặc vắng (theo chính sách)
  • Then Số dư bị trừ theo nguyên tắc FIFO giữa các gói theo hạn sử dụng; khi còn 3 buổi, phụ huynh và lễ tân được thông báo "Sắp hết buổi"; khi còn 0 buổi, học viên xuất hiện trong mục "Hết buổi" và danh sách lớp hiển thị chip màu đỏ; bảo lưu sẽ đóng băng hạn sử dụng.
FIN-08Hoàn tiền khi nghỉ học
Kế toán hoàn lại giá trị chưa sử dụng.
  • Given Học viên đã nghỉ học còn buổi chưa dùng hoặc tháng chưa dùng
  • When Tạo một phiếu giảm (đề xuất tính tự động: số buổi chưa dùng nhân đơn giá, trừ phí xử lý theo chính sách, có thể chỉnh sửa kèm lý do) và một khoản thanh toán hoàn tiền (tiền mặt hoặc chuyển khoản)
  • Then Hoá đơn hiển thị khoản giảm, khoản hoàn tiền xuất hiện trong sổ quỹ như một khoản chi, số dư được đặt về 0, và cần quản lý chi nhánh phê duyệt nếu vượt ngưỡng cấu hình của tenant.
FIN-09Mã giảm giá
Phụ trách marketing phát hành mã khuyến mãi.
  • Given Có một nhóm mã giảm giá
  • When Tạo các mã (dùng một lần hoặc nhiều lần, theo phần trăm hoặc số tiền, số tiền tối thiểu, khoá học áp dụng, chi nhánh, thời hạn hiệu lực, số lần dùng tối đa)
  • Then Các mã có thể được áp dụng khi tạo hoá đơn, có kiểm tra hợp lệ và theo dõi số lần sử dụng theo từng học viên.
FIN-10Phiếu chi và sổ quỹ
Kế toán ghi nhận các khoản chi ra.
  • Given Có quyền finance.expense.create
  • When Tạo một phiếu chi với nhóm chi phí, số tiền, người nhận, tài khoản (quầy tiền mặt hoặc ngân hàng), ngày, tệp đính kèm
  • Then Phiếu chi xuất hiện trong sổ quỹ; các khoản chi vượt ngưỡng cần được phê duyệt; việc chốt quỹ hằng ngày so sánh số dư thực tế trong quầy với số tiền đã ghi nhận.
FIN-11Hoá đơn điện tử
Kế toán phát hành hoá đơn điện tử hợp lệ cho một hoá đơn đã thanh toán khi phụ huynh yêu cầu.
  • Given Có một hoá đơn đã thanh toán và một nhà cung cấp đã được cấu hình (giao diện adapter; nhà cung cấp đầu tiên được chọn ở P2)
  • When Chọn Xuất hoá đơn điện tử và nhập thông tin người mua
  • Then Yêu cầu được gửi đến nhà cung cấp, số hoá đơn và mã tra cứu trả về được lưu trên hoá đơn, và liên kết PDF sẽ có sẵn; nếu thất bại, thông báo lỗi từ nhà cung cấp được hiển thị kèm tuỳ chọn thử lại.
FIN-12Báo cáo
Chủ trung tâm theo dõi tình hình tài chính.
  • Given Có một khoảng thời gian và chi nhánh
  • When Mở Báo cáo tài chính
  • Then Xem được số tiền đã lập hoá đơn, đã thu, còn phải thu, quá hạn, hoàn tiền, chi phí, tiền mặt thực còn, tỷ lệ thu tiền, doanh thu theo khoá học và theo loại gói học phí, doanh thu hoãn lại (giá trị các buổi chưa sử dụng), có thể xem chi tiết từng hoá đơn và xuất file.

5Màn hình

Học phí (invoices) /finance/tuition

Các ô KPI: Đã lập tháng này, Đã thu, Còn phải thu, Quá hạn. Các tab: Tất cả · Chưa thanh toán · Thanh toán một phần · Quá hạn · Chờ duyệt · Đã thanh toán · Đã huỷ. Bộ lọc: chi nhánh, lớp, khoá học, loại gói học phí, khoảng ngày đến hạn, khoảng ngày tạo, q (học viên, mã, payment code). Nút: + Tạo hoá đơn, Lập hoá đơn tháng, Xuất Excel.

CộtGhi chú
Mã HĐpayment_code
Học viêntên + chip lớp
Nội dungtitle (tên gói học phí)
Tổng tiềnamount sau khi giảm giá và VAT
Đã thupaid_amount
Còn lạiamount - paid; màu đỏ khi quá hạn
Hạndue_date; chip số ngày quá hạn
Trạng tháichip
Nhắc gần nhấtngày + kênh
Thao tácThu tiền · Gửi nhắc · In
Biểu mẫu hoá đơn (drawer) /finance/tuition/new?student_id=
TrườngKiểu dữ liệuRàng buộc
Học viêntìm kiếmbắt buộc
Lớpchọn từ các lớp của học viênkhông bắt buộc
Dòngcó thể lặp lại: gói học phí hoặc tài liệu hoặc dòng tự do; số lượng; đơn giá; giảm giá theo dòng≥ 1 dòng; giá ≥ 0
Giảm giátheo phần trăm hoặc số tiền + lý do + mã giảm giá≤ hạn mức, nếu vượt cần phê duyệt
VATphần trăm theo từng dòng, mặc định lấy từ gói0–10
Hạn thanh toánngàymặc định hôm nay + 7 ngày
Trả gópcông tắc: chia thành n phần kèm ngày và số tiềntổng các phần bằng tổng hoá đơn
Tài khoản nhậnchọn từ các tài khoản ngân hàng đang hoạt động của chi nhánhbắt buộc để tạo QR
Ghi chúvăn bản
Gửi thông báokênh app / Zalo / emailmặc định lấy từ cấu hình

Phần chân hiển thị tạm tính, giảm giá, VAT, tổng tiền; sau khi lưu hiển thị mã QR và nút "Thu tiền ngay".

Chi tiết hoá đơn /finance/tuition/:id

Phần đầu: mã hoá đơn, học viên, chip trạng thái, tổng tiền, đã thu, còn lại, hạn thanh toán. Các phần: dòng mục; bảng thanh toán (ngày, phương thức, số tiền, số phiếu thu, người thu tiền, mã SePay, PDF); phiếu giảm; nhật ký nhắc; khối hoá đơn điện tử; nhật ký thay đổi. Nút: Thu tiền, Gửi nhắc, In hoá đơn, Tạo phiếu giảm, Huỷ (chỉ khi chưa có thanh toán nào), Xuất HĐĐT.

Hộp thoại thanh toán /finance/tuition/:id/pay

Các trường: số tiền (mặc định là số còn lại), phương thức (Tiền mặt / Chuyển khoản / Thẻ), tài khoản (quầy tiền mặt của chi nhánh hoặc tài khoản ngân hàng), tên người thanh toán, ngày (mặc định là hiện tại, không được chọn ngày trong tương lai), ghi chú, công tắc "Gửi biên lai Zalo". Kết quả: số phiếu thu, xem trước PDF, in.

Công nợ (debt) /finance/debt

Các ô tổng hợp theo tuổi nợ; bảng theo từng học viên: học viên, số điện thoại phụ huynh, số hoá đơn, tổng nợ, ngày đến hạn xa nhất, nhóm tuổi nợ, lần nhắc gần nhất, ngày hẹn trả, người phụ trách chăm sóc; thao tác theo dòng: Gửi nhắc, Ghi cuộc gọi, Kế hoạch trả, Thu tiền. Theo lô: Gửi nhắc (chọn mẫu tin).

Thu chi (cash book) /finance/cashbook

Bộ lọc: chi nhánh, tài khoản, khoảng ngày, loại (thu/chi), nhóm. Bảng: ngày, mã (PT/PC), loại, nhóm, đối tượng giao dịch, số tiền thu, số tiền chi, tài khoản, người tạo, tệp đính kèm. Nút: + Phiếu chi, Chốt quỹ ngày (hiển thị số dự kiến so với số đã kiểm với chênh lệch và ghi chú). Tab Chưa đối soát liệt kê các giao dịch SePay chưa khớp, kèm nút "Gán vào hoá đơn".

Gói học phí (cài đặt) /settings/fee-plans

Nhóm theo khoá học. Biểu mẫu: tên, loại, giá, số buổi (đối với gói buổi), số tháng hiệu lực, số lần trả góp và quy tắc, VAT, tài liệu mặc định, đang hoạt động. Nhóm mã giảm giá và các mã nằm ở /settings/vouchers; nhóm chi phí nằm ở /settings/expense-categories; đánh số phiếu thu và thông tin công ty nằm ở /settings/finance.

6Quy tắc nghiệp vụ

  1. Tổng hoá đơn = Σ(qty × unit_price - line_discount) - invoice_discount + VAT. Làm tròn đến VND nguyên.
  2. Trạng thái thanh toán: unpaid (đã thu 0), partial (0 < đã thu < tổng), paid (đã thu ≥ tổng), void (không có thanh toán, đã huỷ). Thanh toán vượt quá số cần thu bị từ chối; phần vượt chỉ trở thành số dư của học viên qua luồng xử lý chuyển khoản chưa đối soát.
  3. Phiếu thu được đánh số theo từng chi nhánh, theo từng tháng, tuần tự và không tái sử dụng; huỷ một khoản thanh toán vẫn giữ nguyên số phiếu với trạng thái void và yêu cầu một lý do.
  4. Số buổi từ một gói được cộng khi thanh toán đủ theo mặc định; tenant có thể chọn cộng ngay khi tạo. Hạn sử dụng = ngày cộng buổi + thời hạn hiệu lực, được kéo dài theo các lần bảo lưu.
  5. Thứ tự trừ buổi: gói có hạn sử dụng gần nhất bị trừ trước; việc trừ một buổi từ gói đã hết hạn bị từ chối và học viên hiển thị "Hết hạn gói".
  6. Hạn mức giảm giá theo từng vai trò (mặc định: tư vấn tuyển sinh 10%, giáo vụ 5%, kế toán 15%, quản lý chi nhánh 30%, chủ trung tâm không giới hạn) là cấu hình của tenant; vượt hạn mức cần phê duyệt.
  7. Mã giảm giá: mỗi hoá đơn chỉ dùng một mã; không kết hợp được với giảm giá theo phần trăm lớn hơn 0, trừ khi được đánh dấu có thể kết hợp (stackable).
  8. Phiếu giảm không được vượt quá tổng hoá đơn trừ đi các khoản giảm trước đó; hoàn tiền không được vượt quá số đã thu trừ đi các khoản hoàn tiền trước đó.
  9. Phiếu chi và hoàn tiền vượt ngưỡng cấu hình của tenant (mặc định 5.000.000) cần quản lý chi nhánh hoặc chủ trung tâm phê duyệt.
  10. Quầy tiền mặt được quản lý theo từng chi nhánh; chốt quỹ hằng ngày khoá các khoản thanh toán trong ngày đó khỏi việc chỉnh sửa (chỉ được huỷ/void).
  11. Mọi thay đổi liên quan đến tiền đều được ghi nhật ký với trạng thái trước/sau (PRD 12).

7Mô hình dữ liệu

Thực thểTrườngGhi chú
fee_planid uuid; tenant_id; course_id null; name; type enum(one_time, monthly, session_package, material); price; sessions int null; validity_months null; instalments jsonb null [{pct, days_after}]; vat_pct; default_material_ids uuid[]; is_activenew
tuition (existing Tuition)+ fee_plan_id; status enum extends PAID/UNPAID with PARTIAL, VOID, PENDING_APPROVAL; discount_amount; discount_reason; voucher_id; approved_by; instalment_of uuid null; einvoice jsonb {provider, number, lookup_code, pdf_url, issued_at}extend
tuition_lineid; tuition_id; type enum(fee, material, other); fee_plan_id null; inventory_item_id null; description; qty; unit_price; discount; vat_pct; amountnew
payment (existing TuitionTransaction)+ method CARD; receipt_no; account_id (cash drawer or bank); payer_name; paid_at; cashier_staff_id; status enum(valid, void); void_reason; receipt_pdf_file_idextend
session_packageid; student_id; tuition_id; fee_plan_id; sessions_total; sessions_used; credited_at; expires_on; frozen_days; status enum(pending, active, exhausted, expired, refunded)new
session_consumptionid; package_id; attendance_record_id; consumed_at; reversed_at nullnew
credit_noteid; tuition_id; amount; reason; created_by; approved_by; created_atnew
refundid; credit_note_id; amount; method; account_id; paid_to; paid_at; receipt_no (PC); statusnew (khoản chi)
expenseid; school_id; code PC-; category_id; amount; payee; account_id; date; note; file_id; created_by; approved_by; statusnew
cash_accountid; school_id; type enum(cash_drawer, bank); bank_account_id null; name; is_activenew; các dòng ngân hàng ánh xạ theo SchoolBankAccount
cash_closeid; cash_account_id; date; expected; counted; difference; note; closed_bynew
voucher_group, voucher, voucher_usegroup: name, type percent|amount, value, min_amount, course_ids, school_ids, valid_from, valid_to, max_uses; voucher: code, single_use; use: voucher_id, tuition_id, student_id, used_atnew
unmatched_transactionid; bank_account_id; sepay_transaction_id; amount; description; received_at; matched_tuition_id null; matched_bynew
finance_settingsreceipt_prefix; numbering_scope; credit_on_create bool; discount_limits {role: pct}; approval_thresholds; einvoice_provider config (encrypted)cấu hình tenant

8Hợp đồng API

MethodPathRequest / responseStatus
GET/POST/PUT/DELETE/v3/teacher/school-finance/course/courses[...]thông tin cơ bản của khoá họcexisting
GET/POST/PATCH/v3/school/fee-plans[/{id}]lọc theo course_idnew
GET/v3/teacher/school-finance/tuitionsbộ lọc như hiện tại, cộng thêm fee_plan_type, status gồm cả PARTIAL, aging_bucketextend
POST/v3/teacher/school-finance/tuitionsnhư hiện tại, cộng thêm lines[], discount_amount, discount_reason, voucher_code, instalments[] → 202 PENDING_APPROVAL khi vượt hạn mứcextend
GET/v3/teacher/school-finance/tuitions/{id}+ lines, credit_notes, reminders, einvoice, packageextend
POST/v3/teacher/school-finance/tuitions/{id}/pay{amount, method CASH|BANK_TRANSFER|CARD, account_id, payer_name, paid_at?, note, send_receipt} → khoản thanh toán kèm receipt_no, pdfextend
POST/v3/school/payments/{id}/void{reason}new
GET/v3/school/payments/{id}/receipt.pdfđường dẫn đã ký (signed URL)new
POST/v3/school/tuitions/{id}/approve | /reject{note}new
POST/v3/school/tuitions/{id}/void{reason}; chỉ khi chưa có thanh toán hợp lệ nàonew
POST/v3/teacher/school-finance/tuitions/{id}/notify, /tuitions/notifynhắc học phí; bổ sung template_idextend
GET/POST/v3/teacher/school-finance/group-invoicesbổ sung POST với {title, month, class_ids[], fee_plan_id?, prorate: bool, notify: {app, zalo, email}, dry_run}extend
GET/v3/school/debtschool_id, bucket, class_id, q → số liệu tổng hợp theo từng học viênnew
POST/v3/school/tuitions/{id}/payment-plan{parts: [{amount, due_date}]}new
GET/v3/school/students/{id}/packagesdanh sách gói buổi kèm lịch sử tiêu thụnew
POST/v3/school/packages/{id}/adjust{sessions_delta, reason} cộng/trừ buổi thủ công (cần phê duyệt)new
POST/v3/school/tuitions/{id}/credit-notes{amount, reason} → phiếu giảm (cần phê duyệt nếu vượt ngưỡng)new
POST/v3/school/credit-notes/{id}/refund{amount, method, account_id, paid_to}new
GET/v3/school/refund-estimate?student_id=đề xuất tính theo chính sáchnew
GET/POST/PATCH/v3/school/expenses[/{id}]; POST /approvenew
GET/POST/v3/school/expense-categoriesnew
GET/v3/school/cashbookschool_id, account_id, from, to, type, category → danh sách; format=xlsxnew
GET/POST/v3/school/cash-accounts; POST /v3/school/cash-accounts/{id}/close{date, counted, note}new
GET/POST/v3/school/unmatched-transactions; POST /{id}/match{tuition_id | student_id (ghi vào số dư)}new
GET/POST/PATCH/v3/school/voucher-groups, /vouchers; POST /vouchers/validate{code, student_id, course_id, amount} → giá trị giảm hoặc lỗinew
POST/v3/school/tuitions/{id}/einvoice{buyer: {name, tax_id?, address, email}} → kết quả từ nhà cung cấpnew
GET/v3/school/finance/reportschool_id, from, to, group_by → billed, collected, outstanding, overdue, refunds, expenses, deferred; seriesnew
GET/POST/PUT/DELETE/v3/teacher/school-finance/bank-accounts[...], /company, /link-tokenkhông thay đổiexisting
POST/v3/payment/qrkhông thay đổiexisting
GET/v3/parent/tuitions, /{id}, /overviewgiao diện phụ huynh; bổ sung phiếu thu và số dư gói buổiextend

9Phân quyền

Mã quyềnownerbranch_manageraccountantacademic_adminadmissionsteacherparent
finance.viewtất cảchi nhánhchi nhánhchi nhánh (số dư)hoá đơn của các lead mình phụ tráchkhôngcon của mình
finance.invoice.createcócócócóqua chuyển đổikhôngkhông
finance.invoice.voidcócócókhôngkhôngkhôngkhông
finance.payment.createcócócótiền mặt nếu được cấp quyềnkhôngkhôngkhông
finance.payment.voidcócócókhôngkhôngkhôngkhông
finance.discount.approvecócókhôngkhôngkhôngkhôngkhông
finance.refundcóphê duyệttạokhôngkhôngkhôngkhông
finance.expensecóphê duyệttạokhôngkhôngkhôngkhông
finance.cashbook, finance.closecóchỉ xemcókhôngkhôngkhôngkhông
finance.reminderscócócócókhôngkhôngkhông
finance.vouchers, finance.settings, finance.einvoicecókhôngcấu hình, hoá đơn điện tửkhôngkhôngkhôngkhông
finance.report, finance.exportcóchi nhánhcókhôngkhôngkhôngkhông

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

Sự kiệnThuộc tính
invoice_createdfee_plan_type, lines, discount_pct_bucket, voucher, approval_required, via (wizard|form|bulk)
billing_run_createdclasses, invoices, prorated_count
payment_recordedmethod, partial, auto_matched, receipt_sent
transfer_unmatched / transfer_matchedage_hours
reminder_sentchannel, bucket, bulk
package_low / package_exhausted
credit_note_created / refund_paidamount_bucket, approval
expense_created / cash_closedcategory, difference_nonzero
einvoice_issued / einvoice_failedprovider
finance_report_viewedperiod, group_by

11Trường hợp biên

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

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