\section{Demande d'achat}

\par Les demande d'achats sont gérées grâce à l'utilisation 
des classes {\em LDachat} (\verb+/includes/libLDachat.inc.php+ et {\em ListeDA} \verb+/includes/liblisteDA.inc.php+) que nous détaillerons par la suite . 

Pour ne pas perdre les informations de page en page lors de la création de la
Demande d'achat, la variable de session \verb+$_SESSION["demandeAchat]"+ contient l'objet {\em DemandeAchat} correspondant à la demande en cours de création.

\par Enfin, la classe {\em DemandeAchat} est composée d'une liste de {\em LDachat}, qui correspondent aux lignes de demande d'achat.

\subsection{Classe LDachat}

\par Comme dit précedemment, cette classe représente 
une ligne d'achat. Elle est créée lorsque le magasinier
a choisi {\it ``Ajouter"} sur la page de création de demande d'achat.

\lstset{language=PHP}
\begin{lstlisting}
class LDachat {
	
 function LDachat($fam, $prod, $qte,$da_id=-1); 
	
}
\end{lstlisting}

\par Cette classe se compose uniquement de quelques champs représentant la famille de produits du produit 
selectionné, la référence interne du produit, la quantité souhaitée et finalement le numéro de demande d'achat
rattaché. Tous ces champs sont initialisés grâce au constructeur.


\subsection{Classe DemandeAchat}

\par Cette classe permet d'avoir un objet qui contient toutes les informations utiles pour pouvoir créer des demandes d'achats. Voici son prototype:

\lstset{language=PHP}
\begin{lstlisting}
class DemandeAchat {
  function DemandeAchat($id_mag);
  function load($id_da);
  function ajouteLDA($famProd,$prodSelect,
                     $quantiteDem,$prodUnit="kg");
  function supprimeLDA($Cases_supp);
  function toHTML($editable=0);
  function insereBD();
}
\end{lstlisting}

\subsubsection{Le constructeur}
\par Le constructeur doit :
\begin{itemize}
\item{initialiser le champ correspondant à  l'identifiant du magasinier qui passe commande}
\item{créer un tableau vide, qui par la suite contiendra des lignes de demande d'achat}
\item{initialiser le champ qui correspond aux nombres de lignes d'achat}
\end{itemize}

\subsubsection{Charger les lignes de demandes d'achat}
\par La fonction \verb+function load($id_da)+ permet de
remplir l'objet {\em DemandeAchat} en faisant une requête
sur la base de données 
avec le numéro de demande d'achat souhaité.

\subsubsection{Ajouter ou supprimer des lignes d'achats}
\par Les fonctions \verb+ajouteLDA(...)+ 
et \verb+supprimeLDA($Cases_supp)+, permettent respectivement d'ajouter et de supprimer des lignes de la {\em DemandeAchat}.
\lstset{language=PHP}
\begin{lstlisting}
function ajouteLDA($famProd,$prodSelect,
                   $quantiteDem,$prodUnit="kg"){
  $lda = new LDachat($famProd, $prodSelect, 
                     $quantiteDem);
  $this->_ligneAchat[$this->_ligneIdx]=&$lda;
  $this->_ligneIdx++;
}
\end{lstlisting}

\lstset{language=PHP}
\begin{lstlisting}
function supprimeLDA($Cases_supp){
 // on cherche les lignes selectionnees 
 // pour la suppression
 if (is_array($Cases_supp)){
  while( list($case,$val) = each($Cases_supp) ){
   // on supprime les lignes selectionnees
   $idx=preg_replace("/Check_/","",$val);
   unset($this->_ligneAchat[$idx]);
   }
 [...]
 }
}
\end{lstlisting}

\par Ces deux fonctions n'ont aucune incidence sur la base de donnée, 
mais uniquement sur l'affichage et le contenu de l'objet {\em DemandeAchat}
courant. 
En effet, lorsqu'un magasinier ``ajoute" un produit (il fait un clic sur 
``Ajouter" sur la page \verb+DAajoute.php+), cela lui affiche une nouvelle
ligne d'achat dans le contenu de la demande d'achat, mais rien n'est modifié
dans la base tant qu'il ne clique pas sur "Valider". 
Ainsi l'utilisateur peut commettre des erreurs, puis les corriger (suppression des lignes), sans laisser dans la base des lignes d'achat qui auraient malencontreusement prise en compte par des Acheteurs entrain de travailler...


\subsubsection{Affichage à l'écran}
\par Pour afficher une demande d'achat on utilise la fonction \verb+toHTML($editable=0)+. Le paramètre sert
uniquement pour différencier deux cas :
\begin{itemize}
\item{\$editable=0} Dans ce cas on affiche les lignes d'achats contenues dans la demande d'achat.
\item{\$editable=1} Dans ce cas précis, on affiche les lignes d'acahts avec une ``checkbox" devant, qui 
servira pour une sélection (dans le cas où on voudrai pouvoir la supprimer)
\end{itemize}

\subsubsection{Insertion dans la base de données}
\par Pour insérer une demande d'achat, il suffit de faire appel à la fonction \verb+insereBD()+. Celle-ci, insère
la demande d'achat, avec toutes ses lignes d'achats dans les tables correspondantes (en faisant attention d'avoir
		les bons identifiants).

\subsection{Autres fonctions pour les demandes d'achats}
\par Dans le fichier \verb+/includes/libLDachat.inc.php+, il n'y pas que les classes {\em LDachat} et 
{\em DemandeAchat}, mais aussi d'autres fonctions utiles à la bonne mise en place des demandes d'achats.

\subsubsection{Les menus déroulants}
\par Il y a deux fonctions qui créent des menus déroulants :
\begin{description}
\item{\verb+menu_deroulant_Produits($ref_int,$designation)+} Celle-ci concatène les deux chaînes  de caractères
(référence interne et désignation du produit) passées en arguments et en crée une ``option" pour un menu déroulant.
\lstset{language=PHP}
\begin{lstlisting}
function menu_deroulant_Produits 
 ($ref_int, $designation) {
    $ref_des = "".$ref_int." : "
             .$designation;
    echo "<option value=\"$ref_int\">
           $ref_des</option>";
}
\end{lstlisting}
\item{\verb+menu_deroulant_familleProd ($famille)+} Celle-ci genère une ``option", contenant le nom d'une famille
de produits, pour un menu déroulant.
\lstset{language=PHP}
\begin{lstlisting}
function menu_deroulant_familleProd
 ($famille) {
    echo "<option value=\"$famille\">
			     $famille</option>";
}
\end{lstlisting}
\end{description}

\subsubsection{Requêtes}
\par Deux fonctions interagissent avec la base de données :
\begin{description}
\item{\verb+donne_familles()+} Cette fonction retourne un tableau contenant tous les noms de familles de produits.
\item{\verb+trouve_produits($ref_famille)+} Cette fonction retourne un tableau contenant la référence interne d'un
produit, ainsi que sa désignation, appartenant à la famille de produits passée en argument.
\end{description}


\subsubsection{Conversion de PHP vers Javascript}
\par Le fichier \verb+/includes/scriptJS_DA.inc.php+ contient un script Javascript qui permet de mettre à jour
un menu déroulant en fonction du choix fait dans un autre menu déroulant. Or ces menus déroulants, contienent des
informations stockées dans la base de données. C'est pourquoi, on appelle les fonctions \verb+donne_familles()+ 
et \verb+trouve_produits(...)+, dont on convertit le résultat en Javascript via la fonction \verb+convertToJS($var)+.
\par Voici le script Javascript qui illustre l'utilisation de cette fonction.

\lstset{language=PHP}
\begin{lstlisting}
function changeFam_Prod(famille, listeProduits) {
  
 [...]
		
 make=famille.options[famille.selectedIndex].text;

 liste = new Array;
 i=0;

 <?php
  $familles = donne_familles();
  $famillesJS = convertToJS($familles);
  ?>

  familles = new Array<?php echo $famillesJS; ?>;

 <?php
  for($fam=0;$fam<sizeof($familles);$fam++) {
   print "if (make == familles[$fam]) { ";

   // cherche les produits de la famille numero f 
   $prods = trouve_produits($fam+1);
   $js = convertToJS($prods);
	 
   print "produits = new Array".$js.";";
   print "for(j=0; j<produits.length; j=j+2) { "
   ."ref_design = produits[j] + \" : \"
	              + produits[j+1]; "
   ."liste[i++]=new Option(ref_design,
	                         produits[j]); "

 [...]
 
}
\end{lstlisting}
	

\subsubsection{Exemple d'application des trois points précédents}
\par Cet exemple est tiré du fichier \verb+DAajoute.php+ et montre l'utilisation des fonctions décrites précédement.
Le code qui suit genère les deux menus déroulants permettant au magasinier de choisir un produit dans une famille de
produit. Lorsque le magasinier choisi une famille de produit, le menu déroulant correspondant aux produits se met
automatiquement à jour (sans devoir recharger la page) pour montrer les produits appartenant à la nouvelle famille de produits selectionnée.
\lstset{language=PHP}
\begin{lstlisting}
<select name="famille" 
 onChange="changeFam_Prod(this.form.famille,
                          this.form.produit);" >

<?php
 for($i=0;$i<count($familles);$i++) {
  menu_deroulant_familleProd($familles[$i]);
 }
 ?>
</select>
<select name="produit">
<?php
 $prod = trouve_produits(1);
 for($i=0;$i<sizeof($prod);$i=$i+2) {
  menu_deroulant_Produits($prod[$i], $prod[$i+1]);
 }
 ?>
</select>
\end{lstlisting}


\subsection{Classe ListeDA}

\par Les sources de cette classe sont dans le fichier \verb+/includes/liblisteDA.inc.php+. Cette classe sert à
avoir une liste de demandes d'achats, utile pour la page \verb+DAliste.php+, car dans cette page on est amené à
afficher toutes les demandes d'achats dont les lignes d'achat ont un certain état (\verb+'CREE'+ par exemple).

\lstset{language=PHP}
\begin{lstlisting}
class ListeDA {
 function ListeDA($libelle,$id_mag);
 function ajouteDA(\$da);
 function supprimeDA(\$Cases_supp);
 function loadListe();
 function toHTML();
}
\end{lstlisting}

\subsubsection{Le constructeur}
\par Le constructeur initialise les champs de l'objet : nombre de demande d'achats contenues dans le tableau, 
	création du tableau, l'identifiant du magasinier et le libellé de l'état des lignes d'achats voulues.

\subsubsection{Ajout et suppression à différentes échelles}
\par Pour ce qui est de l'ajout, fonction \verb+ajouteLDA($da)+, on ajoute la demande d'achat passée en paramètre, au
tableau qui contient toutes les demandes d'acahts, sans oublier d'incrémenter le nombre de demandes d'achats contenues.
\par Quand à la suppression, fonction \verb+supprimeDA(...)+, on regarde les demandes d'achats à supprimer 
(tableau passé en argument) et ensuite on fait des suppressions succesives dans la base de données. On commence par 
supprimer dans la table \verb+Etats_LA+, puis \verb+Ligne_d_achat+ et enfin \verb+Demande_d_achat+.

\subsubsection{Chargement d'une liste de demande d'achats}
\par La fonction \verb+loadListe()+, fait une requête pour trouver toutes les demandes d'achats corespondant au
champ libellé de l'objet. Pour chaque résultat trouvé, on crée une nouvelle demande d'achat qu'on insère dans la
liste des demandes d'achats. Cette fonction sert à ``initialiser" la liste des demandes d'achats de l'objet.

\subsubsection{Affichage}
\par L'affichage d'un objet se fait par sa fonction \verb+toHTML()+.
