/**
  * ajouter_comptes_associes
  *
  * @param string $user_liste   (sans les ',' aux extrémités)
  * @return int
  */
 public static function DB_ajouter_comptes_associes($user_liste)
 {
     $DB_SQL = 'INSERT INTO sacoche_user_switch( user_switch_liste) ';
     $DB_SQL .= 'VALUES                         (:user_switch_liste)';
     $DB_VAR = array(':user_switch_liste' => ',' . $user_liste . ',');
     DB::query(SACOCHE_STRUCTURE_BD_NAME, $DB_SQL, $DB_VAR);
     return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
 }
/**
 * DB_STRUCTURE_importer_arborescence_from_XML
 * Importer dans la base l'arborescence d'un référentiel à partir d'un XML récupéré sur le serveur communautaire.
 * Remarque : les ordres des domaines / thèmes / items ne sont pas dans le XML car il sont générés par leur position dans l'arborescence
 *
 * @param string $arbreXML
 * @param int    $matiere_id
 * @param int    $niveau_id
 * @return void
 */
function DB_STRUCTURE_importer_arborescence_from_XML($arbreXML,$matiere_id,$niveau_id)
{
	// décortiquer l'arbre XML
	$xml = new DOMDocument;
	$xml -> loadXML($arbreXML);
	// On passe en revue les domaines...
	$domaine_liste = $xml -> getElementsByTagName('domaine');
	$domaine_nb = $domaine_liste -> length;
	for($domaine_ordre=0; $domaine_ordre<$domaine_nb; $domaine_ordre++)
	{
		$domaine_xml = $domaine_liste -> item($domaine_ordre);
		$domaine_ref = $domaine_xml -> getAttribute('ref');
		$domaine_nom = $domaine_xml -> getAttribute('nom');
		$DB_SQL = 'INSERT INTO sacoche_referentiel_domaine(matiere_id,niveau_id,domaine_ordre,domaine_ref,domaine_nom) ';
		$DB_SQL.= 'VALUES(:matiere_id,:niveau_id,:ordre,:ref,:nom)';
		$DB_VAR = array(':matiere_id'=>$matiere_id,':niveau_id'=>$niveau_id,':ordre'=>$domaine_ordre+1,':ref'=>$domaine_ref,':nom'=>$domaine_nom);
		DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
		$domaine_id = DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
		// On passe en revue les thèmes du domaine...
		$theme_liste = $domaine_xml -> getElementsByTagName('theme');
		$theme_nb = $theme_liste -> length;
		for($theme_ordre=0; $theme_ordre<$theme_nb; $theme_ordre++)
		{
			$theme_xml = $theme_liste -> item($theme_ordre);
			$theme_nom = $theme_xml -> getAttribute('nom');
			$DB_SQL = 'INSERT INTO sacoche_referentiel_theme(domaine_id,theme_ordre,theme_nom) ';
			$DB_SQL.= 'VALUES(:domaine_id,:ordre,:nom)';
			$DB_VAR = array(':domaine_id'=>$domaine_id,':ordre'=>$theme_ordre+1,':nom'=>$theme_nom);
			DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
			$theme_id = DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
			// On passe en revue les items du thème...
			$item_liste = $theme_xml -> getElementsByTagName('item');
			$item_nb = $item_liste -> length;
			for($item_ordre=0; $item_ordre<$item_nb; $item_ordre++)
			{
				$item_xml   = $item_liste -> item($item_ordre);
				$item_socle = $item_xml -> getAttribute('socle');
				$item_nom   = $item_xml -> getAttribute('nom');
				$item_coef  = $item_xml -> getAttribute('coef');
				$item_cart  = $item_xml -> getAttribute('cart');
				$item_lien  = $item_xml -> getAttribute('lien');
				$DB_SQL = 'INSERT INTO sacoche_referentiel_item(theme_id,entree_id,item_ordre,item_nom,item_coef,item_cart,item_lien) ';
				$DB_SQL.= 'VALUES(:theme,:socle,:ordre,:nom,:coef,:cart,:lien)';
				$DB_VAR = array(':theme'=>$theme_id,':socle'=>$item_socle,':ordre'=>$item_ordre,':nom'=>$item_nom,':coef'=>$item_coef,':cart'=>$item_cart,':lien'=>$item_lien);
				DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
				// $item_id = DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME); // inutile
			}
		}
	}
}
/**
 * ajouter_utilisateur
 *
 * @param int         $user_sconet_id
 * @param int         $user_sconet_elenoet
 * @param string      $user_reference
 * @param string      $user_profil_sigle
 * @param string      $user_genre
 * @param string      $user_nom
 * @param string      $user_prenom
 * @param string|NULL $user_naissance_date
 * @param string      $user_email
 * @param string      $user_email_origine
 * @param string      $user_login
 * @param string      $password_crypte
 * @param int         $eleve_classe_id facultatif, 0 si pas de classe ou profil non élève
 * @param string      $user_id_ent     facultatif
 * @param string      $user_id_gepi    facultatif
 * @return int
 */
