Trường Số PRD/03 Lớp học
Trường Số · Yêu cầu sản phẩm · 09/2026

PRD 03 · Lớp học và lịch học

Khoá học, lớp học, phòng học, lịch học lặp lại để sinh ra các buổi học thực tế, các chế độ xem thời khoá biểu, sĩ số, ghi danh, phân công giáo viên và dạy thay, và các buổi học bù. Mở rộng các đối tượng Class, ClassSchedule và Course đã có sẵn, bổ sung phòng học và các buổi học đã được cụ thể hoá.

Xuất xứ / Prompt / Giới hạn
Trạng thái
Dự thảo v1
Mô-đun phụ trách
Lớp học
Backend
EXTEND Class, ClassSchedule, Course · NEW room, session, enrollment
Giai đoạn
P1
Phụ thuộc vào
02 Học viên, 06 Nhân sự

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:
    • Các thông tin đầu vào của "lịch học tự động" ở đối thủ: buổi học có được sinh thành các dòng dữ liệu không và ngày nghỉ lễ được xử lý thế nào.
    • Có tồn tại khái niệm phòng học không và trùng lịch có được kiểm tra không.
    • "Phân lớp giáo viên" và "xếp lịch giáo viên theo tuần" trông như thế nào (dạng lưới hay dạng danh sách).
    • Cách họ xử lý học bù ("học bù") và liệu nó có trừ vào gói buổi không.
    • Sĩ số lớp và cách xử lý danh sách chờ.

Thiết kế đề xuất

Mô-đun xoay quanh ba màn hình: danh sách lớp, chi tiết lớp với các buổi học đã được sinh ra thành từng dòng dữ liệu, và thời khoá biểu theo phòng; điều quan trọng nhất người đọc nên thấy là mọi trùng lịch phòng hoặc giáo viên được phát hiện và hiển thị ngay tại chỗ trước khi lưu.

1 · Danh sách lớp học

/classes · desktop

Danh sách lớp học
Năm tab trạng thái (Đang học · Sắp khai giảng · Đầy · Đã kết thúc · Tất cả), bộ lọc chi nhánh, khoá học, trình độ, giáo viên, ngày trong tuần, khung giờ và Còn chỗ; bảng đủ mười cột của mục 5: mã lớp, tên lớp kèm chip trình độ, lịch, phòng, giáo viên và trợ giảng, sĩ số kèm thanh tiến trình, tiến độ buổi, khai giảng · kết thúc, trạng thái, thao tác. Movers 2B đầy 12/12 hiển thị màu đỏ kèm "2 đang chờ" (CLS-07); menu thao tác từng dòng gồm Xem lịch · Thêm học viên · Điểm danh hôm nay.

2 · Chi tiết lớp · tab Buổi học

/classes/:id (tab Buổi học) · desktop

Chi tiết lớp học, tab Buổi học
Bố cục theo khung lop-hoc của Cloud theme: phần đầu trang, bảy tab và cột bên phải (thông tin lớp có mã lớp sao chép được, tỷ lệ lấp đầy, buổi kế tiếp, tiến độ). Bảng buổi học đủ chín cột với thanh công cụ Tạo buổi · Tạo lại lịch · Nghỉ lễ. Buổi 5 huỷ muộn và được bù cuối khoá (CLS-05), buổi 7 có giáo viên dạy thay (CLS-06), buổi 8 đổi phòng và mang nhãn "Đã điều chỉnh" (CLS-04); thao tác Sửa · Dạy thay · Huỷ hiện theo từng dòng.

3 · Chi tiết lớp · tab Học viên và danh sách chờ

/classes/:id (tab Học viên) · desktop

Chi tiết lớp học, tab Học viên
Bảng danh sách lớp với họ tên, số điện thoại phụ huynh, ngày bắt đầu, trạng thái, số buổi đã học, số dư và cờ; thao tác Chuyển lớp · Kết thúc · Gửi tin theo dòng. Lớp đã đủ 12/12 nên hộp cảnh báo nêu rõ học viên mới sẽ vào danh sách chờ (CLS-07); phần Danh sách chờ có hai học viên xếp theo ngày ghi; một chỗ học thử được giữ riêng (quy tắc sĩ số, mục 6); một học viên đang nợ học phí được gắn cờ đỏ.

