import org.lilie.services.eliot.scolarite.StructureEnseignement
import org.lilie.services.eliot.absences.Appel
import org.lilie.services.eliot.absences.AppelLigne
-import org.lilie.services.eliot.temps.Time
+
import org.lilie.services.eliot.absences.saisie.absencejournee.AbsenceJourneeLigneInfo
import org.lilie.services.eliot.absences.saisie.absencejournee.AbsenceJourneeParams
import org.lilie.services.eliot.absences.saisie.absencejournee.AbsenceJourneeService
import org.lilie.services.eliot.parametrages.calendrier.JourFerieInfo
import org.lilie.services.eliot.parametrages.calendrier.PlageHoraireService
+import org.lilie.services.eliot.absences.saisie.emploidutemps.EmploiDuTempsService
+import org.lilie.services.eliot.absences.saisie.emploidutemps.EmploiDuTemps
+
class SaisieHebdomadaireService {
CalendrierService calendrierService
AbsenceJourneeService absenceJourneeService
PlageHoraireService plageHoraireService
+ EmploiDuTempsService emploiDuTempsService
private static final String PREFIXE_CODE_MESSAGE_ABREVIATION_JOUR =
- 'absences.saisie.hebdomadaire.libelle.jour'
+ 'absences.saisie.hebdomadaire.libelle.jour'
static transactional = true
* @return une List<AbsenceJourneeLigneInfo>
*/
List<AbsenceJourneeLigneInfo> enregistreSaisieHebdo(
- SecuriteSession securiteSession,
- List<AbsenceJourneeParams> absenceJournees) {
+ SecuriteSession securiteSession,
+ List<AbsenceJourneeParams> absenceJournees) {
List<AbsenceJourneeLigneInfo> result = []
absenceJournees.each { AbsenceJourneeParams absenceJourneeParams ->
List<AbsenceJourneeLigneInfo> lignes = absenceJourneeService.
enregistreAbsenceJournee(
- securiteSession,
- absenceJourneeParams
- )
+ securiteSession,
+ absenceJourneeParams
+ )
//on complète le résultat en injectant le numéro du jour
lignes.each {
it.jourId = absenceJourneeParams.numJour
* @param eleve : élève dont on veut les absences
* @return une liste de map
*/
- List findAbsencesInfoForEleveAndPeriode(PreferencesEtablissementAbsences pref,
- Date dateDebut,
- Personne eleve,
- StructureEnseignement classeEleve,
- SimpleDateFormat sdf) {
+ List<LigneCalendrier> findAbsencesInfoForEleveAndPeriode(
+ SecuriteSession securiteSession,
+ PreferencesEtablissementAbsences pref,
+ Date dateDebut,
+ Personne eleve,
+ StructureEnseignement classeEleve,
+ SimpleDateFormat sdf) {
Calendar calDebut = Calendar.getInstance()
calDebut.setTime(dateDebut)
DateUtil.setDebutJour(calDebut)
calFin.getTime()
)
+ List<EmploiDuTemps> emploiDuTemps = emploiDuTempsService.
+ findEmploiDuTempsEleveForPeriode(
+ securiteSession,
+ eleve,
+ calDebut.getTime(),
+ calFin.getTime(),
+ plages
+ )
+
return creeGrilleAbsencesInfos(
calendrierService.getCalendrierForEtablissement(pref.etablissement),
pref,
appelsDatas,
absencesAppels,
absencesJournees,
+ emploiDuTemps,
dateDebut,
sdf
)
* @param dateFin
* @return
*/
- List<AppelLigne> findAbsencesJourneesForEleveAndPeriode(Personne eleve,
- Date dateDebut,
- Date dateFin) {
+ private List<AppelLigne> findAbsencesJourneesForEleveAndPeriode(Personne eleve,
+ Date dateDebut,
+ Date dateFin) {
String hql = """
from AppelLigne al
inner join fetch al.absenceJournee j
* @param dateFin
* @return une liste d'AppelLigne
*/
- List<AppelLigne> findAbsencesAppelsForEleveAndPeriode(Personne eleve,
- Date dateDebut,
- Date dateFin) {
+ private List<AppelLigne> findAbsencesAppelsForEleveAndPeriode(Personne eleve,
+ Date dateDebut,
+ Date dateFin) {
String hql = """
from AppelLigne al
inner join fetch al.appel a
* - id de l'appel
* - date et heure de début de l'appel
*/
- List findAppelsDatasForClasseAndPeriode(StructureEnseignement classe,
- Date dateDebut,
- Date dateFin) {
+ private List findAppelsDatasForClasseAndPeriode(StructureEnseignement classe,
+ Date dateDebut,
+ Date dateFin) {
String hql = """
select p.id, a.id, a.dateHeureDebut
from Appel a
* @param appelDatas
* @return une liste de Map
*/
- private List creeGrilleAbsencesInfos(Calendrier calendrier,
- PreferencesEtablissementAbsences pref,
- List<PlageHoraire> plageHoraires,
- List appelDatas,
- List<AppelLigne> absencesAppels,
- List<AppelLigne> absencesJournees,
- Date dateDebut,
- SimpleDateFormat sdf) {
- List result = []
+ private List<LigneCalendrier> creeGrilleAbsencesInfos(
+ Calendrier calendrier,
+ PreferencesEtablissementAbsences pref,
+ List<PlageHoraire> plageHoraires,
+ List appelDatas,
+ List<AppelLigne> absencesAppels,
+ List<AppelLigne> absencesJournees,
+ List<EmploiDuTemps> emploiDuTemps,
+ Date dateDebut,
+ SimpleDateFormat sdf) {
+ List<LigneCalendrier> result = []
List<JourFerieInfo> jourFeries = calendrierService.
getJourFeriesInfoForPreferenceEtablissement(
- pref
- )
+ pref
+ )
plageHoraires.each { PlageHoraire plageHoraire -> // Note JTRA: N+1 SELECT ? (à vérifier)
- Map plageGrille = (Map) [:]
- plageGrille.dateDebut = plageHoraire.debut
- plageGrille.dateFin = plageHoraire.fin
- plageGrille.plageHoraireId = plageHoraire.id
- plageGrille.matin = plageHoraire.matin
+ LigneCalendrier ligneCalendrier = new LigneCalendrier(
+ dateDebut: plageHoraire.debut,
+ dateFin: plageHoraire.fin,
+ plageHoraire: plageHoraire,
+ matin: plageHoraire.matin
+ )
for (int jour = 1; jour <= 7; jour++) {
- traiteUnJour(
- plageGrille,
- jour,
- plageHoraire,
- dateDebut,
- sdf,
- jourFeries,
- calendrier,
- appelDatas,
- absencesAppels,
- absencesJournees)
+ ligneCalendrier.jours <<
+ traiteUnJour(
+ jour,
+ plageHoraire,
+ dateDebut,
+ jourFeries,
+ calendrier,
+ appelDatas,
+ absencesAppels,
+ absencesJournees,
+ emploiDuTemps
+ )
}
- result << plageGrille
+ result << ligneCalendrier
}
return result
}
* @param absencesAppels
* @param absencesJournees
*/
- void traiteUnJour(Map plageGrille, Integer jour, PlageHoraire plageHoraire,
- Date dateDebut, SimpleDateFormat sdf,
- List<JourFerieInfo> jourFeries, Calendrier calendrier,
- List appelDatas,
- List<AppelLigne> absencesAppels,
- List<AppelLigne> absencesJournees) {
-
- Boolean plageOuverte = true
- String nomChamp = 'jour' + jour.toString()
-
- if (jour == calendrier.jourSemaineFerie) {
- plageOuverte = false
- } else {
- // On vérifie si ce n'est pas un jour ferié
- plageOuverte = plageHoraireService.isPlageHoraireOuverte(
- dateDebut + jour - 1,
- jourFeries,
- plageHoraire,
- calendrier
- )
- }
+ private CelluleCalendrier traiteUnJour(
+ Integer jour,
+ PlageHoraire plageHoraire,
+ Date dateDebut,
+ List<JourFerieInfo> jourFeries,
+ Calendrier calendrier,
+ List appelDatas,
+ List<AppelLigne> absencesAppels,
+ List<AppelLigne> absencesJournees,
+ List<EmploiDuTemps> emploiDuTemps) {
+
+ boolean plageOuverte = isPlageOuverte(
+ jour,
+ calendrier,
+ dateDebut,
+ jourFeries,
+ plageHoraire
+ )
Long appelId = getIdAppelEffectue(
appelDatas,
plageHoraire
)
+ AppelLigne appelLigne = findAppelLigne(
+ appelId,
+ absencesAppels,
+ dateDebut,
+ jour,
+ plageHoraire,
+ absencesJournees
+ )
+
+ //On recherche dans les absences journée les absences
+ //non modifiables
+ AppelLigne appelLignePersistante = getAppelLignePersistantesForDate(
+ absencesJournees,
+ dateDebut + jour - 1,
+ plageHoraire
+ )
+
+ EmploiDuTemps emploiDuTempsInfo = emploiDuTemps.find {
+ EmploiDuTemps emploiDuTempsInfo ->
+ emploiDuTempsInfo.idPlageHoraire == plageHoraire.id &&
+ emploiDuTempsInfo.jour == (dateDebut + jour - 1)
+ }
+
+ CelluleCalendrier celluleCalendrier = new CelluleCalendrier(
+ numeroJour: jour,
+ plageOuverte: plageOuverte,
+ appelId: appelId,
+ appelPlageHoraires: getPlagesHorairesForAppelId(appelId),
+ appelLigne: appelLigne,
+ appelLignePersistant: appelLignePersistante,
+ emploiDuTempsInfo: emploiDuTempsInfo
+ )
+ return celluleCalendrier
+ }
+
+ /**
+ * @param appelId
+ * @param absencesAppels
+ * @param dateDebut
+ * @param jour
+ * @param plageHoraire
+ * @param absencesJournees
+ * @return l'Appel correspondant aux critères
+ */
+ private AppelLigne findAppelLigne(Long appelId,
+ List<AppelLigne> absencesAppels,
+ Date dateDebut,
+ int jour,
+ PlageHoraire plageHoraire,
+ List<AppelLigne> absencesJournees) {
AppelLigne appelLigne = null
//Recherche dans les appels
}
//On recherche d'autres absences associées à des appels différents
- if(!appelLigne){
+ if (!appelLigne) {
appelLigne = getAppelLigneForJourAndPlage(
absencesAppels,
dateDebut + jour - 1,
plageHoraire
)
}
+ appelLigne
+ }
- plageGrille."$nomChamp" = [
- etatJour: (plageOuverte ? 0 : 1),
- appelEffectue: (appelId != null),
- appelId: appelId,
- appelPlageHoraireIds: getPlagesHorairesForAppel(appelId)
- ]
- if (plageOuverte) {
- //si on a trouvé une absence, on ajoute les informations
- if (appelLigne) {
- plageGrille."$nomChamp".absence = getInfosAbsence(
- appelLigne,
- plageHoraire,
- jour,
- sdf)
- }
+ /**
+ * @param jour
+ * @param calendrier
+ * @param dateDebut
+ * @param jourFeries
+ * @param plageHoraire
+ * @return true si la plage horaire est ouverte
+ */
+ private boolean isPlageOuverte(int jour,
+ Calendrier calendrier,
+ Date dateDebut,
+ List<JourFerieInfo> jourFeries,
+ PlageHoraire plageHoraire) {
+ Boolean plageOuverte
- //On recherche dans les absences journée les absences
- //non modifiables
- appelLigne = getAppelLignePersistantesForDate(
- absencesJournees,
+ if (jour == calendrier.jourSemaineFerie) {
+ plageOuverte = false
+ } else {
+ // On vérifie si ce n'est pas un jour ferié
+ plageOuverte = plageHoraireService.isPlageHoraireOuverte(
dateDebut + jour - 1,
- plageHoraire
+ jourFeries,
+ plageHoraire,
+ calendrier
)
- if (appelLigne) {
- plageGrille."$nomChamp".absencePersistante = getInfosAbsence(
- appelLigne,
- plageHoraire,
- jour,
- sdf
- )
- }
}
+ plageOuverte
}
/**
AppelLigne result = null
appelLignes.each {
AppelLigne appelLigne ->
- if(DateUtil.getDebutJour(
+ if (DateUtil.getDebutJour(
DateUtil.getCalendarForDate(appelLigne.appel.dateHeureDebut)
- ).getTime() == date){
- if(appelLigne.appel.plageHoraires.find{it.id == plageHoraire.id}){
+ ).getTime() == date) {
+ if (appelLigne.appel.plageHoraires.find {it.id == plageHoraire.id}) {
result = appelLigne
}
}
* @param appelId
* @return
*/
- List getPlagesHorairesForAppel(Long appelId) {
- List<PlageHoraire> resultats = appelId ? (Appel.get(appelId).plageHoraires).toList() : null
+ List<PlageHoraire> getPlagesHorairesForAppelId(Long appelId) {
+ List<PlageHoraire> resultats =
+ appelId ? (Appel.get(appelId).plageHoraires).toList() : null
if (resultats) {
resultats.sort { PlageHoraire plage ->
plage.debut
}
}
- return resultats*.id
+ return resultats
}
/**
}
}
- /**
- * Retourne sous la forme d'une map les informations de l'AppelLigne
- * @param appelLigne
- * @return une Map
- */
- Map getInfosAbsence(AppelLigne appelLigne, PlageHoraire plage, Integer jourId,
- SimpleDateFormat sdf) {
- Boolean depart = appelLigne.departAnticipe
- Boolean retard = appelLigne.retard
- Boolean absence = !appelLigne.presence
- Date heureDepart = appelLigne.heureDepart
- Date heureArrivee = appelLigne.heureArrivee
-
- if (appelLigne.absenceJournee) {
- //on détermine s'il s'agit d'une absence, d'un retard ou un retard
- if (appelLigne.heureArrivee != null && appelLigne.heureArrivee > plage.debut) {
- retard = true
- absence = false
- heureArrivee = new Time(appelLigne.heureArrivee)
- } else {
- if (appelLigne.heureDepart != null && appelLigne.heureDepart < plage.fin) {
- depart = true
- absence = false
- heureDepart = new Time(appelLigne.heureDepart)
- } else {
- absence = true
- }
- }
- } else {
- if (retard || depart) {
- List<PlageHoraire> plageAppels = appelLigne.appel.plageHoraires.toList()
- plageAppels.sort {
- PlageHoraire plage1, PlageHoraire plage2 ->
- plage1.debut <=> plage2.debut
- }
-
- //on n'affiche le retard que sur la première plage de l'appel
- if (retard) {
- if (plage.id != plageAppels[0].id) {
- retard = false
- }
- }
-
- //on n'affiche le départ anticipé que sur la dernière plage de l'appel
- if (depart) {
- if (plage.id != plageAppels[plageAppels.size() - 1].id) {
- depart = false
- }
- }
- }
- }
-
- return [
- appelLigneId: appelLigne.id,
- absence: absence,
- couleur: appelLigne.motif.couleur,
- depart: depart,
- motifId: appelLigne.motif.id,
- valable: ((!appelLigne.absencePrevisionnelle) &&
- appelLigne.absenceJustifiee),
- nonValable: ((!appelLigne.absencePrevisionnelle) &&
- !appelLigne.absenceJustifiee),
- previsionnel: appelLigne.absencePrevisionnelle,
- retard: retard,
- heureArrivee: heureArrivee ? sdf.format(heureArrivee) : null,
- heureDepart: heureDepart ? sdf.format(heureDepart) : null,
- commentaireArrivee: appelLigne.commentaireArrivee,
- commentaireDepart: appelLigne.commentaireDepart,
- jourId: jourId
- ]
- }
-
/**
* 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
* @param plageHoraire : la plage sélectionnée
* @return l'id de l'appel ou null
*/
- private Long getIdAppelEffectue(List appelsDatas, Date jour, PlageHoraire plageHoraire) {
+ private Long getIdAppelEffectue(List appelsDatas,
+ Date jour,
+ PlageHoraire plageHoraire) {
def appelDatas = appelsDatas.find {
it[0] == plageHoraire.id &&
jour <= it[2] &&