<?php
/* gesProdDspArt.php
	Dans cette page, on peut afficher l'état de la production d'un article.
	On a donc : 
		-	une liste de données article, 
		-	une liste des OF en cours et des OP, liste des OF terminés.
	On peut demander la transformation d'un OP en OF (si l'article est "fabricable").
	on peut demander la suppression d'un OF,
	A VOIR SI on peut demander la saisie d'une fabrication, sans utiliser l'interface dédiée à celle-ci ?
	on peut demander la modification d'un OF
	A VENIR : on peut demander la liste des mouvements de stock de l'article (stokDspArtMvt.php).
*/
	
include "library/TEXT_tabs.inc.php";
include "library/DB_fct.inc.php";
include "library/APP_fct.inc.php";
include "library/_gesProdDesign.inc.php";
// ========================================================================================
// FONCTIONS LOCALES
// ========================================================================================
// -------------------------------------------------------------------
function _menuRight(){
echo "<h2>GesProd</h2>";
echo "<div>Maintenance des OF et OP :
<br>-&nbsp;Lancer&nbsp;des &nbsp;OF&nbsp;manuels</li>
<br>-&nbsp;Confirmer&nbsp;les &nbsp;OP&nbsp;</li>
<br>-&nbsp;Maintenir&nbsp;les&nbsp;OF</li>
</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;
}
// -------------------------------------------------------------------
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 _getDureeGamme($artCode){ // question, on récupère la gamme ou juste la durée ?
global $connexion;
	$requete_sql="SELECT * from artGamme WHERE artCode='$artCode' ";
	if($enreg=DB_chercherEnreg($requete_sql, $connexion)) return $enreg ;
	return 0;
}
// -------------------------------------------------------------------
function _addTimeToYMD($ymd, $duree, $unite="m", $sep='/'){
	// le problème ici est de savoir à quelle heure on commence à compter l'ajout.
	// si on ajoute 18h de travail à partir de minuit n'est pas la même chose que de les ajouter à l'équipe de 8h ... mais on va faire comme si.
	$t_ymd=explode($sep,$ymd);
	$t=mktime(0, 0, 0, $t_ymd[1], $t_ymd[2], $t_ymd[0]);
	switch ($unite) {
	case 'Y': $t+=$duree*365.25*24*3600; 	break;
	case 'M': $error=true; 					break; // on ne sait pas ajouter des mois simplement, pour l'instant ... pbm de bissextilité
	case 'd': $t+=$duree*24*3600; 			break;
	case 'h': $t+=duree*3600; 				break;
	case 's': $t+=$duree; 					break;
	default : $t+=$duree*60;
	}
	return date("Y".$sep."m".$sep."d", $t);
}
// -------------------------------------------------------------------
function _addNewOF($artCode, $dateType, $dateD, $dateF, $ofQte, $remarque){ // création de l'enregistrement OF et des enregistrements dépendants
global $connexion;
//echo "<div id=DBG style='background:white;'>";

	// TB. on y va : 
	// Gamme : mettre dans un tableau toutes les données des opérations ; champs artGamme = artCode, opNum, opDesc, opDuree, opUniteTemps
	$errorCode=0;
	$t_op=array();
	
	$requete_sql="SELECT * from artGamme where artCode='$artCode' ORDER BY opNum";
	$requete_id=DB_ouvrirRequete($requete_sql, $connexion);
	$nbOp=0;
	$ofDuree=0;// pour l'instant, cumul des durées réelles, sans tenir compte du recouvrement.
	// pour tenir compte des recouvrements, c'est + compliqué car on peut avoir des durées intermédiaires inégales et l'exemple ci-dessous ...
	/*
		op 100 d1=4 : +-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+
		op 200 d2=4 : ....+-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+
		op 300 d3=4 : .... ...+-1--+-2--+-3--+-4--+-5--+-6--+-7--+-8--+-9--+
		durée totale = d1+d2+9*d3 = 44. Tout va bien, c'est facile à calculer car dn-1<=dn, mais ...
		op 100 d1=4 : +-1-+-2-+-3-+-4-+-5-+-6-+-7-+-8-+-9-+
		op 200 d2=6 : ....+--1--+--2--+--3--+--4--+--5--+--6--+--7--+--8--+--9--+
		op 300 d3=4 : .... .....+-1-  +-2-  +-3-  +-4-  +-5-  +-6-  +-7-  +-8-  +-9-+
		... ici, c'est + compliqué car c'est d1+d2+9*(d3+(d2-d3)) = 64 car d2>d3 et donc en réalité d3 = d2
		
		Il faut donc trouver une règle avant de faire le boulot (ps : le problème se pose aussi en mrp)
	*/
	if ($requete_id && DB_getNbEnreg($requete_id)){
		$i=0;
		while ($t_record=DB_lireLigne($requete_id)){
			$t_op[$i]['opNum']=$t_record['opNum'];
			$t_op[$i]['opDesc']=$t_record['opDesc'];
			$t_op[$i]['opDuree']=$t_record['opDuree'];
			$t_op[$i]['opUniteTemps']=$t_record['opUniteTemps'];
			$t_op[$i]['opDureeR']=$t_record['opDuree']*$ofQte; // on en profite pour calculer la durée réelle ..
			$t_op[$i]['opDateD']=0;
			$t_op[$i]['opDateF']=0;
			
			$ofDuree+=$t_op[$i]['opDureeR']; // cumul des durées
			$i++;
		}
		$nbOp=$i;
	}else {
		$t_op=array();
		$errorCode=5002;
	}
	// Nomenclature : même chose avec la nomenclature standard ; champs artNomenclature= artCode, comp_artCode, opNum, compQte 
	$requete_sql="SELECT * from artNomenclature where artCode='$artCode' ORDER BY opNum, comp_artCode";
	$requete_id=DB_ouvrirRequete($requete_sql, $connexion);
	$nbComp=0;
	if ($requete_id && DB_getNbEnreg($requete_id)){
		$i=0;
		while ($t_record=DB_lireLigne($requete_id)){
			$t_comp[$i]['opNum']=$t_record['opNum'];
			$t_comp[$i]['comp_artCode']=$t_record['comp_artCode'];
			$t_comp[$i]['compQteT']=$t_record['compQte'];
			$t_comp[$i]['compQteR']=$t_record['compQte']*$ofQte; // on en profite pour calculer ..
//echo "<br>DBG ".$ofQte.' ; '.$t_comp[$i]['opNum'].', '.$t_comp[$i]['comp_artCode'].', '.$t_comp[$i]['compQteT'].', '.$t_comp[$i]['compQteR'];
			$i++;
		}
		$nbOp=$i;
	}else {
		$t_nom=array();
		$errorCode=5003;
	}
	
	// Calculs : effectuer les calculs de durée et de date des opération puis de l'OF, calcul des quantités de composants		
		// Traitement de la gamme : calcul des dates de début et de fin d'opérations et la date de FIN/Debut de l'OF
		if ($dateType=='L'){ // date de lancement
			$opDate=$dateD;	// initialiser la date de travail à la date de début de l'OF
			for ($i=0; $i<sizeof($t_op); $i++){
				$t_op[$i]['opDateD']=$opDate;	// modif Date Début OP = date de fin de l'op précédente
				$opDate=_addTimeToYMD($opDate, $t_op[$i]['opDureeR'], $t_op[$i]['opUniteTemps']);
				$t_op[$i]['opDateF']=$opDate;	// modif Date Fin OP
//echo "<br>DBG ".$t_op[$i]['opNum'].', '.$t_op[$i]['opDateD'].', '.$t_op[$i]['opDateF'];
			}
			$dateF=$opDate;	// modif Date Fin OF

		}else if(dateType=='E'){ // date de fin
			$opDate=$dateF;	// initialiser la date de travail à la date de fin de l'OF
			for ($i<sizeof($t_op)-1; $i>=0; $i--){
				$t_op[$i]['opDateF']=$opDate;	// modif Date Fin OP = date de début de l'op suivante
				$opDate=_addTimeToYMD($opDate, -$t_op[$i]['opDureeR'], $t_op[$i]['opUniteTemps']);
				$t_op[$i]['opDateD']=$opDate;	// modif Date Début OP
			}
			$dateD=$opDate;	// modif Date Début OF
		}
		// Duree de l'OF =  somme des durées ?
		// Calcul de la durée totale de l'OF, indépendamment des dates ??
		
		// RE-traitement de l'OF pour mettre en place la date de fin
	//} // END function calculGamme()
	// Ecrire l'entête de l'OF, il sera modifié plus tard pour mettre à jour la durée et les dates. l'écriture permettra de récupérer le n° d'OF
	$requete_sql="INSERT INTO ordFab (artCode,ofQte,ofDateDeb,ofDateFin,ofDateType,ofDuree,ofUniteTemps,ofEtat) 
		VALUES   ('$artCode',$ofQte,'$dateD','$dateF','$dateType',$ofDuree,'m',1) ;";
	DB_executerRequete($requete_sql, $connexion);
//echo "<br>DBG ".mysql_error();
//echo "<br>DBG ".$requete_sql;
	
	$requete_sql="select max(ofNum) from ordFab ;"; // on récupère le n° de l'of qu'on vient de créer
	$rec=DB_chercherEnreg($requete_sql, $connexion);
	$ofNum=$rec[0];
	// ecrire la gamme de l'OF,  
	for ($i=0; $i<sizeof($t_op); $i++){
		$requete_sql="INSERT INTO `ofgamme` (`ofNum`, `opNum`, `opDateDeb`, `opDateFin`, `opDureeReelle`, `opUniteTemps`, `opQteFinie`, `opQteRejetee`, `opEtat`) 
			VALUES	('$ofNum', '".$t_op[$i]['opNum']."', '".$t_op[$i]['opDateD']."', '".$t_op[$i]['opDateF']."', '".$t_op[$i]['opDureeR']."', '".$t_op[$i]['opUniteTemps']."', 0, 0, 0) ;";
		DB_executerRequete($requete_sql, $connexion);
		//echo "<br>DBG	VALUES	('$ofNum', '".$t_op[$i]['opNum']."', '".$t_op[$i]['opDateD']."', '".$t_op[$i]['opDateF']."', '".$t_op[$i]['opDureeR']."', '".$t_op[$i]['opUniteTemps']."', 0, 0, 0) ;";
	}
	
	// ecrire la nomenclature de l'OF,  
	for ($i=0; $i<sizeof($t_comp); $i++){
		$requete_sql="INSERT INTO `ofnomenclature` (`ofNum`, `ofComp_artCode`, `opNum`, `ofQteTheo`, `ofQteConsommee`)
			VALUES	('$ofNum', '".$t_comp[$i]['comp_artCode']."', '".$t_comp[$i]['opNum']."', '".$t_comp[$i]['compQteR']."', 0) ;";
		DB_executerRequete($requete_sql, $connexion);
//echo "<br>DBG	VALUES	('$ofNum', '".$t_comp[$i]['comp_artCode']."', '".$t_comp[$i]['opNum']."', '".$t_comp[$i]['compQteR']."', 0) ;";
	}
	// c'est fini.
	// le MR : 
/*
	`ofgamme` (`ofNum`, `opNum`, `opDateDeb`, `opDateFin`, `opDureeReelle`, `opUniteTemps`, `opQteFinie`, `opQteRejetee`, `opEtat`)
		PRIMARY KEY (`ofNum`,`opNum`),
		Obs : `opUniteTemps` ENUM('s','m','d','M','Y') et `opEtat` 0=new, 1=en cours de prod, 2=produit, 4=terminé ?, 9=annulé,
  
	`ofnomenclature` (`ofNum`, `ofComp_artCode`, `opNum`, `ofQteTheo`, `ofQteConsommee`)
		PRIMARY KEY (`ofNum`,`ofComp_artCode`,`opNum`),
		FOREIGN KEY `fk_ofNomenclature` (`ofNum`) reference ofNum dans ordFab
		FOREIGN KEY `fk_ofComposant` (`ofComp_artCode`) reference artCode dans article
		
	`ordfab` (`ofNum`, `artCode`, `ofQte`, `ofDateDeb`, `ofDateFin`, `ofDateType`, `ofDuree`, `ofUniteTemps`, `ofEtat`)
		PRIMARY KEY (`ofNum`,`artCode`),
		Foreign KEY `fk_ofArticle` (`artCode`) référence artCode dans article
		Obs : `ofDateType` L=date de lancement, E=date d'échéance, F=dates fixes, `ofUniteTemps` ENUM( 's', 'm', 'd', 'M', 'Y' ) et `ofEtat` '0=new, 1=en cours de prod, 2=produit, 4=terminé ?, 9=annulé'
*/
	
	//if($enreg=DB_chercherEnreg($requete_sql, $connexion)) return $enreg ;
//echo "</div id=DBG style='background:white;'>";
	return 0;
}
// -------------------------------------------------------------------
// Cette fonction contrôle une date. Voir aussi http://php.net/manual/fr/function.checkdate.php
function _checkDate($y, $m, $d){return checkdate($m,$d,$y);}
// -------------------------------------------------------------------
// contrôle d'intervalle de date ; return=true d<=f, false= d>f
function _chkDateInterval($dateD, $dateF){ // contrôle d'un intervalle de temps en dates YMD
		$dd = new DateTime($dateD);
		$df = new DateTime($dateF);
		$interval = date_diff($dd, $df)->format('%a');
		if($interval<0) return false;
		return true;
}
// -------------------------------------------------------------------
// Afficher les données article (table)
function _dspArticle($artCode){
	$result=true;
	echo "<table align=center border=1 width=100%>";
	if($t_article=_getArticle($artCode)){
		switch ($t_article['artAddMode']){ case 0: $addMode='Achat'; break; case 1: $addMode='Fabrication'; break; case 2: $addMode='Sous-traitance'; break; }
		switch ($t_article['artPlanif']){ case "S": $planMode='Sur Stock = point de commande'; break; case "M": $planMode='Selon méthode MRP'; break;  }
		echo "<tr><th colspan=2>Article $artCode</td></tr>";
		echo "<tr><td>Référence :</td><td>".$t_article['artCode']."</td></tr>";
		echo "<tr><td>Description</td><td>".$t_article['artDesc']."</td></tr>";
		echo "<tr><td>Stock minimum</td><td>".$t_article['artStockMini']."</td></tr>";
		echo "<tr><td>Stock courant au ".$t_article['stockDate']."</td><td>".$t_article['stockInit']."</td></tr>";
		echo "<tr><td>Mode d'entrée en stock</td><td>".$t_article['artAddMode']." $addMode</td></tr>";
		echo "<tr><td>Mode de planification</td><td>".$t_article['artPlanif']." $planMode</td></tr>";
		echo "<tr><td>Lot mini</td><td>-</td></tr>";
		echo "<tr><td>Lot multiple</td><td>-</td></tr>";
		$result=$t_article['artTypeCode'];
	}else {
		echo "<tr><td>Erreur : Article $artCode inconnu</td></tr>";
		$result=false;
	}
	echo "</table>";
	return $result;
}
// -------------------------------------------------------------------
// Afficher la gamme et la nomenclature de l'article ? (en 2 tables)
function _dspGammNom($artCode){
global $connexion;
	$result=true;
	$ofDureeUnitaire=0;
	echo "<table align=center border=1 width=100% id=gamNomTab><tr>";
	
	// gamme
	$requete_sql="SELECT * from artGamme where artCode='$artCode' ORDER BY opNum";
	echo "<td><table align=center border=1 width=100% id=gamTab><caption>Gamme</caption>";
	echo "	<tr><th>n° OP</th><th>Description</th><th>Duree unitaire</th><th>Duree totale</th><th>Date Deb</th><th>Date Fin</th></tr>\n";
	$requete_id=DB_ouvrirRequete($requete_sql, $connexion);
	if ($requete_id && DB_getNbEnreg($requete_id)){
		$color=1;
		while ($t_record=DB_lireLigne($requete_id)){
			// définition de la classe de style en fonction du type et du n° de ligne :
			($color)?$color=0:$color=1;			$classeTr="tr".$color;
			// affichage de la ligne
			echo "	<tr class='$classeTr'>";
			echo "		<td id=op".$t_record['opNum'].">".$t_record['opNum']."</td>";
			echo "		<td id=opDesc".$t_record['opNum'].">".$t_record['opDesc']."</td>";
			echo "		<td><div id=opDureeT".$t_record['opNum']." class=opDuree>".$t_record['opDuree']."</div><div id=opUniteTemps".$t_record['opNum']." class=opUniteTemps>".$t_record['opUniteTemps']."</div></td>";
			echo "		<td id=opDureeR".$t_record['opNum'].">a</td>";
			echo "		<td id=opDateD".$t_record['opNum']."></td>";
			echo "		<td id=opDateF".$t_record['opNum']."></td>";
			echo "	</tr>\n";
			
			// stocker le n° d'opération pour faire les calculs en direct avec du javascript ... (yek yek yek)
			$t_op[]=$t_record['opNum'];
			// cumuler les durées d'opération pour calculer la durée de l'OF en direct avec du javascript ... 
			// (Pour l'instant, pas de recouvrement d'opérations : une op doit être finie avant que la suivante commence)
			// (Pour l'instant, pas de gestion de type de temps, on prend tout pour des minutes)
			$ofDureeUnitaire+=$t_record['opDuree'];
		}
	}else {
		echo "<tr><td>Erreur : Article $artCode inconnu ou non fabriqué</td></tr>";
		$t_op[]=array();
		$result=false;
	}
	echo "</table></td>"; // fin GamTab
	
	// nomenclature
	$requete_sql="SELECT * from artNomenclature where artCode='$artCode' ORDER BY opNum";
	echo "<td><table align=center border=1 width=100% id=nomTab><caption>Nomenclature</caption>";
	echo "	<tr><th >n° OP</td><th>article composant</td><th>Qté unitaire</td><th>Qté totale</td></tr>\n";
	$requete_id=DB_ouvrirRequete($requete_sql, $connexion);
	if ($requete_id && DB_getNbEnreg($requete_id)){
		$color=1;
		while ($t_record=DB_lireLigne($requete_id)){
			// définition de la classe de style en fonction du type et du n° de ligne :
			($color)?$color=0:$color=1;			$classeTr="tr".$color;
			// affichage de la ligne
			echo "	<tr class='$classeTr'>";
			echo "		<td id=op".$t_record['comp_artCode'].">".$t_record['opNum']."</td>";
			echo "		<td id=compArtCode".$t_record['comp_artCode'].">".$t_record['comp_artCode']."</td>";
			echo "		<td id=compQteT".$t_record['comp_artCode'].">".$t_record['compQte']."</td>";
			echo "		<td id=compQteR".$t_record['comp_artCode']."></td>";
			echo "	</tr>\n";
			
			// stocker le n° de composant pour faire les calculs en direct avec du javascript ... (yek yek yek)
			$t_comp[]='"'.$t_record['comp_artCode'].'"';
		}
	}else {
		echo "<tr><td>Erreur : Article $artCode inconnu ou non fabriqué</td></tr>";
		$t_comp[]=array();
		$result=false;
	}
	echo "</table></td>"; // fin GamTab


	echo "</tr></table>"; // align=center border=1 width=100% id=gamNomTab><tr>";
	
	// bon, on va essayer de faire du js avec tout ça ...
		// construire le tableau des opérations
		$s_op=implode(",", $t_op);
		$t_comp=implode(",", $t_comp);
/* fonctions javascript à voir
	function CheckDate(d) {
      // Cette fonction vérifie le format JJ/MM/AAAA saisi et la validité de la date. mettre sur onchange
		var separateur="/"; // séparateur entre jour/mois/année
		j=(d.substring(0,2));m=(d.substring(3,5));a=(d.substring(6));if(a<=100){if(a<=70){a+=2000}else{a+=1900}}
		if (((isNaN(j))||(j<1)||(j>31))&&(ok==1)) 		{alert('Jour incorrect.');   return false;}
		if (((isNaN(m))||(m<1)||(m>12))&&(ok==1)) 		{alert('Mois incorrect.');   return false;}
		if (((isNaN(a))||(a<2000)||(a>2100))&&(ok==1)) 	{alert('Année incorrecte.'); return false;}
		if (((d.substring(2,3)!=separateur)||(d.substring(5,6)!=separateur))&&(ok==1)) {alert('Les séparateurs doivent être des '+separateur); return false;}		
		var d2=new Date(a,m-1,j);
		j2=d2.getDate();m2=d2.getMonth()+1;a2=d2.getYear();if(a2<=1970){a2+=1900}
		if ((j!=j2)||(m!=m2)||(a!=a2)) {alert('Date '+d+' incorrecte !'); return false;}
		return d2;
	}
/*
function AddDays(date, amount){
	//origine de la fonction : http://ghislainmesse.blogspot.fr/2012/08/ajouter-des-jours-une-date-en-javascript.html
	//fonction qui ajoute un nbre de jours (amount) à une date (qui n'est pas forcément dans le même fuseau horaire)
    var tzOff = date.getTimezoneOffset() * 60 * 1000;
    var t = date.getTime();
    t += (1000 * 60 * 60 * 24) * amount;
    var d = new Date();
    d.setTime(t);
    var tzOff2 = d.getTimezoneOffset() * 60 * 1000;
    if (tzOff != tzOff2)
    {
        var diff = tzOff2 - tzOff;
        t += diff;
        d.setTime(t);
    }
    return d;
} */
// scripts de recalcul prévisionnel des dates et durées d'opérations et des besoins de nomenclature
echo "<script>
	window.onload = calculGamme();
	
	// Principe : ajouter le nbre de jours à la date, convertis en ms et reconvertie en date
		// si aucun jour à ajouter/retrancher, aucun changement, sinon :
		// conversion de la date du jour de départ
		// définition de la nouvelle date
		// conversion de la nouvelle date en DMY affichable
	function addDay(dateDMY, jours){if(jours<=0)return dateDMY;date=DMYToDate(dateDMY);newDate=new Date(date.getTime()+24*3600*1000*jours);return dateToDMY(newDate)}
		// idem : soustraire un nbre de jours
	function subDay(d, j){if(j<=0)return d;date=DMYToDate(d);nd=new Date(date.getTime()-24*3600*1000*j);return dateToDMY(nd)}
	// Conversion de dates
	function DMYToDate(dateDMY){j=dateDMY.substring(0,2);m=dateDMY.substring(3,5);a=dateDMY.substring(6);if(a<=100){if(a<=70){a=+a+2000}else{a=+a+1900}} date=new Date(a,m-1,j);return date}
	function dateToDMY(date){separateur='/';j=date.getDate();if(j<10){j='0'+j} // ne pas oublier les zéro devant ...
		m=date.getMonth()+1;if(m<10){m='0'+m}a=date.getYear();if(a<1970){a+=1900}DMY=j+'/'+m+'/'+a;return DMY;}
	// conversion d'une durée en minutes en temps affichable
	function minutesToYDHMS(duree){
		var SS=MM=HH=DD=YY=0;
		MM=Math.floor(duree); SS=duree-MM;
			if (MM>60) {HH=Math.floor(MM/60); MM=MM-HH*60;
				if (HH>24){DD=Math.floor(HH/24); HH=HH-DD*24;
					if (DD>365){YY=Math.floor(DD/365); DD=DD-YY*365;YDHMS=YY+'an(s), '+DD+'j, '+HH+'h, '+MM+'m et '+SS+'s ('+duree+')';
					}else {YDHMS=DD+'j, '+HH+'h, '+MM+'m et '+SS+'s ('+duree+')'}
				}else {YDHMS=HH+'h, '+MM+'m et '+SS+'s ('+duree+')'}
			}else {YDHMS=MM+'m et '+SS+'s ('+duree+')'}
		return YDHMS;
	} 
	
	// fonction de calcul des dates et durées des opérations de gamme. 
		// Renvoie la dernière date calculée pour transmettre à l'opération suivante/précédente
	function calculOpDates(opNum, opDate, dateType){
			var opDureeT=document.getElementById('opDureeT'+opNum);
			var opDureeR=document.getElementById('opDureeR'+opNum);
			var opDateD=document.getElementById('opDateD'+opNum);
			var opDateF=document.getElementById('opDateF'+opNum);
			
			var opDuree=ofQte.value*parseInt(opDureeT.innerHTML, 10); // durée de l'opération
			opDureeR.innerHTML=minutesToYDHMS(opDuree);	// format d'affichage converti de minutes en 'YYan(s) JJj HHh MMm et SSs (mm)'
			dateOrig=opDate;	//DBG
			if (dateType=='L'){
				opDateD.innerHTML=opDate;		// remplissage de la date de début
				opDureeHH=Math.floor(opDuree/60);	// calcul du décalage en heure
				opDureeDD=Math.floor(opDureeHH/24);	// calcul du décalage en jour
				//if (opDureeDD>0) opDureeHH=opDureeHH-opDureeDD*24;	// si nbre jours  >0, alors retirer le nbre de jours du nbre total d'heures
				//if (opDureeHH>8) opDureeDD=opDureeDD+1; 				// si nbre heures >8, (=durée de travail par jour) alors on utilise plus d'un jour de travail)
				opDate=addDay(opDate, opDureeDD);	// calculer la date def in en ajoutant le nbre de jours à la date de début
				opDateF.innerHTML=opDate;			// modifier la date de fin
			}else{
				opDateF.innerHTML=opDate;		// remplissage de la date de début
				opDureeHH=Math.floor(opDuree/60);	// calcul du décalage en heure
				opDureeDD=Math.floor(opDureeHH/24);	// calcul du décalage en jour
				//if (opDureeDD>0) opDureeHH=opDureeHH-opDureeDD*24;	// si nbre jours  >0, alors retirer le nbre de jours du nbre total d'heures
				//if (opDureeHH>8) opDureeDD=opDureeDD+1; 				// si nbre heures >8, (=durée de travail par jour) alors on utilise plus d'un jour de travail)
				opDate=subDay(opDate, opDureeDD);	// calculer la date def in en ajoutant le nbre de jours à la date de début
				opDateD.innerHTML=opDate;			// modifier la date de fin
			}
			dateResult=opDate;	//DBG
//alert ('calculOpDates : '+opNum+', '+dateType+', '+opDuree+', '+opDureeDD+', '+dateOrig+'=>'+dateResult);		
//alert ('calculOpDates : '+opNum+', '+dateType+', '+opDuree+', '+opDureeDD+', '+dateOrig+'=>'+dateResult);		
			return opDate;
	}
	// fonction de calcul des données de la gamme et de la nomenclature. calcule aussi la date de fin/début de l'of en fonction de dateType
	function calculGamme(){
		var t_op= new Array($s_op);
		var t_comp= new Array($t_comp);
		
		// traitement de l'OF
		// la récup d'un bouton radio n'est pas aussi simple que les autres car getElementById ne fonctionne pas directement ...
		for (i=0; i<document.fabForm.dateType.length; i++) {
		if (document.fabForm.dateType[i].checked) {dateType = document.fabForm.dateType[i].value}
		}
		//var ofDateType=document.getElementById('ofDateType');
		var ofQte=document.getElementById('ofQte');
		var ofDateL=document.getElementById('ofDateL');
		var ofDateF=document.getElementById('ofDateF');
		var dspOfDuree=document.getElementById('dspOfDuree');
//alert ('coucou '+dateType);
		
		ofDuree=ofQte.value*$ofDureeUnitaire;
		dspOfDuree.innerHTML=ofDuree;
		ofDateL.value=dateToDMY(DMYToDate(ofDateL.value)); // au cas où on a écrit l'année sur 2 char
		ofDateF.value=dateToDMY(DMYToDate(ofDateF.value)); // au cas où on a écrit l'année sur 2 char
		
		// traitement de la gamme
		if (dateType=='L'){ // date de lancement
			opDate=dateToDMY(DMYToDate(ofDateL.value));		
			for (i=0; i<t_op.length; i++){opDate=calculOpDates(t_op[i], opDate, dateType)}
			ofDateF.value=opDate; // modif Date Fin OF
		}else if(dateType=='E'){ // date de fin
			opDate=dateToDMY(DMYToDate(ofDateF.value));		
			for (i=t_op.length-1; i>=0; i--){opDate=calculOpDates(t_op[i], opDate, dateType);}
			ofDateL.value=opDate; // modif Date Lancement OF
		}
		// traitement nomenclature
		for (i=0; i<t_comp.length; i++){
			var compQteT=document.getElementById('compQteT'+t_comp[i]);
			var compQteR=document.getElementById('compQteR'+t_comp[i]);
			compQteR.innerHTML=ofQte.value*parseInt(compQteT.innerHTML, 10);	
		}
		// RE-traitement de l'OF pour mettre en place la date de fin
	}
</script>";
	echo "<div id=testjs></div>";
	
	return $result;
} // end function _dspGamNom(artCode)

