<?php
/**
* MiniClick
* Gestionnaire de tableau collaboratif
* Copyright (C) 2006 Guillaume Monet <gm@ibreizh.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 
*
* @package miniclick
* @version 3.1.0
* version import 2 
* version avec start transaction; commit; rollback non activé 
*/


function export_cvs_erreur($lignes_erreur,$nom_fichier){
	
	//cr?????ation du nom de fichier et du chemin
	$fichier=explode(".",$nom_fichier);
	$nom_fichier=$fichier[0];
	$ext_fichier=$fichier[1];
	$date=substr(date("ymd"),1);
	$nouveau_fichier="imports/errors/".$date."-".$nom_fichier."-erreur.csv";
	//Ouvrir le fichier en mode �riture (cr?????????? si inexistant)
	$fichier_in = fopen($nouveau_fichier,"w+"); 
	$resss=chmod ($nouveau_fichier,0766);
	fwrite($fichier_in,$lignes_erreur); 
	fclose($fichier_in); 
}

//V?????rification des liaison des tables, en cas d'erreur afficher un warning
function verif_contrainte($table){
	// si une contrainte est une relation renseign?????e dans l'import et que c'est le premier appel de la fonction
	$erreur="";
	while ((list($keytable, $valuetable) = each($table))){
		if ($keytable!="NM"){
			$requete_champ = mysql_query("SHOW COLUMNS FROM $keytable");
			//echo "SHOW COLUMNS FROM $keytable";
			while($result_champ=mysql_fetch_array($requete_champ)){
				//recherche de champ Id correspondant ????? une liaison avec une autre table (mais pas societe)
				if((preg_match("/_Id/i",$result_champ["Field"]))&&($result_champ["Field"]!=ucfirst(strtolower($keytable))."_Id"&&($result_champ["Field"]!="Societe_Id"))){
						//ERREUR ! si la liaison n'apparait pas dans l'import
						if (!isset($table[strtoupper(substr($result_champ["Field"],0,-3))])){
							$erreur.="AVERTISSEMENT! Relation non trouv�entre 	$keytable et ".strtoupper(substr($result_champ["Field"],0,-3))."<br>";
							//}
						}
				}	
			}
		}
	}
	return $erreur;
}

//V?????rifier la validit????? des donn?????es des tables
function verif_donnees($contrainte,$table,$keytable){
	//Pour chaque contrainte trouv?????e dans les checkbox du formulaire, v?????rifiez les champs
	$res["unique"]="";
	$res["valide"]=true;
	$cpt=0;
	$table_societe=false;
	//v?????rification de l'existence de cet enregistrement
	// La table VILLE n'est pas en relation avec la soci��	
	$requete_table = mysql_query("SHOW COLUMNS FROM  $keytable");
	$sql_recherche="SELECT ".ucfirst(strtolower($keytable))."_Id FROM $keytable WHERE ";
	//la
	$preml=true;
	$aff_erreur="";
	while ((list($keyrow,$valuerow) = each($table[$keytable]))){
		//si le champ est une contrainte et que celui ci est vide.=> ERREUR
		if (($contrainte[$keytable][$keyrow]=="1")){
			
			if (str_replace(" ","",$table[$keytable][$keyrow])==""){
				$res["valide"]=false;
				echo "Champ obligatoire non renseign�dans $keytable <br>";
			// champ obligatoire non vide => construction de la requete
			}else{
				//if ((!$table_societe)&&($preml)){
				if ($preml){
					$sql_recherche.="".$keyrow."='".addslashes($valuerow)."' ";
					$preml=false;
				}else{
					$sql_recherche.=" AND ".$keyrow."='".addslashes($valuerow)."' ";
				}
				$aff_erreur.="".$keyrow."=>".addslashes($valuerow)." ";
				$cpt++;
			}
		}
	}
	// Requete contruite avec des contraintes
	if ($cpt>0){
		echo $sql_recherche;
		$requete_recherche = mysql_query($sql_recherche);
		if (mysql_num_rows($requete_recherche)!=0){
			//ERREUR ! L'enregistrement existe deja*
			$result_recherche=mysql_fetch_object($requete_recherche);
			$temp=ucfirst(strtolower($keytable))."_Id"; 
			$res["unique"]=$result_recherche->$temp;
			echo "Champ deja existant dans $keytable :  $aff_erreur <br>";;
		}
	}
	return $res;
	
}
function update_table($id_update,$table,$keytable,$id_fichier){
	
	//Insertion dans une table
	$up=0;
	$sql_ok=true;
	$sql= "UPDATE $keytable SET ";
	foreach($table[$keytable] as $keyrow => $valuerow) {
		
		$prev = mysql_query("SELECT $keyrow FROM $keytable WHERE ".ucfirst(strtolower($keytable))."_Id='".$id_update."'");
		$result_prev=mysql_fetch_object($prev);

		if (mysql_num_rows($prev)!=0){	
			
			$valuerow=str_replace("  "," ",$valuerow);
			$valuetest1=strtolower(str_replace(" ","",ereg_replace('[^[:alnum:]]', '', $result_prev->$keyrow)));
			$valuetest2=strtolower(str_replace(" ","",ereg_replace('[^[:alnum:]]', '', $valuerow)));
			if(($valuerow!="")&&($valuetest1!=$valuetest2)){
				
				$sql.= "`".$keyrow."`='".addslashes(trim($valuerow))."' ,";
				//Ajout de l'ancienne valeur dans la table Archivage
					
					$sql_archi="INSERT INTO ARCHIVAGE (Table_Id,Object_Id,Colone_Id,Value,Date,User_Id,Fichier_Id) VALUES ('$keytable','$id_update','".$keyrow."','".addslashes($result_prev->$keyrow)."','".date('ymdHis')."','".$_SESSION["login"]."',$id_fichier)";
					echo $sql_archi."<br>";
				
				$return=mysql_query($sql_archi);
				if (!$return){
					$sql_ok=false;
				}
				$up=1;
			}
		}
	}

	//Insertion de la liaison avec la soci��s'il y a 
	$requete_table = mysql_query("SHOW COLUMNS FROM  $keytable");
	$sql = substr($sql,0,-1);
	$sql.=" WHERE ".ucfirst(strtolower($keytable))."_Id=$id_update";
	
	if ($up==1){
		$return=mysql_query($sql);
		if (!$return){
			$sql_ok=false;
		}
		echo $sql."<br>";
	}
	//Retour si les requetes sql ont émis des messages d'erreur
	return $sql_ok;
}
	
