--- /dev/null
+package org.lilie.services.eliot.notes.brevet
+
+import org.lilie.services.eliot.brevet.BrevetFiche
+import org.lilie.services.eliot.scolarite.Personne
+import org.lilie.services.eliot.scolarite.anneescolaire.AnneeScolaireService
+import org.lilie.services.eliot.annuaire.SecuriteSession
+import org.lilie.services.eliot.notes.NotesDroitService
+
+import org.lilie.services.eliot.brevet.BrevetSerie
+import org.lilie.services.eliot.annuaire.PersonneProprietesScolarite
+import org.lilie.services.eliot.notes.NotesFonction
+import org.lilie.services.eliot.notes.ActionEnum
+import org.lilie.services.eliot.scolarite.StructureEnseignement
+import org.lilie.services.eliot.notes.scolarite.NotesStructureEnseignementService
+import org.lilie.services.eliot.brevet.BrevetNote
+import org.hibernate.SessionFactory
+import org.hibernate.FetchMode
+
+class BrevetFicheService {
+
+ AnneeScolaireService anneeScolaireService
+ NotesDroitService notesDroitService
+ NotesStructureEnseignementService notesStructureEnseignementService
+
+ SessionFactory sessionFactory
+
+ static transactional = true
+
+ /**
+ * Retourne toutes les fiches de Brevet de pour une classe et une série données.
+ * @author bper
+ */
+ List<BrevetFiche> findAllFicheByClasseAndSerie(SecuriteSession securiteSession,
+ StructureEnseignement classe,
+ BrevetSerie serie) {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ classe.etablissement,
+ ActionEnum.CONSULTATION,
+ NotesFonction.DIRECTION_ASSIMILE)
+
+ if (classe.anneeScolaire.id != serie.anneeScolaire.id) {
+ throw new IllegalArgumentException(
+ "L'année scolaire de la classe $classe ne correspond pas " +
+ "à celle de la série de Brevet $serie"
+ )
+ }
+
+ return PersonneProprietesScolarite.createCriteria().list {
+ createAlias('personne', 'personne')
+ createAlias('personne.brevetFiches', 'brevetFiches')
+ createAlias('brevetFiches.notes', 'notes')
+ createAlias('notes.epreuve', 'epreuve')
+
+ projections {
+ distinct('notes.fiche')
+ }
+
+ proprietesScolarite {
+ eq('structureEnseignement',classe)
+ }
+
+ eq('brevetFiches.anneeScolaire', classe.anneeScolaire)
+ eq('epreuve.serie', serie)
+ eq('estActive', true)
+ }
+ }
+
+
+ /**
+ * Enregistre les notes et les avis dans les fiches de Brevet des élèves.
+ * @author bper
+ */
+ List<BrevetFiche> saveAllFiche(SecuriteSession securiteSession,
+ List<BrevetFicheSaveParams> ficheParamses) {
+
+ List<Long> eleveIds = ficheParamses*.eleveId
+
+ List<BrevetFiche> fiches = BrevetFiche.createCriteria().list {
+ eleve {'in'('id',eleveIds)}
+ eq('anneeScolaire', anneeScolaireService.anneeScolaireEnCours())
+ }
+
+ if (ficheParamses.size() != fiches.size()) {
+ List<Long> eleveSansFicheIds = (List) eleveIds.findAll {Long eleveId ->
+ !fiches.any {it.eleve.id == eleveId}
+ }
+ throw new IllegalArgumentException(
+ "Les élèves avec IDs $eleveSansFicheIds ne sont pas inscrits au brevet"
+ )
+ }
+
+ List<StructureEnseignement> classes =
+ notesStructureEnseignementService.findAllClassesForAllEleves(fiches*.eleve)
+
+ classes.each {StructureEnseignement classe ->
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ classe.etablissement,
+ ActionEnum.MODIFICATION,
+ NotesFonction.DIRECTION_ASSIMILE)
+ }
+
+ fiches = fiches.collect {BrevetFiche fiche ->
+ BrevetFicheSaveParams params = (BrevetFicheSaveParams) ficheParamses.find {
+ it.eleveId == fiche.eleve.id
+ }
+
+ params.mapEpreuveNote.each {Long epreuveId, String valeurNote ->
+ BrevetNote note = (BrevetNote) fiche.notes.find {it.epreuve.id == epreuveId}
+
+ if (!note) {
+ throw new IllegalArgumentException(
+ "L'eleve ${fiche.eleve} n'est pas inscrit pour l'épreuve (id=$epreuveId)")
+ }
+
+ note.valeur = valeurNote
+ }
+
+ if (params.avis != null) {
+ fiche.avis = (params.avis == '') ? null : params.avis
+ }
+
+ fiche.save(failOnError: true)
+ return fiche
+ }
+
+ sessionFactory.currentSession.flush()
+
+ return fiches
+ }
+
+
+ /**
+ * Retourne toutes les fiches de Brevet pour une liste d'élève.
+ * @author bper
+ */
+ List<BrevetFiche> internalFindAllFicheByEleves(List<Personne> eleves) {
+ return BrevetFiche.createCriteria().list {
+ 'in'('eleve', eleves)
+ eq('anneeScolaire', anneeScolaireService.anneeScolaireEnCours())
+ fetchMode('notes',FetchMode.JOIN)
+ fetchMode('notes.epreuve',FetchMode.JOIN)
+ }
+ }
+
+}