4 · Biểu mẫu tạo lớp · bước 1

/classes/new · desktop

Drawer tạo lớp, bước 1
Drawer hai bước với đủ các trường của mục 5: chi nhánh, khoá học (tự điền trình độ, thời lượng, sĩ số, số buổi), tên lớp, mã lớp tự sinh <LEVEL>-<YYMM>-##, giáo viên chính, trợ giảng, phòng, sĩ số, chỗ học thử, chip ngày trong tuần kèm giờ theo từng ngày, khai giảng, kết thúc theo số buổi hoặc theo ngày, ngày nghỉ nạp sẵn từ danh sách của trung tâm, chương trình FLYER. Trường Tên lớp đang báo lỗi trùng tên trong cùng chi nhánh (CLS-02).

5 · Biểu mẫu tạo lớp · bước 2 xem trước

/classes/new (dry_run) · desktop

Drawer tạo lớp, bước 2 xem trước buổi học
Danh sách 30 buổi sẽ được sinh ra kèm bốn ô tóm tắt; hai buổi mang chip Trùng phòng và Trùng giáo viên do API trả về 409 CONFLICT kèm buổi bị trùng (CLS-03). Nút "Vẫn lưu (ghi đè)" chỉ hiện với quyền classes.override_conflict; nút chính là "Tạo lớp và 30 buổi".

6 · Thời khoá biểu theo phòng

/timetable?view=room&week=2026-W38 · desktop

Thời khoá biểu theo phòng
Bộ chuyển Theo phòng · Theo giáo viên · Theo lớp, bộ chọn tuần và ngày, bộ lọc chi nhánh và trình độ, nút In (A4 ngang theo phòng) và Xuất iCal (CLS-09). Lưới theo dòng 30 phút, cột là phòng học, màu khối theo trình độ và có chú giải bằng chữ. Khối Flyers 1C và IELTS Junior 3 (dời từ P.203 đang bảo trì) chồng nhau 30 phút trong P.201 nên được tô đỏ và nêu trong hộp cảnh báo kèm người đã ghi đè (CLS-03, quy tắc trùng phòng ở mục 6).

7 · Phòng học (cài đặt)

/settings/rooms · desktop

Cài đặt phòng học
Bảng phòng học đủ năm cột (tên, chi nhánh, sĩ số, thẻ trang thiết bị, đang hoạt động). Drawer sửa P.203 thể hiện ràng buộc tên không trùng trong cùng chi nhánh và từ chối tắt phòng khi còn 14 buổi học tương lai đang xếp ở đó (ROOM_IN_USE), kèm lối tắt chuyển hàng loạt sang phòng khác.

8 · Chuyển lớp (modal)

/classes/:id (tab Học viên) · desktop

Modal chuyển lớp
Modal chuyển lớp cho Phạm Khánh Ngọc: danh sách lớp đích lọc theo trình độ và còn chỗ, chip mức độ phù hợp trình độ, lớp đầy hiển thị 12/12 màu đỏ; ngày hiệu lực kết thúc ghi danh cũ và mở ghi danh mới cùng ngày (CLS-07); lý do bắt buộc; tuỳ chọn chuyển 20 buổi còn lại của gói, thông báo phụ huynh và đề xuất chỗ trống cho học viên đang chờ. Nút phụ "Kết thúc ghi danh, không chuyển" cho trường hợp kết thúc trước khi lớp kết thúc.

9 · Lịch dạy của giáo viên (di động)

/timetable (chế độ xem theo ngày) · mobile

Lịch dạy của giáo viên trên di động
Chế độ xem theo ngày cho di động (mục 5): các buổi hôm nay của Lê Thu Trang kèm nút mở điểm danh, buổi dạy thay được gắn chip Dạy thay (CLS-06), thông báo dạy thay đã được xác nhận và nút xuất lịch tuần iCal (CLS-09).

1Mục đích

Một trung tâm sống bằng thời khoá biểu của mình. Lớp học cần được tạo nhanh từ một mẫu khoá học, được xếp vào phòng học không trùng lịch, được dạy bởi một giáo viên được phân công kèm cơ chế dạy thay, và tạo ra một danh sách các buổi học cụ thể để điểm danh, gói học phí và lương giáo viên có thể dựa vào. Backend của FLYER đã có lớp học (tên, mã, loại), một mẫu lặp lại (ClassSchedule với days_of_week, time_local, ngày bắt đầu và ngày kết thúc) dùng để tự động gán bài học FLYER, và một danh mục khoá học kèm giá. PRD này bổ sung những gì một trung tâm vật lý cần: phòng học, các buổi học dưới dạng dòng dữ liệu, sĩ số, ghi danh kèm ngày, học bù và các chế độ xem thời khoá biểu.

