package org.lilie.services.eliot.absences.saisie.discipline.punition
+import org.hibernate.Hibernate
+import org.hibernate.SQLQuery
+import org.hibernate.Session
+import org.hibernate.SessionFactory
import org.lilie.services.eliot.absences.Punition
import org.lilie.services.eliot.absences.ScolariteService
import org.lilie.services.eliot.absences.securite.DroitsService
import org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions.PunitionException
import org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions.PunitionDescriptionLongueException
+import org.lilie.services.eliot.annuaire.Fonction
+import org.lilie.services.eliot.annuaire.FonctionEnum
import org.springframework.dao.DataIntegrityViolationException
import org.lilie.services.eliot.absences.saisie.discipline.punition.exceptions.SuppressionPunitionContrainteException
import org.lilie.services.eliot.scolarite.Etablissement
import org.lilie.services.eliot.absences.saisie.discipline.ConsultationPunitionSanctionNomColonnes
import org.lilie.services.eliot.annuaire.SecuriteSession
import org.lilie.services.eliot.scolarite.Personne
-import org.lilie.services.eliot.scolarite.StructureEnseignement
import org.lilie.services.eliot.scolarite.personne.eleve.EleveRecupService
import org.lilie.services.eliot.GormUtils
import org.lilie.services.eliot.absences.Incident
import org.lilie.services.eliot.applications.absences.PunitionService
-import org.lilie.services.eliot.scolarite.personne.eleve.EleveAnnuaireService
+import org.lilie.services.eliot.scolarite.structureenseignement.LocalStructureEnseignementService
/**
* @author bahj
class AbsencesPunitionService extends PunitionService {
DroitsService droitsService
EleveRecupService eleveRecupService
- EleveAnnuaireService eleveAnnuaireService
ScolariteService scolariteService
+ SessionFactory sessionFactory
+ LocalStructureEnseignementService localStructureEnseignementService
static transactional = true
- private static final String HQL_PUNITION = """
- select punition, pps.proprietesScolarite.structureEnseignement
- from Punition as punition, PersonneProprietesScolarite as pps
- inner join fetch punition.eleve as eleve
- inner join fetch punition.censeur as censeur
- inner join fetch punition.typePunition as typePunition
- where punition.etablissement.id = :etablissementId
- and eleve=pps.personne
- and pps.estActive=true
- and pps.proprietesScolarite.structureEnseignement.actif=true
- and pps.proprietesScolarite.structureEnseignement.type = :typeClasse
+ private static final String SQL_PUNITION_TOUS = """
+ with pps_dernier_debut as (
+ select
+ pps.personne_id as persEleveId,
+ max(pps.date_debut) as dernier_debut
+ from
+ ent.personne_propriete_scolarite pps
+ join ent.propriete_scolarite ps on pps.propriete_scolarite_id = ps.id and ps.fonction_id = :fonctionEleveId
+ join ent.structure_enseignement se on ps.structure_enseignement_id = se.id and se.type = :typeClasse and se.etablissement_id = :etablissementId
+ group by pps.personne_id
+ ),
+
+ derniere_classe as (
+ select
+ pps.personne_id as eleve_id,
+ se.code as classe_code,
+ count(*) over() as nbrEleves
+ from
+ ent.personne_propriete_scolarite pps
+ join ent.propriete_scolarite ps on pps.propriete_scolarite_id = ps.id and ps.fonction_id = :fonctionEleveId
+ join ent.structure_enseignement se on ps.structure_enseignement_id = se.id and se.type = :typeClasse and se.etablissement_id = :etablissementId
+ join pps_dernier_debut der on der.persEleveId = pps.personne_id and der.dernier_debut = pps.date_debut
+ )
+
+ select {punition.*},
+ derniere_classe.classe_code as codeClasse,
+ eleve.nom||' '||eleve.prenom as nomPrenomEleve,
+ censeur.nom||' '||censeur.prenom as nomPrenomCenseur,
+ type_incident.libelle as typeIncident,
+ count(*) OVER() as nbrPunitions
+ from
+ enttemps.punition
+ join ent.personne eleve on punition.eleve_id = eleve.id
+ join ent.personne censeur on punition.censeur_id = censeur.id
+ join enttemps.type_punition on punition.type_punition_id = type_punition.id
+ join derniere_classe on derniere_classe.eleve_id = eleve.id
+ left join enttemps.incident on punition.incident_id = incident.id
+ left join enttemps.type_incident on incident.type_id = type_incident.id
+ where
+ punition.etablissement_id = :etablissementId
"""
- // idem HQL_PUNITION avec le type d'incident en plus (pour les archives)
- // et des fetch en moins sinon Hibernate mélange élève et censeur
- private static final String HQL_PUNITION_AVEC_TYPE_INCIDENT = """
- select punition, pps.proprietesScolarite.structureEnseignement, eleve.nom||' '||eleve.prenom, censeur.nom||' '||censeur.prenom, typeIncident.libelle
- from Punition as punition, PersonneProprietesScolarite as pps
- inner join punition.eleve as eleve
- inner join punition.censeur as censeur
- inner join fetch punition.typePunition as typePunition
- left join punition.incident.type as typeIncident
- where punition.etablissement.id = :etablissementId
- and eleve=pps.personne
- and pps.estActive=true
- and pps.proprietesScolarite.structureEnseignement.actif=true
- and pps.proprietesScolarite.structureEnseignement.type = :typeClasse
+ /**
+ * Pareil que SQL_PUNITION_TOUS avec en plus une restriction sur les élèves dans les with
+ */
+ private static final String SQL_PUNITION = """
+
+ with pps_dernier_debut as (
+ select
+ pps.personne_id as persEleveId,
+ max(pps.date_debut) as dernier_debut
+ from
+ ent.personne_propriete_scolarite pps
+ join ent.propriete_scolarite ps on pps.propriete_scolarite_id = ps.id and ps.fonction_id = :fonctionEleveId
+ join ent.structure_enseignement se on ps.structure_enseignement_id = se.id and se.type = :typeClasse and se.etablissement_id = :etablissementId
+ where
+ pps.personne_id in (:eleveIds)
+ group by pps.personne_id
+ ),
+
+ derniere_classe as (
+ select
+ pps.personne_id as eleve_id,
+ se.code as classe_code,
+ count(*) over() as nbrEleves
+ from
+ ent.personne_propriete_scolarite pps
+ join ent.propriete_scolarite ps on pps.propriete_scolarite_id = ps.id and ps.fonction_id = :fonctionEleveId
+ join ent.structure_enseignement se on ps.structure_enseignement_id = se.id and se.type = :typeClasse and se.etablissement_id = :etablissementId
+ join pps_dernier_debut der on der.persEleveId = pps.personne_id and der.dernier_debut = pps.date_debut
+ where
+ pps.personne_id in (:eleveIds)
+ )
+
+ select {punition.*},
+ derniere_classe.classe_code as codeClasse,
+ eleve.nom||' '||eleve.prenom as nomPrenomEleve,
+ censeur.nom||' '||censeur.prenom as nomPrenomCenseur,
+ type_incident.libelle as typeIncident,
+ count(*) OVER() as nbrPunitions
+ from
+ enttemps.punition
+ join ent.personne eleve on punition.eleve_id = eleve.id
+ join ent.personne censeur on punition.censeur_id = censeur.id
+ join enttemps.type_punition on punition.type_punition_id = type_punition.id
+ join derniere_classe on derniere_classe.eleve_id = eleve.id
+ left join enttemps.incident on punition.incident_id = incident.id
+ left join enttemps.type_incident on incident.type_id = type_incident.id
+ where
+ punition.etablissement_id = :etablissementId
+
"""
/**
/**
* Retourne une liste de punitions selon les critères
- * @param personne qui fait la requête
- * @return un PunitionListeInfo
*/
- Map findPunitions(SecuriteSession securiteSession,
+ Map findPunitions(SecuriteSession securiteSession,
Personne personne,
Etablissement etablissement,
String champOrdre,
Boolean ascendant,
Integer start,
Integer limit,
- Map criteres = [:],
- Boolean specialArchive = false) {
+ Map criteres = [:]) {
Map result = [
'nbPunitionsInfo': 0,
'punitionsInfo': []
]
- Map hqlParams = (Map) [
- etablissementId: etablissement.id,
- typeClasse: StructureEnseignement.TYPE_CLASSE
- ]
- String hqlFromPunition = findPunitionHqlFromPunition(specialArchive)
boolean personneIsEnseignant = droitsService.hasOnlyPerimetreEnseignement(
securiteSession
if (elevesEnseignant.size() == 0) {
return result
+ } else {
+ criteres.eleves = elevesEnseignant
}
-
- hqlFromPunition += ' and eleve in (:elevesEnseignant)'
- hqlParams.elevesEnseignant = elevesEnseignant
}
- if ((criteres.classes != null) && (criteres.classes.size() > 0)) {
- List<Personne> elevesClasse = scolariteService.findAllPersonneEleveForStructure(
+ if ((criteres.classes != null)
+ && (criteres.classes.size() > 0)
+ && !criteres.eleves ) {
+ List<Personne> elevesClasse =
+ scolariteService.findAllPersonneEleveForStructure(
securiteSession,
criteres.classes.collect {it.id}
)
if (elevesClasse.size() > 0) {
- hqlFromPunition += ' and eleve in (:elevesClasse)'
- hqlParams['elevesClasse'] = elevesClasse
+ criteres.eleves = elevesClasse
}
}
- hqlFromPunition = ajouteFiltresParCriteresSimples(hqlFromPunition, hqlParams, criteres)
+ Session session = sessionFactory.getCurrentSession()
- result['nbPunitionsInfo'] = comptePunitions(hqlFromPunition,
- hqlParams,
- !specialArchive)
+ SQLQuery sqlQuery = session.createSQLQuery(getSqlPunition(
+ champOrdre,
+ ascendant,
+ start,
+ limit,
+ criteres))
+ sqlQuery.addEntity("punition", Punition)
+ sqlQuery.addScalar('codeClasse', Hibernate.STRING)
+ sqlQuery.addScalar('nomPrenomEleve', Hibernate.STRING)
+ sqlQuery.addScalar('nomPrenomCenseur', Hibernate.STRING)
+ sqlQuery.addScalar('typeIncident', Hibernate.STRING)
+ sqlQuery.addScalar('nbrPunitions', Hibernate.LONG)
- String ordre = ascendant ? ' asc' : ' desc'
- String champ = getNomCompletChampOrdre(champOrdre)
- hqlFromPunition += ' order by ' + champ + ordre
+ sqlQuery.setLong("fonctionEleveId",
+ Fonction.findByCode(FonctionEnum.ELEVE.getCode(), [cache: true]).id)
+ sqlQuery.setLong('etablissementId',etablissement.id)
+ sqlQuery.setString('typeClasse','CLASSE')
- Map paginationMap = limit ? [max: limit, offset: start] : [:]
+ completeSqlQuery(sqlQuery, criteres, start, limit)
- result['punitionsInfo'] = Punition.executeQuery(
- hqlFromPunition,
- hqlParams,
- paginationMap
- )
+ List resultats = sqlQuery.list()
+
+ result['punitionsInfo'] = resultats
+ result['nbPunitionsInfo'] = resultats ? resultats[0][5] : 0
return result
}
- private Integer comptePunitions(String hqlPunitions, Map hqlParams, Boolean compter) {
- if(compter) {
- String hqlCount = hqlPunitions
- .replace(
- 'select punition, pps.proprietesScolarite.structureEnseignement',
- 'select count (distinct punition.id)'
- )
- .replaceAll(' join fetch ', ' join ')
+ private SQLQuery completeSqlQuery(SQLQuery sqlQuery,
+ Map criteres,
+ Integer offset,
+ Integer limit) {
- Punition.executeQuery(hqlCount, hqlParams).first()
- } else {
- 0
- }
- }
-
- private String ajouteFiltresParCriteresSimples(String hqlFromPunition,
- Map hqlParams,
- Map criteres) {
if (criteres.dateDebut != null) {
- hqlFromPunition += ' and punition.date >= :dateDebut'
- hqlParams['dateDebut'] = criteres.dateDebut
+ sqlQuery.setDate('dateDebut', criteres.dateDebut)
}
if (criteres.dateFin != null) {
- hqlFromPunition += ' and punition.date <= :dateFin'
- hqlParams['dateFin'] = criteres.dateFin
+ sqlQuery.setDate('dateFin', criteres.dateFin)
+ }
+
+ if ((criteres.eleves != null) && (criteres.eleves.size() > 0)) {
+ sqlQuery.setParameterList("eleveIds", criteres.eleves*.id)
+ }
+
+ if ((criteres.responsables != null) && (criteres.responsables.size() > 0)) {
+ sqlQuery.setParameterList("responsableIds", criteres.responsables*.id)
+ }
+
+ if ((criteres.typesPunition != null) && (criteres.typesPunition.size() > 0)) {
+ sqlQuery.setParameterList("typePunitionIds", criteres.typesPunition*.id)
+ }
+
+ if (criteres.effectue != null) {
+ sqlQuery.setBoolean('effectue', criteres.effectue)
+ }
+
+ if (offset != null) {
+ sqlQuery.setInteger('offset',offset)
+ }
+ if (limit != null) {
+ sqlQuery.setInteger('limit',limit)
}
+ sqlQuery
+ }
+
+ private String getSqlPunition(String champOrdre,
+ Boolean ascendant,
+ Integer start,
+ Integer limit,
+ Map criteres) {
+
+ def sql
+
+
if ((criteres.eleves != null) && (criteres.eleves.size() > 0)) {
- hqlFromPunition += ' and eleve in (:eleves)'
- hqlParams['eleves'] = criteres.eleves
+ sql = SQL_PUNITION
+ sql <<= ' and punition.eleve_id in (:eleveIds)'
+ } else {
+ sql = SQL_PUNITION_TOUS
+ }
+
+ if (criteres.dateDebut != null) {
+ sql <<= ' and punition.date >= :dateDebut'
+ }
+
+ if (criteres.dateFin != null) {
+ sql <<= ' and punition.date <= :dateFin'
}
if ((criteres.responsables != null) && (criteres.responsables.size() > 0)) {
- hqlFromPunition += ' and punition.censeur in (:responsables)'
- hqlParams['responsables'] = criteres.responsables
+ sql <<= ' and punition.censeur_id in (:responsableIds)'
}
if ((criteres.typesPunition != null) && (criteres.typesPunition.size() > 0)) {
- hqlFromPunition += ' and punition.typePunition in (:typesPunition)'
- hqlParams['typesPunition'] = criteres.typesPunition
+ sql <<= ' and punition.typePunition_id in (:typePunitionIds)'
}
if (criteres.effectue != null) {
- hqlFromPunition += ' and punition.effectue = :effectue'
- hqlParams['effectue'] = criteres.effectue
+ sql <<= ' and punition.effectue = :effectue'
+ }
+
+ // tri et pagination
+ String ordre = ascendant ? ' asc' : ' desc'
+ String champ = getNomCompletChampOrdre(champOrdre)
+ sql <<= ' order by ' + champ + ordre
+ if(start != null) {
+ sql <<= " offset :offset"
+ }
+ if (limit != null) {
+ sql <<= " limit :limit"
}
- hqlFromPunition
+
+ sql
}
private String getNomCompletChampOrdre(String champOrdre) {
champ = 'punition.date'
break
case ConsultationPunitionSanctionNomColonnes.ELEVE_ID:
- champ = 'punition.eleve.id'
+ champ = 'punition.eleve_id'
break
case ConsultationPunitionSanctionNomColonnes.NOM_AFFICHAGE:
- champ = 'punition.eleve.nom, punition.eleve.prenom'
+ champ = 'eleve.nom, eleve.prenom'
break
case ConsultationPunitionSanctionNomColonnes.TYPE:
- champ = 'punition.typePunition.libelle'
+ champ = 'type_punition.libelle'
break
case ConsultationPunitionSanctionNomColonnes.CENSEUR:
- champ = 'punition.eleve.nom, punition.eleve.prenom'
+ champ = 'censeur.nom, censeur.prenom'
break
case ConsultationPunitionSanctionNomColonnes.STATUT:
champ = 'punition.effectue'
break
case ConsultationPunitionSanctionNomColonnes.CLASSE:
- champ = 'pps.proprietesScolarite.structureEnseignement.code'
+ champ = 'derniere_classe.classe_code'
break
}
return champ
}
-
- private String findPunitionHqlFromPunition(Boolean avecTypeIncident) {
- return avecTypeIncident ? HQL_PUNITION_AVEC_TYPE_INCIDENT : HQL_PUNITION
- }
-
}