<?php
// ========================================================================================
// FAIRE encore récupérer le stock courant article, le stock mini, le multiple de commande, etc ...
// FAIRE encore la sélection des seules commandes fournisseur qui n'ont pas encore été livrées.

// ========================================================================================
include "library/DB_fct.inc.php";
include "library/PARM_tabs.inc.php"; // tableaux de paramètres communs
include "library/MRP_fct.inc.php";
include "library/_gesProdDesign.inc.php";
// ========================================================================================
// FONCTIONS LOCALES
// ========================================================================================
// -------------------------------------------------------------------
function _menuRight(){
}
// -------------------------------------------------------------------
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;
}
// -------------------------------------------------------------------
function _getStock($artCode){
global $connexion;
	$requete_sql="SELECT stockInit from article WHERE artCode='$artCode' ";
	if($enreg=DB_chercherEnreg($requete_sql, $connexion)) return $enreg[0] ;
	return 0;
}
// ========================================================================================
// MAIN()
// ========================================================================================
$userId="";
$pageName="erpDspBes.php";
$headTitle="Liste des besoins";
$contentTitle="Gestion de production";

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

$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.
if (isset($_REQUEST['doMRP'])) $mrpResult=MRP_calculMRP(); // 

//=======================================================================
// Exécution des requêtes de rapport.
//=======================================================================
// besoins réels ----------------------------------
	// bcc : Besoins de commandes client en cours
	$selectBesoinCdeClient="Select LigneCdeClientArt.artCode AS bccArtCode, cdeDate AS bccDate, qte AS bccQte, 'bc' AS bccType
	FROM LigneCdeClientArt, Article, cdeClient 
	WHERE LigneCdeClientArt.cdeNum=CdeClient.cdeNum
	AND LigneCdeClientArt.artCode=article.artCode
	ORDER BY  LigneCdeClientArt.artCode, cdeDate ;"; // besoins client
	$bcc_id=DB_ouvrirRequete($selectBesoinCdeClient, $connexion);
	$bccNbRow=mysql_num_rows($bcc_id);
	
	// bof : besoins pour ordres de fabrication
/* Ici, on utilise la date de début de l'opération de l'OF pour caler le besoin. 
   Dans la partie laissée active (+loin) on utilise la date de début de l'OF, comme si toutes les matières devrait toutes être présentes en début d'OF
	$selectBesoinOF="SELECT ofComp_artCode AS besArtCode, ofGamme.opDateDeb AS besDate, (ofQteTheo) AS besQte, 'of' AS besType
	FROM ofNomenclature, ofGamme
	WHERE ofNomenclature.ofNum=ofGamme.ofNum
	AND ofNomenclature.opNum=ofGamme.opNum
	ORDER BY ofComp_artCode, ofGamme.opDateDeb "; // besoins issus des OF
	$bof_id=DB_ouvrirRequete($selectBesoinOF, $connexion);
	$bofNbRow=mysql_num_rows($bof_id);
*/
	$selectBesoinOF="Select ofComp_artCode AS bofArtCode, ofDateDeb AS bofDate, (ofQteTheo) AS bofQte, 'bf' AS bofType
	FROM ofNomenclature, ordFab
	WHERE ofNomenclature.ofNum=ordFab.ofNum
	ORDER BY ofComp_artCode, ordFab.ofDateDeb "; // besoins issus des OF
	$bof_id=DB_ouvrirRequete($selectBesoinOF, $connexion);
	$bofNbRow=mysql_num_rows($bof_id);
	
