Skip to content

Commit

Permalink
Merge branch 'develop' into fix-l-affichage-des-evaluations
Browse files Browse the repository at this point in the history
  • Loading branch information
cprodhomme authored Jan 30, 2025
2 parents 10cff1f + 3bb9fce commit a73d99f
Show file tree
Hide file tree
Showing 11 changed files with 207 additions and 74 deletions.
7 changes: 6 additions & 1 deletion app/assets/stylesheets/admin/pages/aide/_sources_aide.scss
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

.illustration {
margin-right: 1.5rem;
height: 100%;
height: 150px;
width: 111px;
}

.titre {
Expand All @@ -24,6 +25,10 @@

.description {
font-style: italic;
p {
line-height: 1rem;
font-size: .875rem;
}
}

.action {
Expand Down
35 changes: 34 additions & 1 deletion app/models/evenement_question.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ def a_ete_repondue?
@evenement.persisted? && score.present?
end

def est_principale?
@question.est_principale?
end

def est_un_rattrapage?
@question.est_un_rattrapage?
end

def interaction
@question.interaction
end
Expand All @@ -55,7 +63,32 @@ def nom_technique
end

def pris_en_compte_pour_calcul_score_clea?(questions)
questions.any? { |q| q.nom_technique == @question.nom_technique }
questions.any? { |q| q.nom_technique == nom_technique }
end

def self.prises_en_compte_pour_calcul_score_clea(evenements_questions) # rubocop:disable all
resultat = evenements_questions.flatten

evenements_questions_groupes = evenements_questions.group_by do |evenement_question|
evenement_question.nom_technique[0, 5]
end

evenements_questions_groupes.each do |nom_technique, groupe|
next unless groupe.all? do |evenement_question|
evenement_question.est_principale? && evenement_question.score.positive?
end

nom_technique_rattrapage =
Restitution::Evacob::ScoreModule::NUMERATIE_METRIQUES[nom_technique]

next unless nom_technique_rattrapage

resultat.reject! do |evenement_question|
evenement_question.nom_technique.start_with? nom_technique_rattrapage
end
end

resultat
end

def self.pourcentage_pour_groupe(evenements_questions)
Expand Down
2 changes: 0 additions & 2 deletions app/models/import_export/export_xls.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ class ExportXls

WORKSHEET_DONNEES = 'Données'
WORKSHEET_SYNTHESE = 'Synthèse'
NUMBER_FORMAT = Spreadsheet::Format.new(number_format: '0')
POURCENTAGE_FORMAT = Spreadsheet::Format.new(number_format: '0%')

def initialize
@workbook = Spreadsheet::Workbook.new
Expand Down
33 changes: 29 additions & 4 deletions app/models/import_export/onglet_xls.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ module ImportExport
class OngletXls
attr_reader :sheet

NUMBER_FORMAT = '0'
DECIMAL_NUMBER_FORMAT = '0.0#'
POURCENTAGE_FORMAT = '0%'

def initialize(titre, workbook, entetes)
@titre = titre
@workbook = workbook

@sheet = @workbook.create_worksheet(name: @titre)
format_premiere_ligne = Spreadsheet::Format.new(weight: :bold, border: :none)
@sheet.row(0).default_format = format_premiere_ligne
set_format_ligne(0, format_premiere_ligne)
remplis_entetes(entetes)
end

Expand All @@ -19,19 +23,22 @@ def set_valeur(ligne, colonne, valeur)
end

def set_nombre(ligne, colonne, valeur)
return if valeur.nil?

set_valeur(ligne, colonne, valeur)
@sheet.row(ligne).set_format(colonne, ExportXls::NUMBER_FORMAT)
format = nombre_est_un_entier?(valeur) ? NUMBER_FORMAT : DECIMAL_NUMBER_FORMAT
set_format_colonne(ligne, colonne, format)
end

def set_pourcentage(ligne, colonne, valeur)
set_valeur(ligne, colonne, valeur)
@sheet.row(ligne).set_format(colonne, ExportXls::POURCENTAGE_FORMAT)
set_format_colonne(ligne, colonne, POURCENTAGE_FORMAT)
end

XLS_COLOR_GRAY = :xls_color_14 # rubocop:disable Naming/VariableNumber
def grise_ligne(ligne)
format_grise = Spreadsheet::Format.new(pattern_fg_color: XLS_COLOR_GRAY, pattern: 1)
@sheet.row(ligne).default_format = format_grise
set_format_ligne(ligne, format_grise)
end

private
Expand All @@ -42,5 +49,23 @@ def remplis_entetes(entetes)
@sheet.column(colonne).width = entete[:taille]
end
end

def set_format_colonne(ligne, colonne, number_format)
ancien_format = @sheet.row(ligne).format(colonne)
nouveau_format = Spreadsheet::Format.new(
number_format: number_format,
pattern: ancien_format.pattern,
pattern_fg_color: ancien_format.pattern_fg_color
)
@sheet.row(ligne).set_format(colonne, nouveau_format)
end

def set_format_ligne(ligne, number_format)
@sheet.row(ligne).default_format = number_format
end

def nombre_est_un_entier?(nombre)
(nombre % 1).zero?
end
end
end
15 changes: 5 additions & 10 deletions app/models/question.rb
Original file line number Diff line number Diff line change
Expand Up @@ -145,17 +145,12 @@ def self.pour_code_clea(questions, code)
questions.select { |question| metacompetences.include? question.metacompetence }
end

def self.prises_en_compte_pour_calcul_score_clea(questions, questions_repondues)
resultat = questions.to_a
niveaux = %w[N1R N2R N3R]

niveaux.each do |niveau|
if questions_repondues.none? { |question| question.nom_technique.start_with?(niveau) }
resultat.reject! { |question| question.nom_technique.start_with?(niveau) }
end
end
def est_principale?
nom_technique[2] == 'P'
end

resultat
def est_un_rattrapage?
nom_technique[2] == 'R'
end

private
Expand Down
23 changes: 19 additions & 4 deletions app/models/restitution/evacob/score_module.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,31 @@ module Restitution
module Evacob
class ScoreModule
NUMERATIE_METRIQUES = {
'N1Pse' => nil,
'N1Prn' => 'N1Rrn',
'N1Pde' => 'N1Rde',
'N1Pes' => 'N1Res',
'N1Pon' => 'N1Ron',
'N1Poa' => 'N1Roa',
'N1Pos' => 'N1Ros',
'N1Pvn' => nil,
'N2' => nil,
'N3' => nil
'N2Plp' => 'N2Rlp',
'N2Ppe' => 'N2Rpe',
'N2Psu' => 'N2Rsu',
'N2Pom' => 'N2Rom',
'N2Pon' => 'N2Ron',
'N2Pod' => 'N2Rod',
'N2Put' => 'N2Rut',
'N2Prh' => 'N2Rrh',
'N2Ptg' => 'N2Rtg',
'N2Ppl' => 'N2Rpl',
'N3Ppl' => 'N3Rpl',
'N3Put' => 'N3Rut',
'N3Ppo' => 'N3Rpo',
'N3Ppr' => 'N3Rpr',
'N3Pps' => 'N3Rps',
'N3Pvo' => 'N3Rvo',
'N3Prp' => 'N3Rrp',
'N1Pse' => nil,
'N1Pvn' => nil
}.freeze

def calcule(evenements, nom_module, avec_rattrapage: false)
Expand Down
19 changes: 9 additions & 10 deletions app/models/restitution/positionnement/export_numeratie.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ def initialize(partie, onglet_xls) # rubocop:disable all
@questions_repondues =
Question.where(nom_technique: @evenements_reponses.map(&:question_nom_technique).uniq)
@questions_situation = @partie.situation.questionnaire&.questions || []
@questions = Question.prises_en_compte_pour_calcul_score_clea(@questions_situation,
@questions_repondues)
@questions_non_repondues = @questions - @questions_repondues
@onglet_xls = onglet_xls
@temps_par_question = Restitution::Metriques::TempsPasseParQuestion
.new(@partie.evenements).calculer
Expand All @@ -25,9 +22,7 @@ def initialize(partie, onglet_xls) # rubocop:disable all
end

@evenements_questions_a_prendre_en_compte =
@evenements_questions.select do |evenement_question|
@questions.map(&:nom_technique).include? evenement_question.nom_technique
end
EvenementQuestion.prises_en_compte_pour_calcul_score_clea(@evenements_questions)
end

def regroupe_par_codes_clea
Expand Down Expand Up @@ -83,23 +78,27 @@ def regroupe_par_sous_sous_domaine(groupes_clea)
end

def remplis_ligne(ligne, evenement_question) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
@onglet_xls.grise_ligne(ligne) unless evenement_question.a_ete_repondue?

@onglet_xls.set_valeur(ligne, 0, evenement_question.code_clea)
@onglet_xls.set_valeur(ligne, 1, evenement_question.nom_technique)
@onglet_xls.set_valeur(ligne, 2, evenement_question.metacompetence&.humanize)
@onglet_xls.set_valeur(ligne, 3, evenement_question.score)
@onglet_xls.set_valeur(ligne, 4, evenement_question.score_max)
@onglet_xls.set_nombre(ligne, 3, evenement_question.score)
@onglet_xls.set_nombre(ligne, 4, evenement_question.score_max)
pris_en_compte = pris_en_compte_pour_calcul_score_clea?(evenement_question)
@onglet_xls.set_valeur(ligne, 5, pris_en_compte)
@onglet_xls.set_valeur(ligne, 6, evenement_question.interaction)
@onglet_xls.set_valeur(ligne, 7, evenement_question.intitule)

@onglet_xls.grise_ligne(ligne) unless evenement_question.a_ete_repondue?
remplis_choix(ligne, evenement_question)
ligne + 1
end

def pris_en_compte_pour_calcul_score_clea?(evenement_question)
pris_en_compte = evenement_question.pris_en_compte_pour_calcul_score_clea?(@questions)
pris_en_compte =
evenement_question.pris_en_compte_pour_calcul_score_clea?(
@evenements_questions_a_prendre_en_compte
)
pris_en_compte ? 'Oui' : 'Non'
end

Expand Down
57 changes: 57 additions & 0 deletions spec/models/evenement_question_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# frozen_string_literal: true

require 'rails_helper'

describe EvenementQuestion, type: :model do
describe '.prises_en_compte_pour_calcul_score_clea(questions_repondues)' do
let(:question_n1) { build(:question, :numeratie_niveau1, score: 1) }
let(:question_rattrapage_n1) { build(:question, :numeratie_niveau1_rattrapage, score: 1) }

let(:evenements_questions) { [] }

let(:resultat) do
described_class.prises_en_compte_pour_calcul_score_clea(evenements_questions)
end

context 'quand les questions sont pour la litteratie' do
it "retourne l'ensemble des questions" do
expect(resultat).to eq evenements_questions
end
end

context "quand il n'y a pas de rattrapage dans les questions répondues" do
let(:evenement_question_n1) do
described_class.new(question: question_n1,
evenement: build(:evenement,
donnees: { score: 1,
question: question_n1.nom_technique }))
end
let(:evenement_question_n1_rattrapage) do
described_class.new(question: question_rattrapage_n1)
end
let(:evenements_questions) { [evenement_question_n1, evenement_question_n1_rattrapage] }

it 'ne retourne pas les questions de rattrapage' do
expect(resultat).not_to include(evenement_question_n1_rattrapage)
expect(evenements_questions.size).to eq 2
end
end

context 'quand il y a une question principale échouée' do
let(:evenement_question_n1) do
described_class.new(question: question_n1,
evenement: build(:evenement,
donnees: { score: 0,
question: question_n1.nom_technique }))
end
let(:evenement_question_n1_rattrapage) do
described_class.new(question: question_rattrapage_n1)
end
let(:evenements_questions) { [evenement_question_n1, evenement_question_n1_rattrapage] }

it 'retourne les questions de rattrapage N1Rrn' do
expect(resultat).to include(evenement_question_n1_rattrapage)
end
end
end
end
47 changes: 47 additions & 0 deletions spec/models/import_export/onglet_xls_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# frozen_string_literal: true

require 'rails_helper'

describe ImportExport::OngletXls do
describe '#set_nombre(ligne, colonne, valeur)' do
let(:onglet_xls) do
entetes = [{ titre: 'Mon titre', taille: 20 }]
workbook = Spreadsheet::Workbook.new
described_class.new(ImportExport::ExportXls::WORKSHEET_DONNEES, workbook, entetes)
end

context 'quand le nombre est un entier' do
let(:valeur) { 1 }

it 'utilise un format de nombre entier' do
ligne = 1
colonne = 0

expect(onglet_xls).to receive(:set_format_colonne).with(
ligne,
colonne,
ImportExport::OngletXls::NUMBER_FORMAT
)

onglet_xls.set_nombre(ligne, colonne, valeur)
end
end

context 'quand le nombre est un décimal' do
let(:valeur) { 0.5 }

it 'utilise un format de nombre décimal' do
ligne = 1
colonne = 0

expect(onglet_xls).to receive(:set_format_colonne).with(
ligne,
colonne,
ImportExport::OngletXls::DECIMAL_NUMBER_FORMAT
)

onglet_xls.set_nombre(ligne, colonne, valeur)
end
end
end
end
Loading

0 comments on commit a73d99f

Please sign in to comment.