import org.lilie.services.eliot.securite.impl.AccesFonctionnalitePersonne
import org.lilie.services.eliot.securite.impl.Fonctionnalite
import org.lilie.services.eliot.annuaire.SecuriteSession
-
import org.lilie.services.eliot.annuaire.EliotFonctionnalites
import org.lilie.services.eliot.scolarite.fonction.FonctionAnnuaireService
import org.lilie.services.eliot.annuaire.FonctionEnum
-import org.lilie.services.eliot.notes.NotesFonctionnalite
+import org.lilie.services.eliot.applications.notes.NotesFonctionnalite
import org.lilie.services.eliot.scolarite.Personne
import org.lilie.services.eliot.applications.absences.AbsencesFonctionnalite
import org.lilie.services.eliot.scolarite.ScolariteFonctionnalites
import org.codehaus.groovy.grails.commons.GrailsApplication
import org.lilie.services.eliot.scolarite.etablissement.PreferenceEtablissementService
import org.lilie.services.eliot.annuaire.FonctionEtablissement
+import org.lilie.services.eliot.portail.TypeUtilisateur
+import org.hibernate.SQLQuery
+import org.lilie.services.eliot.requetage.RequetageUtilsService
class SecuriteFonctionnaliteService {
static transactional = false
+
+ private static final String DIRECTION_FROM_ETAB_PERSONNE =
+ """
+ WITH
+ etabIds AS (
+ (SELECT unnest(array[:etabIds]) AS id)
+ )
+
+ SELECT ps.etablissement_id
+ FROM ent.personne_propriete_scolarite AS pps
+ INNER JOIN ent.propriete_scolarite AS ps ON pps.propriete_scolarite_id = ps.id
+ INNER JOIN ent.fonction AS f on ps.fonction_id = f.id
+ WHERE pps.personne_id = :personneId
+ AND f.code = 'DIR'
+ AND ps.etablissement_id IN (select id FROM etabIds)
+ """
+
+
FonctionAnnuaireService fonctionAnnuaireService
PreferenceEtablissementService preferenceEtablissementService
+ RequetageUtilsService requetageUtilsService
@SuppressWarnings('GrailsStatelessService')
GrailsApplication grailsApplication
map.put(etablissement.id, eliotFonctionnalites)
}
+
+
+ gereDroitAccesParametrageFonctions(securiteSession, map)
+
+
if (isMultiEtablissement(map)) {
map.each() { etabId, fonctionnalites ->
fonctionnalites.add(ScolariteFonctionnalites.ETABLISSEMENT)
return map
}
+ /*
+ Cas particulier du paramétrage des fonctions
+ Demande d'évolution fiche : 0039927
+ Si la personne connecté en adml est directeur sur l'établissement,
+ on lui donne le droit d'accèder au paramétrage des fonctions
+ */
+
+ private gereDroitAccesParametrageFonctions(SecuriteSession securiteSession, Map map) {
+ if (securiteSession.annuaireSession?.typeUtilisateur != TypeUtilisateur.ADMIN_LOCAL) {
+ return
+ }
+
+ SQLQuery sqlQuery = requetageUtilsService.prepareRequete(
+ DIRECTION_FROM_ETAB_PERSONNE
+ )
+
+ sqlQuery.setLong("personneId", securiteSession.getPersonne().id)
+
+ sqlQuery.setParameterList("etabIds", map.keySet() as List)
+
+ List<Long> idEtablissementDir = sqlQuery.list() as List<Long>
+
+ idEtablissementDir.each {it ->
+ Set<EliotFonctionnalites> fonctionnalitesRemontees = map.get(it.longValue())
+ if (fonctionnalitesRemontees) {
+ fonctionnalitesRemontees.add(
+ ScolariteFonctionnalites.PARAMETRAGE_ACCES_FONCTIONS
+ )
+ }
+ }
+ }
+
/* cas particulier de la consultation d'absences.
* La fonctionnalité paramétrable est ABS_CONSULT mais pour que le droit d'accès
* soit accepté par le module Absences, il faut préciser de quelle type de consultation