\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 ""; } \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 ""; } \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; familles = new Array; \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()+.