Đặc tả Yêu cầu Phần mềm
Module Tuyển dụng
RECR
1. Giới thiệu
1.1 Mục đích
Tài liệu này định nghĩa các yêu cầu phần mềm cho module Tuyển dụng của Hệ thống Quản lý Nhân sự.
1.2 Phạm vi
Module Tuyển dụng quản lý quy trình tuyển dụng từ đầu đến cuối với hệ thống vai trò hai cấp. Vai trò cấp hệ thống (user, super_admin) được quản lý bởi module AUTH. Vai trò cấp tổ chức (HR, Candidate, Employer) được quản lý trong nội bộ tổ chức. Người dùng tự đăng ký với vai trò hệ thống user và nhận vai trò cấp tổ chức khi tham gia hoặc được thêm vào một tổ chức.
1.3 Phụ thuộc Module
| Module | Loại Phụ thuộc | Mô tả |
| AUTH | Bắt buộc | Xác thực người dùng và kiểm soát truy cập dựa trên vai trò |
| FILE | Bắt buộc | Lưu trữ tệp cho hồ sơ xin việc và tệp đính kèm của ứng viên (URL tải lên/tải xuống presigned, quản lý metadata tệp) |
| LOG | Tùy chọn | Ghi nhật ký sự kiện cho truy vết kiểm toán |
1.4 Định nghĩa
| Thuật ngữ | Định nghĩa |
| SRS | Đặc tả Yêu cầu Phần mềm |
| FR | Yêu cầu Chức năng |
| NFR | Yêu cầu Phi chức năng |
| UC | Trường hợp sử dụng |
| DR | Yêu cầu Dữ liệu |
| IR | Yêu cầu Tích hợp |
1.5 Vai trò Người dùng
Vai trò Cấp hệ thống (được quản lý bởi module AUTH)
| Vai trò | Mô tả | Tạo mới | Quyền hạn Chính |
| user | Vai trò mặc định cho người dùng tự đăng ký | Tự đăng ký qua POST /recr/auth/register | Tạo tổ chức, truy cập các tính năng cơ bản |
| super_admin | Quản trị viên hệ thống | Chỉ được tạo bởi admin hiện có (không tự đăng ký) | Truy cập toàn bộ hệ thống, quản lý tất cả tổ chức và người dùng |
Vai trò Cấp tổ chức (được quản lý trong nội bộ tổ chức)
| Vai trò | Mô tả | Tạo mới | Quyền hạn Chính |
| Candidate | Người tìm việc đang tìm kiếm việc làm trong một tổ chức | Được giao bởi chủ sở hữu/quản trị viên tổ chức | Duyệt việc làm, nộp hồ sơ ứng tuyển, xem trạng thái hồ sơ, quản lý hồ sơ cá nhân |
| HR | Thành viên đội ngũ tuyển dụng nội bộ trong một tổ chức | Được giao bởi chủ sở hữu/quản trị viên tổ chức | Duyệt hồ sơ ứng tuyển, lên lịch phỏng vấn, đánh giá ứng viên, quản lý đề nghị tuyển dụng, tạo báo cáo |
| Employer | Chủ sở hữu/quản trị viên tổ chức đăng tin tuyển dụng | Được giao bởi chủ sở hữu/quản trị viên tổ chức (thường là người tạo tổ chức) | Tạo tin tuyển dụng, xem người nộp đơn, duyệt tin tuyển dụng, xem phân tích |
Lưu ý: Một người dùng có thể có các vai trò cấp tổ chức khác nhau trong các tổ chức khác nhau. Vai trò cấp hệ thống xác định những gì người dùng có thể thực hiện trên toàn hệ thống, trong khi vai trò cấp tổ chức xác định những gì người dùng có thể thực hiện trong một tổ chức cụ thể.
2. Tổng quan Module
2.1 Mô tả Module
| Thuộc tính | Giá trị |
| Mã Module | RECR |
| Tên Module | Tuyển dụng |
| Mô tả | Quản lý tuyển dụng từ đầu đến cuối với hệ thống vai trò hai cấp: vai trò hệ thống (user, super_admin) và vai trò tổ chức (Candidate, HR, Employer). Tích hợp với module FILE để lưu trữ hồ sơ xin việc an toàn qua URL presigned. |
| Cơ sở dữ liệu | recr_db |
| Bảng | recr_users, recr_candidates, recr_candidate_resumes, recr_employers, recr_hr_profiles, recr_jobs, recr_applications, recr_interviews, recr_evaluations, recr_job_requirements, recr_subscription_plans, recr_subscriptions, recr_subscription_history, recr_job_reviews, recr_candidate_reviews, recr_invitations |
| Công nghệ | Node.js, NestJS, PostgreSQL, Drizzle ORM, RabbitMQ, Elasticsearch |
2.2 Sơ đồ Trường hợp sử dụng
Hình 1: Sơ đồ Trường hợp sử dụng Tuyển dụng (3 Vai trò)
3. Chi tiết Đặc tả Trường hợp sử dụng
3.1 UC-09: Đăng tin Việc làm
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-09 |
| Tên | Đăng tin Việc làm |
| Tác nhân | HR, Employer |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Điều kiện thành công | Việc làm được tạo và gửi để duyệt |
| Kích hoạt | Người dùng nhấn "Tạo Việc làm mới" |
Luồng Chính:
- Người dùng điều hướng đến trang quản lý việc làm
- Người dùng nhập chi tiết việc làm (tiêu đề, mô tả, phòng ban, địa điểm)
- Người dùng nhập khoảng lương và loại hình việc làm
- Người dùng thêm yêu cầu việc làm
- Hệ thống lưu việc làm dưới dạng bản nháp với người dùng là chủ sở hữu
- Người dùng gửi việc làm để duyệt
- Hệ thống cập nhật trạng thái thành "pending_approval"
- Hệ thống thông báo cho HR (nếu HR tạo) hoặc thông báo cho admin (nếu Employer tạo)
Lưu ý: Đăng ký là tùy chọn. Người dùng có đăng ký sẽ được các tính năng cao cấp như ưu tiên đăng tin, tin được giới thiệu.
Hình 2: UC-09 Đăng tin Việc làm - Sơ đồ Hoạt động
Hình 3: UC-09 Đăng tin Việc làm - Sơ đồ Chuỗi
3.2 UC-10: Quản lý Việc làm
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-10 |
| Tên | Quản lý Việc làm |
| Tác nhân | HR, Employer |
| Điều kiện tiên quyết | Người dùng đã tạo việc làm |
| Điều kiện thành công | Trạng thái việc làm được cập nhật |
| Kích hoạt | Người dùng truy cập trang quản lý việc làm |
Luồng Chính:
- Người dùng điều hướng đến trang quản lý việc làm
- Hệ thống hiển thị kho việc làm của người dùng:
- Tất cả việc làm do người dùng này tạo
- Chỉ báo trạng thái (nháp, mở, đóng, lưu trữ)
- Số lượng hồ sơ trên mỗi việc làm
- Người dùng có thể:
- Chỉnh sửa chi tiết việc làm
- Thay đổi trạng thái việc làm (mở/đóng/lưu trữ)
- Xem người nộp đơn cho mỗi việc làm
- Hệ thống cập nhật bản ghi việc làm
Luồng Thay thế:
- 2a. Employer chưa có đăng ký: Hệ thống hiển thị thông báo yêu cầu đăng ký
3.3 UC-03: Duyệt Việc làm
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-03 |
| Tên | Duyệt Việc làm |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | Có việc làm trong hệ thống |
| Điều kiện thành công | Ứng viên xem danh sách việc làm |
| Kích hoạt | Ứng viên truy cập trang danh sách việc làm |
Luồng Chính:
- Ứng viên điều hướng đến trang danh sách việc làm
- Hệ thống hiển thị tất cả việc làm đang mở
- Ứng viên áp dụng bộ lọc (địa điểm, lương, loại hình)
- Hệ thống trả về kết quả đã lọc
- Ứng viên chọn một việc làm để xem chi tiết
- Hệ thống hiển thị chi tiết việc làm với yêu cầu
Hình 4: UC-03 Duyệt Việc làm - Sơ đồ Hoạt động
Hình 5: UC-03 Duyệt Việc làm - Sơ đồ Chuỗi
3.4 UC-04: Nộp Hồ sơ Ứng tuyển
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-04 |
| Tên | Nộp Hồ sơ Ứng tuyển |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | Ứng viên đã đăng nhập, việc làm tồn tại |
| Điều kiện thành công | Hồ sơ ứng tuyển được tạo, nhà tuyển dụng được thông báo |
| Kích hoạt | Ứng viên nhấn "Ứng tuyển" trên danh sách việc làm |
Luồng Chính:
- Ứng viên chọn việc làm và nhấn "Ứng tuyển"
- Ứng viên chọn hồ sơ hiện có từ danh sách hồ sơ của mình, hoặc tải lên hồ sơ mới (PDF/DOCX, tối đa 10MB qua module FILE)
- Ứng viên nhập thư xin việc
- Ứng viên xem lại và nộp hồ sơ
- Hệ thống kiểm tra hồ sơ (kiểm tra resume_file_id tồn tại trong module FILE)
- Hệ thống kiểm tra trùng lặp hồ sơ
- Hệ thống đóng băng hồ sơ bằng cách sao chép
resume_file_id vào bản ghi hồ sơ (không thể thay đổi sau khi nộp)
- Hệ thống tạo bản ghi hồ sơ
- Hệ thống gửi thông báo cho nhà tuyển dụng
- Ứng viên thấy thông báo thành công
Luồng Thay thế:
- 6a. Đã ứng tuyển: Hệ thống hiển thị lỗi "Đã Ứng tuyển"
- 5a. Dữ liệu đầu vào không hợp lệ: Hệ thống hiển thị lỗi xác thực
Hình 6: UC-04 Nộp Hồ sơ Ứng tuyển - Sơ đồ Hoạt động
Hình 7: UC-04 Nộp Hồ sơ Ứng tuyển - Sơ đồ Chuỗi
3.5 UC-05: Xem Trạng thái Hồ sơ
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-05 |
| Tên | Xem Trạng thái Hồ sơ |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | Ứng viên đã nộp hồ sơ |
| Điều kiện thành công | Ứng viên xem tiến trình hồ sơ |
| Kích hoạt | Ứng viên truy cập "Hồ sơ của tôi" |
Luồng Chính:
- Ứng viên điều hướng đến "Hồ sơ của tôi"
- Hệ thống hiển thị danh sách hồ sơ
- Ứng viên chọn một hồ sơ
- Hệ thống hiển thị chi tiết và trạng thái hồ sơ
- Ứng viên xem lịch sử trạng thái và dòng thời gian
Hình 8: UC-05 Xem Trạng thái Hồ sơ - Sơ đồ Hoạt động
Hình 9: UC-05 Xem Trạng thái Hồ sơ - Sơ đồ Chuỗi
3.6 UC-06: Duyệt Hồ sơ Ứng tuyển
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-06 |
| Tên | Duyệt Hồ sơ Ứng tuyển |
| Tác nhân | HR |
| Điều kiện tiên quyết | Có hồ sơ ứng tuyển trong hệ thống |
| Điều kiện thành công | HR duyệt và cập nhật trạng thái hồ sơ |
| Kích hoạt | HR truy cập bảng điều khiển hồ sơ |
Luồng Chính:
- HR điều hướng đến bảng điều khiển hồ sơ
- Hệ thống hiển thị tất cả hồ sơ
- HR áp dụng bộ lọc (việc làm, trạng thái)
- Hệ thống trả về kết quả đã lọc
- HR chọn một hồ sơ để duyệt
- HR xem hồ sơ ứng viên, thư xin việc và hồ sơ xin việc (qua URL tải xuống presigned từ module FILE)
- HR cập nhật trạng thái hồ sơ (sàng lọc/từ chối)
Hình 12: UC-06 Duyệt Hồ sơ Ứng tuyển - Sơ đồ Hoạt động
Hình 13: UC-06 Duyệt Hồ sơ Ứng tuyển - Sơ đồ Chuỗi
3.7 UC-07: Lịch phỏng vấn
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-07 |
| Tên | Lịch phỏng vấn |
| Tác nhân | HR |
| Điều kiện tiên quyết | Ứng viên đã vượt qua sàng lọc |
| Điều kiện thành công | Phỏng vấn được lên lịch, thông báo được gửi |
| Kích hoạt | HR nhấn "Lên lịch phỏng vấn" |
Luồng Chính:
- HR chọn ứng viên từ các hồ sơ đã sàng lọc
- HR chọn người phỏng vấn
- HR chọn ngày/giờ và địa điểm
- HR thêm liên kết họp và ghi chú
- Hệ thống kiểm tra lịch trống của người phỏng vấn
- Hệ thống tạo bản ghi phỏng vấn
- Hệ thống gửi lời mời lịch
- Hệ thống thông báo cho ứng viên và người phỏng vấn
Hình 14: UC-07 Lịch phỏng vấn - Sơ đồ Hoạt động
Hình 15: UC-07 Lịch phỏng vấn - Sơ đồ Chuỗi
3.8 UC-08: Đánh giá Ứng viên (Interviewer)
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-08 |
| Tên | Đánh giá Ứng viên |
| Tác nhân | HR |
| Điều kiện tiên quyết | Phỏng vấn đã hoàn thành |
| Điều kiện thành công | Đánh giá được ghi nhận |
| Kích hoạt | HR truy cập chi tiết phỏng vấn |
Luồng Chính:
- HR truy cập phỏng vấn đã hoàn thành
- HR xem lại hồ sơ và CV của ứng viên
- HR nhập điểm đánh giá (kỹ thuật, giao tiếp, phù hợp văn hóa)
- HR chọn đề xuất (strong_yes/yes/neutral/no/strong_no)
- HR thêm nhận xét
- Hệ thống lưu bản ghi đánh giá
- Hệ thống cập nhật trạng thái phỏng vấn
Hình 16: UC-08 Đánh giá Ứng viên - Sơ đồ Hoạt động
Hình 17: UC-08 Đánh giá Ứng viên - Sơ đồ Chuỗi
3.9 UC-12: Đánh giá Ứng viên (HR)
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-12 |
| Tên | Đánh giá Ứng viên |
| Tác nhân | HR, Người phỏng vấn |
| Điều kiện tiên quyết | Phỏng vấn đã hoàn thành |
| Điều kiện thành công | Đánh giá ứng viên được nộp |
| Kích hoạt | Người phỏng vấn nhấn "Đánh giá Ứng viên" sau phỏng vấn |
Luồng Chính:
- Người phỏng vấn điều hướng đến phỏng vấn đã hoàn thành
- Người phỏng vấn nhấn "Viết Đánh giá"
- Người phỏng vấn đánh giá ứng viên trên nhiều chiều:
- Kỹ năng chuyên môn (1-5 sao)
- Kỹ năng giao tiếp
- Phù hợp văn hóa
- Khả năng giải quyết vấn đề
- Làm việc nhóm
- Người phỏng vấn viết tiêu đề và mô tả đánh giá
- Người phỏng vấn chọn đề xuất (strong_yes/yes/neutral/no/strong_no)
- Người phỏng vấn gửi đánh giá
- Hệ thống lưu bản ghi đánh giá
- Hệ thống cập nhật điểm trung bình đánh giá của ứng viên
Luồng Thay thế:
- 1a. Phỏng vấn chưa hoàn thành: Hệ thống hiển thị thông báo "Phỏng vấn phải được hoàn thành trước"
- 2a. Đã đánh giá: Hệ thống hiển thị thông báo "Bạn đã đánh giá ứng viên này rồi"
Hình 18: UC-12 Đánh giá Ứng viên - Sơ đồ Hoạt động
Hình 19: UC-12 Đánh giá Ứng viên - Sơ đồ Chuỗi
3.10 UC-15: Quản lý Hồ sơ Xin việc
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-15 |
| Tên | Quản lý Hồ sơ Xin việc |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | Ứng viên đã đăng nhập |
| Điều kiện thành công | Danh sách hồ sơ của ứng viên được cập nhật |
| Kích hoạt | Ứng viên điều hướng đến trang "Hồ sơ của tôi" |
Luồng Chính:
- Ứng viên điều hướng đến trang quản lý "Hồ sơ của tôi"
- Hệ thống hiển thị danh sách tất cả hồ sơ đã tải lên kèm metadata (tên tệp, loại, kích thước, ngày tải lên)
- Ứng viên có thể:
- Tải lên hồ sơ mới: Chọn tệp (PDF/DOCX, tối đa 10MB) - tệp được lưu qua module FILE với đường dẫn
{candidate_user_id}/resumes/{uuid}.pdf
- Đặt hồ sơ chính: Đánh dấu một hồ sơ là chính (mặc định cho các hồ sơ mới)
- Xóa hồ sơ: Xóa hồ sơ chưa được liên kết với bất kỳ hồ sơ ứng tuyển nào
- Tải xuống hồ sơ: Lấy URL tải xuống presigned từ module FILE để xem hồ sơ
- Hệ thống kiểm tra loại tệp và kích thước
- Hệ thống gọi module FILE để lưu tệp và nhận file_id
- Hệ thống tạo bản ghi
recr_candidate_resumes với tham chiếu file_id
- Hệ thống trả về danh sách hồ sơ đã cập nhật
Luồng Thay thế:
- 3a. Loại tệp không hợp lệ: Hệ thống trả về lỗi "Chỉ cho phép tệp PDF và DOCX"
- 3b. Tệp quá lớn: Hệ thống trả về lỗi "Kích thước tệp không được vượt quá 10MB"
- 3c. Xóa hồ sơ đã liên kết: Hệ thống trả về lỗi "Không thể xóa hồ sơ đã liên kết với hồ sơ ứng tuyển đã nộp"
- 4a. Module FILE không khả dụng: Hệ thống trả về lỗi "Dịch vụ tệp tạm thời không khả dụng"
3.11 UC-13: Cập nhật Hồ sơ
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-13 |
| Tên | Cập nhật Hồ sơ |
| Tác nhân | Tất cả (Candidate, HR, Employer) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Điều kiện thành công | Hồ sơ được cập nhật thành công |
| Kích hoạt | Người dùng nhấn "Chỉnh sửa Hồ sơ" |
Luồng Chính:
- Người dùng điều hướng đến trang hồ sơ
- Hệ thống hiển thị dữ liệu hồ sơ hiện tại
- Người dùng chỉnh sửa các trường hồ sơ:
- Tất cả vai trò: Họ tên, số điện thoại, ảnh đại diện
- Candidate: Hồ sơ xin việc, kỹ năng, kinh nghiệm, lương mong muốn
- HR: Phòng ban, chức vụ
- Employer: Tên công ty, trang web, mô tả, ngành nghề, quy mô
- Người dùng gửi thay đổi
- Hệ thống kiểm tra dữ liệu đầu vào
- Hệ thống cập nhật bản ghi hồ sơ
- Hệ thống trả về phản hồi thành công
Luồng Thay thế:
- 3a. Dữ liệu đầu vào không hợp lệ: Hệ thống hiển thị lỗi xác thực
- 4a. Tải lên thất bại: Hệ thống hiển thị lỗi tải lên tệp
Hình 10: UC-13 Cập nhật Hồ sơ - Sơ đồ Hoạt động
Hình 11: UC-13 Cập nhật Hồ sơ - Sơ đồ Chuỗi
3.12 UC-11: Đánh giá Việc làm
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-11 |
| Tên | Đánh giá Việc làm |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | Ứng viên đã ứng tuyển hoặc làm việc tại công ty |
| Điều kiện thành công | Đánh giá việc làm được nộp và hiển thị cho người dùng khác |
| Kích hoạt | Ứng viên nhấn "Đánh giá" trên danh sách việc làm |
Luồng Chính:
- Ứng viên điều hướng đến danh sách việc làm
- Ứng viên nhấn "Viết Đánh giá"
- Ứng viên đánh giá việc làm trên nhiều chiều:
- Đánh giá tổng thể (1-5 sao)
- Cân bằng công việc-cuộc sống
- Đền bù
- Phát triển nghề nghiệp
- Văn hóa công ty
- Ứng viên viết tiêu đề và mô tả đánh giá
- Ứng viên gửi đánh giá
- Hệ thống lưu bản ghi đánh giá
- Hệ thống cập nhật điểm trung bình đánh giá của việc làm
Luồng Thay thế:
- 1a. Ứng viên chưa ứng tuyển: Hệ thống hiển thị thông báo "Chỉ người nộp đơn mới có thể đánh giá"
- 2a. Đã đánh giá: Hệ thống hiển thị thông báo "Bạn đã đánh giá việc làm này rồi"
Hình 20: UC-11 Đánh giá Việc làm - Sơ đồ Hoạt động
Hình 21: UC-11 Đánh giá Việc làm - Sơ đồ Chuỗi
3.13 UC-17: Trích xuất Skills từ CV bằng AI
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-17 |
| Tên | Trích xuất Tags/Skills từ CV bằng AI |
| Tác nhân | Hệ thống (kích hoạt tự động), Candidate (xem kết quả) |
| Điều kiện tiên quyết | Candidate đã tải CV lên (UC-15) |
| Điều kiện thành công | CV được gắn danh sách skills/tags có độ tin cậy |
| Kích hoạt | Sự kiện resume.uploaded (nội bộ, sau UC-15 bước 6) |
Luồng Chính:
- Hệ thống nhận sự kiện
resume.uploaded sau khi CV lưu thành công vào module FILE
- Hệ thống đưa job xử lý vào hàng đợi (queue) phân tích CV, trạng thái CV =
processing
- Worker lấy nội dung CV (qua module FILE, presigned URL) và trích xuất văn bản (OCR nếu ảnh scan)
- Worker gọi AI (LLM) với prompt trích xuất: kỹ năng cứng, kỹ năng mềm, số năm kinh nghiệm, chức danh, trình độ học vấn
- AI trả về danh sách skills/tags dạng có cấu trúc (JSON) kèm điểm tin cậy (confidence score) cho từng tag
- Hệ thống chuẩn hóa tag (map về từ điển skill chuẩn — vd "ReactJS" và "React.js" → "React")
- Hệ thống lưu kết quả vào
recr_resume_skills, cập nhật trạng thái CV = analyzed
- Candidate thấy danh sách skill được gợi ý trên trang "Hồ sơ của tôi", có thể sửa/xóa/thêm thủ công
Luồng Thay thế:
- 3a. CV là ảnh scan chất lượng thấp/không đọc được: trạng thái =
failed, thông báo Candidate tự nhập tay
- 4a. AI service timeout/lỗi: retry tối đa 3 lần với backoff, sau đó chuyển
failed
- 8a. Candidate chỉnh sửa tag do AI gợi ý sai: hệ thống lưu
is_manual_override = true cho tag đó (không bị ghi đè ở lần phân tích lại)
Sơ đồ Hoạt động
Hình 24: Luồng Trích xuất Tags/Skills từ CV bằng AI
Sơ đồ Chuỗi
Hình 25: Tích hợp Trích xuất Skills từ CV
3.14 UC-18: Trích xuất Skills từ JD bằng AI
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-18 |
| Tên | Trích xuất Tags/Skills từ JD bằng AI |
| Tác nhân | Hệ thống (tự động), HR/Employer (xem & duyệt kết quả) |
| Điều kiện tiên quyết | Tin tuyển dụng đã được lưu bản nháp (UC-09 bước 5) |
| Điều kiện thành công | Job được gắn danh sách skills/tags yêu cầu |
| Kích hoạt | Sự kiện job.draft_saved hoặc HR bấm "Gợi ý Tags bằng AI" |
Luồng Chính:
- HR/Employer nhập xong mô tả công việc + yêu cầu (UC-09 bước 2-4), lưu nháp
- Hệ thống tự động (hoặc HR chủ động bấm nút) gửi job vào hàng đợi phân tích JD
- Worker gọi AI với nội dung JD: tiêu đề, mô tả, yêu cầu, đưa ra danh sách skill/tag bắt buộc (required) và ưu tiên (nice_to_have)
- Hệ thống chuẩn hóa tag theo cùng từ điển skill dùng cho CV (đảm bảo đồng nhất để matching)
- Hệ thống lưu vào
recr_job_skills, hiển thị gợi ý cho HR dưới dạng chip có thể chọn/bỏ trước khi công bố
- HR xác nhận hoặc chỉnh sửa danh sách tag, lưu lại
- Tin tuyển dụng tiếp tục luồng gửi duyệt (UC-09 bước 6 trở đi)
Luồng Thay thế:
- 3a. JD quá ngắn/thiếu thông tin: AI trả về danh sách rỗng hoặc cảnh báo, gợi ý HR bổ sung mô tả
- 3b. AI service lỗi: HR vẫn có thể đăng tin bình thường, tự nhập tag thủ công (tính năng AI không chặn luồng đăng tin)
Lưu ý thiết kế: Vì skill trên CV và JD phải dùng chung một hệ tag/skill chuẩn hóa, cần một bảng master recr_skills_taxonomy — tránh tình trạng CV ghi "NodeJS" còn JD ghi "Node.js" thành 2 tag khác nhau, làm sai điểm matching.
Sơ đồ Hoạt động
Hình 26: Luồng Trích xuất Tags/Skills từ JD bằng AI
Sơ đồ Chuỗi
Hình 27: Tích hợp Trích xuất Skills từ JD
3.15 UC-19: Tính điểm Matching Ứng viên - Việc làm
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-19 |
| Tên | Tính điểm Matching Ứng viên - Việc làm |
| Tác nhân | Hệ thống (tự động tính), HR/Candidate (xem điểm) |
| Điều kiện tiên quyết | Cả CV (UC-17) và Job (UC-18) đã có tags/skills |
| Điều kiện thành công | Điểm matching (0-100%) được tính và hiển thị |
| Kích hoạt | Candidate xem chi tiết job (UC-03), hoặc HR mở danh sách người nộp đơn (UC-06) |
Luồng Chính:
- Candidate xem chi tiết một job / hoặc HR mở danh sách ứng viên đã nộp cho 1 job
- Hệ thống lấy danh sách tag của CV và tag của Job
- Hệ thống tính điểm theo công thức trọng số (vd: required skill khớp = 70%, nice-to-have khớp = 20%, kinh nghiệm/trình độ phù hợp = 10%)
- Hệ thống lưu kết quả vào
recr_match_scores kèm breakdown (tag nào khớp, tag nào thiếu)
- Hệ thống hiển thị điểm % kèm chi tiết: "Khớp 8/10 kỹ năng yêu cầu, thiếu: Docker, Kubernetes"
- (HR) Danh sách người nộp đơn được sắp xếp mặc định theo điểm matching giảm dần
Luồng Thay thế:
- 2a. CV hoặc Job chưa được AI phân tích xong (đang processing): hiển thị "Đang tính toán độ phù hợp..."
- 3a. Không có tag nào ở 1 trong 2 phía: điểm = 0%, hiển thị "Chưa đủ dữ liệu để so khớp"
Sơ đồ Hoạt động
Hình 28: Luồng Tính điểm Matching Ứng viên - Việc làm
Sơ đồ Chuỗi
Hình 29: Tích hợp Tính điểm Matching
3.16 UC-20: Gợi ý Ứng viên Phù hợp
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-20 |
| Tên | Gợi ý Ứng viên Phù hợp cho Việc làm Mới |
| Tác nhân | Hệ thống (tự động), HR (xem và hành động), Candidate (nhận thông báo mời) |
| Điều kiện tiên quyết | Việc làm đã được duyệt và ở trạng thái "open" (UC-10); việc làm đã có skills từ UC-18; ứng viên đã bật is_open_to_work = true trên hồ sơ (FR-052) |
| Điều kiện thành công | Danh sách ứng viên phù hợp và đang sẵn sàng được tạo, thông báo cho HR mà không gây trùng lặp/làm phiền ứng viên |
| Kích hoạt | Sự kiện nội bộ job.approved |
Luồng Chính:
- Hệ thống nhận sự kiện
job.approved, đưa job vào hàng đợi xử lý gợi ý ứng viên
- Worker lấy danh sách skill yêu cầu của việc làm từ
recr_job_skills, giới hạn phạm vi ứng viên trong cùng tổ chức đăng job
- Worker lọc sơ bộ ứng viên bằng truy vấn có ít nhất một skill trùng với việc làm (join
recr_resume_skills với recr_job_skills), chỉ lấy ứng viên có is_open_to_work = true và không ở trạng thái "hired" cho việc làm khác trong tổ chức
- Với từng ứng viên trong tập đã lọc, worker gọi lại hàm tính điểm phù hợp dùng chung với UC-19 (không viết thuật toán riêng)
- Hệ thống lọc các ứng viên có điểm phù hợp trên ngưỡng cấu hình (mặc định 70%), sắp xếp giảm dần, lấy tối đa N ứng viên đầu (mặc định 20)
- Hệ thống kiểm tra giới hạn tần suất: bỏ qua ứng viên đã nhận đủ số lời mời gợi ý tối đa từ tổ chức này trong khoảng thời gian cấu hình (mặc định tối đa 3 gợi ý/tuần/tổ chức)
- Hệ thống lưu kết quả vào
recr_job_suggestions với trạng thái "new"
- Hệ thống gửi thông báo cho HR phụ trách: "N ứng viên phù hợp cho việc làm [tên việc làm]"
- HR mở danh sách gợi ý, xem chi tiết điểm phù hợp và có thể gửi lời mời ứng tuyển trực tiếp (tái sử dụng luồng mời hiện có ở module Invitation)
Luồng Thay thế:
- 3a. Không có ứng viên nào thỏa điều kiện lọc sơ bộ: hệ thống không tạo gợi ý, không gửi thông báo
- 5a. Không có ứng viên nào đạt ngưỡng điểm phù hợp: hệ thống ghi log, không gửi thông báo cho HR
- 6a. Ứng viên đã đạt giới hạn tần suất nhận gợi ý: ứng viên bị loại khỏi danh sách gợi ý cho job này, không tính là lỗi, tiếp tục xử lý các ứng viên còn lại
- 6b. Cùng một ứng viên phù hợp với nhiều job được duyệt gần nhau (trong cùng ngày, cùng tổ chức): hệ thống gộp thành một thông báo duy nhất cho ứng viên ("Có N vị trí phù hợp với bạn") thay vì gửi riêng lẻ từng job
- 9a. HR gửi lời mời cho ứng viên gợi ý: hệ thống cập nhật trạng thái gợi ý tương ứng thành "contacted"
- 9b. HR bỏ qua gợi ý: HR có thể đánh dấu "Bỏ qua", trạng thái chuyển thành "dismissed", không gợi ý lại ứng viên đó cho cùng việc làm
Sơ đồ Hoạt động
Hình 30: Luồng Gợi ý Ứng viên Phù hợp cho Việc làm Mới
Sơ đồ Chuỗi
Hình 31: Tích hợp Gợi ý Ứng viên
3.17 UC-14: Xem Bảng Điều khiển
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-14 |
| Tên | Xem Bảng Điều khiển |
| Tác nhân | HR, Employer |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Điều kiện thành công | Người dùng xem bảng điều khiển phân tích |
| Kích hoạt | Người dùng nhấn menu "Bảng điều khiển" |
Luồng Chính:
- Người dùng điều hướng đến trang bảng điều khiển
- Hệ thống truy vấn OpenSearch để lấy dữ liệu tổng hợp
- Hệ thống hiển thị bảng điều khiển với:
- Phân tích Người dùng:
- Tổng số người dùng đã đăng ký (theo vai trò: Candidate, HR, Employer)
- Đăng ký mới (hàng ngày, hàng tuần, hàng tháng)
- Người dùng hoạt động (đăng nhập trong 7 ngày qua)
- Biểu đồ xu hướng tăng trưởng người dùng
- Phân tích Đăng nhập:
- Tổng số lần đăng nhập (theo vai trò)
- Tần suất đăng nhập (theo giờ, theo ngày)
- Số lần đăng nhập thất bại
- Thời điểm đăng nhập cao điểm
- Phân tích Tuyển dụng: (Chỉ HR)
- Việc làm đang mở
- Hồ sơ đã nhận
- Phỏng vấn đã lên lịch
- Đề nghị đã gửi
- Phân tích Đăng ký:
- Đăng ký đang hoạt động theo gói
- Doanh thu theo gói
- Đăng ký sắp hết hạn
- Người dùng có thể lọc theo khoảng thời gian
- Hệ thống cập nhật bảng điều khiển với dữ liệu đã lọc
Luồng Thay thế:
- 2a. OpenSearch không khả dụng: Hệ thống hiển thị dữ liệu đã lưu trong bộ nhớ đệm hoặc thông báo lỗi
- 4a. Không có dữ liệu: Hệ thống hiển thị thông báo "Không có dữ liệu"
3.18 UC-21: Báo cáo & Thống kê Tương tác Ứng viên
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-21 |
| Tên | Báo cáo & Thống kê Tương tác Ứng viên (Candidate Activity & Application Analytics) |
| Tác nhân | Admin, HR Manager, Employer |
| Điều kiện tiên quyết | Người dùng đã đăng nhập với vai trò Admin, HR hoặc Employer trong tổ chức |
| Điều kiện thành công | Hệ thống hiển thị báo cáo với các chỉ số KPI, biểu đồ và bảng số liệu |
| Kích hoạt | Người dùng chọn menu "Báo cáo Tương tác Ứng viên" |
Các chỉ số KPI cần thống kê:
| Chỉ số | Công thức | Mô tả |
| New CV Uploads | COUNT(recr_candidate_resumes) WHERE created_at IN range | Số lượt upload CV mới trong khoảng thời gian |
| Updated CVs | COUNT(recr_candidate_resumes) WHERE updated_at > created_at IN range | Số lượng CV được cập nhật/chỉnh sửa |
| Total Job Applications | COUNT(recr_applications) WHERE created_at IN range | Số lượt ứng tuyển công việc |
| Application Success Rate | COUNT(applications WHERE status='offered') / COUNT(all applications) * 100 | Tỷ lệ ứng tuyển thành công (được nhận offer) |
Bộ lọc & Phân đoạn dữ liệu:
| Filter | Giá trị |
| Khoảng thời gian | Ngày / Tuần / Tháng / Tùy chọn (từ-đến) |
| Vị trí tuyển dụng | Job Title (dropdown) |
| Phòng ban / Chi nhánh | Department / Branch (dropdown) |
| Trạng thái ứng tuyển | pending, screening, interview, offered, rejected, withdrawn |
Luồng Chính:
- Người dùng điều hướng đến trang "Báo cáo Tương tác Ứng viên"
- Hệ thống hiển thị bộ lọc mặc định (30 ngày gần nhất, tất cả vị trí, tất cả phòng ban)
- Hệ thống truy vấn database để lấy dữ liệu thô theo bộ lọc mặc định
- Hệ thống tính toán các chỉ số KPI: New CV Uploads, Updated CVs, Total Job Applications, Application Success Rate
- Hệ thống render biểu đồ (line chart theo thời gian, bar chart theo vị trí, pie chart theo trạng thái) và bảng số liệu chi tiết
- Người dùng xem báo cáo, có thể hover để xem tooltip chi tiết
- Người dùng thay đổi bộ lọc (thời gian, vị trí, phòng ban, trạng thái)
- Hệ thống refresh dữ liệu và render lại biểu đồ/bảng với bộ lọc mới
Luồng Thay thế:
- 6a. Xuất file Excel/CSV: Người dùng nhấn "Xuất file" → Hệ thống generate file với đầy đủ dữ liệu → Trả về download URL → Người dùng tải file
- 6b. Thay đổi khoảng thời gian: Người dùng chọn timeframe khác → Hệ thống query lại dữ liệu → Cập nhật biểu đồ và bảng
- 6c. So sánh kỳ: Người dùng chọn "So sánh với kỳ trước" → Hệ thống query dữ liệu kỳ trước → Hiển thị % thay đổi trên từng KPI
Luồng Ngoại lệ:
- 3a. Không có dữ liệu trong khoảng thời gian chọn: Hệ thống hiển thị thông báo "Không có dữ liệu trong khoảng thời gian đã chọn" với gợi ý mở rộng khoảng thời gian
- 3b. Lỗi tải dữ liệu: Hệ thống hiển thị thông báo lỗi "Không thể tải dữ liệu báo cáo", cho phép nhấn nút tải lại (retry)
- 3c. Database quá tải: Hệ thống trả về dữ liệu từ cache (Redis) nếu có, nếu không hiển thị thông báo "Hệ thống đang bận, vui lòng thử lại sau"
Quy tắc Nghiệp vụ:
| Quy tắc | Chi tiết |
| Application Success Rate | Chỉ tính ứng viên có status = offered. Không tính pending, screening, interview đang chạy |
| Phân quyền xem | Employer: xem dữ liệu tổ chức mình. HR: xem dữ liệu phòng ban mình. Admin: xem toàn bộ hệ thống |
| Tần suất cập nhật | Dữ liệu cập nhật real-time cho Application. CV uploads cập nhật mỗi 5 phút (batch). Dashboard cache TTL = 5 phút |
| Khoảng thời gian tối đa | Không quá 12 tháng cho 1 lần query. Nếu chọn > 12 tháng, hệ thống cảnh báo và gợi ý chia kỳ |
| Xuất file | Giới hạn 10,000 dòng mỗi file. Nếu vượt quá, hệ thống cảnh báo và gợi ý thu hẹp bộ lọc |
Yêu cầu Phi chức năng:
| Yêu cầu | Mục tiêu |
| Thời gian tải báo cáo | < 3 giây (p95) cho dataset ≤ 100,000 records |
| Đồng thời | Hỗ trợ 50+ user xem báo cáo cùng lúc |
| Xuất file | Generate file < 10 giây cho ≤ 10,000 dòng |
| Cache | Redis cache TTL 5 phút, invalidate khi có dữ liệu mới |
FR Liên quan: FR-054, FR-055, FR-056
Sơ đồ Chuỗi
Hình 32: UC-21 Báo cáo & Thống kê Tương tác Ứng viên - Sơ đồ Chuỗi
3.19 UC-01: Mua Gói Đăng ký
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-01 |
| Tên | Mua Gói Đăng ký |
| Tác nhân | Tất cả (Candidate, HR, Employer) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập, chưa có gói đăng ký |
| Điều kiện thành công | Gói đăng ký được kích hoạt, người dùng có thể truy cập tính năng cao cấp |
| Kích hoạt | Người dùng nhấn "Đăng ký gói" |
Luồng Chính:
- Người dùng điều hướng đến trang đăng ký gói
- Hệ thống hiển thị các gói có sẵn:
- 1 Tháng: Giá tiêu chuẩn
- 6 Tháng: Giảm 10%
- 1 Năm: 2 tháng miễn phí (trả tiền cho 10 tháng)
- Người dùng chọn gói
- Hệ thống tính toán giá cuối cùng với giảm giá
- Người dùng xem lại tóm tắt đơn hàng
- Người dùng hoàn thành thanh toán
- Hệ thống tạo bản ghi đăng ký
- Hệ thống kích hoạt đăng ký
- Người dùng nhận xác nhận
- Người dùng có thể truy cập tính năng cao cấp (khác nhau tùy vai trò)
Lợi ích Đăng ký theo Vai trò:
- Candidate: Ưu tiên ứng tuyển, nâng cấp hồ sơ, phân tích nâng cao
- HR: Công cụ tuyển dụng nâng cao, hỗ trợ ưu tiên, phân tích nâng cao
- Employer: Đăng tin cao cấp, tin được giới thiệu, theo dõi ứng viên nâng cao
Luồng Thay thế:
- 7a. Thanh toán thất bại: Hệ thống hiển thị lỗi, gói đăng ký không được kích hoạt
- 7b. Đã hủy thanh toán: Hệ thống quay lại lựa chọn gói
3.20 UC-02: Quản lý Gói Đăng ký
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-02 |
| Tên | Quản lý Gói Đăng ký |
| Tác nhân | Tất cả (Candidate, HR, Employer) |
| Điều kiện tiên quyết | Người dùng có gói đăng ký (đang hoạt động hoặc đã hết hạn) |
| Điều kiện thành công | Trạng thái gói đăng ký được cập nhật |
| Kích hoạt | Người dùng truy cập trang quản lý đăng ký |
Luồng Chính:
- Người dùng điều hướng đến trang quản lý đăng ký
- Hệ thống hiển thị trạng thái đăng ký hiện tại:
- Tên gói và thời hạn
- Ngày bắt đầu và ngày kết thúc
- Số ngày còn lại
- Trạng thái gia hạn tự động
- Employer có thể:
- Gia hạn đăng ký
- Nâng cấp gói (ví dụ: 1 tháng -> 6 tháng)
- Hủy gia hạn tự động
- Hệ thống xử lý yêu cầu
- Hệ thống cập nhật bản ghi đăng ký
3.21 UC-16: Cấu hình Webhook Cá nhân
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-16 |
| Tên | Cấu hình Webhook Cá nhân |
| Tác nhân | HR / Employer |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Điều kiện thành công | Webhook được lưu và kích hoạt/vô hiệu hóa thành công |
| Kích hoạt | Người dùng truy cập "Cài đặt" > "Tích hợp Webhook" |
Luồng Chính:
- Người dùng điều hướng đến trang Cài đặt > Webhook
- Người dùng nhập URL webhook (endpoint đích)
- Người dùng chọn các sự kiện muốn nhận. Mặc định chỉ có
application.submitted
- Người dùng bật công tắc "Kích hoạt Webhook"
- Hệ thống xác thực định dạng URL (phải là HTTPS)
- Hệ thống gửi một sự kiện test (
webhook.test) đến URL để xác minh endpoint phản hồi 2xx
- Hệ thống lưu cấu hình webhook cho người dùng
- Người dùng thấy thông báo thành công kèm trạng thái "Đang hoạt động"
Luồng Thay thế:
- 5a. URL không hợp lệ hoặc không phải HTTPS: Hệ thống hiển thị lỗi xác thực
- 6a. Test webhook thất bại (timeout/lỗi 4xx-5xx): Hệ thống lưu cấu hình ở trạng thái "Chưa xác minh" và cảnh báo người dùng, không tự động kích hoạt
Sơ đồ Hoạt động
Hình 33: Luồng Cấu hình Webhook Cá nhân
Sơ đồ Chuỗi
Hình 34: Tích hợp Cấu hình Webhook
3.22 UC-22: Đăng tin Hot Job
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-22 |
| Tên | Đăng tin Hot Job |
| Tác nhân | HR, Employer |
| Điều kiện tiên quyết | Người dùng có gói đăng ký Premium/Enterprise |
| Điều kiện thành công | Việc làm được đánh dấu là Hot Job, hiển thị ưu tiên |
| Kích hoạt | Người dùng nhấn "Đặt Hot Job" trên việc làm |
Luồng Chính:
- HR/Employer chọn việc làm cần đẩy Hot
- Hệ thống hiển thị tùy chọn Hot Job:
- 3 Ngày: Giá tiêu chuẩn
- 7 Ngày: Giảm 10%
- 14 Ngày: Giảm 20%
- Người dùng chọn thời hạn và thanh toán
- Hệ thống cập nhật việc làm: is_hot = true, hot_expires_at = now + duration
- Việc làm hiển thị nhãn "HOT" và ưu tiên trong kết quả tìm kiếm
- Hệ thống gửi thông báo khi Hot Job sắp hết hạn
Luồng Thay thế:
- 1a. Chưa có gói Premium: Hiển thị thông báo "Cần gói Premium để sử dụng Hot Job"
- 3a. Thanh toán thất bại: Gói Hot Job không được kích hoạt
3.23 UC-23: Mua Quảng cáo Job (Ads Job)
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-23 |
| Tên | Mua Quảng cáo Job (Ads Job) |
| Tác nhân | HR, Employer |
| Điều kiện tiên quyết | Người dùng đã tạo việc làm, có thanh toán |
| Điều kiện thành công | Job được quảng cáo trên trang chủ và kết quả tìm kiếm |
| Kích hoạt | Người dùng nhấn "Quảng cáo Job" trên việc làm |
Luồng Chính:
- HR/Employer chọn việc làm cần quảng cáo
- Hệ thống hiển thị tùy chọn quảng cáo:
- Gói Cơ bản: Hiển thị trên trang chủ, 7 ngày
- Gói Nâng cao: Hiển thị trên trang chủ + email recommendation, 14 ngày
- Gói Premium: Hiển thị trên trang chủ + email + push notification, 30 ngày
- Người dùng chọn gói và ngân sách quảng cáo
- Hệ thống tính toán chi phí dựa trên gói và thời hạn
- Người dùng hoàn thành thanh toán
- Hệ thống tạo bản ghi quảng cáo (recr_job_ads)
- Job được gắn nhãn "Ad" và hiển thị ưu tiên
- Hệ thống theo dõi lượt hiển thị và lượt nhấp
Luồng Thay thế:
- 5a. Thanh toán thất bại: Quảng cáo không được kích hoạt
- 8a. Job hết hạn: Quảng cáo tự động dừng, hệ thống gửi báo cáo hiệu quả
3.24 UC-24: Ứng tuyển qua Link HR
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-24 |
| Tên | Ứng tuyển qua Link HR |
| Tác nhân | Candidate |
| Điều kiện tiên quyết | HR đã chia sẻ link job, việc làm đang mở |
| Điều kiện thành công | Hồ sơ ứng tuyển được tạo, HR nhận thông báo |
| Kích hoạt | Ứng viên truy cập link job từ HR |
Luồng Chính:
- Ứng viên nhận link job từ HR (qua email, Zalo, LinkedIn...)
- Ứng viên truy cập link → Hệ thống hiển thị chi tiết job
- Ứng viên nhấn "Ứng tuyển ngay"
- Nếu chưa đăng nhập: Hệ thống yêu cầu đăng ký/đăng nhập
- Ứng viên chọn hồ sơ hoặc tải lên mới
- Ứng viên nhập thư xin việc
- Hệ thống gắn source = "hr_link" để track hiệu quả recruitment link
- Hệ thống tạo bản ghi ứng tuyển
- Hệ thống gửi thông báo cho HR: "Có ứng viên mới qua link chia sẻ"
Lợi ích:
- HR theo dõi được hiệu quả từng link chia sẻ
- Ứng viên trải nghiệm ứng tuyển nhanh, không cần tìm kiếm
- Tính conversion rate từ link HR
3.25 UC-25: HR Chia sẻ Link Job
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-25 |
| Tên | HR Chia sẻ Link Job |
| Tác nhân | HR |
| Điều kiện tiên quyết | HR đã tạo việc làm, việc làm đang mở |
| Điều kiện thành công | Link được tạo, HR có thể chia sẻ |
| Kích hoạt | HR nhấn "Chia sẻ Link" trên việc làm |
Luồng Chính:
- HR chọn việc làm cần chia sẻ
- Hệ thống tạo link rút gọn: recr.com/j/{job_id}?ref={hr_id}
- HR thấy Preview card của job (tiêu đề, lương, địa điểm)
- HR chọn kênh chia sẻ:
- Sao chép link
- Gửi qua email
- Chia sẻ lên mạng xã hội
- Hệ thống ghi nhận hr_job_links (hr_id, job_id, channel, created_at)
- HR có thể xem thống kê lượt click từ link
3.26 UC-26: Tính Hoa hồng HR
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-26 |
| Tên | Tính Hoa hồng HR |
| Tác nhân | Hệ thống, Admin |
| Điều kiện tiên quyết | Ứng viên được hiring, HR đã tạo/refer ứng viên |
| Điều kiện thành công | Hoa hồng được tính và ghi nhận |
| Kích hoạt | Ứng viên cập nhật trạng thái "hired" |
Luồng Chính:
- Ứng viên được đánh giá "hired" bởi Employer
- Hệ thống kiểm tra HR nào đã:
- Tạo việc làm này, HOẶC
- Refer ứng viên này (qua link HR), HOẶC
- Phỏng vấn và đánh giá ứng viên này
- Hệ thống tính hoa hồng dựa trên:
- Loại việc làm: IT = 10%, Non-IT = 8%
- Lương tháng đầu: Lương gross × % hoa hồng
- Thời hạn: Hoa hồng thanh toán sau 30 ngày thử việc
- Hệ thống tạo bản ghi hoa hồng (recr_hr_commissions)
- Admin xem danh sách hoa hồng chờ thanh toán
- Admin xác nhận thanh toán hoa hồng
- Hệ thống cập nhật trạng thái: pending → paid
Công thức tính:
commission_amount = gross_salary × commission_rate
commission_rate = job_type == "IT" ? 0.10 : 0.08
payment_date = hired_date + 30 days
3.27 UC-27: Tạo Tổ chức (Organization)
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-27 |
| Tên | Tạo Tổ chức |
| Tác nhân | Employer / HR |
| Điều kiện tiên quyết | Người dùng đã đăng nhập, chưa có tổ chức nào sở hữu |
| Điều kiện thành công | Tổ chức được tạo, người dùng trở thành Owner, có thể đăng tin tuyển dụng |
| Kích hoạt | Người dùng nhấn "Tạo Tổ chức" hoặc truy cập lần đầu với vai trò Employer/HR |
Luồng Chính:
- Người dùng điều hướng đến trang "Tạo Tổ chức"
- Hệ thống hiển thị form tạo tổ chức:
- Tên tổ chức: Bắt buộc, duy nhất
- URL Slug: Duy nhất, tự động tạo từ tên, có thể chỉnh sửa. Định dạng:
recr.com/o/{slug}
- Mô tả: Optional
- Lĩnh vực: Dropdown chọn
- Website: Optional
- Logo: Optional (upload qua FILE module)
- Người dùng nhập thông tin và nhấn "Tạo"
- Hệ thống kiểm tra:
- Tên tổ chức chưa tồn tại
- Slug chưa tồn tại (kiểm tra real-time khi nhập)
- Người dùng chưa sở hữu tổ chức khác
- Hệ thống tạo bản ghi tổ chức (status: active)
- Hệ thống tạo bản ghi thành viên với role: owner
- Người dùng thấy thông báo thành công và được chuyển đến trang tổ chức
- Người dùng có thể bắt đầu đăng tin tuyển dụng
Luồng Thay thế:
- 4a. Tên tổ chức đã tồn tại: Hệ thống hiển thị lỗi "Tên tổ chức đã được sử dụng"
- 4b. Slug đã tồn tại: Hệ thống gợi ý slug khác
- 4c. Đã có tổ chức: Hệ thống từ chối "Bạn chỉ có thể tạo 1 tổ chức"
3.28 UC-28: Quản lý Tổ chức
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-28 |
| Tên | Quản lý Tổ chức |
| Tác nhân | Owner, HR |
| Điều kiện tiên quyết | Người dùng là Owner hoặc HR của tổ chức |
| Điều kiện thành công | Thông tin tổ chức được cập nhật, thành viên được quản lý |
| Kích hoạt | Owner truy cập trang quản lý tổ chức |
Luồng Chính:
- Owner truy cập trang quản lý tổ chức
- Hệ thống hiển thị thông tin tổ chức:
- Tên, slug, mô tả, logo
- Danh sách thành viên (Owner, HR)
- Số lượng việc làm đang đăng
- Owner có thể:
- Chỉnh sửa thông tin tổ chức
- Mời HR qua email
- Quản lý vai trò thành viên
- Xóa thành viên (không xóa được Owner)
- HR được mời nhận email và chấp nhận
- HR trở thành thành viên của tổ chức, có thể đăng tin tuyển dụng
3.29 UC-29: Đăng tin Việc làm (Draft → Publish)
| Trường | Mô tả |
| Mã Trường hợp sử dụng | UC-29 |
| Tên | Đăng tin Việc làm |
| Tác nhân | Owner, HR |
| Điều kiện tiên quyết | Người dùng là Owner hoặc HR của tổ chức active |
| Điều kiện thành công | Việc làm được đăng và hiển thị trên trang tìm kiếm |
| Kích hoạt | Người dùng nhấn "Đăng tin tuyển dụng" |
Luồng Chính:
- Người dùng nhấn "Tạo tin tuyển dụng mới"
- Hệ thống kiểm tra OrgGuard: người dùng thuộc tổ chức active
- Hệ thống hiển thị form tạo việc làm
- Bước 1 - Lưu nháp:
- Người dùng nhập thông tin bất kỳ (không bắt buộc đầy đủ)
- Nhấn "Lưu nháp" → Việc làm được lưu với status: draft
- Có thể lưu lại bất cứ lúc nào
- Bước 2 - Chỉnh sửa:
- Chỉ sửa được việc làm có status: draft
- Có thể thêm/bớt yêu cầu công việc (skills, kinh nghiệm...)
- Bước 3 - Đăng tin:
- Nhấn "Đăng tin" → Hệ thống validate đầy đủ:
title - không rỗng
description - không rỗng
salary_min <= salary_max
location - không rỗng
job_type - hợp lệ (full_time, part_time, contract...)
- Nếu validate thành công: status → pending_approval
- Admin/HR duyệt tin → status → open
- Việc làm hiển thị trên trang tìm việc
Luồng Thay thế:
- 5a. Validate thất bại: Hệ thống hiển thị lỗi, cho phép chỉnh sửa
- 7a. Admin từ chối: status → draft, lý do từ chối
4. Yêu cầu Chức năng
4.1 Yêu cầu Ứng viên
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-001 |
RECR |
Đăng ký Người dùng |
UC-01 |
Cao |
Người dùng có thể đăng ký tài khoản với email, mật khẩu và thông tin hồ sơ cơ bản. Tạo người dùng với vai trò hệ thống user. Các vai trò cấp tổ chức (HR, Candidate, Employer) được giao trong nội bộ tổ chức. |
| FR-002 |
RECR |
Đăng nhập |
UC-02 |
Cao |
Tất cả người dùng có thể đăng nhập bằng email/mật khẩu và nhận JWT token |
| FR-003 |
RECR |
Duyệt Việc làm |
UC-03 |
Cao |
Ứng viên có thể duyệt và tìm kiếm việc làm với bộ lọc (địa điểm, lương, loại hình) |
| FR-004 |
RECR |
Nộp Hồ sơ Ứng tuyển |
UC-04 |
Cao |
Ứng viên có thể nộp hồ sơ với hồ sơ được chọn (từ danh sách hồ sơ) hoặc hồ sơ mới tải lên, kèm thư xin việc. resume_file_id được đóng băng tại thời điểm nộp và trở nên không thể thay đổi trên bản ghi hồ sơ. |
| FR-005 |
RECR |
Xem Trạng thái Hồ sơ |
UC-05 |
Cao |
Ứng viên có thể theo dõi tiến trình hồ sơ qua các giai đoạn tuyển dụng |
| FR-006 |
RECR |
Cập nhật Hồ sơ Ứng viên |
UC-13 |
Trung bình |
Ứng viên có thể cập nhật hồ sơ, kỹ năng và kinh nghiệm |
| FR-007 |
RECR |
Tải lên Hồ sơ |
UC-15 |
Cao |
Ứng viên có thể tải lên và quản lý nhiều tệp hồ sơ (PDF/DOCX, tối đa 10MB mỗi tệp) qua module FILE. Tệp được lưu tại {candidate_user_id}/resumes/{uuid}.pdf. Metadata được lưu trong bảng recr_candidate_resumes với tham chiếu file_id đến sys_files. |
| FR-057 |
RECR |
Quản lý Hồ sơ Ứng viên |
UC-15 |
Cao |
Ứng viên có thể liệt kê, tải lên, đặt chính và xóa hồ sơ từ danh sách hồ sơ. Xóa hồ sơ chỉ được phép khi hồ sơ chưa được liên kết với bất kỳ hồ sơ ứng tuyển nào. |
| FR-058 |
RECR |
Liên kết Hồ sơ Ứng tuyển |
UC-04 |
Cao |
Khi ứng viên nộp hồ sơ, hồ sơ được chọn được liên kết bằng cách sao chép resume_file_id vào bản ghi hồ sơ. Tham chiếu tệp này không thể thay đổi sau khi nộp (đóng băng tại thời điểm nộp). |
| FR-059 |
RECR |
Trích xuất Skills từ CV |
UC-17 |
Trung bình |
Hệ thống tự động trích xuất kỹ năng, chức danh, trình độ học vấn từ CV sau khi tải lên. Kết quả được lưu vào recr_resume_skills. Candidate có thể chỉnh sửa/thêm/xóa tags thủ công (is_manual_override). |
4.3a Yêu cầu HR/Employer — AI & Matching
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-049 |
RECR |
Trích xuất Skills từ JD |
UC-18 |
Trung bình |
Hệ thống tự động (hoặc HR chủ động) trích xuất skills từ JD: required và nice_to_have. HR có thể chọn/bỏ trước khi lưu. Luồng đăng tin không bị chặn nếu AI lỗi. |
| FR-050 |
RECR |
Tính điểm Matching |
UC-19 |
Cao |
Hệ thống tự động tính điểm matching (0-100%) giữa CV và Job theo công thức trọng số. Hiển thị breakdown chi tiết. Lazy re-calculation khi tag thay đổi. |
| FR-051 |
RECR |
Từ điển Skills chuẩn |
UC-17, UC-18 |
Cao |
Bảng master recr_skills_taxonomy đảm bảo tag đồng nhất giữa CV và JD, hỗ trợ matching chính xác. |
| FR-052 |
RECR |
Mở để tìm việc |
UC-20 |
Trung bình |
Candidate có thể bật/tắt is_open_to_work trên hồ sơ. Khi bật, ứng viên xuất hiện trong danh sách gợi ý cho HR. |
| FR-053 |
RECR |
Gợi ý Ứng viên cho Job mới |
UC-20 |
Cao |
Hệ thống tự động gợi ý ứng viên phù hợp khi job được duyệt. Lọc theo skill trùng, điểm matching ≥ 70%, giới hạn tần suất 3 gợi ý/tuần/tổ chức. Lưu vào recr_job_suggestions. |
4.2 Yêu cầu HR
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-008 |
RECR |
Duyệt Hồ sơ Ứng tuyển |
UC-06 |
Cao |
HR có thể duyệt hồ sơ, lọc theo việc làm, trạng thái và trình độ ứng viên. Xem hồ sơ xin việc qua URL tải xuống presigned từ module FILE. |
| FR-009 |
RECR |
Sàng lọc Ứng viên |
UC-06 |
Cao |
HR có thể sàng lọc ứng viên và chuyển họ qua các giai đoạn tuyển dụng |
| FR-010 |
RECR |
Lên lịch Phỏng vấn |
UC-07 |
Cao |
HR có thể lên lịch phỏng vấn với ngày/giờ, địa điểm, liên kết họp |
| FR-011 |
RECR |
Đánh giá Ứng viên |
UC-08 |
Cao |
HR có thể gửi đánh giá với điểm số và đề xuất |
| FR-012 |
RECR |
Từ chối Ứng viên |
UC-06 |
Cao |
HR có thể từ chối ứng viên với lý do tùy chọn |
| FR-013 |
RECR |
Theo dõi Quy trình |
UC-06 |
Cao |
HR có thể xem quy trình tuyển dụng với số lượng ứng viên theo giai đoạn |
| FR-014 |
RECR |
Tạo Báo cáo |
UC-06 |
Trung bình |
HR có thể tạo báo cáo chỉ số và phân tích tuyển dụng |
| FR-028 |
RECR |
HR Đăng tin Việc làm |
UC-09 |
Cao |
HR có thể tạo tin tuyển dụng cho tổ chức của mình |
| FR-029 |
RECR |
HR Quản lý Việc làm |
UC-10 |
Cao |
HR có thể chỉnh sửa, đóng hoặc lưu trữ tin tuyển dụng |
| FR-032 |
RECR |
Cập nhật Hồ sơ HR |
UC-13 |
Trung bình |
HR có thể cập nhật phòng ban, chức vụ và thông tin cá nhân |
| FR-047 |
RECR |
Cấu hình Webhook |
UC-16 |
Trung bình |
Người dùng (HR/Employer) có thể cấu hình một URL webhook đích và bật/tắt trạng thái gửi sự kiện. Mỗi người dùng chỉ có một cấu hình webhook. Khi tắt (is_active = false), hệ thống ngừng gửi mọi sự kiện đến URL đó nhưng vẫn giữ lại cấu hình. |
4.3 Yêu cầu Nhà tuyển dụng
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-015 |
RECR |
Đăng ký Nhà tuyển dụng |
UC-01 |
Cao |
Nhà tuyển dụng có thể đăng ký tài khoản công ty với thông tin công ty |
| FR-016 |
RECR |
Đăng tin Việc làm |
UC-09 |
Cao |
Nhà tuyển dụng có thể tạo tin tuyển dụng với yêu cầu và khoảng lương |
| FR-017 |
RECR |
Quản lý Tin tuyển dụng |
UC-10 |
Cao |
Nhà tuyển dụng có thể chỉnh sửa, đóng hoặc lưu trữ tin tuyển dụng |
| FR-018 |
RECR |
Xem Người nộp đơn |
UC-10 |
Cao |
Nhà tuyển dụng có thể xem người nộp đơn cho việc làm đã đăng |
| FR-019 |
RECR |
Duyệt Tin tuyển dụng |
UC-09 |
Trung bình |
Nhà tuyển dụng có thể gửi việc làm để HR duyệt trước khi công bố. Nhà tuyển dụng cũng có thể xem hồ sơ xin việc qua URL tải xuống presigned từ module FILE khi xem người nộp đơn cho tin tuyển dụng. |
| FR-020 |
RECR |
Xem Phân tích |
UC-10 |
Trung bình |
Nhà tuyển dụng có thể xem phân tích tuyển dụng cho tin tuyển dụng |
| FR-033 |
RECR |
Cập nhật Hồ sơ Nhà tuyển dụng |
UC-13 |
Trung bình |
Nhà tuyển dụng có thể cập nhật thông tin công ty, mô tả và branding |
4.4 Yêu cầu Đăng ký
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-021 |
RECR |
Gói Đăng ký |
UC-01 |
Cao |
Hệ thống cung cấp 3 gói đăng ký: 1 tháng, 6 tháng (giảm 10%), 1 năm (2 tháng miễn phí) |
| FR-022 |
RECR |
Mua Đăng ký |
UC-01 |
Trung bình |
Tất cả người dùng (Candidate, HR, Employer) có thể tùy chọn mua đăng ký cho tính năng cao cấp |
| FR-023 |
RECR |
Kiểm soát Truy cập Đăng ký |
UC-01, UC-02 |
Cao |
Hệ thống kiểm tra trạng thái đăng ký để cung cấp tính năng cao cấp |
| FR-024 |
RECR |
Xác thực Đăng ký |
UC-02 |
Cao |
Hệ thống kiểm tra trạng thái đăng ký trước khi cho phép truy cập tính năng bị giới hạn |
| FR-025 |
RECR |
Gia hạn Đăng ký |
UC-02 |
Trung bình |
Tất cả người dùng có thể gia hạn hoặc nâng cấp đăng ký |
| FR-026 |
RECR |
Lịch sử Đăng ký |
UC-02 |
Thấp |
Tất cả người dùng có thể xem lịch sử đăng ký và hóa đơn thanh toán |
4.5 Yêu cầu Đánh giá
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-030 |
RECR |
Đánh giá Việc làm |
UC-11 |
Trung bình |
Ứng viên có thể đánh giá việc làm với điểm số và mô tả |
| FR-031 |
RECR |
Đánh giá Ứng viên |
UC-12 |
Trung bình |
Người phỏng vấn có thể đánh giá ứng viên với điểm số và đề xuất |
4.6 Yêu cầu Phân tích
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-034 |
RECR |
Phân tích Đăng ký Người dùng |
UC-14 |
Trung bình |
Theo dõi và hiển thị thống kê đăng ký người dùng (tổng, hàng ngày, hàng tuần, hàng tháng) |
| FR-035 |
RECR |
Phân tích Đăng nhập Người dùng |
UC-14 |
Trung bình |
Theo dõi và hiển thị thống kê đăng nhập người dùng (tần suất, thời điểm cao điểm, số lần thất bại) |
| FR-036 |
RECR |
Xem Bảng điều khiển |
UC-14 |
Trung bình |
Hiển thị bảng điều khiển phân tích tổng hợp với biểu đồ và bộ lọc |
| FR-054 |
RECR |
Phân tích Tương tác Ứng viên |
UC-21 |
Cao |
Hệ thống thống kê số lượt upload CV mới (New CV Uploads), CV cập nhật (Updated CVs), lượt ứng tuyển (Total Job Applications) theo khoảng thời gian và bộ lọc (vị trí, phòng ban, trạng thái) |
| FR-055 |
RECR |
Tỷ lệ Ứng tuyển Thành công |
UC-21 |
Cao |
Hệ thống tính và hiển thị tỷ lệ ứng tuyển thành công (Application Success Rate = offered / total * 100) với breakdown chi tiết theo giai đoạn tuyển dụng |
| FR-056 |
RECR |
Xuất Báo cáo Ứng viên |
UC-21 |
Trung bình |
Hệ thống cho phép xuất báo cáo ra file Excel/CSV với đầy đủ dữ liệu KPI và chi tiết từng ứng viên. Giới hạn 10,000 dòng mỗi file |
4.7 Yêu cầu Lời mời
| Mã Yêu cầu |
Module |
Yêu cầu |
Trường hợp SD |
Ưu tiên |
Mô tả |
| FR-039 |
RECR |
Gửi Lời mời |
UC-19 |
Cao |
HR/Employer có thể gửi lời mời đến ứng viên hoặc HR qua email với vai trò tổ chức được giao |
| FR-040 |
RECR |
Tạo Token Lời mời |
UC-19 |
Cao |
Hệ thống tạo token ngẫu nhiên an toàn, lưu băm SHA-256, đưa token gốc vào URL lời mời |
| FR-041 |
RECR |
Gửi Email Lời mời |
UC-19 |
Cao |
Hệ thống phát sự kiện RabbitMQ tới module EMAIL để gửi email lời mời |
| FR-042 |
RECR |
Xác minh Token Lời mời |
UC-20 |
Cao |
Hệ thống xác thực token lời mời khi nhấp, kiểm tra hết hạn và trạng thái |
| FR-043 |
RECR |
Chấp nhận Lời mời |
UC-21 |
Cao |
Hệ thống cập nhật trạng thái lời mời thành ACCEPTED và phát sự kiện cho module AUTH |
| FR-044 |
RECR |
Thu hồi Lời mời |
UC-22 |
Trung bình |
HR/Employer có thể hủy lời mời đang chờ |
| FR-045 |
RECR |
Liệt kê Lời mời |
UC-19 |
Trung bình |
Hệ thống cho phép xem tất cả lời mời với bộ lọc và phân trang |
| FR-046 |
RECR |
Gửi lại Lời mời |
UC-22 |
Trung bình |
Hệ thống tạo token mới cho lời mời hết hạn hoặc bị thu hồi và gửi lại email |
5. Mô hình Dữ liệu
5.1 Sơ đồ Quan hệ Thực thể
Hình 22: ERD Tuyển dụng (3 Vai trò)
5.2 Yêu cầu Dữ liệu
| Mã Yêu cầu |
Thực thể |
Mô tả |
FR Liên quan |
| DR-001 | recr_users | Tài khoản người dùng với xác thực dựa trên vai trò | FR-001, FR-002, FR-016 |
| DR-002 | recr_candidates | Hồ sơ ứng viên với kỹ năng (resume_link được thay bằng tham chiếu file_id qua recr_candidate_resumes) | FR-006, FR-007 |
| DR-002a | recr_candidate_resumes | Danh sách hồ sơ ứng viên với tham chiếu file_id module FILE (hỗ trợ nhiều hồ sơ mỗi ứng viên) | FR-007, FR-008, FR-009 |
| DR-003 | recr_employers | Hồ sơ công ty nhà tuyển dụng | FR-016 |
| DR-004 | recr_jobs | Tin tuyển dụng với yêu cầu | FR-017, FR-018 |
| DR-005 | recr_applications | Hồ sơ ứng tuyển liên kết ứng viên với việc làm, với tham chiếu resume_file_id đóng băng tới module FILE | FR-004, FR-005, FR-009 |
| DR-006 | recr_interviews | Lên lịch và trạng thái phỏng vấn | FR-010 |
| DR-007 | recr_evaluations | Điểm đánh giá phỏng vấn | FR-011 |
| DR-008 | recr_hr_profiles | Hồ sơ người dùng HR | - |
| DR-009 | recr_job_requirements | Yêu cầu việc làm | FR-016, FR-017 |
| DR-010 | recr_subscription_plans | Định nghĩa gói đăng ký | FR-021 |
| DR-010 | recr_subscriptions | Đăng ký người dùng | FR-023, FR-024 |
| DR-011 | recr_subscription_history | Lịch sử thay đổi đăng ký | FR-027 |
| DR-012 | recr_job_reviews | Đánh giá việc làm từ ứng viên | FR-030 |
| DR-013 | recr_candidate_reviews | Đánh giá ứng viên từ người phỏng vấn | FR-031 |
| DR-014 | recr_invitations | Bản ghi lời mời với xác minh dựa trên token | FR-039, FR-042, FR-043, FR-044 |
| DR-015 | recr_webhook_configs | Cấu hình webhook cá nhân — mỗi người dùng có tối đa 1 cấu hình | FR-047 |
| DR-016 | recr_resume_skills | Tags/skills được trích xuất từ CV bằng AI, kèm confidence score và trạng thái | FR-010 |
| DR-017 | recr_job_skills | Tags/skills yêu cầu cho JD, phân loại required/nice_to_have | FR-049 |
| DR-018 | recr_skills_taxonomy | Từ điển skill chuẩn hóa — master data cho matching | FR-051 |
| DR-019 | recr_match_scores | Điểm matching giữa CV và Job kèm breakdown chi tiết | FR-050 |
| DR-020 | recr_job_suggestions | Danh sách gợi ý ứng viên phù hợp cho job mới | FR-053 |
5.3 Chi tiết Bảng — recr_webhook_configs
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
user_id | UUID | FK đến người dùng (1 người dùng = 1 config) |
webhook_url | VARCHAR | URL đích, bắt buộc HTTPS |
is_active | BOOLEAN | Bật/tắt gửi webhook |
subscribed_events | JSON/ARRAY | Danh sách sự kiện đăng ký (vd: ["application.submitted"]) |
secret_key | VARCHAR | Dùng để ký HMAC payload, xác thực nguồn gửi |
status | ENUM | verified / unverified / failed |
last_triggered_at | TIMESTAMP | Lần bắn gần nhất |
created_by | UUID | Người tạo (audit) |
created_at | TIMESTAMP | Thời điểm tạo (audit) |
updated_at | TIMESTAMP | Thời điểm cập nhật (audit) |
5.4 Chi tiết Bảng — recr_resume_skills
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
resume_id | UUID | FK đến recr_candidate_resumes |
skill_id | UUID | FK đến recr_skills_taxonomy |
confidence_score | FLOAT | Điểm tin cậy từ AI (0.0 – 1.0) |
source | ENUM | ai / manual |
is_manual_override | BOOLEAN | True nếu Candidate chỉnh sửa thủ công (không bị ghi đè) |
created_at | TIMESTAMP | Thời điểm tạo (audit) |
updated_at | TIMESTAMP | Thời điểm cập nhật (audit) |
5.5 Chi tiết Bảng — recr_job_skills
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
job_id | UUID | FK đến recr_jobs |
skill_id | UUID | FK đến recr_skills_taxonomy |
requirement_level | ENUM | required / nice_to_have |
source | ENUM | ai / manual |
created_at | TIMESTAMP | Thời điểm tạo (audit) |
updated_at | TIMESTAMP | Thời điểm cập nhật (audit) |
5.6 Chi tiết Bảng — recr_skills_taxonomy
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
name | VARCHAR | Tên chuẩn hóa (vd: "React", "Node.js") |
category | ENUM | technical / soft / domain |
aliases | JSON/ARRAY | Các tên gọi khác để chuẩn hóa (vd: ["ReactJS", "React.js"]) |
5.7 Chi tiết Bảng — recr_match_scores
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
candidate_id | UUID | FK đến recr_candidates |
job_id | UUID | FK đến recr_jobs |
application_id | UUID | FK đến recr_applications (nếu có) |
score | INTEGER | Điểm matching (0-100) |
matched_skills | JSON/ARRAY | Skills khớp (vd: ["React", "TypeScript"]) |
missing_skills | JSON/ARRAY | Skills thiếu (vd: ["Docker", "K8s"]) |
calculated_at | TIMESTAMP | Thời điểm tính điểm |
5.8 Chi tiết Bảng — recr_job_suggestions
| Cột |
Kiểu |
Mô tả |
id | UUID | Khóa chính |
job_id | UUID | FK đến recr_jobs |
candidate_id | UUID | FK đến recr_candidates |
match_score | INTEGER | Điểm matching (0-100) |
matched_skills | JSON/ARRAY | Skills khớp |
missing_skills | JSON/ARRAY | Skills thiếu |
status | ENUM | new / contacted / dismissed |
created_at | TIMESTAMP | Thời điểm tạo |
updated_at | TIMESTAMP | Thời điểm cập nhật |
6. Đặc tả API
6.1 Tổng quan Endpoint
Endpoint Xác thực (Tất cả Vai trò)
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| POST | /recr/auth/register | Đăng ký người dùng mới với vai trò hệ thống user | FR-001 |
| POST | /recr/auth/login | Đăng nhập bằng email/mật khẩu | FR-002 |
Endpoint Ứng viên
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| GET | /recr/jobs | Duyệt tin tuyển dụng | FR-003 |
| POST | /recr/applications | Nộp hồ sơ ứng tuyển | FR-004, FR-009 |
| GET | /recr/candidate/applications | Xem hồ sơ của tôi | FR-005 |
| PATCH | /recr/candidate/profile | Cập nhật hồ sơ | FR-006 |
| POST | /recr/candidate/resume | Tải lên hồ sơ (qua module FILE) | FR-007, FR-008 |
| GET | /recr/candidate/resumes | Liệt kê hồ sơ của tôi | FR-008 |
| DELETE | /recr/candidate/resumes/:id | Xóa hồ sơ | FR-008 |
| GET | /recr/candidate/applications/:id/resume | Lấy URL tải xuống presigned cho hồ sơ ứng tuyển | FR-009 |
| POST | /recr/candidate/reviews/jobs | Đánh giá việc làm | FR-030 |
| GET | /recr/candidate/reviews/jobs/:jobId | Lấy đánh giá việc làm | FR-030 |
| POST | /recr/candidate/resumes/:id/analyze | Trigger phân tích lại CV bằng AI (thủ công) | FR-010 |
| GET | /recr/candidate/resumes/:id/skills | Lấy danh sách skill của 1 CV | FR-010 |
| PATCH | /recr/candidate/resumes/:id/skills | Sửa/thêm/xóa skill thủ công | FR-010 |
| GET | /recr/candidate/jobs/:id/match-score | Xem điểm matching của Candidate hiện tại với 1 job | FR-050 |
Endpoint HR
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| GET | /recr/hr/applications | Duyệt hồ sơ ứng tuyển | FR-008 |
| PATCH | /recr/hr/applications/:id/status | Cập nhật trạng thái hồ sơ | FR-009 |
| POST | /recr/hr/interviews | Lên lịch phỏng vấn | FR-010 |
| POST | /recr/hr/evaluations | Gửi đánh giá | FR-011 |
| GET | /recr/hr/pipeline | Xem quy trình tuyển dụng | FR-013 |
| GET | /recr/hr/reports | Tạo báo cáo | FR-014 |
| POST | /recr/hr/jobs | Tạo tin tuyển dụng | FR-028 |
| GET | /recr/hr/jobs | Liệt kê việc làm của tôi | FR-029 |
| PATCH | /recr/hr/jobs/:id | Cập nhật tin tuyển dụng | FR-029 |
| GET | /recr/hr/jobs/:id/applicants | Xem người nộp đơn cho việc làm | FR-029 |
| POST | /recr/hr/reviews/candidates | Đánh giá ứng viên | FR-031 |
| GET | /recr/hr/reviews/candidates/:candidateId | Lấy đánh giá ứng viên | FR-031 |
| GET | /recr/settings/webhook | Lấy cấu hình webhook hiện tại | FR-047 |
| PUT | /recr/settings/webhook | Tạo/cập nhật URL + bật/tắt | FR-047 |
| POST | /recr/settings/webhook/test | Gửi sự kiện test xác minh URL | FR-047 |
| POST | /recr/hr/jobs/:id/analyze | Trigger AI gợi ý tag cho JD | FR-049 |
| GET | /recr/hr/jobs/:id/skills | Xem danh sách skill yêu cầu của Job | FR-049 |
| PATCH | /recr/hr/jobs/:id/skills | Sửa danh sách skill yêu cầu của Job | FR-049 |
| GET | /recr/hr/jobs/:id/applicants?sort=match_score | Danh sách người nộp đơn kèm điểm matching, sắp theo độ phù hợp | FR-050 |
| GET | /recr/hr/jobs/:id/suggestions | Danh sách gợi ý ứng viên phù hợp cho job | FR-053 |
| PATCH | /recr/hr/suggestions/:id | Cập nhật trạng thái gợi ý (contacted/dismissed) | FR-053 |
Endpoint Candidate — Open to Work
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| PATCH | /recr/candidate/profile/open-to-work | Bật/tắt trạng thái "Mở để tìm việc" | FR-052 |
Endpoint Đăng ký (Tất cả Vai trò)
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| GET | /recr/subscription/plans | Liệt kê gói đăng ký | FR-021 |
| POST | /recr/subscription/purchase | Mua đăng ký | FR-022 |
| GET | /recr/subscription/status | Lấy trạng thái đăng ký | FR-024 |
| POST | /recr/subscription/renew | Gia hạn đăng ký | FR-025 |
| GET | /recr/subscription/history | Xem lịch sử đăng ký | FR-026 |
Endpoint Lời mời
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| POST | /recr/invitations/send | Gửi lời mời đến ứng viên/HR | FR-039, FR-040, FR-041 |
| GET | /recr/invitations/verify | Xác minh token lời mời (Công khai) | FR-042 |
| POST | /recr/invitations/accept | Chấp nhận lời mời | FR-043 |
| GET | /recr/invitations | Liệt kê lời mời | FR-045 |
| DELETE | /recr/invitations/:id | Thu hồi lời mời | FR-044 |
| POST | /recr/invitations/:id/resend | Gửi lại lời mời | FR-046 |
Endpoint Nhà tuyển dụng
| Phương thức |
Đường dẫn |
Mô tả |
Mã Yêu cầu |
| POST | /recr/employer/jobs | Tạo tin tuyển dụng | FR-016 |
| GET | /recr/employer/jobs | Liệt kê việc làm của tôi | FR-017 |
| PATCH | /recr/employer/jobs/:id | Cập nhật tin tuyển dụng | FR-017 |
| GET | /recr/employer/jobs/:id/applicants | Xem người nộp đơn | FR-018 |
| PATCH | /recr/employer/jobs/:id/submit | Gửi để duyệt | FR-019 |
| GET | /recr/employer/analytics | Xem phân tích | FR-020 |
7. Tích hợp
7.1 Sơ đồ Chuỗi
Hình 23: Luồng Ứng tuyển Ứng viên
7.2 Sự kiện Webhook
7.2.1 Webhook Nội bộ (RabbitMQ)
Giao tiếp giữa các module trong hệ thống, dùng RabbitMQ làm message broker.
| Sự kiện | Hướng | Mô tả |
| application.submitted | Đi ra | Được kích hoạt khi ứng viên nộp hồ sơ |
| interview.scheduled | Đi ra | Được kích hoạt khi phỏng vấn được lên lịch |
| job.submitted_for_approval | Đi ra | Được kích hoạt khi HR/Employer gửi việc làm để duyệt |
| subscription.purchased | Đi ra | Được kích hoạt khi người dùng mua đăng ký |
| file.deleted | Đi vào | Nhận từ module FILE khi tệp bị xóa; RECR dọn dẹp tham chiếu trong recr_candidate_resumes và recr_applications |
| invitation.created | Đi ra | Được kích hoạt khi lời mời được tạo |
| invitation.accepted | Đi ra | Được kích hoạt khi lời mời được chấp nhận |
| resume.analyzed | Đi ra | CV đã được AI phân tích xong, có skills |
| job.skills_suggested | Đi ra | JD đã được AI gợi ý tag xong |
| match.calculated | Đi ra | Điểm matching mới được tính cho 1 cặp CV-Job |
| job.approved | Đi ra | Việc làm được duyệt, kích hoạt gợi ý ứng viên phù hợp |
| candidate.suggested | Đi ra | Gợi ý ứng viên phù hợp đã được tạo cho job |
7.2.2 Webhook Ngoài (HTTP POST — Tính năng mới)
Người dùng (HR/Employer) cấu hình URL đích để nhận sự kiện từ hệ thống ra bên ngoài (ATS, Slack, CRM...). Được ký bằng HMAC secret_key để xác thực nguồn gửi.
| Sự kiện | Mô tả | Ví dụ sử dụng |
application.submitted | Ứng viên nộp hồ sơ ứng tuyển | Push sang ATS / CRM |
job.submitted_for_approval | Việc làm được gửi duyệt | Thông báo Slack cho quản lý |
interview.scheduled | Phỏng vấn được lên lịch | Tạo sự kiện trên Google Calendar |
subscription.purchased | Người dùng mua gói đăng ký | Ghi nhận trên hệ thống kế toán |
webhook.test | Sự kiện test khi cấu hình webhook | Xác minh endpoint phản hồi 2xx |
Lưu ý: Mặc định khi tạo webhook, sự kiện application.submitted được chọn sẵn. HR có thể bổ sung thêm sự kiện sau đó.
7.3 API Webhook
| Endpoint |
Method |
Mô tả |
| /recr/settings/webhook | GET | Lấy cấu hình webhook hiện tại |
| /recr/settings/webhook | PUT | Tạo/cập nhật URL + bật/tắt |
| /recr/settings/webhook/test | POST | Gửi sự kiện test xác minh URL |
7.4 Tích hợp AI Trích xuất Skills
Luồng xử lý tự động khi Candidate tải CV lên:
| Bước | Thành phần | Giao thức | Mô tả |
| 1 | RECR Service | RabbitMQ | Phát sự kiện resume.uploaded |
| 2 | Resume Worker | RabbitMQ | Nhận job, lấy CV qua module FILE (presigned URL) |
| 3 | Resume Worker | OCR / Text Extract | Trích xuất văn bản từ CV (PDF/DOCX/hình ảnh) |
| 4 | Resume Worker | HTTP (AI LLM) | Gọi AI service với prompt trích xuất skills |
| 5 | Resume Worker | PostgreSQL | Lưu kết quả vào recr_resume_skills |
| 6 | RECR Service | RabbitMQ | Phát sự kiện resume.analyzed (thông báo Candidate) |
7.5 Tích hợp AI Trích xuất Skills từ JD
Luồng xử lý khi HR/Employer lưu nháp job:
| Bước | Thành phần | Giao thức | Mô tả |
| 1 | RECR Service | RabbitMQ | Phát sự kiện job.draft_saved (hoặc HR bấm nút) |
| 2 | JD Worker | RabbitMQ | Nhận job, lấy nội dung JD |
| 3 | JD Worker | HTTP (AI LLM) | Gọi AI với prompt trích xuất skills từ JD |
| 4 | JD Worker | PostgreSQL | Chuẩn hóa tag qua recr_skills_taxonomy, lưu recr_job_skills |
| 5 | RECR Service | RabbitMQ | Phát sự kiện job.skills_ready (hiển thị gợi ý cho HR) |
7.6 Tích hợp Matching Score
Luồng tính điểm khi Candidate xem job hoặc HR xem danh sách ứng viên:
| Bước | Thành phần | Giao thức | Mô tả |
| 1 | RECR Service | HTTP | Nhận request xem job / danh sách ứng viên |
| 2 | RECR Service | PostgreSQL | Lấy tags từ recr_resume_skills + recr_job_skills |
| 3 | RECR Service | Internal | Tính điểm theo trọng số: required (70%) + nice_to_have (20%) + experience (10%) |
| 4 | RECR Service | PostgreSQL | Lưu kết quả vào recr_match_scores kèm breakdown |
| 5 | RECR Service | HTTP | Trả về điểm % + chi tiết matched/missing skills |
7.7 Tích hợp Gợi ý Ứng viên (UC-20)
Luồng tự động khi job được duyệt:
| Bước | Thành phần | Giao thức | Mô tả |
| 1 | RECR Service | RabbitMQ | Phát sự kiện job.approved |
| 2 | Suggestion Worker | RabbitMQ | Nhận job, lấy recr_job_skills |
| 3 | Suggestion Worker | PostgreSQL | Lọc ứng viên: skill trùng + is_open_to_work = true + chưa hired trong tổ chức |
| 4 | Suggestion Worker | Internal | Tính điểm matching (tái sử dụng UC-19) |
| 5 | Suggestion Worker | PostgreSQL | Lọc ngưỡng ≥ 70%, kiểm tra tần suất (3/tuần/tổ chức) |
| 6 | Suggestion Worker | PostgreSQL | Lưu recr_job_suggestions (status: new) |
| 7 | RECR Service | RabbitMQ | Gửi thông báo cho HR |
8. Yêu cầu Phi chức năng
| Mã Yêu cầu |
Danh mục |
Yêu cầu |
Mục tiêu |
| NFR-001 | Hiệu suất | Thời gian phản hồi API cho truy vấn danh sách | < 500ms (p95) |
| NFR-002 | Hiệu suất | Xử lý nộp hồ sơ ứng tuyển | < 2s |
| NFR-003 | Khả năng mở rộng | Hỗ trợ người dùng đồng thời | 500+ người dùng đồng thời |
| NFR-004 | Khả dụng | Thời gian hoạt động hệ thống | 99.9% |
| NFR-005 | Bảo mật | Kiểm soát truy cập dựa trên vai trò | Các vai trò Candidate, HR, Employer |
| NFR-006 | Dữ liệu | Lưu trữ tệp hồ sơ qua module FILE | Module FILE quản lý lưu trữ tệp (tương thích S3), tối đa 10MB mỗi tệp, truy cập qua URL presigned |
| NFR-007 | Tìm kiếm | Khả năng tìm kiếm việc làm | Tìm kiếm toàn văn trong 500ms |
9. Ma trận Truy cập Hồ sơ RBAC
| Hành động |
Ứng viên (Chủ sở hữu) |
HR (Tổ chức) |
Nhà tuyển dụng (Tổ chức) |
| Tải lên Hồ sơ |
Chỉ của mình |
Không cho phép |
Không cho phép |
| Liệt kê Hồ sơ của mình |
Chỉ của mình |
Không cho phép |
Không cho phép |
| Xóa Hồ sơ |
Chỉ của mình (nếu chưa liên kết với hồ sơ ứng tuyển) |
Không cho phép |
Không cho phép |
| Xem Hồ sơ Ứng tuyển |
Hồ sơ của mình |
Hồ sơ của tổ chức |
Hồ sơ của tổ chức |
| Tải xuống Hồ sơ |
Chỉ của mình |
Qua URL presigned (hồ sơ của tổ chức) |
Qua URL presigned (hồ sơ của tổ chức) |
Lưu ý: Tất cả việc tải hồ sơ của HR và Nhà tuyển dụng đều thực hiện qua URL presigned có thời hạn được tạo bởi module FILE. Truy cập tệp trực tiếp không bao giờ được hiển thị.
10. Ma trận Truy xuất Yêu cầu
| Mã Yêu cầu |
Yêu cầu |
Vai trò |
Phần TDS |
Bảng CSDL |
Endpoint API |
| FR-001 | Đăng ký Ứng viên | Candidate | 3.1 | recr_users, recr_candidates | POST /recr/auth/register |
| FR-002 | Đăng nhập Ứng viên | Candidate | 3.1 | recr_users | POST /recr/auth/login |
| FR-003 | Duyệt Việc làm | Candidate | 3.1 | recr_jobs | GET /recr/jobs |
| FR-004 | Nộp Hồ sơ Ứng tuyển | Candidate | 3.1 | recr_applications | POST /recr/applications |
| FR-005 | Xem Trạng thái Hồ sơ | Candidate | 3.1 | recr_applications | GET /recr/candidate/applications |
| FR-006 | Cập nhật Hồ sơ | Candidate | 3.1 | recr_candidates | PATCH /recr/candidate/profile |
| FR-007 | Tải lên Hồ sơ | Candidate | 3.1 | recr_candidate_resumes, sys_files | POST /recr/candidate/resume |
| FR-008 | Duyệt Hồ sơ Ứng tuyển | HR | 3.2 | recr_applications | GET /recr/hr/applications |
| FR-009 | Sàng lọc Ứng viên | HR | 3.2 | recr_applications | PATCH /recr/hr/applications/:id/status |
| FR-010 | Lên lịch Phỏng vấn | HR | 3.2 | recr_interviews | POST /recr/hr/interviews |
| FR-011 | Đánh giá Ứng viên | HR | 3.2 | recr_evaluations | POST /recr/hr/evaluations |
| FR-012 | Từ chối Ứng viên | HR | 3.2 | recr_applications | PATCH /recr/hr/applications/:id/status |
| FR-013 | Theo dõi Quy trình | HR | 3.2 | recr_applications | GET /recr/hr/pipeline |
| FR-014 | Tạo Báo cáo | HR | 3.2 | recr_applications | GET /recr/hr/reports |
| FR-015 | Đăng ký Nhà tuyển dụng | Employer | 3.1 | recr_employers | POST /recr/auth/register |
| FR-016 | Đăng tin Việc làm (Employer) | Employer | 3.3 | recr_jobs | POST /recr/employer/jobs |
| FR-017 | Quản lý Tin tuyển dụng | Employer | 3.3 | recr_jobs | GET/PATCH /recr/employer/jobs |
| FR-018 | Xem Người nộp đơn | Employer | 3.3 | recr_applications | GET /recr/employer/jobs/:id/applicants |
| FR-019 | Duyệt Tin tuyển dụng | Employer | 3.3 | recr_jobs | PATCH /recr/employer/jobs/:id/submit |
| FR-020 | Xem Phân tích | Employer | 3.3 | recr_jobs | GET /recr/employer/analytics |
| FR-021 | Gói Đăng ký | Tất cả | 4.4 | recr_subscription_plans | GET /recr/subscription/plans |
| FR-022 | Mua Đăng ký | Tất cả | 4.4 | recr_subscriptions | POST /recr/subscription/purchase |
| FR-023 | Kiểm soát Truy cập Đăng ký | Tất cả | 4.4 | recr_subscriptions | - |
| FR-024 | Xác thực Đăng ký | Hệ thống | 4.4 | recr_subscriptions | GET /recr/subscription/status |
| FR-025 | Gia hạn Đăng ký | Tất cả | 4.4 | recr_subscriptions | POST /recr/subscription/renew |
| FR-026 | Lịch sử Đăng ký | Tất cả | 4.4 | recr_subscription_history | GET /recr/subscription/history |
| FR-028 | HR Đăng tin Việc làm | HR | 3.2 | recr_jobs | POST /recr/hr/jobs |
| FR-029 | HR Quản lý Việc làm | HR | 3.2 | recr_jobs | GET/PATCH /recr/hr/jobs |
| FR-030 | Đánh giá Việc làm | Candidate | 3.3 | recr_job_reviews | POST /recr/candidate/reviews/jobs |
| FR-031 | Đánh giá Ứng viên | HR | 3.3 | recr_candidate_reviews | POST /recr/hr/reviews/candidates |
| FR-008 | Quản lý Hồ sơ Ứng viên | Candidate | 3.1 | recr_candidate_resumes, sys_files (FILE) | GET/POST/DELETE /recr/candidate/resumes |
| FR-009 | Liên kết Hồ sơ Ứng tuyển | Candidate | 3.1 | recr_applications, sys_files (FILE) | POST /recr/applications, GET /recr/candidate/applications/:id/resume |
| FR-039 | Gửi Lời mời | HR/Employer | 3.18 | recr_invitations | POST /recr/invitations/send |
| FR-040 | Tạo Token | Hệ thống | 3.18 | recr_invitations | POST /recr/invitations/send |
| FR-041 | Gửi Sự kiện Email | Hệ thống | 3.18 | - | POST /recr/invitations/send (RabbitMQ) |
| FR-042 | Xác minh Token | Candidate | 3.19 | recr_invitations | GET /recr/invitations/verify |
| FR-043 | Chấp nhận Lời mời | Candidate | 3.20 | recr_invitations | POST /recr/invitations/accept |
| FR-044 | Thu hồi Lời mời | HR/Employer | 3.21 | recr_invitations | DELETE /recr/invitations/:id |
| FR-045 | Liệt kê Lời mời | HR/Employer | 3.18 | recr_invitations | GET /recr/invitations |
| FR-046 | Gửi lại Lời mời | HR/Employer | 3.21 | recr_invitations | POST /recr/invitations/:id/resend |
| FR-047 | Cấu hình Webhook | HR/Employer | 3.16 | recr_webhook_configs | GET/PUT /recr/settings/webhook |
| FR-010 | Trích xuất Skills từ CV | Candidate / Hệ thống | 3.17 | recr_resume_skills | GET/POST/PATCH/DELETE .../resumes/:id/skills |
| FR-049 | Trích xuất Skills từ JD | HR/Employer / Hệ thống | 3.18 | recr_job_skills, recr_skills_taxonomy | POST .../hr/jobs/:id/analyze |
| FR-050 | Tính điểm Matching | Hệ thống / HR / Candidate | 3.19 | recr_match_scores | GET .../jobs/:id/match-score |
| FR-051 | Từ điển Skills chuẩn | Hệ thống | 3.17, 3.18 | recr_skills_taxonomy | GET /recr/skills/taxonomy |
| FR-052 | Mở để tìm việc | Candidate | 3.20 | recr_candidates | PATCH /recr/candidate/profile/open-to-work |
| FR-053 | Gợi ý Ứng viên cho Job mới | Hệ thống / HR | 3.20 | recr_job_suggestions | GET/PUT .../hr/jobs/:id/suggestions |
| FR-054 | Phân tích Tương tác Ứng viên | Admin, HR, Employer | 3.21 | recr_candidate_resumes, recr_applications | GET /recr/analytics/candidate-activity |
| FR-055 | Tỷ lệ Ứng tuyển Thành công | Admin, HR, Employer | 3.21 | recr_applications | GET /recr/analytics/application-success-rate |
| FR-056 | Xuất Báo cáo Ứng viên | Admin, HR, Employer | 3.21 | recr_candidate_resumes, recr_applications | GET /recr/analytics/export |
| NFR-001 | Thời gian Phản hồi API | Tất cả | 6.1 | - | - |
| NFR-002 | Xử lý Hồ sơ | Tất cả | 6.1 | - | - |
| NFR-003 | Người dùng Đồng thời | Tất cả | 6.1 | - | - |
| NFR-004 | Thời gian Hoạt động Hệ thống | Tất cả | 6.1 | - | - |
| NFR-005 | RBAC | Tất cả | 6.1 | recr_users | - |
| NFR-006 | Lưu trữ Hồ sơ | Tất cả | 6.1 | sys_files (FILE) | API module FILE (URL presigned) |
| NFR-007 | Tìm kiếm Việc làm | Tất cả | 6.1 | recr_jobs | GET /recr/jobs |