// ========================================================================================
// MAIN()
// ========================================================================================
$userId="";
$headTitle="Liste des Articles";
$contentTitle="Gestion de production";
$dateDeb=$dateFin=COM_DMY();$qte=0;$remarque="";
$typeDateChk1=$typeDateChk2=$typeDateChk3="";
$dateType='L';
// -------------------------------------------------------------------
	$connexion=DB_connecter(); 

(isset($_REQUEST['artCode']))?$artCode=$_REQUEST['artCode']:$artCode="";
if (isset($_REQUEST['lancerFab'])){
	$error=false;
	$errorCode=0;
	// récup des données puis ...
	(isset($_REQUEST['dateType']))?$dateType=$_REQUEST['dateType']:$errorCode=5001; // type de date absent
	(isset($_REQUEST['dateDeb']))?$dateDeb=$_REQUEST['dateDeb']:$errorCode=1005;	// date debut absente
	(isset($_REQUEST['dateFin']))?$dateFin=$_REQUEST['dateFin']:$errorCode=1006;	// date fin absente
	(isset($_REQUEST['qte']))?$qte=$_REQUEST['qte']:$errorCode=1007;				// quantité absente
	(isset($_REQUEST['remarque']))?$remarque=$_REQUEST['remarque']:$remarque="";	//
	
	// ... contrôler les données, ...
		// le contrôle des données est fait via javascript ? : non car on pourrait aussi donner ou modifier les paramètres via l'URL ...
		//if (!$error) $error=chkDateRange($dateD, $dateF);
		//if (!$error && $dateD>$DateF) $error=chkDate($dateFin);
		if ($errorCode==0) $dateD=COM_DMYtoYMD($dateDeb);
		if ($errorCode==0) $dateF=COM_DMYtoYMD($dateFin);

		if ($errorCode==0 && !_chkDateInterval($dateD, $dateF)) $errorCode=1004;		// erreur de date
	// ... écrire l'OF et ...
		if ($errorCode==0 && !_addNewOF($artCode, $dateType, $dateD, $dateF, $qte, $remarque)) $errorCode=5110;	// Erreur d'écriture d'OF
	// ... si pas d'erreur, revenir à la page de liste des prod en cours pour un article ... celle ci ? pourquoi pas, on fera la même chose avec la liste des prévisions à confirmer ! ou alors ce sera la même page ?.
	
}
//=======================================================================
// Affichage 
//=======================================================================
_pageHeader($userId);	// entête de page et menu
$ofUniteTemps="m";		// unité de temps par défaut pour les OF
$artTypeCode=_dspArticle($artCode);
// mise en place du bouton radio dateType qui sera sélectionné par défaut ou lors du réaffichage éventuel
	if ($dateType=='L') $null= (($typeDateChk1="checked='checked'") & ($typeDateChk2=$typeDateChk3=""));
	if ($dateType=='E') $null= (($typeDateChk2="checked='checked'") & ($typeDateChk1=$typeDateChk3=""));
	if ($dateType=='F') $null= (($typeDateChk3="checked='checked'") & ($typeDateChk1=$typeDateChk2=""));
