# Audit & QA `class_detail` — 21/09/2026

## Phạm vi

- Điểm danh, bài tập & kết quả, bảng xếp hạng, link & ghi chú, học phí và sổ liên lạc.
- Kiểm tra quyền truy cập, CSRF, tính toàn vẹn dữ liệu, hiệu năng truy vấn, JavaScript/PHP và asset source/dist.
- Production: `https://se.webdemo258.io.vn/cms-demo-new/public_html/quan-ly/lop-hoc.html?id=1181`.

## Kết quả dữ liệu thật

Integration test chỉ đọc chạy trực tiếp qua các service production của lớp `1181`:

| Hạng mục | Kết quả |
| --- | ---: |
| Học viên đang học | 4 |
| Bài tập đang giao | 2 |
| Học viên có kết quả bài tập | 4 |
| Dòng bảng xếp hạng | 4 |
| Học viên trong sổ liên lạc | 4 |
| Buổi học trong sổ liên lạc | 25 |
| Kết quả lệch quan hệ lớp / sai tổng điểm | 0 |

Các kiểm tra toàn database:

- Không có bản ghi bài tập, sổ liên lạc hoặc học phí mồ côi.
- Không có nhóm điểm danh `status=1` bị trùng.
- Các kết quả của bài đã gỡ khỏi lớp vẫn được giữ theo đúng nghiệp vụ để khôi phục khi giao lại.
- Giao dịch học phí của học viên đã ngưng học vẫn được giữ làm lịch sử.

## Thay đổi đã triển khai

- Bọc thao tác **Điểm danh tất cả** và chấm công giáo viên trong một transaction. Nếu một bản ghi lỗi, toàn bộ thao tác được rollback.
- Thêm index `idx_attendance_class_date_student_status` cho `student_attendances_tb`. Truy vấn lớp/ngày đã đổi từ quét khoảng 133.000 dòng xuống đọc khoảng 1 dòng; truy vấn toàn lớp `1181` đọc khoảng 21 dòng.
- Bỏ ExcelJS và FileSaver khỏi bundle của trang lớp sau khi tính năng tải thông tin học viên đã được bỏ, giảm khoảng 1,17 MB JavaScript tải dư.
- Tối ưu tra cứu học viên trong phép tính bảng xếp hạng từ tìm tuyến tính sang lookup theo khóa.
- Bỏ giả định hệ tiến hóa luôn có đúng 5 level; trạng thái `Max` lấy từ cấu hình thật.
- Bài tập, copy tên học viên và các luồng lỗi dùng notification global của hệ thống.
- Xóa khối bảng xếp hạng mẫu, modal ghi chú mẫu không có backend, dữ liệu tên/điểm mẫu trong modal và CSS/JS chết liên quan.
- Đồng bộ lại `page_diem-danh.css` và `page_diem-danh.js` giữa `src` và `dist`.

## Kiểm tra kỹ thuật

- PHP lint: controller, block, service và toàn bộ partial của `class_detail` đạt.
- Node syntax: JavaScript `src` và `dist` đạt.
- 111 ID HTML tĩnh được kiểm tra, không có ID trùng.
- Không còn `alert()`, `confirm()` hoặc `prompt()` trong luồng `class_detail`.
- Test công thức điểm trung bình bài chấm và cấu hình mặc định bảng xếp hạng đạt.
- Integration test service production: bài tập, bảng xếp hạng và sổ liên lạc khớp cùng danh sách học viên; tổng điểm khớp tổng chuyên cần + bài tập + thưởng.
- Checksum các file local và production khớp sau triển khai; không có PHP fatal mới liên quan trong log kiểm tra.

## Nâng cấp tiếp theo nên làm

1. Tách `class_detail.phtml` thành partial/controller riêng theo từng tab. File hiện vẫn lớn và có nhiều JavaScript inline, nên thay đổi một tab dễ ảnh hưởng tab khác.
2. Chuẩn hóa `student_attendances_tb.session_date` từ `VARCHAR` sang `DATE`. Hiện dữ liệu chấp nhận cả `dd/mm/yyyy` và `dd-mm-yyyy`, khiến truy vấn và ràng buộc khó an toàn.
3. Chuyển quan hệ lớp của học viên khỏi JSON trong `student_tb.class_id` sang bảng liên kết `class_student`. Đây là phần cản trở index và kiểm tra khóa ngoại nhiều nhất.
4. Sau khi dọn 328 nhóm dữ liệu điểm danh lịch sử `status=3` bị trùng, thêm cơ chế ràng buộc chống ghi trùng ở database cho bản ghi đang hoạt động.
5. Thêm test tự động cho quyền theo role, lưu điểm danh, công thức bảng xếp hạng, học phí và sổ liên lạc. Dự án hiện chưa có test runner thực tế trong `package.json`.
6. Thay việc refresh bảng xếp hạng bằng cách tải lại toàn HTML trang bằng endpoint JSON/partial riêng để giảm tải server.
7. Lập kế hoạch nâng Zend Framework cũ hoặc cố định phiên bản PHP tương thích; bootstrap CLI trên PHP mới phát sinh nhiều cảnh báo deprecated từ vendor.

## Giới hạn lượt kiểm tra này

Browser automation không thấy tab Chrome đã đăng nhập, nên lượt audit hiện tại không thao tác ghi dữ liệu qua giao diện. Kiểm thử giao diện đăng nhập trước đó đã đạt; lượt này dùng lint, kiểm tra database chỉ đọc, EXPLAIN và integration test trực tiếp qua service production.
