* SACoche est distribué dans l’espoir qu’il vous sera utile, mais SANS AUCUNE GARANTIE :
 * sans même la garantie implicite de COMMERCIALISABILITÉ ni d’ADÉQUATION À UN OBJECTIF PARTICULIER.
 * Consultez la Licence Publique Générale GNU Affero pour plus de détails.
 * 
 * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
 * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
 * 
 */

if(!defined('SACoche')) {exit('Ce fichier ne peut être appelé directement !');}
$TITRE = html(Lang::_("Gérer les parents"));

// Récupérer d'éventuels paramètres pour restreindre l'affichage
// Pas de passage par la page ajax.php, mais pas besoin ici de protection contre attaques type CSRF
$statut       = (isset($_POST['f_statut']))       ? Clean::entier($_POST['f_statut'])       : 1  ;
$debut_nom    = (isset($_POST['f_debut_nom']))    ? Clean::nom($_POST['f_debut_nom'])       : '' ;
$debut_prenom = (isset($_POST['f_debut_prenom'])) ? Clean::prenom($_POST['f_debut_prenom']) : '' ;
$find_doublon = (isset($_POST['f_doublon']))      ? TRUE                                    : FALSE ;
// Construire et personnaliser le formulaire pour restreindre l'affichage
$select_f_statuts = HtmlForm::afficher_select(Form::$tab_select_statut , 'f_statut' /*select_nom*/ , FALSE /*option_first*/ , $statut /*selection*/ , '' /*optgroup*/);