?>
	<section><header>Gérer la production</header>
		<article>
		<p>
		<ul>
			<li>Saisir une production ; Développement en cours</li>
		</ul>
		</article>
	</section>
	<section><header>Lancer un OF manuel</header>
		<article>
			<form id=fabForm name=fabForm>
				<input type=hidden name=artCode value="<?php echo $artCode; ?>" >
				<input type=hidden name=duree id=ofDuree value='0' >
				<ul>
					<li><label>Référence de dates en date </label>
						de lancement 		<input type="radio" name="dateType" value='L' id=ofDateType <?php echo $typeDateChk1; ?> onchange="calculGamme();"> 
						ou d'échéance 		<input type="radio" name="dateType" value="E" id=ofDateType <?php echo $typeDateChk2; ?> onchange="calculGamme();"> 
						<!-- ou en dates fixées 	<input type="radio" name="dateType" value="F" id=ofDateType <?php echo $typeDateChk3; ?> onchange="zcalculGamme();"> -->
					</li>
					<li><label>Date Lancement</label><input type=text name=dateDeb value=<?php echo $dateDeb; ?> id=ofDateL onchange="calculGamme();"> (jj/mm/aaaa)</li>
					<li><label>Date Échéance</label><input type=text name=dateFin value=<?php echo $dateFin; ?> id=ofDateF onchange="calculGamme();"> (jj/mm/aaaa)</li>
					<li><label>Durée (<?php echo $ofUniteTemps; ?>)</label><div id=dspOfDuree>0</div></li>
					<li><label>Quantité à produire</label><input type=text name=qte value=<?php echo $qte; ?> id=ofQte onchange="calculGamme();"></li>
					<li><label>Remarques</label><input type=text name=remarque value="<?php echo $remarque; ?>" placeholder="Remarque diverse, motif" size=100px ></li>
					<li><input type=submit name=lancerFab value='Valider' ></li>
				</ul>
			</form>
		</article>
	</section>
	<section><header>Données de référence (recalculées en direct)</header>
		<article>
<?php
	_dspGammNom($artCode);
?>
		</article>
	</section>
<?php
//========================================================================
// fin de page
//========================================================================
_pageFooter(); // pied de page
?>