<?php
// ========================================================================================
// Note : c'est juste un affichage, pas un calcul !! ...
/*
  Les tables ont changé dans l'interprétation de resType/besType :
	old = bf, bp, cc, cf, etc...
	new = 1=ferme, 4=prev et ajout d'un champ resOrig/besOrig qui reprend l'ancien rôle
	Valeurs possibles de 
		- resOrig	 : 				  'OA'=ordre achat,       'OF'=ordre fab.,                         'OP'=ressce prévi. calculée ; les ressrces manu. sont des oa ou of planifiés (type 5)
		- besOrig	 : 'BI'=stk mini, 'OV'=ordre vente (cde), 'BF'=besoin ordre fab. issus de la nom., 'BP'=besoin prévi. calculé  ; les besoins manu. sont des ov ou bf planifiés (type 5)
	Les besoins/ressources peuvent êtres 
		- externes, fermes ou déjà lancés ou prévisionnels de sources externes (cdes client prévi) : OV, OF, OA
			un ordre ferme ne peut être modifié (OV, OF ou OA) cependant, ils peuvent être annulé manuellement par le service concerné (gescom, client, fab, achats) certaines conditions sont alors à respecter
		- calculés (et donc prévisionnels) : BP, OP, bp, rp
			un besoin/ressource calculé est recalculé à chaque calcul des besoins.
		- manuels, fermes ou prévisionnels  (besoin calculé dont on a déplacé la date, dont on a modifié la quantité manuellement ): BM, OM, rf, rc, bf, bc
			ces derniers ne peuvent être modifiés par le calcul mais peuvent être modifiés manuellement.
*/

