--- /dev/null
+/*
+ * Copyright © FYLAB and the Conseil Régional d'Île-de-France, 2009
+ * This file is part of L'Interface Libre et Interactive de l'Enseignement (Lilie).
+ *
+ * Lilie is free software. You can redistribute it and/or modify since
+ * you respect the terms of either (at least one of the both license) :
+ * - under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ * - the CeCILL-C as published by CeCILL-C; either version 1 of the
+ * License, or any later version
+ *
+ * There are special exceptions to the terms and conditions of the
+ * licenses as they are applied to this software. View the full text of
+ * the exception in file LICENSE.txt in the directory of this software
+ * distribution.
+ *
+ * Lilie is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * Licenses for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * and the CeCILL-C along with Lilie. If not, see :
+ * <http://www.gnu.org/licenses/> and
+ * <http://www.cecill.info/licences.fr.html>.
+ */
+
+
+package org.lilie.services.eliot.notes.domaine
+
+import org.lilie.services.eliot.SessionUtils
+import grails.converters.JSON
+import org.lilie.services.eliot.notes.scolarite.NotesPeriodeService
+import org.lilie.services.eliot.scolarite.Periode
+import org.lilie.services.eliot.scolarite.StructureEnseignement
+import org.lilie.services.eliot.scolarite.NaturePeriodeEnum
+import org.lilie.services.eliot.scolarite.Service
+import org.lilie.services.eliot.notes.AbstractNotesController
+import org.lilie.services.eliot.notes.scolarite.NotesStructureEnseignementService
+import org.lilie.services.eliot.notes.ActionEnum
+import org.lilie.services.eliot.notes.NotesDroitService
+import org.lilie.services.eliot.annuaire.SecuriteSession
+import org.lilie.services.eliot.notes.NotesFonction
+
+/**
+ * Périodes
+ * @author msan
+ * @author bper
+ */
+class PeriodeController extends AbstractNotesController {
+
+ NotesDroitService notesDroitService
+ NotesPeriodeService notesPeriodeService
+ NotesStructureEnseignementService notesStructureEnseignementService
+
+ /**
+ * Périodes de service
+ * @param idService
+ * @author msan
+ * @author bper
+ * @return
+ */
+ def listePeriodesPourService = {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.CONSULTATION,
+ (List) (NotesFonction.ENSEIGNANT_ASSIMILE +
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+ )
+
+ Map result = getResultIfNullParams(['idService'])
+ if (!result) {
+ result = tryCatch {
+ SecuriteSession securiteSession = SessionUtils.securiteSession(session)
+ Long idService = Long.valueOf(params.idService)
+ Service service = Service.get(idService)
+ List<Periode> periodes = notesPeriodeService.getPeriodesPourService(securiteSession, service)
+ //Trie les périodes (trimestre1, trimestre2, trimestre3, année, examens triés...)
+ periodes = triePeriodes(periodes)
+ List periodeInfos = periodes.collect {Periode periode ->
+ PeriodeInfo periodeInfo = new PeriodeInfo()
+ periodeInfo.idPeriode = periode.id
+ periodeInfo.libelle = getTypePeriodeLibelle(periode.typePeriode)
+ periodeInfo.isPeriodeEnCours = periode.isPeriodeNotation() &&
+ !periode.isPeriodeAnnee() &&
+ periode.isPeriodeEnCours()
+ return periodeInfo
+ }
+ return [periodeInfos: periodeInfos]
+ }
+ }
+ render result as JSON
+ }
+
+ /**
+ * Retourne la liste des périodes pour une classe
+ * @param idClasse
+ * @author bper
+ */
+ def listePeriodesPourClasse = {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.CONSULTATION,
+ (List) (NotesFonction.ENSEIGNANT_ASSIMILE +
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+ )
+
+ Map result = getResultIfNullParams(['idClasse'])
+ if (!result) {
+ result = tryCatch {
+ SecuriteSession securiteSession = SessionUtils.securiteSession(session)
+ Long idClasse = Long.valueOf(params.idClasse)
+ StructureEnseignement classe = StructureEnseignement.get(idClasse)
+ List<Periode> periodes = notesPeriodeService.getPeriodesPourClasse(
+ securiteSession, classe)
+
+ //Trie les périodes (trimestre1, trimestre2, trimestre3, année, examens triés...)
+ periodes = triePeriodes(periodes)
+
+ List<PeriodeInfo> periodeInfos = periodes.collect {Periode periode ->
+ PeriodeInfo periodeInfo = new PeriodeInfo()
+ switch (periode.typePeriode.nature) {
+ case NaturePeriodeEnum.NOTATION:
+ periodeInfo.groupOrdre = 1
+ periodeInfo.libelleEditable = false
+ periodeInfo.supprimable = false
+ break
+ case NaturePeriodeEnum.EXAMEN:
+ periodeInfo.groupOrdre = 2
+ periodeInfo.libelleEditable = true
+ periodeInfo.supprimable = true
+ break
+ }
+ periodeInfo.idPeriode = periode.id
+ periodeInfo.libelle = getTypePeriodeLibelle(periode.typePeriode)
+ periodeInfo.idTypePeriode = periode.typePeriode.id
+ periodeInfo.ordre = periode.ordre
+ periodeInfo.dateDebutPeriode = periode.dateDebut
+ periodeInfo.dateFinPeriode = periode.dateFin
+ periodeInfo.dateFinSaisie = periode.dateFinSaisie
+ periodeInfo.datePublicationBulletins = periode.datePublicationBulletins
+ periodeInfo.datePublicationReleves = periode.datePublicationReleves
+ periodeInfo.isPeriodeAnnee = periode.isPeriodeAnnee()
+ periodeInfo.isPeriodeXmestre = periode.isPeriodeXmestre()
+ return periodeInfo
+ }
+ [periodeInfos: periodeInfos]
+ }
+ }
+ render result as JSON
+ }
+
+ /**
+ * Modifie une période
+ * @param PeriodeCommand
+ * @author bper
+ */
+ def modifierPeriode = {PeriodeCommand command ->
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.MODIFICATION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ Map result = getResultIfInvalidCommand(command)
+ if (!result) {
+ result = tryCatch {
+ notesPeriodeService.modifiePeriode(
+ getSecuriteSession(),
+ new PeriodeParams(
+ periode: command.periode,
+ typePeriode: command.typePeriode,
+ dateDebut: command.dateDebutPeriode,
+ dateFin: command.dateFinPeriode,
+ dateFinSaisie: command.dateFinSaisie,
+ datePublicationBulletins: command.datePublicationBulletins,
+ datePublicationReleves: command.datePublicationReleves
+ )
+ )
+ }
+ }
+ render result as JSON
+ }
+
+ /**
+ * Crée une nouvelle période
+ * @param PeriodeCommand
+ * @author bper
+ */
+ def creerPeriode = {PeriodeCommand command ->
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.CREATION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ Map result = getResultIfInvalidCommand(command)
+ if (!result) {
+ result = tryCatch {
+ notesPeriodeService.creePeriodeExamen(
+ getSecuriteSession(),
+ new PeriodeParams(
+ typePeriode: command.typePeriode,
+ classe: command.classe,
+ dateDebut: command.dateDebutPeriode,
+ dateFin: command.dateFinPeriode,
+ dateFinSaisie: command.dateFinSaisie,
+ datePublicationBulletins: command.datePublicationBulletins,
+ datePublicationReleves: command.datePublicationReleves
+ )
+ )
+ }
+ }
+ render result as JSON
+ }
+
+ /**
+ * Vérifie s'il existe des notes et des appreciations saisies pour une période,
+ * s'ils n'existent pas supprime la période
+ * @param idPeriode
+ * @author bper
+ */
+ def actionSupprimerPeriode = {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.SUPPRESSION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ def result = tryCatch {
+ Long idPeriode = Long.valueOf(params.idPeriode)
+ Periode periode = Periode.get(idPeriode)
+ if (notesPeriodeService.periodeHasNotes(securiteSession, periode) ||
+ notesPeriodeService.periodeHasAppreciations(securiteSession, periode)) {
+ return [deleted: false]
+ } else {
+ return supprimePeriode(params)
+ }
+ }
+
+ render result as JSON
+ }
+
+ private def supprimePeriode(def params) {
+ Long idPeriode = Long.valueOf(params.idPeriode)
+ Periode periode = Periode.get(idPeriode)
+ notesPeriodeService.supprimePeriode(securiteSession, periode)
+ return [deleted: true]
+ }
+
+ /**
+ * Supprime une période et toutes les données liées
+ * @param idPeriode
+ * @author bper
+ */
+ def executeSupprimerPeriode = {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.SUPPRESSION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ def result = tryCatch {
+ return supprimePeriode(params)
+ }
+
+ render result as JSON
+ }
+
+ /**
+ * Bascule des périodes d'une classe.
+ * Soit Trimestre -> Semestre, soit Semestre -> Trimestre.
+ * @author msan
+ */
+ def executePasserEnTrimestreOuSemestre = {
+
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.MODIFICATION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ // get classe
+ Long idClasse = params.idClasse?.toLong()
+
+ if (idClasse == null) {
+ throw new IllegalArgumentException("Param manquant: idClasse")
+ }
+
+ StructureEnseignement classe = StructureEnseignement.get(idClasse)
+
+ notesPeriodeService.basculeTypePeriode(securiteSession, classe)
+
+ render(wrapResultat {[basculeOk: true]} as JSON)
+ }
+
+ /**
+ * Applique le paramétrage d'une classe à d'autres classes
+ * @param classeId
+ * @param notation
+ * @param examen
+ * @param classes
+ * @author bper
+ */
+ def reporteParametrage = {
+ Map result = tryCatch {
+ notesDroitService.verifieAutorisationByEtablissement(
+ securiteSession,
+ etablissementCourant(),
+ ActionEnum.MODIFICATION,
+ NotesFonction.DIRECTION_ASSIMILE
+ )
+
+ Boolean notation = Boolean.valueOf(params.notation)
+ Boolean examen = Boolean.valueOf(params.examen)
+
+ StructureEnseignement.withTransaction {
+ StructureEnseignement classeSource = notesStructureEnseignementService.
+ getClasseAvecPeriodes(Long.valueOf(params.classeId))
+
+ // TOREFACT : eliminer le N+1 select
+ List<StructureEnseignement> classeCibles = JSON.parse(params.classes).collect {
+ notesStructureEnseignementService.getClasseAvecPeriodes(Long.valueOf(it))
+ }
+
+ notesPeriodeService.reporteParametrage(
+ securiteSession,
+ classeSource,
+ classeCibles,
+ notation,
+ examen)
+ }
+ }
+
+ render result as JSON
+ }
+
+}