function ajout_table($table,$keytable,$id_fichier){
	//------------------WHERE Field=Societe_Id='".$_SESSION["societe"]."'----DEBUT IMPORT -----------------------------------
	$sql_ok=true;
	echo "test?";
	//Insertion dans une table
	$sql = "INSERT INTO $keytable (";
	$val = " VALUES (";
	foreach($table[$keytable] as $keyrow => $valuerow) {
		if($valuerow != ""){
			$sql .= "`".$keyrow."`,";
			$val .= "'".addslashes(trim($valuerow))."',";
		}
	}
	$sql = substr($sql,0,-1);
	$val = substr($val,0,-1);
	$sql .= ")";
	$val .= ");";
	echo $sql.$val."<br>";
	$return=mysql_query($sql.$val);
	if (!$return){
		$num_id=false;
	}else{
		$num_id=mysql_insert_id();
	}

	//insertion dans la table ACTION
	$sql_archi="INSERT INTO ACTION (Table_Id,Object_Id,Fichier_Id) VALUES ('$keytable',$num_id,$id_fichier)";
	$return=mysql_query($sql_archi);
	if (!$return){
		$num_id=false;
	}

	echo $sql_archi."<br>";
	//Retour de l'id de l'enregistrement ajouté ou de false si les requetes sql ont émis des messages d'erreur
	echo $num_id." ";
	return $num_id;
}
	

//-----------------------------FONCTION DE LIAISON CIF-----------------------------------------------------------------
//---------$keytable= table en cours              |$table= donn?????es de toutes les tables selectionn?????es------------------
//---------$i=incrementation des ajout des tables |$id= les identifiants des ajout/maj effectu?????s dans la bdd-----------

