/** * * Retourne la date de debut de periode * * @param string $format The date/time format string (either date()-style or strftime()-style). * If format is NULL, then the raw DateTime object will be returned. * * @return DateTime $date ou null si non précisé */ public function getDateDebut($format = null) { if(null === $this->dateDebut) { if ($this->isNew()) { //do nothing } else { $dateDebut = null; if ($this->getNumPeriode() == 1) { //on essaye de récupérer la date de début dans le calendrier des périodes $edt_periode = EdtCalendrierPeriodeQuery::create()->filterByNumeroPeriode($this->getNumPeriode())->orderByDebutCalendrierTs()->findOne(); if ($edt_periode != null) { $dateDebut = $edt_periode->getJourdebutCalendrier(null); } else { //c'est la premiere periode //on va renvoyer par default le début de l'année scolaire include_once(dirname(__FILE__).'/../../../helpers/EdtHelper.php'); $dateDebut = EdtHelper::getPremierJourAnneeScolaire($this->getDateFin()); } } else { //on renvoi la date de fin de la periode precedente $periode_prec = PeriodeNoteQuery::create()->filterByIdClasse($this->getIdClasse())->filterByNumPeriode($this->getNumPeriode() - 1)->findOne(); if ($periode_prec != null) { $dateDebut = $periode_prec->getDateFin(null); } //on prend le lendemain if ($dateDebut !== null) { $dateDebut->modify("+24 hours"); } } if ($dateDebut !== null) { //on commence la periode a 00:00 $dateDebut->setTime(0,0,0); } $this->dateDebut = $dateDebut; } } if ($this->dateDebut === null) { //on initialise a un timestamp de 0 pour ne pas faire de nouveau la recherche $this->dateDebut == new DateTime('@0'); return null; } else if ($this->dateDebut->format('U') == 0) { return null; } if ($format === null) { //we return a DateTime object. return $this->dateDebut; } elseif (strpos($format, '%') !== false) { return strftime($format, $this->dateDebut->format('U')); } else { return $this->dateDebut->format($format); } }
/** * Filtre la requete sur les dates de début et de fin. En cas de date nulle, * le premier jour ou le dernier de l'année scolaire est utilisé * Pour la date de fin, la comparaison est stricte. Si la date de fin est 2010-10-04 00:00:00, on aura les décompte du 03 mais pas du 04 * Pour la demi journée, on se base sur 12h et sur les préférences de l'application gepi * * @param DateTime $date_debut, $date_fin Dates de début et de fin de l'extraction des demi journées * @return AbsenceAgregationDecompteQuery The current query, for fluid interface */ public function filterByDateIntervalle(DateTime $date_debut=Null, DateTime $date_fin=Null) { if (is_null($date_debut) || is_null($date_fin)) { require_once("helpers/EdtHelper.php"); if (is_null($date_debut)) { $date_debut = EdtHelper::getPremierJourAnneeScolaire(); } if (is_null($date_fin)) { $date_fin = EdtHelper::getDernierJourAnneeScolaire(); } } $heure_demi_journee = 11; $minute_demi_journee = 50; if (getSettingValue("abs2_heure_demi_journee") != null) { try { $dt_demi_journee = new DateTime(getSettingValue("abs2_heure_demi_journee")); $heure_demi_journee = $dt_demi_journee->format('H'); $minute_demi_journee = $dt_demi_journee->format('i'); } catch (Exception $x) { } } if (!isset($dt_demi_journee) || $dt_demi_journee == null) { $dt_demi_journee = new DateTime($heure_demi_journee.':'.$minute_demi_journee); } $date_debut_clone=clone $date_debut; if ($date_debut_clone->format('Hi') < $heure_demi_journee . $minute_demi_journee) { $date_debut_clone->setTime(0, 0, 0); } else { $date_debut_clone->setTime(12, 0, 0); } $dt_demi_journee->modify("+1 hour"); $dt_demi_journee->modify("+35 minutes"); $heure_demi_journee = $dt_demi_journee->format('H'); $minute_demi_journee = $dt_demi_journee->format('i'); $date_fin_clone=clone $date_fin; if ($date_fin_clone->format('Hi') < $heure_demi_journee . $minute_demi_journee && $date_fin_clone->format('H:i')!="00:00" && $date_debut_clone->format('H:i')=="00:00" ) { $date_fin_clone->setTime(11, 59, 0); } $this->filterByDateDemiJounee($date_debut_clone, Criteria::GREATER_EQUAL) ->filterByDateDemiJounee($date_fin_clone, Criteria::LESS_THAN); return $this; }
/** * Compte les demi-journees saisies. Les saisies doivent ètre triées par ordre de début. * Cette méthode ne travaille que sur les dates, et prend en compte les fermeture de l'établissement * * @param PropelObjectCollection $abs_saisie_col collection d'objets AbsenceEleveSaisie * * @return PropelCollection une collection de date time par demi journee comptee (un datetime pour le matin et un datetime pour l'apres midi */ public static function compte_demi_journee($abs_saisie_col, $date_debut_iteration = null, $date_fin_iteration = null) { if ($abs_saisie_col->isEmpty()) { return new PropelCollection(); } $abs_saisie_col->uasort(array("AbsencesEleveSaisieHelper", "compare_debut_absence")); //on récupère l'heure de demi-journée $heure_demi_journee = 11;//11:50 par défaut si rien n'est précisé dans les settings $minute_demi_journee = 50; if (getSettingValue("abs2_heure_demi_journee") != null) { try { $dt_demi_journee = new DateTime(getSettingValue("abs2_heure_demi_journee")); $heure_demi_journee = $dt_demi_journee->format('H'); $minute_demi_journee = $dt_demi_journee->format('i'); } catch (Exception $x) { } } //on va regarder la date du début pour notre algorithme if ($date_debut_iteration == null) { $date_debut_iteration = $abs_saisie_col->getFirst()->getDebutAbs(null); } if ($date_debut_iteration->format('Hi') < $heure_demi_journee.$minute_demi_journee) { $date_debut_iteration->setTime(0, 0, 0); } else { $date_debut_iteration->setTime(12, 0, 0); } //on va regarder la date du fin pour notre algorithme if ($date_fin_iteration == null) { foreach ($abs_saisie_col as $saisie) { if ($date_fin_iteration == null || $saisie->getFinAbs('U') > $date_fin_iteration->format('U')) { $date_fin_iteration = $saisie->getFinAbs(null); } } } if ($date_fin_iteration->format('Hi') < $heure_demi_journee.$minute_demi_journee) { $date_fin_iteration->setTime(12, 0, 0); } else { $date_fin_iteration->setTime(23, 59, 59); $date_fin_iteration->modify("+1 second"); } $date_fin_iteration->modify("+2 hours");//on ajout deux heures pour prendre en compte un décalage dans la date de compteur (+1h35) dans l'algorithme plus bas $result = new PropelCollection(); $date_compteur = clone $date_debut_iteration; $horaire_tab = EdtHorairesEtablissementPeer::retrieveAllEdtHorairesEtablissementArrayCopy(); require_once(dirname(__FILE__)."/EdtHelper.php"); foreach($abs_saisie_col as $saisie) { if ($date_compteur->format('U') < $saisie->getDebutAbs('U')) { $date_compteur = clone $saisie->getDebutAbs(null); } if ($date_compteur >= $date_fin_iteration) { break; } while ($date_compteur <= $saisie->getFinAbs(null) && $date_compteur < $date_fin_iteration) { //est-ce un jour de la semaine ouvert ? if (!EdtHelper::isJourneeOuverte($date_compteur)) { //etab fermé on va passer au lendemain $date_compteur->setTime(23, 59, 59); $date_compteur->modify("+2 hours"); continue; } elseif (!EdtHelper::isHoraireOuvert($date_compteur)) { $horaire = $horaire_tab[EdtHelper::$semaine_declaration[$date_compteur->format("w")]]; if ($date_compteur->format('Hi') < $horaire->getOuvertureHoraireEtablissement('Hi')) { //c'est le matin, on règle sur l'heure d'ouverture $date_compteur->setTime($horaire->getOuvertureHoraireEtablissement('H'), $horaire->getOuvertureHoraireEtablissement('i')); } else { //on est apres la fermeture, on va passer au lendemain $date_compteur->setTime(23, 59, 59); $date_compteur->modify("+2 hours"); } continue; } elseif ($date_compteur < $saisie->getDebutAbs(null) && !EdtHelper::isHoraireOuvert($saisie->getDebutAbs(null))) { $date_compteur->modify("+19 minutes"); continue; } if ($date_compteur->format('Hi') < $heure_demi_journee.$minute_demi_journee) { $date_compteur->setTime(0, 0, 0); } else { $date_compteur->setTime(12, 0, 0); } $date_compteur_suivante = clone $date_compteur; $date_compteur_suivante->modify("+15 hours");//en ajoutant 15 heure on est sur de passer a la demi-journee suivante if ($date_compteur_suivante->format('H') < 12) { $date_compteur_suivante->setTime(0, 0, 0); } else { $date_compteur_suivante->setTime($heure_demi_journee, $minute_demi_journee, 0); } if ($saisie->getDebutAbs(null) < $date_compteur_suivante && $saisie->getFinAbs(null) > $date_compteur) { $result->append(clone $date_compteur); //on ajoute 1h35 //pour eviter le cas ou on a une saisie par exemple sur 11h45 -> 13h et de la compter comme deux demi-journees $date_compteur_suivante->modify("+1 hour"); $date_compteur_suivante->modify("+45 minutes"); } $date_compteur = $date_compteur_suivante; $saisie->clearAllReferences(); } } return $result; }
$nb_demijournees = 0; $nb_justifiees = 0; $nb_nonjustifiees = 0; $nb_retards = 0; $demi_journees_decompte=0; if($affichage_motifs){ foreach ($motifs_col as $motif) { $nom_variable = 'nb_demijourneesMotif' . $motif->getId(); $$nom_variable = 0; } } foreach ($eleve_col as $eleve) { $nbre_demi_journees_calcul=$nbre_demi_journees; if($eleve->getDateSortie('U')!=Null && $eleve->getDateSortie('U')>0 && $eleve->getDateSortie('U')<$dt_date_absence_eleve_fin->format('U')){ $date_sortie=new DateTime('@'.$eleve->getDateSortie('U')); $nbre_demi_journees_calcul = EdtHelper::getNbreDemiJourneesEtabOuvert($dt_date_absence_eleve_debut, $date_sortie); $eleve->setVirtualColumn('NbreDemiJourneesCalcul',$nbre_demi_journees_calcul); } $demi_journees_decompte=$demi_journees_decompte+$nbre_demi_journees_calcul; if (($compteur % ceil($nombre_eleve_requete / 5) == 0) && ($id_classe == null || $id_classe == -1) && ($nom_eleve == null || $nom_eleve == '' ) && $affichage == 'html') { $pourcent = 20 * $k; echo '<script type="text/javascript"> dojo.xhrGet({ // The URL of the request url: "include_chargement.php?compteur=' . $pourcent . '", load: function(newContent) { dojo.byId("chargement").innerHTML = newContent; }, error: function() { // Do nothing -- keep old content there
die(); } } //initialisation des variables $action= isset($_POST['action'])?$_POST['action']:Null; $page= isset($_POST['page'])?$_POST['page']:1; $maxPerPage=5; if ($action == "vidage" || $action=="regeneration") { check_token(); } //gestion des dates require_once("../../orm/helpers/EdtHelper.php"); $date_debut = EdtHelper::getPremierJourAnneeScolaire(); $date_fin = EdtHelper::getDernierJourAnneeScolaire(); $date_fin->setTime(23,59,59); // header $titre_page = "Gestion de la table d'agrégation des demi-journées d'absence"; $javascript_specifique[] = "mod_abs2/lib/include"; require_once("../../lib/header.inc.php"); echo "<p class=bold>"; if($_SESSION['statut']=='administrateur') { echo "<a href=\"index.php\">"; } else { echo "<a href=\"../index.php\">"; } echo "<img src='../../images/icons/back.png' alt='Retour' class='back_link'/> Retour</a>";
function isAffichable($abs, $date, $eleve) { $creneau_col = EdtCreneauPeer::retrieveAllEdtCreneauxOrderByTime(); $test_ouverture = false; foreach ($creneau_col as $creneau) { $datedebutabs = explode(" ", $abs->getDebutAbs()); $dt_date_debut_abs = new DateTime($datedebutabs[0]); $heure_debut = explode(":", $datedebutabs[1]); $dt_date_debut_abs->setTime($heure_debut[0], $heure_debut[1], $heure_debut[2]); $tab_heure = explode(":", $creneau->getHeuredebutDefiniePeriode()); $date->setTime($tab_heure[0], $tab_heure[1], $tab_heure[2]); //on verifie si le creneau est ouvert et s'il est posterieur au debut de l'absence if ($date->Format('U') > $dt_date_debut_abs->Format('U') && EdtHelper::isEtablissementOuvert($date)) { $test_ouverture = true; } } if ($test_ouverture && $abs->getManquementObligationPresence()) { return true; } else { return false; } }
/** * Renvoi le nombre de demi-journées ouvertes entre deux dates de debut ou de fin (ou premier et dernier jour de l'année scolaire si les dates ne sont pas spécifiées * * @param DateTime $date_debut * @param DateTime $date_fin * @return Int $nbre_demi_journees_etab_ouvert */ public static function getNbreDemiJourneesEtabOuvert($date_debut = Null, $date_fin = Null) { //clonage des da&tes de debut et de fin pour ne pas modifier les objets date directement if ($date_debut == Null) { $date_debut_clone = EdtHelper::getPremierJourAnneeScolaire(); } else { $date_debut_clone = clone $date_debut; } $date_debut_clone->setTime(0, 0, 0); if ($date_fin == Null) { $date_fin_clone = EdtHelper::getDernierJourAnneeScolaire(); } else { $date_fin_clone = clone $date_fin; } $date_fin_clone->setTime(23, 59, 59); // on va tester demi journée par demi journée si l'étab est ouvert $nbre_demi_journees_etab_ouvert = 0; while ($date_debut_clone->format('U') < $date_fin_clone->format('U')) { $date_clone = clone $date_debut_clone; if ($date_debut_clone->format('H:i') == "00:00") { $date_clone->setTime(9, 0, 0); //on met 9 heures au cas ou un étab commence à 8h30 par exemple } elseif ($date_debut_clone->format('H:i') == "12:00") { $date_clone->setTime(15, 0, 0); //on met 15 heures pour être dans la demi journée de l'après-midi } else { echo 'Il y a un problème sur les heures'; die; } if (EdtHelper::isEtablissementOuvert($date_clone)) { $nbre_demi_journees_etab_ouvert++; } $date_debut_clone->modify("+12 hours"); } return $nbre_demi_journees_etab_ouvert; }
/** * * Vérifie et mets à jour l'ensemble de la table d'agrégation des absences pour cet élève, sur l'ensemble des années scolaires incluant $dateDebut et $dateFin, * et aussi avant et après les années scolaires si des saisies sont présentes. * Cela permet de remplir la table obligatoirement pour l'année en cours (avec un mois de débordement sur les autres années), et de la remplir avant et après l'année en cours si des saisies le nécessite * * @TODO implement the method * * @param DateTime $dateDebut date de début pour la prise en compte de la mise à jours * @param DateTime $dateFin date de fin pour la prise en compte de la mise à jours * @return Boolean * */ public function checkAndUpdateSynchroAbsenceAgregationTable(DateTime $dateDebut = null, DateTime $dateFin = null) { //on va vérifier que avant et après les dates précisées, la table est bien synchronisée sur l'année en cours require_once(dirname(__FILE__)."/../../../helpers/EdtHelper.php"); assert('$dateDebut == null || $dateFin == null || $dateDebut <= $dateFin'); //on va vérifier antérieurement à la date de début if ($dateDebut != null) { $dateDebutClone = clone $dateDebut; $dateDebutClone->modify("-1 day"); $premier_jour_annee_scolaire_large = EdtHelper::getPremierJourAnneeScolaire($dateDebutClone); $premier_jour_annee_scolaire_large->modify("-1 month");//on enleve 1 mois pour etre large if ($premier_jour_annee_scolaire_large < $dateDebutClone) {//si l'année débute avant la date précisée, on va faire deux mise à jour, comme ça on est sur que à partir du début de l'année la table sera remplie $premier_jour_annee_scolaire_large->modify("-1 day");//on évite aux dates de se chevaucher sur une même journée $this->thinCheckAndUpdateSynchroAbsenceAgregationTable(null, $premier_jour_annee_scolaire_large); $premier_jour_annee_scolaire_large->modify("+1 day"); $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($premier_jour_annee_scolaire_large, $dateDebutClone); } else { $this->thinCheckAndUpdateSynchroAbsenceAgregationTable(null, $dateDebutClone); } } else {//si la date de début est nulle, on prend le début de l'année en cours $dateDebutClone = EdtHelper::getPremierJourAnneeScolaire($dateFin); $dateDebutClone->modify("-1 month"); $dateDebutClone->modify("-1 day"); $this->thinCheckAndUpdateSynchroAbsenceAgregationTable(null, $dateDebutClone); } //on va vérifier postérieurement à la date de fin if ($dateFin != null) { $dateFinClone = clone $dateFin; $dateFinClone->modify("+1 day"); $dernier_jour_annee_scolaire_large = EdtHelper::getDernierJourAnneeScolaire($dateFinClone); $dernier_jour_annee_scolaire_large->modify("+1 month"); if ($dernier_jour_annee_scolaire_large > $dateFinClone) { $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($dateFinClone, $dernier_jour_annee_scolaire_large); $dernier_jour_annee_scolaire_large->modify("+1 day"); $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($dernier_jour_annee_scolaire_large, null); } else { $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($dateFinClone, null); } } else {//si la date de fin est nulle, on va prendre comme date de fin la fin de l'année $dateFinClone = EdtHelper::getDernierJourAnneeScolaire($dateDebut); $dateFinClone->modify("+1 month"); $dateFinClone->modify("+1 day"); $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($dateFinClone, null); } //on regarde sur les dates de début et de fin choisies //les dates ont été décalé pour les vérification antérieures et postérieures, donc on rétabli les bonnes dates $dateDebutClone->modify("+1 day"); $dateFinClone->modify("-1 day"); $this->thinCheckAndUpdateSynchroAbsenceAgregationTable($dateDebutClone, $dateFinClone); }