Bỏ qua để đến nội dung

Tuyển dụng (Talents)

Danh sách ứng viên tuyển dụng: lọc theo stage Talent/Interviewing/Offer, cột nguồn và vị trí mong muốn

Trang /hr/talents liệt kê mọi hr_people (không lọc theo desired_position/source nào bắt buộc), có tab lọc theo stage talent/interviewing/offer và ô tìm kiếm theo tên/email/vị trí mong muốn. Nút Add Talent hiện với quyền recruitment.write.

Form tạo talent chỉ hỏi các field cơ bản — first_name (bắt buộc), last_name, email, phone, desired_position, source — và luôn tạo với stage: 'talent'. Việc tạo đi qua service contact-first (find-or-create c_contacts theo email trước khi tạo satellite hr_people) — xem Tích hợp Contacts.

Mở một talent vào HrPersonDetail với các tab profile/recruitment/activity (ít hơn tab của trang Employee — không có contract/compensation/insurance/leave/provisioning/offboarding, vì các tab đó chỉ có ý nghĩa từ stage probation trở đi).

Tab Recruitment là nơi quản lý toàn bộ vòng tuyển dụng của người đó:

Sidebar Applications

Danh sách các vòng ứng tuyển (hr_applications) của talent này — mỗi vòng là một lần ứng tuyển vào một vị trí, có thể tạo nhiều vòng cho cùng 1 người theo thời gian.

Pipeline picker

Nếu application chưa gắn workflow, chọn 1 pipeline (workflow ODP có collection = hr_applications, trigger_event = manual, status = active) rồi bấm Start pipeline — hệ thống tạo workflow-instance và tự sinh sẵn 1 hr_interviews cho mỗi bước duyệt (type: 'approval') trong pipeline đó.

Step stepper

Khi đã có pipeline, hiện chuỗi bước ngang — bấm vào một bước duyệt (type: 'approval') để mở form chi tiết bên dưới; bước không phải duyệt (type khác) không bấm được (mờ đi).

Field chính: position, notes, workflow_instance_id. Trạng thái application do handler cập nhật tay (nút Reject/Pass trên UI), giá trị thật hệ thống dùng là:

active → hired | rejected | withdrawn

Mỗi bước duyệt trong pipeline sinh ra 1 hr_interviews gắn workflow_step_id. Field agent thao tác trong form chi tiết bước: interviewer (tự gán người đang đăng nhập khi mở bước lần đầu và chưa có ai), scheduled_at, score (số nguyên 0–5, interviews.controller.ts chặn ngoài khoảng này), notes.

typestatus bị enforce cứng ở backend theo whitelist — khác chữ hoa/thường và khác giá trị so với choices khai báo trong hr-schema.ts:

Field Giá trị backend thực sự chấp nhận Giá trị khai báo trong hr-schema.ts
type Screening, Technical, Culture, Final, Other hr_screen, technical, manager, final, other
status Scheduled, Done, Cancelled, No-show scheduled, done, cancelled, no_show

type khi tự sinh theo bước pipeline được đoán bằng guessInterviewType() (khớp từ khoá trong tên bước: “screen”/“hr” → Screening, “techni”/“code”/“coding” → Technical, “cultur”/“fit”/“behav” → Culture, “final”/“manager”/“director” → Final, còn lại → Other) — không phải người dùng gõ tay.

Approve/Reject một bước gọi thẳng workflow engine (POST /workflow-instances/:id/steps/:stepId/approve|reject), không phải cập nhật field trong HR:

  1. Approve một bước duyệt → nếu interview của bước đó đang Scheduled, tự động PATCH sang Done.
  2. Reject một bước → bắt buộc nhập lý do (comment), gửi kèm POST .../reject.
  3. Sau approve/reject, tải lại tiến trình pipeline (loadInstance) để cập nhật bước hiện tại (currentStepId) và timeline hành động.

Collection hr_offers (status draft/sent/accepted/declined/expired, salary, currency, valid_until, decline_reason) tồn tại trong hr-schema.ts và được dọn dẹp đúng cách khi xoá application (cascade-delete.ts xoá hr_offers theo application_id), nhưng không có controller riêng (không nằm trong danh sách backend/extensions/hr/src/endpoints/controllers/) và không có component/trang nào trong FE render hay tạo offer.

Không có nút “Convert” riêng trong tab Recruitment — việc đổi từ talent sang nhân viên là một stage transition (hr_stage_transitions, ghi from_stage/to_stage/reason) đưa hr_people.stage sang probation. Vì probation là stage nhân viên, hành động này đòi quyền update (không phải recruitment.write) — theo đúng bảng quyền ở PERMISSIONS.md: HR Recruiter tạo/xử lý được talent, application, interview, nhưng không tự chuyển được một talent thành nhân viên.

recruitment.read / recruitment.write

Xem/tạo/sửa talent, application, interview, và chạy pipeline. HR Admin, HR Manager, HR Recruiter đều có 2 quyền này.

update (stage nhân viên)

Chuyển stage sang probation trở đi cần quyền update cấp nhân viên — HR Recruiter bị chặn ở đây theo chủ đích, xem bảng vai trò/quyền ở Thiết lập.