Trong phạm vi

Ngoài phạm vi

2Hiện trạng

Đối tượngTrườngThiếu
Class / SchoolClass (GET /v3/teacher/classes)id int64, name, code, class_type, student_count, courses[{id, name, price}], created_atchưa có trình độ, phòng học, sĩ số, ngày, giáo viên, trạng thái
ClassSchedule (POST/GET/PUT/DELETE /v3/teacher/class-schedules)class_id, days_of_week[], time_local, timezone, start_date, end_date, is_active, program_type STUDY|BOOK, program ids, delivery_time, deadline_days, lessons[] (rollup with remind status)mỗi lớp chỉ có một lịch học đang hoạt động; chưa có thời lượng, phòng học, giáo viên; lessons là các đơn vị nội dung, không phải buổi học thực tế
Course (/v3/teacher/school-finance/course/courses)name, description, level, number_of_lessons, price, currency, pricing_method ONE_TIME|MONTHLY, split_payment_count, statuschưa có thời lượng buổi học, chưa có nhóm tuổi, chưa có sĩ số mặc định
POST .../classes/{class_id}/coursesattach course to classgiữ nguyên
POST /v3/teacher/class-schedules/{id}/remind, preview-remind-timeFLYER lesson remindersgiữ nguyên
Exam sessions (SessionInput with check_point_id)exam-onlykhông dùng lại cho buổi học của lớp

3Đối tượng sử dụng và vai trò

Đối tượngNhu cầu
Giáo vụTạo lớp học, sinh và điều chỉnh buổi học, lấp đầy sĩ số lớp, xử lý chuyển lớp và học bù, in thời khoá biểu.
Quản lý chi nhánhXem tỷ lệ lấp đầy và tải công việc của giáo viên, phê duyệt việc mở và đóng lớp.
Giáo viênThời khoá biểu tuần của mình, danh sách lớp kèm ghi chú, yêu cầu dạy thay.
Tư vấn tuyển sinhTìm lớp còn chỗ theo trình độ và thời gian để phục vụ học thử và chuyển đổi.
Phụ huynhXem thời khoá biểu của con và các thay đổi (PRD 07).

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

CLS-01Quản lý danh mục khoá học
Nhân sự định nghĩa khoá học một lần.
  • Given Cài đặt → Khoá học hoặc Lớp học → Khoá học
  • When Tạo một khoá học gồm tên, trình độ, nhóm tuổi, số buổi học, thời lượng buổi học, sĩ số mặc định, giá và cách tính giá
  • Then Khoá học được lưu qua endpoint hiện có kèm các trường mở rộng, và xuất hiện trong biểu mẫu tạo lớp.
CLS-02Tạo lớp học kèm lịch học
Nhân sự mở một lớp học.
  • Given Một khoá học
  • When Nhập tên lớp (tự gợi ý "Movers 2 · T3/T5 18:00"), chi nhánh, khoá học, trình độ, giáo viên, trợ giảng (nếu có), phòng học, sĩ số, chỗ học thử, ngày bắt đầu, ngày kết thúc hoặc số buổi học, mẫu ngày trong tuần kèm giờ học theo từng ngày, và các ngày nghỉ lễ cần bỏ qua
  • Then Lớp học được tạo (endpoint hiện có) kèm bản ghi mở rộng, một ClassSchedule được tạo cho các bài học FLYER nếu có chọn chương trình, và N buổi học được sinh ra dưới dạng các dòng dữ liệu gồm ngày, giờ bắt đầu, giờ kết thúc, phòng học, giáo viên; biểu mẫu hiển thị các trùng lịch trước khi lưu.
