/**
	 * This function performs the validation work for complex object models.
	 *
	 * In addition to checking the current object, all related objects will
	 * also be validated.  If all pass then <code>true</code> is returned; otherwise
	 * an aggreagated array of ValidationFailed objects will be returned.
	 *
	 * @param      array $columns Array of column names to validate.
	 * @return     mixed <code>true</code> if all validations pass; array of <code>ValidationFailed</code> objets otherwise.
	 */
	protected function doValidate($columns = null)
	{
		if (!$this->alreadyInValidation) {
			$this->alreadyInValidation = true;
			$retval = null;

			$failureMap = array();


			// We call the validate method on the following object(s) if they
			// were passed to this object by their coresponding set
			// method.  This object relates to these object(s) by a
			// foreign key reference.

			if ($this->aAbsenceEleveSaisie !== null) {
				if (!$this->aAbsenceEleveSaisie->validate($columns)) {
					$failureMap = array_merge($failureMap, $this->aAbsenceEleveSaisie->getValidationFailures());
				}
			}

			if ($this->aAbsenceEleveTraitement !== null) {
				if (!$this->aAbsenceEleveTraitement->validate($columns)) {
					$failureMap = array_merge($failureMap, $this->aAbsenceEleveTraitement->getValidationFailures());
				}
			}


			if (($retval = JTraitementSaisieElevePeer::doValidate($this, $columns)) !== true) {
				$failureMap = array_merge($failureMap, $retval);
			}



			$this->alreadyInValidation = false;
		}

		return (!empty($failureMap) ? $failureMap : true);
	}
        $message_erreur .= "Appel non autorisé en dehors des heures de cours concernées.<br/>";
    }
}
$saisie->setDebutAbs($dt_date_debut_appel);
$saisie->setFinAbs($dt_date_fin_appel);
$chaine_son_alerte = "\n<audio id='id_erreur_sound' preload='auto' autobuffer autoplay>\n\t<!--source src='../sounds/verre_brise.wav' /-->\n\t<source src='../sounds/default_alarm.wav' />\n</audio>\n";
if ($message_erreur != '') {
    $message_enregistrement .= '<span style="color :red">Erreur sur l\'enregistrement du marqueur d\'appel : ' . $message_erreur . '</span>';
    if (getSettingAOui("abs2_jouer_sound_erreur")) {
        $message_enregistrement .= $chaine_son_alerte;
    }
    //on arrete la saisie
    include "saisir_groupe.php";
    die;
} else {
    if ($saisie->validate()) {
        $saisie->save();
        $message_enregistrement .= "<a href='visu_saisie.php?id_saisie=" . $saisie->getPrimaryKey() . "'>Marqueur d'appel enregistré</a><br/>";
    } else {
        //on arrete la saisie
        $message_enregistrement .= '<span style="color :red">Erreur sur l\'enregistrement du marqueur d\'appel : ' . format_verif_failures($saisie) . '</span>';
        if (getSettingAOui("abs2_jouer_sound_erreur")) {
            $message_enregistrement .= $chaine_son_alerte;
        }
        include "saisir_groupe.php";
        die;
    }
}
for ($i = 0; $i < $total_eleves; $i++) {
    if (!isset($_POST['id_eleve_absent'][$i])) {
        continue;