- Given Mở Điểm danh trên điện thoại vào lúc buổi học bắt đầu hoặc sau đó (hoặc trước đó tối đa 30 phút)
- When Phiếu điểm danh của buổi học tải lên với toàn bộ học viên trong danh sách được đặt mặc định là Có mặt
- Then Chỉ cần chọn các trường hợp ngoại lệ (Muộn yêu cầu nhập số phút với các mốc có sẵn 5/10/15/30; Vắng; Có phép được chọn sẵn khi đã có đơn xin phép), có thể thêm ghi chú buổi học, rồi nhấn Lưu; phiếu được lưu bằng một yêu cầu duy nhất; nếu đang offline, phiếu được lưu tạm trên máy và đồng bộ khi có mạng trở lại, kèm banner "Chưa đồng bộ" hiển thị rõ.
PRD 04 · Điểm danh
Điểm danh theo buổi học với bốn trạng thái (có mặt, muộn, vắng, có phép), quy trình dành cho giáo viên ưu tiên điện thoại, chỉnh sửa của quản trị có ghi nhật ký, thông báo phụ huynh qua Zalo, và liên kết từ điểm danh đến số dư gói buổi và lương giáo viên. Hiện tại, chưa có thực thể điểm danh nào tồn tại trong backend.
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 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-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.
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 trạng thái điểm danh của đối thủ và liệu có tồn tại trạng thái "muộn" hay không.
- Liệu vắng học có trừ vào gói buổi theo mặc định hay không, và liệu cấu hình này có áp dụng riêng theo từng trung tâm hay không.
- Giáo viên điểm danh trên di động như thế nào (ứng dụng hay web), và liệu có khung thời gian cho phép chỉnh sửa hay không.
- Phụ huynh nhận được gì (thông báo đẩy trong ứng dụng, Zalo, SMS) và nội dung mẫu tin là gì.
- Liệu "đánh dấu ghi chú học sinh nghỉ học" là văn bản tự do hay các lý do có sẵn.
Thiết kế đề xuất
Ba màn hình di động cho giáo viên (buổi học hôm nay, phiếu điểm danh, phiếu đã lưu) và năm màn hình desktop cho quản trị. Điều quan trọng nhất là thanh chọn bốn trạng thái Có mặt · Muộn · Vắng · Phép trên từng dòng học viên, mặc định Có mặt, vùng chạm 44 px: giáo viên chỉ chạm vào các ngoại lệ rồi nhấn Lưu.








