import org.lilie.services.eliot.scolarite.anneescolaire.AnneeScolaireService\r
import org.lilie.services.eliot.brevet.BrevetFiche\r
import org.lilie.services.eliot.brevet.BrevetModeCalculNote\r
+import org.lilie.services.eliot.notes.Note\r
\r
/**\r
* Gestion des notes de brevet\r
// enregsitre les changements\r
notesInitialises.each { BrevetNoteInfo noteInfo ->\r
BrevetNote brevetNote = BrevetNote.get(noteInfo.noteId)\r
- if (noteInfo.appreciation !=null || noteInfo.valeurNumerique != null) {\r
- if (noteInfo.appreciation !=null) {\r
+ if (noteInfo.appreciation != null || noteInfo.valeurNumerique != null || noteInfo.noteValeur) {\r
+\r
+ if (noteInfo.appreciation != null) {\r
brevetNote.appreciation = noteInfo.appreciation\r
}\r
- if (noteInfo.valeurNumerique !=null) {\r
+\r
+ if (noteInfo.valeurNumerique != null) {\r
brevetNote.valeurNumerique = noteInfo.valeurNumerique\r
}\r
+ else if (noteInfo.noteValeur != null) {\r
+ brevetNote.setValeurTextuelle(noteInfo.noteValeur)\r
+ }\r
+\r
brevetNote.save(failOnError: true)\r
}\r
}\r
- sessionFactory.currentSession.flush() // flush la session\r
+ sessionFactory.currentSession.flush()\r
\r
return initialisationOk\r
}\r
EpreuveInfo epreuveInfo = epreuveInfos.find {\r
it.epreuve.id == brevetNote.epreuve.id }\r
\r
- internalActualiseNote(\r
+ notesActualisess += internalActualiseNote(\r
epreuveInfo.moyenne,\r
epreuveInfo.appreciation,\r
- brevetNote,\r
- notesActualisess\r
+ brevetNote\r
)\r
}\r
\r
epreuveInfo.matieres = moyenneParMatierePourEpreuve.keySet().toList()\r
break\r
\r
+ case BrevetModeCalculNote.MOYENNE_SPORT :\r
+ epreuveInfo.moyenne = calculeMoyenneSport(periode.classe, eleve)\r
+ Matiere matiereSport = getMatiereSport(periode.classe)\r
+ epreuveInfo.matieres = matiereSport ? [matiereSport] : []\r
+ break\r
+\r
default: \r
throw new IllegalStateException(\r
"Le mode de calcul de note ${epreuveInfo.epreuve.modeCalculNote} " +\r
}\r
}\r
\r
+ private BigDecimal calculeMoyenneSport(StructureEnseignement classe, Personne eleve) {\r
+ Service serviceSport = classe.structureEnseignementNotes.serviceSport\r
+\r
+ if (!serviceSport) {\r
+ return null\r
+ }\r
+\r
+ List<Note> notes = Note.createCriteria().listDistinct {\r
+ eq('eleve', eleve.autorite)\r
+ evaluation {\r
+ enseignement {\r
+ eq('service', serviceSport)\r
+ }\r
+ periodes {\r
+ typePeriode {\r
+ eq('nature', NaturePeriodeEnum.NOTATION)\r
+ }\r
+ }\r
+ }\r
+\r
+ eq('choisiePourSport', true)\r
+ }\r
+\r
+ if (notes.size() < 3) {\r
+ return null\r
+ }\r
+\r
+ if (notes.size() > 3) {\r
+ throw new IllegalStateException(\r
+ "L'élève $eleve a plus de 3 notes sélectionnées sport dans le service $serviceSport")\r
+ }\r
+\r
+ return calculationService.calculeMoyenne(notes*.valeurSur20, true)?.valeurNumerique\r
+ }\r
+\r
+ private Matiere getMatiereSport(StructureEnseignement classe) {\r
+ return classe.structureEnseignementNotes.serviceSport?.matiere\r
+ }\r
+\r
/**\r
* Moyenne ponderee des resultats\r
* @author msan\r
* la valeur numérique de cette note n'est pas mise à jour.\r
* @author msan\r
*/\r
- void internalActualiseNote(BigDecimal note,\r
- String appreciation,\r
- BrevetNote brevetNote,\r
- List<BrevetNoteInfo> notesActualisees) {\r
+ private List<BrevetNoteInfo> internalActualiseNote(BigDecimal note,\r
+ String appreciation,\r
+ BrevetNote brevetNote) {\r
+\r
+ List<BrevetNoteInfo> notesActualises = []\r
\r
// si la moyenne ou l'appr existe, ajoute la note\r
// dans la liste des resultats envoyes\r
- if (note != null || appreciation!=null) {\r
+ if (note != null || appreciation != null ||\r
+ (brevetNote.epreuve.isSport() && brevetNote.valeurTextuelle == null)) {\r
+\r
BrevetNoteInfo brevetNoteInfo = new BrevetNoteInfo(\r
noteId: brevetNote.id,\r
eleveId: brevetNote.fiche.eleve.id,\r
noteValeur: brevetNote.valeur,\r
valeurNumerique: brevetNote.valeurNumerique\r
)\r
- if (note != null && brevetNote.valeurTextuelle == null) {\r
- brevetNoteInfo.valeurNumerique = note\r
- brevetNoteInfo.noteValeur = BrevetNote.NOTE_FORMATEUR.format(note)\r
+\r
+ if (brevetNote.valeurTextuelle == null) {\r
+ if (note != null) {\r
+ brevetNoteInfo.valeurNumerique = note\r
+ brevetNoteInfo.noteValeur = BrevetNote.NOTE_FORMATEUR.format(note)\r
+ }\r
+ else if (brevetNote.epreuve.isSport()) {\r
+ brevetNoteInfo.valeurNumerique = null\r
+ brevetNoteInfo.noteValeur = NoteTextuellesEnum.DI\r
+ }\r
}\r
- if (appreciation!=null) {\r
+\r
+ if (appreciation != null) {\r
brevetNoteInfo.appreciation = coupeAppreciation(appreciation)\r
}\r
\r
- notesActualisees.add(brevetNoteInfo)\r
+ notesActualises.add(brevetNoteInfo)\r
}\r
+\r
+ return notesActualises\r
}\r
\r
/**\r
import org.lilie.services.eliot.notes.test.InitDonneesNotesTestService\r
import org.lilie.services.eliot.notes.brevet.BrevetNoteInfo\r
import org.lilie.services.eliot.scolarite.AnneeScolaire\r
+import org.lilie.services.eliot.textes.TypeActivite\r
+import org.lilie.services.eliot.textes.TypeActiviteParDefaut\r
+import org.lilie.services.eliot.scolarite.IntervalleEnum\r
+import java.math.RoundingMode\r
\r
/**\r
* Testes de BrevetNoteService\r
Personne prof2 = null\r
\r
BrevetEpreuve epreuve = null\r
+ BrevetEpreuve epreuveSport = null\r
BrevetSerie serie = null\r
SecuriteSession securiteSessionDirection = null\r
\r
Matiere matiere1 = null\r
Service service1 = null\r
Enseignement enseignement1 = null\r
+ Enseignement enseignement2 = null\r
\r
Periode periodeAnnee = null\r
\r
)\r
\r
epreuve = serie.epreuves.toList().sort { it.code }.get(0) // FRANÇAIS, max 20, AB\r
+\r
+ epreuveSport = serie.epreuves.toList().find { it.isSport() }\r
+\r
matiere1 = matiereService.creeMatiereManuel(\r
securiteSessionDirection,\r
etablissement,\r
service1\r
)\r
\r
+ enseignement2 = notesEnseignementService.creeEnseignement(\r
+ securiteSessionDirection,\r
+ prof2.autorite,\r
+ service1\r
+ )\r
}\r
\r
/**\r
\r
creeBrevetNote(eleve1, epreuve, 1, 'susu')\r
\r
-\r
- Enseignement enseignement2 = notesEnseignementService.creeEnseignement(\r
- securiteSessionDirection,\r
- prof2.autorite,\r
- service1\r
- )\r
-\r
// cree le resultat 13\r
creeResultat(eleve1, service1, 13)\r
\r
periode: periodeAnnee\r
))\r
\r
- Enseignement enseignement2 = notesEnseignementService.creeEnseignement(\r
- securiteSessionDirection,\r
- prof2.autorite,\r
- service2\r
- )\r
-\r
// cree les resultats\r
creeResultat(eleve1, service1, 6)\r
creeResultat(eleve1, service2, 7)\r
)\r
}\r
\r
+\r
+ void testActualisationEpreuveSport() {\r
+\r
+ creeBrevetNote(eleve1, epreuveSport, 1, 'susu')\r
+ creeResultat(eleve1, service1, 20)\r
+\r
+ brevetRelEpreuveMatiereService.majRelEpreuveMatieres(\r
+ securiteSessionDirection,\r
+ epreuveSport,\r
+ [matiere1]\r
+ )\r
+\r
+ TypeActivite typeSport = TypeActivite.findByCodeAndEtablissement(\r
+ TypeActiviteParDefaut.SPORT.code,\r
+ classe.etablissement\r
+ )\r
+\r
+ Periode T1 = classe.periodes.find {it.intervalle == IntervalleEnum.T1}\r
+ Periode T2 = classe.periodes.find {it.intervalle == IntervalleEnum.T2}\r
+ Periode T3 = classe.periodes.find {it.intervalle == IntervalleEnum.T3}\r
+\r
+ Evaluation eval1Ens1 = creeEvaluation("Foot", 10, enseignement1, T1, typeSport)\r
+ Evaluation eval2Ens1 = creeEvaluation("Gym", 20, enseignement1, T2, typeSport)\r
+ Evaluation eval3Ens1 = creeEvaluation("Golf", 40, enseignement1, T3, typeSport)\r
+\r
+ Evaluation eval1Ens2 = creeEvaluation("Ski", 10, enseignement2, T1, typeSport)\r
+ Evaluation eval2Ens2 = creeEvaluation("Hand", 20, enseignement2, T2, typeSport)\r
+ Evaluation eval3Ens2 = creeEvaluation("Natation", 40, enseignement2, T3, typeSport)\r
+\r
+ Note note1 = creeNote(eleve1, eval1Ens1, "ABS", false)\r
+ Note note2 = creeNote(eleve1, eval2Ens1, '10', true) // 10 sur 20 => 10 sur 20\r
+ Note note3 = creeNote(eleve1, eval3Ens1, '10', true) // 10 sur 40 => 5 sur 20\r
+ Note note4 = creeNote(eleve1, eval1Ens2, '10', true) // 10 sur 10 => 20 sur 20\r
+ Note note5 = creeNote(eleve1, eval2Ens2, '1', false)\r
+ Note note6 = creeNote(eleve1, eval3Ens2, '1', false)\r
+\r
+ BigDecimal moyenneSport = BigDecimal.valueOf((Long)(5 + 10 + 20)).divide((Long) 3, 10, RoundingMode.HALF_UP)\r
+\r
+ classe.structureEnseignementNotes.serviceSport = service1\r
+ classe.structureEnseignementNotes.save(failOnError: true)\r
+\r
+ creeAppreciation(eleve1, enseignement1, 'bubu')\r
+ creeAppreciation(eleve1, enseignement2, 'zuzu')\r
+\r
+ List<BrevetNoteInfo> notes = brevetNoteService.actualiseNotes(\r
+ securiteSessionDirection,\r
+ classe,\r
+ [eleve1]\r
+ )\r
+\r
+ assertEquals(\r
+ "La moyenne de Sport n'est pas correcte",\r
+ moyenneSport,\r
+ notes.first().valeurNumerique\r
+ )\r
+\r
+ assertTrue(\r
+ "L'appreciation trouvée n'est pas correcte",\r
+ notes.first().appreciation == 'zuzu bubu' ||\r
+ notes.first().appreciation == 'bubu zuzu'\r
+ )\r
+\r
+ // Cas : moins de 3 notes sélectionées\r
+ note2.choisiePourSport = false\r
+ note2.save(failOnError: true)\r
+\r
+ notes = brevetNoteService.actualiseNotes(\r
+ securiteSessionDirection,\r
+ classe,\r
+ [eleve1]\r
+ )\r
+\r
+ assertEquals(\r
+ "La moyenne de Sport n'est pas correcte",\r
+ 'DI',\r
+ notes.first().noteValeur\r
+ )\r
+\r
+\r
+ // Cas : plus de 3 notes sélectionées\r
+ note5.choisiePourSport = true\r
+ note5.save(failOnError: true)\r
+ note6.choisiePourSport = true\r
+ note6.save(failOnError: true)\r
+\r
+ Boolean exeption = false\r
+\r
+ try {\r
+ brevetNoteService.actualiseNotes(securiteSessionDirection, classe, [eleve1])\r
+ } catch (IllegalStateException ex) {\r
+ exeption = true\r
+ }\r
+\r
+ assertTrue(\r
+ "L'exception n'a pas été levée alors qu'il y a plus 3 notes sélectionnées pour un élève",\r
+ exeption\r
+ )\r
+ }\r
+\r
+\r
+ Evaluation creeEvaluation(String titre,\r
+ BigDecimal noteMax,\r
+ Enseignement enseignement,\r
+ Periode periode,\r
+ TypeActivite type) {\r
+\r
+ Evaluation eval = new Evaluation(\r
+ titre: titre,\r
+ noteMaxPossible: noteMax,\r
+ enseignement: enseignement,\r
+ typeActivite: type,\r
+ coefficient: 1,\r
+ dateEvaluation: new Date(),\r
+ publiable: true\r
+ )\r
+\r
+ eval.addToPeriodes(periode)\r
+ eval.save(failOnError: true)\r
+ return eval\r
+ }\r
+\r
+\r
+ Note creeNote(Personne eleve, Evaluation eval, String valeur, Boolean choisiePourSport) {\r
+ Note note = new Note(\r
+ eleve: eleve.autorite,\r
+ evaluation: eval,\r
+ choisiePourSport: choisiePourSport\r
+ )\r
+ note.setValeur(valeur)\r
+ note.save(failOnError: true)\r
+ return note\r
+ }\r
+\r
+\r
/**\r
* Cree une appreciation d'un eleve et d'un enseignement\r
*/\r