<?php
/*+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
Fonctions Applicatives sur la base de donn�s
----------------------------------------------------------
Les fonctions de ce fichier concernent le comportement de l'application.
 elles correspondent au comportement de l'application.
+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=*/
// ================== Fonctions relatives �la table ETABLISSEMENT ======================================================
// fonction qui v�ifie que le texte est un nom d'�ablissement pour cet identifiant
// si C et trouv�ou pas C et id<> et trouv�
function APP_etabEstUnNom($connexion, $mode, $id, $nom) {
	$nom=str_replace("'", "''", $nom);
	// S'il s'agit d'une cr�tion, on v�ifie juste la non existence du nom sinon
	// on v�ifie la non existence d'un autre �ablissement (id!='$id') portant 
	// le m�e nom
	if ($mode=='C')
      $requeteSQL="select * from etablissement where nom='$nom'";
	else
      $requeteSQL="select * from etablissement where nom='$nom' and id!='$id'";
	$enreg=DB_chercherEnreg($requeteSQL, $connexion); // rechercher l'enregistrement dans la base
	return $enreg;
}
// Retourne false si le nombre de chambres transmis est inf�ieur au nombre de 
// chambres occup�s pour l'�ablissement transmis 
// Retourne true dans le cas contraire
function APP_etabEstModifOffreCorrecte($connexion, $id, $nombreChambres){
	$requeteSQL="select IFNULL(sum(nombreChambres), 0) as totalChambresOccup 
				from attribution 
				where idEtab='$id'";
	$enreg=DB_chercherEnreg($requeteSQL, $connexion); // rechercher l'enregistrement dans la base
	if($nombreChambres>=$enreg["totalChambresOccup"])
		return TRUE;
	else
		Return FALSE;
}

// Fonction qui v�ifie la saisie lors de la modification d'un �ablissement. 
// Pour chaque champ non valide, un message est ajout��la liste des erreurs
function APP_etabVerifDonneesModifiees($connexion, $id, $nom, $adresseRue, $codePostal, $ville, $tel, $nomResponsable, $nombreChambresOffertes){
	if ($nom=="" || $adresseRue=="" || $codePostal=="" || $ville=="" || $tel=="" || $nomResponsable=="" || $nombreChambresOffertes=="")
		ERR_ajouter("Chaque champ suivi du caractere * est obligatoire");
	if ($nom!="" && APP_etabEstUnNom($connexion, 'M', $id, $nom))
		ERR_ajouter("L'etablissement $nom existe deja");
	if ($codePostal!="" && !CHK_estUnCp($codePostal))
		ERR_ajouter("Le code postal doit comporter 5 chiffres");
	if ($nombreChambresOffertes!="" 
		&& (!CHK_estEntier($nombreChambresOffertes) 
		|| (!APP_etabEstModifOffreCorrecte($connexion, $id, $nombreChambresOffertes))))
		ERR_ajouter("Le Nombre chambres offertes est non entier ou inf�ieur aux attributions d��effectu�s");
}
function APP_etabModifier($connexion, $id, $nom, $adresseRue, $codePostal, $ville, $tel, $adresseElectronique, $type, $civiliteResponsable, $nomResponsable, $prenomResponsable, $nombreChambresOffertes) {  
	// Doubler les apostrophes pour les rendre inactifs dans les cha�es.                        addslashes(
	$nom=str_replace("'", "''", $nom);
	$adresseRue=str_replace("'","''", $adresseRue);
	$ville=str_replace("'","''", $ville);
	$adresseElectronique=str_replace("'","''", $adresseElectronique);
	$nomResponsable=str_replace("'","''", $nomResponsable);
	$prenomResponsable=str_replace("'","''", $prenomResponsable);
	// cr�r la requ�e de mise �jour
	$requeteSQL="update etablissement set nom='$nom',adresseRue='$adresseRue',
         codePostal='$codePostal',ville='$ville',tel='$tel',
         adresseElectronique='$adresseElectronique',type='$type',
         civiliteResponsable='$civiliteResponsable',nomResponsable=
         '$nomResponsable',prenomResponsable='$prenomResponsable',
         nombreChambresOffertes='$nombreChambresOffertes' where id='$id'";
	//ex�uter la requ�e
	$resultat=DB_executerRequete($requeteSQL, $connexion);
	return $resultat;
}