1Mục đích
Điểm danh là nghiệp vụ kết nối thời khoá biểu với tiền và với phụ huynh. Mỗi buổi học diễn ra tạo ra một bản ghi cho từng học viên trong danh sách lớp; các bản ghi này trừ vào gói buổi, làm chứng cứ tính giờ dạy để trả lương giáo viên, và kích hoạt tin nhắn mà phụ huynh mong đợi nhận được trong vài phút sau khi buổi học bắt đầu. Quy trình phải giúp giáo viên hoàn tất điểm danh trong chưa đầy một phút trên điện thoại, ngay cả trong lớp học có kết nối mạng kém.
Trong phạm vi
- Điểm danh theo từng buổi học cho học viên đang học, học viên học thử và học viên học bù.
- Các trạng thái có mặt, muộn, vắng, có phép; số phút đi muộn; ghi chú buổi học theo lớp và theo từng học viên.
- Quy trình cho giáo viên trên di động (PWA) và quy trình cho quản trị trên desktop; chỉnh sửa có ghi nhật ký.
- Thông báo tự động cho phụ huynh theo từng trạng thái (PRD 07) và công việc theo dõi khi học viên vắng học.
- Báo cáo điểm danh: theo lớp, theo học viên, theo chi nhánh; xuất file.
Ngoài phạm vi
- Thiết bị check-in bằng sinh trắc học hoặc mã QR (đề xuất cho P3).
- Hoàn thành bài tập về nhà (đã được theo dõi qua bài tập FLYER).
2Các trạng thái
| Mã | Nhãn giao diện | Chip | Trừ vào gói buổi | Thông báo phụ huynh | Tính vào tỷ lệ chuyên cần |
|---|---|---|---|---|---|
present | Có mặt | Có mặt | có | tuỳ chọn (theo cấu hình tenant, mặc định tắt) | có mặt |
late | Muộn | Muộn | có | có, kèm số phút | có mặt |
absent | Vắng | Vắng | có (theo cấu hình tenant "vắng không phép vẫn trừ buổi", mặc định bật) | có, ngay lập tức | vắng |
excused | Có phép | Có phép | không (mặc định); có đề xuất học bù | không (phụ huynh đã được thông báo trước) | không tính |
unmarked | Chưa điểm danh | xám | không | không | không tính đến khi điểm danh |
Màu sắc theo các token trạng thái của Cloud: ok #16A34A trên #DCFCE7, late #D97706 trên #FEF3C7, abs #DC2626 trên #FEE2E2, exc #2563EB trên #DBEAFE. Mỗi chip luôn kèm chữ; màu sắc không bao giờ là dấu hiệu duy nhất.
3User story và tiêu chí chấp nhận
- Given Phụ huynh thông báo cho bộ phận lễ tân (gọi điện, Zalo, yêu cầu qua cổng phụ huynh)
- When Thêm đơn xin phép cho học viên áp dụng cho một buổi học hoặc một khoảng ngày, kèm lý do
- Then Các buổi học đó hiển thị sẵn trạng thái Có phép trên phiếu điểm danh của giáo viên; phụ huynh nhận được xác nhận; đề xuất học bù xuất hiện nếu chính sách cho phép.
- Given Điểm danh đã lưu với một học viên được đánh dấu vắng và phụ huynh đã đồng ý nhận thông báo qua Zalo
- When Việc lưu hoàn tất
- Then Trong vòng 2 phút, tin nhắn ZNS "Học viên [tên] vắng buổi [lớp] ngày [dd/MM] lúc [HH:mm]. Vui lòng liên hệ [chi nhánh] [SĐT]." được gửi đi; nếu Zalo gửi thất bại, hệ thống chuyển sang thông báo trong ứng dụng rồi email; trạng thái gửi được hiển thị trên phiếu điểm danh của buổi học.
- Given Phiếu điểm danh đã được lưu
- When Thay đổi trạng thái của một học viên sau ngày diễn ra buổi học, kèm lý do
- Then Bản ghi được cập nhật, một mục nhật ký lưu lại trạng thái trước và sau, số dư gói buổi được tính lại; nếu thay đổi làm vắng chuyển thành có mặt, một tin nhắn "điều chỉnh" có thể được gửi thêm (tuỳ chọn).
- Given Các buổi học đã kết thúc hơn 2 giờ nhưng chưa có phiếu điểm danh được lưu
- When Mở Điểm danh → Chưa điểm danh
- Then Các buổi học được liệt kê theo giáo viên, kèm nút "Nhắc GV" (đẩy thông báo trong ứng dụng) và "Điểm danh thay"; vào 21:00 hằng ngày, giáo viên nhận nhắc nhở cho mọi buổi học trong ngày chưa điểm danh; quản lý chi nhánh nhận bản tổng hợp các buổi học chưa điểm danh quá 24 giờ.
- Given Học viên vắng 2 buổi liên tiếp hoặc 3 buổi trong 30 ngày (theo ngưỡng cấu hình của tenant)
- When Lượt vắng thứ hai/thứ ba được lưu
- Then Một công việc "Liên hệ phụ huynh: [tên] vắng N buổi" được tạo cho người phụ trách chăm sóc học viên (mặc định theo chi nhánh), hiển thị trong việc hôm nay; tab "Cần quan tâm" trong danh sách học viên cũng bao gồm học viên này.
- Given Buổi học có một lượt đặt học thử và một lượt đặt học bù
- When Mở phiếu điểm danh
- Then Các học viên này xuất hiện ở phần cuối phiếu với chip Học thử / Học bù và một ô ghi chú; đánh dấu có mặt sẽ cập nhật lượt đặt (PRD 01, PRD 03), và với học thử, hệ thống gợi ý một ghi chú nhanh gồm 3 lựa chọn (Phù hợp / Cần lớp thấp hơn / Cần lớp cao hơn) gửi cho tư vấn viên.
- Given Có khoảng ngày và chi nhánh
- When Mở báo cáo điểm danh
- Then Xem được tỷ lệ theo lớp (có mặt cộng muộn trên tổng số đã điểm danh), phân bố số phút đi muộn, số lượt vắng theo lý do, số buổi học chưa điểm danh theo giáo viên, và danh sách học viên có thể sắp xếp theo số lượt vắng; có thể xuất sang xlsx.
4Màn hình
Danh sách các buổi học trong ngày kèm giờ học, lớp, phòng, số học viên trong danh sách và một chip trạng thái (Chưa điểm danh / Đã điểm danh 11/12 / Đã lưu). Chọn để mở phiếu điểm danh. Các buổi học hôm trước chưa điểm danh được ghim lên đầu với màu vàng cam. Thanh tab dưới cùng: Hôm nay · Lịch tuần · Lớp của tôi · Tài khoản.
Mỗi dòng gồm: ảnh đại diện, tên, các cờ đánh dấu (Cần lưu ý, số dư buổi thấp, sinh nhật hôm nay), thanh chọn phân đoạn gồm bốn trạng thái (vùng chạm cao 44 px), biểu tượng ghi chú theo từng học viên. Bộ đếm ở đầu trang cập nhật theo thời gian thực. Nút lưu luôn cố định. Sau khi lưu: phiếu tổng hợp hiển thị trạng thái gửi của các thông báo và nút "Sửa" trong 24 giờ không cần lý do (đối với giáo viên), sau đó cần lý do (đối với quản trị).
Các trạng thái hiển thị: khung chờ tải (loading skeleton); danh sách rỗng "Lớp chưa có học viên"; banner offline; xung đột "Buổi này đã được [tên] điểm danh lúc HH:mm" kèm tuỳ chọn xem lại.
Các tab: Hôm nay · Chưa điểm danh · Theo lớp · Theo học viên · Báo cáo. Tab Hôm nay: bảng các buổi học trong ngày (giờ học, lớp, phòng, giáo viên, số học viên, đã điểm danh, số lượng có mặt/muộn/vắng/có phép, đã gửi thông báo) với thao tác Mở phiếu. Bộ lọc: chi nhánh, giáo viên, lớp.
Lịch theo tháng với một chip cho mỗi buổi học, tỷ lệ chuyên cần trong 30/90 ngày, bảng các lượt vắng (ngày, lớp, trạng thái, lý do, đã đặt học bù), nút + Thêm phép.
Các trường: buổi học (chọn từ các buổi học sắp tới hoặc theo khoảng ngày), lý do (Ốm / Việc gia đình / Đi học trường / Khác + văn bản), người báo (tên phụ huynh), kênh (Zalo, gọi điện, trực tiếp, cổng PH), công tắc đề xuất học bù.
5Quy tắc nghiệp vụ
- Mỗi buổi học có một phiếu điểm danh; bản ghi chỉ tồn tại cho học viên có trong danh sách lớp (đang học tại ngày đó, học thử, học bù). Học viên nhập học sau ngày đó không được thêm ngược lại.
- Trạng thái mặc định khi mở phiếu là có mặt; lưu với toàn bộ đều có mặt là hợp lệ và phổ biến.
- Muộn yêu cầu nhập số phút (1–120); muộn vượt ngưỡng cấu hình của tenant (mặc định 45 phút) vẫn tính là muộn, không tính là vắng.
- Giáo viên (chính hoặc dạy thay của buổi học) có thể điểm danh và chỉnh sửa trong vòng 24 giờ mà không cần lý do; sau thời hạn đó, việc chỉnh sửa cần quyền
attendance.edit_anyvà một lý do. - Trừ gói buổi: có mặt và muộn luôn bị trừ; vắng bị trừ theo cấu hình của tenant; có phép không bao giờ bị trừ; học bù bị trừ theo cờ của lượt đặt.
- Quy tắc thông báo theo từng trạng thái là cấu hình của tenant, với giá trị mặc định nêu ở mục 2; trong giờ im lặng 21:30–07:00, tin nhắn được giữ lại đến sáng, trừ trường hợp vắng học ở lớp học buổi tối thì gửi ngay (phụ huynh mong được biết ngay).
- Tỷ lệ chuyên cần = (có mặt + muộn) / (có mặt + muộn + vắng) trên các buổi học đã điểm danh.
- Buổi học bị hủy không có phiếu điểm danh; hủy một buổi học đã có phiếu điểm danh được lưu yêu cầu xóa phiếu trước (chỉ quản trị, có ghi nhật ký).
6Mô hình dữ liệu
| Thực thể | Trường | Ghi chú |
|---|---|---|
| attendance_sheet | id uuid; session_id (unique); school_id; class_id; marked_by_staff_id; marked_at; note; notify_guardians bool; present_count; late_count; absent_count; excused_count; version int | new |
| attendance_record | id uuid; sheet_id; session_id; student_id; roster_type enum(enrolled, trial, makeup); status enum(present, late, absent, excused); late_minutes int null; note; excuse_id null; consumed_session bool; notified_at null; notify_status enum(sent, failed, skipped) null; updated_by; updated_at | unique (session_id, student_id) |
| attendance_record_history | id; record_id; from_status; to_status; reason; actor_id; created_at | chi tiết nhật ký |
| excuse | id; student_id; session_id null; date_from; date_to; reason_code enum(sick, family, school, other); reason_text; reported_by; channel; offer_makeup bool; created_by; created_at | new |
| attendance_policy (cấu hình tenant) | absent_consumes bool; late_threshold_min; edit_window_hours; consecutive_absent_threshold; monthly_absent_threshold; notify: {present, late, absent, excused, correction}; quiet_hours | lưu trong cấu hình trường |
7Hợp đồng API
| Method | Path | Request / response | Status |
|---|---|---|---|
| GET | /v3/school/sessions/{id}/attendance | → {session, sheet | null, roster: [{student, roster_type, flags, balance, prefilled_status, excuse}]} | new |
| PUT | /v3/school/sessions/{id}/attendance | {records: [{student_id, status, late_minutes?, note?}], note?, notify_guardians, version?, client_saved_at?} → sheet with records and notify statuses; 409 STALE_VERSION; idempotent by (session_id, client_saved_at) | new |
| PATCH | /v3/school/attendance/records/{id} | {status, late_minutes?, note?, reason} (reason required after edit window) | new |
| DELETE | /v3/school/sessions/{id}/attendance | admin, audited | new |
| GET | /v3/school/attendance/sessions | school_id, date_from, date_to, class_id, staff_id, marked=false → sessions with counts | new |
| POST | /v3/school/attendance/sessions/{id}/remind-teacher | in-app push | new |
| GET/POST/DELETE | /v3/school/students/{id}/excuses | {session_id | date_from, date_to, reason_code, reason_text, reported_by, channel, offer_makeup} | new |
| GET | /v3/school/students/{id}/attendance | from, to → records + rate | new |
| GET | /v3/school/attendance/report | school_id, from, to, group_by=class|student|teacher → aggregates; format=xlsx for export | new |
| GET | /v3/school/me/sessions?date= | teacher's sessions with sheet status | new |
| GET/PUT | /v3/teacher/school-config | attendance_policy block added | extend |
| GET | /v3/parent/learner/{id}/attendance | guardian view | new |
8Phân quyền
| Mã quyền | owner | branch_manager | academic_admin | teacher | accountant | parent |
|---|---|---|---|---|---|---|
attendance.view | tất cả | chi nhánh | chi nhánh | buổi của mình | chi nhánh (chỉ xem) | con của mình |
attendance.mark | có | có | có | buổi của mình | không | không |
attendance.edit_any | có | có | có | không | không | không |
attendance.delete_sheet | có | có | không | không | không | không |
excuses.manage | có | có | có | không | không | chỉ được yêu cầu |
attendance.report, attendance.export | có | chi nhánh | chi nhánh | lớp của mình | báo cáo | không |
attendance.policy | có | không | không | không | không | không |
9Sự kiện phân tích
| Sự kiện | Thuộc tính |
|---|---|
| attendance_sheet_opened | device (mobile|desktop), minutes_from_start, roster_size |
| attendance_saved | seconds_to_save, counts, offline_queued, notify |
| attendance_record_edited | hours_after_session, by_role, from, to |
| attendance_notification_sent | status, channel, outcome |
| excuse_created | reason_code, channel, offer_makeup |
| absence_followup_task_created | trigger (consecutive|monthly) |
| unmarked_reminder_sent | hours_late |
10Trường hợp biên
- Hai giáo viên (chính và dạy thay) cùng mở một phiếu điểm danh: lượt lưu thứ hai với version cũ nhận lỗi 409 và được hiển thị phiếu đã lưu; giáo viên dạy thay là người điểm danh dự kiến khi đã được phân công.
- Học viên chuyển đi ngay trong ngày diễn ra buổi học: vẫn còn trong danh sách lớp của ngày đó nếu ngày kết thúc ghi danh ≥ ngày đó.
- Phụ huynh chưa đồng ý nhận thông báo ở bất kỳ kênh nào: thông báo bị bỏ qua với lý do hiển thị là "Chưa có kênh liên lạc"; bộ phận lễ tân thấy trường hợp này trong danh sách cần theo dõi.
- Phiếu được lưu trước khi buổi học bắt đầu (giáo viên điểm danh trước): được phép từ 30 phút trước giờ học; bản ghi lưu lại thời điểm lưu.
- Ghi chú buổi học có chứa tên học viên: vẫn hợp lệ, ghi chú chỉ hiển thị cho nhân sự; ghi chú theo từng học viên không bao giờ được tự động gửi cho phụ huynh.
- Hàng đợi offline có hai lượt lưu: lượt lưu sau cùng thắng, theo thứ tự
client_saved_at. - Học viên học thử vắng: lượt đặt chuyển thành no_show; tư vấn viên được thông báo.
11Câu hỏi còn mở
- Thông báo có mặt có nên được bật theo mặc định cho các trung tâm dạy trẻ mầm non không (phụ huynh thích nhận tin "đã vào lớp")?
- Giáo viên có cần trạng thái "ra sớm" không? Đề xuất: không cần; trường ghi chú đã đủ để thể hiện.
- Có còn cần một phiếu giấy in được cho giáo viên không có điện thoại không?
Trường Số (truongso.net) · Nội bộ FLYER