public static function DB_ajouter_utilisateur($user_sconet_id,$user_sconet_elenoet,$user_reference,$user_profil_sigle,$user_genre,$user_nom,$user_prenom,$user_naissance_date,$user_email,$user_email_origine,$user_login,$password_crypte,$eleve_classe_id=0,$user_id_ent='',$user_id_gepi='')
{
  $DB_SQL = 'INSERT INTO sacoche_user(user_sconet_id, user_sconet_elenoet, user_reference, user_profil_sigle, user_genre, user_nom, user_prenom, user_naissance_date, user_email, user_email_origine, user_login, user_password,   eleve_classe_id, user_id_ent, user_id_gepi) ';
  $DB_SQL.= 'VALUES(                 :user_sconet_id,:user_sconet_elenoet,:user_reference,:user_profil_sigle,:user_genre,:user_nom,:user_prenom,:user_naissance_date,:user_email,:user_email_origine,:user_login,:password_crypte,:eleve_classe_id,:user_id_ent,:user_id_gepi)';
  $DB_VAR = array(
    ':user_sconet_id'      => $user_sconet_id,
    ':user_sconet_elenoet' => $user_sconet_elenoet,
    ':user_reference'      => $user_reference,
    ':user_profil_sigle'   => $user_profil_sigle,
    ':user_genre'          => $user_genre,
    ':user_nom'            => $user_nom,
    ':user_prenom'         => $user_prenom,
    ':user_naissance_date' => $user_naissance_date,
    ':user_email'          => $user_email,
    ':user_email_origine'  => $user_email_origine,
    ':user_login'          => $user_login,
    ':password_crypte'     => $password_crypte,
    ':eleve_classe_id'     => $eleve_classe_id,
    ':user_id_ent'         => $user_id_ent,
    ':user_id_gepi'        => $user_id_gepi,
  );
  DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
  return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
}
 /**
  * ajouter
  *
  * @param int    $proprio_id
  * @param string $selection_item_nom
  * @param string $tab_id_items   tableau des id des items
  * @return int
  */
 public static function DB_ajouter($proprio_id, $selection_item_nom)
 {
     $DB_SQL = 'INSERT INTO sacoche_selection_item( proprio_id, selection_item_nom) ';
     $DB_SQL .= 'VALUES                            (:proprio_id,:selection_item_nom) ';
     $DB_VAR = array(':proprio_id' => $proprio_id, ':selection_item_nom' => $selection_item_nom);
     DB::query(SACOCHE_STRUCTURE_BD_NAME, $DB_SQL, $DB_VAR);
     return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
 }
/**
 * ajouter_periode
 *
 * @param int    $periode_ordre
 * @param string $periode_nom
 * @return int
 */