function liaison_table($keytable,$table,$i,$id){
	//$j=0;
	$return=true;
	print_r($table);
	$requete_table = mysql_query("SHOW COLUMNS FROM $keytable");
	while($result_table=mysql_fetch_object($requete_table)){
		//insertion des relations CIF s'il y a
		$j=0;
		if (preg_match("/_Id/i",$result_table->Field)) {
			foreach($table as $keytable2 => $valuetable2) {
			$j++; 
				if ($keytable!=$keytable2){
					$requete_table2 = mysql_query("SHOW COLUMNS FROM  $keytable2"); 
					while($result_table2=mysql_fetch_object($requete_table2)){
						if (preg_match("/_Id/i",$result_table2->Field)) {
							if(($result_table->Field==$result_table2->Field) && ($i>$j) &&($result_table->Field!="Societe_Id")){
								echo $keytable."--".$result_table->Field."//".$keytable2."--".$result_table2->Field;
								//si l'identifiant est la cl?? primaire de la table
								if (strtolower(substr($result_table->Field,0,-3))==strtolower($keytable)){
									// Ce champ est vide dans la table associ?? ?
									echo "clé primaire";
									$sql_verif="SELECT ".$result_table2->Field." FROM $keytable2 WHERE ".ucfirst(strtolower($keytable2))."_Id='".$id[$keytable2]."'";
									$requete_verif=mysql_query($sql_verif);
									$result_verif=mysql_fetch_object($requete_verif);
									//vide
									if ($result_verif->$result_table->Field==""){
										$sql = "UPDATE  $keytable2 SET ".$result_table->Field."='$id[$keytable]' WHERE ".ucfirst(strtolower($keytable2))."_Id=".$id[$keytable2]."";
									//non vide	
									}
								}elseif (strtolower(substr($result_table->Field,0,-3))==strtolower($keytable2)){
									//Ce Champ est une cl?? secondaire
									echo "clé secondaire";
									$sql_verif="SELECT ".$result_table->Field." FROM $keytable WHERE ".ucfirst(strtolower($keytable))."_Id='".$id[$keytable]."'";
									$requete_verif=mysql_query($sql_verif);
									$result_verif=mysql_fetch_object($requete_verif);
									//si la cl?? est vide
									if ($result_verif->$result_table->Field==""){	
										$sql = "UPDATE $keytable SET ".$result_table->Field."='$id[$keytable2]' WHERE ".ucfirst(strtolower($keytable))."_Id=".$id[$keytable]."";
										//}
									}
									
								} 
								echo $sql_verif."<br>";
								echo $sql."<br>";
								$return=mysql_query($sql);
							}
						}
					}
					mysql_free_result($requete_table2);
				}
			}
		}
	}
	return $return;
}
//-----------------------------FONCTION DE LIAISON N N -----------------------------------------------------------------
//------$table_relation= table etant des relations dans la bdd|$table= donn?????es de toutes les tables selectionn?????es-------

function import_relation($table_relation,$table){
	foreach($table_relation as $keyrelation => $valuerelation) {
	$return=true;
	$cpt=0;
		$requete = mysql_query("SHOW COLUMNS FROM  $valuerelation");
		while($result=mysql_fetch_object($requete)){
			$nom_table=substr($result->Field,0,-3);
			foreach($table as $keytable => $valuetable) {
				if($nom_table==ucfirst(strtolower($keytable))){
					$cpt++;
					$tab[$cpt]=$nom_table;
				}
				if($cpt==2){
					$cpt=0;
					$sql = "INSERT INTO $valuerelation (".$tab[1]."_Id,".$tab[2]."_Id) VALUES ('".$id[strtoupper($tab[1])]."','".$id[strtoupper($tab[2])]."');";
					echo $sql;
					$return=mysql_query($sql);
				}

			}
		}
	}
	return $return;
}


//CONFIGURATION DE LA PAGE
session_start();
$handle = fopen(SMARTY_CACHE_DIR.$_POST["file"], "r") or die("Impossible de lire le fichier");
$size=filesize(SMARTY_CACHE_DIR.$_POST["file"]);
$donnees = addslashes(file_get_contents(SMARTY_CACHE_DIR.$_POST["file"],$size));
$premier_ligne=0;
$ierreur=0;
//APPEL DES FONCTIONS DE CREATION DE TABLES TABLE ET TABLE_RELATION
$table_relation=array("AFAIRE","SOUSCONTRAT");

//cr?????ation du fichier erreur et avec la premi?????re ligne (infos sur les donn?????es)

//R?????cup?????ration des contraintes des champs d?????finis pdt l'import
for($i = 0 ; $i< $_POST["numcols"];$i++){
	if (($_POST[table.$i]!="NM")&&($_POST[row.$i]!="NM")){
		if (isset($_POST[unique.$i])){
			
			$contrainte[$_POST[table.$i]][$_POST[row.$i]]="1";
		}else{
			$contrainte[$_POST[table.$i]][$_POST[row.$i]]="0";
		}
	$table_exist[$_POST[table.$i]]="1";
	}
	
}
//V?????rification des contraintes de liaisons.
$warning=verif_contrainte($table_exist);
echo $warning;

//Commencement des requetes SQL
//mysql_query("START TRANSACTION;");	

//AJOUT d'un fichier dans FICHIER
mysql_query("INSERT INTO FICHIER (Nom_fichier,Binaire,Date) VALUES ('".SMARTY_CACHE_DIR.$_POST["file"]."','$donnees','".date('ymdHis')."')");	


