|
| 1 | +import uniqBy from 'lodash/uniqBy.js'; |
| 2 | + |
1 | 3 | import { KnowledgeElement } from '../../../shared/domain/models/index.js';
|
2 | 4 |
|
3 | 5 | export class Success {
|
@@ -28,26 +30,28 @@ export class Success {
|
28 | 30 | * @param {Array<{tubeId: string, level: number}>} cappedTubes
|
29 | 31 | * @returns {number}
|
30 | 32 | */
|
31 |
| - // Pour cette implémentation, ne tient pas compte des versions d'acquis obtenus dans les campagnes |
32 |
| - // potentiellement effectuées dans le cadre de la quête, mais seulement du profil de l'utilisateur |
33 |
| - // pour que ça marche efficacement, ajouter une condition d'éligibilité qui impose d'être allé au bout |
34 |
| - // de la participation, on s'assure ainsi qu'il a bien un KE pour chaque acquis des campagnes et qu'il |
35 |
| - // n'obtienne pas l'attestation sans avoir effectivement participé |
36 |
| - |
37 |
| - // L'autre solution serait de baser les cappedTubes sur l'ensemble des lots d'acquis des campagnes |
38 |
| - // concernées peut-être ? |
39 |
| - /*getMasteryPercentageForCappedTubes(cappedTubes) { |
40 |
| - if (!cappedTubes?.length) { |
41 |
| - return 0; |
| 33 | + getMasteryPercentageForCappedTubes(cappedTubes) { |
| 34 | + const uniqCampaignSkills = uniqBy(this.campaignSkills, 'id'); |
| 35 | + const sortedKEByDateDesc = this.knowledgeElements.sort((keA, keB) => keB.createdAt - keA.createdAt); |
| 36 | + let total = 0; |
| 37 | + let validated = 0; |
| 38 | + for (const cappedTube of cappedTubes) { |
| 39 | + const skillsInTubeWithinMaxDifficulty = uniqCampaignSkills.filter( |
| 40 | + ({ tubeId, difficulty }) => tubeId === cappedTube.tubeId && difficulty <= cappedTube.level, |
| 41 | + ); |
| 42 | + const skillsByDifficulty = Object.groupBy(skillsInTubeWithinMaxDifficulty, ({ difficulty }) => difficulty); |
| 43 | + for (const skills of Object.values(skillsByDifficulty)) { |
| 44 | + ++total; |
| 45 | + const skillIds = skills.map(({ id }) => id); |
| 46 | + const ke = sortedKEByDateDesc.find(({ skillId }) => skillIds.includes(skillId)); |
| 47 | + if (ke?.status === KnowledgeElement.StatusType.VALIDATED) { |
| 48 | + ++validated; |
| 49 | + } |
| 50 | + } |
42 | 51 | }
|
43 | 52 |
|
44 |
| - let sumTotal = 0; |
45 |
| - let sumValidated = 0; |
46 |
| - for (const { tubeId, level } of cappedTubes) { |
47 |
| - sumTotal += level; // ceci est très cavalier, je présuppose que le référentiel n'a aucun trou \o/ |
48 |
| - const dataForTubeId = this.#dataByTubeId[tubeId] ?? []; |
49 |
| - sumValidated += dataForTubeId.filter(({ isValidated, difficulty }) => isValidated && difficulty <= level).length; |
50 |
| - } |
51 |
| - return Math.round((sumValidated * 100) / sumTotal); |
52 |
| - }*/ |
| 53 | + if (total === 0) return 0; |
| 54 | + |
| 55 | + return (validated / total) * 100; |
| 56 | + } |
53 | 57 | }
|
0 commit comments