CLS-03Phát hiện trùng lịch
Nhân sự không bao giờ đặt trùng phòng học hoặc trùng giáo viên.
  • Given Một buổi học đang được tạo hoặc di chuyển
  • When Có một buổi học khác trùng thời gian trong cùng phòng học, hoặc cùng giáo viên, trong cùng chi nhánh (trùng lịch giáo viên được kiểm tra trên cả các chi nhánh)
  • Then API trả về 409 CONFLICT kèm các buổi học bị trùng, và giao diện hiển thị chúng ngay tại chỗ với tuỳ chọn ghi đè "Vẫn lưu" cho quyền classes.override_conflict.
CLS-04Chỉnh sửa một buổi học hoặc cả chuỗi buổi học
Nhân sự dời một buổi học vì ngày nghỉ lễ.
  • Given Một buổi học đã được sinh ra
  • When Thay đổi ngày, giờ, phòng học hoặc giáo viên của buổi học đó
  • Then Chỉ buổi học đó thay đổi và được đánh dấu "Đã điều chỉnh"; chọn "Áp dụng cho các buổi sau" sẽ sinh lại các buổi học kế hoạch trong tương lai (các buổi đã học không bị ảnh hưởng); phụ huynh của học viên đã ghi danh nhận được thông báo thay đổi (PRD 07) nếu tính năng này được bật.
CLS-05Huỷ một buổi học
Nhân sự huỷ một buổi học vì giáo viên bị bệnh.
  • Given Một buổi học đang ở trạng thái kế hoạch
  • When Huỷ buổi học kèm lý do và chọn "Thêm buổi bù cuối khoá" hoặc "Không bù"
  • Then Trạng thái chuyển thành cancelled (hoặc cancelled_late khi huỷ trong vòng 24 giờ, liên quan đến lương ở PRD 06); một buổi học bù được thêm vào sau buổi học cuối cùng nếu được chọn; không buổi học nào bị trừ khỏi gói buổi của học viên; phụ huynh được thông báo.
CLS-06Phân công giáo viên dạy thay
Nhân sự đặt một giáo viên dạy thay cho một buổi học.
  • Given Một buổi học
  • When Đặt giáo viên dạy thay
  • Then Buổi học hiển thị cả giáo viên chính và giáo viên dạy thay; giáo viên dạy thay thấy buổi học này trong thời khoá biểu của mình và có thể điểm danh; PRD 06 tính lương cho giáo viên dạy thay.
CLS-07Ghi danh, chuyển lớp, kết thúc
Nhân sự quản lý danh sách lớp.
  • Given Một lớp học có sĩ số 12 và 11 lượt ghi danh đang hoạt động
  • When Thêm một học viên kèm ngày bắt đầu
  • Then Lượt ghi danh được tạo; khi đạt 12, lớp hiển thị "Đầy" và các lượt thêm tiếp theo được đưa vào danh sách chờ; chuyển sang lớp khác sẽ kết thúc lượt ghi danh vào ngày D và bắt đầu một lượt ghi danh mới vào ngày D (cho phép cùng ngày); kết thúc một lượt ghi danh trước khi lớp kết thúc sẽ yêu cầu nhập lý do (chu trình trạng thái ở PRD 02).
CLS-08Buổi học bù cho học viên
Nhân sự đặt một buổi học bù cho học viên đã vắng học.
  • Given Một lượt vắng có xin phép (PRD 04) và chính sách tenant "cho phép học bù"
  • When Chọn một buổi học của lớp khác cùng trình độ còn chỗ trống, hoặc tạo một buổi học bù riêng lẻ
  • Then Một makeup_booking được tạo; học viên xuất hiện trong danh sách của buổi học đó kèm chip Học bù; việc tham dự không trừ vào gói buổi nếu chính sách tenant quy định như vậy.
CLS-09Xem thời khoá biểu
Quản lý xem toàn bộ tuần trong một lần nhìn.
  • Given Trang thời khoá biểu
  • When Chuyển đổi giữa Theo phòng học, Theo giáo viên, Theo lớp học, và một khoảng ngày
  • Then Một lưới tuần (07:00 đến 22:00, mỗi dòng 30 phút) hiển thị các khối buổi học kèm tên lớp, giáo viên, phòng học và số đã ghi danh/sĩ số; nhấn vào để mở drawer chi tiết buổi học; in ra tạo một tờ A4 nằm ngang cho mỗi phòng học.