public static function DB_ajouter_periode($periode_ordre,$periode_nom)
{
  $DB_SQL = 'INSERT INTO sacoche_periode(periode_ordre,periode_nom) ';
  $DB_SQL.= 'VALUES(:periode_ordre,:periode_nom)';
  $DB_VAR = array(
    ':periode_ordre' => $periode_ordre,
    ':periode_nom'   => $periode_nom,
  );
  DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
  return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
}
 /**
  * Insérer l'enregistrement d'un partenaires ENT conventionné
  *
  * @param string $denomination
  * @param string $nom
  * @param string $prenom
  * @param string $courriel
  * @param string $password_crypte
  * @param string $connecteurs
  * @return int
  */
 public static function DB_ajouter_partenaire_conventionne($denomination, $nom, $prenom, $courriel, $password_crypte, $connecteurs)
 {
     $DB_SQL = 'INSERT INTO sacoche_partenaire(partenaire_denomination,partenaire_nom,partenaire_prenom,partenaire_courriel,partenaire_password,partenaire_connecteurs) ';
     $DB_SQL .= 'VALUES(                                  :denomination,          :nom,          :prenom,          :courriel,   :password_crypte,          :connecteurs)';
     $DB_VAR = array(':denomination' => $denomination, ':nom' => $nom, ':prenom' => $prenom, ':courriel' => $courriel, ':password_crypte' => $password_crypte, ':connecteurs' => $connecteurs);
     DB::query(SACOCHE_WEBMESTRE_BD_NAME, $DB_SQL, $DB_VAR);
     return DB::getLastOid(SACOCHE_WEBMESTRE_BD_NAME);
 }
 /**
  * Ajouter une demande d'évaluation
  *
  * @param int      $eleve_id
  * @param int      $matiere_id
  * @param int      $item_id
  * @param int      $prof_id
  * @param int|null $demande_score
  * @param string   $demande_statut
  * @param string   $message
  * @param string   $demande_doc
  * @return int
  */
 public static function DB_ajouter_demande($eleve_id, $matiere_id, $item_id, $prof_id, $demande_score, $demande_statut, $message, $demande_doc)
 {
     $demande_messages = $message ? afficher_identite_initiale($_SESSION['USER_NOM'], FALSE, $_SESSION['USER_PRENOM'], TRUE) . "\r\n" . $message : '';
     $DB_SQL = 'INSERT INTO sacoche_demande( eleve_id, matiere_id, item_id, prof_id,demande_date, demande_score, demande_statut, demande_messages, demande_doc) ';
     $DB_SQL .= 'VALUES                     (:eleve_id,:matiere_id,:item_id,:prof_id,       NOW(),:demande_score,:demande_statut,:demande_messages,:demande_doc)';
     $DB_VAR = array(':eleve_id' => $eleve_id, ':matiere_id' => $matiere_id, ':item_id' => $item_id, ':prof_id' => $prof_id, ':demande_score' => $demande_score, ':demande_statut' => $demande_statut, ':demande_messages' => $demande_messages, ':demande_doc' => $demande_doc);
     DB::query(SACOCHE_STRUCTURE_BD_NAME, $DB_SQL, $DB_VAR);
     return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
 }
/**
 * ajouter_devoir
 *
 * @param int    $prof_id
 * @param int    $groupe_id
 * @param string $date_mysql
 * @param string $info
 * @param string $date_visible_mysql
 * @param string $date_autoeval_mysql
 * @param string $doc_sujet
 * @param string $doc_corrige
 * @param string $eleves_ordre   'alpha' | 'classe'
 * @return int
 */
public static function DB_ajouter_devoir($prof_id,$groupe_id,$date_mysql,$info,$date_visible_mysql,$date_autoeval_mysql,$doc_sujet,$doc_corrige,$eleves_ordre)
{
  $DB_SQL = 'INSERT INTO sacoche_devoir( proprio_id, groupe_id, devoir_date, devoir_info, devoir_visible_date, devoir_autoeval_date, devoir_doc_sujet, devoir_doc_corrige, devoir_fini, devoir_eleves_ordre) ';
  $DB_SQL.= 'VALUES                    (:proprio_id,:groupe_id,:devoir_date,:devoir_info,:devoir_visible_date,:devoir_autoeval_date,:devoir_doc_sujet,:devoir_doc_corrige,:devoir_fini,:devoir_eleves_ordre)';
  $DB_VAR = array(
    ':proprio_id'          => $prof_id,
    ':groupe_id'           => $groupe_id,
    ':devoir_date'         => $date_mysql,
    ':devoir_info'         => $info,
    ':devoir_visible_date' => $date_visible_mysql,
    ':devoir_autoeval_date'=> $date_autoeval_mysql,
    ':devoir_doc_sujet'    => $doc_sujet,
    ':devoir_doc_corrige'  => $doc_corrige,
    ':devoir_fini'         => 0,
    ':devoir_eleves_ordre' => $eleves_ordre,
  );
  DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
  return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
}
/**
 * ajouter_message
 *
 * @param int    $user_id
 * @param string $date_debut_mysql
 * @param string $date_fin_mysql
 * @param string $message_contenu
 * @return int
 */
