package org.lilie.services.eliot.impression.requetage
import org.lilie.services.eliot.annuaire.SecuriteSession
-
import org.lilie.services.eliot.applications.absences.BasicCriteresRecherche
import org.lilie.services.eliot.absences.AppelLigne
import org.lilie.services.eliot.applications.absences.BilanService
import org.lilie.services.eliot.applications.absences.StatAbsences
import org.lilie.services.eliot.impression.donnees.eleve.absences.AbsencesImpression
import org.lilie.services.eliot.impression.donnees.eleve.EleveImpressionInfo
-import org.lilie.services.eliot.impression.donnees.eleve.absences.RetardImpression
import org.lilie.services.eliot.scolarite.structureenseignement.LocalStructureEnseignementService
import org.lilie.services.eliot.securite.impl.Autorite
import org.lilie.services.eliot.temps.DateUtil
import org.lilie.services.eliot.scolarite.*
import org.lilie.services.eliot.impression.ImpressionRequetageService
-import org.lilie.services.eliot.absences.GroupeMotif
-import org.lilie.services.eliot.absences.Motif
import org.lilie.services.eliot.LocalAutoriteService
import org.lilie.services.eliot.impression.publipostage.PublipostageAbsencesParams
import org.codehaus.groovy.grails.web.json.JSONObject
*/
class ImpressionRequetageAbsencesService {
- private final static int ABSENCES_VALABLES = 1
- private final static int ABSENCES_NON_VALABLES = 2
- private final static int ABSENCES_PREVISIONNELLES = 3
- private final static int RETARDS = 4
- private final static int DEPART_ANTICIPE = 5
- private final static int DEMI_PENSION = 6
- private final static int INTERNAT = 7
-
protected final static String SELECTION_ABSENCE = "absence"
protected final static String SELECTION_RETARD = "retard"
ImpressionRegroupementAbsencesService impressionRegroupementAbsencesService
MotifService motifService
ImpressionRequetageSanctionPunitionService impressionRequetageSanctionPunitionService
+ ImpressionRetardDepartService impressionRetardDepartService
private final static String CODE_MESSAGE_DEMI_PENSION = "Demi-pension"//message(code: 'absences.menu.publipostage.selection.heure.demi-pension')
private final static String CODE_MESSAGE_INTERNAT = "Internat" //message(code: 'absences.menu.publipostage.selection.heure.internat')
List<Personne> eleves,
TypePeriode typePeriode,
List<EleveImpressionInfo> eleveImpressionInfos,
- Boolean ajouteDetailsRetards = true,
+ ImpressionRequetageSelection impressionRequetageSelection,
PriseEnCompteMotif priseEnCompteMotif = PriseEnCompteMotif.TOUS
) {
criteres.dateDebut.setTime(periode.dateDebut)
criteres.dateFin.setTime(periode.dateFin)
- eleveImpressionInfos = findAllInfoRetardDepartEleve(
+ eleveImpressionInfos = impressionRetardDepartService.findAllInfoRetardDepartEleve(
criteres,
eleveImpressionInfos,
- ajouteDetailsRetards
+ impressionRequetageSelection
)
}
return eleveImpressionInfos
}
-/**
- * Lecture des données des élèves pour le publipostage pour les retards
- *
- * @author bahj
- * @param securiteSession la session courante
- * @param etablissement établissement courant
- * @param criteres représente l'ensemble des critères des retards
- *
- */
- public List<EleveImpressionInfo> findAllInfoForRetardsAndDepartAnticipes(SecuriteSession securiteSession,
- Etablissement etablissement,
- BasicCriteresRecherche criteres,
- SelectionAdresseResponsableEnum selectionAdresseResponsableEnum,
- Boolean ajouteDetailsRetards = true
- ) {
-
- List<Personne> eleves = localPersonneService.findAllPersonneBySetAutorite(
- (Set) Autorite.getAll(criteres.eleveIds)
- )
-
- ImpressionInfoGenerale impressionInfoGenerale = new ImpressionInfoGenerale(
- allEleves: eleves,
- adresseResponsableEnum: selectionAdresseResponsableEnum,
- etablissement: etablissement,
- elevesIds: criteres.eleveIds,
- typesResponsables: criteres.typesResponsables
- )
-
- List<EleveImpressionInfo> eleveImpressionInfos =
- impressionRequetageService.findAllInfoGeneralesEleve(
- impressionInfoGenerale,
- )
-
- eleveImpressionInfos = findAllInfoRetardDepartEleve(
- criteres,
- eleveImpressionInfos,
- ajouteDetailsRetards
- )
-
- return eleveImpressionInfos
-
- }
-
/**
* Lecture des données personne pour le publipostage des absences
*
* @param etablissement l'établissement courant
* @param criteres représente l'ensemble des critères d'absences
*/
- public List<EleveImpressionInfo> findAllInfoForAbsences(
- SecuriteSession securiteSession,
+ public List<EleveImpressionInfo> findAllInfoForAbsences(SecuriteSession securiteSession,
Etablissement etablissement,
BasicCriteresRecherche criteres,
SelectionAdresseResponsableEnum selectionAdresseResponsableEnum,
)
if (log.infoEnabled) {
- log.info "informations générales récupérées"
+ log.info "Informations générales récupérées"
}
eleveImpressionInfos = findAllInfoAbsenceEleve(
etablissement,
criteres,
- eleveImpressionInfos
+ eleveImpressionInfos,
+ ajouteDetailsAbsences
)
if (log.infoEnabled) {
- log.info "findAllInfoForAbsences terminé"
+ log.info "FindAllInfoForAbsences terminé"
}
eleveImpressionInfos = impressionRequetageSanctionPunitionService.findAllInfoPunitionSanctionEleve(
remplisDatesAbsences(eleveImpressionInfos)
if (log.infoEnabled) {
- log.info("remplisDatesAbsences terminé")
+ log.info("RemplisDatesAbsences terminé")
}
impressionRegroupementAbsencesService.fusionnePeriodesEleves(
)
if (log.infoEnabled) {
- log.info "fusion périodes absences terminé"
+ log.info "Fusion périodes absences terminé"
}
impressionRequetageService.triEleves(eleveImpressionInfos)
* Rempli datesAbsence dans eleveImpressionInfos en utilisant l'info sur les
* absences deja presant dans eleveImpressionInfos
*/
- void remplisDatesAbsences(List<EleveImpressionInfo> eleveImpressionInfos) {
+ private void remplisDatesAbsences(List<EleveImpressionInfo> eleveImpressionInfos) {
eleveImpressionInfos.each { EleveImpressionInfo eleveImpressionInfo ->
List<AbsencesImpression> absInfos = eleveImpressionInfo.absences
- List<Date> dateAbsences = absInfos.collect { getPartDate(it.date) }
+ List<Date> dateAbsences = absInfos.collect {
+ ImpressionRequetageHelper.getPartDate(it.date)
+ }
eleveImpressionInfo.datesAbsence = dateAbsences?.sort { it }?.unique()?.
toList()?.reverse()
}
Boolean ajouteDetailsAbsences = true
) {
- gestionDateDebutDateFinRequete(eleveImpressionInfos, criteres)
+ ImpressionRequetageHelper.gestionDateDebutDateFinRequete(eleveImpressionInfos, criteres)
// les critères de types d'absences ne doivent servir que pour filtrer les élèves,
- // mais pas pour publiposter
- setCriteresPublipostageAbsences(criteres)
+ // mais pas pour publiposter
+ ImpressionRequetageHelper.setCriteresPublipostageAbsences(criteres)
BilanAbsencesParPersonneInfo bilanAbsencesParPersonneInfo = bilanService.
getAbsencesOrRetards(criteres)
return eleveImpressionInfos
}
-/**
- * Retrouve les informations de retards concernant la liste des informations d'éléves
- *
- * @author bahj
- * @param etablissement l'établissement courant
- * @param criteres les critères de recherche des retrads
- *
- */
- private List<EleveImpressionInfo> findAllInfoRetardDepartEleve(BasicCriteresRecherche criteres,
- List<EleveImpressionInfo> eleveImpressionInfos,
- Boolean ajouteDetailsRetards = true
- ) {
-
- gestionDateDebutDateFinRequete(eleveImpressionInfos, criteres)
-
- BilanAbsencesParPersonneInfo resultatsRetard = bilanService.getAbsencesOrRetards(criteres)
-
- if (ajouteDetailsRetards) {
- eleveImpressionInfos = addRetardsImpressionInfo(
- resultatsRetard,
- eleveImpressionInfos
- )
- }
-
- Map elevesRetard = bilanService.calculeNbRetardsParEleve(resultatsRetard)
-
- elevesRetard.each {Personne eleve, Integer nbRetards ->
-
- EleveImpressionInfo impressionInfo =
- (EleveImpressionInfo) eleveImpressionInfos.find {
- it.personne == eleve
- }
-
- impressionInfo.eleve_NbRetard = nbRetards
- }
-
- criteres.retards = false
- criteres.departsAnticipes = true
- BilanAbsencesParPersonneInfo resultatsDepart = bilanService.getAbsencesOrRetards(criteres)
-
- Map elevesDepartAnticipe = bilanService.calculeNbDepartAnticipesParEleve(resultatsDepart)
-
- elevesDepartAnticipe.each {Personne eleve, Integer nbDepartAnticipes ->
-
- EleveImpressionInfo impressionInfo =
- (EleveImpressionInfo) eleveImpressionInfos.find {
- it.personne == eleve
- }
-
- impressionInfo.eleve_NbDepAnti = nbDepartAnticipes
- }
-
-
- return eleveImpressionInfos
- }
-
- /**
- * Gestion des dates de début et de fin de période
- */
- private void gestionDateDebutDateFinRequete(List<EleveImpressionInfo> eleveImpressionInfos,
- BasicCriteresRecherche criteres) {
- eleveImpressionInfos.each {
- EleveImpressionInfo eleveImpressionInfo ->
- eleveImpressionInfo.setPeriodeDebut(criteres.dateDebut.getTime())
- eleveImpressionInfo.setPeriodeFin(criteres.dateFin.getTime())
- }
- }
-
/**
* Ajoute les informations des absences des élèves dans les dto
*
return eleveImpressionInfos
}
- /**
- * Additionne les heures à la date du jour
- * @param dateDuJour : exemple 12/12/2010
- * @param heure : exemple 8H35
- * @return 12/12/2010 8H35
- */
- public Date ajouteHeure(Date dateDuJour, Date heure) {
- Calendar calendar = Calendar.getInstance()
- calendar.setTime(heure)
- Integer iMillisecond = heure.getTime() +
- calendar.get(Calendar.ZONE_OFFSET) +
- calendar.get(Calendar.DST_OFFSET)
- return DateUtils.addMilliseconds(dateDuJour, iMillisecond)
- }
-
- /**
- * Ajoute les informations des retards des élèves dans les dto
- *
- * @author bahj
- * @param datas les retrads des élèves sous la forme :
- * - l'Appel
- * - l'AppelLigne
- * - la StructureEnseignement
- * - la Personne élève
- * - l'absenceJournee
- *
- */
- private List<EleveImpressionInfo> addRetardsImpressionInfo(BilanAbsencesParPersonneInfo datas,
- List<EleveImpressionInfo> eleveImpressionInfos
- ) {
-
- datas.eachAbsence { Personne personne, BilanAbsenceInfo bilanAbsenceInfo ->
-
- EleveImpressionInfo eleveInfo = (EleveImpressionInfo) eleveImpressionInfos.find {
- it.personne == (Personne) personne
- }
-
- AppelLigne appelLigne = bilanAbsenceInfo.appelLigne
-
- if (bilanAbsenceInfo.appelLigne.retard) {
- eleveInfo.retards << new RetardImpression(
- date: appelLigne.appel ?
- appelLigne.appel.dateHeureDebut :
- appelLigne.absenceJournee.date,
- heureDebut: appelLigne.appel ?
- DateUtil.formateDate(appelLigne.appel.dateHeureDebut) :
- DateUtil.formateDate(appelLigne.heureDebut),
- heureFin: DateUtil.formateDate(appelLigne.heureArrivee),
- motif: appelLigne.motif.libelle
- )
- }
- }
-
- return eleveImpressionInfos
- }
-
public PublipostageCriteresRecherche parseCriteriaRetards(PublipostageAbsencesParams parametresSelectionPublipostage) {
- PublipostageCriteresRecherche result = parseCriteriaCommuns(parametresSelectionPublipostage)
+ PublipostageCriteresRecherche result = ParseCriteriaHelper.parseCriteriaCommuns(parametresSelectionPublipostage)
result.setTousTypes(false)
result.retards = true
return result
}
-/**
- * Récupère les paramètres de motifs
- * @param params : les paramètres de la requêtes
- * @param criteria : le criteria à compléter
- * @return un BilanCriteria complété avec les motifs
- * @author jbui
- */
- protected void parseCriteriaMotifs(def listeMotifs, listeGroupeMotifs, BasicCriteresRecherche criteria) {
- if (listeMotifs) {
- criteria.motifIds = (listeMotifs as String).split(',').collect {
- Long.parseLong(it)
- }
- } else {
- criteria.motifIds = []
- }
- if ((criteria.motifIds.size() > 0) &&
- (criteria.motifIds[0] == BasicCriteresRecherche.VALEUR_TOUS)) {
- parseCriteriaGroupeMotifs(listeGroupeMotifs, criteria)
- }
- }
-
-/**
- * Récupère les motifs associés aux groupes de motifs
- * @param params : les paramètres de la requête
- * @param bilanCriteria : le BilanCriteria à compléter
- * @author jbui
- */
- protected void parseCriteriaGroupeMotifs(def listeGroupeMotifs,
- BasicCriteresRecherche bilanCriteria) {
- List<Long> groupeMotifs
- if (listeGroupeMotifs) {
- groupeMotifs = (listeGroupeMotifs as String).split(',').collect {
- Long.parseLong(it)
- }
- } else {
- groupeMotifs = []
- }
- bilanCriteria.motifIds.clear()
- if ((groupeMotifs.size() > 0) && (groupeMotifs[0] == BasicCriteresRecherche.VALEUR_TOUS)) {
- bilanCriteria.motifIds << BasicCriteresRecherche.VALEUR_TOUS
- } else {
- groupeMotifs.each {
- bilanCriteria.motifIds.addAll(
- Motif.findAllByGroupeMotif(
- GroupeMotif.get(it)
- )*.id)
- }
- }
- }
-
-/**
- * Récupère les paramètres de dates
- * @param params : les paramètres de la requêtes
- * @return un BilanCriteria complété avec les dates
- * @author jbui
- */
- protected void parseBilanCriteriaDates(PublipostageAbsencesParams parametresSelectionPublipostage,
- BasicCriteresRecherche criteria) {
- String dateDebut = parametresSelectionPublipostage.dateDebut
- String dateFin = parametresSelectionPublipostage.dateFin
-
- criteria.dateDebut.setTime(
- DateUtil.parseDateJavascript(dateDebut)
- )
-
- criteria.dateFin.setTime(
- DateUtil.parseDateJavascript(dateFin)
- )
-
- DateUtil.setFinJour(criteria.dateFin)
- }
-
-/**
- * Récupère les paramètres de type
- * @param params : les paramètres de la requêtes
- * @return un BilanCriteria complété avec les types
- * @author jbui
- * @author bahj
- */
- protected void parseBilanCriteriaType(def listeTypes, BasicCriteresRecherche criteria) {
- List<Integer> typesEnInt
- if (listeTypes) {
- typesEnInt = (listeTypes as String).split(',').collect {
- Integer.parseInt((String) it)
- }
- } else {
- typesEnInt = []
- }
- if (typesEnInt.contains(BasicCriteresRecherche.VALEUR_TOUS as Integer)) {
- criteria.setTousTypes(true)
- }
- else {
- criteria.setTousTypes(false)
- for (int type : typesEnInt) {
- switch (type) {
- case ABSENCES_VALABLES:
- criteria.absencesValables = true
- break
-
- case ABSENCES_NON_VALABLES:
- criteria.absencesNonValables = true
- break
-
- case ABSENCES_PREVISIONNELLES:
- criteria.absencesPrevisionnelles = true
- break
-
- case RETARDS:
- criteria.retards = true
- break
-
- case DEPART_ANTICIPE:
- criteria.departsAnticipes = true
- break
-
- case DEMI_PENSION:
- criteria.demiPension = true
- break
-
- case INTERNAT:
- criteria.internat = true
- break
-
- }
- }
- }
- }
-
-
- private PublipostageCriteresRecherche parseCriteriaCommuns(PublipostageAbsencesParams parametresSelectionPublipostage) {
- PublipostageCriteresRecherche result = new PublipostageCriteresRecherche()
-
- parseCriteriaMotifs(
- parametresSelectionPublipostage.motifId,
- parametresSelectionPublipostage.groupeDeMotifId,
- result)
-
- parseBilanCriteriaDates(
- parametresSelectionPublipostage,
- result
- )
-
- parseBilanCriteriaDivisions(
- parametresSelectionPublipostage.classesId,
- result
- )
-
- parseBilanCriteriaType(
- parametresSelectionPublipostage.typeAbsenceId,
- result
- )
-
- result.nbLimit = parametresSelectionPublipostage.limitAbsence
- return result
- }
-
-/**
- * Récupère les paramètres de divisions
- * @param params : les paramètres de la requêtes
- * @return un BilanCriteria complété avec les divisions
- * @author jbui
- */
- protected void parseBilanCriteriaDivisions(def listeDivisions, BasicCriteresRecherche criteria) {
- if (listeDivisions) {
- criteria.structIds = (listeDivisions as String).split(',').collect {
- Long.parseLong(it)
- }
- } else {
- criteria.structIds = []
- }
- }
-
- /**
- * lecture de la liste des élèves à partir des paramètres.
- * @return la liste des id des élèves
- */
- public List getListeEleve(PublipostageAbsencesParams parametresSelectionPublipostage) {
- return parametresSelectionPublipostage.elevesSelectionnes
- }
-
public PublipostageCriteresRecherche parseCriteriaAbsences(PublipostageAbsencesParams parametresSelectionPublipostage) {
- PublipostageCriteresRecherche result = parseCriteriaCommuns(parametresSelectionPublipostage)
+ PublipostageCriteresRecherche result = ParseCriteriaHelper.parseCriteriaCommuns(parametresSelectionPublipostage)
result.demiPension = false
result.internat = false
result.retards = false
return result
}
- public void prepareListeEleveEtCritere(PublipostageAbsencesParams parametresSelectionPublipostage,
- PublipostageCriteresRecherche criteria,
- List<Personne> personneEleves) {
- List eleveIds = getListeEleve(parametresSelectionPublipostage)
- criteria.eleveIds = []
-
- eleveIds.each { Integer eleveId ->
- Personne eleve = getEleve(eleveId)
- personneEleves << eleve
- criteria.eleveIds << eleve.autoriteId
- }
- }
-
- private Personne getEleve(int eleveId) {
- Personne eleve = Personne.get(eleveId)
- if (!eleve) {
- throw new IllegalArgumentException("Elève [$eleveId] n'existe pas")
- }
- return eleve
- }
-
/**
* Lecture des données au moment du publipostage
*/
SecuriteSession securiteSession,
Etablissement etablissement
) {
+
+ if (log.debugEnabled) {
+ log.debug("lectureDonneesEleve - ${parametresSelectionPublipostage}")
+ }
+
List<EleveImpressionInfo> eleveImpressionInfos = []
- PublipostageCriteresRecherche criteres
SelectionAdresseResponsableEnum typeResponsable = SelectionAdresseResponsableEnum.valueOf(
SelectionAdresseResponsableEnum.class,
if (requetageSelection.infoAbsences || requetageSelection.infoDetailAbsences) {
- criteres =
+ PublipostageCriteresRecherche criteresAbsences =
parseCriteriaAbsences(
parametresSelectionPublipostage
)
- criteres.etablissementId = etablissement.id
-
- criteres.eleveIds =
- localAutoriteService.getAllAutoriteActuerForAllPersonne(
- parametresSelectionPublipostage.elevesSelectionnesId()
- )*.id
-
- criteres.typesResponsables =
- parametresSelectionPublipostage.responsablesElevesSelectionnes(typeResponsable)
-
- criteres.nbLimit = parametresSelectionPublipostage.limitAbsence
+ prepareCriteres(
+ etablissement,
+ criteresAbsences,
+ parametresSelectionPublipostage,
+ typeResponsable)
eleveImpressionInfos =
findAllInfoForAbsences(
securiteSession,
etablissement,
- criteres,
+ criteresAbsences,
typeResponsable,
requetageSelection.infoDetailAbsences
)
}
+ if (requetageSelection.infoDetails()) {
- if (requetageSelection.infoRetards || requetageSelection.infoDetailRetards) {
-
- criteres = parseCriteriaRetards(
- parametresSelectionPublipostage
- )
-
- criteres.etablissementId = etablissement.id
-
- criteres.eleveIds =
- localAutoriteService.getAllAutoriteActuerForAllPersonne(
- parametresSelectionPublipostage.elevesSelectionnesId()
- )*.id
-
- criteres.typesResponsables =
- parametresSelectionPublipostage.responsablesElevesSelectionnes(typeResponsable)
-
- criteres.nbLimit = parametresSelectionPublipostage.limitAbsence
-
- List<EleveImpressionInfo> eleveImpressionInfosRetard = findAllInfoForRetardsAndDepartAnticipes(
- securiteSession,
+ PublipostageCriteresRecherche criteresRetards = createCritereRetards(
+ parametresSelectionPublipostage,
etablissement,
- criteres,
- typeResponsable,
- requetageSelection.infoDetailRetards
- )
- eleveImpressionInfos = fusionneInfosAbsencesEtRetardsDeparts(
+ typeResponsable)
+
+ eleveImpressionInfos = impressionRetardDepartService.findAllInfoRetardDepartEleve(
+ criteresRetards,
eleveImpressionInfos,
- eleveImpressionInfosRetard
+ requetageSelection
)
+
}
return eleveImpressionInfos
}
- /**
- * Fusionne les infos d'absences et de retards dans une seule liste
- * @return une List<EleveImpressionInfo>
- */
- private List<EleveImpressionInfo> fusionneInfosAbsencesEtRetardsDeparts(
- List<EleveImpressionInfo> infosAbsences,
- List<EleveImpressionInfo> infosRetardsDeparts
- ) {
- List<EleveImpressionInfo> result = infosAbsences
- infosRetardsDeparts.each {
- EleveImpressionInfo infoRetard ->
- EleveImpressionInfo infoAbsence = result.find {
- it.personneId == infoRetard.personne.id
- }
+ private PublipostageCriteresRecherche createCritereRetards(PublipostageAbsencesParams parametresSelectionPublipostage, Etablissement etablissement, SelectionAdresseResponsableEnum typeResponsable) {
- if (infoAbsence) {
- infoAbsence.eleve_NbRetard += infoRetard.eleve_NbRetard
- infoAbsence.eleve_NbDepAnti += infoRetard.eleve_NbDepAnti
- infoAbsence.retards += infoRetard.retards
- } else {
- result.add(infoRetard)
- }
+ PublipostageCriteresRecherche criteresRetards = parseCriteriaRetards(
+ parametresSelectionPublipostage
+ )
- }
- return result
+ prepareCriteres(etablissement, criteresRetards, parametresSelectionPublipostage, typeResponsable)
+ criteresRetards
}
- private Date getPartDate(Date date) {
- Date partDate = new Date(date.getTime())
- partDate.setHours(0)
- partDate.setMinutes(0)
- partDate.setSeconds(0)
- return partDate
+ private void prepareCriteres(Etablissement etablissement, PublipostageCriteresRecherche criteres, PublipostageAbsencesParams parametresSelectionPublipostage, SelectionAdresseResponsableEnum typeResponsable) {
+ criteres.etablissementId = etablissement.id
+
+ criteres.eleveIds =
+ localAutoriteService.getAllAutoriteActuerForAllPersonne(
+ parametresSelectionPublipostage.elevesSelectionnesId()
+ )*.id
+
+
+ criteres.typesResponsables =
+ parametresSelectionPublipostage.responsablesElevesSelectionnes(typeResponsable)
+
+ criteres.nbLimit = parametresSelectionPublipostage.limitAbsence
}
- private void setCriteresPublipostageAbsences(BasicCriteresRecherche criteres) {
- // le publipostage doit pouvoir afficher toutes les absences sauf les prévisionnelles (voir mantis 0028044)
- criteres?.absencesNonValables = true
- criteres?.absencesValables = true
- criteres?.absencesPrevisionnelles = false
- criteres?.demiPension = true
- criteres?.internat = true
+ /**
+ * Additionne les heures à la date du jour
+ * @param dateDuJour : exemple 12/12/2010
+ * @param heure : exemple 8H35
+ * @return 12/12/2010 8H35
+ */
+ private Date ajouteHeure(Date dateDuJour, Date heure) {
+ Calendar calendar = Calendar.getInstance()
+ calendar.setTime(heure)
+ Integer iMillisecond = heure.getTime() +
+ calendar.get(Calendar.ZONE_OFFSET) +
+ calendar.get(Calendar.DST_OFFSET)
+ return DateUtils.addMilliseconds(dateDuJour, iMillisecond)
}
}