File size: 4,824 Bytes
4e9b744
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
from typing import Dict

def calculate_technical_gap_score(indicators: Dict[str, bool]) -> int:
    """
    Calcule le niveau (0-4) pour une lacune technique basée sur les indicateurs binaires.
    
    Poids:
    - concept_sous_jacent: 2
    - experience_liee: 1
    - outil_adjacent: 1
    - cas_usage: 1
    - strategie_montee: 1
    
    Mapping:
    - 0 pts -> Niveau 0
    - 1-2 pts -> Niveau 1
    - 3 pts -> Niveau 2
    - 4 pts -> Niveau 3
    - 5-6 pts -> Niveau 4
    """
    weights = {
        "concept_sous_jacent": 2,
        "experience_liee": 1,
        "outil_adjacent": 1,
        "cas_usage": 1,
        "strategie_montee": 1
    }
    
    score = sum(weights.get(k, 0) for k, v in indicators.items() if v)

    if score == 0: return 0
    if score <= 2: return 1
    if score == 3: return 2
    if score == 4: return 3
    return 4

def calculate_project_tech_understanding_score(indicators: Dict[str, bool]) -> int:
    """
    Calcule le score (1-5) pour la compréhension d'une technologie projet.
    
    Poids:
    - justifie_choix: 1
    - fonctionnement_interne: 3
    - identifie_limites: 2
    - propose_alternatives: 2
    - quantifie_resultats: 1
    - resolution_probleme: 2
    
    Total max: 11
    
    Mapping:
    - 0-2 -> 1/5 (usage superficiel)
    - 3-4 -> 2/5 (usage fonctionnel)
    - 5-6 -> 3/5 (compréhension partielle)
    - 7-9 -> 4/5 (bonne compréhension)
    - 10-11 -> 5/5 (maîtrise démontrée)
    """
    weights = {
        "justifie_choix": 1,
        "fonctionnement_interne": 3,
        "identifie_limites": 2,
        "propose_alternatives": 2,
        "quantifie_resultats": 1,
        "resolution_probleme": 2
    }
    
    score = sum(weights.get(k, 0) for k, v in indicators.items() if v)

    if score <= 2: return 1
    if score <= 4: return 2
    if score <= 6: return 3
    if score <= 9: return 4
    return 5

def calculate_behavioral_score(competence: str, indicators: Dict[str, bool]) -> int:
    """
    Calcule le score (1-5) pour une compétence comportementale.
    Utilise une pondération spécifique par compétence si définie, sinon une générique.
    Mapping proportionnel au max possible.
    """
    # Exemples de poids par défaut si non spécifiés dans le code appelant
    # Ici on suppose que les indicateurs passés correspondent à ceux attendus pour la compétence
    # On va utiliser une heuristique simple: 1 point par indicateur si pas de poids spécifique,
    # ou on code en dur les poids des exemples connus.
    
    # Poids par défaut pour les exemples connus
    weights_map = {
        "Adaptabilité": {
            "situation_changement": 2,
            "actions_concretes": 2,
            "apprentissage_ajustement": 2,
            "resultat_quantifie": 1,
            "limites_reconnues": 1,
            "transfert_competence": 2
        },
        "Apprentissage autonome": {
            "demarche_auto_formation": 2, # Mapping approximatif des clés JSON
            "ressources_specifiques": 1,
            "progression_mesurable": 2,
            "application_concrete": 2,
            "identifie_reste_a_apprendre": 1
        }
    }

    # Si la compétence est connue, on utilise ses poids, sinon 1.
    competence_weights = weights_map.get(competence, {})
    
    total_score = 0
    max_score = 0
    
    for key, val in indicators.items():
        weight = competence_weights.get(key, 1) # Default weight 1 if unknown key
        if val:
            total_score += weight
        max_score += weight
        
    if max_score == 0:
        return 3  # Score neutre si aucun indicateur defini

    ratio = total_score / max_score
    
    # Mapping linéaire approximatif vers 1-5
    if ratio <= 0.2: return 1
    if ratio <= 0.4: return 2
    if ratio <= 0.6: return 3
    if ratio <= 0.8: return 4
    return 5

def calculate_situation_score(indicators: Dict[str, bool]) -> int:
    """
    Calcule le score (1-5) pour la mise en situation.
    
    Poids:
    - comprehension_probleme: 2
    - demarche_structuree: 3
    - pertinence_technique: 3
    - gestion_contraintes: 2
    - communication_solution: 1
    - identification_risques: 2
    - proposition_alternatives: 1
    
    Total max: 14
    
    Mapping:
    - 0-3 -> 1/5
    - 4-6 -> 2/5
    - 7-9 -> 3/5
    - 10-12 -> 4/5
    - 13-14 -> 5/5
    """
    weights = {
        "comprehension_probleme": 2,
        "demarche_structuree": 3,
        "pertinence_technique": 3,
        "gestion_contraintes": 2,
        "communication_solution": 1,
        "identification_risques": 2,
        "proposition_alternatives": 1
    }
    
    score = sum(weights.get(k, 0) for k, v in indicators.items() if v)
    
    if score <= 3: return 1
    if score <= 6: return 2
    if score <= 9: return 3
    if score <= 12: return 4
    return 5