public function testDelete() { $florence_eleve = EleveQuery::create()->findOneByLogin('Florence Michu'); $florence_eleve->updateAbsenceAgregationTable(); AbsenceEleveSaisiePeer::enableAgregation(); AbsenceEleveTraitementPeer::enableAgregation(); $traitement = new AbsenceEleveTraitement(); $traitement->setAbsenceEleveType(AbsenceEleveTypeQuery::create()->filterByNom('Infirmerie')->findOne()); $traitement->save(); $traitement->addAbsenceEleveSaisie($florence_eleve->getAbsenceEleveSaisiesDuJour(VENDREDI_s40j5)->getFirst()); $traitement->save(); $decompte = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->filterByDateDemiJounee(VENDREDI_s40j5)->findOne(); $this->assertFalse($decompte->getManquementObligationPresence()); $j_traitement_saisie = $traitement->getJTraitementSaisieEleves()->getFirst(); $j_traitement_saisie->delete(); $decompte->reload(); $this->assertTrue($decompte->getManquementObligationPresence()); AbsenceEleveTraitementPeer::disableAgregation(); AbsenceEleveSaisiePeer::disableAgregation(); }
public function testCheckAndUpdateSynchroAbsenceAgregationTable() { AbsenceAgregationDecompteQuery::create()->deleteAll(); foreach (EleveQuery::create()->find() as $eleve) { $eleve->updateAbsenceAgregationTable(new DateTime(VENDREDI_s40j5.' 00:00:00'),new DateTime(DIMANCHE_s41j7.' 23:59:59')); } sleep(1); $florence_eleve = EleveQuery::create()->findOneByLogin('Florence Michu'); $saisie = $florence_eleve->getAbsenceEleveSaisiesDuJour(VENDREDI_s40j5)->getFirst(); $saisie_id = $saisie->getId(); mysqli_query($GLOBALS["mysqli"], "UPDATE a_saisies SET fin_abs = '".VENDREDI_s40j5." 08:10:00' WHERE id = ".$saisie_id);//ça devient un retard $decompte = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->filterByDateDemiJounee(VENDREDI_s40j5)->findOne(); $this->assertTrue($decompte->getManquementObligationPresence()); $this->assertEquals(0,$decompte->getRetards()); $saisie->reload(); $saisie->clearAllReferences(); $saisie->getEleve()->clearAllReferences(); $saisie->checkAndUpdateSynchroAbsenceAgregationTable();//ça n'est pas mis à jour car le test est true $decompte = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->filterByDateDemiJounee(VENDREDI_s40j5)->findOne(); $this->assertTrue($decompte->getManquementObligationPresence()); $this->assertEquals(0,$decompte->getRetards()); mysqli_query($GLOBALS["mysqli"], "UPDATE a_saisies SET updated_at = now() WHERE id = ".$saisie_id); $saisie->reload(); $saisie->clearAllReferences(); $saisie->getEleve()->clearAllReferences(); $saisie->checkAndUpdateSynchroAbsenceAgregationTable();//c'est mis à jour car le test est false $decompte = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->filterByDateDemiJounee(VENDREDI_s40j5)->findOne(); $this->assertFalse($decompte->getManquementObligationPresence()); $this->assertEquals(1,$decompte->getRetards()); $saisie->setFinAbs(VENDREDI_s40j5.' 09:00:00'); $saisie->save(); }
if($date_debut_col_clone->format('U')<$date_debut_col->format('U')){ $date_debut_col=$date_debut_col_clone; } if($date_fin_col_clone->format('U')>$date_fin_col->format('U')){ $date_fin_col=$date_fin_col_clone; } } } $value['demi_journees'] = AbsenceAgregationDecompteQuery::create() ->filterByEleve($propel_eleve) ->filterByDateIntervalle($date_debut_col, $date_fin_col) ->filterByManquementObligationPresence(true) ->count(); $value['demi_journees_non_justifiees'] = AbsenceAgregationDecompteQuery::create() ->filterByEleve($propel_eleve) ->filterByDateIntervalle($date_debut_col, $date_fin_col) ->filterByManquementObligationPresence(true) ->filterByNonJustifiee(true) ->count(); $value['demi_journees_justifiees'] = $value['demi_journees'] - $value['demi_journees_non_justifiees']; } } } } //on met toutes les donnees en session $_SESSION['donnees_bilan']=serialize($donnees); } // fin de la mise en session des données extraites
$nb_demijournees = $nb_demijournees + $eleve->getDemiJourneesAbsencePreRempli(); $eleve->setVirtualColumn('TauxDemiJourneesAbsence',getTauxAbsenteisme($eleve->getDemiJourneesAbsencePreRempli(), $nbre_demi_journees_calcul)); $eleve->setVirtualColumn('DemiJourneesNonJustifieesPreRempli', AbsenceAgregationDecompteQuery::create() ->filterByEleve($eleve) ->filterByDateIntervalle($dt_date_absence_eleve_debut, $dt_date_absence_eleve_fin) ->filterByManquementObligationPresence(true) ->filterByNonJustifiee(true) ->count()); $nb_nonjustifiees = $nb_nonjustifiees + $eleve->getDemiJourneesNonJustifieesPreRempli(); $nb_justifiees = $nb_justifiees + $eleve->getDemiJourneesAbsencePreRempli() - $eleve->getDemiJourneesNonJustifieesPreRempli(); $eleve->setVirtualColumn('TauxDemiJourneesNonJustifiees',getTauxAbsenteisme($eleve->getDemiJourneesNonJustifieesPreRempli(), $nbre_demi_journees_calcul)); $eleve->setVirtualColumn('TauxDemiJourneesJustifiees',getTauxAbsenteisme(($eleve->getDemiJourneesAbsencePreRempli()-$eleve->getDemiJourneesNonJustifieesPreRempli()), $nbre_demi_journees_calcul)); if ($affichage_motifs) { foreach ($motifs_col as $motif) { $total_motif_eleve=AbsenceAgregationDecompteQuery::create() ->filterByEleve($eleve) ->filterByMotifsAbsence($motif->getId()) ->filterByDateIntervalle($dt_date_absence_eleve_debut, $dt_date_absence_eleve_fin) ->filterByManquementObligationPresence(true) ->count(); $eleve->setVirtualColumn('DemiJourneesAbsencePreRempliMotif' . $motif->getId(), $total_motif_eleve); $eleve->setVirtualColumn('TauxDemiJourneesAbsenceMotif' . $motif->getId(), getTauxAbsenteisme($total_motif_eleve, $nbre_demi_journees_calcul)); $nom_variable = 'nb_demijourneesMotif' . $motif->getId(); $$nom_variable = $$nom_variable + $total_motif_eleve; } } $compteur++; } } if ($affichage != 'ods') {
if ($abs_col->isFirst()) { $date_debut_col = new DateTime($saisie->getDebutAbs()); $date_fin_col = new DateTime($saisie->getFinAbs()); } else { $date_debut_col_clone = new DateTime($saisie->getDebutAbs()); $date_fin_col_clone = new DateTime($saisie->getFinAbs()); if ($date_debut_col_clone->format('U') < $date_debut_col->format('U')) { $date_debut_col = $date_debut_col_clone; } if ($date_fin_col_clone->format('U') > $date_fin_col->format('U')) { $date_fin_col = $date_fin_col_clone; } } } $value['demi_journees'] = AbsenceAgregationDecompteQuery::create()->filterByEleve($propel_eleve)->filterByDateIntervalle($date_debut_col, $date_fin_col)->filterByManquementObligationPresence(true)->count(); $value['demi_journees_non_justifiees'] = AbsenceAgregationDecompteQuery::create()->filterByEleve($propel_eleve)->filterByDateIntervalle($date_debut_col, $date_fin_col)->filterByManquementObligationPresence(true)->filterByNonJustifiee(true)->count(); $value['demi_journees_justifiees'] = $value['demi_journees'] - $value['demi_journees_non_justifiees']; } } } } //on met toutes les donnees en session $_SESSION['donnees_bilan'] = serialize($donnees); } // fin de la mise en session des données extraites // On fais une copie des données en session pour affichage if ($affichage != "odt" && $affichage != "ods") { if (isset($_SESSION['donnees_bilan'])) { $_SESSION['donnees_bilan_affichage'] = $_SESSION['donnees_bilan']; } }
/** * Returns the number of related AbsenceAgregationDecompte objects. * * @param Criteria $criteria * @param boolean $distinct * @param PropelPDO $con * @return int Count of related AbsenceAgregationDecompte objects. * @throws PropelException */ public function countAbsenceAgregationDecomptes(Criteria $criteria = null, $distinct = false, PropelPDO $con = null) { if(null === $this->collAbsenceAgregationDecomptes || null !== $criteria) { if ($this->isNew() && null === $this->collAbsenceAgregationDecomptes) { return 0; } else { $query = AbsenceAgregationDecompteQuery::create(null, $criteria); if($distinct) { $query->distinct(); } return $query ->filterByEleve($this) ->count($con); } } else { return count($this->collAbsenceAgregationDecomptes); } }
public function testDelete() { $florence_eleve = EleveQuery::create()->findOneByLogin('Florence Michu'); $traitement = AbsenceEleveTraitementQuery::create()->useJTraitementSaisieEleveQuery() ->useAbsenceEleveSaisieQuery()->filterByDebutAbs(JEUDI_s42j4.' 08:00:00') ->endUse()->endUse()->findOne(); //on va vérifier que le delete change bien le update_ad $old_updated_at = $traitement->getUpdatedAt('U'); $traitement->delete(); $traitement = AbsenceEleveTraitementQuery::create()->useJTraitementSaisieEleveQuery() ->useAbsenceEleveSaisieQuery()->filterByDebutAbs(JEUDI_s42j4.' 08:00:00') ->endUse()->endUse()->findOne(); $this->assertNull($traitement); $traitement = AbsenceEleveTraitementQuery::create()->includeDeleted()->useJTraitementSaisieEleveQuery() ->useAbsenceEleveSaisieQuery()->filterByDebutAbs(JEUDI_s42j4.' 08:00:00') ->endUse()->endUse()->findOne(); $this->assertNotNull($traitement); $traitement->unDelete(); AbsenceEleveTraitementPeer::enableAgregation(); $traitement->setAbsenceEleveType(AbsenceEleveTypeQuery::create()->filterByNom('Infirmerie')->findOne()); $traitement->save(); $decompte = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->filterByDateDemiJounee(JEUDI_s42j4)->findOne(); $this->assertFalse($decompte->getManquementObligationPresence()); $traitement->delete(); $decompte->reload(); $this->assertTrue($decompte->getManquementObligationPresence()); AbsenceEleveTraitementPeer::disableAgregation(); }
public function testSortieEleve() { # Absence 21 du LUNDI_a1_s22j1 Sortir l'élève du collège et vérifier qu'aucune absence n'est retournée $florence_eleve = EleveQuery::create()->findOneByLogin('Florence Michu'); # table d'agrégation AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve)->delete(); $florence_eleve->thinCheckAndUpdateSynchroAbsenceAgregationTable(); $saisie_col = $florence_eleve->getAbsenceEleveSaisiesParDate(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')); $this->assertEquals(1,$saisie_col->count()); $this->assertTrue($saisie_col->getFirst()->getManquementObligationPresence()); $demi_j_col = $florence_eleve->getDemiJourneesAbsence(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')); $this->assertEquals(2,$demi_j_col->count()); # L'élève est inscrit -> 2 absences # table d'agrégation $nbAbs = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve) ->filterByDateIntervalle(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')) ->filterByManquementObligationPresence(true); $this->assertEquals(2,$nbAbs->count()); $florence_eleve->setDateSortie(strtotime(LUNDI_time_a1_s22j1.' 00:00:00')); # On sort l'élève $demi_j_col = $florence_eleve->getDemiJourneesAbsence(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')); $this->assertEquals(0,$demi_j_col->count()); # L'élève n'est plus dans l'établissement -> 0 absence $this->assertEquals(0,$florence_eleve->getDemiJourneesAbsenceParPeriode(3)->count()); $demi_j_col = $florence_eleve->getDemiJourneesNonJustifieesAbsence(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')); $this->assertEquals(0,$demi_j_col->count()); # table d'agrégation $nbAbs = AbsenceAgregationDecompteQuery::create()->filterByEleve($florence_eleve) ->filterByDateIntervalle(new DateTime(LUNDI_a1_s22j1.' 00:00:00'),new DateTime(LUNDI_a1_s22j1.' 23:59:59')) ->filterByManquementObligationPresence(true); $this->assertEquals(0,$nbAbs->count()); }
if ($action == "vidage") { $del = AbsenceAgregationDecompteQuery::create()->deleteAll(); $nb = AbsenceAgregationDecompteQuery::create()->count(); if ($nb === 0) { echo"<p>La Table est maintenant vide.</p>"; echo "<p>Revenir à l'<a href='".$_SERVER['PHP_SELF']."'>Agrégation des absences</a></p>"; die(); } else { echo"<p>Un problème est survenu.</p>"; die(); } } elseif ($action == "regeneration") { $eleve_col = EleveQuery::create()->paginate($page, $maxPerPage); if (1 == $page) { $del = AbsenceAgregationDecompteQuery::create()->deleteAll(); $nb = AbsenceAgregationDecompteQuery::create()->count(); if ($nb === 0) { echo"<p>La Table est vide.</p>"; } else { echo"<p>Un problème est survenu.</p>"; die(); } } echo'<div id="contain_div" class="css-panes"> <p> Traitement de la tranche d\'élève ' . $page . '/' . $eleve_col->getLastPage() . ' en cours... <br /> Attention cette opération peut être longue.</p> </div>'; if(ob_get_contents()){ ob_flush(); } flush();
/** * Returns a new AbsenceAgregationDecompteQuery object. * * @param string $modelAlias The alias of a model in the query * @param Criteria $criteria Optional Criteria to build the query from * * @return AbsenceAgregationDecompteQuery */ public static function create($modelAlias = null, $criteria = null) { if ($criteria instanceof AbsenceAgregationDecompteQuery) { return $criteria; } $query = new AbsenceAgregationDecompteQuery(); if (null !== $modelAlias) { $query->setModelAlias($modelAlias); } if ($criteria instanceof Criteria) { $query->mergeWith($criteria); } return $query; }
public function testQueryCountRetards() { AbsenceAgregationDecompteQuery::create()->deleteAll(); foreach (EleveQuery::create()->find() as $eleve) { $eleve->updateAbsenceAgregationTable(); } $this->assertEquals(6,AbsenceAgregationDecompteQuery::create()->filterByDateIntervalle(new DateTime(VENDREDI_s40j5.' 00:00:00'),new DateTime(LUNDI_a1_s23j1.' 23:59:59'))->countRetards()); $florence_eleve = EleveQuery::create()->findOneByLogin('Florence Michu'); $this->assertEquals(6,AbsenceAgregationDecompteQuery::create()->filterByDateIntervalle(new DateTime(VENDREDI_s40j5.' 00:00:00'),new DateTime(LUNDI_a1_s23j1.' 23:59:59'))->filterByEleve($florence_eleve)->countRetards()); }
/** * Removes this object from datastore and sets delete attribute. * * @param PropelPDO $con * @return void * @throws PropelException * @see BaseObject::setDeleted() * @see BaseObject::isDeleted() */ public function delete(PropelPDO $con = null) { if ($this->isDeleted()) { throw new PropelException("This object has already been deleted."); } if ($con === null) { $con = Propel::getConnection(AbsenceAgregationDecomptePeer::DATABASE_NAME, Propel::CONNECTION_WRITE); } $con->beginTransaction(); try { $deleteQuery = AbsenceAgregationDecompteQuery::create() ->filterByPrimaryKey($this->getPrimaryKey()); $ret = $this->preDelete($con); if ($ret) { $deleteQuery->delete($con); $this->postDelete($con); $con->commit(); $this->setDeleted(true); } else { $con->commit(); } } catch (Exception $e) { $con->rollBack(); throw $e; } }
/** * * Mets à jour la table d'agrégation des absences pour cet élève * Pour éviter des calculs trop long par erreurs, l'algorithme est limité à 3 ans dans le passé et le futur * de la date courante * * @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 * */ public function updateAbsenceAgregationTable(DateTime $dateDebut = null, DateTime $dateFin = null) { $now = new DateTime(); $dateDebutClone = null; $dateFinClone = null; if ($dateDebut != null && $dateFin != null && $dateDebut->format('U') > $dateFin->format('U')) { throw new PropelException('Erreur: la date de debut ne peut être postérieure à la date de fin'); } if ($dateDebut != null) { if (abs($dateDebut->format('U') - $now->format('U')) > 3600*24*365*3) { throw new PropelException('Erreur: la date de debut ne doit pas être éloignées de plus de 3 ans de la date courante'); } } if ($dateFin != null) { if (abs($dateFin->format('U') - $now->format('U')) > 3600*24*365*3) { throw new PropelException('Erreur: la date de fin ne doit pas être éloignées de plus de 3 ans de la date courante'); } } //on initialise les date clone qui seront manipulés dans l'algoritme, c'est nécessaire pour ne pas modifier les date passée en paramêtre. if ($dateDebut != null) { $dateDebutClone = clone $dateDebut; $dateDebutClone->setTime(0,0); } if ($dateFin != null) { $dateFinClone = clone $dateFin; $dateFinClone->setTime(23,59); } //on commence par supprimer les anciennes entrée $queryDelete = AbsenceAgregationDecompteQuery::create()->filterByEleve($this); if ($dateDebutClone != null) { $queryDelete->filterByDateDemiJounee($dateDebutClone, Criteria::GREATER_EQUAL); } if ($dateFinClone != null) { $queryDelete->filterByDateDemiJounee($dateFinClone, Criteria::LESS_EQUAL); } $queryDelete->delete(); //on supprime le marqueur qui certifie que le calcul pour cet eleve a été terminé correctement AbsenceAgregationDecompteQuery::create()->filterByEleve($this)->filterByMarqueurFinMiseAJour()->delete(); $DMabsenceNonJustifiesCol = $this->getDemiJourneesNonJustifieesAbsence($dateDebutClone,$dateFinClone); $DMabsencesCol = $this->getDemiJourneesAbsence($dateDebutClone,$dateFinClone); $retards = $this->getRetards($dateDebutClone,$dateFinClone); $saisiesCol = clone $this->getAbsenceEleveSaisiesParDate($dateDebutClone, $dateFinClone);//cette collection de saisie va nous permettre de récupérer les notifications et les motifs // préférence admin pour la demi journée $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) { } } //on initialise le début de l'itération pour creer les entrées si aucune date n'est précisée if ($dateDebutClone == null) { if (!$DMabsencesCol->isEmpty()) { $dateDebutClone= clone $DMabsencesCol->getFirst(null); $dateDebutClone->setTime(0,0); } if (!$retards->isEmpty()) { if ($dateDebutClone == null || $dateDebutClone->format('U') > $retards->getFirst()->getDebutAbs('U')) { $dateDebutClone= clone $retards->getFirst()->getDebutAbs(null); $dateDebutClone->setTime(0,0); } } if ($dateDebutClone != null && abs($dateDebutClone->format('U') - $now->format('U')) > 3600*24*365*3) { $dateDebutClone = new DateTime('@'.($now->format('U') - 3600*24*365*3));//on limite la mise à jour à 4 ans en arrière } } if ($dateDebutClone == null) { //rien à remplir //on va quand même mettre une entrée pour dire qu'on est passé par la pour une vérification ultérieures $newAgregation = new AbsenceAgregationDecompte(); $newAgregation->setEleve($this); if ($dateFinClone != null) { $dateFinClone->setTime(12,0); } else { //on a aucune date ni aucune saisie, on va mettre la date du jour $dateFinClone = new DateTime('now'); $dateFinClone->setTime(0,0); } $newAgregation->setDateDemiJounee($dateFinClone); $newAgregation->save(); } else { $dateDemiJourneeIteration = clone $dateDebutClone; $DMabsencesCol_start_compute = false;//obligatoire pour tester la fin de la collection car le pointeur retourne au début $retards_start_compute = false; //on va creer une collections d'entrées dans la table d'agrégation //dans la boucle while on utilise les tests isFirst pour vérifier qu'on a pas fini les collections et qu'on est pas retourné au début do { $newAgregation = new AbsenceAgregationDecompte(); $newAgregation->setEleve($this); $newAgregation->setDateDemiJounee($dateDemiJourneeIteration); if (($DMabsencesCol->getCurrent() != null) && $dateDemiJourneeIteration->format('d/m/Y H') == $DMabsencesCol->getCurrent()->format('d/m/Y H')) { $DMabsencesCol_start_compute = true; $newAgregation->setManquementObligationPresence(true); $newAgregation->setNonJustifiee(false); $DMabsencesCol->getNext(); //on regarde si l'absence est non justifiée if (($DMabsenceNonJustifiesCol->getCurrent() != null) && $dateDemiJourneeIteration->format('d/m/Y H') == $DMabsenceNonJustifiesCol->getCurrent()->format('d/m/Y H')) { $newAgregation->setNonJustifiee(true); $DMabsenceNonJustifiesCol->getNext(); } //on va voir si il y a eu des motifs et des notifications $date_debut_cherche_motif = clone $dateDemiJourneeIteration; $date_fin_cherche_motif = clone $dateDemiJourneeIteration; if ($dateDemiJourneeIteration->format('H') == 0) { $date_debut_cherche_motif->setTime(0,0); $date_fin_cherche_motif->setTime($heure_demi_journee,$minute_demi_journee); } else { $date_debut_cherche_motif->setTime($heure_demi_journee,$minute_demi_journee); $date_fin_cherche_motif->setTime(23,59); } foreach ($saisiesCol as $saisie) { if ($saisie->getDebutAbs('U') <= $date_fin_cherche_motif->format('U') && $saisie->getFinAbs('U') >= $date_debut_cherche_motif->format('U') && $saisie->getManquementObligationPresence()) { if (!$newAgregation->getNotifiee() && $saisie->getNotifiee()) { $newAgregation->setNotifiee(true); } if ($saisie->getMotif() != null) { foreach ($saisie->getAbsenceEleveTraitements() as $traitement) { if ($traitement->getAbsenceEleveMotif() != null) { $newAgregation->addMotifsAbsence($traitement->getAMotifId()); } } } } } } //on regarde si il y a des retards pendant cette demijournée $date_fin_decompte_retard = clone $dateDemiJourneeIteration; if ($date_fin_decompte_retard->format('H') == 0) { $date_fin_decompte_retard->setTime($heure_demi_journee,$minute_demi_journee); } else { $date_fin_decompte_retard->setTime(23,59); } while ($retards->getCurrent() != null && $retards->getCurrent()->getDebutAbs('U')<$date_fin_decompte_retard->format('U')) { $retards_start_compute = true; $newAgregation->setRetards($newAgregation->getRetards() + 1); if (!$retards->getCurrent()->getJustifiee()) { $newAgregation->setRetardsNonJustifies($newAgregation->getRetardsNonJustifies() + 1); } if ($retards->getCurrent()->getMotif() != null) { foreach ($retards->getCurrent()->getAbsenceEleveTraitements() as $traitement) { if ($traitement->getAbsenceEleveMotif() != null) { $newAgregation->addMotifsRetard($traitement->getAMotifId()); } } } $retards->getNext(); } $newAgregation->save(); $dateDemiJourneeIteration->modify("+12 hours"); } while ( ($dateDemiJourneeIteration->format('U') - $now->format('U') < 3600*24*365*3) //on continue si on est pas trop éloigné dans le futur && (($dateFinClone != null && $dateDemiJourneeIteration <= $dateFinClone)//on continue si on a pas dépassé la date de fin || ($dateFinClone == null && ((!$DMabsencesCol->isFirst() || !$DMabsencesCol_start_compute) || (!$retards->isFirst() || !$retards_start_compute)) ))//ou continue si la date de fin n'est pas précisé et qu'on a pas encore épuisé toutes les absences et retards ); } //on enregistre le marqueur qui certifie que le calcul pour cet eleve a été terminé correctement $newAgregation = new AbsenceAgregationDecompte(); $newAgregation->setEleve($this); $newAgregation->setDateDemiJounee('0001-01-01 00:00:00'); $newAgregation->save(); }