<?php
// note : j'ai modifié le lien de départ pour ne pas venir ici si on affiche un OF
// ========================================================================================
/*
	A FAIRE : faire la gestion du stock : 
	-	afficher si le stock est suffisant ou non dans les lignes et, 
		dans ce cas, envoyer un petit script qui interdit l'expédition globale 
		(la facturation devra rester possible si on peut facturer avent d'expédier ...)
	- 	inscrire les mouvements de stock correspondants et, 
		si la base de données est adaptée, modifier le stock dynamique courant de chaque article expédier.
		
	A VENIR : 
		- 	gérer les expéditions en plusieurs colis
		-	gérer les expéditions partielles
*/
// ========================================================================================
include "library/DB_fct.inc.php";
include "library/PARM_tabs.inc.php"; // tableaux de paramètres communs
include "library/_gesComDesign.inc.php";
// ========================================================================================
// FONCTIONS LOCALES
// ========================================================================================
// -------------------------------------------------------------------
function _menuRight(){
	echo "GESCOM";
	echo "<div class='help'>";
	echo "Réceptionner puis Payer une <b>commande&nbsp;Fournisseur</b>";
	echo "</div>";
}
// -------------------------------------------------------------------
function _isInTab($tab, $testValue){
	// attention, petit pbm si l'indice = 0
	$indice=-1;
	if(is_array($tab))
	foreach($tab as $key => $val)
		if ($val==$testValue){
			$indice=$key;
			break;
		}
	return $indice;
}
// -------------------------------------------------------------------
// Livraison de la commande client ou fournisseur.
//	On passe de l'état précédent à l'état "livré" (sauf annulation)
// 	lines=all est en prévision que lines contienne la liste des articles et qtés pour les livraisons partielles
// 	attention, l'entête ne permet pas de savoir si la livraison ou la facturation d'une ligne est déjà faite.

function _ship($id, $cdeType, $lines){ // seules les Commandes client sont concernées
global $connexion;
	$errNum=0;
	$cdeSQL="SELECT * FROM cdeClient WHERE cdeNum='$id' ";	// vérifier l'entête de l'ordre,
	if( $record=DB_chercherEnreg($cdeSQL, $connexion)){ // si trouvé => ok, on le traite
		if(!is_array($lines) && $lines=='all'){ // all= valider l'expédition de toutes les lignes de la commande 
			// rechercher toutes les lignes de la commande et les valider,
			$ligSQL="SELECT * FROM ligneCdeClientArt WHERE cdeNum='$id' ";
			$requete_id=DB_ouvrirRequete($ligSQL, $connexion);
			while ($ligne=DB_lireLigne($requete_id)){
				if ($ligne['ligneEtat']<=2) $ligneEtat=2;	// la cde est livrée ou déjà livrée
				elseif ($ligne['ligneEtat']<6) $ligneEtat=6; // la cde est livrée après facturation
				else $ligneEtat=$ligne['ligneEtat']; // = ne rien changer
				$ligUpd="UPDATE ligneCdeClientArt SET ligneEtat=$ligneEtat WHERE cdeNum='$id' AND artCode='".$ligne['artCode']."' ";
				DB_executerRequete($ligUpd, $connexion);
			}
			// rechercher l'entête de la commande et la valider,
			if ($record['cdeEtat']<=2) $cdeEtat=2; // livrée ou déjà livrée
			elseif ($record['cdeEtat']<6) $cdeEtat=6; // déjà facturée, on la livre
			else $cdeEtat=$record['cdeEtat']; // autre états (>=6), on ne fait rien
			$cdeUpd="UPDATE cdeClient SET cdeEtat=$cdeEtat WHERE cdeNum='$id' ";
			DB_executerRequete($cdeUpd, $connexion);
		}// FI traitement de toutes les lignes
	} else {
		$errNum=9999;
		echo "<div class=help><h1>Shipping ? ($id, $cdeType : $lines)</h1>";
		echo "line $id not found : $cdeSQL";
		echo "<br>or error : ".mysql_error();
		echo "</div class=help>";
	} // FI vérif de l'existence de la commande
	return $errNum;
}
// -------------------------------------------------------------------
// Facturation de la commande client ou fournisseur.
//	On passe de l'état précédent à l'état "livré" (sauf annulation)
// 	lines=all est en prévision que lines contienne la liste des articles et qtés pour les livraisons partielles