// Fonction qui v�ifie la saisie lors de la cr�tion d'un �ablissement. 
// Pour chaque champ non valide, un message est ajout��la liste des erreurs
function APP_etabVerifDonneesCrees($connexion, $id, $nom, $adresseRue, $codePostal, $ville, $tel, $nomResponsable, $nombreChambresOffertes){
	if ($id=="" || $nom=="" || $adresseRue=="" || $codePostal=="" || $ville=="" || $tel=="" || $nomResponsable=="" || $nombreChambresOffertes=="")
		ajouterErreur("Chaque champ suivi du caractere * est obligatoire");
	if ($id!="") {
		// Si l'id est constitu�d'autres caract�es que de lettres non accentu�s et de chiffres, une erreur est g���
		if (!CHK_estChiffresOuEtLettres($id))
			ERR_ajouter("L'identifiant doit comporter uniquement des lettres non accentu�s et des chiffres");
		else
			if (CHK_estUnId($connexion, 'etablissement', $id))
				ERR_ajouter("L'etablissement $id existe deja");
	}
	if ($nom!="" && APP_etabEstUnNom($connexion, 'C', $id, $nom))
		ERR_ajouter("L'etablissement $nom existe deja");
	if ($codePostal!="" && !CHK_estUnCp($codePostal))
		ERR_ajouter("Le code postal doit comporter 5 chiffres");   
	if ($nombreChambresOffertes!="" && !CHK_estEntier($nombreChambresOffertes))
		ERR_ajouter ("Le Nombre chambres offertes doit etre un nombre entier");
}
// fonction de cr�tion d'un enregistrement dans la table etablissement.
// les donn�s doivent �re contr��s auparavant.
function APP_etabCreer($connexion, $id, $nom, $adresseRue, $codePostal, $ville, $tel, $adresseElectronique, $type, $civiliteResponsable, $nomResponsable, $prenomResponsable, $nombreChambresOffertes){ 
	$nom=str_replace("'", "''", $nom);
	$adresseRue=str_replace("'","''", $adresseRue);
	$ville=str_replace("'","''", $ville);
	$adresseElectronique=str_replace("'","''", $adresseElectronique);
	$nomResponsable=str_replace("'","''", $nomResponsable);
	$prenomResponsable=str_replace("'","''", $prenomResponsable);
	
	$requeteSQL="insert into etablissement values ('$id', '$nom', '$adresseRue', '$codePostal', '$ville', '$tel', '$adresseElectronique', '$type', '$civiliteResponsable', '$nomResponsable', '$prenomResponsable','$nombreChambresOffertes')";
  
	//ex�uter la requ�e
	$resultat=DB_executerRequete($requeteSQL, $connexion);
	return $resultat;
}
// fonction d'ex�ution de la suppression
function APP_etabSupprimer($connexion, $id)
{
   $requeteSQL="delete from etablissement where id='$id'";
	//ex�uter la requ�e
	$resultat=DB_executerRequete($requeteSQL, $connexion);
	return $resultat;
}
// v�ifie qu'un etablissement poss�e des attributions
function APP_etabExisteattributions($connexion, $id){
	$requeteSQL="select * From attribution where idEtab='$id'";
	$enreg=DB_chercherEnreg($requeteSQL, $connexion); // rechercher l'enregistrement dans la base
	return $enreg;
}
// retourne le nombre d'Etablissement offrant des chambres
function APP_etabObtenirNbEtabOffrantChambres($connexion){
	$requeteSQL="select count(*) as nombreEtabOffrantChambres from etablissement where nombreChambresOffertes!=0";
	$enreg=DB_chercherEnreg($requeteSQL, $connexion); // rechercher l'enregistrement dans la base
	return $enreg["nombreEtabOffrantChambres"];
}

// ================== Fonctions relatives �la table ATTRIBUTION ======================================================
// Mettre a jour (suppression, modification ou ajout) l'attribution correspondant à
// l'id étab et à l'id groupe transmis
function APP_attribModifier($connexion, $idEtab, $idGroupe, $nbChambres) {
	// pr�aration de la requ�e �ex�uter
	if ($nbChambres==0)
		// si le nombre de chambres �attribuer est nul, on supprime la ligne.
		// Note : pas besoin de v�ifier s'il existe une attribution, si elle n'existe pas, la requ�e retourne une erreur qui ne nous g�e pas.
		$requeteSQL="delete from attribution where idEtab='$idEtab' and idGroupe='$idGroupe'";
	else{
		// il y a soit une modification, soit une cr�tion. v�ifier d'abord si des attributions existent d��
		$requeteSQL="select nombreChambres from attribution where idEtab='$idEtab' and idGroupe='$idGroupe'";
		$enreg=DB_chercherEnreg($requeteSQL, $connexion);
		// si une attribution est trouv� alors on la modifie, sinon, on insert un nouvel enregistrement
		if ($enreg["nombreChambres"]!=0)
			$requeteSQL="update attribution set nombreChambres=$nbChambres where idEtab=
              '$idEtab' and idGroupe='$idGroupe'";
		else
			$requeteSQL="insert into attribution values('$idEtab','$idGroupe', $nbChambres)";
	}
	// effectuer la requ�e d�ermin� ci-dessus
	$enreg=DB_executerRequete($requeteSQL, $connexion);
	return $enreg;
}

// Teste la présence d'attributions pour l'établissement transmis    

// Retourne le nombre de chambres occupées pour l'id étab transmis
function obtenirNbOccup($connexion, $idEtab)
{
   $req="select IFNULL(sum(nombreChambres), 0) as totalChambresOccup from
        attribution where idEtab='$idEtab'";
   $rsOccup=mysql_query($req, $connexion);
   $lgOccup=mysql_fetch_array($rsOccup);
   return $lgOccup["totalChambresOccup"];
}