// ressources réelles ---------------------------------------------------------------------------------------------------
	// rcf : ressource commandes fournisseur
	$selectRessourceCdeFou="SELECT artCode AS rcfArtCode,  cdeDate AS rcfDate, qte AS rcfQte, 'rc' AS rcfType 
	FROM LigneCdeFourArt, cdeFour
	WHERE LigneCdeFourArt.cdeNum=cdeFour.cdeNum 
	ORDER BY artCode ;"; // and cdeType='Achat' ;"; // commandes fournisseur
	$rcf_id=DB_ouvrirRequete($selectRessourceCdeFou, $connexion);
	//echo "<br>DBG : ".mysql_error();
	//echo "<br>DBG : ".$selectRessourceCdeFou;
	$rcfNbRow=mysql_num_rows($rcf_id);
	
	// ressource ordre de fabrication en cours
	$selectRessourceOF="SELECT artCode AS rofArtCode,  ofDateFin AS rofDate, ofQte AS rofQte, 'rf' AS rofType
	FROM OrdFab 
	ORDER BY artCode ;"; // ordres de fabrication
	$rof_id=DB_ouvrirRequete($selectRessourceOF, $connexion);
	$rofNbRow=mysql_num_rows($rof_id);

	//$t_besoins=_calculBesoins($bcc_id, $bof_id, $rcf_id,$rof_id);
//=======================================================================
// Exécution de la requête à afficher.
// Principe : on effectue une requête qui regroupe tous les besoins et ressources en une seule liste triée par article et date
// on sépare les besoins et ressources au fur et à mesure de la lecture.
// le secret de cette super requête est que le format de chaque morceau (les champs de sortie) est identique.
//=======================================================================
// THE BIG MARVELOUS QUERY !!!
	// besoins réels ----------------------------------
	// bcc : Besoins de commandes client en cours
	$bccSQL="Select LigneCdeClientArt.artCode AS artCode, cdeDate AS date, qte AS qte, 'bc' AS type
	FROM LigneCdeClientArt, Article, cdeClient 
	WHERE LigneCdeClientArt.cdeNum=CdeClient.cdeNum
	AND LigneCdeClientArt.artCode=article.artCode 
	AND ligneEtat in ('0', '1', '4') "; // besoins client	
	// bof : besoins pour ordres de fabrication
/* Ici, on utilise la date de début de l'opération de l'OF pour caler le besoin. 
   Dans la partie laissée active (+loin) on utilise la date de début de l'OF, comme si toutes les matières devrait toutes être présentes en début d'OF
	$bofSQL="SELECT ofComp_artCode AS besArtCode, ofGamme.opDateDeb AS besDate, (ofQteTheo) AS besQte, 'of' AS besType
	FROM ofNomenclature, ofGamme
	WHERE ofNomenclature.ofNum=ofGamme.ofNum
	AND ofNomenclature.opNum=ofGamme.opNum "; // besoins issus des OF
*/
	$bofSQL="Select ofComp_artCode AS artCode, ofDateDeb AS date, (ofQteTheo) AS qte, 'bf' AS type
	FROM ofNomenclature, ordFab
	WHERE ofNomenclature.ofNum=ordFab.ofNum "; // besoins issus des OF
	// ressources réelles ---------------------------------------------------------------------------------------------------
	// rcf : ressource commandes fournisseur (non encore livrées !!! A FAIRE)
	$rcfSQL="SELECT artCode AS artCode,  cdeDate AS date, qte AS qte, 'rc' AS type 
	FROM LigneCdeFourArt, cdeFour
	WHERE LigneCdeFourArt.cdeNum=cdeFour.cdeNum "; // commandes fournisseur
	// ressource ordre de fabrication en cours
	$rofSQL="SELECT artCode AS artCode, ofDateFin AS date, ofQte AS qte, 'rf' AS type
	FROM OrdFab "; // ordres de fabrication
	
	// ressources théoriques calculées ---------------------------------------------------------------------------------------------------
	$mrpSQL="Select artCode AS artCode, besDate AS date, besQte AS qte, besType AS type
	FROM mrpBesoins 
	"; // besoins calculés	



	$theBiqQuery=$bccSQL." UNION ".$bofSQL." UNION ".$rcfSQL." UNION ".$rofSQL." UNION ".$mrpSQL." ORDER BY artCode, date ;";
	$tbq_id=DB_ouvrirRequete($theBiqQuery, $connexion);
	//echo "<br>DBG : ".mysql_error();
	//echo "<br>DBG : ".$selectRessourceCdeFou;
	$tbqNbRow=mysql_num_rows($tbq_id);
	//echo "DBG : ".mysql_error();

	//$t_besoins=_calculBesoins($bcc_id, $bof_id, $rcf_id,$rof_id);
