Skip to content

Module — Recruitment

The full hiring lifecycle: raise and approve a Staff Requisition Form (SRF, the Job entity), publish the announcement, collect and filter applicants, run technical / HR / other interviews with weighted scoring, track recruitment progress, and drive the applicant vetting / compliance chain. It also owns the reusable interview question bank and the staff Evaluation appraisal sub-system.

Source: NKO.Main/NKO.Main/Controllers/{Jobs,Evaluation,QuestionAnswers}Controller.cs, NKO.Main/NKO.Main/BAL/{BJobs,BEvaluation,BQuestionAnswer}.cs, NKO.Lib/NKO.Shared/ViewModels/Job/JobEnums.cs.

Purpose & scope

  • In scope: SRF creation and approval, the announcement, the applicant grid and its filters, interviews and scoring, recruitment trackers, the applicant vetting chain, the question bank, and competency / objective staff evaluations.
  • Out of scope: creating the hired person's employee record (HR — HumanResource/CreateEmployee), and the SRF / applicant approval chains themselves (documented as part of the generic engine in Procurement Cycle and Permissions).
  • Database: NKO_DB (core), context NKO_DBEntities1. (The Evaluation* entities live in NKO_DB and are code-owned by this module even though they describe existing employees — hence the cross-reference from HR.)

Key features

  • SRF creation for core vs project-funded posts (project posts carry JobProjects with LOE / budget line / project; core posts auto-set PeriodTo = PeriodFrom + 1 year).
  • Multi-step SRF approval — Requester → Budget Holder → Head of Department → HR → Finance → Country Director → Announcement (JobStatus), routed by NextUserHelper.GetSrfNextUser.
  • Per-job visibility — a JobPermission list restricts who sees a job's applicants; plus project-scoped view rights and the global SharedPermissions.SRF area.
  • Custom questions — per-job questions (JobQuestion + JobQuestionAnswer, drop-down or short answer, grouped) and position questions (JobPositionQuestion ← PositionQuestion).
  • Applicant grid — ~20 filters (languages, MS-Office levels, degree, nationality, residence country, gender, DOB range, experience range, salary scale, custom answers, created-date range) with CSV / PDF export.
  • Interview management — TechnicalInterView + ApplicantTechnicalMark; weighted scoring via Job.TechnicalPercent / HRPercent / OtherPercent; a grading-sheet export.
  • Recruitment tracker — RecruitmentTracker + RecruitmentTrackerInterview per job (recruiter, interview dates, priority, department, new / replacement flag, three interviewer assignments).
  • Applicant vetting chain — Requester → General Manager → Vetting → References → Compliance Admin (ApplicantsStatus).
  • Question-answer control panel — reusable answer options grouped by QuestionGroup.
  • Evaluation — annual competency + objective appraisal; Officer → Manager → HR sign-off; 1–5 degree scoring on elements and objectives; performance level + career-development picklists.

Screens

Route = /{Controller}/{Action}; primary screens only. Full list in the Recruitment API reference.

