diff --git a/app/assets/images/icone_profil/icone_profil4_plus.svg b/app/assets/images/icone_profil/icone_profil4_plus.svg new file mode 100644 index 000000000..93a81b292 --- /dev/null +++ b/app/assets/images/icone_profil/icone_profil4_plus.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/app/models/evaluation.rb b/app/models/evaluation.rb index 1095d32ee..cfcaa8568 100644 --- a/app/models/evaluation.rb +++ b/app/models/evaluation.rb @@ -11,7 +11,7 @@ class Evaluation < ApplicationRecord NIVEAUX_POSITIONNEMENT = %w[profil1 profil2 profil3 profil4 profil_4h profil_4h_plus profil_4h_plus_plus profil_aberrant indetermine].freeze - NIVEAUX_NUMERATIE = %w[profil1 profil2 profil3 profil4 indetermine].freeze + NIVEAUX_NUMERATIE = %w[profil1 profil2 profil3 profil4 profil4_plus indetermine].freeze NIVEAUX_COMPLETUDE = %w[incomplete competences_de_base_incompletes competences_transversales_incompletes complete].freeze SITUATION_COMPETENCES_TRANSVERSALES = %w[tri inventaire securite controle].freeze diff --git a/app/models/restitution/competence/profil_evacob.rb b/app/models/restitution/competence/profil_evacob.rb index ca8e7babf..59255556e 100644 --- a/app/models/restitution/competence/profil_evacob.rb +++ b/app/models/restitution/competence/profil_evacob.rb @@ -29,6 +29,7 @@ class ProfilEvacob < Restitution::Competence::Base ::Competence::PROFIL_ABERRANT => 0 }, 'profil_numeratie' => { + ::Competence::PROFIL_4_PLUS => 5, ::Competence::PROFIL_4 => 4, ::Competence::PROFIL_3 => 3, ::Competence::PROFIL_2 => 2, diff --git a/app/models/restitution/illettrisme/synthetiseur.rb b/app/models/restitution/illettrisme/synthetiseur.rb index 2627ac710..4dac31f14 100644 --- a/app/models/restitution/illettrisme/synthetiseur.rb +++ b/app/models/restitution/illettrisme/synthetiseur.rb @@ -90,7 +90,8 @@ def initialize(interpreteur_positionnement, inter_numeratie) def socle_clea? @niveau_positionnement.in?(%i[profil4 profil_4h profil_4h_plus - profil_4h_plus_plus]) || @niveau_numeratie.in?(%i[profil4]) + profil_4h_plus_plus]) || + @niveau_numeratie.in?(%i[profil4 profil4_plus]) end def illettrisme_potentiel? diff --git a/app/models/restitution/place_du_marche.rb b/app/models/restitution/place_du_marche.rb index dae5e1033..7a4cc33ce 100644 --- a/app/models/restitution/place_du_marche.rb +++ b/app/models/restitution/place_du_marche.rb @@ -28,8 +28,8 @@ def initialize(campagne, evenements) super end - def score_pour(niveau) - SCORES[niveau]['score'].calcule(evenements, niveau, avec_rattrapage: true) + def score_pour(niveau, avec_rattrapage: true) + SCORES[niveau]['score'].calcule(evenements, niveau, avec_rattrapage: avec_rattrapage) end def pourcentage_de_reussite_pour(niveau) @@ -43,10 +43,9 @@ def synthese profil_numeratie: profil_numeratie } end - def niveau_numeratie + def niveau_numeratie # rubocop:disable Metrics/CyclomaticComplexity niveau = 0 - n1 = pourcentage_de_reussite_pour(:N1) - return niveau if n1.blank? + return niveau if pourcentage_de_reussite_pour(:N1).blank? n2 = pourcentage_de_reussite_pour(:N2) n3 = pourcentage_de_reussite_pour(:N3) @@ -55,6 +54,7 @@ def niveau_numeratie niveau = 2 if n2 niveau = 3 if n3 niveau = 4 if n3 && n3 > SEUIL_MINIMUM + niveau = 5 if niveau == 4 && !a_passe_des_questions_de_rattrapage? niveau end @@ -65,5 +65,12 @@ def profil_numeratie Competence::ProfilEvacob.new(self, 'profil_numeratie', niveau_numeratie).profil_numeratie end + + def a_passe_des_questions_de_rattrapage? + evenements_rattrapage = MetriquesHelper.filtre_evenements_reponses(evenements) do |e| + e.donnees['question'].start_with?('N3R') + end + evenements_rattrapage.present? + end end end diff --git a/config/locales/views/numeratie.yml b/config/locales/views/numeratie.yml index aff1c575b..c03afd07a 100644 --- a/config/locales/views/numeratie.yml +++ b/config/locales/views/numeratie.yml @@ -36,3 +36,11 @@ fr: Votre score indique que vous maîtrisez les fondamentaux de la communication en calcul et raisonnement, ce qui signifie que vous êtes plutôt à l’aise en calcul et raisonnement pour comprendre et communiquer en contexte professionnel.