// Retourne la requête permettant d'obtenir les id et noms des groupes affectés
// dans l'établissement transmis
function obtenirReqGroupesEtab($id)
{
   $req="select distinct id, nom from Groupe, attribution where 
        attribution.idGroupe=Groupe.id and idEtab='$id'";
   return $req;
}
            
// Retourne le nombre de chambres occupées par le groupe transmis pour l'id étab
// et l'id groupe transmis
function obtenirNbOccupGroupe($connexion, $idEtab, $idGroupe)
{
   $req="select nombreChambres From attribution where idEtab='$idEtab'
        and idGroupe='$idGroupe'";
   $rsAttribGroupe=mysql_query($req, $connexion);
   if ($lgAttribGroupe=mysql_fetch_array($rsAttribGroupe))
      return $lgAttribGroupe["nombreChambres"];
   else
      return 0;
}

// ================== Fonctions relatives toutes les tables ======================================================
// vérification des données à enregistrer ou modifier
// $mode=C (création) ou M (modification)
function APP_VerifDonnees($connexion, $table, $tLigne, $mode) {
	include "library/DB_def.inc.php";
	include "library/DB_ref.inc.php";
	//echo "<br><strong>vérif des données pour <b>$table</b> en mode <b>$mode</b></strong>.\n";
	// vérif données obligatoires
	//echo "<br>- contrôle des données obligatoires.\n";
	$errorNum="";
	foreach ($tLigne as $fieldPos => $fieldValue) {
		$fieldName=$DB_TablesDef[$table][$fieldPos];
		//echo "<br>Donnée <b>$fieldName</b> : \n";
		if (isset($DB_FieldDesc[$fieldName])){ // si la description du champ dont le nom est donné à la fieldPos-ième position de la définition de la table,
			if ($DB_FieldDesc[$fieldName][3] && $fieldValue=="" && (!isset($DB_FieldDspType[$fieldName]) || $DB_FieldDspType[$fieldName]!="auto_increment")){
				// si le champ est obligatoire et vide et non auto incrémenté (: non défini ou non autoIncrementé)
				//echo " est obligatoire et vide.\n";
				$errorNum=$fieldPos;
				$errorNum+=1000;
				ERR_ajouter("$errorNum - Champ obligatoire : ".$DB_FieldDesc[$fieldName][1]);
			}
		}
	}
	//echo "<br>- contrôle des données par table.\n";
	if ($errorNum=="")
		switch ($table) {
			case "user":
					$errorNum=APP_userChk($connexion, $tLigne, $mode);
					break;
			//default:
		}
/*			
	if ($table=='event')
		$errField=APP_eventVerifDonneesModifiees($connexion, $table, $tLigne);
	elseif ($table=='user')
		$errField=APP_userVerifDonneesModifiees($connexion, $table, $tLigne);
*/
	return $errorNum;
}
// vérif des données créées ou modifiées pour la table : user
function APP_userChk($connexion, $tLigne, $mode) {
	$errorNum="";
	// vérif données non modifiables (mode modif - non développé actuellement)
	// vérif double inscription (
		$selectSQL="select useNom, usePrenom from user where useNom='".$tLigne[1]."' and usePrenom='".$tLigne[2]."'";
		// sans exclusion du user présent : mode création ; pour ne pas inscrire deux fois le même
		// avec exclusion du user courant : mode modif : pour qu'une modif ne créée pas de doublon
		if ($mode=='M')
			$selectSQL.=" and useNum<>'".$tLigne[0]."'";
		$selectSQL.=" ;";
		$selectResult=DB_chercherEnreg($selectSQL, $connexion);
		if($selectResult) {
			$errorNum=1001;
			ERR_ajouter("2001 - Personne déjà inscrite : ".$tLigne[2].' '.$tLigne[1]." existe déjà.");
		}
	// même vérif avec le login
		$selectSQL="select useLogin from user where useLogin='".$tLigne[3]."'";
		if ($mode=='M')
			$selectSQL.=" and useNum<>'".$tLigne[0]."'";
		//echo $selectSQL;
		$selectResult=DB_chercherEnreg($selectSQL, $connexion);
		if($selectResult) {
			$errorNum=1002;
			ERR_ajouter("2002 - Login déjà utilisé : ".$tLigne[3]." existe déjà.");
		}
	// comparaison des deux pwd
	return $errorNum;
}
// ================== Fonctions relatives à la table EVENT ======================================================
// récupération du dernier n° d'évènement
function APP_getMaxEvtNum(){
	global $connexion;
	$req="select max(evtNum) From event ;";
	$enreg=DB_chercherEnreg($requeteSQL, $connexion); // rechercher l'enregistrement dans la base
	return $enreg;
}
   
// --------------------------------------------------------------------------------------------------------------------
// --------------------------------------------------------------------------------------------------------------------

?>
