import org.lilie.services.eliot.scolarite.Etablissement
import org.lilie.services.eliot.absences.saisie.discipline.incident.exceptions.IncidentProtagonistesObligatoiresException
import org.lilie.services.eliot.absences.saisie.discipline.incident.exceptions.PartenaireAPrevenirIncidentDupliqueException
-import org.lilie.services.eliot.securite.impl.Autorite
import org.lilie.services.eliot.absences.Punition
import org.lilie.services.eliot.annuaire.SecuriteSession
import org.lilie.services.eliot.scolarite.Personne
-import org.lilie.services.eliot.annuaire.FonctionEnum
-import org.lilie.services.eliot.scolarite.personne.eleve.EleveRecupService
import org.lilie.services.eliot.GormUtils
-
import org.lilie.services.eliot.absences.saisie.discipline.sanction.exceptions.SanctionException
import org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions.PunitionException
import org.lilie.services.eliot.absences.Sanction
import org.lilie.services.eliot.absences.saisie.discipline.punition.AbsencesPunitionService
import org.lilie.services.eliot.absences.saisie.discipline.sanction.AbsencesSanctionService
import org.lilie.services.eliot.applications.absences.IncidentService
-import org.lilie.services.eliot.absences.AbsencesFonctionnalite
+import org.lilie.services.eliot.securite.Autorite
+import org.lilie.services.eliot.scolarite.personne.eleve.EleveAnnuaireService
/**
* Service de gestion des incidents
DroitsService droitsService
ProtagonisteIncidentService protagonisteIncidentService
PartenaireAPrevenirIncidentService partenaireAPrevenirIncidentService
- EleveRecupService eleveRecupService
+ EleveAnnuaireService eleveAnnuaireService
AbsencesSanctionService absencesSanctionService
AbsencesPunitionService absencesPunitionService
+ private static final FIND_INCIDENTS = """
+ from Incident as incident
+ inner join fetch incident.protagonistes as protagoniste_incident
+ inner join fetch protagoniste_incident.autorite
+ inner join fetch protagoniste_incident.qualite
+ left join fetch incident.partenairesAPrevenir as partenaire_incident
+ left join fetch partenaire_incident.partenaireAPrevenir
+ inner join fetch incident.type as typeIncident
+ inner join fetch incident.lieu as lieuIncident
+ where incident.etablissement.id = :etablissementId
+"""
+
/**
* Crée un nouvel incident
* Vérifie les droits
*/
Incident creeIncident(SecuriteSession securiteSession,
IncidentParams incidentParams
- ) throws AutorisationException,
- IncidentException {
-
- // Vérification des droits de création des incidents
- droitsService.verifieDroitModificationFonctionnalite(
- securiteSession,
- incidentParams.etablissement,
- AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN
- )
- // Création du nouvel incident
- return internalCreeIncident(incidentParams)
- }
-
- /**
- * Crée l'incident en base.
- * Ne fait aucune vérification de droits
- * @param preferences : les préférences de l'établissement
- * @param incidentDto : les nouvelles données de l'incident
- * @return un Incident
- * @throws IncidentException
- */
- private Incident internalCreeIncident(IncidentParams incidentParams
) throws IncidentException {
// Création de l'objet incident
* @author bahj
*/
void supprimeIncident(SecuriteSession securiteSession,
- Incident incident
- ) throws AutorisationException, IncidentException, PunitionException,
- SanctionException {
-
- // Vérifie les droits de suppression
- droitsService.verifieDroitModificationFonctionnalite(
- securiteSession,
- incident.etablissement,
- AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN
- )
-
- // Suppression
- internalSupprimeIncident(incident)
- }
-
- /**
- * Supprime un incident
- * ne vérifie pas les droits
- * @param incident : l'incident à supprimer
- * @author bahj
- */
- private void internalSupprimeIncident(Incident incident) throws
- IncidentException, SanctionException, PunitionException {
+ Incident incident)
+ throws IncidentException, SanctionException, PunitionException {
// supprime punitions + sanctions
absencesSanctionService.internalSupprimeSanctions(incident)
*/
Incident modifieIncident(SecuriteSession securiteSession,
Incident incident,
- IncidentParams incidentParams
- ) throws AutorisationException,
- IncidentException {
-
- // Vérification des droits de modification de l'incident
- droitsService.verifieDroitModificationFonctionnalite(
- securiteSession,
- incidentParams.etablissement,
- AbsencesFonctionnalite.ABS_SAISIE_INC_PUN_SAN
- )
-
- // Modification
- return internalModifieIncident(
- incident,
- incidentParams
- )
-
- }
-
- /**
- * Modifie l'incident
- * Ne vérifie pas les droits
- * @param incident : l'incident à modifier
- * @param incidentsParams : les params de l'incident
- * @return incident : l'incident modifié
- * @throws IncidentException
- */
- private Incident internalModifieIncident(Incident incident,
- IncidentParams incidentsParams
- ) throws IncidentException {
+ IncidentParams incidentParams) throws IncidentException {
// modification de l'incident
incident.date = incidentsParams.date
int start,
int limit) {
-
+ List<Autorite> eleves = []
ListeIncidentsInfo result = new ListeIncidentsInfo(
nbIncidents: 0,
incidents: []
)
+ Map hqlParams = [etablissementId: etablissement.id]
+ String hql = FIND_INCIDENTS
- // personne est seulement prof/docu
- // si elle a une autre fonctionne qui est plus forte, elle gagne
- Boolean personneIsEnseignant =
- droitsService.isEnseignantOnlyDroitsIncPunSan(securiteSession, etablissement)
-
- List<Autorite> eleves = []
- if (personneIsEnseignant) {
- eleves = eleveRecupService.
- findAllEleveByEnseignantAndEtablissement(securiteSession,
- personne,
- etablissement)?.collect { it.autorite }
- }
-
- // fait la requête seulement si on n'est pas prof sans élèves
- if (!(personneIsEnseignant && eleves.size() == 0)) {
-
- String hql = """from Incident as incident
- inner join fetch incident.protagonistes as protagoniste_incident
- inner join fetch protagoniste_incident.autorite
- inner join fetch protagoniste_incident.qualite
- left join fetch incident.partenairesAPrevenir as partenaire_incident
- left join fetch partenaire_incident.partenaireAPrevenir
- inner join fetch incident.type as typeIncident
- inner join fetch incident.lieu as lieuIncident
- where incident.etablissement.id = :etablissementId
- """
- if (personneIsEnseignant) {
- hql += ' and protagoniste_incident.autorite in (:eleves)'
- }
+ Boolean estSeulementEnseig = droitsService.hasOnlyPerimetreService(
+ securiteSession
+ )
- switch (champOrdre) {
- case ConsultationIncidentNomColonnes.TYPE_INCIDENT:
- hql += ' order by typeIncident.libelle ' + (ascendant ? 'asc' : 'desc')
- break
- case ConsultationIncidentNomColonnes.LIEU:
- hql += ' order by lieuIncident.libelle ' + (ascendant ? 'asc' : 'desc')
- break
- default:
- hql += ' order by ' + champOrdre + (ascendant ? ' asc' : ' desc')
- }
+ if (estSeulementEnseig) {
+ eleves = eleveAnnuaireService.findAllEleveByService(
+ securiteSession,
+ droitsService.getPerimetreServiceIds(securiteSession)
+ )?.collect { it.autorite }
- Map hqlParams = [etablissementId: etablissement.id]
- if (personneIsEnseignant) {
- hqlParams.eleves = eleves
+ if (eleves.size() == 0) {
+ return result
}
-
- result.incidents = Incident.executeQuery(
- hql,
- hqlParams,
- [max: limit, offset: start]
- )
-
- if (personneIsEnseignant) {
- // filtre les incidents pour profs
- result.nbIncidents = (Integer) ProtagonisteIncident.createCriteria().get {
+ hql += ' and protagoniste_incident.autorite in (:eleves)'
+ hqlParams.eleves = eleves
+ result.nbIncidents =
+ (Integer) ProtagonisteIncident.createCriteria().get {
'in'('autorite', eleves)
incident {
eq('etablissement', etablissement)
'countDistinct'('incident')
}
}
- } else {
- result.nbIncidents = Incident.countByEtablissement(etablissement)
- }
}
+ else {
+ result.nbIncidents = Incident.countByEtablissement(etablissement)
+ }
+
+ switch (champOrdre) {
+ case ConsultationIncidentNomColonnes.TYPE_INCIDENT:
+ hql += ' order by typeIncident.libelle ' + (ascendant ? 'asc' : 'desc')
+ break
+ case ConsultationIncidentNomColonnes.LIEU:
+ hql += ' order by lieuIncident.libelle ' + (ascendant ? 'asc' : 'desc')
+ break
+ default:
+ hql += ' order by ' + champOrdre + (ascendant ? ' asc' : ' desc')
+ }
+
+ result.incidents = Incident.executeQuery(
+ hql,
+ hqlParams,
+ [max: limit, offset: start]
+ )
return result
}