CLS-10Kết thúc lớp học
Nhân sự kết thúc một lớp học.
  • Given Buổi học cuối cùng đã diễn ra hoặc nhân sự chọn Kết thúc lớp
  • When Xác nhận
  • Then Trạng thái lớp chuyển thành completed, các lượt ghi danh kết thúc, học viên không còn lượt ghi danh nào khác chuyển thành Hoàn thành (PRD 02), và danh sách lớp chuyển lớp này sang mục Đã kết thúc.

5Màn hình

Danh sách lớp học /classes

Các tab: Đang học · Sắp khai giảng · Đầy · Đã kết thúc · Tất cả. Bộ lọc: chi nhánh, khoá học, trình độ, giáo viên, ngày trong tuần, khung giờ (sáng/chiều/tối), còn chỗ. Các nút: + Tạo lớp, Thời khoá biểu.

CộtGhi chú
Mã lớpclass.code
Tên lớpliên kết; chip trình độ
Lịch"T3, T5 · 18:00–19:30"
Phòngtên phòng học
Giáo viênảnh đại diện + tên; trợ giảng hiển thị nhỏ
Sĩ số"11/12" kèm thanh tiến trình; màu đỏ khi đầy; số lượng đang chờ
Tiến độsố buổi đã học / tổng số buổi
Khai giảng · Kết thúcngày
Trạng tháiSắp mở (exc) · Đang học (ok) · Đầy (late) · Đã kết thúc (grey)
Thao tácXem lịch · Thêm học viên · Điểm danh hôm nay

Trạng thái trống: "Chưa có lớp. Tạo khoá học trước, rồi mở lớp từ khoá học."

Chi tiết lớp học /classes/:id

Phần đầu trang theo khung lop-hoc của Cloud theme: tên lớp, tiêu đề phụ "T3 & T5, 18:00 · 12 học viên · Movers", các nút Sửa · Giao bài (FLYER) · kebab (Nhân bản lớp, Kết thúc lớp). Các tab: Tổng quan · Học viên · Buổi học · Điểm danh · Bài tập (bài kiểm tra FLYER hiện có) · Học phí · Cài đặt. Cột bên phải: Thông tin lớp (mã lớp kèm nút sao chép, giáo viên, phòng học, sĩ số, khoá học, chương trình), tỷ lệ lấp đầy, buổi học kế tiếp.

  • Học viên: bảng danh sách lớp (họ tên, số điện thoại phụ huynh, ngày bắt đầu, trạng thái, số buổi đã học/tổng số buổi, số dư, cờ đánh dấu) kèm các thao tác Chuyển lớp, Kết thúc, Gửi tin; phần danh sách chờ; + Thêm học viên (tìm học viên trong chi nhánh, hiển thị mức độ phù hợp trình độ).
  • Buổi học: bảng các buổi học (số thứ tự, ngày, giờ, phòng học, giáo viên, giáo viên dạy thay, trạng thái, đã điểm danh, ghi chú) kèm sửa, huỷ, dạy thay theo từng dòng; thanh công cụ Tạo buổi, Tạo lại lịch, Nghỉ lễ.
  • Cài đặt: sĩ số, chỗ học thử, cho phép học bù, chương trình FLYER (các trường ClassSchedule hiện có).
Biểu mẫu tạo lớp (drawer, 2 bước) /classes/new
TrườngKiểu dữ liệuRàng buộc
Chi nhánhselectbắt buộc
Khoá họcselectbắt buộc; tự điền trình độ, thời lượng, sĩ số, số buổi
Tên lớptextbắt buộc; không trùng trong cùng chi nhánh, tính trên các lớp đang mở
Mã lớptexttự sinh <LEVEL>-<YYMM>-##, có thể chỉnh sửa
Giáo viên chính, Trợ giảngbộ chọn nhân sự (đang dạy, theo chi nhánh)giáo viên chính bắt buộc trước buổi học đầu tiên
Phòngchọn phòng học trong chi nhánhbắt buộc
Sĩ số tối đa, Chỗ học thửint1–60; chỗ học thử ≤ 5
Lịch họcchip ngày trong tuần; giờ bắt đầu/kết thúc theo từng ngày; thời lượng mặc định lấy từ khoá học≥ 1 ngày trong tuần; giờ bắt đầu < giờ kết thúc
Khai giảngdatebắt buộc
Kết thúcradio: theo số buổi (default course lessons) / theo ngày
Ngày nghỉchọn nhiều ngày; nạp sẵn từ danh sách ngày nghỉ lễ của tenant
Chương trình FLYERbộ chọn chương trình hiện có (không bắt buộc)