// Javascript
Layout::add( 'js_inline_before' , 'var input_date      = "'.TODAY_FR.'";' );
Layout::add( 'js_inline_before' , 'var date_mysql      = "'.TODAY_MYSQL.'";' );
Layout::add( 'js_inline_before' , 'var    LOGIN_LONGUEUR_MAX = '.   LOGIN_LONGUEUR_MAX.';' );
Layout::add( 'js_inline_before' , 'var PASSWORD_LONGUEUR_MAX = '.PASSWORD_LONGUEUR_MAX.';' );
Layout::add( 'js_inline_before' , 'var tab_login_modele      = new Array();' );
Layout::add( 'js_inline_before' , 'var tab_mdp_longueur_mini = new Array();' );
foreach($_SESSION['TAB_PROFILS_ADMIN']['LOGIN_MODELE'] as $profil_sigle => $login_modele)
{
  Layout::add( 'js_inline_before' , 'tab_login_modele["'.$profil_sigle.'"] = "'.$login_modele.'";' );
                 $tab_users_fichier[$id] = array($sconet_id, NULL, $nom, $prenom, $nb_absence, $nb_absence_nj, NULL, NULL);
             } else {
                 $tab_users_fichier[$id][4] += $nb_absence;
                 $tab_users_fichier[$id][5] += $nb_absence_nj;
             }
             $memo_date_debut = min($memo_date_debut, $date_debut);
             $memo_date_fin = max($memo_date_fin, $date_fin);
         }
     }
 }
 if ($xml->Retards) {
     $objet = 'retards';
     // cas d'un fichier de retards
     foreach ($xml->Retards as $eleve) {
         // il n'y a aucun identifiant disponible dans cet export...
         $nom = $eleve->NOM ? Clean::nom($eleve->NOM) : NULL;
         $prenom = $eleve->PRENOM ? Clean::prenom($eleve->PRENOM) : NULL;
         $nb_retard_nj = $eleve->REGLE && $eleve->REGLE == 'N' ? 1 : 0;
         $id = $nom . '.' . $prenom;
         $date = $eleve->DATE ? convert_date_french_to_mysql($eleve->DATE) : NULL;
         if ($nom && $prenom && $date) {
             if (!isset($tab_users_fichier[$id])) {
                 $tab_users_fichier[$id] = array(NULL, NULL, $nom, $prenom, NULL, NULL, 1, $nb_retard_nj);
             } else {
                 $tab_users_fichier[$id][6] += 1;
                 $tab_users_fichier[$id][7] += 1;
             }
             $memo_date_debut = min($memo_date_debut, $date);
             $memo_date_fin = max($memo_date_fin, $date);
         }
     }
if (!defined('SACoche')) {
    exit('Ce fichier ne peut être appelé directement !');
}
if ($_SESSION['SESAMATH_ID'] == ID_DEMO) {
    exit('Action désactivée pour la démo...');
}
$action = isset($_POST['f_action']) ? Clean::texte($_POST['f_action']) : '';
$check = isset($_POST['f_check']) ? Clean::entier($_POST['f_check']) : 0;
$id = isset($_POST['f_id']) ? Clean::entier($_POST['f_id']) : 0;
$id_ent = isset($_POST['f_id_ent']) ? Clean::texte($_POST['f_id_ent']) : '';
$id_gepi = isset($_POST['f_id_gepi']) ? Clean::texte($_POST['f_id_gepi']) : '';
$sconet_id = isset($_POST['f_sconet_id']) ? Clean::entier($_POST['f_sconet_id']) : 0;
$reference = isset($_POST['f_reference']) ? Clean::ref($_POST['f_reference']) : '';
$profil = isset($_POST['f_profil']) ? Clean::texte($_POST['f_profil']) : '';
$genre = isset($_POST['f_genre']) ? Clean::texte($_POST['f_genre']) : '';
$nom = isset($_POST['f_nom']) ? Clean::nom($_POST['f_nom']) : '';
$prenom = isset($_POST['f_prenom']) ? Clean::prenom($_POST['f_prenom']) : '';
$login = isset($_POST['f_login']) ? Clean::login($_POST['f_login']) : '';
$password = isset($_POST['f_password']) ? Clean::password($_POST['f_password']) : '';
$sortie_date = isset($_POST['f_sortie_date']) ? Clean::date_fr($_POST['f_sortie_date']) : '';
$box_login = isset($_POST['box_login']) ? Clean::entier($_POST['box_login']) : 0;
$box_password = isset($_POST['box_password']) ? Clean::entier($_POST['box_password']) : 0;
$box_date = isset($_POST['box_date']) ? Clean::entier($_POST['box_date']) : 0;
$courriel = isset($_POST['f_courriel']) ? Clean::courriel($_POST['f_courriel']) : '';
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Ajouter un nouveau personnel
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if ($action == 'ajouter' && $profil && isset(Html::$tab_genre['adulte'][$genre]) && $nom && $prenom && ($box_login || $login) && ($box_password || $password) && ($box_date || $sortie_date)) {
    // Vérifier le profil
    if (!isset($_SESSION['TAB_PROFILS_ADMIN']['TYPE'][$profil]) || !in_array($_SESSION['TAB_PROFILS_ADMIN']['TYPE'][$profil], array('professeur', 'directeur'))) {
        exit('Erreur : profil incorrect !');
 * Vous devriez avoir reçu une copie de la Licence Publique Générale GNU Affero avec SACoche ;
 * si ce n’est pas le cas, consultez : <http://www.gnu.org/licenses/>.
 * 
 */
if (!defined('SACoche')) {
    exit('Ce fichier ne peut être appelé directement !');
}
if ($_SESSION['SESAMATH_ID'] == ID_DEMO) {
    exit('Action désactivée pour la démo...');
}
$action = isset($_POST['action']) ? $_POST['action'] : '';
$geo1 = isset($_POST['f_geo1']) ? Clean::entier($_POST['f_geo1']) : 0;
$geo2 = isset($_POST['f_geo2']) ? Clean::entier($_POST['f_geo2']) : 0;
$geo3 = isset($_POST['f_geo3']) ? Clean::entier($_POST['f_geo3']) : 0;
$uai = isset($_POST['f_uai']) ? Clean::uai($_POST['f_uai']) : '';
$contact_nom = isset($_POST['f_contact_nom']) ? Clean::nom($_POST['f_contact_nom']) : '';
$contact_prenom = isset($_POST['f_contact_prenom']) ? Clean::prenom($_POST['f_contact_prenom']) : '';
$contact_courriel = isset($_POST['f_contact_courriel']) ? Clean::courriel($_POST['f_contact_courriel']) : '';
$sesamath_id = isset($_POST['f_sesamath_id']) ? Clean::entier($_POST['f_sesamath_id']) : 0;
$sesamath_uai = isset($_POST['f_sesamath_uai']) ? Clean::uai($_POST['f_sesamath_uai']) : '';
$sesamath_type_nom = isset($_POST['f_sesamath_type_nom']) ? Clean::texte($_POST['f_sesamath_type_nom']) : '';
$sesamath_key = isset($_POST['f_sesamath_key']) ? Clean::texte($_POST['f_sesamath_key']) : '';
$etablissement_denomination = isset($_POST['f_etablissement_denomination']) ? Clean::texte($_POST['f_etablissement_denomination']) : '';
$etablissement_adresse1 = isset($_POST['f_etablissement_adresse1']) ? Clean::texte($_POST['f_etablissement_adresse1']) : '';
$etablissement_adresse2 = isset($_POST['f_etablissement_adresse2']) ? Clean::texte($_POST['f_etablissement_adresse2']) : '';
$etablissement_adresse3 = isset($_POST['f_etablissement_adresse3']) ? Clean::texte($_POST['f_etablissement_adresse3']) : '';
$etablissement_telephone = isset($_POST['f_etablissement_telephone']) ? Clean::texte($_POST['f_etablissement_telephone']) : '';
$etablissement_fax = isset($_POST['f_etablissement_fax']) ? Clean::texte($_POST['f_etablissement_fax']) : '';
$etablissement_courriel = isset($_POST['f_etablissement_courriel']) ? Clean::texte($_POST['f_etablissement_courriel']) : '';
$etablissement_url = isset($_POST['f_etablissement_url']) ? Clean::url($_POST['f_etablissement_url']) : '';
$etablissement_langue = isset($_POST['f_etablissement_langue']) ? Clean::texte($_POST['f_etablissement_langue']) : '';
 $tab_nouvel_uai = array();
 $tab_nouvel_id = array();
 $nb_lignes_trouvees = 0;
 $tab_erreur = array('info' => array('nb' => 0, 'txt' => ' manquant d\'informations !'), 'geo' => array('nb' => 0, 'txt' => ' avec identifiant géographique incorrect !'), 'uai' => array('nb' => 0, 'txt' => ' avec UAI déjà présent ou en double ou incorrect !'), 'mail' => array('nb' => 0, 'txt' => ' avec adresse de courriel incorrecte !'), 'date' => array('nb' => 0, 'txt' => ' avec date d\'inscription incorrecte !'), 'fichier' => array('nb' => 0, 'txt' => ' avec nom de fichier de sauvegarde incorrect !'), 'id' => array('nb' => 0, 'txt' => ' avec identifiant de base déjà utilisé ou en double !'));
 foreach ($tab_lignes as $ligne_contenu) {
     $tab_elements = str_getcsv($ligne_contenu, $separateur);
     $tab_elements = array_slice($tab_elements, 0, 11);
     if (count($tab_elements) == 11) {
         $nb_lignes_trouvees++;
         list($export_id, $import_id, $geo_id, $localisation, $denomination, $uai, $contact_nom, $contact_prenom, $contact_courriel, $date, $fichier_nom) = $tab_elements;
         $import_id = Clean::entier($import_id);
         $geo_id = Clean::entier($geo_id);
         $localisation = Clean::texte($localisation);
         $denomination = Clean::texte($denomination);
         $uai = Clean::uai($uai);
         $contact_nom = Clean::nom($contact_nom);
         $contact_prenom = Clean::prenom($contact_prenom);
         $contact_courriel = Clean::courriel($contact_courriel);
         $_SESSION['tab_info'][$nb_lignes_trouvees] = array('import_id' => $import_id, 'geo_id' => $geo_id, 'localisation' => $localisation, 'denomination' => $denomination, 'uai' => $uai, 'contact_nom' => $contact_nom, 'contact_prenom' => $contact_prenom, 'contact_courriel' => $contact_courriel, 'date' => $date, 'fichier_nom' => $fichier_nom);
         // Vérifier la présence des informations
         if (!$geo_id || !$localisation || !$denomination || !$contact_nom || !$contact_prenom || !$contact_courriel || !$date || !$fichier_nom) {
             $tab_erreur['info']['nb']++;
         }
         // Vérifier que l'id géographique est correct
         if (!isset($tab_geo[$geo_id])) {
             $tab_erreur['geo']['nb']++;
         }
         // Vérifier que le n°UAI est disponible
         if ($uai) {
             if (!tester_UAI($uai) || isset($tab_nouvel_uai[$uai]) || DB_WEBMESTRE_WEBMESTRE::DB_tester_structure_UAI($uai)) {
                 $tab_erreur['uai']['nb']++;
 if (count($tab_elements) > $numero_max) {
     $genre = isset($tab_genre[$tab_elements[$tab_numero_colonne['genre']]]) ? $tab_genre[$tab_elements[$tab_numero_colonne['genre']]] : 'I';
     $nom = Clean::nom($tab_elements[$tab_numero_colonne['nom']]);
     $prenom = Clean::prenom($tab_elements[$tab_numero_colonne['prenom']]);
     $courriel = Clean::courriel($tab_elements[$tab_numero_colonne['courriel']]);
     $adresse = Clean::adresse($tab_elements[$tab_numero_colonne['adresse']]);
     $codepostal = Clean::codepostal($tab_elements[$tab_numero_colonne['codepostal']]);
     $commune = Clean::commune($tab_elements[$tab_numero_colonne['commune']]);
     $pays = Clean::pays($tab_elements[$tab_numero_colonne['pays']]);
     if ($nom != '' && $prenom != '') {
         $tab_enfants = array();
         for ($num_enfant = 0; $num_enfant < $nb_enfants_maxi; $num_enfant++) {
             if (!isset($tab_elements[$tab_numero_colonne['enfant_nom'][$num_enfant]]) || !isset($tab_elements[$tab_numero_colonne['enfant_prenom'][$num_enfant]])) {
                 break;
             }
             $enfant_nom = Clean::nom($tab_elements[$tab_numero_colonne['enfant_nom'][$num_enfant]]);
             $enfant_prenom = Clean::prenom($tab_elements[$tab_numero_colonne['enfant_prenom'][$num_enfant]]);
             $enfant_id = array_search($enfant_nom . ' ' . $enfant_prenom, $tab_eleves_actuels);
             if ($enfant_id) {
                 $tab_responsabilites[$enfant_id]++;
                 $tab_enfants[$enfant_id] = $tab_responsabilites[$enfant_id];
             }
         }
         //
         // Si pas d'enfant trouvé, on laisse tomber, comme pour Sconet.
         //
         if (count($tab_enfants)) {
             $tab_users_fichier['sconet_id'][] = 0;
             $tab_users_fichier['sconet_num'][] = 0;
             $tab_users_fichier['reference'][] = '';
             $tab_users_fichier['profil_sigle'][] = 'TUT';
      'prenom'    => $user_prenom,
      'id_ent'    => $user_id_ent,
      'login'     => '',
      'classe'    => NULL,
      'groupes'   => array(),
    );
  }
}

// Les parents
if(!empty($tab_annuaire['parents']))
{
  foreach($tab_annuaire['parents'] as $tab_infos)
  {
    $user_id         = Clean::entier($tab_infos['user_id']);
    $user_nom        = Clean::nom($tab_infos['nom']) ;
    $user_prenom     = Clean::prenom($tab_infos['prenom']) ;
    $user_id_ent     = Clean::id_ent($tab_infos['id_ent']);
    $tab_parents[$user_id] = array(
      'nom'       => $user_nom,
      'prenom'    => $user_prenom,
      'id_ent'    => $user_id_ent,
      'login'     => '',
      'adresse'   => array(),
      'enfants'   => array(),
    );
  }
}

/****************************************************************************************************
 * Récupérer les informations sur les matières.
Beispiel #8
0
 * 1. mettre à 90 le 3e paramètre de imagettftext() ; problème -> il y a des décalages par exemple quand le prénom comporte un "y"
 * 2. utiliser imagerotate() ; problème -> on perd la transparence alpha car le 4e paramètre de imagerotate() ne passe pas sur les png
 * Une issue à consister à utiliser la méthode 2 en ajoutant ensuite imagealphablending() et imagesavealpha() [http://fr.php.net/manual/fr/function.imagerotate.php#64531]
 * Et il faut aussi appeler ces deux fonctions au chargement de l'image déjà créée...
 * Mais un nouveau problème apparait : certains serveurs (celui de Montpellier par exemple) gèrent mal ces fonctions de transparence (pour des librairies GD identiques...).
 * Du coup, comme les images sont de toutes façons toujours utilisées sur un même fond (CCCCFF / 204:204:255), le plus simple (et la solution) a été de renoncer à utiliser la transparence.
 * Donc imagecolorallocatealpha() a été remplacé par imagecolorallocate() et imagealphablending($image_finale, false); + imagesavealpha($image_finale, true); ont été retirés.
 */
// Ce fichier est directement appelé par le navigateur et n'inclut pas tous les fichiers habituels.
header("Content-type: image/png");
// Constantes / Configuration serveur / Autoload classes / Fonction de sortie
require '../../_inc/_loader.php';
// Non chargé par le loader dont on ne prend que le début
require CHEMIN_DOSSIER_INCLUDE . 'class.Clean.php';
$dossier = isset($_GET['dossier']) ? Clean::entier($_GET['dossier']) : 'x';
$nom = isset($_GET['nom']) ? Clean::nom($_GET['nom']) : ' ';
$prenom = isset($_GET['prenom']) ? Clean::prenom($_GET['prenom']) : ' ';
$br_line = isset($_GET['br']) ? 2 : 1;
// 2 pour nom / retour à la ligne / prénom ; 1 pour nom / prénom à la suite
$font_size = isset($_GET['size']) ? Clean::entier($_GET['size']) : 10;
$chemin = CHEMIN_DOSSIER_BADGE . $dossier . DS;
$fichier = $chemin . Clean::login($nom . '_' . $prenom) . '_' . $br_line . '_' . $font_size . '.png';
// ////////////////////////////////////////////////////////////////////////////////////////////////////
// Créer l'image si elle n'existe pas
// ////////////////////////////////////////////////////////////////////////////////////////////////////
if (!file_exists($fichier)) {
    // S'assurer que le dossier, lui, existe bien au moins, sinon ce n'est pas la peine de poursuivre
    if (!is_dir($chemin)) {
        header('Status: 404 Not Found', true, 404);
        exit;
    }
 // Récupérer les données
 foreach ($tab_lignes as $ligne_contenu) {
     $tab_elements = str_getcsv($ligne_contenu, $separateur);
     if (count($tab_elements) > 2) {
         $id_ent = $tab_elements[$tab_infos_csv['csv_id_ent']];
         $nom = $tab_elements[$tab_infos_csv['csv_nom']];
         $prenom = $tab_elements[$tab_infos_csv['csv_prenom']];
         $id_sconet = $tab_infos_csv['csv_id_sconet'] == NULL ? '' : $tab_elements[$tab_infos_csv['csv_id_sconet']];
         if ($id_ent != '' && $nom != '' && $prenom != '') {
             if (substr($_SESSION['CONNEXION_NOM'], 0, 7) == 'logica_') {
                 // Dans les CSV de Lilie & Celi@ & PCN, il faut remplacer "ID : " par "UT" (exemple : "ID : 75185265" devient "UT75185265").
                 // 06/06/2014 - Dans PCN c'est maintenant bon, ils exportent un CSV propre et compatible avec tous les utilisateurs.
                 $id_ent = str_replace('ID : ', 'UT', $id_ent);
             }
             $tab_users_fichier['id_ent'][] = Clean::id_ent($id_ent);
             $tab_users_fichier['nom'][] = Clean::nom(Clean::accents($nom));
             // En cas de comparaison sur nom / prénom, maieux vaut éviter les accents
             $tab_users_fichier['prenom'][] = Clean::prenom(Clean::accents($prenom));
             $tab_users_fichier['id_sconet'][] = Clean::entier($id_sconet);
         }
     }
 }
 // On trie
 array_multisort($tab_users_fichier['nom'], SORT_ASC, SORT_STRING, $tab_users_fichier['prenom'], SORT_ASC, SORT_STRING, $tab_users_fichier['id_ent'], $tab_users_fichier['id_sconet']);
 // On récupère le contenu de la base pour comparer
 $tab_users_base = array();
 $tab_users_base['id_ent'] = array();
 $tab_users_base['nom'] = array();
 $tab_users_base['prenom'] = array();
 $tab_users_base['id_sconet'] = array();
 $tab_users_base['info'] = array();
Beispiel #10
0
/**
 * recuperer_infos_Laclasse
 * 
 * @param string   $UAI
 * @return array|string
 */
function recuperer_infos_Laclasse($UAI)
{
  // Appeler l'annuaire ENT Laclasse.com
  $tab_Laclasse = Laclasse::get_info_from_annuaire( $UAI , '' , FALSE /*exit_if_error*/ , TRUE /*with_details*/ );
  // Enregistrer la réponse pour aider au débuggage si besoin
  FileSystem::ecrire_fichier( CHEMIN_DOSSIER_IMPORT.'Laclasse_'.$UAI.'_recup_IdEnt_'.fabriquer_fin_nom_fichier__date_et_alea().'.txt' , print_r($tab_Laclasse,TRUE) );
  // On examine la réponse
  if(!is_array($tab_Laclasse))
  {
    exit($tab_Laclasse);
  }
  // Pour récupérer les données des utilisateurs
  $tab_users_annuaire              = array();
  $tab_users_annuaire['ordre']     = array();
  $tab_users_annuaire['profil']    = array();
  $tab_users_annuaire['id_ent']    = array();
  $tab_users_annuaire['nom']       = array();
  $tab_users_annuaire['prenom']    = array();
  $tab_users_annuaire['id_sconet'] = array(); // Ne servira que pour les élèves
  if(!empty($tab_Laclasse['personnel']))
  {
    foreach($tab_Laclasse['personnel'] as $tab_infos)
    {
      $user_profil = NULL;
      if( in_array( $tab_infos['profil_id'] , array('DIR','DOC','ENS') ) )
      {
        // Personnels de direction, enseignants y compris professeur documentaliste
        $ordre = 1;
        $user_profil = $tab_infos['profil_id'];
      }
      else if($tab_infos['profil_id']=='ETA')
      {
        if($tab_infos['libelle']=='EDUCATION')
        {
          // CPE
          $ordre = 1;
          $user_profil = 'EDU';
        }
        elseif($tab_infos['description']=='ENCADRE. SUR. DES ELEVES (HORS INTERNAT)')
        {
          // Surveillants
          $ordre = 4;
          $user_profil = 'SUR';
        }
        elseif($tab_infos['libelle']=='ASSISTANT D\'EDUCATION')
        {
          // AED
          $ordre = 4;
          $user_profil = 'AED';
        }
        elseif($tab_infos['libelle']=='ORIENTATION')
        {
          // Co-Psy
          $ordre = 4;
          $user_profil = 'ORI';
        }
        elseif($tab_infos['libelle']=='PERSONNELS ADMINISTRATIFS')
        {
          // Personnels administratifs
          $ordre = 4;
          $user_profil = 'ADF';
        }
      }
      else if($tab_infos['profil_id']=='EVS')
      {
        // Personnels medico-sociaux
        $ordre = 4;
        $user_profil = 'MDS';
      }
      if($user_profil)
      {
        $tab_users_annuaire['ordre'    ][] = $ordre;
        $tab_users_annuaire['profil'   ][] = $user_profil;
        $tab_users_annuaire['id_ent'   ][] = Clean::id_ent($tab_infos['id_ent']);
        $tab_users_annuaire['nom'      ][] = Clean::nom($tab_infos['nom']);
        $tab_users_annuaire['prenom'   ][] = Clean::prenom($tab_infos['prenom']);
        $tab_users_annuaire['id_sconet'][] = NULL;
      }
    }
  }
  // Les élèves
  if(!empty($tab_Laclasse['eleves']))
  {
    foreach($tab_Laclasse['eleves'] as $tab_infos)
    {
      $tab_users_annuaire['ordre'    ][] = 2;
      $tab_users_annuaire['profil'   ][] = 'ELV';
      $tab_users_annuaire['id_ent'   ][] = Clean::id_ent($tab_infos['id_ent']);
      $tab_users_annuaire['nom'      ][] = Clean::nom($tab_infos['nom']);
      $tab_users_annuaire['prenom'   ][] = Clean::prenom($tab_infos['prenom']);
      $tab_users_annuaire['id_sconet'][] = Clean::entier($tab_infos['id_sconet']);
    }
  }
  // Les parents
  if(!empty($tab_Laclasse['parents']))
  {
    foreach($tab_Laclasse['parents'] as $tab_infos)
    {
      $tab_users_annuaire['ordre'    ][] = 3;
      $tab_users_annuaire['profil'   ][] = 'TUT';
      $tab_users_annuaire['id_ent'   ][] = Clean::id_ent($tab_infos['id_ent']);
      $tab_users_annuaire['nom'      ][] = Clean::nom($tab_infos['nom']);
      $tab_users_annuaire['prenom'   ][] = Clean::prenom($tab_infos['prenom']);
      $tab_users_annuaire['id_sconet'][] = NULL;
    }
  }
  // On trie
  array_multisort(
    $tab_users_annuaire['ordre'] , SORT_ASC,SORT_NUMERIC,
    $tab_users_annuaire['profil'], SORT_ASC,SORT_STRING,
    $tab_users_annuaire['nom']   , SORT_ASC,SORT_STRING,
    $tab_users_annuaire['prenom'], SORT_ASC,SORT_STRING,
    $tab_users_annuaire['id_ent'],
    $tab_users_annuaire['id_sconet']
  );
  // On retire l'ordre dont on n'a plus besoin
  unset($tab_users_annuaire['ordre']);
  // On retourne le tableau
  return $tab_users_annuaire;
}
   if(count($tab_elements)>2)
   {
     $id_ent    = $tab_elements[ $tab_infos_csv['csv_id_ent'] ];
     $nom       = $tab_elements[ $tab_infos_csv['csv_nom']    ];
     $prenom    = $tab_elements[ $tab_infos_csv['csv_prenom'] ];
     $id_sconet = ($tab_infos_csv['csv_id_sconet']==NULL) ? '' : $tab_elements[ $tab_infos_csv['csv_id_sconet'] ] ;
     if( ($id_ent!='') && ($nom!='') && ($prenom!='') )
     {
       if(substr($_SESSION['CONNEXION_NOM'],0,7)=='logica_')
       {
         // Dans les CSV de Lilie & Celi@ & PCN, il faut remplacer "ID : " par "UT" (exemple : "ID : 75185265" devient "UT75185265").
         // 06/06/2014 - Dans PCN c'est maintenant bon, ils exportent un CSV propre et compatible avec tous les utilisateurs.
         $id_ent = str_replace('ID : ','UT',$id_ent);
       }
       $tab_users_fichier['id_ent'][]    = Clean::id_ent($id_ent);
       $tab_users_fichier['nom'][]       = Clean::nom(Clean::accents($nom)); // En cas de comparaison sur nom / prénom, maieux vaut éviter les accents
       $tab_users_fichier['prenom'][]    = Clean::prenom(Clean::accents($prenom));
       $tab_users_fichier['id_sconet'][] = Clean::entier($id_sconet);
     }
   }
 }
 // On trie
 array_multisort(
   $tab_users_fichier['nom']   , SORT_ASC,SORT_STRING,
   $tab_users_fichier['prenom'], SORT_ASC,SORT_STRING,
   $tab_users_fichier['id_ent'],
   $tab_users_fichier['id_sconet']
 );
 // On récupère le contenu de la base pour comparer
 $tab_users_base              = array();
 $tab_users_base['id_ent']    = array();
 }
 $fichier_contenu = file_get_contents(CHEMIN_DOSSIER_IMPORT.$fichier_nom);
 $fichier_contenu = To::deleteBOM(To::utf8($fichier_contenu)); // Mettre en UTF-8 si besoin et retirer le BOM éventuel
 $xml = @simplexml_load_string($fichier_contenu);
 if($xml===FALSE)
 {
   exit('Erreur : le fichier transmis n\'est pas un XML valide !');
 }
 // On extrait les infos du XML
 $tab_eleve_fichier = array();
 if( ($xml->donnees) && ($xml->donnees->eleve) )
 {
   foreach ($xml->donnees->eleve as $eleve)
   {
     $tab_eleve_fichier['sconet_id'][] = Clean::entier($eleve->attributes()->id);
     $tab_eleve_fichier['nom'][]       = Clean::nom($eleve->attributes()->nom);
     $tab_eleve_fichier['prenom'][]    = Clean::prenom($eleve->attributes()->prenom);
     // Indication des (in-)validations
     $tab_validations = array();
     if($eleve->palier)
     {
       foreach ($eleve->palier as $palier)
       {
         $palier_id = Clean::entier($palier->attributes()->id);
         if($palier->competence)
         {
           foreach ($palier->competence as $competence)
           {
             $pilier_id = Clean::entier($competence->attributes()->id);
             if( ($competence->validation) && ($competence->validation->date) )
             {
     Clean::commune($tab_elements[$tab_numero_colonne['code_postal_1']]) , // pas un nombre entier à l'étranger
     Clean::commune($tab_elements[$tab_numero_colonne['commune_1']]) ,
     Clean::pays($tab_elements[$tab_numero_colonne['pays_1']]) ,
   );
   $nb_lien_responsabilite++;
   $tab_adresses_uniques[ implode('#',$tab_users_fichier['adresse'][$sconet_num_resp1]) ] = TRUE;
 }
 $sconet_num_resp2 = ( $tab_elements[$tab_numero_colonne['sconet_num_2']] && ($tab_elements[$tab_numero_colonne['sconet_num_2']]!='Non saisi') ) ? Clean::entier($tab_elements[$tab_numero_colonne['sconet_num_2']]) : NULL ;
 if($sconet_num_resp2)
 {
   $tab_users_fichier['sconet_id'   ][$sconet_num_resp2] = 0;
   $tab_users_fichier['sconet_num'  ][$sconet_num_resp2] = $sconet_num_resp2;
   $tab_users_fichier['reference'   ][$sconet_num_resp2] = '';
   $tab_users_fichier['profil_sigle'][$sconet_num_resp2] = 'TUT' ;
   $tab_users_fichier['genre'       ][$sconet_num_resp2] = isset($tab_genre[$tab_elements[$tab_numero_colonne['genre_2']]]) ? $tab_genre[$tab_elements[$tab_numero_colonne['genre_2']]] : 'I' ;
   $tab_users_fichier['nom'         ][$sconet_num_resp2] = Clean::nom($tab_elements[$tab_numero_colonne['nom_2']]);
   $tab_users_fichier['prenom'      ][$sconet_num_resp2] = Clean::prenom($tab_elements[$tab_numero_colonne['prenom_2']]);
   $tab_users_fichier['courriel'    ][$sconet_num_resp2] = Clean::courriel($tab_elements[$tab_numero_colonne['courriel_2']]);
   $tab_users_fichier['enfant'      ][$sconet_num_resp2][$tab_eleves_actuels[$sconet_num_eleve]] = 2;
   $tab_users_fichier['adresse'     ][$sconet_num_resp2] = array(
     Clean::adresse($tab_elements[$tab_numero_colonne['adresse_ligne1_2']]) ,
     Clean::adresse($tab_elements[$tab_numero_colonne['adresse_ligne2_2']]) ,
     Clean::adresse($tab_elements[$tab_numero_colonne['adresse_ligne3_2']]) ,
     '' ,
     Clean::commune($tab_elements[$tab_numero_colonne['code_postal_2']]) , // pas un nombre entier à  l'étranger
     Clean::commune($tab_elements[$tab_numero_colonne['commune_2']]) ,
     Clean::pays($tab_elements[$tab_numero_colonne['pays_2']]) ,
   );
   $nb_lien_responsabilite++;
   $tab_adresses_uniques[ implode('#',$tab_users_fichier['adresse'][$sconet_num_resp2]) ] = TRUE;
   // Correctif pour obtenir la vraie valeur de "commune_2"
         $tab_users_fichier[$id][4] += $nb_absence;
         $tab_users_fichier[$id][5] += $nb_absence_nj;
       }
       $memo_date_debut = min( $memo_date_debut , $date_debut );
       $memo_date_fin   = max( $memo_date_fin   , $date_fin   );
     }
   }
 }
 if($xml->Retards)
 {
   $objet = 'retards';
   // cas d'un fichier de retards
   foreach ($xml->Retards as $eleve)
   {
     // il n'y a aucun identifiant disponible dans cet export...
     $nom    = ($eleve->NOM)    ? Clean::nom($eleve->NOM)        : NULL ;
     $prenom = ($eleve->PRENOM) ? Clean::prenom($eleve->PRENOM)  : NULL ;
     $nb_retard_nj = ($eleve->REGLE) && ($eleve->REGLE=='N') ? 1 : 0 ;
     $id     = $nom.'.'.$prenom ;
     $date   = ($eleve->DATE)   ? convert_date_french_to_mysql($eleve->DATE) : NULL ;
     if( $nom && $prenom && $date )
     {
       if(!isset($tab_users_fichier[$id]))
       {
         $tab_users_fichier[$id] = array(
           NULL,
           NULL,
           $nom,
           $prenom,
           NULL,
           NULL,