//========================================================================
// AFFICHAGE
//========================================================================
_pageHeader($userId);	// entête de page et menu
//------------------------------------------------------------------------------------------------------------
// Affichage des onglets de visualisation des données.
// 	Les trois onglets sont soit affiché (Dsp), affichable (ON) oou non affichable (Off).
//	Une première div : sous-menu contient les titres des onglets
//	Une seconde div : sous-menu contient les titres des onglets
//------------------------------------------------------------------------------------------------------------
$action="dsp";
// Déterminer la div à mettre en affichage
//------------------------------------------------------------------------------------------------------------
// Affichage des espaces de contenu des onglets
//------------------------------------------------------------------------------------------------------------
echo "<article><header>Liste des Besoins</header>";
echo "
<div class='help'>Pour calculer les besoins des articles utiliser le bouton suivant.
	<br>Attention, ce calcul peut durer un certain temps, ne pas interrrompre le processus.
	<br><form><input type=submit name=doMRP value='Calul des Besoins'></form></div>";
echo "<section>";
	($bccNbRow==0)?print"Aucun besoin client ; ":print "";
	($bofNbRow==0)?print"Aucun besoin de production ; ":print "";
	($rcfNbRow==0)?print"Aucune ressource fournisseur ; ":print "";
	($rofNbRow==0)?print"Aucune ressource de production ":print "";