public static function DB_ajouter_message( $user_id , $date_debut_mysql , $date_fin_mysql , $message_contenu )
{
  $DB_SQL = 'INSERT INTO sacoche_message( user_id, message_debut_date, message_fin_date, message_contenu, message_dests_cache) ';
  $DB_SQL.= 'VALUES                     (:user_id,:message_debut_date,:message_fin_date,:message_contenu,:message_dests_cache)';
  $DB_VAR = array(
    ':user_id'               => $user_id,
    ':message_debut_date'    => $date_debut_mysql,
    ':message_fin_date'      => $date_fin_mysql,
    ':message_contenu'       => $message_contenu,
    ':message_dests_cache'   => ',',
  );
  DB::query(SACOCHE_STRUCTURE_BD_NAME , $DB_SQL , $DB_VAR);
  return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
}
/**
 * ajouter_convention
 *
 * @param int    $base_id
 * @param string $connexion_nom
 * @param string $convention_date_debut
 * @param string $convention_date_fin
 * @return int
 */
public static function DB_ajouter_convention($base_id,$connexion_nom,$convention_date_debut,$convention_date_fin)
{
  $DB_SQL = 'INSERT INTO sacoche_convention(sacoche_base,connexion_nom,convention_date_debut,convention_date_fin,convention_creation,convention_signature,convention_paiement,convention_activation,convention_mail_renouv,convention_commentaire) ';
  $DB_SQL.= 'VALUES(:base_id,:connexion_nom,:convention_date_debut,:convention_date_fin,NOW(),:convention_signature,:convention_paiement,:convention_activation,:convention_mail_renouv,:convention_commentaire)';
  $DB_VAR = array(
    ':base_id'                => $base_id,
    ':connexion_nom'          => $connexion_nom,
    ':convention_date_debut'  => $convention_date_debut,
    ':convention_date_fin'    => $convention_date_fin,
    ':convention_signature'   => NULL,
    ':convention_paiement'    => NULL,
    ':convention_activation'  => 0,
    ':convention_mail_renouv' => NULL,
    ':convention_commentaire' => NULL,
  );
  DB::query(SACOCHE_WEBMESTRE_BD_NAME , $DB_SQL , $DB_VAR);
  return DB::getLastOid(SACOCHE_WEBMESTRE_BD_NAME);
}
 /**
  * ajouter_message
  *
  * @param int    $user_id
  * @param string $date_debut_mysql
  * @param string $date_fin_mysql
  * @param string $message_contenu
  * @param string $tab_destinataires
  * @return int
  */
 public static function DB_ajouter_message($user_id, $date_debut_mysql, $date_fin_mysql, $message_contenu, $tab_destinataires)
 {
     $listing_destinataires = count($tab_destinataires) ? ',' . implode(',', $tab_destinataires) . ',' : '';
     $DB_SQL = 'INSERT INTO sacoche_message( user_id, message_debut_date, message_fin_date, message_destinataires, message_contenu, message_dests_cache) ';
     $DB_SQL .= 'VALUES                     (:user_id,:message_debut_date,:message_fin_date,:message_destinataires,:message_contenu,:message_dests_cache)';
     $DB_VAR = array(':user_id' => $user_id, ':message_debut_date' => $date_debut_mysql, ':message_fin_date' => $date_fin_mysql, ':message_destinataires' => $listing_destinataires, ':message_contenu' => $message_contenu, ':message_dests_cache' => ',');
     DB::query(SACOCHE_STRUCTURE_BD_NAME, $DB_SQL, $DB_VAR);
     return DB::getLastOid(SACOCHE_STRUCTURE_BD_NAME);
 }
/**
 * DB_WEBMESTRE_ajouter_structure
 *
 * @param int    $base_id   Pour forcer l'id de la base de la structure ; normalement transmis à 0 (=> auto-increment), sauf dans un cadre de gestion interne à Sésamath
 * @param int    $geo_id
 * @param string $structure_uai
 * @param string $localisation
 * @param string $denomination
 * @param string $contact_nom
 * @param string $contact_prenom
 * @param string $contact_courriel
 * @param string $inscription_date   Pour forcer la date d'inscription, par exemple en cas de transfert de bases académiques (facultatif).
 * @return int
 */
