refactor: rule of coverage are in one place
This commit is contained in:
@@ -3,6 +3,7 @@ import {
|
||||
CategoryEvaluation,
|
||||
RadarChartData,
|
||||
SkillCategory,
|
||||
SkillImportance,
|
||||
} from "./types";
|
||||
|
||||
export function calculateCategoryScore(
|
||||
@@ -51,3 +52,47 @@ export function createEmptyEvaluation(
|
||||
selectedSkillIds: [],
|
||||
}));
|
||||
}
|
||||
|
||||
export const COVERAGE_OBJECTIVES: Record<SkillImportance, number> = {
|
||||
incontournable: 75,
|
||||
majeure: 60,
|
||||
standard: 0,
|
||||
};
|
||||
|
||||
export function isCoverageBelowObjective(
|
||||
coverage: number,
|
||||
importance: SkillImportance
|
||||
): boolean {
|
||||
const objective = COVERAGE_OBJECTIVES[importance];
|
||||
return objective > 0 && coverage < objective;
|
||||
}
|
||||
|
||||
export function getCoverageObjective(importance: SkillImportance): number {
|
||||
return COVERAGE_OBJECTIVES[importance];
|
||||
}
|
||||
|
||||
export function calculateSkillCoverage(
|
||||
levels: number[],
|
||||
totalMembers: number
|
||||
): number {
|
||||
if (levels.length === 0 || totalMembers === 0) return 0;
|
||||
|
||||
// Compter le nombre de membres autonomes ou experts (niveau >= 2)
|
||||
const expertCount = levels.filter((level) => level >= 2).length;
|
||||
|
||||
// La couverture est le pourcentage de membres autonomes ou experts
|
||||
return (expertCount / totalMembers) * 100;
|
||||
}
|
||||
|
||||
export function generateSkillCoverageSQL(levelField: string): string {
|
||||
return `
|
||||
COALESCE(
|
||||
(COUNT(*) FILTER (WHERE ${levelField} >= 2) * 100.0) / NULLIF(COUNT(*), 0),
|
||||
0
|
||||
)
|
||||
`;
|
||||
}
|
||||
|
||||
export function isExpertLevel(level: number): boolean {
|
||||
return level >= 2;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user