Giai đoạn 1 · WS1 · Spec UI đầu tiên · 08/7/2026

Spec màn hình tiếp nhận hồ sơ MVP

2 màn hình trong module student (feature hoso): Danh sách hồ sơForm tiếp nhận. Dev code được ngay — khi có DB Vĩnh An chỉ chỉnh tên trường/quy tắc mã. Đầu vào: quy trình · schema · data-scope §3b.

A

Danh sách hồ sơ — /student/hoso

Trạng tháiHạngKhóaLoại hồ sơ 🔍 Tên / CCCD / SĐT / mã ĐK + Tiếp nhận hồ sơ
Tất cả (128)Tiếp nhận (12)Chờ bổ sung (5) Hợp lệ (9)Đã thu Đ1 (20)Xếp khóa (31)Đang học (48)
Mã ĐKHọ tênCCCDHạngKhóaTrạng tháiThiếu giấy tờGV
HV-001-2026-00128Nguyễn Văn A0790…812BK12BTiếp nhận
HV-001-2026-00127Trần Thị B0791…334C1K09CChờ bổ sungKhám SKẢnh
HV-001-2026-00119Lê Văn C0792…558BK12BĐang họcGV05
HV-001-2026-00104Phạm D0793…901A1M03Hủy
Phân trang 20 / 50 / 100
#Hành viChi tiết
A1Tab đếm theo trạng tháiĐếm realtime theo bộ lọc đang áp; click tab = lọc nhanh
A2Badge trạng tháixám tu_van · xanh dương tiep_nhan · vàng cho_bo_sung · xanh lá hop_le→dang_hoc · đỏ huy
A3Cột "Thiếu giấy tờ"Chỉ hiện với cho_bo_sung — chip đỏ từng loại thiếu (đọc checklist)
A4Data scopeTUYEN_SINH → dải tiếp nhận · KE_TOAN → từ hợp lệ · GIAO_VIEN → phụ trách — server lọc (scopeWhere); UI ẩn tab ngoài phạm vi
A5–A7Nút theo quyền"+ Tiếp nhận" cần hoso.create · menu ⋮ theo transition mục C · export cần quyền export
B

Form tiếp nhận — /student/hoso/new

1 · Thông tin học viên

Họ tênNguyễn Văn A Ngày sinh12/03/2001 Giới tínhNam ▾ CCCD079201001812 ✓ Ngày cấp05/06/2021 Nơi cấpCA TP.HCM SĐT0909 123 456 Email Thường trúQ.7, TP.HCM

2 · Thông tin khóa học

Hạng GPLXB ▾ Loại hồ sơHọc mới ▾ Khóa dự kiếnK12B ▾ Nguồn / CTVZalo ▾ Học phí thỏa thuận18.500.000 ₫ (bảng giá)

3 · Checklist giấy tờ — động theo Hạng B × Học mới

Đơn đăng ký học & sát hạch scan ✓đã đối chiếu ✓
CCCD (bản sao) scan ✓đã đối chiếu ✓
Giấy khám sức khỏe hạn: 02/5/2026 — HẾT HẠNupload scan
Ảnh thẻ 3×4 (2 tấm) upload
GPLX hiện có chỉ hiện khi Nâng hạng
Lưu nháp (tu_van) Lưu & tiếp nhận → tự tính trạng thái
Ảnh 3×4*
chụp / upload

Trạng thái hồ sơ

Tiếp nhận
Bàn giao phòng Hủy hồ sơ (lý do*)

Lịch sử

14:02 Tạo hồ sơ — N.V.Tuyên
14:10 → chờ bổ sung (thiếu khám SK)
C

Validate · checklist · transition

▸ Validate (client + server đều chặn)

#TrườngQuy tắcThông báo
V1CCCD12 số; chống trùng trong khóa (ma_dk, ma_kh, ma_csdt); trùng người khác khóa → cảnh báo mềm + gợi ý nâng hạng"CCCD đã có hồ sơ K12B — xem / tạo nâng hạng?"
V2Ngày sinh × HạngTuổi tại ngày sát hạch dự kiến ≥ min_age của hạng (catalog)"Chưa đủ N tuổi cho hạng B…"
V3–V4SĐT · Nâng hạngSĐT 10 số, trùng active → cảnh báo mềm · nâng hạng bắt buộc GPLX cũ + hợp lệ theo ma trận nâng hạng
V5Học phí> 0; lệch >X% bảng giá → yêu cầu ghi chú lý do
V6–V7Khám SK · ẢnhKhám SK hết hạn trước khai giảng = thiếu · ảnh bắt buộc trước khi rời tiep_nhan, nén ≤500KB

▸ Hành vi checklist (lõi màn hình)

  • Đổi Hạng/Loại → nạp lại checklist từ catalog; giữ file đã up nếu loại giấy vẫn còn
  • Mỗi mục: scan (nhiều trang) + toggle "đã đối chiếu bản gốc" (giayto.verify) + ô hạn nếu có
  • Trạng thái tự tính: đủ + đã đối chiếu → hop_le; thiếu → cho_bo_sung + banner nêu đúng mục — không chọn tay
  • Lưu nháp = tu_van (khách chưa mang đủ giấy)

Transition theo trạng thái × quyền

  • tiep_nhan/cho_bo_sung: Lưu · tự chuyển hợp lệ · Hủy
  • hop_le: chờ tuition — link tạo phiếu thu
  • da_thu_dot1: Xếp khóa (khóa+GV+xe)
  • xep_khoa: chờ report báo Sở
  • da_bao_so: Bắt đầu học (hoso.approve)
  • da_thu_dot1/da_bao_so chỉ đổi qua callback (P3) — form không có nút tay

Rỗng · lỗi · offline

  • Danh sách rỗng theo bộ lọc → gợi ý "Tiếp nhận hồ sơ mới" (nếu có quyền)
  • Mất mạng khi lưu → giữ form + retry; upload scan có hàng đợi (không mất dữ liệu đã nhập — mức tối thiểu MVP)
  • Lỗi validate server trả theo trường — form focus đúng ô
D

API cần có & DoD

MethodEndpointGhi chú
GET/api/student/hoso · /counts · /:idlist + filter + tab đếm + chi tiết — scopeWhere áp server
POST/PUT/api/student/hoso · /:idtạo/sửa — validate V1–V7 phía server
POST/api/student/hoso/:id/transitionNguồn duy nhất đổi trạng thái — chạy rule + ghi lịch sử; callback tuition/report cũng gọi vào đây (service token)
POST/PUT/:id/giayto · /:id/giayto/:gid/verifyupload scan · đối chiếu bản gốc
GET/check-cccd · /api/catalog/checklistcheck trùng realtime (V1) · checklist động theo hạng+loại

DoD

  • A: list + filter + tab + badge + menu theo quyền · B: form 3 khối, V1–V7 hai phía, checklist động, trạng thái tự tính
  • Transition duy nhất qua API, mọi lần đổi ghi lịch sử
  • Data scope đúng 4 vai trò · check CCCD realtime + gợi ý nâng hạng
  • Test: đủ giấy → hop_le · thiếu 1 mục → nêu đúng mục · nâng hạng +2 mục giấy · đổi hạng giữ file hợp lệ

⚠ Chốt khi có dữ liệu Vĩnh An

  • Quy tắc ma_dk — tạm HV-{ma_csdt}-{YYYY}-{seq5}
  • Checklist thật theo NĐ 94/2026 + TT 17/2026 → seed
  • Bàn giao phòng (org): mặc định MVP ẩn
  • Bảng giá thật → gợi ý V5