// 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";
//------------------------------------------------------------------------------------------------------------
// Affichage détaillé des données et leur origine :
// 	detail=true ou false selon qu'on peut condenser les besoins par date ou non
//------------------------------------------------------------------------------------------------------------
$detail=true; 	// afficher le détail des mouvements
$lastMRP=true;	// afficher les données à partir du dernier calcul MRP (false=afficher les besoins brut réels)
// ========================================================================================
// 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 _getArticle($artCode){
global $connexion;
	$requete_sql="SELECT * from article WHERE artCode='$artCode' ";
	if($enreg=DB_chercherEnreg($requete_sql, $connexion)) return $enreg ;
	return 0;
}
// -------------------------------------------------------------------
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;
}
// -------------------------------------------------------------------
// _dspNom : Affichage de l'arborescence de la nomenclature d'un artivle. !!!! Fonction récursive
function _dspNom($artCode, $qte=0, $col=0,$colOfset=0){
global $connexion;
$t_color=array("fff", "99f", "77b", "9f9", "7b7", "f99", "b77", "ff9", "bb7", "9ff", "7bb", "f9f", "b7b"); // tableau des codes couleur pour faire joli, 2 codes par ligne sauf le 1er.
	$t_art=_getArticle($artCode);
	$requete_sql="SELECT * from article, artnomenclature WHERE article.artCode=artnomenclature.artCode AND article.artCode='$artCode' ";
	$nom_id=DB_executerRequete($requete_sql, $connexion);
	$thisColor=$col+$colOfset;
	
	echo "<tr style='background:#".$t_color[$thisColor].";'>";
	($qte>0)?$artDesc="$qte ":$artDesc="";
	$artDesc.=$t_art['artCode']."<br><span style='font-size:9px;'>".$t_art['artDesc']."</span>"; // description commune de l'article
	if(DB_getNbEnreg($nom_id)>0){
		echo "<td>$artDesc</td><td>Composition : <table border=1 width=100%>"; //description article avec nomenclature
		$color=2;
		while ($t_nom=DB_lireLigne($nom_id)){
			($color==1)?$color=2:$color=1;
			_dspNom($t_nom['comp_artCode'], $t_nom['compQte'], $color, $colOfset+2); // appel récursif de l'affichage de la nomenclature !
		}
		echo "</table></td>";
	}else 
		echo "<td colspan=2>$artDesc</td>"; // description article sans nomenclature
	echo "</tr>";
	return 0;
}
// -------------------------------------------------------------------
// affichage de la liste de l'arborescence des nomanclatures afin de comprendre la dépendance des besoins
function _dspNomenclatures(){
global $connexion;
echo "<td>";
echo "<div id=liste style='float:right;clear:both;width:90%;' >";
	echo "<table border=1 width=100%>";
	$requete_sql="SELECT artCode from article WHERE artTypeCode in ('N', 'F') order by artCode ";
	$nom_id=DB_executerRequete($requete_sql, $connexion);
	$color=2;
	while ($t_nom=DB_lireLigne($nom_id)){
		($color==1)?$color=2:$color=1;
		_dspNom($t_nom['artCode'], 0, $color,0); // 1 er appel de cette fonction récursive
	}
	echo "</table>";
echo "</td>";
}
// -------------------------------------------------------------------
// Affichage d'un rapport de nombre de besoins, ressources, etc... et d'une aide à la compréhension du tableau des besoins et ressources.
function _dspInfos(){
global $connexion;
// Exécution des requêtes de rapport... pour le fun de faire des requêtes compliquées ??!!!
//=======================================================================
// besoins réels ----------------------------------
	// BB : Besoins de commandes client en cours
	$selectBesoinCdeClient="Select LigneCdeClientArt.artCode AS bccArtCode, cdeDate AS bccDate, qte AS bccQte, 'OV' AS bccType
	FROM LigneCdeClientArt, Article, cdeClient 	WHERE LigneCdeClientArt.cdeNum=CdeClient.cdeNum	AND LigneCdeClientArt.artCode=article.artCode "; // besoins client
	$bcc_id=DB_ouvrirRequete($selectBesoinCdeClient, $connexion);
	$bccNbRow=DB_getNbEnreg($bcc_id);
	
	// BF : besoins pour ordres de fabrication
	/* 	Ici, on utilise la date de début de l'opération de gamme 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 "; // BF
	*/
	$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=DB_getNbEnreg($bof_id);
	
// ressources réelles ---------------------------------------------------------------------------------------------------
	// OA : ressource commandes fournisseur
	$selectRessourceCdeFou="SELECT artCode AS rcfArtCode,  cdeDate AS rcfDate, qte AS rcfQte, 'OA' 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=DB_getNbEnreg($rcf_id);
	
	// OF : ressource ordre de fabrication en cours
	$selectRessourceOF="SELECT artCode AS rofArtCode,  ofDateFin AS rofDate, ofQte AS rofQte, 'OF' AS rofType 
	FROM OrdFab ORDER BY artCode ;"; // ordres de fabrication
	$rof_id=DB_ouvrirRequete($selectRessourceOF, $connexion);
	$rofNbRow=DB_getNbEnreg($rof_id);
//	----------
// fin de la récup des infos ; Affichage
//	----------
	echo "<td valig=top>";
	echo "<div id=listeLegend class='' style='float:right;width:60%;'>";
	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 "<ul id=liste class='legende' >";
	echo "<li>ST= STock initial ou SP repris de la période précédente."; // (STinit=Stock disponible actuellement ... = inventaire - somme des sorties + somme des entrées)
	echo "<li>BI= Besoin Initial pour atteindre le stock mini.";
	echo "<li>BB= Besoins Bruts = ventes (OV) + consommations pour fabrications lancées (BF).";
	echo "<li>BP= Besoins Planifiés (besoins calculés à un niveau de nomenclature supérieur).";
	echo "<li>OL= Ordres Lancés (= OA (Ordres d'achats) + OF (Ordre de fabrication)).";
	echo "<li>BN= Besoins Nets = BI+BB+BN-OL-ST.";
	echo "<li>OP= Ordres Planifiés prévisionnels, proposés par le calcul des besoins(BN dont la quantité est arrondie à une quantité économique et un multiple. Actuellement = 1*BN).";
	echo "<li>SP= Stock Prévisionnel (= ST-BB-BP+OL+OP).";
	echo "</ul>";
	echo "</section>";
	echo "</div>";
	echo "</td>";
}
// -------------------------------------------------------------------
// affichage de la liste des besoins dans une colonne distincte (td rowspan =100%)
function _dspListeBesoins(){
global $connexion;
global $detail;
global $lastMRP;
// THE BIG MARVELOUS QUERY !!!
if (!$lastMRP){
	// besoins réels ----------------------------------
	// BB : Besoins de commandes client en cours = 'OV'
	$BBccSQL="Select LigneCdeClientArt.cdeNum AS mvtNum, LigneCdeClientArt.artCode AS artCode, cdeDate AS date, qte AS qte, 'BB' AS orig, concat('OV-',LigneCdeClientArt.cdeNum) AS ref 
	FROM LigneCdeClientArt, Article, cdeClient 
	WHERE LigneCdeClientArt.cdeNum=CdeClient.cdeNum	AND LigneCdeClientArt.artCode=article.artCode 	AND ligneEtat in (0,1,4,5,8,9,12,13) "; // OV : 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
		Normalement, on devrait tenir compte de la position de la consommation dans la gamme et de la durée de l'opération et de sa capacité de recouvrement avec la suivante ...
	*/
	$BBofSQL="Select ofNomenclature.ofNum AS mvtNum, ofComp_artCode AS artCode, ofDateDeb AS date, (ofQteTheo) AS qte, 'BB' AS orig, concat('BF-',ofNomenclature.ofNum, '-', ordFab.artCode) AS ref 
	FROM ofNomenclature, ordFab
	WHERE ofNomenclature.ofNum=ordFab.ofNum 	"; // BF : besoins issus des OF
	// AND ligneEtat in (0,1,4,5,8,9,12,13) = à fabriquer
	// ressources réelles ---------------------------------------------------------------------------------------------------
	// OL : ressource commandes fournisseur (non encore livrées !!! A FAIRE)
	$OLcfSQL="SELECT lignecdefourart.cdeNum AS mvtNum, artCode AS artCode,  cdeDate AS date, qte AS qte, 'OL' AS orig , concat('OA-',lignecdefourart.cdeNum) AS ref 
	FROM lignecdefourart, cdeFour	WHERE lignecdefourart.cdeNum=cdefour.cdeNum 	"; // OA : commandes fournisseur
	// AND ligneEtat in (0,1,4,5,8,9,12,13) = non reçues
	// ressource ordre de fabrication en cours
	$OLofSQL="SELECT ofNum AS mvtNum, artCode AS artCode, ofDateFin AS date, ofQte AS qte, 'OL' AS orig, concat('OF-',ordfab.ofNum) AS ref FROM ordfab		"; // OF : ordres de fabrication
	// AND ligneEtat in (0,1,4,5,8,9,12,13) = non fabriqué bon
	
	// besoins théoriques calculées BP et OP ---------------------------------------------------------------------------------------------------
	$BPmrpSQL="Select 0 AS mvtNum, artCode AS artCode, besDate AS date, besQte AS qte, besOrig AS orig, besRef AS ref 
	FROM mrpbesoins 	WHERE besOrig = 'BP'	"; // BP : besoins calculés	
	// ressources théoriques calculées ---------------------------------------------------------------------------------------------------
	$OPmrpSQL="Select 0 AS mvtNum, artCode AS artCode, resDate AS date, resQte AS qte, resOrig AS orig, resRef AS ref 
	FROM mrpressources 	WHERE resOrig = 'OP'	"; // OP : ordres prévisionnels calculés	
	
	// assemblage de l'ensemble
	$theBigQuery=$BBccSQL." UNION ".$BBofSQL." UNION ".$OLcfSQL." UNION ".$OLofSQL." UNION ".$BPmrpSQL." UNION ".$OPmrpSQL." ORDER BY artCode, date ;";

}else{ // if !$lastMRP	
	
	// besoins théoriques calculées BP et OP ---------------------------------------------------------------------------------------------------
	$BPmrpSQL="Select 0 AS mvtNum, artCode AS artCode, besDate AS date, besQte AS qte, besOrig AS orig, besRef AS ref 
	FROM mrpbesoins 	"; // BP : besoins calculés	
	// ressources théoriques calculées ---------------------------------------------------------------------------------------------------
	$OPmrpSQL="Select 0 AS mvtNum, artCode AS artCode, resDate AS date, resQte AS qte, resOrig AS orig, resRef AS ref 
	FROM mrpressources 	"; // OP : ordres prévisionnels calculés	
	$theBigQuery=$BPmrpSQL." UNION ".$OPmrpSQL." ORDER BY artCode, date ;";
}	
	
	$theBigQuery_id=DB_ouvrirRequete($theBigQuery, $connexion);
	//echo "<br>DBG : ".mysql_error();
	//echo "<br>DBG : ".$theBigQuery;
	$tbqNbRow=DB_getNbEnreg($theBigQuery_id);
	// echo "DBG : ".mysql_error();
	
	//$t_besoins=_calculBesoins($bcc_id, $bof_id, $rcf_id,$rof_id);

	echo "<td rowspan=2>";
//------ liste BESOINS Condensés :
	echo "<div id=liste class='' style='width:100%;position:relative;float:left;'>";
	echo "<style> .thLigne th {font-size:8px;}</style>";
	echo "<table border=1 align=center id=besList>";
	echo "<tr>";
		//echo "<th>Date</th><th>ST</th><th>BI</th><th>BB</th><th>BP</th><th>OL</th><th>OP</th><th>BN</th><th>SP</th>";
		echo "<th>Référence</th><th>ST mini</th><th colspan=100%>Description</th>";
		if ($detail) echo "<th>num<th>origine";		//ok
	echo "</tr>";
	/* 	Bon! on a une table qui a deux ruptures : l'article et la date.
		Le problème c'est qu'on peut avoir plusieurs lignes de BB ou OL pour un même article et une même date ...
		Il faut donc les additionner jusqu'à ce qu'on passe à la date (ou l'article suivant).
		A ce moment là seulement, on peut écrire la ligne dans le code html.
		
		L'algo ressemble donc à ceci : 
		TQ non EOT Faire :
			Si on change de date ou d'article, on écrit la ligne en cours
			Si on a une nouvelle date, on prépare une ligne de date qui deviens la date en cours.
			Si on a un nouvel article, on écrit une ligne spéciale d'entête d'article qui devient l'article en cours.
			On accumule les BB et le OL
		Fin TQ
		Si on a une ligne en cours, on l'écrit
	*/
	$continue=true;	$currentArtCode="";	$currentDate="";	$color=1;	$compNbr=0;	$opOpen=false;	$stockMini=5;
	$SPQtyIsInit=true; // c'est le premier SPQty
	$STQty=$SPQty=$BBQty=$BPQty=$OLQty=$BNQty=$OPQty=$BIQty=0; // $SPQty ne doit pas être RAZ, on en a besoin au prochain tour ...
	$besoinHTML="";
	$notFirstLine=false; // pour éviter de faire une ligne vide au début
	// $theBigQuery_id2=DB_ouvrirRequete($theBigQuery, $connexion); // déjà fait
	// $tbqNbRow=mysql_num_rows($theBigQuery_id2);					// déjà fait
	$i=0;
	while ($t_tbq=DB_lireLigne($theBigQuery_id)){ 
		$i++;
		// D'abord terminer la ligne en cours si on change de code article ou de date
		if ($notFirstLine && ($t_tbq['artCode']!=$currentArtCode || $t_tbq['date']!=$currentDate || $detail)){ // nouvelle date ou nouvel article, finir la ligne en cours
			//if ($BBQty+$OLQty+$OPQty+$BPQty+$BIQty>0){ // Si il y a une quantité à écrire, la ligne en cours
			if ($stockMini+$BBQty+$BPQty-$OLQty-$OPQty-$STQty>0 || $OPQty>0){ // Si il y a un BN et donc un OP à écrire dans la ligne en cours
				// calcul des données
				$STQty=$SPQty;					// ST ------	reprise du stock de la ligne précédente (si même article ...)
				$BNQty=$stockMini+$BBQty+$BPQty-$OLQty-$OPQty-$STQty;	// BN ------ BN=Smini+BBruts+BPlanif-OLancés-OPlanifiés-STock initial
				if ($BNQty<0) $BNQty=0;
				// OP ------	pas de calcul des ordres prévisionnels, ils sont repris du calcul mrp effectué et enregistré
				$SPQty=$STQty-$BBQty-$BPQty+$OLQty+$OPQty;		// SP ------ 	calcul du stock prévisionnel avec les besoins calculés
				
				// affichage
					($SPQtyIsInit)?($STtyle="font-weight:bold;"&$SPQtyIsInit=false):$STtyle="";
					$besoinHTML.= "<td class='num' style=\"$SPQtyIsInit color:navy;\">$STQty</td>";	// ST ------	reprise du stock de la ligne précédente (si même article ...)
					$besoinHTML.= "<td class='num'>$BIQty</td>";						// BI ------	besoin de Stock Initial
					$besoinHTML.= "<td class='num'>$BBQty</td>";						// BB ------	Besoins Brut = OV+BF
					$besoinHTML.= "<td class='num'>$BPQty</td>";						// BP ------	Besoins Prévisionnels calculés à level-1
					$besoinHTML.= "<td class='num'>$OLQty</td>";						// OL ------	Ordres Lancés fermes
					$besoinHTML.= "<td class='num'>$OPQty</td>";						// OP ------	Ordres Prévisionnels issus du BN
					$besoinHTML.= "<td class='num' style='color:navy;'>$BNQty</td>";						// BN ------	Besoin Net calculé, selon la politique de commande
					($SPQty<$stockMini)?$SPColor='red':$SPColor='green';
					$besoinHTML.= "<td class='num' style='color:$SPColor;'>$SPQty</td>";						// SP ------ 	Stock Prévisionnel résultat avec les besoins calculés
					if ($detail) $besoinHTML.= "<td>$mvtNum</td><td class='num' style='text-align:left;'>$ref ($i)</td>";	// détail : afficher la référence d'origine du mouvement
				$besoinHTML.= "</tr>"; //fin de ligne
				echo $besoinHTML;	// envoyer la ligne complète
				
				// RAZ des compteurs
				$STQty=$BBQty=$BPQty=$OLQty=$OPQty=$BNQty=0; // $SPQty ne doit pas être RAZ, on en a besoin au prochain tour ...
			}
		}
		$notFirstLine=true; // ok maintenant on peut écrire une (fin de) ligne
		if ($t_tbq['artCode']!=$currentArtCode){  // NEW item, écrire la première ligne du nouvel article [ok au 04/01/2015]
			$currentArtCode=$t_tbq['artCode'];
			$t_article=_getArticle($t_tbq['artCode']); // c'est le premier SPQty
			$artDesc=$t_article['artDesc']; // 
			$SPQty=$t_article['stockInit']; // c'est le premier SPQty
			$stockMini=$t_article['artStockMini']; // c'est le premier stockMini
			$SPQtyIsInit=true; // c'est le premier SPQty
			$currentDate=""; // pour être en situation de nouvelle date au test de la date
			if($detail){
				echo "<tr style='background:silver;'><td >$currentArtCode </td><td class='num'>$stockMini</td><td colspan=9>$artDesc</td></td></tr>";
				echo "<tr class=thListe><th>Date<th>ST<th>BI<th>BB<th>BP<th>OL<th>OP<th>BN<th>SP<th>num<th>origine</tr>";		//ok
				echo "<tr class=thListe><th colspan=100%>Date courante=$currentDate ; date ligne=".$t_tbq['date']." ; ".$t_tbq['orig']." n°=".$t_tbq['mvtNum']."</th></tr>";		//ok
			}else {
				echo "<tr style='background:silver;'><td >$currentArtCode </td><td class='num'>$stockMini</td><td colspan=7>$artDesc</td></td></tr>";
				echo "<tr class=thListe><th>Date<th>ST<th>BI<th>BB<th>BP<th>OL<th>OP<th>BN<th>SP</tr>";		//ok
			}	
		}
		if ($t_tbq['date']!=$currentDate){ // nouvelle date, préparer l'accumulation des quantités
			$currentDate=$t_tbq['date'];
			$besoinHTML= "<tr><td>$currentDate</td>";
		}else if($detail)
			$besoinHTML= "<tr><td>&nbsp;(".$t_tbq['date']." & $currentDate)</td>";
					
		switch ($t_tbq['orig']) {	// selon que le type de ligne est un besoin, une ressource ou le résultat d'un calcul (4=previ)
			case 'BB' :	// BB = OV (Besoin Brut de vente = cde Client ferme ou prévi) ou 'BF' (Besoin Brut de fabrication)
				$BBQty=$BBQty+$t_tbq['qte']; break;
			case 'BP' : // Besoin Prévisionnel issu des Nomenclatures
				$BPQty=$BPQty+$t_tbq['qte']; break;
			case 'OL' :	// OL = OF (Ordre fabrication ferme) ou 'OA' (Ordre Lancé d'achat ferme)
				$OLQty=$OLQty+$t_tbq['qte']; break;
			case 'OP' :	// Ordre Prévisionnel déjà calculé (achat ou fab, ferme/prévi : peu importe)
				$OPQty=$OPQty+$t_tbq['qte']; 
				//echo "<br>DBG -- $currentArtCode, $currentDate, summOP=$OPQty, origMvt=".$t_tbq['orig']." qteMvt=".$t_tbq['qte']." artMvt=".$t_tbq['artCode'];
				break;
		}
		$ref=$t_tbq['ref'];
		$mvtNum=$t_tbq['mvtNum'];

	} // Fin de la lecture de la maousse requête
	//if ($BBQty+$OLQty+$OPQty+$BPQty+$BNQty+$BIQty>0){ // Si il y a une quantité à écrire, la ligne en cours
	if ($stockMini+$BBQty+$BPQty-$OLQty-$OPQty-$STQty>0){ // Si il y a un BN et donc un OP à écrire dans la ligne en cours
		// calcul des données
		$STQty=$SPQty;											// ST ------	reprise du stock de la ligne précédente (si même article ...)
		$BNQty=$stockMini+$BBQty+$BPQty-$OLQty-$OPQty-$STQty;	// BN ------ BN=Smini+BBruts+BPlanif-OLancés-OPlanifiés-STock initial
		if ($BNQty<0) $BNQty=0;
		// OP ------	pas de calcul des ordres prévisionnels, ils sont repris du calcul mrp effectué et enregistré
		$SPQty=$STQty-$BBQty-$BPQty+$OLQty+$OPQty;		// SP ------ 	calcul du stock prévisionnel avec les besoins calculés
		
		// affichage
		// ST ------	reprise du stock de la ligne précédente (si même article ...)
			($SPQtyIsInit)?($STtyle="font-weight:bold;"&$SPQtyIsInit=false):$STtyle="";
			$besoinHTML.= "<td class='num' style=\"$SPQtyIsInit color:navy;\">$STQty</td>";	// ST ------	reprise du stock de la ligne précédente (si même article ...)
			$besoinHTML.= "<td class='num'>$BIQty</td>";						// BI ------	besoin de Stock Initial
			$besoinHTML.= "<td class='num'>$BBQty</td>";						// BB ------	Besoins Brut = OV+BF
			$besoinHTML.= "<td class='num'>$BPQty</td>";						// BP ------	Besoins Prévisionnels calculés à level-1
			$besoinHTML.= "<td class='num'>$OLQty</td>";						// OL ------	Ordres Lancés fermes
			$besoinHTML.= "<td class='num'>$OPQty</td>";						// OP ------	Ordres Prévisionnels issus du BN
			$besoinHTML.= "<td class='num' style='color:navy;'>$BNQty</td>";						// BN ------	Besoin Net calculé, selon la politique de commande
			$besoinHTML.= "<td class='num' style='color:blue;'>$SPQty</td>";						// SP ------ 	Stock Prévisionnel résultat avec les besoins calculés
					if ($detail) $besoinHTML.= "<td>$mvtNum</td><td class='num' style='text-align:left;'>$ref ($i)</td>";	// détail : afficher la référence d'origine du mouvement
		$besoinHTML.= "</tr>"; //fin de ligne
		echo $besoinHTML;	// envoyer la ligne complète
	}
	echo "</table>";
	echo "</div>";
	echo "</td>";
// ouf !!! j'irai bien prendre un café et une aspirine !?#@!<¤>! ??!!
}
// ========================================================================================
// 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 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.
*/
// on reprend les OV et BF réels ainsi que les OF et OA réels. on ne garde donc de la planif que les BP et OP ...
/* attention, on ne prend pas les OA, OF, OV et BF des fichiers de calcul, mais les données réelles (et actuelles). Les valeurs possibles de resOrig et besOrig sont :
	- resOrig	 : 'OA'=ordre achat,       'OF'=ordre fab.,                         'OP'=ressce prévi. calculée 
	- besOrig	 : 'OV'=ordre vente (cde), 'BF'=besoin ordre fab. issus de la nom., 'BP'=besoin prévi. calculé   
	resType et besType indiquent si la ligne est calculée (4=prévi) ou figée manuellement (0=ferme) et ne peut être remise en cause
*/
//=======================================================================
//========================================================================
// AFFICHAGE
//========================================================================
_pageHeader($userId);	// entête de page et menu
//------------------------------------------------------------------------------------------------------------
print "<style>#DBG {display:none;}</style>"; // DBG AFFICHER OU MASQUER DBG
($detail)?print "<article><header>Liste des Besoins Détaillés</header>":print "<article><header>Liste des Besoins</header>";
// voir les explication après l'affichage de la liste ... pour des raisons de css
// Explications ::
echo "<div class='help' style='margin-left:1%;margin-right:1%;'>Pour calculer les besoins des articles utiliser le bouton suivant :
	<br><form method=get><input type=submit name=doMRP value='Calcul des Besoins'></form>
	<b>Attention, ce calcul peut durer un certain temps, ne pas interrrompre le processus.</b>
	<br>
	<br>Les articles affichés sont ceux qui ont des besoins client ou de fabrication ou planifiés.<br>Les dates antérieures à aujourd'hui ne sont pas groupées.
	</div>";

echo "<table align=center border=1><tr>";
$t_prodItem=_dspListeBesoins();
// FIN de l'affichage condensé des besoins, données techniques et ressources
_dspInfos();


echo "</tr>";
//------ BESOINS détaillés :
echo "<tr>";
_dspNomenclatures($t_prodItem);
echo "</tr>";
echo "</table>";

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