refactor: rule of coverage are in one place

This commit is contained in:
Julien Froidefond
2025-08-27 14:31:05 +02:00
parent a5bcdd34fb
commit a8cad0b2ec
16 changed files with 430 additions and 133 deletions

View File

@@ -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;
}