$id_fichier=mysql_insert_id();

$sql_ok=true;
while ((!feof ($handle))&&($sql_ok==true)) {
        $ligne = fgets($handle);
        $ligne1 = str_replace("'","\'",$ligne);
        $ligne1 = str_replace("\"","",$ligne1);
        $ligne1 = str_replace("\n","",$ligne1);
	$tableau = explode(";", $ligne1);
	$count = count($tableau);
	$lignetest=str_replace(";","",$ligne1);
	$lignetest=str_replace(" ","",$lignetest);
	//echo $ligne;
	if ($premier_ligne==0){
		$lignes_erreur.=$ligne;
	}
	$table="";
	if (($premier_ligne!=0)&&($lignetest!="")){
		//TRI des informations
		for($i = 0 ; $i< $count;$i++){
			if (($_POST[row.$i]!="NM")){
			
				if (isset($table[$_POST[table.$i]][$_POST[row.$i]])){
					$table[$_POST[table.$i]][$_POST[row.$i]].=" ".$tableau[$i];
				}else{
					$table[$_POST[table.$i]][$_POST[row.$i]].=$tableau[$i];
				}
			} 
		}
		//Vérification des données et import pour chaque table inser?????e
		$valid_data=true;
		foreach($table as $keytable => $valuetable) {
			$res=verif_donnees($contrainte,$table,$keytable);

			if ($res["valide"]==false){
				$valid_data=false;
				break;
			}elseif ($res["unique"]!=""){
				$unique[$keytable]=$res["unique"];
			}else{
				$unique[$keytable]=""; 
			}
		}
		// Si cette ligne d'enregistrement est valide, on execute les requetes sql 
		if ($valid_data==true){
			$k=1;
			foreach($table as $keytable => $valuetable) {
				if ($unique[$keytable]!=""){
					
					$id[$keytable]=$unique[$keytable];
					$sql_ok=update_table($unique[$keytable],$table,$keytable,$id_fichier);
					if ($sql_ok==false){
						echo "Pb mise à jour ";
					}
				}else{
					$id[$keytable]=ajout_table($table,$keytable,$id_fichier);
					if ($id[$keytable]==false){
						$sql_ok=false;
						echo "Pb d'un ajout ";
					}
				}
				$liaison_ok=liaison_table($keytable,$table,$k,$id);
				if ($liaison_ok==false){
					$sql_ok=false;
					echo "Pb d'une liaison ";
				}
				$k++;
			}
			//$relation_ok=import_relation($table_relation,$table);
			//if ($relation_ok==false){
			//	$sql_ok=false;
			//	echo "Pb d'une relation ";
			//}
		//enregistrement de toute la ligne
		}else{
			//enregistrement de la table incorrecte dans le fichier erreur
			$lignes_erreur.=$ligne;
			$ierreur++;			
		}		
	}
	$premier_ligne=1;
}
if ($sql_ok==false){
	//mysql_query("ROLLBACK;");
	echo "Erreur lors de l'importation. Annulation de la procédure. ";
}else{
	//mysql_query("COMMIT;");
	//rapport de stat sur l'import
	echo "<br><br>RESULTAT DE L'IMPORTATION <br>";
	
	
	foreach($table_exist as $keytable => $valuetable) {
		//Pour chaque table
		$requete_nbins = mysql_query("SELECT count(*) AS Nb_ins FROM ACTION WHERE Fichier_Id=$id_fichier AND Table_Id='$keytable'");
		$requete_nbup = mysql_query("SELECT count(DISTINCT Object_Id) AS Nb_up FROM ARCHIVAGE WHERE Fichier_Id=$id_fichier AND Table_Id='$keytable'");
		$result_nbins=mysql_fetch_object($requete_nbins);
		$result_nbup=mysql_fetch_object($requete_nbup);
		echo "    $keytable << ".$result_nbins->Nb_ins." insertion(s) et ".$result_nbup->Nb_up." mise(s) à jour<br>";
	}
	
	//fermeture du fichier erreur.
	if ($ierreur>=1){
		echo "ERREUR <br>";
		export_cvs_erreur($lignes_erreur,$_POST[file],$_POST[repertoire]);
		echo $ierreur." enregistrement(s) incorrecte(s) ! <br> Les erreurs ont été sauvegardé dans un fichier d'erreur.<br> Celles-ci peuvent provenir d'un champ obligatoire non renseigné<br>Attention d'avoir les droits d'ecriture sur le dossier du fichier importé";
		
	}
}
?>