Date heureDebut
Date heureFin
Sanction sanction
+ Punition punition
Autorite operateurSaisie
Date dateSaisie
AbsenceJournee absenceJournee
heureDebut nullable: true
heureFin nullable: true
sanction nullable: true
+ punition nullable: true
operateurSaisie nullable: true
dateSaisie nullable: true
absenceJournee nullable: true
Personne censeur
String description
Incident incident
+ Boolean absenceLiee
+ Date debutAbsence
+ Date finAbsence
+ Motif motif
Etablissement etablissement
PreferencesEtablissementAbsences preferencesEtablissementAbsences
static constraints = {
description(nullable: true, maxSize: 300)
incident nullable: true
+ debutAbsence nullable: true
+ finAbsence nullable: true
+ motif nullable: true
+ absenceLiee nullable: true
}
static mapping = {
debutAbsence nullable: true
finAbsence nullable: true
motif nullable: true
+ absenceLiee nullable: true
}
static mapping = {
<include file="changelogs/scolarite/2014-09-03-0038178.xml"/>
<include file="changelogs/scolarite/2014-09-04-0038178.xml"/>
<include file="changelogs/securite/2014-09-22-0039131.xml"/>
+ <include file="changelogs/scolarite/2014-09-24-0039248.xml"/>
+
</databaseChangeLog>
return responsables
}
+ protected List getListeHeureDebut(List<PlageHoraire> plageHoraires, SimpleDateFormat sdf) {
+ return plageHoraires.collect {
+ PlageHoraire plage ->
+ [
+ id: plage.id,
+ libelle: sdf.format(plage.debut)
+ ]
+ }
+ }
+
+ protected List getListeHeureFin(List<PlageHoraire> plageHoraires, SimpleDateFormat sdf) {
+ return plageHoraires.collect {
+ PlageHoraire plage ->
+ [
+ id: plage.id,
+ libelle: sdf.format(plage.fin)
+ ]
+ }
+ }
+
}
String censeur
String classe
String type
- String statut
+ def statut
+ Boolean absenceLiee
// rajoutés pour archivage
String description
import org.lilie.services.eliot.constantes.ConstController
import org.lilie.services.eliot.constantes.ConstDate
import org.lilie.services.eliot.absences.AbstractIncidentPunitionSanctionController
+import org.lilie.services.eliot.absences.PlageHoraire
+import org.lilie.services.eliot.parametrages.calendrier.PlageHoraireService
+import org.lilie.services.eliot.absences.Motif
+import org.lilie.services.eliot.securite.impl.Autorite
+import org.lilie.services.eliot.absences.consultation.ConsultationService
/**
* @author ywan
AbsencesPunitionService absencesPunitionService
AbsencesPreparationExportCSVService absencesPreparationExportCSVService
EnumMarshallerService enumMarshallerService
+ PlageHoraireService plageHoraireService
+ ConsultationService consultationService
/**
* Page de consultations des punitions
)
}
- private Map getImpressionInfo(String action, String titreI18N) {
- return [
- action: action,
- controller: 'impressionDiscipline',
- titreDocument: message(code: titreI18N)
- ]
- }
-
- private void addFilterData(Map modele) {
- PreferencesEtablissementAbsences preferences =
- getPreferencesEtablissementCourant()
-
- Calendrier calendrier =
- calendrierService.getCalendrierForEtablissement(preferences.etablissement)
-
- def anneeScolaire = [
- debutAnneeScolaire: formateDate(calendrier.premierJour),
- finAnneeScolaire: formateDate(calendrier.dernierJour)
- ]
-
- modele.anneeScolaire = anneeScolaire as JSON
-
- Date dateDebut
- Date dateFin = new Date()
-
- if (dateFin < calendrier.premierJour) {
- dateFin = calendrier.premierJour
- }
-
- if (dateFin > calendrier.dernierJour) {
- dateFin = calendrier.dernierJour
- }
-
- use(TimeCategory) {
- dateDebut = dateFin - 1.month
- }
-
- if (dateDebut < calendrier.premierJour) {
- dateDebut = calendrier.premierJour
- }
-
- if (dateDebut > calendrier.dernierJour) {
- dateDebut = calendrier.dernierJour
- }
-
- modele.dateDebut = formateDate(dateDebut)
- modele.dateFin = formateDate(dateFin)
-
- modele.etablissementId = etablissementCourantId()
- modele.types = getAllTypesPunition() as JSON
- modele.classes = getAllClassesAccessibles() as JSON
- modele.responsables = marshallAllResponsables() as JSON
-
- }
-
/**
* Affiche la page de création d'une nouvelle punition
* Envoie le necessaire apr le modèle
] as JSON
modele.isModeModification = false
modele.dataTypesPunition = getAllTypesPunition() as JSON
+ modele.dataMotifs = getAllMotifs(true) as JSON
modele.etablissements = getEtablissementsAccessiblesInfo() as JSON
modele.etablissementCourant = preferences.etablissementId
modele.profils = enumMarshallerService.getEnumData(
locale
) as JSON
+ List<PlageHoraire> plages = plageHoraireService.getPlageHoraires(preferences)
+ SimpleDateFormat sdf = new SimpleDateFormat(
+ ConstDate.HEURE_HHMM, Locale.FRANCE)
+
+ modele.listeHeureDebut = plages.collect {
+ PlageHoraire plage ->
+ [
+ id: plage.id,
+ libelle: sdf.format(plage.debut)
+ ]
+ } as JSON
+
+ modele.listeHeureFin = plages.collect {
+ PlageHoraire plage ->
+ [
+ id: plage.id,
+ libelle: sdf.format(plage.fin)
+ ]
+ } as JSON
+
if (params.criteres != null) {
modele.criteres = params.criteres
}
] as JSON
modele.isModeModification = true
modele.dataTypesPunition = getAllTypesPunition() as JSON
+ modele.dataMotifs = getAllMotifs(true) as JSON
modele.etablissements = getEtablissementsAccessiblesInfo() as JSON
modele.etablissementCourant = preferences.etablissementId
modele.profils = enumMarshallerService.getEnumData(ProfilCenseur, locale) as JSON
+ List<PlageHoraire> plages = plageHoraireService.getPlageHoraires(preferences)
+ SimpleDateFormat sdf = new SimpleDateFormat(ConstDate.HEURE_HHMM, Locale.FRANCE)
+
+ modele.listeHeureDebut = getListeHeureDebut(plages, sdf) as JSON
+ modele.listeHeureFin = getListeHeureFin(plages, sdf) as JSON
+
Punition punition = Punition.get(Long.parseLong(params.id))
Map punitionAModifierInfo = [
autoriteCenseurId: punition.censeur.autoriteId,
censeurNom: punition.censeur.nomAffichage(),
description: punition.description ?: '',
- incidentId: isDupliquer == true ? null : (punition.incidentId ?: null)
+ incidentId: isDupliquer == true ? null : (punition.incidentId ?: null),
+ isAbsenceLiee: punition.absenceLiee
]
+
+ if (punition.absenceLiee) {
+ punitionAModifierInfo.absenceInfo = [
+ dateDebut: formateDate(punition.debutAbsence),
+ heureDebut: formateHeure(punition.debutAbsence),
+ dateFin: formateDate(punition.finAbsence),
+ heureFin: formateHeure(punition.finAbsence),
+ motifId: punition.motifId
+ ]
+ }
+
modele.punitionAModifierInfo = punitionAModifierInfo as JSON
modele.activeCRUD = droitsService.hasDroitFonctionnalite(
)
}
- /**
- * @return le message en fonction du mode
- */
- private def getMessageModele(Map params) {
- String result = ""
- Boolean isModeModification = null
- Boolean isAnnuler = null
-
- if (params.isModif) {
- isModeModification = Boolean.parseBoolean(params.isModif)
- }
-
- if (params.isAnnuler) {
- isAnnuler = Boolean.parseBoolean(params.isAnnuler)
- }
-
- if (isModeModification != null) {
- if (isModeModification) {
- if (isAnnuler) {
- result = message(code: 'absences.saisie.punitions.modification.annuler.succes')
- }
- else {
- result = message(code: 'absences.saisie.punitions.modification.succes')
- }
- }
- else {
- if (!isAnnuler) {
- result = message(code: 'absences.saisie.punitions.creation.succes')
- }
- }
- }
- return result
- }
-
- private SimpleDateFormat getSimpleDateFormatJour() {
- SimpleDateFormat sdf = new SimpleDateFormat(
- ConstDate.DATE_JJMMAAA, Locale.FRANCE)
- return sdf
- }
-
def getPunitionsCSV = {
verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN)
}
- /**
- * Récupération des punitions
- * partie commune à l'affichage et à l'export
- */
- private Map recupPunitions(String jsonCriteres,
- String champTri,
- Boolean triAscendant,
- Integer offset,
- Integer limit) {
- Map criteres = parseCriteres(jsonCriteres)
+ def getPunitions = {
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN)
- absencesPunitionService.findPunitions(
- securiteSession,
- securiteSession.personne,
- etablissementCourant(),
- champTri,
- triAscendant,
- offset,
- limit,
- criteres
+ Boolean activeCUD = droitsService.hasDroitFonctionnalite(
+ getSecuriteSession(),
+ AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD
)
- }
-
- def getPunitions = {
- verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN)
int limit = Integer.parseInt(params.limit ?: '0') ?:
(grailsApplication.config.eliot.absences.punition.consultation.nombreLignesParPage ?: 100)
int start = Integer.parseInt(params.start ?: '0')
Map sortInfo = (Map) JSON.parse(params.sortInfo)
- Map resultats = recupPunitions(params.criteres,
+ Map resultats = recupPunitionsEtVerifieAbsencesLiees(params.criteres,
sortInfo.field,
(sortInfo.direction == 'ASC'),
start,
def resultatsJson = [
nbData: resultats.nbPunitionsInfo,
- data: parsePunitionsInfoForConsultation(resultats.punitionsInfo)
+ data: parsePunitionsInfoForConsultation(resultats.punitionsInfo, activeCUD)
]
render resultatsJson as JSON
}
+ def supprimePunition = {
+ // Vérifie les droits d'accès à la page
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
+ Map resultats = [:]
+
+ Punition punition = Punition.get(Long.parseLong(params.id))
+
+ verifieDroitAccesObjetDomaine(punition.eleve)
+
+ if (punition) {
+ try {
+ absencesPunitionService.supprimePunition(punition)
+
+ resultats = [
+ success: true,
+ message: message(code: 'absences.saisie.punitions.message.suppression.succes')
+ ]
+ }
+ catch (PunitionException punitionException) {
+ resultats = [
+ success: false,
+ message: message(code: punitionException.codeMessage)
+ ]
+ }
+ }
+ else {
+ resultats = [
+ success: false,
+ message: message(code: 'absences.saisir.punitions.message.suppression.echec')
+ ]
+ }
+
+ render resultats as JSON
+ }
+
+ /**
+ * Enregistre la punition
+ */
+ @SuppressWarnings('CatchException')
+ def enregistrePunition = {
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
+ Map resultat
+ Punition punition
+ Long punitionId = null
+ try {
+ List<PunitionParams> punitionsParams = parsePunitionsParams(params)
+
+ punitionsParams.each {PunitionParams punitionParams ->
+
+ if (punitionParams.id) {
+ punition = Punition.get(punitionParams.id)
+ punitionId = punition.id
+
+ verifieDroitAccesObjetDomaine(punition.eleve)
+
+ absencesPunitionService.modifiePunition(punition, punitionParams)
+ }
+ else {
+ verifieDroitAccesObjetDomaine(punitionParams.eleve)
+
+ punition = absencesPunitionService.creePunition(punitionParams)
+
+ if (punitionId == null) {
+ punitionId = punition.id
+ }
+ }
+
+ }
+
+ resultat = [
+ success: true,
+ message: message(code: 'absences.saisie.punitions.modification.succes'),
+ id: punitionId
+ ]
+ } catch (PunitionException e) {
+ resultat = [
+ success: false,
+ message: message(code: e.codeMessage)
+ ]
+ } catch (Exception e) {
+ log.error("Une erreur inconnue est survenue lors de l'enregistrement d'une punition.", e)
+ resultat = [
+ success: false,
+ message: message(code: 'absences.saisie.punitions.enregistrement.erreur.inconnue')
+ ]
+ }
+
+ render resultat as JSON
+ }
+
+ def isEleveAbsent = {
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
+ Map absenceInfo = (Map) JSON.parse(params.absenceInfo)
+ Personne eleve = getPersonneForIdAutorite(absenceInfo.autoriteEleveId)
+ Date dateDebut = Date.parse(ConstDate.DATE_JJMMAAA, absenceInfo.dateDebut)
+ Date dateFin = Date.parse(ConstDate.DATE_JJMMAAA, absenceInfo.dateFin)
+ Date heureDebut = Date.parse(ConstDate.HEURE_HHMM, absenceInfo.heureDebut)
+ Date heureFin = Date.parse(ConstDate.HEURE_HHMM, absenceInfo.heureFin)
+ Boolean eleveAbsent = consultationService.isEleveAbsentForPeriode(
+ eleve,
+ dateDebut,
+ heureDebut,
+ dateFin,
+ heureFin
+ )
+
+ Map resultat = [
+ success: true,
+ isEleveAbsent: eleveAbsent
+ ]
+ if (eleveAbsent) {
+ resultat.message = message(code: "absences.saisie.creationModification.modification.absences.presentes")
+ }
+ render resultat as JSON
+ }
+
+ def changeStatutPunition = {
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
+
+ Map resultat
+ try {
+ absencesPunitionService.changeStatutPunition(Long.parseLong(params.punitionId), Boolean.parseBoolean(params.statut))
+ resultat = [
+ success: true,
+ message: message(code: 'absences.saisie.punitions.modification.succes')
+ ]
+ } catch (Exception e){
+ log.error("Une erreur inconnue est survenue lors de la mise à jour de la sanction d'id ${params.punitionId}.", e)
+ resultat = [
+ success: false,
+ message: message(code: 'absences.saisie.punitions.modification.erreur.inconnue')
+ ]
+ }
+
+ render resultat as JSON
+ }
+
private Map parseCriteres(def jsonCriteres) {
Map result = [:]
* Permet de construire les dto pour la vue de consultation des sanctions
*/
private List<PunitionConsultationInfo> parsePunitionsInfoForConsultation(
- List punitionsInfo
+ List punitionsInfo,
+ Boolean activeCUD
) {
List<PunitionConsultationInfo> punitionsConsultationInfo = []
type: punitionInfo[4],
classe: punitionInfo[1],
censeur: punitionInfo[3],
- statut: punitionInfo[0].effectue ? libelleEffectue : libelleNonEffectue
+ statut: punitionInfo[0].effectue ?
+ (activeCUD ? true : libelleEffectue) : (activeCUD ? false : libelleNonEffectue),
+ absenceLiee: punitionInfo[0].absenceLiee
)
)
}
}
- def supprimePunition = {
- // Vérifie les droits d'accès à la page
- verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
- Map resultats = [:]
+ /**
+ * Récupération des punitions
+ * partie commune à l'affichage et à l'export
+ */
+ private Map recupPunitions(String jsonCriteres,
+ String champTri,
+ Boolean triAscendant,
+ Integer offset,
+ Integer limit) {
+ Map criteres = parseCriteres(jsonCriteres)
- Punition punition = Punition.get(Long.parseLong(params.id))
+ absencesPunitionService.findPunitions(
+ securiteSession,
+ securiteSession.personne,
+ etablissementCourant(),
+ champTri,
+ triAscendant,
+ offset,
+ limit,
+ criteres
+ )
+ }
- verifieDroitAccesObjetDomaine(punition.eleve)
+ /**
+ * Récupération des punitions et vérification des absences liées (est-ce qu'elles
+ * terminent la punition?)
+ *
+ */
+ private Map recupPunitionsEtVerifieAbsencesLiees(String jsonCriteres,
+ String champTri,
+ Boolean triAscendant,
+ Integer offset,
+ Integer limit) {
+ Map criteres = parseCriteres(jsonCriteres)
- if (punition) {
- try {
- absencesPunitionService.supprimePunition(punition)
+ Map punitions = absencesPunitionService.findPunitions(
+ securiteSession,
+ securiteSession.personne,
+ etablissementCourant(),
+ champTri,
+ triAscendant,
+ offset,
+ limit,
+ criteres
+ )
- resultats = [
- success: true,
- message: message(code: 'absences.saisie.punitions.message.suppression.succes')
- ]
+ punitions.punitionsInfo.each{
+ Punition punition = it[0]
+ if (!punition.effectue && punition.absenceLiee){
+ absencesPunitionService.verifiePunitionTerminee(punition)
}
- catch (PunitionException punitionException) {
- resultats = [
- success: false,
- message: message(code: punitionException.codeMessage)
- ]
- }
- }
- else {
- resultats = [
- success: false,
- message: message(code: 'absences.saisir.punitions.message.suppression.echec')
- ]
}
- render resultats as JSON
+ return punitions
}
/**
- * Enregistre la punition
+ * @return le message en fonction du mode
*/
- @SuppressWarnings('CatchException')
- def enregistrePunition = {
- verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
- Map resultat
- Punition punition
- Long punitionId = null
- try {
- List<PunitionParams> punitionsParams = parsePunitionsParams(params)
-
- punitionsParams.each {PunitionParams punitionParams ->
+ private def getMessageModele(Map params) {
+ String result = ""
+ Boolean isModeModification = null
+ Boolean isAnnuler = null
- if (punitionParams.id) {
- punition = Punition.get(punitionParams.id)
- punitionId = punition.id
+ if (params.isModif) {
+ isModeModification = Boolean.parseBoolean(params.isModif)
+ }
- verifieDroitAccesObjetDomaine(punition.eleve)
+ if (params.isAnnuler) {
+ isAnnuler = Boolean.parseBoolean(params.isAnnuler)
+ }
- absencesPunitionService.modifiePunition(punition, punitionParams)
+ if (isModeModification != null) {
+ if (isModeModification) {
+ if (isAnnuler) {
+ result = message(code: 'absences.saisie.punitions.modification.annuler.succes')
}
else {
- verifieDroitAccesObjetDomaine(punitionParams.eleve)
+ result = message(code: 'absences.saisie.punitions.modification.succes')
+ }
+ }
+ else {
+ if (!isAnnuler) {
+ result = message(code: 'absences.saisie.punitions.creation.succes')
+ }
+ }
+ }
+ return result
+ }
- punition = absencesPunitionService.creePunition(punitionParams)
+ private SimpleDateFormat getSimpleDateFormatJour() {
+ SimpleDateFormat sdf = new SimpleDateFormat(
+ ConstDate.DATE_JJMMAAA, Locale.FRANCE)
+ return sdf
+ }
- if (punitionId == null) {
- punitionId = punition.id
- }
- }
+ private Map getImpressionInfo(String action, String titreI18N) {
+ return [
+ action: action,
+ controller: 'impressionDiscipline',
+ titreDocument: message(code: titreI18N)
+ ]
+ }
- }
+ private void addFilterData(Map modele) {
+ PreferencesEtablissementAbsences preferences =
+ getPreferencesEtablissementCourant()
- resultat = [
- success: true,
- message: message(code: 'absences.saisie.punitions.modification.succes'),
- id: punitionId
- ]
- } catch (PunitionException e) {
- resultat = [
- success: false,
- message: message(code: e.codeMessage)
- ]
- } catch (Exception e) {
- log.error("Une erreur inconnue est survenue lors de l'enregistrement d'une punition.", e)
- resultat = [
- success: false,
- message: message(code: 'absences.saisie.punitions.enregistrement.erreur.inconnue')
- ]
+ Calendrier calendrier =
+ calendrierService.getCalendrierForEtablissement(preferences.etablissement)
+
+ def anneeScolaire = [
+ debutAnneeScolaire: formateDate(calendrier.premierJour),
+ finAnneeScolaire: formateDate(calendrier.dernierJour)
+ ]
+
+ modele.anneeScolaire = anneeScolaire as JSON
+
+ Date dateDebut
+ Date dateFin = new Date()
+
+ if (dateFin < calendrier.premierJour) {
+ dateFin = calendrier.premierJour
}
- render resultat as JSON
+ if (dateFin > calendrier.dernierJour) {
+ dateFin = calendrier.dernierJour
+ }
+
+ use(TimeCategory) {
+ dateDebut = dateFin - 1.month
+ }
+
+ if (dateDebut < calendrier.premierJour) {
+ dateDebut = calendrier.premierJour
+ }
+
+ if (dateDebut > calendrier.dernierJour) {
+ dateDebut = calendrier.dernierJour
+ }
+
+ modele.dateDebut = formateDate(dateDebut)
+ modele.dateFin = formateDate(dateFin)
+
+ modele.etablissementId = etablissementCourantId()
+ modele.types = getAllTypesPunition() as JSON
+ modele.classes = getAllClassesAccessibles() as JSON
+ modele.responsables = marshallAllResponsables() as JSON
+
}
protected List<PunitionParams> parsePunitionsParams(Map params) {
getPersonneForIdAutorite(it)
}
+ if (punitionParams.isAbsenceLiee) {
+ punitionParams.motif = Motif.get(mapParams.motifId)
+ punitionParams.debutAbsence = parseDateComplete(
+ mapParams.dateDebut.toString() +
+ ',' +
+ mapParams.heureDebut.toString()
+ )
+ punitionParams.finAbsence = parseDateComplete(
+ mapParams.dateFin +
+ ',' +
+ mapParams.heureFin
+ )
+ }
+
eleves.each { Personne eleve ->
Long id = null
censeur: punitionParams.censeur,
description: punitionParams.description,
incident: punitionParams.incident,
+ isAbsenceLiee: punitionParams.isAbsenceLiee,
+ motif: punitionParams.motif,
+ debutAbsence: punitionParams.debutAbsence,
+ finAbsence: punitionParams.finAbsence,
etablissement: punitionParams.etablissement,
+ operateurSaisie: punitionParams.operateurSaisie,
preferences: punitionParams.preferences,
))
}
PreferencesEtablissementAbsences preferences =
getPreferencesEtablissementCourant()
- return new PunitionParams(
+ PunitionParams punitionParams = new PunitionParams(
id: mapParams.id,
date: sdf.parse(mapParams.date),
type: TypePunition.get(mapParams.typePunitionId),
censeur: censeur,
description: mapParams.description,
incident: mapParams.incidentId ? Incident.get(mapParams.incidentId) : null,
+ isAbsenceLiee: mapParams.isAbsenceLiee,
etablissement: etablissementCourant(),
+ operateurSaisie: (Autorite) getSecuriteSession().defaultAutorite,
preferences: preferences
)
+
+ if (punitionParams.isAbsenceLiee) {
+ punitionParams.motif = Motif.get(mapParams.motifId)
+ punitionParams.debutAbsence = parseDateComplete(
+ mapParams.dateDebut.toString() +
+ ',' +
+ mapParams.heureDebut.toString()
+ )
+ punitionParams.finAbsence = parseDateComplete(
+ mapParams.dateFin +
+ ',' +
+ mapParams.heureFin
+ )
+ }
+
+ return punitionParams
}
/**
)
}
- private Map getImpressionInfo(String action, String titreI18N) {
- return [
- action: action,
- controller: 'impressionDiscipline',
- titreDocument: message(code: titreI18N)
- ]
- }
-
- private void addFilterData(Map modele) {
- PreferencesEtablissementAbsences preferences =
- getPreferencesEtablissementCourant()
-
- Calendrier calendrier =
- calendrierService.getCalendrierForEtablissement(preferences.etablissement)
-
- def anneeScolaire = [
- debutAnneeScolaire: formateDate(calendrier.premierJour),
- finAnneeScolaire: formateDate(calendrier.dernierJour)
- ]
-
- modele.anneeScolaire = anneeScolaire as JSON
-
- Date dateDebut
- Date dateFin = new Date()
-
- if (dateFin < calendrier.premierJour) {
- dateFin = calendrier.premierJour
- }
-
- if (dateFin > calendrier.dernierJour) {
- dateFin = calendrier.dernierJour
- }
-
- use(TimeCategory) {
- dateDebut = dateFin - 1.month
- }
-
- if (dateDebut < calendrier.premierJour) {
- dateDebut = calendrier.premierJour
- }
-
- if (dateDebut > calendrier.dernierJour) {
- dateDebut = calendrier.dernierJour
- }
-
- modele.dateDebut = formateDate(dateDebut)
- modele.dateFin = formateDate(dateFin)
-
- modele.etablissementId = etablissementCourantId()
- modele.types = getAllTypesSanction() as JSON
- modele.classes = getAllClassesAccessibles() as JSON
- modele.responsables = marshallAllResponsables() as JSON
-
- }
-
def getSanctionsCSV = {
verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN)
}
- /**
- * Récupération des sanctions
- * partie commune à l'affichage et à l'export
- */
- private Map recupSanctions(String jsonCriteres,
- String champTri,
- Boolean triAscendant,
- Integer offset,
- Integer limit) {
- Map criteres = parseCriteres(jsonCriteres)
-
- absencesSanctionService.findAllSanctionParPersonne(
- securiteSession,
- etablissementCourant(),
- securiteSession.personne,
- champTri,
- triAscendant,
- offset,
- limit,
- criteres
- )
- }
-
def getSanctions = {
verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN)
+ Boolean activeCUD = droitsService.hasDroitFonctionnalite(
+ getSecuriteSession(),
+ AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD
+ )
+
int limit = Integer.parseInt(params.limit ?: '0') ?:
(grailsApplication.config.eliot.absences.sanction.consultation.nombreLignesParPage ?: 100)
int start = Integer.parseInt(params.start ?: '0')
Map sortInfo = (Map) JSON.parse(params.sortInfo)
- Map resultats = recupSanctions(params.criteres,
+ Map resultats = recupSanctionsEtVerifieAbsencesLiees(params.criteres,
sortInfo.field,
(sortInfo.direction == 'ASC'),
start,
def resultatsJson = [
nbData: resultats.nbSanctionsInfo,
- data: parseSanctionsInfoForConsultation(resultats.sanctionsInfo)
+ data: parseSanctionsInfoForConsultation(resultats.sanctionsInfo, activeCUD)
]
render resultatsJson as JSON
}
- private Map parseCriteres(def jsonCriteres) {
-
- Map result = [:]
- if (jsonCriteres != null) {
- Map criteres = (Map) JSON.parse(jsonCriteres)
-
- if (criteres.dateDebut != null) {
- result.dateDebut = parseDate(criteres.dateDebut)
- }
-
- if (criteres.dateFin != null) {
- result.dateFin = parseDate(criteres.dateFin)
- }
-
- if (criteres.classes != null) {
- result.classes = StructureEnseignement.getAll(criteres.classes)
- }
-
- if (criteres.eleves != null) {
- result.eleves = Personne.getAll(criteres.eleves)
- }
-
- if (criteres.responsables != null) {
- result.responsables = Personne.getAll(criteres.responsables)
- }
-
- if (criteres.types != null) {
- result.typesSanction = TypeSanction.getAll(criteres.types)
- }
-
- if ((criteres.statuts) && (criteres.statuts.size() == 1)) {
- result.effectue = criteres.statuts[0] == "1"
- }
-
- }
-
- return result
- }
-
/**
* Affiche la page de création d'une nouvelle sanction
* Envoie le necessaire dans le modèle
)
}
- /**
- * Retourne les infos de la sanction
- * @param sanctionId : id de la sanction dont on cherche les infos
- * @return une Map
- */
- private Map getSanctionAModifierInfo(long sanctionId) {
-
- Boolean isDupliquer = Boolean.parseBoolean(params.isDupliquer)
-
- Sanction sanction = Sanction.get(sanctionId)
- Map sanctionAModifierInfo = (Map) [
- id: isDupliquer == true ? null : sanction.id,
- date: formateDate(sanction.date),
- typeSanctionId: sanction.typeSanctionId,
- isSanctionEffectuee: sanction.effectue,
- eleveNom: isDupliquer == true ? '' : sanction.eleve.nomAffichage(),
- autoriteEleveId: isDupliquer == true ? null : sanction.eleve.autoriteId,
- censeurNom: sanction.censeur.nomAffichage(),
- autoriteCenseurId: sanction.censeur.autoriteId,
- description: sanction.description,
- incidentId: isDupliquer == true ? null : (sanction.incidentId ?: null),
- isAbsenceLiee: sanction.absenceLiee
- ]
-
- if (sanction.absenceLiee) {
- sanctionAModifierInfo.absenceInfo = [
- dateDebut: formateDate(sanction.debutAbsence),
- heureDebut: formateHeure(sanction.debutAbsence),
- dateFin: formateDate(sanction.finAbsence),
- heureFin: formateHeure(sanction.finAbsence),
- motifId: sanction.motifId
- ]
- }
- return sanctionAModifierInfo
- }
-
- private List getListeHeureDebut(List<PlageHoraire> plageHoraires, SimpleDateFormat sdf) {
- return plageHoraires.collect {
- PlageHoraire plage ->
- [
- id: plage.id,
- libelle: sdf.format(plage.debut)
- ]
- }
- }
-
- private List getListeHeureFin(List<PlageHoraire> plageHoraires, SimpleDateFormat sdf) {
- return plageHoraires.collect {
- PlageHoraire plage ->
- [
- id: plage.id,
- libelle: sdf.format(plage.fin)
- ]
- }
- }
-
- /**
- * Construit le message en fonction du mode
- */
- private String getMessageModele(Map params) {
- Boolean isModeModification = null
- Boolean isAnnuler = null
- String result = ''
- if (params.isModif) {
- isModeModification = Boolean.parseBoolean(params.isModif)
- }
-
- if (params.isAnnuler) {
- isAnnuler = Boolean.parseBoolean(params.isAnnuler)
- }
-
- if (isModeModification != null) {
- if (isModeModification) {
- if (isAnnuler) {
- result = message(code: 'absences.saisie.sanctions.modification.annuler.succes')
- }
- else {
- result = message(code: 'absences.saisie.sanctions.modification.succes')
- }
- }
- else {
- if (!isAnnuler) {
- result = message(code: 'absences.saisie.sanctions.creation.succes')
- }
- }
- }
- return result
- }
-
def isEleveAbsent = {
verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
Map absenceInfo = (Map) JSON.parse(params.absenceInfo)
isEleveAbsent: eleveAbsent
]
if (eleveAbsent) {
- resultat.message = message(code: "absences.saisie.sanctions.creationModification.modification.absences.presentes")
+ resultat.message = message(code: "absences.saisie.creationModification.modification.absences.presentes")
}
render resultat as JSON
}
}
+ def changeStatutSanction = {
+ verifieDroitFonctionnalite(AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN_CUD)
+
+ Map resultat
+ try {
+ absencesSanctionService.changeStatutSanction(Long.parseLong(params.sanctionId), Boolean.parseBoolean(params.statut))
+ resultat = [
+ success: true,
+ message: message(code: 'absences.saisie.sanctions.modification.succes')
+ ]
+ } catch (Exception e){
+ log.error("Une erreur inconnue est survenue lors de la mise à jour de la sanction d'id ${params.sanctionId}.", e)
+ resultat = [
+ success: false,
+ message: message(code: 'absences.saisie.sanctions.modification.erreur.inconnue')
+ ]
+ }
+
+ render resultat as JSON
+ }
+
+ private Map getImpressionInfo(String action, String titreI18N) {
+ return [
+ action: action,
+ controller: 'impressionDiscipline',
+ titreDocument: message(code: titreI18N)
+ ]
+ }
+
+ private void addFilterData(Map modele) {
+ PreferencesEtablissementAbsences preferences =
+ getPreferencesEtablissementCourant()
+
+ Calendrier calendrier =
+ calendrierService.getCalendrierForEtablissement(preferences.etablissement)
+
+ def anneeScolaire = [
+ debutAnneeScolaire: formateDate(calendrier.premierJour),
+ finAnneeScolaire: formateDate(calendrier.dernierJour)
+ ]
+
+ modele.anneeScolaire = anneeScolaire as JSON
+
+ Date dateDebut
+ Date dateFin = new Date()
+
+ if (dateFin < calendrier.premierJour) {
+ dateFin = calendrier.premierJour
+ }
+
+ if (dateFin > calendrier.dernierJour) {
+ dateFin = calendrier.dernierJour
+ }
+
+ use(TimeCategory) {
+ dateDebut = dateFin - 1.month
+ }
+
+ if (dateDebut < calendrier.premierJour) {
+ dateDebut = calendrier.premierJour
+ }
+
+ if (dateDebut > calendrier.dernierJour) {
+ dateDebut = calendrier.dernierJour
+ }
+
+ modele.dateDebut = formateDate(dateDebut)
+ modele.dateFin = formateDate(dateFin)
+
+ modele.etablissementId = etablissementCourantId()
+ modele.types = getAllTypesSanction() as JSON
+ modele.classes = getAllClassesAccessibles() as JSON
+ modele.responsables = marshallAllResponsables() as JSON
+
+ }
+
+ /**
+ * Récupération des sanctions
+ * partie commune à l'affichage et à l'export
+ */
+ private Map recupSanctions(String jsonCriteres,
+ String champTri,
+ Boolean triAscendant,
+ Integer offset,
+ Integer limit) {
+ Map criteres = parseCriteres(jsonCriteres)
+
+ absencesSanctionService.findAllSanctionParPersonne(
+ securiteSession,
+ etablissementCourant(),
+ securiteSession.personne,
+ champTri,
+ triAscendant,
+ offset,
+ limit,
+ criteres
+ )
+ }
+
+ /**
+ * Récupération des sanctions et vérification des absences liées (est-ce qu'elles
+ * terminent la sanction?)
+ *
+ */
+ private Map recupSanctionsEtVerifieAbsencesLiees(String jsonCriteres,
+ String champTri,
+ Boolean triAscendant,
+ Integer offset,
+ Integer limit) {
+ Map criteres = parseCriteres(jsonCriteres)
+
+ Map sanctions = absencesSanctionService.findAllSanctionParPersonne(
+ securiteSession,
+ etablissementCourant(),
+ securiteSession.personne,
+ champTri,
+ triAscendant,
+ offset,
+ limit,
+ criteres
+ )
+
+ sanctions.sanctionsInfo.each{
+ Sanction sanction = it[0]
+ if (!sanction.effectue && sanction.absenceLiee){
+ absencesSanctionService.verifieSanctionTerminee(sanction)
+ }
+ }
+
+ return sanctions
+ }
+
+ private Map parseCriteres(def jsonCriteres) {
+
+ Map result = [:]
+ if (jsonCriteres != null) {
+ Map criteres = (Map) JSON.parse(jsonCriteres)
+
+ if (criteres.dateDebut != null) {
+ result.dateDebut = parseDate(criteres.dateDebut)
+ }
+
+ if (criteres.dateFin != null) {
+ result.dateFin = parseDate(criteres.dateFin)
+ }
+
+ if (criteres.classes != null) {
+ result.classes = StructureEnseignement.getAll(criteres.classes)
+ }
+
+ if (criteres.eleves != null) {
+ result.eleves = Personne.getAll(criteres.eleves)
+ }
+
+ if (criteres.responsables != null) {
+ result.responsables = Personne.getAll(criteres.responsables)
+ }
+
+ if (criteres.types != null) {
+ result.typesSanction = TypeSanction.getAll(criteres.types)
+ }
+
+ if ((criteres.statuts) && (criteres.statuts.size() == 1)) {
+ result.effectue = criteres.statuts[0] == "1"
+ }
+
+ }
+
+ return result
+ }
+
+ /**
+ * Retourne les infos de la sanction
+ * @param sanctionId : id de la sanction dont on cherche les infos
+ * @return une Map
+ */
+ private Map getSanctionAModifierInfo(long sanctionId) {
+
+ Boolean isDupliquer = Boolean.parseBoolean(params.isDupliquer)
+
+ Sanction sanction = Sanction.get(sanctionId)
+ Map sanctionAModifierInfo = (Map) [
+ id: isDupliquer == true ? null : sanction.id,
+ date: formateDate(sanction.date),
+ typeSanctionId: sanction.typeSanctionId,
+ isSanctionEffectuee: sanction.effectue,
+ eleveNom: isDupliquer == true ? '' : sanction.eleve.nomAffichage(),
+ autoriteEleveId: isDupliquer == true ? null : sanction.eleve.autoriteId,
+ censeurNom: sanction.censeur.nomAffichage(),
+ autoriteCenseurId: sanction.censeur.autoriteId,
+ description: sanction.description,
+ incidentId: isDupliquer == true ? null : (sanction.incidentId ?: null),
+ isAbsenceLiee: sanction.absenceLiee
+ ]
+
+ if (sanction.absenceLiee) {
+ sanctionAModifierInfo.absenceInfo = [
+ dateDebut: formateDate(sanction.debutAbsence),
+ heureDebut: formateHeure(sanction.debutAbsence),
+ dateFin: formateDate(sanction.finAbsence),
+ heureFin: formateHeure(sanction.finAbsence),
+ motifId: sanction.motifId
+ ]
+ }
+ return sanctionAModifierInfo
+ }
+
+ /**
+ * Construit le message en fonction du mode
+ */
+ private String getMessageModele(Map params) {
+ Boolean isModeModification = null
+ Boolean isAnnuler = null
+ String result = ''
+ if (params.isModif) {
+ isModeModification = Boolean.parseBoolean(params.isModif)
+ }
+
+ if (params.isAnnuler) {
+ isAnnuler = Boolean.parseBoolean(params.isAnnuler)
+ }
+
+ if (isModeModification != null) {
+ if (isModeModification) {
+ if (isAnnuler) {
+ result = message(code: 'absences.saisie.sanctions.modification.annuler.succes')
+ }
+ else {
+ result = message(code: 'absences.saisie.sanctions.modification.succes')
+ }
+ }
+ else {
+ if (!isAnnuler) {
+ result = message(code: 'absences.saisie.sanctions.creation.succes')
+ }
+ }
+ }
+ return result
+ }
+
protected List<SanctionParams> parseSanctionsParams(Map params) {
List<SanctionParams> sanctionsParams = []
* Permet de construire les dto pour la vue de consultation des sanctions
*/
private List<SanctionConsultationInfo> parseSanctionsInfoForConsultation(
- List sanctionsInfo
+ List sanctionsInfo,
+ Boolean activeCUD
) {
List<SanctionConsultationInfo> sanctionsConsultationInfo = []
type: sanctionInfo[4],
classe: sanctionInfo[1],
censeur: sanctionInfo[3],
- statut: sanctionInfo[0].effectue ? libelleEffectue : libelleNonEffectue,
+ statut: sanctionInfo[0].effectue ?
+ (activeCUD ? true : libelleEffectue) : (activeCUD ? false : libelleNonEffectue),
absenceLiee: sanctionInfo[0].absenceLiee
)
)
String nomAffichage
String classe
String censeur
- String statut
+ def statut
String type
Boolean absenceLiee
absences.saisie.libelle.actionSuivantes=Actions suivantes
+absences.saisie.creerModifier.titre.changementPeriodeAbsence= Changement d'une période d'absence
+absences.saisie.creerModifier.titre.changementEleveSanctionne= Changement d'un élève sanctionné
+absences.saisie.creerModifier.titre.changementAbsenceLiee= Changement d'un paramètre
+absences.saisie.creerModifier.message.confirmationChangementParams= Confirmez-vous le changement de ce paramètre?\
+</br>Attention : les absences correspondantes seront supprimées lors de l'enregistrement.
+absences.saisie.creationModification.modification.absences.presentes=Des absences, retards ou départs anticipés ont été saisis dans la période indiquée. Confirmez-vous la modification de ces informations ?
+absences.saisie.creerModifier.message.confirmationChangementPeriode= Des absences, retards ou départ anticipés ont étaient saisie dans la période indiquée.\
+</br>Confirmez-vous la modification de ces informations?
+
# Consultation et saisie des punitions
+absences.punitions.consultation.message.suppression.confirmationSuppressionPunitionReferencee=Des absences ont été saisies dans le cadre de cette sanction.\
+ </br> Les absences liées seront supprimées.\
+ </br> Confirmez-vous la suppression de la sanction et des absences associées?
+
absences.saisie.punitions.enregistrement.erreur.inconnue=Une erreur inconnue s'est produite lors de l'enregistrement de la punition.
absences.saisie.punitions.creationModification.erreur.descriptionLongue=La description de la punition est trop longue. La description est limitée à 300 caractères.
absences.saisie.punitions.creation.erreur.champsObligatoires=La création de la punition a échoué. Vous devez saisir tous les champs obligatoires de la punition.
absences.saisie.punitions.modification.erreur.champsObligatoires=La modification de la punition a échoué. Vous devez saisir tous les champs obligatoires de la punition.
absences.saisie.punitions.creerModifier.libelle.punitionEffectuee = Punition effectuée
absences.saisie.punitions.creerModifier.libelle.elevePuni = Elève puni
+absences.saisie.punitions.creermodifier.libelle.absenceLiePunition = Absence liée à la punition
absences.saisie.punitions.creerModifier.titre.changementElevePuni = Changement d'un élève puni
absences.saisie.punitions.creerModifier.libelle.incidentOriginePunition =Incident à l'origine de la punition
absences.saisie.punitions.message.suppression.confirmation=Confirmez-vous la suppression de la punition en date du
absences.saisie.punitions.message.suppression.erreur.typeIncidentInexistant=La suppression du type d'incident a échoué. Il n'existe pas ou il vient d'être supprimé par un autre utilisateur.
absences.saisie.punitions.message.suppression.succes=La punition a été supprimée avec succès.
absences.saisir.punitions.message.suppression.echec=La suppression de la punition a échoué. La punition n'existe plus.
+absences.saisie.punitions.creationModification.creation.descriptionLongue=La création de la punition a échoué. La description de la punition est trop longue. La description est limitée à 300 caractères.
+absences.saisie.punitions.creationModification.modification.descriptionLongue=La modification de la punition a échoué. La description de la punition est trop longue. La description est limitée à 300 caractères.
absences.saisie.punitions.creerModifier.message.confirmationChangementElevePuni= Comfirmez-vous le choix d'un nouvel élève?\
</br> Attention : l'incident précédemment sélectionné ne sera plus associé à cette punition.
absences.saisie.punitions.creerModifier.message.champObligatoireErreur= Vous devez saisir tous les champs obligatoires.
absences.saisie.punitions.creation.annuler.succes=La création a été annulée.
absences.saisie.punitions.modification.succes=La punition a été modifiée avec succès.
absences.saisie.punitions.modification.annuler.succes=La modification a été annulée.
+absences.saisie.punitions.modification.erreur.inconnue=Une erreur inconnue s'est produite lors de la modification de la punition.
absences.saisie.message.parametragesManquants=Le calendrier hebdomadaire et le calendrier annuel n'ont pas été initialisés, vous ne pouvez pas saisir d'absences.\
</br>Veuillez lancer l'application scolarite (option Paramétrages) afin d'initialiser et paramétrer les calendriers de l'établissement.
absences.saisie.message.impossible=Saisie impossible
absences.saisie.punition.libelle.dupliquerEleve=Dupliquer la punition pour un élève
absences.saisie.punition.libelle.creerNouvellePunition=Créer une nouvelle punition
absences.saisie.punition.libelle.revenirListePunitions=Revenir à la liste des punitions
+absences.saisie.punition.creerModifier.message.confirmationChangementElevePuni= Confirmez-vous vouloir choisir un nouvel élève?\
+</br>Attention : les absences et incidents qui auraient pu être associées à cette punition seront supprimés.
#------------------------- Les sanctions - début- ----------------------------#
absences.saisie.sanctions.creermodifier.libelle.eleveSanctionne = Elève sanctionné
absences.saisie.sanctions.creermodifier.libelle.absenceLieSanction = Absence liée à la sanction
absences.saisie.sanctions.creerModifier.libelle.incidentOrigineSanction = Incident à l'origine de la sanction
-absences.saisie.sanctions.creermodifier.libelle.motifCombo =Motif
-absences.saisie.sanctions.creerModifier.titre.changementPeriodeAbsence= Changement d'une période d'absence
-absences.saisie.sanctions.creerModifier.titre.changementEleveSanctionne= Changement d'un élève sanctionné
-absences.saisie.sanctions.creerModifier.titre.changementAbsenceLiee= Changement d'un paramètre
-absences.saisie.sanctions.creerModifier.message.confirmationChangementPeriode= Des absences, retards ou départ anticipés ont étaient saisie dans la période indiquée.\
-</br>Confirmez-vous la modification de ces informations?
absences.saisie.sanctions.creerModifier.message.confirmationChangementEleveSanctionne= Confirmez-vous vouloir choisir un nouvel élève?\
</br>Attention : les absences et incidents qui auraient pu être associées à cette sanction seront supprimés.
absences.saisie.sanctions.creerModifier.message.champObligatoireErreur= Vous devez saisir tous les champs obligatoires.
-absences.saisie.sanctions.creerModifier.message.confirmationChangementParams= Confirmez-vous le changement de ce paramètre?\
-</br>Attention : les absences correspondantes seront supprimées lors de l'enregistrement.
absences.saisie.sanctions.creerModifier.message.dateHeureIndentique= Les dates et heures sont incorrectes, elles ne peuvent pas être identiques.
absences.saisie.sanctions.creerModifier.message.dateHeurePasLogique= Les dates et heures sont incorrectes, la date et l'heure de fin doivent être strictement supérieures à la date et l'heure de début.
absences.saisie.sanctions.creation.annuler.succes = La création a été annulée.
absences.saisie.sanctions.creation.succes=La sanction a été créée avec succès.
absences.saisie.sanctions.modification.succes=La sanction a été modifiée avec succès.
absences.saisie.sanctions.modification.annuler.succes=La modification a été annulée.
+absences.saisie.sanctions.modification.erreur.inconnue=Une erreur inconnue s'est produite lors de la modification de la sanction.
absences.saisie.sanctions.enregistrement.erreur.inconnue=Une erreur inconnue s'est produite lors de l'enregistrement de la sanction.
absences.saisie.sanctions.creationModification.creation.descriptionLongue=La création de la sanction a échoué. La description de la sanction est trop longue. La description est limitée à 300 caractères.
absences.saisie.sanctions.creationModification.modification.descriptionLongue=La modification de la sanction a échoué. La description de la sanction est trop longue. La description est limitée à 300 caractères.
absences.saisie.sanctions.creationModification.modification.champsObligatoires=La modification de la sanction a échoué. Vous devez saisir tous les champs obligatoires de la sanction.
absences.saisie.sanctions.creationModification.suppression.sanctionReferencee=La suppression de la sanction a échoué. La sanction est référencée par un autre enregistrement.
absences.saisie.sanctions.creationModification.modification.inexistant=La modification de la sanction a échoué. Elle n'existe pas.
-absences.saisie.sanctions.creationModification.modification.absences.presentes=Des absences, retards ou départs anticipés ont été saisis dans la période indiquée. Confirmez-vous la modification de ces informations ?
absences.saisie.sanctions.message.actionsSuivantes=La sanction a été enregistrée. Souhaitez-vous
absences.saisie.sanctions.libelle.dupliquerEleve=Dupliquer la sanction pour un élève
absences.libelle.enregistrer=Enregistrer
absences.libelle.debut=Début
absences.libelle.fin=Fin
+absences.libelle.motifCombo =Motif
absences.libelle.eleves=Elèves
absences.libelle.adresse=Adresse
absences.libelle.cpVille=Cp - Ville
import org.lilie.services.eliot.scolarite.Personne
import org.lilie.services.eliot.absences.Motif
import org.lilie.services.eliot.absences.Sanction
-import org.lilie.services.eliot.securite.Autorite
+import org.lilie.services.eliot.absences.Punition
+import org.lilie.services.eliot.securite.impl.Autorite
import org.lilie.services.eliot.absences.PlageHoraire
import org.lilie.services.eliot.absences.AppelLigne
import org.lilie.services.eliot.absences.Appel
Date debut
Date fin
Sanction sanction
+ Punition punition
Autorite operateurSaisie
Date dateSaisie
//Champs utilisés pour les retards et départs anticipés
import org.lilie.services.eliot.absences.AppelLigne
import org.lilie.services.eliot.securite.impl.Autorite
import org.lilie.services.eliot.absences.Sanction
+import org.lilie.services.eliot.absences.Punition
import org.lilie.services.eliot.scolarite.Etablissement
import org.lilie.services.eliot.temps.DateUtil
import org.lilie.services.eliot.absences.saisie.absencejournee.exceptions.SuppressionAbsenceContrainteException
ligne.appelLigne.autorite = ligne.personne.autorite
ligne.appelLigne.heureDebut = ligne.debut ? ligne.debut : ligne.plageHoraire.debut
ligne.appelLigne.heureFin = ligne.fin ? ligne.fin : ligne.plageHoraire.fin
- ligne.appelLigne.sanction = ligne.sanction
ligne.appelLigne.operateurSaisie = (Autorite) ligne.operateurSaisie
ligne.appelLigne.dateSaisie = ligne.dateSaisie
ligne.appelLigne.matiere = ligne.matiere
}
}
+/**
+ * Crée la ou les absences associées à une punition
+ * @return une liste d'appelLigne
+ */
+ void creeAbsencesForPunition(Autorite operateurSaisie,
+ Punition punition
+ ) throws AbsenceJourneeException {
+
+ if (punition.absenceLiee) {
+ if (!(punition.debutAbsence && punition.finAbsence)) {
+ throw new AbsenceJourneeDatesObligatoiresException()
+ }
+ if (!punition.motif) {
+ throw new AbsenceJourneeMotifObligatoireException()
+ }
+ Date jourDebut = AbsencesDateUtil.getDay(punition.debutAbsence)
+ Date jourFin = AbsencesDateUtil.getDay(punition.finAbsence)
+
+ Calendar cal = Calendar.getInstance()
+ for (Date jour = jourDebut; (jour <= jourFin); jour++) {
+ cal.clear()
+ cal.setTime(jour)
+ DateUtil.setDebutJour(cal)
+ Date debutJournee = cal.getTime()
+ DateUtil.setFinJour(cal)
+ Date finJournee = cal.getTime()
+
+ PreferencesEtablissementAbsences preferences =
+ preferencesEtablissementAbsencesService.getPreferencesEtablissementForEtablissement(punition.etablissement)
+
+ AbsenceJournee absenceJournee = findOrCreateAbsenceJournee(
+ punition.etablissement,
+ jour,
+ preferences
+ )
+ internalCreeLignesAbsenceJournee(
+ absenceJournee,
+ [new AbsenceJourneeLigneParams(
+ personne: punition.eleve,
+ motif: punition.motif,
+ debut: (punition.debutAbsence > debutJournee) ?
+ punition.debutAbsence : debutJournee,
+ fin: (punition.finAbsence < finJournee) ?
+ punition.finAbsence : finJournee,
+ punition: punition,
+ operateurSaisie: operateurSaisie,
+ dateSaisie: new Date(),
+ absenceJustifiee: true,
+ absencePrevisionnelle: true,
+ presence: false
+ )],
+ null
+ )
+ }
+ } else {
+ internalSupprimeAbsencesForPunition(punition)
+ }
+ }
+
/**
* Met à jour la ou les absences associées à la sanction
* @return la liste des appelLigne associée à la sanction
}
}
+/**
+ * Met à jour la ou les absences associées à la punition
+ * @return la liste des appelLigne associée à la punition
+ */
+ protected void internalModifieAbsencesForPunition(Autorite operateurSaisie,
+ Punition punition
+ ) {
+ //on récupère les appelLigne associés
+ List<AppelLigne> appelLignes = AppelLigne.findAllByPunition(punition)
+ if (appelLignes.size() > 0 && !punition.absenceLiee) {
+ internalSupprimeAbsencesForPunition(punition)
+ } else {
+ if (punition.absenceLiee) {
+ internalModifieAppelLignesForPunition(
+ appelLignes,
+ punition,
+ operateurSaisie,
+ new Date()
+ )
+ }
+ }
+ }
+
/**
* Supprime les absences associées à une sanction
*/
throws SuppressionAbsenceContrainteException {
try {
AppelLigne.executeUpdate(
- 'delete AppelLigne where sanction = :sanction',
+ 'delete AppelLigne where sanction = :sanction and absencePrevisionnelle = true',
[sanction: sanction]
)
+ AppelLigne.executeUpdate(
+ '''update AppelLigne
+ set sanction = null
+ where sanction = :sanction and absencePrevisionnelle = false''',
+ [sanction: sanction]
+ )
+ } catch (DataIntegrityViolationException e) {
+ throw new SuppressionAbsenceContrainteException()
+ }
+ }
+
+/**
+ * Supprime les absences associées à une punition
+ */
+ public void internalSupprimeAbsencesForPunition(Punition punition)
+ throws SuppressionAbsenceContrainteException {
+ try {
+ AppelLigne.executeUpdate(
+ 'delete AppelLigne where punition = :punition and absencePrevisionnelle = true',
+ [punition: punition]
+ )
+ AppelLigne.executeUpdate(
+ '''update AppelLigne
+ set punition = null
+ where punition = :punition and absencePrevisionnelle = false''',
+ [punition: punition]
+ )
} catch (DataIntegrityViolationException e) {
throw new SuppressionAbsenceContrainteException()
}
internalSupprimeAppelLignes(appelLignesASupprimer)
}
+/**
+ * Modifie les absences liées à une sanction lorsque les dates de l'absence
+ * ont été modifiées sur la punition.
+ * Cette méthode ne vérifie pas les droits
+ */
+ private void internalModifieAppelLignesForPunition(List<AppelLigne> appelLignes,
+ Punition punition,
+ Autorite operateurSaisie,
+ Date dateSaisie
+ ) {
+ List<AppelLigne> appelLignesASupprimer = []
+ appelLignes.each {
+ Date dateDebutLigne = calculeDateDebutLigne(it)
+ Date dateFinLigne = calculeDateFinLigne(it)
+
+ //On teste si la ligne est à supprimer
+ if ((dateFinLigne < punition.debutAbsence) ||
+ (dateDebutLigne > punition.finAbsence)) {
+ appelLignesASupprimer.add(it)
+ return
+ }
+ }
+
+ //on récupère une map associant le jour (AbsenceJournee) à l'appelLigne
+ Map absenceJournee = construitMapJourneeAbsences(
+ punition,
+ operateurSaisie,
+ dateSaisie
+ )
+
+ //Pour chaque jour, on modifie l'appelLigne
+ absenceJournee.each {
+ AbsenceJournee jour, AppelLigne appelLigne ->
+ if (isPremierJour(jour, punition)) {
+ appelLigne.heureDebut = punition.debutAbsence
+ } else {
+ appelLigne.heureDebut = calculeHeureDebutDeJournee(jour)
+ }
+
+ if (isDernierJour(jour, punition)) {
+ appelLigne.heureFin = punition.finAbsence
+ } else {
+ appelLigne.heureFin = calculeHeureFinDeJournee(jour)
+ }
+ appelLigne.motif = punition.motif
+ appelLigne.autorite = punition.eleve.autorite
+
+ // enregistre les modifs
+ enregistreAppelLigne(appelLigne, false)
+ }
+ //on fait la suppression en lot des lignes en trop
+ internalSupprimeAppelLignes(appelLignesASupprimer)
+ }
+
/**
* Retourne les absences prévues pour une structure et un jour donné
* @return un AbsenceInfo
return DateUtil.isJoursIdentiques(absenceJournee.date, sanction.debutAbsence)
}
+/**
+ * Indique si l'AbsenceJournee correspond au dernier jour de l'absence
+ * associée à la punition
+ * @return un Boolean
+ */
+ private boolean isDernierJour(AbsenceJournee absenceJournee, Punition punition) {
+ return DateUtil.isJoursIdentiques(absenceJournee.date, punition.finAbsence)
+ }
+
+/**
+ * Indique si l'AbsenceJournee correspond au premier jour de l'absence
+ * associée à la punition
+ * @return un Boolean
+ */
+ private boolean isPremierJour(AbsenceJournee absenceJournee, Punition punition) {
+ return DateUtil.isJoursIdentiques(absenceJournee.date, punition.debutAbsence)
+ }
+
/**
* Construit et retourne une Map associant pour chaque AbsenceJournee,
* l'appelLigne associée à la sanction.
return result
}
+/**
+ * Construit et retourne une Map associant pour chaque AbsenceJournee,
+ * l'appelLigne associée à la punition.
+ * Si ces éléments n'existent pas, ils sont créés.
+ * Les heures des AppelLignes ne sont pas initialisées et par consequent les
+ * AppelLignes ne sont pas enregistres car on ne peut pas avoir un AppelLigne
+ * sans Appel ou Heure de debut/fin dans la bdd.
+ * @return une Map[AbsenceJournee -> AppelLigne]
+ */
+ private Map construitMapJourneeAbsences(Punition punition,
+ Autorite operateurSaisie,
+ Date dateSaisie) {
+ Map result = (Map) [:]
+ Calendar curseur = Calendar.getInstance()
+ curseur.setTime(punition.debutAbsence)
+ DateUtil.setDebutJour(curseur)
+ while (curseur.getTime() < punition.finAbsence) {
+ AbsenceJournee absenceJournee = findOrCreateAbsenceJournee(
+ punition.etablissement,
+ curseur.getTime(),
+ preferencesEtablissementAbsencesService.
+ getPreferencesEtablissementForEtablissement(punition.etablissement)
+ )
+
+ AppelLigne appelLigne = AppelLigne.findByAbsenceJourneeAndPunition(
+ absenceJournee,
+ punition
+ )
+ if (!appelLigne) {
+ appelLigne = new AppelLigne(
+ presence: false,
+ absenceJustifiee: true,
+ absencePrevisionnelle: true,
+ motif: punition.motif,
+ autorite: punition.eleve.autorite,
+ heureDebut: null,
+ heureFin: null,
+ punition: punition,
+ operateurSaisie: operateurSaisie,
+ dateSaisie: dateSaisie,
+ absenceJournee: absenceJournee
+ )
+ }
+ result.put(absenceJournee, appelLigne)
+ curseur.add(Calendar.DAY_OF_YEAR, 1)
+ }
+ return result
+ }
+
/**
* Supprime les appelLignes.
* Cette méthode ne vérifie pas les droits
private AppelLigne getAppelLigneFromAbsenceJourneeLigneInfo(
AbsenceJourneeLigneParams ligne,
Map mapEleveAutorite = [:]) {
+
+ verifieCoherenceAppelLigne(ligne)
+
AppelLigne appelLigne = new AppelLigne(
presence: ligne.presence,
retard: ligne.retard,
heureDebut: ligne.debut,
heureFin: ligne.fin,
sanction: ligne.sanction,
+ punition: ligne.punition,
operateurSaisie: (Autorite) ligne.operateurSaisie,
dateSaisie: ligne.dateSaisie,
matiere: ligne.matiere,
return appelLigne
}
+ private verifieCoherenceAppelLigne(AbsenceJourneeLigneParams ligne) {
+ if (ligne.sanction && ligne.punition) {
+ throw new IllegalStateException("""Une absence ne peut pas être liée à la
+ fois à une sanction et à une punition""")
+ }
+ }
+
/**
* Crée l'enregistrement AbsenceJournee.
* Cette méthode :
* Transforme les absences sur journée en absences sur appel
* Quand appel sur plusieurs plages, si la dernière absence est une absence prévisionnelle,
* il faut supprimer toutes les autres absences journée des plages de l'appel (sauf les
- * absences sur sanction)
+ * absences sur sanction ou punition)
*/
void executeAttacheAbsencesToAppelEtGereMultiPlages(Map absencesTriees,
Appel appel,
// absence prévisionnelle, on l'étend sur toutes les plages mais on ne la
// lie pas à l'appel
if (appelLigneAModifier.absencePrevisionnelle == true ||
- appelLigneAModifier.sanction != null){
+ appelLigneAModifier.sanction != null ||
+ appelLigneAModifier.punition != null){
appelLigneAModifier.heureDebut = premierePlageAppel.debut
appelLigneAModifier.heureFin = dernierePlageAppel.fin
} else {
// On lie le dernier appel ligne contenu dans les plages de l'appel
- // à l'appel sauf si c'est une absence sur sanction ou liée à un autre appel
+ // à l'appel sauf si c'est une absence sur sanction ou punition ou liée à un autre appel
// qui se situe sur plus de plages horaires que l'appel en cours
appelLigneAModifier.heureDebut = null
appelLigneAModifier.heureFin = null
appelLigneAModifier = enregistreAppelLigne(appelLigneAModifier, false)
}
- // On supprime les autres appelLigne sauf celles sur sanction
- List idsAppelLignes = lignes.findAll{it.sanction == null}*.id
+ // On supprime les autres appelLigne sauf celles sur sanction ou punition
+ List idsAppelLignes = lignes.findAll{it.sanction == null && it.punition == null}*.id
if (idsAppelLignes.size() > 0){
idsAppelLignes.remove(idsAppelLignes.size() - 1)
}
/* Concerne les profils enseignants.
* Quand appel sur plusieurs plages, si la dernière absence est une absence prévisionnelle,
* il faut supprimer toutes les autres absences journée des plages de l'appel (sauf les
- * absences sur sanction)
+ * absences sur sanction ou punition)
* */
void executeGereMultiPlages(Map absencesJourneeTriees,
Appel appel,
// si le dernier appel ligne contenu dans les plages de l'appel est une
// absence prévisionnelle, on l'étend sur toutes les plages mais on ne la
// lie pas à l'appel, et on supprime toutes les autres appelLignes sauf celles
- // sur sanction
+ // sur sanction ou punition
if (appelLigneAModifier.absencePrevisionnelle == true ||
- appelLigneAModifier.sanction != null){
+ appelLigneAModifier.sanction != null ||
+ appelLigneAModifier.punition != null){
appelLigneAModifier.heureDebut = premierePlageAppel.debut
appelLigneAModifier.heureFin = dernierePlageAppel.fin
- // on supprime les autres appelLignes sauf la dernière et sauf les sanctions
+ // on supprime les autres appelLignes sauf la dernière et sauf les sanctions et punitions
lignes.remove(lignes.size() - 1)
lignes.removeAll{it.sanction != null}
+ lignes.removeAll{it.punition != null}
List idsAppelLignesASupprimer = lignes*.id
appelLigneService.supprimeAppelLignes(idsAppelLignesASupprimer, operateurSaisie)
}
import org.lilie.services.eliot.absences.saisie.absencejournee.AbsenceJourneeService
import org.lilie.services.eliot.absences.PlageHoraire
import org.hibernate.Hibernate
+import org.lilie.services.eliot.absences.Punition
+import org.lilie.services.eliot.absences.Sanction
/**
* @author jbui
(appelLigneInfo.id) && (!appelLigneInfo.aSupprimer)
}
- // liste les appelLigne liés aux sanctions
- List<AppelLigne> allAppelLigneSanction = []
+ // liste les appelLigne liés aux sanctions ou punitions
+ List<AppelLigne> allAppelLigneSanctionPunition = []
if (allModifieLigneAppel.size() > 0) {
- allAppelLigneSanction = (List<AppelLigne>) AppelLigne.withCriteria {
+ allAppelLigneSanctionPunition = (List<AppelLigne>) AppelLigne.withCriteria {
'in'('id', allModifieLigneAppel*.id)
- isNotNull('sanction')
+ or{isNotNull('sanction')
+ isNotNull('punition')}
}
}
- // liste les appelLigneInfo des appelLigne liés aux sanctions
- List<AppelLigneInfo> allAppelLigneInfoSanction = []
- allAppelLigneSanction.each {AppelLigne appelLigne ->
- allAppelLigneInfoSanction.add(allModifieLigneAppel.find {it.id == appelLigne.id})
+ // liste les appelLigneInfo des appelLigne liés aux sanctions ou punitions
+ List<AppelLigneInfo> allAppelLigneInfoSanctionPunition = []
+ allAppelLigneSanctionPunition.each {AppelLigne appelLigne ->
+ allAppelLigneInfoSanctionPunition.add(allModifieLigneAppel.find {it.id == appelLigne.id})
}
List<AppelLigneInfo> allCreationLigneAppel = appelLigneInfos.findAll {AppelLigneInfo appelLigneInfo ->
(!appelLigneInfo.getaSupprimer()) && (!appelLigneInfo.id)
}
- // ajoute les appelLigneInfo des sanctions comme une demande de création
- // On conserve les appelLigne lié à la sanction, on crée de nouvel
- // appelLigne pour toute absence de sanction constatée
- allCreationLigneAppel.addAll(allAppelLigneInfoSanction)
+ // ajoute les appelLigneInfo des sanctions ou punitions comme une demande de création
+ // On conserve les appelLigne lié à la sanction ou punition, on crée de nouvelles
+ // appelLigne pour toute absence de sanction ou punition constatée
+ allCreationLigneAppel.addAll(allAppelLigneInfoSanctionPunition)
// On les enlève des demandes de modification
- allModifieLigneAppel.removeAll(allAppelLigneInfoSanction)
+ allModifieLigneAppel.removeAll(allAppelLigneInfoSanctionPunition)
// une absence sera lié à l'appel seulement si l'élève fait partie de la structure
// de l'appel. Sinon, l'absence sera lié à une absence journée. Voir doc
return statutEleveAppelInfo
}
+ /*
+ Détermine si la dernière plage horaire de l'absence liée à la punition ou sanction a été constatée
+ Si oui, cela signifie que la punition ou sanction est terminée
+ */
+ public Boolean isAbsenceTerminePunitionOuSanction(Punition punition,
+ Sanction sanction){
+ Boolean isAbsenceTerminePunitionOusanction = false
+
+ List<AppelLigne> absencesLiees = []
+ if (punition){
+ absencesLiees = AppelLigne.findAllByPunition(punition)
+ } else if (sanction){
+ absencesLiees = AppelLigne.findAllBySanction(sanction)
+ }
+ AppelLigne derniereAbsenceLiee = absencesLiees.max{it.absenceJournee.date}
+
+ Date dateHeureFinDerniereAbsenceLiee = derniereAbsenceLiee.absenceJournee.date
+ dateHeureFinDerniereAbsenceLiee.setHours(derniereAbsenceLiee.heureFin.getHours())
+ dateHeureFinDerniereAbsenceLiee.setMinutes(derniereAbsenceLiee.heureFin.getMinutes())
+ dateHeureFinDerniereAbsenceLiee.setSeconds(derniereAbsenceLiee.heureFin.getSeconds())
+
+ List<AppelLigne> absencesConstatee = AppelLigne.createCriteria().list{
+ eq('autorite', derniereAbsenceLiee.autorite)
+ eq('retard', false)
+ eq('departAnticipe', false)
+ eq('absencePrevisionnelle', false)
+ isNull('sanction')
+ isNull('punition')
+ }
+ absencesConstatee.each{ AppelLigne appelLigne ->
+ if (appelLigne.appel){
+ Date dateAppel = appelLigne.appel.dateHeureDebut
+ if(dateAppel.getYear() == derniereAbsenceLiee.absenceJournee.date.getYear() &&
+ dateAppel.getMonth() == derniereAbsenceLiee.absenceJournee.date.getMonth() &&
+ dateAppel.getDate() == derniereAbsenceLiee.absenceJournee.date.getDate() &&
+ appelLigne.appel.dateHeureDebut < dateHeureFinDerniereAbsenceLiee &&
+ appelLigne.appel.dateHeureFin >= dateHeureFinDerniereAbsenceLiee){
+ isAbsenceTerminePunitionOusanction = true
+ // stopper la boucle
+ return true
+ }
+ } else {
+ if (appelLigne.absenceJournee.date == derniereAbsenceLiee.absenceJournee.date &&
+ appelLigne.heureDebut < derniereAbsenceLiee.heureFin &&
+ appelLigne.heureFin >= derniereAbsenceLiee.heureFin){
+ isAbsenceTerminePunitionOusanction = true
+ // stopper la boucle
+ return true
+ }
+ }
+ }
+ return isAbsenceTerminePunitionOusanction
+ }
+
}
plage.debut AS heure_debut,
plage.fin AS heure_fin,
cast(null AS bigint) AS sanction_id,
+ cast(null AS bigint) AS punition_id,
:operateurId AS operateur_saisie_id,
now() AS date_saisie,
aj.id AS absence_journee_id,
commentaire_arrivee = aln.commentaire_arrivee,
commentaire_depart = aln.commentaire_depart,
sanction_id = aln.sanction_id,
+ punition_id = aln.punition_id,
operateur_saisie_id = aln.operateur_saisie_id,
date_saisie = aln.date_saisie,
demi_pension = aln.demi_pension,
import org.lilie.services.eliot.applications.absences.PunitionService
import org.lilie.services.eliot.scolarite.structureenseignement.LocalStructureEnseignementService
+import org.lilie.services.eliot.absences.saisie.absencejournee.AbsenceJourneeService
+import org.lilie.services.eliot.absences.AppelLigne
+import org.lilie.services.eliot.absences.saisie.appelligne.AppelLigneService
+
/**
* @author bahj
* @author jbui
ScolariteService scolariteService
SessionFactory sessionFactory
LocalStructureEnseignementService localStructureEnseignementService
+ AbsenceJourneeService absenceJourneeService
+ AppelLigneService appelLigneService
static transactional = true
*/
Punition creePunition(PunitionParams punitionParams) throws PunitionException {
- Punition result = new Punition(
- date: punitionParams.date,
- typePunition: punitionParams.type,
- effectue: punitionParams.isPunitionEffectuee,
- eleve: punitionParams.eleve,
- censeur: punitionParams.censeur,
- description: punitionParams.description,
- incident: punitionParams.incident,
- etablissement: punitionParams.etablissement,
- preferencesEtablissementAbsences: punitionParams.preferences
+ Punition punition = new Punition()
+ initialisePunition(punition, punitionParams)
+
+ internalSave(punition)
+ internalSupprimeAbsencesExistantes(punition)
+ // TOREFACT : appel méthode protected à partir d'une classe externe
+ absenceJourneeService.creeAbsencesForPunition(
+ punitionParams.operateurSaisie,
+ punition
)
- internalSave(result)
- return result
+
+ return punition
}
/**
Punition modifiePunition(Punition punitionAModifier,
PunitionParams punitionParams) throws PunitionException {
+ initialisePunition(punitionAModifier, punitionParams)
+
+ internalSave(punitionAModifier)
+
+ internalSupprimeAbsencesExistantes(punitionAModifier)
+
+ // TOREFACT : appel méthode protected à partir d'une classe externe
+ absenceJourneeService.internalModifieAbsencesForPunition(
+ punitionParams.operateurSaisie,
+ punitionAModifier
+ )
+
+ return punitionAModifier
+ }
+
+ private initialisePunition(Punition punitionAModifier,
+ PunitionParams punitionParams) {
punitionAModifier.date = punitionParams.date
punitionAModifier.typePunition = punitionParams.type
punitionAModifier.effectue = punitionParams.isPunitionEffectuee
punitionAModifier.description = punitionParams.description
punitionAModifier.incident = punitionParams.incident
punitionAModifier.etablissement = punitionParams.etablissement
- punitionAModifier.preferencesEtablissementAbsences = punitionParams.preferences
- internalSave(punitionAModifier)
- return punitionAModifier
+ punitionAModifier.preferencesEtablissementAbsences = punitionParams
+ .preferences
+ punitionAModifier.absenceLiee = punitionParams.isAbsenceLiee
+ punitionAModifier.debutAbsence = punitionParams.debutAbsence
+ punitionAModifier.finAbsence = punitionParams.finAbsence
+ punitionAModifier.motif = punitionParams.motif
+ }
+
+ /**
+ * Supprime les absences existantes pour la période et l'élève de la punition
+ * afin de pouvoir créer une absence associée à la punition
+ */
+ void internalSupprimeAbsencesExistantes(Punition punition) {
+ if (punition.debutAbsence && punition.finAbsence) {
+ def critAppel = AppelLigne.createCriteria()
+ List<AppelLigne> lstAppelLigneAppel = critAppel.list {
+ eq('autorite', punition.eleve.autorite)
+ 'appel' {
+ lt('dateHeureDebut', punition.finAbsence)
+ gt('dateHeureFin', punition.debutAbsence)
+ }
+ }
+
+ List<AppelLigne> lstAppelLigneAbsenceJournee = []
+ // Attention, l'absence peut s'étaler sur plusieurs jours
+ Range<Date> dateRange = punition.debutAbsence..punition.finAbsence
+ dateRange.eachWithIndex {
+ Date dateAbsence, int index ->
+ lstAppelLigneAbsenceJournee += AppelLigne.withCriteria {
+ eq('autorite', punition.eleve.autorite)
+ if (index == 0) { //premier jour
+ ge('heureDebut', punition.debutAbsence)
+ }
+ if (index == dateRange.size()-1) { //dernier jour
+ le('heureFin', punition.finAbsence)
+ }
+ 'absenceJournee' {
+ eq('date', dateAbsence)
+ }
+ }
+ }
+
+ List<Long> appelLigneIds = []
+
+ appelLigneIds.addAll(lstAppelLigneAppel*.id)
+ appelLigneIds.addAll(lstAppelLigneAbsenceJournee*.id)
+
+ if (appelLigneIds.size() > 0) {
+ AppelLigne.executeUpdate(
+ 'delete from AppelLigne where id in (:ids)',
+ [ids: appelLigneIds]
+ )
+ }
+ }
}
/**
*/
void supprimePunition(Punition punition) throws PunitionException {
+ absenceJourneeService.internalSupprimeAbsencesForPunition(punition)
+
Closure onDataIntegrityViolation = { DataIntegrityViolationException e ->
throw new SuppressionPunitionContrainteException(punition, e)
}
/**
* Retourne une liste de punitions selon les critères
*/
- Map findPunitions(SecuriteSession securiteSession,
+ Map findPunitions(SecuriteSession securiteSession,
Personne personne,
Etablissement etablissement,
String champOrdre,
}
}
-
-
Session session = sessionFactory.getCurrentSession()
SQLQuery sqlQuery = session.createSQLQuery(getSqlPunition(
return champ
}
+ public void verifiePunitionTerminee(Punition punition){
+ if(appelLigneService.isAbsenceTerminePunitionOuSanction(punition, null)){
+ punition.effectue = true
+ punition.save(failOnError: true)
+ }
+ }
+
+ public void changeStatutPunition(Long punitionId, Boolean effectuee){
+ Punition punition = Punition.findById(punitionId)
+ punition.effectue = effectuee
+ punition.save(failOnError:true)
+ }
+
}
import org.lilie.services.eliot.scolarite.Etablissement
import org.lilie.services.eliot.scolarite.Personne
import org.lilie.services.eliot.absences.PreferencesEtablissementAbsences
+import org.lilie.services.eliot.absences.Motif
+import org.lilie.services.eliot.securite.impl.Autorite
/**
* Dto utilisé pour la création des punitions
Personne censeur
String description
Incident incident
+ Boolean isAbsenceLiee = false
+ Date debutAbsence = null
+ Date finAbsence = null
+ Motif motif = null
Etablissement etablissement
+ Autorite operateurSaisie
PreferencesEtablissementAbsences preferences
}
package org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions
+import org.lilie.services.eliot.absences.Punition
+
/**
* Exception levée lorsque la description d'une punition est trop longue
* @author jbui
*/
class PunitionDescriptionLongueException extends PunitionException {
- PunitionDescriptionLongueException() {
- super("La description de la punition est trop longue.".toString())
- codeMessage = 'absences.saisie.punitions.creationModification.erreur.descriptionLongue'
+
+ PunitionDescriptionLongueException(Punition punition) {
+ super('')
+ super.punition = punition
+ }
+
+
+ public String getMessage() {
+ String message = ''
+ if (punition.id) {
+ message = "La description de la punition est trop longue."
+ codeMessage = 'absences.saisie.punitions.creationModification.modification.descriptionLongue'
+ }
+ else {
+ message = "La description de la punition est trop longue."
+ codeMessage = 'absences.saisie.punitions.creationModification.creation.descriptionLongue'
+ }
+
+ return message
}
}
package org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions
+import org.lilie.services.eliot.absences.Punition
+
/**
* Classe ancêtre des exceptions liées aux punitions
* @author jbui
*/
class PunitionException extends RuntimeException {
String codeMessage
+ Punition punition
PunitionException(String message) {
super(message ?: "Exception inconnue lors de l'enregistrement de la punition")
codeMessage = 'absences.saisie.punitions.enregistrement.erreur.inconnue'
+ punition = null
}
}
import org.lilie.services.eliot.absences.Incident
import org.lilie.services.eliot.applications.absences.SanctionService
import org.lilie.services.eliot.scolarite.personne.eleve.EleveAnnuaireService
+import org.lilie.services.eliot.absences.saisie.appelligne.AppelLigneService
/**
* Classe de gestion des sanctions
DroitsService droitsService
AbsenceJourneeService absenceJourneeService
EleveRecupService eleveRecupService
- EleveAnnuaireService eleveAnnuaireService
ScolariteService scolariteService
SessionFactory sessionFactory
+ AppelLigneService appelLigneService
private static final String SQL_SANCTION_TOUS = """
with pps_dernier_debut as (
}
}
+ public void verifieSanctionTerminee(Sanction sanction){
+ if(appelLigneService.isAbsenceTerminePunitionOuSanction(null, sanction)){
+ sanction.effectue = true
+ sanction.save(failOnError: true)
+ }
+ }
+
+ public void changeStatutSanction(Long sanctionId, Boolean effectuee) {
+ Sanction sanction = Sanction.findById(sanctionId)
+ sanction.effectue = effectuee
+ sanction.save(failOnError:true)
+ }
+
}
* <http://www.cecill.info/licences.fr.html>.
*/
-
-
-
-
-
-
package org.lilie.services.eliot.absences.saisie.discipline.sanction
import org.lilie.services.eliot.scolarite.Etablissement
* - date et heure de début de l'appel
*/
private List findAppelsDatasForClassesAndPeriode(List<StructureEnseignement> structures,
- Date dateDebut,
- Date dateFin) {
+ Date dateDebut,
+ Date dateFin) {
return Appel.executeQuery(SaisieHebdomadaireServiceHql.HQL_GET_APPEL_DATAS, [
structures: structures,
dateFin: dateFin,
/**
* Extrait de la liste des absences journée de l'élève, celle qui correspond
- * au jour et à l'heure passées en paramètres, et liée à une sanction
+ * au jour et à l'heure passées en paramètres, et liée à une sanction ou punition
* @param appelLignesJournee : les lignes d'absences journées de l'élève
* @param jour : le jour recherché
* @param plageHoraire : la plage horaire recherchée
it.absenceJournee.date == jour &&
it.heureDebut < plageHoraire.fin &&
it.heureFin > plageHoraire.debut &&
- it.sanction != null
+ (it.sanction != null ||
+ it.punition != null)
}.toList()
if (liste.size() > 0) {
/**
* Extrait de la liste des absences journée de l'élève, celle qui correspond
- * au jour et à l'heure passées en paramètres, et non liée à une sanction
+ * au jour et à l'heure passées en paramètres, et non liée à une sanction ou punition
* @param appelLignesJournee : les lignes d'absences journées de l'élève
* @param jour : le jour recherché
* @param plageHoraire : la plage horaire recherchée
it.absenceJournee.date == jour &&
it.heureDebut < plageHoraire.fin &&
it.heureFin > plageHoraire.debut &&
- it.sanction == null
+ it.sanction == null &&
+ it.punition == null
}.toList()
if (liste.size() > 0) {
<eliotjs:varLink name="afficheCreation" action="afficheCreation" controller="saisiePunition"/>
<eliotjs:varLink name="afficheModification" action="afficheModification" controller="saisiePunition"/>
<eliotjs:varLink name="exportePunitions" action="getPunitionsCSV" controller="saisiePunition"/>
+ <eliotjs:varLink name="changeStatutPunition" action="changeStatutPunition" controller="saisiePunition"/>
</eliotjs:ns>
<eliotjs:ns name="data">
<eliotjs:varI18n name="enregistrementMaskText" code="absence.suppression.maskText"/>
<eliotjs:varI18n name="suppressionConfirmation" code="absences.saisie.punitions.message.suppression.confirmation"/>
<eliotjs:varI18n name="suppressionTitre" code="absences.saisie.punitions.message.suppression.titre"/>
+ <eliotjs:varI18n name="attention" code="absences.titre.attention"/>
+ <eliotjs:varI18n name="confirmationSuppressionPunitionReferencee"
+ code="absences.punitions.consultation.message.suppression.confirmationSuppressionPunitionReferencee"/>
</eliotjs:ns>
</eliotjs:ns>
src="${url(uri: 'js/commons/src/exportdonnees/BoutonExportController.js')}">
</script>
+ <g:javascript library="src/views/commons/Ext.ux.CheckColumn"/>
%{--Constantes javaScript--}%
<g:javascript library="src/views/saisie/punition/consultation/Constantes"/>
<g:javascript library="src/views/saisie/punition/consultation/Modele"/>
<g:render template="/saisie/punition/creermodifier/modele"/>
<g:javascript library="src/views/saisie/punition/creermodifier/ToolbarController"/>
+<g:javascript library="src/views/saisie/punition/creermodifier/FieldSetAbsenceLieeView"/>
<g:javascript library="src/views/saisie/punition/creermodifier/configCenterRegion"/>
<g:javascript library="src/views/saisie/punition/creermodifier/Application"/>
<eliotjs:ns name="eliot.absences.saisie.punition.creermodifier.Modele">
<eliotjs:ns name="data">
+ <eliotjs:varJson name="listeHeureDebut"
+ value="${listeHeureDebut ?: 'undefined'}"/>
+ <eliotjs:varJson name="listeHeureFin"
+ value="${listeHeureFin ?: 'undefined'}"/>
<eliotjs:varString name="anneeScolaire" value="${anneeScolaire}"
encode="false"/>
<eliotjs:varBoolean name="isModeModification"
<eliotjs:varJson name="punitionAModifierInfo"
value="${punitionAModifierInfo ?: 'undefined'}"/>
<eliotjs:varJson name="dataTypesPunition" value="${dataTypesPunition}"/>
+ <eliotjs:varJson name="dataMotifs" value="${dataMotifs}"/>
<eliotjs:varString name="messageSuccess" value="${message ?: ''}"/>
<g:if test="${activeCRUD != null}">
controller="saisiePunition"/>
<eliotjs:varLink name="urlEnregistrerSaisiePunition"
action="enregistrePunition" controller="saisiePunition"/>
+ <eliotjs:varLink name="urlVerifierAbsenceEleve" action="isEleveAbsent"
+ controller="saisiePunition"/>
</eliotjs:ns>
<eliotjs:ns name="libelle">
code="absences.saisie.punitions.creerModifier.libelle.punitionEffectuee"/>
<eliotjs:varI18n name="elevePuni"
code="absences.saisie.punitions.creerModifier.libelle.elevePuni"/>
+ <eliotjs:varI18n name="absenceLiePunition"
+ code="absences.saisie.punitions.creermodifier.libelle.absenceLiePunition"/>
+ <eliotjs:varI18n name="libelleDateDebut" code="absences.libelle.debut"/>
+ <eliotjs:varI18n name="libelleDateFin" code="absences.libelle.fin"/>
+ <eliotjs:varI18n name="motifCombo" code="absences.libelle.motifCombo"/>
<eliotjs:varI18n name="censeur" code="absences.libelle.censeur"/>
<eliotjs:varI18n name="libelleDescription"
code="absences.libelle.description"/>
<eliotjs:ns name="titre">
<eliotjs:varI18n name="changementElevePuni"
code="absences.saisie.punitions.creerModifier.titre.changementElevePuni"/>
+ <eliotjs:varI18n name="changementPeriodeAbsence"
+ code="absences.saisie.creerModifier.titre.changementPeriodeAbsence"/>
+ <eliotjs:varI18n name="changementAbsenceLiee"
+ code="absences.saisie.creerModifier.titre.changementAbsenceLiee"/>
</eliotjs:ns>
<eliotjs:ns name="message">
<eliotjs:varI18n name="actionsSuivantes"
code="absences.saisie.punition.message.actionsSuivantes"/>
+ <eliotjs:varI18n name="confirmationChangementPeriode"
+ code="absences.saisie.creerModifier.message.confirmationChangementPeriode"/>
+ <eliotjs:varI18n name="confirmationChangementEleveSanctionne"
+ code="absences.saisie.punition.creerModifier.message.confirmationChangementElevePuni"/>
+ <eliotjs:varI18n name="confirmationChangementParams"
+ code="absences.saisie.creerModifier.message.confirmationChangementParams"/>
</eliotjs:ns>
<eliotjs:varLink name="afficheCreation" action="afficheCreation" controller="saisieSanction"/>
<eliotjs:varLink name="afficheModification" action="afficheModification" controller="saisieSanction"/>
<eliotjs:varLink name="isSanctionUtilisee" action="afficheModification" controller="isSanctionUtilisee"/>
- <eliotjs:varLink name="exporteSanctions" action="getSanctionsCSV" controller="saisieSanction"/>
+ <eliotjs:varLink name="exporteSanctions" action="getSanctionsCSV" controller="saisieSanction"/>
+ <eliotjs:varLink name="changeStatutSanction" action="changeStatutSanction" controller="saisieSanction"/>
</eliotjs:ns>
<eliotjs:ns name="data">
<g:javascript library="src/views/saisie/sanction/consultation/Constantes"/>
<g:javascript library="src/views/saisie/sanction/consultation/Modele"/>
+ <g:javascript library="src/views/commons/Ext.ux.CheckColumn"/>
+
%{-- Fichiers à charger avant le modèle--}%
<g:javascript library="src/views/commons/CUDToolbarView"/>
<g:javascript library="src/views/commons/GridConsultationView"/>
code="absences.saisie.sanctions.creermodifier.libelle.absenceLieSanction"/>
<eliotjs:varI18n name="libelleDateDebut" code="absences.libelle.debut"/>
<eliotjs:varI18n name="libelleDateFin" code="absences.libelle.fin"/>
- <eliotjs:varI18n name="motifCombo"
- code="absences.saisie.sanctions.creermodifier.libelle.motifCombo"/>
+ <eliotjs:varI18n name="motifCombo" code="absences.libelle.motifCombo"/>
<eliotjs:varI18n name="censeur" code="absences.libelle.censeur"/>
<eliotjs:varI18n name="libelleDescription"
code="absences.libelle.description"/>
<eliotjs:ns name="message">
<eliotjs:varI18n name="confirmationChangementPeriode"
- code="absences.saisie.sanctions.creerModifier.message.confirmationChangementPeriode"/>
+ code="absences.saisie.creerModifier.message.confirmationChangementPeriode"/>
<eliotjs:varI18n name="confirmationChangementEleveSanctionne"
code="absences.saisie.sanctions.creerModifier.message.confirmationChangementEleveSanctionne"/>
<eliotjs:varI18n name="confirmationChangementParams"
- code="absences.saisie.sanctions.creerModifier.message.confirmationChangementParams"/>
+ code="absences.saisie.creerModifier.message.confirmationChangementParams"/>
<eliotjs:varI18n name="dateHeureIndentique"
code="absences.saisie.sanctions.creerModifier.message.dateHeureIndentique"/>
<eliotjs:varI18n name="dateHeurePasLogique"
<eliotjs:ns name="titre">
<eliotjs:varI18n name="changementPeriodeAbsence"
- code="absences.saisie.sanctions.creerModifier.titre.changementPeriodeAbsence"/>
+ code="absences.saisie.creerModifier.titre.changementPeriodeAbsence"/>
<eliotjs:varI18n name="changementEleveSanctionne"
- code="absences.saisie.sanctions.creerModifier.titre.changementEleveSanctionne"/>
+ code="absences.saisie.creerModifier.titre.changementEleveSanctionne"/>
<eliotjs:varI18n name="changementAbsenceLiee"
- code="absences.saisie.sanctions.creerModifier.titre.changementAbsenceLiee"/>
+ code="absences.saisie.creerModifier.titre.changementAbsenceLiee"/>
</eliotjs:ns>
<eliotjs:ns name="header">
columns:config.columns
}),
+ plugins:config.plugins ? [config.plugins] : [],
+
//ToolBar
tbar:config.toolBar,
store:punitionController.store,
toolBar:cudToolbarView.cudToolbar,
columns:punitionController.getColonnesGrilleConsultationPunitions(),
+ plugins:punitionController.checkColumn,
nombreLignesParPage:this.NameSpace.Modele.data.nombreLignesParPage
});
afficheCreation : undefined,
afficheModification : undefined,
supprimePunition : undefined,
- exportePunitions : undefined
+ exportePunitions : undefined,
+ changeStatutPunition : undefined
},
data : {
erreurInconnue : undefined,
enregistrementMaskText : undefined,
suppressionConfirmation : undefined,
- suppressionTitre : undefined
+ suppressionTitre : undefined,
+ attention : undefined,
+ confirmationSuppressionPunitionReferencee : undefined
}
};
\ No newline at end of file
},
{
name:this.Modele.dataIndex.statut
+ },
+ {
+ name:'absenceLiee'
}
],
root:'data',
}
},
scope:this
+ },
+ update:{
+ fn:function (store, record) {
+ var id = record.get('id');
+ var statut = record.get('statut');
+ this.executeModifieStatutPunition(id, statut);
+ },
+ scope:this
}
})
},
actionModifierPunition:function () {
this.getPageModification()
},
-
/**
- * Action de suppression de la punition sélectionné
+ * Action de suppression de la punition sélectionnée
*/
actionSupprimerPunition:function () {
var recordSelectionne = this.store.getById(this.idPunitionSelectionne);
eliot.absences.Message.afficherDialogConfirmation(
this.Modele.message.suppressionTitre,
message,
- this.executeSupprimerPunition.createDelegate(this),
+ this.actionSupprimePunitionConfirmee.createDelegate(this),
this.annuleSuppressionPunition.createDelegate(this)
)
},
+ actionSupprimePunitionConfirmee:function () {
+ var record = this.store.getById(this.idPunitionSelectionne);
+ if (record.get('absenceLiee')) {
+ eliot.absences.Message.afficherDialogConfirmation(
+ this.Modele.message.attention,
+ this.Modele.message.confirmationSuppressionPunitionReferencee,
+ this.executeSupprimerPunition.createDelegate(this),
+ this.annuleSuppressionPunition.createDelegate(this)
+ )
+ }
+ else {
+ this.executeSupprimerPunition();
+ }
+ },
+//
+// /**
+// * Action de suppression de la punition sélectionnée
+// */
+// actionSupprimerPunition:function () {
+// var recordSelectionne = this.store.getById(this.idPunitionSelectionne);
+// var date = recordSelectionne.json.date;
+// var message = this.Modele.message.suppressionConfirmation + ' ' + date + ' ?';
+// eliot.absences.Message.afficherDialogConfirmation(
+// this.Modele.message.suppressionTitre,
+// message,
+// this.executeSupprimerPunition.createDelegate(this),
+// this.annuleSuppressionPunition.createDelegate(this)
+// )
+// },
+
/**
* Exécute la suppression de la punition sélectionné
*/
header:this.Modele.header.censeur,
dataIndex:this.Modele.dataIndex.censeur,
width:150
- },
- {
+ }
+ ];
+
+ if (this.Modele.data.activeCUD) {
+ this.checkColumn = new Ext.grid.CheckColumn({
+ header:this.Modele.header.statut,
+ dataIndex:this.Modele.dataIndex.statut,
+ width:55
+ });
+ columns.push(this.checkColumn);
+
+ } else {
+ columns.push({
header:this.Modele.header.statut,
dataIndex:this.Modele.dataIndex.statut,
width:150
- }
- ];
+ });
+ }
return columns;
},
+
getParametresRecherche:function () {
return this.params;
+ },
+
+ executeModifieStatutPunition:function (punitionId, statut) {
+ Ext.Ajax.request({
+ scope:this,
+ url:this.Modele.url.changeStatutPunition,
+ params:{
+ punitionId:punitionId,
+ statut:statut
+ },
+
+ success:function (response, request) {
+ var resultats = Ext.decode(response.responseText);
+ if (resultats.success) {
+
+ this.store.commitChanges();
+
+ // Affichage du message de réussite
+ eliot.absences.Message.showConfirmation(
+ resultats.message
+ );
+
+
+ }
+ // Affiche un message d'erreur,
+ else {
+ eliot.absences.Message.showErreur(resultats.message);
+ }
+ },
+
+ failure:function (response, request) {
+ eliot.absences.Message.showErreur(
+ this.Modele.message.erreurInconnue
+ );
+ }
+ });
}
-});
+})
+;
this.gridIncidentView
);
+ /********************* Absence liée à la punition *********************/
+
+ var isAbsenceLiee = undefined;
+
+ var absenceInfo = {};
+
+ if (isModeModification) {
+ isAbsenceLiee = punitionData.isAbsenceLiee;
+ if (isAbsenceLiee) {
+ absenceInfo = punitionData.absenceInfo;
+ }
+ }
+
+ // le zone des absences liée
+ this.absenceLieePunitionView = new eliot.absences.saisie.punition.
+ creermodifier.FieldSetView({
+ isAbsenceLiee:isAbsenceLiee,
+ absenceInfo:absenceInfo,
+ isModeModification:isModeModification
+ });
+
+
/********************* Toolbar tout en haut *********************/
// Toolbar View
this.toolbarView = new eliot.absences.commons.SaveCancelToolBarView({
annulerActive:NameSpace.Modele.data.activeCRUD
});
+ var motifIdParDefault = this.absenceLieePunitionView.motifController.store.
+ getAt(0).get('id');
+
+ var absenceInfoInitial = {
+ dateDebutSelectionnee:new Date().format('d/m/Y'),
+ heureDebutSelectionnee:this.absenceLieePunitionView.heureDebutController.
+ valeurInitiale,
+ heureFinSelectionnee:this.absenceLieePunitionView.heureFinController.
+ valeurInitiale,
+ dateFinSelectionnee:new Date().format('d/m/Y'),
+ motifSelectionne:undefined
+ };
+
+ if (isModeModification) {
+ if (isAbsenceLiee) {
+ absenceInfo = punitionData.absenceInfo;
+ absenceInfoInitial.dateDebutSelectionnee = absenceInfo.dateDebut;
+ absenceInfoInitial.dateFinSelectionnee = absenceInfo.dateFin;
+ absenceInfoInitial.heureDebutSelectionnee = absenceInfo.heureDebut;
+ absenceInfoInitial.heureFinSelectionnee = absenceInfo.heureFin;
+ absenceInfoInitial.motifSelectionne = absenceInfo.motifId;
+ }
+ }
+
// Toolbar Controller
this.toolbarController = new NameSpace.ToolBarController({
dateSelectionnee:this.dateController.dateSelectionnee,
isPunitionEffectuee:this.punitionEffectueeView.isEntiteEffectuee,
autoriteEleveId:this.elevePuniController.autoriteId,
autoriteCenseurId:this.censeurController.autoriteId,
- contenuTextArea:this.descriptionView.contenuTextArea
+ contenuTextArea:this.descriptionView.contenuTextArea,
+ isAbsenceLiee:this.absenceLieePunitionView.isAbsenceLiee,
+ absenceInfoInitial:absenceInfoInitial
});
this.toolbarController.observeToolbarView(
this.gridIncidentController
);
+ this.toolbarController.observeAbsenceLieeAPunitionController(
+ this.absenceLieePunitionView
+ );
+
+ this.toolbarController.observeDateDebutController(
+ this.absenceLieePunitionView.dateDebutController
+ );
+
+ this.toolbarController.observeHeureDebutController(
+ this.absenceLieePunitionView.heureDebutController
+ );
+
+ this.toolbarController.observeDateFinController(
+ this.absenceLieePunitionView.dateFinController
+ );
+
+ this.toolbarController.observeHeureFinController(
+ this.absenceLieePunitionView.heureFinController
+ );
+
+ this.toolbarController.observeMotifController(
+ this.absenceLieePunitionView.motifController
+ );
+
// Construction du region centre
var centerRegionItems = NameSpace.configCenterRegion(this);
personneValidee : 'personneValidee',
punitionEffectueeSelect : 'punitionEffectueeSelect',
afficherMessageDialogue : 'afficherMessageDialogue',
- actionSupprimeAssociationPunition : 'actionSupprimeAssociationPunition'
+ actionSupprimeAssociationPunition : 'actionSupprimeAssociationPunition',
+ actionCliqueAbsencesLieePunition : 'actionCliqueAbsencesLieePunition'
},
composantId : {
qualite : 'qualite',
selection : 'selection'
},
-
+
isAnnulerTrue : true,
isAnnulerFalse : false
};
\ No newline at end of file
comboPersonneEducField : undefined,
comboStructureEnsField : undefined,
comboEleveField : undefined,
+ absenceLiePunition:undefined,
+ libelleDateDebut:undefined,
+ libelleDateFin:undefined,
+ motifCombo:undefined,
libelleDescription : undefined,
eleves: undefined,
tous: undefined,
urlSaisiePunitionModification : undefined,
urlSaisiePunitionCreation : undefined,
urlEnregistrerSaisiePunition : undefined,
- getIncidentsForEleveAndPunition : undefined
+ getIncidentsForEleveAndPunition : undefined,
+ urlVerifierAbsenceEleve : undefined
},
data : {
isAnnulerTrue : undefined,
isAnnulerFalse : undefined,
messageSuccess : undefined,
+ listeHeureDebut:undefined,
+ listeHeureFin:undefined,
criteres: undefined,
- activeCRUD: undefined
+ activeCRUD: undefined,
+ dataMotifs:undefined
},
icon : {
enregistrementMaskText : undefined,
confirmationChangementElevePuni : undefined,
champObligatoireErreur : undefined,
+ confirmationChangementParams:undefined,
actionsSuivantes: undefined
},
- header : {
+ header : {
date : undefined,
type : undefined,
gravite : undefined,
titre : {
selectionPersonneEduc : undefined,
selectionEleve : undefined,
- changementElevePuni : undefined
+ changementElevePuni : undefined,
+ changementPeriodeAbsence:undefined,
+ changementEleveSanctionne:undefined,
+ changementAbsenceLiee:undefined
}
};
\ No newline at end of file
Ext.ns('eliot.absences.saisie.punition.creermodifier');
eliot.absences.saisie.punition.creermodifier.ToolBarController =
- Ext.extend(Ext.util.Observable, {
- /**
- * @param config.dateSelectionnee date sélectionnée dans datePicker
- * @param config.typePunitionSelectionnee type de punition séletionné
- * @param config.isPunitionEffectuee état du checkBox punition effectuée
- * @param config.autoriteEleveId id du élève puni
- * @param config.autoriteCenseurId id du censeur
- * @param config.contenuTextArea valeur dans description
- * @param config.idIncidentSelectionne l'identifiant de l'incident sélectionné
- */
- constructor: function(config) {
- // Définition de la configuration par défaut
- var cfg = {
- dateSelectionnee : undefined,
- typePunitionSelectionnee : undefined,
- isPunitionEffectuee : undefined,
- autoriteEleveId : undefined,
- autoriteCenseurId : undefined,
- contenuTextArea : undefined,
- incidentId : undefined
- };
-
- // Charge la config passée en paramètre
- Ext.apply(cfg, config);
-
- // Variables
- this.dateSelectionnee = cfg.dateSelectionnee;
- this.dateSelectionnee = this.formateDate(this.dateSelectionnee);
-
- this.typePunitionSelectionnee = cfg.typePunitionSelectionnee;
- this.isPunitionEffectuee = cfg.isPunitionEffectuee;
- this.autoriteEleveId = cfg.autoriteEleveId;
- this.autoriteEleveIds = [];
- this.autoriteCenseurId = cfg.autoriteCenseurId;
- this.contenuTextArea = cfg.contenuTextArea;
- this.incidentId = cfg.incidentId;
-
- this.NameSpace = eliot.absences.saisie.punition.creermodifier;
- },
-
- /**
- * La méthode permet de vérifier la variable est une date ou pas
- * @param variable
- */
- isDate : function(variable) {
- return (null != variable) && !isNaN(variable) &&
- ("undefined" !== typeof variable.getDate);
- },
-
- /**
- * La méthode permet de formater une date en format 'd/m/Y'
- * @param date à formater
- */
- formateDate : function(date) {
- var isDate = this.isDate(this.dateSelectionnee);
- if (isDate) {
- date = date.format('d/m/Y');
- }
- return date
- },
-
- /**
- * Méthode observe la vue du toolbar, les événements déclenchés par
- * bouton 'Annuler' et 'Enregistrer'
- * @param toolbarView
- */
- observeToolbarView : function(toolbarView) {
- toolbarView.addListener(
- this.NameSpace.Constantes.eventId.actionReinitialiser,
- function() {
- var isModeModification = this.NameSpace.Modele.data.
- isModeModification;
- var punitionId = undefined;
- if (isModeModification) {
- punitionId = this.NameSpace.Modele.data.
- punitionAModifierInfo.id;
- }
- this.executeAnnuler(punitionId);
- },
- this
- );
- toolbarView.addListener(
- this.NameSpace.Constantes.eventId.actionEnregistrer,
- function() {
- this.executeEnregistrer();
- },
- this
- );
- },
-
- /**
- * Observe date sélectionnée par date controller
- * @param dateController
- */
- observeDateController : function(dateController) {
- dateController.addListener(
- eliot.absences.commons.DateControllerConstantes.eventId.
- dateChangee,
- function(date) {
- this.dateSelectionnee = date.format('d/m/Y');
- },
- this
- );
- },
-
- /**
- * Observe type punition sélectionné par typePunitionController
- * @param typePunitionController
- */
- observeTypePunitionController : function(typePunitionController) {
- typePunitionController.addListener(
- eliot.absences.commons.ComboBoxControllerConstantes.
- eventId.entiteChange,
- function(entiteSelectionnee) {
- this.typePunitionSelectionnee = entiteSelectionnee;
- },
- this
- );
- },
-
- /**
- * Observe l'état du checkBox de punition effectuée
- * @param punitionEffectueeView
- */
- observeCheckBoxView : function(punitionEffectueeView) {
- punitionEffectueeView.addListener(
- eliot.absences.commons.CheckBoxViewConstantes.eventId.
- actionChangeEntiteEffectuee,
- function(isEntiteEffectuee) {
- this.isPunitionEffectuee = isEntiteEffectuee;
- },
- this
- );
- },
-
- /**
- * Observe id d'élève puni sélectionné
- * @param elevePuniController
- */
- observeElevePuniController : function(elevePuniController) {
- elevePuniController.addListener(
- eliot.absences.commons.CompositFieldControllerConstantes.
- eventId.personneValidee,
- function(autoriteId, autoriteNom, autoriteIds) {
- this.autoriteEleveId = autoriteId;
- this.autoriteEleveIds = autoriteIds;
- },
- this
- );
- },
-
- /**
- * Observe id de censeur sélectionné
- * @param censeurController
- */
- observeCenseurController : function(censeurController) {
- censeurController.addListener(
- eliot.absences.commons.CompositFieldControllerConstantes.
- eventId.personneValidee,
- function(autoriteId) {
- this.autoriteCenseurId = autoriteId;
- },
- this
- );
- },
-
- /**
- * Observe les valeurs dans description
- * @param descriptionView
- */
- observeDescriptionView : function(descriptionView) {
- descriptionView.addListener(
- eliot.absences.commons.TextAreaViewConstantes.eventId.
- actionContenuChange,
- function(contenuTextArea) {
- this.contenuTextArea = contenuTextArea;
- },
- this
- );
- },
-
- /**
- * Observe l'incident choisi
- * @param gridIncidentController
- */
- observeGridIncidentController : function(gridIncidentController) {
- gridIncidentController.addListener(
- eliot.absences.commons.GridWithCheckBoxControllerConstantes.
- eventId.selectionChange,
- function(incidentId) {
- this.incidentId = incidentId;
- },
- this
- );
- },
-
- /**
- * Vérifier les champs obligatoires sont bien remplis
- */
- verifieChampObligatoir : function() {
- var isChampObligatoirRempli = true;
-
- if (this.autoriteEleveId == null && this.autoriteEleveIds.length == 0) {
- isChampObligatoirRempli = false;
- }
-
- if (this.autoriteCenseurId == null) {
- isChampObligatoirRempli = false;
- }
-
- if (isChampObligatoirRempli == false) {
- var erreur = this.NameSpace.Modele.message.champObligatoireErreur;
- eliot.absences.Message.showErreur(erreur);
- }
-
- return isChampObligatoirRempli;
- },
-
- /**
- * Préparer la liste de params passé à enregistrement
- */
- getListeParams : function() {
-
- var paramListe = {};
- if ((this.NameSpace.Modele.data.isModeModification) &&
- (this.NameSpace.Modele.data.punitionAModifierInfo.id != null)){
- paramListe.id = this.NameSpace.Modele.data.punitionAModifierInfo.id;
- }
-
- paramListe.date = this.dateSelectionnee;
-
- paramListe.typePunitionId = this.typePunitionSelectionnee;
-
- paramListe.isPunitionEffectuee = this.isPunitionEffectuee;
-
- paramListe.autoriteEleveId = this.autoriteEleveId;
- paramListe.autoriteEleveIds = this.autoriteEleveIds;
-
- paramListe.autoriteCenseurId = this.autoriteCenseurId;
-
- paramListe.incidentId = this.incidentId;
-
- var description = this.contenuTextArea;
-
- if (description === undefined) {
- description = '';
+ Ext.extend(Ext.util.Observable, {
+ /**
+ * @param config.dateSelectionnee date sélectionnée dans datePicker
+ * @param config.typePunitionSelectionnee type de punition séletionné
+ * @param config.isPunitionEffectuee état du checkBox punition effectuée
+ * @param config.autoriteEleveId id du élève puni
+ * @param config.autoriteCenseurId id du censeur
+ * @param config.contenuTextArea valeur dans description
+ * @param config.idIncidentSelectionne l'identifiant de l'incident sélectionné
+ */
+ constructor: function(config) {
+ // Définition de la configuration par défaut
+ var cfg = {
+ dateSelectionnee : undefined,
+ typePunitionSelectionnee : undefined,
+ isPunitionEffectuee : undefined,
+ autoriteEleveId : undefined,
+ autoriteCenseurId : undefined,
+ contenuTextArea : undefined,
+ incidentId : undefined,
+ isAbsenceLiee : undefined,
+ absenceInfoInitial : {
+ dateDebutSelectionnee : undefined,
+ dateFinSelectionnee : undefined,
+ heureDebutSelectionnee : undefined,
+ heureFinSelectionnee : undefined,
+ motifSelectionne : undefined
+ }
+ };
+
+ // Charge la config passée en paramètre
+ Ext.apply(cfg, config);
+
+ // Variables
+ this.dateSelectionnee = cfg.dateSelectionnee;
+ this.dateSelectionnee = this.formateDate(this.dateSelectionnee);
+
+ this.typePunitionSelectionnee = cfg.typePunitionSelectionnee;
+ this.isPunitionEffectuee = cfg.isPunitionEffectuee;
+ this.autoriteEleveId = cfg.autoriteEleveId;
+ this.autoriteEleveIds = [];
+ this.autoriteCenseurId = cfg.autoriteCenseurId;
+ this.contenuTextArea = cfg.contenuTextArea;
+ this.incidentId = cfg.incidentId;
+ this.isAbsenceLiee = cfg.isAbsenceLiee;
+
+ this.dateDebutSelectionnee =
+ cfg.absenceInfoInitial.dateDebutSelectionnee;
+ this.dateDebutSelectionnee = this.formateDate(this.dateDebutSelectionnee);
+
+ this.heureDebutSelectionnee =
+ cfg.absenceInfoInitial.heureDebutSelectionnee;
+
+ this.dateFinSelectionnee =
+ cfg.absenceInfoInitial.dateFinSelectionnee;
+ this.dateFinSelectionnee = this.formateDate(this.dateFinSelectionnee);
+
+ this.heureFinSelectionnee =
+ cfg.absenceInfoInitial.heureFinSelectionnee;
+
+ this.motifSelectionne =
+ cfg.absenceInfoInitial.motifSelectionne;
+
+ this.NameSpace = eliot.absences.saisie.punition.creermodifier;
+ },
+
+ /**
+ * La méthode permet de vérifier la variable est une date ou pas
+ * @param variable
+ */
+ isDate : function(variable) {
+ return (null != variable) && !isNaN(variable) &&
+ ("undefined" !== typeof variable.getDate);
+ },
+
+ /**
+ * La méthode permet de formater une date en format 'd/m/Y'
+ * @param date à formater
+ */
+ formateDate : function(date) {
+ var isDate = this.isDate(this.dateSelectionnee);
+ if (isDate) {
+ date = date.format('d/m/Y');
+ }
+ return date
+ },
+
+ /**
+ * Méthode observe la vue du toolbar, les événements déclenchés par
+ * bouton 'Annuler' et 'Enregistrer'
+ * @param toolbarView
+ */
+ observeToolbarView : function(toolbarView) {
+ toolbarView.addListener(
+ this.NameSpace.Constantes.eventId.actionReinitialiser,
+ function() {
+ var isModeModification = this.NameSpace.Modele.data.
+ isModeModification;
+ var punitionId = undefined;
+ if (isModeModification) {
+ punitionId = this.NameSpace.Modele.data.
+ punitionAModifierInfo.id;
+ }
+ this.executeAnnuler(punitionId);
+ },
+ this
+ );
+ toolbarView.addListener(
+ this.NameSpace.Constantes.eventId.actionEnregistrer,
+ function() {
+ this.executeEnregistrer();
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe date sélectionnée par date controller
+ * @param dateController
+ */
+ observeDateController : function(dateController) {
+ dateController.addListener(
+ eliot.absences.commons.DateControllerConstantes.eventId.
+ dateChangee,
+ function(date) {
+ this.dateSelectionnee = date.format('d/m/Y');
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe type punition sélectionné par typePunitionController
+ * @param typePunitionController
+ */
+ observeTypePunitionController : function(typePunitionController) {
+ typePunitionController.addListener(
+ eliot.absences.commons.ComboBoxControllerConstantes.
+ eventId.entiteChange,
+ function(entiteSelectionnee) {
+ this.typePunitionSelectionnee = entiteSelectionnee;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe l'état du checkBox de punition effectuée
+ * @param punitionEffectueeView
+ */
+ observeCheckBoxView : function(punitionEffectueeView) {
+ punitionEffectueeView.addListener(
+ eliot.absences.commons.CheckBoxViewConstantes.eventId.
+ actionChangeEntiteEffectuee,
+ function(isEntiteEffectuee) {
+ this.isPunitionEffectuee = isEntiteEffectuee;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe id d'élève puni sélectionné
+ * @param elevePuniController
+ */
+ observeElevePuniController : function(elevePuniController) {
+ elevePuniController.addListener(
+ eliot.absences.commons.CompositFieldControllerConstantes.
+ eventId.personneValidee,
+ function(autoriteId, autoriteNom, autoriteIds) {
+ this.autoriteEleveId = autoriteId;
+ this.autoriteEleveIds = autoriteIds;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe id de censeur sélectionné
+ * @param censeurController
+ */
+ observeCenseurController : function(censeurController) {
+ censeurController.addListener(
+ eliot.absences.commons.CompositFieldControllerConstantes.
+ eventId.personneValidee,
+ function(autoriteId) {
+ this.autoriteCenseurId = autoriteId;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe les valeurs dans description
+ * @param descriptionView
+ */
+ observeDescriptionView : function(descriptionView) {
+ descriptionView.addListener(
+ eliot.absences.commons.TextAreaViewConstantes.eventId.
+ actionContenuChange,
+ function(contenuTextArea) {
+ this.contenuTextArea = contenuTextArea;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe l'incident choisi
+ * @param gridIncidentController
+ */
+ observeGridIncidentController : function(gridIncidentController) {
+ gridIncidentController.addListener(
+ eliot.absences.commons.GridWithCheckBoxControllerConstantes.
+ eventId.selectionChange,
+ function(incidentId) {
+ this.incidentId = incidentId;
+ },
+ this
+ );
+ },
+
+ observeAbsenceLieeAPunitionController : function(absenceLieePunitionView) {
+ absenceLieePunitionView.addListener(
+ eliot.absences.saisie.punition.creermodifier.Constantes.
+ eventId.actionCliqueAbsencesLieePunition,
+ function(isAbsenceLiee) {
+ this.isAbsenceLiee = isAbsenceLiee;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe date sélectionnée par date controller
+ * @param dateDebutController
+ */
+ observeDateDebutController : function(dateDebutController) {
+ dateDebutController.addListener(
+ eliot.absences.commons.DateControllerConstantes.eventId.
+ dateChangee,
+ function(date) {
+ this.dateDebutSelectionnee = date.format('d/m/Y');
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe heure début sélectionnée par heure controller
+ * @param heureDebutController
+ */
+ observeHeureDebutController : function(heureDebutController) {
+ heureDebutController.addListener(
+ eliot.absences.commons.ComboBoxControllerConstantes.
+ eventId.entiteChange,
+ function(heure) {
+ this.heureDebutSelectionnee = heure;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe date sélectionnée par date controller
+ * @param dateFinController
+ */
+ observeDateFinController : function(dateFinController) {
+ dateFinController.addListener(
+ eliot.absences.commons.DateControllerConstantes.eventId.
+ dateChangee,
+ function(date) {
+ this.dateFinSelectionnee = date.format('d/m/Y');
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe heure début sélectionnée par heure controller
+ * @param heureFinController
+ */
+ observeHeureFinController : function(heureFinController) {
+ heureFinController.addListener(
+ eliot.absences.commons.ComboBoxControllerConstantes.
+ eventId.entiteChange,
+ function(heure) {
+ this.heureFinSelectionnee = heure;
+ },
+ this
+ );
+ },
+
+ /**
+ * Observe motif d'absence sélectionné par motifController
+ * @param motifController
+ */
+ observeMotifController : function(motifController) {
+ motifController.addListener(
+ eliot.absences.commons.ComboBoxControllerConstantes.
+ eventId.entiteChange,
+ function(entiteSelectionnee) {
+ this.motifSelectionne = entiteSelectionnee;
+ },
+ this
+ );
+ },
+
+ /**
+ * La méthode contient deux étapes : vérification d'absence d'élève
+ * + exécuter d'enregistrement de punition d'un élève
+ */
+ actionEnregistrer : function() {
+ var messageErreur = '';
+ if (this.isAbsenceLiee) {
+ this.traiteDonneesLieeAbsence();
+ } else {
+ this.executeEnregistrer();
+ }
+ },
+
+ /**
+ * La méthode permet de vérifier la logique de dates et heures,
+ * si dates et heures sont logiques, verifier exsitance de
+ * l'absence prévisionnelle
+ */
+ traiteDonneesLieeAbsence : function() {
+ var messageErreur = '';
+
+ var dateDebutParts = this.dateDebutSelectionnee.split("/");
+ var heureDebutParts = this.heureDebutSelectionnee.split(":");
+ var dateDebutConverti = new Date(dateDebutParts[2],
+ (dateDebutParts[1] - 1),
+ dateDebutParts[0],
+ heureDebutParts[0],
+ heureDebutParts[1],
+ 0
+ );
+
+ var dateFinParts = this.dateFinSelectionnee.split("/");
+ var heureFinParts = this.heureFinSelectionnee.split(":");
+ var dateFinConverti = new Date(dateFinParts[2],
+ (dateFinParts[1] - 1),
+ dateFinParts[0],
+ heureFinParts[0],
+ heureFinParts[1],
+ 0
+ );
+
+ if (dateFinConverti >= dateDebutConverti) {
+ if ((dateFinConverti - dateDebutConverti) == 0) {
+ messageErreur = this.NameSpace.Modele.message.dateHeureIndentique;
+ eliot.absences.Message.showErreur(messageErreur);
+ }
+ else {
+ if (!this.motifSelectionne) {
+ eliot.absences.Message.showErreur(
+ this.NameSpace.Modele.message.champsObligatoiresManquants
+ );
}
- paramListe.description = description;
-
- return paramListe;
- },
-
- /**
- * Reinitialiser la page actuelle quand on clique sur bouton 'Annuler'
- */
- executeAnnuler : function(punitionId) {
- var urlPageActuelle = undefined;
- if (this.NameSpace.Modele.data.isModeModification) {
- urlPageActuelle = this.NameSpace.Modele.url.
- urlSaisiePunitionModification + '?id=' + punitionId +
- '&isModif=' + this.NameSpace.Modele.data.isModeModification
- + '&isAnnuler=' + this.NameSpace.Constantes.isAnnulerTrue;
- } else {
- urlPageActuelle = this.NameSpace.Modele.url.urlSaisiePunitionCreation
- + '?isAnnuler=' + this.NameSpace.Constantes.isAnnulerTrue;
+ else {
+ this.verifieAbsenceEleve(
+ this.autoriteEleveId,
+ this.dateDebutSelectionnee,
+ this.heureDebutSelectionnee,
+ this.dateFinSelectionnee,
+ this.heureFinSelectionnee
+ );
}
-
- eliot.commun.PostHelper.post({
- url: urlPageActuelle,
- params: {
- criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
+ }
+ } else {
+ messageErreur = this.NameSpace.Modele.message.dateHeurePasLogique;
+ eliot.absences.Message.showErreur(messageErreur);
+ }
+ },
+
+ /**
+ * La méthode permet de vérifier que élève spécifié sera absent
+ * dans la période indiquée
+ * @param eleveId
+ * @param dateDebut
+ * @param heureDebut
+ * @param dateFin
+ * @param heureFin
+ */
+ verifieAbsenceEleve : function(eleveId,
+ dateDebut,
+ heureDebut,
+ dateFin,
+ heureFin) {
+
+ if (eleveId == null) {
+ this.executeEnregistrer();
+ }
+ else {
+ var paramListePourVerification = this.getListeParamsPourVerification();
+
+ Ext.Ajax.request({
+ url: this.NameSpace.Modele.url.urlVerifierAbsenceEleve,
+ params:{absenceInfo : Ext.encode(paramListePourVerification)},
+ success:function(response, request) {
+ var reponse = Ext.decode(response.responseText);
+ if (reponse.success != true) {
+ if (reponse.message) {
+ eliot.absences.Message.showErreur(reponse.message);
+ }
+ else {
+ request.failure.call(this);
+ }
}
- });
- },
-
- /**
- * Enregistrer d'une punition
- */
- executeEnregistrer : function() {
- if (this.verifieChampObligatoir() == true) {
-
- Ext.Ajax.request({
- url: this.NameSpace.Modele.url.urlEnregistrerSaisiePunition,
-
- params: {
- punitionInfo : Ext.encode(this.getListeParams())
- },
-
- success:function(response, request) {
- var reponse = Ext.decode(response.responseText);
- if (reponse.success != true) {
- if (reponse.message) {
- eliot.absences.Message.showErreur(reponse.message);
- }
- else {
- request.failure.call(this);
- }
- }
- else {
- this.ouvrePopupChoix(reponse.id);
- }
- },
-
- failure:function() {
- eliot.absences.Message.showErreur(
- this.NameSpace.Modele.message.erreurInconnue);
- },
-
- scope : this
- });
- }
- },
-
- ouvrePopupChoix: function(idPunition) {
- var Modele = this.NameSpace.Modele;
-
- new eliot.absences.commons.PopUpChoixView({
- titre: Modele.libelle.actionSuivantes,
- text: Modele.message.actionsSuivantes + ' :',
- valider: Modele.libelle.ok,
- annuler: Modele.libelle.annuler,
- defaultChoix: 3,
- scope: this,
- onValider: function(choix) {
- switch (choix) {
- case 1:
- this.chargePageModification(idPunition, true);
- break;
-
- case 2:
- this.chargePageCreation();
- break;
-
- case 3:
- this.chargePageListe();
- break;
-
+ else {
+ // Si ce élève sera absent dans la période indiquée, alors demande
+ // une vérification
+ if (reponse.isEleveAbsent) {
+ this.afficheBoiteConfirmation(reponse.message);
+ } else {
+ this.executeEnregistrer();
}
- },
-
- onAnnuler: function() {
- this.chargePageModification(idPunition, false);
- },
-
- choix: [
- {id: 1, libelle: Modele.libelle.dupliquerEleve},
- {id: 2, libelle: Modele.libelle.creerNouvellePunition},
- {id: 3, libelle: Modele.libelle.revenirListePunitions}
- ]
- });
- },
-
- chargePageListe : function() {
- eliot.commun.PostHelper.post({
- url: Ext.get('breadcrumb2').dom.href,
- params: {
- criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
}
- });
+ },
+ failure:function() {
+ eliot.absences.Message.showErreur(
+ this.NameSpace.Modele.message.erreurInconnue
+ );
+ },
+ scope : this
+ });
+ }
+ },
+
+ /**
+ * Préparer une liste de params passés à vérification d'absence d'un
+ * élève
+ * @return paramListeVerification liste de paramètres
+ */
+ getListeParamsPourVerification : function() {
+ var paramListeVerification = {};
+ paramListeVerification.autoriteEleveId = this.autoriteEleveId;
+ paramListeVerification.autoriteEleveIds = this.autoriteEleveIds;
+ paramListeVerification.dateDebut = this.dateDebutSelectionnee;
+ paramListeVerification.heureDebut = this.heureDebutSelectionnee;
+ paramListeVerification.dateFin = this.dateFinSelectionnee;
+ paramListeVerification.heureFin = this.heureFinSelectionnee;
+
+ return paramListeVerification;
+ },
+
+ /**
+ * Vérifier les champs obligatoires sont bien remplis
+ */
+ verifieChampObligatoir : function() {
+ var isChampObligatoirRempli = true;
+
+ if (this.autoriteEleveId == null && this.autoriteEleveIds.length == 0) {
+ isChampObligatoirRempli = false;
+ }
+
+ if (this.autoriteCenseurId == null) {
+ isChampObligatoirRempli = false;
+ }
+
+ if (isChampObligatoirRempli == false) {
+ var erreur = this.NameSpace.Modele.message.champObligatoireErreur;
+ eliot.absences.Message.showErreur(erreur);
+ }
+
+ return isChampObligatoirRempli;
+ },
+
+ /**
+ * Préparer la liste de params passé à enregistrement
+ */
+ getListeParams : function() {
+
+ var paramListe = {};
+ if ((this.NameSpace.Modele.data.isModeModification) &&
+ (this.NameSpace.Modele.data.punitionAModifierInfo.id != null)){
+ paramListe.id = this.NameSpace.Modele.data.punitionAModifierInfo.id;
+ }
+
+ paramListe.date = this.dateSelectionnee;
+
+ paramListe.typePunitionId = this.typePunitionSelectionnee;
+
+ paramListe.isPunitionEffectuee = this.isPunitionEffectuee;
+
+ paramListe.autoriteEleveId = this.autoriteEleveId;
+ paramListe.autoriteEleveIds = this.autoriteEleveIds;
+
+ paramListe.autoriteCenseurId = this.autoriteCenseurId;
+
+ paramListe.incidentId = this.incidentId;
+
+ var description = this.contenuTextArea;
+
+ paramListe.isAbsenceLiee = this.isAbsenceLiee;
+
+ if (this.isAbsenceLiee) {
+ paramListe.dateDebut = this.dateDebutSelectionnee;
+ paramListe.heureDebut = this.heureDebutSelectionnee;
+ paramListe.dateFin = this.dateFinSelectionnee;
+ paramListe.heureFin = this.heureFinSelectionnee;
+ paramListe.motifId = this.motifSelectionne;
+ }
+
+ if (description === undefined) {
+ description = '';
+ }
+ paramListe.description = description;
+
+ return paramListe;
+ },
+
+ /**
+ * Reinitialiser la page actuelle quand on clique sur bouton 'Annuler'
+ */
+ executeAnnuler : function(punitionId) {
+ var urlPageActuelle = undefined;
+ if (this.NameSpace.Modele.data.isModeModification) {
+ urlPageActuelle = this.NameSpace.Modele.url.
+ urlSaisiePunitionModification + '?id=' + punitionId +
+ '&isModif=' + this.NameSpace.Modele.data.isModeModification
+ + '&isAnnuler=' + this.NameSpace.Constantes.isAnnulerTrue;
+ } else {
+ urlPageActuelle = this.NameSpace.Modele.url.urlSaisiePunitionCreation
+ + '?isAnnuler=' + this.NameSpace.Constantes.isAnnulerTrue;
+ }
+
+ eliot.commun.PostHelper.post({
+ url: urlPageActuelle,
+ params: {
+ criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
+ }
+ });
+ },
+
+ /**
+ * Enregistrer d'une punition
+ */
+ executeEnregistrer : function() {
+ if (this.verifieChampObligatoir() == true) {
+
+ Ext.Ajax.request({
+ url: this.NameSpace.Modele.url.urlEnregistrerSaisiePunition,
+
+ params: {
+ punitionInfo : Ext.encode(this.getListeParams())
+ },
+
+ success:function(response, request) {
+ var reponse = Ext.decode(response.responseText);
+ if (reponse.success != true) {
+ if (reponse.message) {
+ eliot.absences.Message.showErreur(reponse.message);
+ }
+ else {
+ request.failure.call(this);
+ }
+ }
+ else {
+ this.ouvrePopupChoix(reponse.id);
+ }
+ },
+
+ failure:function() {
+ eliot.absences.Message.showErreur(
+ this.NameSpace.Modele.message.erreurInconnue);
+ },
+
+ scope : this
+ });
+ }
+ },
+
+ ouvrePopupChoix: function(idPunition) {
+ var Modele = this.NameSpace.Modele;
+
+ new eliot.absences.commons.PopUpChoixView({
+ titre: Modele.libelle.actionSuivantes,
+ text: Modele.message.actionsSuivantes + ' :',
+ valider: Modele.libelle.ok,
+ annuler: Modele.libelle.annuler,
+ defaultChoix: 3,
+ scope: this,
+ onValider: function(choix) {
+ switch (choix) {
+ case 1:
+ this.chargePageModification(idPunition, true);
+ break;
+
+ case 2:
+ this.chargePageCreation();
+ break;
+
+ case 3:
+ this.chargePageListe();
+ break;
+
+ }
},
- chargePageModification: function(idPunition, isDupliquer) {
- var Modele = this.NameSpace.Modele;
- eliot.commun.PostHelper.post({
- url: Modele.url.urlSaisiePunitionModification +
- '?id=' + idPunition +
- '&isModif=' + Modele.data.isModeModification +
- '&isAnnuler=' + this.NameSpace.Constantes.isAnnulerFalse +
- '&isDupliquer=' + isDupliquer,
-
- params: {
- criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
- }
- });
+ onAnnuler: function() {
+ this.chargePageModification(idPunition, false);
},
- chargePageCreation: function() {
- var Modele = this.NameSpace.Modele;
- eliot.commun.PostHelper.post({
- url: Modele.url.urlSaisiePunitionCreation,
- params: {
- criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
- }
- });
+ choix: [
+ {id: 1, libelle: Modele.libelle.dupliquerEleve},
+ {id: 2, libelle: Modele.libelle.creerNouvellePunition},
+ {id: 3, libelle: Modele.libelle.revenirListePunitions}
+ ]
+ });
+ },
+
+ chargePageListe : function() {
+ eliot.commun.PostHelper.post({
+ url: Ext.get('breadcrumb2').dom.href,
+ params: {
+ criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
+ }
+ });
+ },
+
+ chargePageModification: function(idPunition, isDupliquer) {
+ var Modele = this.NameSpace.Modele;
+ eliot.commun.PostHelper.post({
+ url: Modele.url.urlSaisiePunitionModification +
+ '?id=' + idPunition +
+ '&isModif=' + Modele.data.isModeModification +
+ '&isAnnuler=' + this.NameSpace.Constantes.isAnnulerFalse +
+ '&isDupliquer=' + isDupliquer,
+
+ params: {
+ criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
+ }
+ });
+ },
+
+ chargePageCreation: function() {
+ var Modele = this.NameSpace.Modele;
+ eliot.commun.PostHelper.post({
+ url: Modele.url.urlSaisiePunitionCreation,
+ params: {
+ criteres: Ext.encode(eliot.absences.commons.CompositFieldControllerModele.data.criteres)
}
+ });
+ }
- });
\ No newline at end of file
+ });
\ No newline at end of file
*/
eliot.absences.saisie.punition.creermodifier.configCenterRegion = function(
- application
- ) {
+ application
+ ) {
return {
xtype:'panel',
layout : 'border',
items :[
{
region : 'north',
- height : 120,
+ height : 110,
border: false,
labelAlign : 'left',
bodyStyle:'padding:5px 25px 5px',
{
region : 'center',
border: false,
+ defaults: {
+ layout: 'form',
+ bodyStyle:'padding:0px 25px 15px',
+ border: false,
+ frame: false
+ },
items :[
{
- bodyStyle:'padding:10px 25px 15px',
- layout : 'form',
+ height : 220,
labelAlign : 'top',
- border: false,
- frame: false,
items : [
application.gridIncidentView.grid
]
+ },
+ {
+ items: [
+ application.absenceLieePunitionView.fieldSet
+ ]
}
]
}
store : sanctionController.store,
toolBar :cudToolbarView.cudToolbar,
columns : sanctionController.getColonnesGrilleConsultationSanctions(),
+ plugins:sanctionController.checkColumn,
nombreLignesParPage : this.NameSpace.Modele.data.nombreLignesParPage
});
boutonExportController.setColonnesVisiblesFonction(
afficheCreation : undefined,
afficheModification : undefined,
supprimeSanction : undefined,
- exporteSanctions : undefined
+ exporteSanctions : undefined,
+ changeStatutSanction : undefined
},
data : {
}
},
scope:this
+ },
+ update:{
+ fn:function (store, record) {
+ var id = record.get('id');
+ var statut = record.get('statut');
+ this.executeModifieStatutSanction(id, statut);
+ },
+ scope:this
}
})
},
header:this.Modele.header.censeur,
dataIndex:this.Modele.dataIndex.censeur,
width:150
- },
- {
+ }
+ ];
+
+ if (this.Modele.data.activeCUD) {
+ this.checkColumn = new Ext.grid.CheckColumn({
+ header:this.Modele.header.statut,
+ dataIndex:this.Modele.dataIndex.statut,
+ width:55
+ });
+ columns.push(this.checkColumn);
+ } else {
+ columns.push({
header:this.Modele.header.statut,
dataIndex:this.Modele.dataIndex.statut,
width:150
- }
- ];
+ });
+ }
+
+
return columns;
},
getParametresRecherche:function () {
return this.filter.getCriteres();
+ },
+
+ executeModifieStatutSanction:function (sanctionId, statut) {
+ Ext.Ajax.request({
+ scope:this,
+ url:this.Modele.url.changeStatutSanction,
+ params:{
+ sanctionId:sanctionId,
+ statut:statut
+ },
+
+ success:function (response, request) {
+ var resultats = Ext.decode(response.responseText);
+ if (resultats.success) {
+
+ this.store.commitChanges();
+
+ // Affichage du message de réussite
+ eliot.absences.Message.showConfirmation(
+ resultats.message
+ );
+
+ }
+ // Affiche un message d'erreur,
+ else {
+ eliot.absences.Message.showErreur(resultats.message);
+ }
+ },
+
+ failure:function (response, request) {
+ eliot.absences.Message.showErreur(
+ this.Modele.message.erreurInconnue
+ );
+ }
+ });
}
});