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