Bước 2 xem trước: danh sách các buổi học được sinh ra kèm chip cảnh báo trùng lịch; nút Tạo lớp và N buổi.

Thời khoá biểu /timetable?view=room|teacher|class&week=2026-W37

Lưới tuần, các cột là phòng học (hoặc giáo viên, hoặc lớp học), các dòng là 30 phút. Màu khối theo trình độ. Kéo để di chuyển (trên desktop) kèm kiểm tra trùng lịch khi thả. Bộ lọc: chi nhánh, trình độ. Các nút: In, Xuất iCal (chế độ xem của giáo viên). Chế độ xem theo ngày cho di động.

Phòng học (cài đặt) /settings/rooms

Bảng: tên, chi nhánh, sĩ số, thẻ trang thiết bị, đang hoạt động. Biểu mẫu: tên (không trùng trong cùng chi nhánh), sĩ số, ghi chú.

6Quy tắc nghiệp vụ

  1. Các buổi học được sinh ra từ mẫu lịch khi tạo lớp và mỗi khi mẫu lịch thay đổi, chỉ áp dụng cho các buổi học ở trạng thái planned. Các buổi đã học hoặc đã huỷ không bao giờ được sinh lại.
  2. Số thứ tự buổi học được đánh theo thứ tự ngày trong số các buổi chưa bị huỷ; được đánh lại khi sinh lại lịch.
  3. Trùng phòng học: cùng phòng, thời gian chồng lấn, cả hai buổi học chưa bị huỷ. Trùng giáo viên: cùng một nhân sự là giáo viên chính hoặc dạy thay, thời gian chồng lấn, ở bất kỳ chi nhánh nào. Khoảng đệm giữa các buổi học mặc định là 0 (cài đặt theo tenant, tối đa 30 phút).
  4. Sĩ số được tính bằng số lượt ghi danh đang hoạt động vào ngày của buổi học cộng với các lượt đặt học thử và học bù cho buổi học đó; chỗ học thử được giữ riêng.
  5. Một lượt ghi danh có ngày bắt đầu và ngày kết thúc; học viên có mặt trong danh sách của các buổi học nằm trong khoảng [ngày bắt đầu, ngày kết thúc].
  6. Trạng thái lớp học: draft (chưa có buổi học), scheduled (ngày bắt đầu ở tương lai), active, completed, cancelled; được suy ra từ ngày và buổi học, trừ trạng thái cancelled.
  7. Ngưỡng huỷ muộn 24 giờ (cài đặt theo tenant) đánh dấu cancelled_late để áp dụng quy tắc tính lương.
  8. Ánh xạ trình độ để gợi ý xếp lớp: bảng level_code → khoảng điểm theo từng tenant; giá trị mặc định lấy từ CEFR (Pre-A1, A1, A2, B1, B2, C1) và Cambridge YLE (Starters, Movers, Flyers, KET, PET).

7Mô hình dữ liệu

Thực thểTrườngGhi chú
course (Course hiện có)+ session_duration_min int; age_from; age_to; default_capacity; level_code; is_templatemở rộng
level (catalog)id; tenant_id; code; name; framework enum(cefr, cambridge_yle, ielts, custom); score_from; score_to; positionmới
roomid uuid; school_id; name; capacity; equipment text[]; is_activemới; duy nhất theo (school_id, name)
class_profile (mở rộng từ Class)class_id int64 PK; school_id; course_id; level_code; main_staff_id; assistant_staff_id; room_id; capacity; trial_seats; start_date; end_date; planned_sessions; status enum; allow_makeup bool; pattern jsonb [{weekday, start, end}]; holidays date[]mới
class_sessionid uuid; class_id; school_id; seq int; date; start_at; end_at (timestamptz); room_id; main_staff_id; substitute_staff_id null; status enum(planned, held, cancelled, cancelled_late); cancel_reason; is_makeup bool; is_adjusted bool; note; attendance_marked_at; created_at; updated_atmới; index (school_id, date), (room_id, start_at), (main_staff_id, start_at)
enrollmentid uuid; student_id; class_id; start_date; end_date null; status enum(active, ended, waiting); end_reason; fee_plan_id null; created_by; created_atmới; mỗi (student, class) chỉ có một lượt ghi danh đang hoạt động
makeup_bookingid; student_id; source_session_id (absence); target_session_id; consumes_package bool; status enum(booked, attended, no_show, cancelled)mới
holidayid; tenant_id; date; namemới