JobsController — /Jobs/*

Feature Route View Permission key
Announced jobs /Jobs/Index Jobs/Index.cshtml JobsIndex
Staff requisition list /Jobs/SRF SRF.cshtml JobsSRF
SRF create / edit / detail /Jobs/Create, /Jobs/SRFEdit/{id}, /Jobs/SRFDetails/{id} Create.cshtml, SRFEdit.cshtml, SRFDetails.cshtml JobsCreate, JobsSRFDetails
Job detail (announcement) /Jobs/Details/{id} Details.cshtml JobsDetails
Applicants for a job / all applicants /Jobs/Applicants?id={jobId}, /Jobs/AllApplicants Applicants.cshtml, AllApplicants.cshtml JobsApplicants, JobsAllApplicants
Interviews list / single /Jobs/Interviews, /Jobs/Interview/{id} Interviews.cshtml, Interview.cshtml JobsIndex, JobsInterview
Technical interview /Jobs/TechnicalInterView/{id} TechnicalInterView.cshtml JobsCreate
Position questions /Jobs/PositionQuestions/{id} PositionQuestions.cshtml JobsCreate
Recruitment tracker(s) /Jobs/Tracker, /Jobs/AllTrackers Tracker.cshtml, AllTrackers.cshtml JobsTracker, JobsAllTrackers
Reference detail /Jobs/ReferenceDetials/{id} ReferenceDetials.cshtml JobsDetails
Grading-sheet / PDF export /Jobs/ExportGradingSheet, /Jobs/Export/{id} (files) JobsApplicants, JobsExport

EvaluationController — /Evaluation/*

Feature Route View Permission key
Evaluations list /Evaluation/Index Evaluation/Index.cshtml EvaluationIndex
Create / edit / detail /Evaluation/Create, /Evaluation/EditEvaluation/{id}, /Evaluation/Details/{id} Create.cshtml, EditEvaluation.cshtml, Details.cshtml EvaluationCreate, EvaluationEdit, EvaluationDetails
Objectives / degree scoring /Evaluation/AddObjective, /Evaluation/EditDegree, /Evaluation/EditObjectiveDegree _*.cshtml EvaluationDetails
Evaluation elements / position elements /Evaluation/EvaluationElement, /Evaluation/AddEvaluationElement, /Evaluation/AddETechnicalElement, /Evaluation/ViewPositionElements/{id} *.cshtml EvaluationElement, EvaluationAddElement

QuestionAnswerController — /QuestionAnswer/*

File name and class name disagree

The file is QuestionAnswers**Controller**.cs (plural) but the class inside it is QuestionAnswer**Controller** (singular). MVC routes by class name, so the live prefix is /QuestionAnswer, not /QuestionAnswers. EvidenceController.cs has the same mismatch in the opposite direction — the class there is EvidencesController, so its routes are /Evidences/*.

Feature Route Permission key
Answer-option bank (list / create / edit / delete / detail) /QuestionAnswer/Index, /QuestionAnswer/CreateQuestionAnswer, … JobControlPanel

Business logic

Class File Responsibility & notable logic
BJobs NKO.Main/NKO.Main/BAL/BJobs.cs (~2690 ln — the largest recruitment BAL) Create / Edit — build a Job (StatusId = Draft, NextUserId = CreatedBy); non-core → rebuild JobProjects; the Edit(Job, users) overload rebuilds JobPermission. GetMySRFs(userId) — visibility: global CommonSharedPermission(SRF) ⇒ all; else project-scoped AppUserProjectPermissions(Areas.JobApplication, View); else "my staff" + any role slot on the record. SRF workflow — SetSent (core → WaitingForHeadOfDept, non-core → WaitingForBudgetHolder), SetBudgetHolder/Head/HR/Finance/CountryDirector Accepted/Refused, SetAnnouncedAccepted, SetCancelletion; each validates NextUserId == currentUser + the expected StatusId, sets the role's sign fields, computes the next user via _nextUserHelper.GetSrfNextUser, notifies + e-mails. Applicant vetting — SetSentApplicant, SetGeneralManager/Vetting/References/ComplianceAdmin Accepted/Refused. Interviews — CreateTechnicalInterView, UpdateApplicantTechnicalMark, GetGradingSheet(applicantId, technicalIds, hRIds, otherIds) combines the three interviewer pools with Job.TechnicalPercent / HRPercent / OtherPercent. Trackers — GetAllTrackers, GetJobTrackers, GetAllApplicants.
BEvaluation NKO.Main/NKO.Main/BAL/BEvaluation.cs (~720 ln) Create(Evaluation, level?) — StatusId = Draft, NextUserId = CreatedBy; seeds one EvaluationsDegree per applicable EvaluationElement (LevelId == null || == level). Scoring — EditDegree(EvaluationsDegree, type) writes HrDegree / ManagerDegree / OfficerDegree by EvaluationUserTypes; EditObjectiveDegree writes ManagerDegree / EmpDegree. Objectives — AddObjective / EditObjective / RemoveObjective (EvaluationObjective.Area ∈ Objective / PerformanceFactor / Goal / NextGoal). Picklists — GetXCareerTypes, GetPerformanceLevelList, GetGeneralEvaluationElementTypes, GetTechnicalCompetenciesAsync. Workflow — SetSent (Draft → WaitingForOfficer; requires ≥ 1 objective of each area + next dates + ≥ 1 career item), SetOfficerDone (every officer degree 1–5 → WaitingForManager), SetManagerDone (→ WaitingForHR), SetHRDone (→ Completed).
BQuestionAnswer NKO.Main/NKO.Main/BAL/BQuestionAnswer.cs (~135 ln) Reusable answer-option bank for job questions (JobQuestionAnswer). Paged, sortable, grouped by QuestionGroup; Create / Edit / Delete over {AnswerName, ArAnswerName, QuestionGroup}.

Data

  • Jobs / SRF: Job (position, qty, gender, contract type, period, justification, salary / currency, IsCore, per-role sign fields, StatusId, NextUserId, TechnicalPercent / HRPercent / OtherPercent), JobProjects, JobPermission, JobQuestion, JobAnswers, JobQuestionAnswer, JobPositionQuestion, JobSalaryScale, PositionQuestion.
  • Applicants / interviews: Applicants, ApplicantTechnicalMark, TechnicalInterView, RecruitmentTracker, RecruitmentTrackerInterview.
  • Evaluation: Evaluation, EvaluationElement, EvaluationElementType, EvaluationExCareer, EvaluationObjective, EvaluationsDegree, EvaluationType.
  • Public entry: applicants and references can be submitted anonymously through /Apps/ApplyJob and /Apps/ApplyReference.

Full column detail: Recruitment database.

Permissions

Distinct keys: JobsIndex, JobsInterview, JobsApplicants, JobsAllApplicants, JobsDetails, JobsTracker, JobsAllTrackers, JobsSRF, JobsSRFDetails, JobsCreate, JobsDelete, JobsDeleteQuestion, JobsAddComment, JobsExport, JobsCreateAttachment; EvaluationIndex, EvaluationCreate, EvaluationEdit, EvaluationDetails, EvaluationDelete, EvaluationElement, EvaluationAddElement; JobControlPanel. Data scoping: SharedPermissions.SRF = 7; workflow areas Areas.{SRF = 14, JobApplication = 4, Evaluation = 13}.

Screenshots

Announcements / published jobs — /Jobs:

Jobs list

Staff Requisition Forms — /Jobs/SRF:

SRF list

Applicant grid and its filter sidebar — /Jobs/Applicants?id={jobId} (applicant names masked):

Applicants — part 1 Applicants — part 2 Applicants — part 3

Staff Evaluation requests — /Evaluation (no evaluation cycle open at capture time):

Evaluation list