function _invoice ($id, $cdeType, $lines){ // seules les Commandes client sont concernées
global $connexion;
	$errNum=0;
	$cdeSQL="SELECT * FROM cdeClient WHERE cdeNum='$id' ";	// vérifier l'entête de l'ordre,
	if( $record=DB_chercherEnreg($cdeSQL, $connexion)){ // si trouvé => ok, on le traite
		if(!is_array($lines) && $lines=='all'){ // all= valider l'expédition de toutes les lignes de la commande 
			// rechercher toutes les lignes de la commande et les valider,
			$ligSQL="SELECT * FROM ligneCdeClientArt WHERE cdeNum='$id' ";
			$requete_id=DB_ouvrirRequete($ligSQL, $connexion);
			while ($ligne=DB_lireLigne($requete_id)){
				if ($ligne['ligneEtat']<3) $ligneEtat=$ligne['ligneEtat']+4;// la cde est facturée
				if ($ligne['ligneEtat']<6) $ligneEtat=6;					// la cde est facturée
				else $ligneEtat=$ligne['ligneEtat']; 						// ne rien faire, elle est déjà facturée, terminée ou annulée
				$ligUpd="UPDATE ligneCdeClientArt SET ligneEtat=$ligneEtat WHERE cdeNum='$id' AND artCode='".$ligne['artCode']."' ";
				DB_executerRequete($ligUpd, $connexion);
			}
			// rechercher l'entête de la commande et la valider,
			if ($record['cdeEtat']<3) $cdeEtat=$record['cdeEtat']+4;// facturer la ligne (0,1,2 => 4,5,6)
			if ($record['cdeEtat']<6) $cdeEtat=6; 					// facturer la ligne (3,4,5 => 6)
			else $cdeEtat=$record['cdeEtat']; 						// ne rien faire
			$cdeUpd="UPDATE cdeClient SET cdeEtat=$cdeEtat WHERE cdeNum='$id' ";
			DB_executerRequete($cdeUpd, $connexion);
		}// FI traitement de toutes les lignes
	} else {
		$errNum=9999;
		echo "<div class=help><h1>Shipping ? ($id, $cdeType : $lines)</h1>";
		echo "line $id not found : $cdeSQL";
		echo "<br>or error : ".mysql_error();
		echo "</div class=help>";
	} // FI vérif de l'existence de la commande
	return $errNum;
}
// ========================================================================================
// MAIN()
// ========================================================================================
$userId="";
$pageName="gesComDspCde.php";
$tableName="Tier";
$headTitle="Fiche Commande";
$contentTitle="Gestion de production";

$dspPage="gesComDspCde.php";
$updPage="gesComDspCde.php";
$delPage="gesComDspCde.php";
$addPage="gesComDspCde.php";

// connexion à la base de données
$connexion=DB_connecter(); 

// Récup des paramètres
// Récup de l'enregistrement, vérif s'il n'y a pas d'erreur de code.
(isset($_REQUEST['id']))?$recordKey=$_REQUEST['id']:$recordKey=""; // 
(isset($_REQUEST['type']))?$cdeType=$_REQUEST['type']:$cdeType=""; // 
if (isset($_REQUEST['doShipping']) && $recordKey!="" && $cdeType="cc") $shipResult=_ship($recordKey, $cdeType, 'all');
if (isset($_REQUEST['doInvoice']) && $recordKey!="" && $cdeType="cc") $shipResult=_invoice($recordKey, $cdeType, 'all');