8Hợp đồng API

MethodPathRequest / responseStatus
GET/POST/PUT/DELETE/v3/teacher/school-finance/course/courses[/{id}]như hiện tại + các trường mở rộngextend
GET/v3/teacher/classesnhư hiện tại; response bổ sung tổng hợp profileextend
POST/v3/school/classes{school_id, course_id, name, code?, level_code, main_staff_id?, assistant_staff_id?, room_id, capacity, trial_seats, start_date, end_by: {sessions: n} | {date}, pattern[], holidays[], program?: CreateClassScheduleRequest fields} → {class, sessions[], conflicts[]}; dry_run=true chỉ trả về bản xem trướcnew (tạo Class + ClassSchedule ở nội bộ)
GET/PATCH/v3/school/classes/{id}chi tiết kèm profile, số lượng trong danh sách lớp, buổi học kế tiếpnew
POST/v3/school/classes/{id}/regenerate{pattern, holidays, from_date} chỉ áp dụng cho các buổi học ở trạng thái plannednew
POST/v3/school/classes/{id}/close | /cancel{reason}new
GET/v3/school/sessionsschool_id, from, to, class_id, room_id, staff_id, status → Session[] with class, room, teacher, countsnew
POST/v3/school/classes/{id}/sessions{date, start, end, room_id, staff_id, is_makeup} phát sinh riêng lẻnew
PATCH/v3/school/sessions/{id}{date?, start?, end?, room_id?, main_staff_id?, substitute_staff_id?, note?, apply_to_following?: bool, override_conflict?: bool} → 409 CONFLICT {conflicts[]}new
POST/v3/school/sessions/{id}/cancel{reason, add_makeup: bool, notify: bool}new
GET/POST/v3/school/classes/{id}/enrollments{student_id, start_date, fee_plan_id?} → 409 CLASS_FULL (đề xuất đưa vào danh sách chờ)new
PATCH/v3/school/enrollments/{id}{end_date, end_reason} hoặc {transfer_to_class_id, effective_date}new
GET/v3/school/sessions/{id}/rosterhọc viên đã ghi danh + học thử + học bù kèm cờ đánh dấu và số dưnew
POST/v3/school/makeups{student_id, source_session_id, target_session_id | new_session: {...}, consumes_package}new
GET/POST/PATCH/v3/school/roomsnew
GET/POST/DELETE/v3/school/holidaysnew
GET/POST/PATCH/v3/school/levelsdanh mục trình độ kèm khoảng điểmnew
GET/v3/school/timetableschool_id, week, view=room|teacher|class → các buổi học được nhóm lạinew
GET/v3/school/staff/{id}/timetable.icsđường liên kết có chữ kýnew
POST/GET/PUT/v3/teacher/class-schedules[...]Các bài học chương trình FLYER; không thay đổiexisting

9Phân quyền

Mã quyềnownerbranch_manageracademic_adminadmissionsteacher
classes.viewTất cảChi nhánhChi nhánhXem trong chi nhánhCủa mình
classes.manage (tạo, sửa, kết thúc)CóCóCóKhôngKhông
sessions.manage (sửa, huỷ, dạy thay)CóCóCóKhôngChỉ yêu cầu
classes.override_conflictCóCóKhôngKhôngKhông
enrollments.manageCóCóCóQua chuyển đổiKhông
makeups.manageCóCóCóKhôngKhông
rooms.manage, courses.manage, levels.manageCóPhòng họcKhoá học, phòng họcKhôngKhông
timetable.viewTất cảChi nhánhChi nhánhChi nhánhCủa mình

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

Sự kiệnThuộc tính
class_createdlevel, weekdays, sessions, capacity, with_program
session_conflict_shown / session_conflict_overriddentype (room|teacher)
session_edited / session_cancelledlate (bool), makeup_added, notified
substitute_assignedhours_before
enrollment_created / ended / transferredreason, fill_rate_after
makeup_bookedconsumes_package
timetable_viewedview, printed
class_closedsessions_held, sessions_cancelled

11Trường hợp biên

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

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