namespace RecruitmentDAL.DTO.Reports { // Phase 5 analytics — source-quality report. Grain: one row per Candidate.Source // (1=Website 2=JobPortal 3=Agency 4=Referral 5=Internal 6=Direct/Manual — see CandidateDTO's // own doc comment for this enum). Small, bounded cardinality (at most 6 rows per tenant) — // same shape as TMSDAL.DTO.Reports.ComplianceCoverageSummaryDTO (grouped by TrainingDomainId), // which is why this report's QB does not need real SQL-level OFFSET/FETCH pagination (see // CandidateSourceQualityQB doc comment). public class CandidateSourceQualityDTO { public byte Source { get; set; } public string? SourceName { get; set; } public int TotalCandidates { get; set; } public int TotalApplications { get; set; } // Distinct Applications from this source that reached (have stage-history for) any // Interview-category (StageCategory=3) stage at least once. public int ReachedInterviewCount { get; set; } // Distinct Applications from this source that are "genuinely Hired" — same structural // signal as ApplicationCycleTimeDTO.IsHired / CandidateConversionBLL. public int HiredCount { get; set; } // HiredCount / TotalApplications * 100, 0 when TotalApplications = 0. public decimal ConversionRatePct { get; set; } } }