// tableaux pour ne pas montrer le vrai nom des champs dans les paramètres transmis
//	$requete="SELECT cdeNum AS recNum, cdeDate AS recDate, $tierNum AS refNum, cdeRemiseGlobale AS recRemise, 
//	cdeEtat AS recEtat, '$cdeType' AS recType, tierRaisonSociale AS recDesc";
//		SELECT article.artCode,artDesc,artPrixHT,ligneRemiseArticle,qte,qte*artPrixHT AS montantHT, ligneEtat 
$t_sortFieldNames=array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"); // nom des champs dans les paramètres html
$t_sortFieldDbTabNames=array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "");  // mettre ici le nom de la table de la requête (avec le point !!!)
$t_sortFieldDbNames=array("refNum", "refDesc", "tierAdresse", "recRemise", "recType", "recNum", "recDate", 
	"cdeRemiseGlobale", "artCode", "artDesc", "artPrixHT", "ligneRemiseArticle", "qte", "montantHT", "ligneEtat", "besEtat"); // nom des champs dans la BDD
$t_sortFieldDesc=array("Ref. origine", "Origine", "Adresse", "Taux de remise", "Type", "N°", "Date", 
	"Remise globale", "Article", "Description", "Prix HT", "Remise", "Qté", "Montant", "Etat", "Etat"); // description des champs à afficher