echo "</section>";
//------ BESOINS Condensés :
echo "<div id=liste class='' >";
echo "<br>besoins = ventes et consommations.";
echo "<br>ressources = achats et fabrications.";
echo "<br>dispo (gras) = stock disponible inscrit dans l'article.";
echo "<br>dispo/prev = stock calculé = dispo-besoins+ressources+besoins mrp calculés.";
	echo "<table border=1 align=center>";
	echo "<tr>";
	//echo "<th>voir";
	echo "<th>Date";
	echo "<th>Dispo";
	echo "<th>Besoin";
	echo "<th>Ressource";
	echo "<th>Besoin calculé";
	echo "<th>Stock prévisionnel";
	echo "<th>Besoin brut";
	echo "</tr>";
	// bon! on a une table qui a deux ruptures : l'article et la date.
	$continue=true;
	$currentArtCode="";
	$currentDate="";
	$color=1;
	$compNbr=0;
	$opOpen=false;
	$stockMini=5;
	$stockPrev=$besQty=$resQty=$mrpQty=0;
	$tbq_id2=DB_ouvrirRequete($theBiqQuery, $connexion);
	$tbqNbRow=mysql_num_rows($tbq_id2);
	
	while ($t_tbq=DB_lireLigne($tbq_id2)){
		// si aucun enreg n'a le même code article que l'article courant, alors, on a un nouvel article
		if ($t_tbq['artCode']!=$currentArtCode || $t_tbq['date']!=$currentDate){ // nouvelle date ou nouvel article, finir la ligen en cours
			if ($besQty+$resQty+$mrpQty>0){ // il y a une quantité à écrire, écrire la fin de la ligne en cours
				if ($stockPrevisInit) {
					echo "<td style='text-align:right;'><b>$stockPrev</b></td>"; // attention, ce stockPrev est celui de la ligne précédente !!!
					$stockPrevisInit=false;
				}else
					echo "<td style='text-align:right;'>$stockPrev</td>"; // attention, ce stockPrev est celui de la ligne précédente !!!
				echo "<td style='text-align:right;'>$besQty</td>";
				echo "<td style='text-align:right;'>$resQty</td>";
				// affichage des besoins mrp calculés s'ils existent
				echo "<td style='text-align:right;'>$mrpQty</td>";
				
				// calcul du stock prévisionnel avec les besoins calculés
				$stockPrev=$stockPrev-$besQty+$resQty+$mrpQty;
				echo "<td style='text-align:right;'>$stockPrev</td>";
				
				// calcul du besoin, selon la politique de commande
				// pour l'instant on fait du besoin brut.
				if ($stockMini-$stockPrev>0)
					$besBrut=$stockMini-$stockPrev;
				else
					$besBrut=0;
				echo "<td style='text-align:right;'>$besBrut</td>";
				echo "</tr>";
				
				$besQty=$resQty=$mrpQty=0;
			}
		}
		if ($t_tbq['artCode']!=$currentArtCode){  // NEW item, écrire la première ligne du nouvel article
			$currentArtCode=$t_tbq['artCode'];
			$stockPrev=_getStock($t_tbq['artCode']); // c'est le premier stockPrev
			$stockPrevisInit=true; // c'est le premier stockPrev
			$currentDate=""; // pour être en situation de nouvelle date au test de la date
			echo "<tr style='background:silver;'><td colspan=5>Article $currentArtCode</td><td style='text-align:right;'>(stock mini = $stockMini)</td><td >&nbsp;</td></td></tr>";
		}
		if ($t_tbq['date']!=$currentDate){ // nouvelle date, préparer l'accumulation des quantités
			$currentDate=$t_tbq['date'];
			echo "<tr><td>$currentDate</td>";
		}
					
		switch ($t_tbq['type']) {	// selon que le type de ligne est un besoin, une ressource ou le résultat d'un calcul (4=previ)
			case 'bc' :
			case 'bf' :
				$besQty=$besQty+$t_tbq['qte']; break; 	// incrémenter les besoins
			case 'rc' :
			case 'rf' :
				$resQty=$resQty+$t_tbq['qte']; break;	// incrémenter les ressources
			case '4' :
				$mrpQty=$mrpQty+$t_tbq['qte']; break;	// incrémenter les besoins calculés (c'est une ressource prévisionnelle)
		}
	} // Fin de la lecture de la maousse requête
			if ($besQty+$resQty+$mrpQty>0){ // il y a une quantité à écrire, finir la ligne courante
				echo "<td style='text-align:right;'>$besQty</td>";
				echo "<td style='text-align:right;'>$resQty</td>";
				$stockPrev=$stockPrev-$besQty+$resQty;
				echo "<td style='text-align:right;'>$stockPrev</td>";
				echo "<td style='text-align:center;'>-</td>";
				echo "<td style='text-align:right;'>$mrpQty</td>";
				echo "</tr>";
			}
echo "</table>";
echo "</div>";
// FIN de l'affichage condensé des besoins, données techniques et ressources
//------ BESOINS détaillés :
echo "<div id=liste class='' >";
	echo "<table border=1 align=center>";
	echo "<caption>Liste détaillée</caption>";
	echo "<tr>";
	//echo "<th>voir";
	echo "<th>Article";
	echo "<th>Date";
	echo "<th>quantité";
	echo "<th>type";
	echo "</tr>";
//------ CONTINUER ICI
	// bon! on a une table qui a deux ruptures : l'article et la date.
	$continue=true;
	$currentArtCode="";
	$currentDate="";
	$color=1;
	$compNbr=0;
	$opOpen=false;
	$stockPrev=$besQty=$resQty=0;
		while ($t_tbq=DB_lireLigne($tbq_id)){
			echo "<tr>";
			echo "<td>".$t_tbq['artCode']."</td>";
			echo "<td>".$t_tbq['date']."</td>";
			echo "<td style='text-align:right;'>".$t_tbq['qte']."</td>";
			echo "<td>".$t_tbq['type']."</td>";
			echo "</tr>";
		}
echo "</table>";

// FIN de l'affichage condensé des besoins, données techniques et ressources
echo "</div>";// findiv espaceVisu

//========================================================================
// fin de page
//========================================================================
echo "<div id=report>
</div>";
_pageFooter(); // pied de page
?>