Cela vous ouvre les portes de nombreuses formations ou de nombreux emplois ! + profil4_plus: + alt_icone: Profil 4 Plus + description: | + ### Certification Cléa indiquée + + Votre score indique que vous êtes à l’aise avec les concepts mathématiques fondamentaux dans un contexte professionnel ! + + Maîtriser les bases de la numératie, comme les calculs, les proportions ou l’interprétation de données, est une compétence clé qui peut vous ouvrir des portes vers de nouvelles formations ou opportunités professionnelles. N’hésitez pas à valoriser la maîtrise de cette compétence ! diff --git a/spec/models/restitution/place_du_marche_spec.rb b/spec/models/restitution/place_du_marche_spec.rb index 2a2d3366b..4b77f6961 100644 --- a/spec/models/restitution/place_du_marche_spec.rb +++ b/spec/models/restitution/place_du_marche_spec.rb @@ -161,6 +161,16 @@ end end + context 'quand le niveau numératie est 5 (4 Plus)' do + before do + allow(restitution).to receive(:niveau_numeratie).and_return 5 + end + + it 'retourne le profil 4 Plus' do + expect(restitution.profil_numeratie).to equal(Competence::PROFIL_4_PLUS) + end + end + context 'quand le niveau numératie est 0' do before do allow(restitution).to receive(:niveau_numeratie).and_return 0 @@ -230,9 +240,80 @@ allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N1).and_return 71 allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N2).and_return 71 allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N3).and_return 71 + allow(restitution).to receive(:a_passe_des_questions_de_rattrapage?).and_return true end it { expect(restitution.niveau_numeratie).to eq 4 } end + + context 'quand le pourcentage de réussite pour N3 est supérieur à 70 sans rattrapage' do + before do + allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N1).and_return 71 + allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N2).and_return 71 + allow(restitution).to receive(:pourcentage_de_reussite_pour).with(:N3).and_return 71 + allow(restitution).to receive(:a_passe_des_questions_de_rattrapage?).and_return false + end + + it { expect(restitution.niveau_numeratie).to eq 5 } + end + end + + describe '#a_passe_des_questions_de_rattrapage?' do + context 'sans rattrapage' do + let(:restitution) do + described_class.new(campagne, + [ + build(:evenement_demarrage, partie: partie), + build(:evenement_reponse, + donnees: { succes: true, + question: 'N3Pse1', + score: 1 }, + partie: partie), + build(:evenement_reponse, + donnees: { succes: true, + question: 'N3Pvn1', + score: 1 }, + partie: partie), + build(:evenement_reponse, + donnees: { succes: true, + question: 'N3Prn1', + score: 1 }, + partie: partie) + ]) + end + + it do + expect(restitution.a_passe_des_questions_de_rattrapage?).to be false + end + end + + context 'avec du rattrapage' do + let(:restitution) do + described_class.new(campagne, + [ + build(:evenement_demarrage, partie: partie), + build(:evenement_reponse, donnees: { succes: true, + question: 'N3Pse1', + score: 1 }, + partie: partie), + build(:evenement_reponse, donnees: { succes: true, + question: 'N3Pvn1', + score: 1 }, + partie: partie), + build(:evenement_reponse, donnees: { succes: true, + question: 'N3Prn1', + score: 1 }, + partie: partie), + build(:evenement_reponse, donnees: { succes: true, + question: 'N3Rrn1', + score: 2 }, + partie: partie) + ]) + end + + it do + expect(restitution.a_passe_des_questions_de_rattrapage?).to be true + end + end end end