$t_sortFieldDsp=array(true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true); // tri autorisé ou non
$t_sortFieldDir=array("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""); // ordre de tri (temporairement défini)

$defaultSortClause=" ORDER BY cdeDate desc";

//=======================================================================
// ouverture de la requête à afficher
//=======================================================================
	// --------------------------------
	// Vérif de la validité du type
	if ($cdeType=='cc'){
		$tableName="cdeClient";
		$tableDesc="Commande Client";
		$subTableName="ligneCdeClientArt";
		$tierNum="cliNum";
	}elseif ($cdeType=='cf'){
		$tableName="cdeFour";
		$tableDesc="Commande Fournisseur";
		$subTableName="ligneCdeFourArt";
		$tierNum="fourNum";
	}else{
		// voir si le même écran peut afficher les OF
		$tableDesc="Ordre de fabrication";
	}
	// --------------------------------
	// Rechercher l'item choisi pour l'entête de la liste de la commande
	if ($cdeType=='cc' or $cdeType='cf')
	$requete="SELECT cdeNum AS recNum, cdeDate AS recDate, $tierNum AS refNum, cdeRemiseGlobale AS recRemise, 
	cdeEtat AS recEtat, '$cdeType' AS recType, tierRaisonSociale AS refDesc
		FROM $tableName, tier 
		WHERE $tableName.$tierNum=tier.tierNum
		AND cdeNum='$recordKey' ;";
	else
	$requete="SELECT ofNum AS rcdNum, ofDate AS rcdDate, artCode AS refNum, 0 AS recRemise, 
	ofEtat AS recEtat, '$cdeType' AS recType, artDesc AS recDesc
		FROM ordFab, article
		WHERE ordFab.artCode=article.artCode
		AND ofNum='$recordKey' ;";

	$t_record=DB_chercherEnreg($requete, $connexion);
	if (!$t_record){ // ATTN module de gestion d'erreur non fini, redirection à faire
		$url="";
		$message="Erreur de paramètre ($recordKey) $requete ; <a href=\"javascript:history.back()\">Retour page précédente !</a>";
		//_goToURL($url, $message);
		echo $message;
		exit(0);
	}

//========================================================================
// AFFICHAGE
//========================================================================
_pageHeader($userId);	// entête de page et menu
//------------------------------------------------------------------------------------------------------------
// Afficher le tableau de présentation de l'item choisi (commande client, fournisseur ou OF
// 	les champs requis sont : 	recNum, recDate, refNum, recRemise, recEtat, recType, refDesc		
	echo "<table align=center border=1>\n";
	echo "<caption>$tableDesc</caption>";
	echo "<tr>";
			echo "<td>$tableDesc n° ".$t_record['recNum']."</td>";
			echo "<td>".$PRM_cdeTypeDesc[$t_record['recType']]." n° ".$t_record['refNum']."</td>";
	echo "</tr>";
	echo "<tr>";
			echo "<td>Date : ".$t_record['recDate']."</td>";
			echo "<td> ".$t_record['refDesc']."</td>";
	echo "</tr>";
	echo "<tr>";
			echo "<td>Remise : ".$t_record['recRemise']."</td>";
			echo "<td>&nbsp;</td>";
	echo "</tr>";
	echo "<tr>";
			echo "<td>Etat : ".$PRM_cdeEtatDesc[$t_record['recEtat']]."</td>";
			echo "<td>&nbsp;</td>";
	echo "</tr>";
	echo "</table>\n";
	echo "<br>";

//------------------------------------------------------------------------------------------------------------
// Affichage du formulaire de validation globale
$action="dsp";
$actDesc="Livrer";
$actName="doShipping";
if ($t_record['recEtat']>=2) {
	$actDesc="Facturer";
	$actName="doInvoice";
}
//----------------------------------------------------------------------
echo "<form name=traitement>";
echo "<input type='hidden' value='$recordKey' name='id' />";
echo "<input type='hidden' value='$cdeType' name='type' />";
echo "<table><tr><td><input type='submit' value='$actDesc' name='$actName'></td></tr></table>";
echo "</form>";

//------------------------------------------------------------------------------------------------------------
// Affichage la liste des articles de la commande client ou fournisseur
//----------------------------------------------------------------------
	// gestion du tri et du filtre
	//	Tri - - - - - - - 
	// 	si le tri est nommé (desc ou asc) alors le tri demandé est changé, sinon il reste comme il est
		$sortDir="";
		$sortField="";

		// recup paramètres si existent
		(isset($_REQUEST['sortDir']))?$sortDir=$_REQUEST['sortDir']:$sortDir="desc"; // 
		(isset($_REQUEST['sortField']))?$sortField=$_REQUEST['sortField']:$sortField="cdeDate"; // 

		// si le tri est orienté, changer le tri : "">"asc">"desc">""
		if ($sortDir=="asc") 		$sortDirNew="desc";
		elseif ($sortDir=="desc") 	$sortDirNew="";
		else 						$sortDirNew="asc";

		// construction de l'ordre de tri ; !!!! Actuellement, un tri annule les autres
		$sortClause="";
		foreach($t_sortFieldNames as $key => $val){
			if ($sortField == $val) $t_sortFieldDir[$key]=$sortDirNew;
			if ($t_sortFieldDir[$key]!=""){
				if (empty($sortClause))
					$sortClause=" ORDER BY ";
				else 
					$sortClause.=", ";
				$sortClause.=$t_sortFieldDbNames[$key]." ".$t_sortFieldDir[$key];
			}
		}
	// Filtre - - - - - - - - - 
	//	mode=0 : toutes Cdes
	//	mode=1 : cdes échues
	//	mode=2 : Cdes a venir
		$mode=0;
		if (isset($_REQUEST['mode'])) $mode=$_REQUEST['mode'];
	//=======================================================================
	// ouverture de la requête à afficher
	// construire la requête
	$selectCde="";
	if ($cdeType=='cc'){
	$selectCde.="
		SELECT article.artCode,artDesc,artPrixHT,ligneRemiseArticle,qte,qte*artPrixHT AS montantHT, ligneEtat 
			FROM CdeClient, LigneCdeClientArt, article
			WHERE CdeClient.cdeNum=LigneCdeClientArt.cdeNum
			AND LigneCdeClientArt.artCode=article.artCode
			AND cdeClient.cdeNum='$recordKey' 
	";
	}elseif ($cdeType=='cf'){
	$selectCde.="
		SELECT article.artCode,artDesc,artPrixHT,ligneRemiseArticle,qte,qte*artPrixHT AS montantHT, ligneEtat
			FROM CdeFour, LigneCdeFourArt, article
			WHERE CdeFour.cdeNum=LigneCdeFourArt.cdeNum
			AND LigneCdeFourArt.artCode=article.artCode
			AND cdeFour.cdeNum='$recordKey' 
		";
	}
	(!empty($sortClause))?$selectCde.=$sortClause:$selectCde.=$defaultSortClause;
	// exécuter la requête
	$requete_id=DB_ouvrirRequete($selectCde, $connexion);
	//------------------------------------------------------------------------------------------------------------
	// Affichage de la liste 
	//------------------------------------------------------------------------------------------------------------
	echo "<div id=cdeClient style='margin:0; padding:0; ' >";
	echo "<table border=1 align=center><!--Debut de liste-->\n";
	echo "<caption>Contenu</caption>";
	unset($t_fieldList); // vider la liste des champs à afficher
	
	$t_record=DB_lireLigne($requete_id);
	if ($t_record){
		// afficher l'entête de la liste :
		// a) construire la liste des champs de la requête
		foreach($t_record as $key=>$val)
			if(!is_numeric ($key))
				$t_fieldList[]=$key;
			// b) afficher l'entête des colonnes en vérifiant si on peut faire du tri dessus
		echo "<tr>";
		foreach($t_fieldList as $key=>$val){
			echo "<th>";
			$i=_isInTab($t_sortFieldDbNames, $val);
			if($i>=0){
				$field=$t_sortFieldNames[$i];
				$desc=$t_sortFieldDesc[$i];
				$dir=$t_sortFieldDir[$i];
				if ($t_sortFieldDsp[$i]==true){
					$url=$pageName."?";
					($mode)?$url.="mode=$mode&":$url=$url;
					$url.="sortDir=$dir&sortField=$field";
					echo "<a href=\"".$url."\">";
					echo "<img src=\"segami/s_$dir.png\" border=0 /> $desc";
					echo "</a>";
				}else
					echo "$desc";
			}else
				echo "$val";
			echo "</th>";
		}
		echo "</tr>\n";
		$color=1;
		echo "<br>".mysql_error();
		while ($t_record){
			// définition de la classe de style en fonction du type et du n° de ligne :
			($color)?$color=0:$color=1;
			$classe="td".$color;
			
			// affichage de la ligne
			$recordKey=$t_record['artCode'];
			echo "<tr class=$classe>";
			echo "	<td>".$t_record['artCode']."</td>";
			echo "	<td>".$t_record['artDesc']."</td>";
			(!empty($t_record['artPrixHT']))?print "	<td>".$t_record['artPrixHT']."</td>":print "	<td>&nbsp;";
			(!empty($t_record['ligneRemiseArticle']))?print "	<td>".$t_record['ligneRemiseArticle']."</td>":print "	<td>&nbsp;";
			($t_record['qte']>0)?print "	<td>".$t_record['qte']."</td>":print "	<td>&nbsp;";
			(!empty($t_record['ligneRemiseArticle']))?$t_record['montantHT']*=$t_record['ligneRemiseArticle']:null;
			($t_record['montantHT']>0)?print "	<td>".$t_record['montantHT']."</td>":print "	<td>&nbsp;";
			echo "	<td>".$PRM_cdeEtatDesc[$t_record['ligneEtat']]."</td>";
			echo "</tr>\n";
			$t_record=DB_lireLigne($requete_id);
		}
	echo "</table>";
	}else echo "Aucun article à afficher";
	echo "</div>";

//========================================================================
// fin de page
//========================================================================
_pageFooter(); // pied de page
?>