function DB_WEBMESTRE_ajouter_structure($base_id,$geo_id,$structure_uai,$localisation,$denomination,$contact_nom,$contact_prenom,$contact_courriel,$inscription_date=0)
{
	$chaine_date = ($inscription_date) ? ':inscription_date' : 'NOW()' ;
	// Insérer l'enregistrement dans la base du webmestre
	if($base_id==0)
	{
		$DB_SQL = 'INSERT INTO sacoche_structure(geo_id,structure_uai,structure_localisation,structure_denomination,structure_contact_nom,structure_contact_prenom,structure_contact_courriel,structure_inscription_date) ';
		$DB_SQL.= 'VALUES(:geo_id,:structure_uai,:localisation,:denomination,:contact_nom,:contact_prenom,:contact_courriel,'.$chaine_date.')';
		$DB_VAR = array(':geo_id'=>$geo_id,':structure_uai'=>$structure_uai,':localisation'=>$localisation,':denomination'=>$denomination,':contact_nom'=>$contact_nom,':contact_prenom'=>$contact_prenom,':contact_courriel'=>$contact_courriel,':inscription_date'=>$inscription_date);
		DB::query(SACOCHE_WEBMESTRE_BD_NAME , $DB_SQL , $DB_VAR);
		$base_id = DB::getLastOid(SACOCHE_WEBMESTRE_BD_NAME);
	}
	else
	{
		$DB_SQL = 'INSERT INTO sacoche_structure(sacoche_base,geo_id,structure_uai,structure_localisation,structure_denomination,structure_contact_nom,structure_contact_prenom,structure_contact_courriel,structure_inscription_date) ';
		$DB_SQL.= 'VALUES(:base_id,:geo_id,:structure_uai,:localisation,:denomination,:contact_nom,:contact_prenom,:contact_courriel,'.$chaine_date.')';
		$DB_VAR = array(':base_id'=>$base_id,':geo_id'=>$geo_id,':structure_uai'=>$structure_uai,':localisation'=>$localisation,':denomination'=>$denomination,':contact_nom'=>$contact_nom,':contact_prenom'=>$contact_prenom,':contact_courriel'=>$contact_courriel,':inscription_date'=>$inscription_date);
		DB::query(SACOCHE_WEBMESTRE_BD_NAME , $DB_SQL , $DB_VAR);
	}
	// Génération des paramètres de connexion à la base de données
	$BD_name = 'sac_base_'.$base_id; // Limité à 64 caractères (tranquille...)
	$BD_user = '******'.$base_id; // Limité à 16 caractères (attention !)
	$BD_pass = fabriquer_mdp();
	// Créer le fichier de connexion de la base de données de la structure
	fabriquer_fichier_connexion_base($base_id,SACOCHE_WEBMESTRE_BD_HOST,SACOCHE_WEBMESTRE_BD_PORT,$BD_name,$BD_user,$BD_pass);
	// Créer la base de données de la structure
	DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE DATABASE sac_base_'.$base_id );
	// Créer un utilisateur pour la base de données de la structure et lui attribuer ses droits
	// On doit créer en réalité un user sur "localhost" et un autre sur "%" car on doit pouvoir se connecter suivant les configurations depuis la machine locale comme depuis n'importe quel autre serveur (http://dev.mysql.com/doc/refman/5.0/fr/adding-users.html).
	DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE USER '.$BD_user.'@"localhost" IDENTIFIED BY "'.$BD_pass.'"' );
	DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'CREATE USER '.$BD_user.'@"%" IDENTIFIED BY "'.$BD_pass.'"' );
	DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$BD_name.'.* TO '.$BD_user.'@"localhost"' );
	DB::query(SACOCHE_WEBMESTRE_BD_NAME , 'GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, SELECT, UPDATE ON '.$BD_name.'.* TO '.$BD_user.'@"%"' );
	/* Il reste à :
		+ Lancer les requêtes pour installer et remplir les tables, éventuellement personnaliser certains paramètres de la structure
		+ Insérer le compte administrateur dans la base de cette structure, éventuellement lui envoyer un courriel
		+ Créer un dossier pour les les vignettes images
	*/
	return $base_id;
}